diff --git a/.github/scripts/process-images.js b/.github/scripts/process-images.js
new file mode 100644
index 00000000..5b9edcbb
--- /dev/null
+++ b/.github/scripts/process-images.js
@@ -0,0 +1,492 @@
+const { S3Client } = require('@aws-sdk/client-s3');
+const { Upload } = require('@aws-sdk/lib-storage');
+const axios = require('axios');
+const sharp = require('sharp');
+const { v4: uuidv4 } = require('uuid');
+const crypto = require('crypto');
+const path = require('path');
+const fs = require('fs');
+
+// ============================================================================
+// CONFIGURATION CONSTANTS
+// ============================================================================
+const MAX_FILE_SIZE = 10 * 1024 * 1024;
+const MAX_WIDTH = 4096;
+const MAX_HEIGHT = 4096;
+const MAX_PIXELS = 16777216;
+const MAX_COMPRESSION_RATIO = 50;
+
+// Allowed image formats
+const ALLOWED_FORMATS = ['jpeg', 'jpg', 'png'];
+
+// Request timeout in milliseconds (30 seconds)
+const REQUEST_TIMEOUT = 30000;
+
+// Maximum images per request (rate limiting)
+const MAX_IMAGES_PER_REQUEST = 10;
+
+// Allowed Content-Type prefixes for image responses
+const ALLOWED_CONTENT_TYPES = ['image/jpeg', 'image/png', 'image/jpg'];
+
+// Only allowed hostname for GitHub PR comment images
+const ALLOWED_HOSTNAME = 'private-user-images.githubusercontent.com';
+
+// ============================================================================
+// AWS S3 CLIENT INITIALIZATION
+// ============================================================================
+const s3Client = new S3Client({
+ region: process.env.AWS_REGION
+});
+
+// ============================================================================
+// URL SANITIZATION HELPER
+// ============================================================================
+// Redacts sensitive information from URLs for logging
+function sanitizeUrlForLogging(url) {
+ try {
+ const urlObj = new URL(url);
+ const sensitiveParams = ['jwt', 'token', 'key', 'secret', 'auth', 'signature', 'sig'];
+
+ for (const param of sensitiveParams) {
+ if (urlObj.searchParams.has(param)) {
+ urlObj.searchParams.set(param, '[REDACTED]');
+ }
+ }
+
+ // Also check for JWT-like patterns in any parameter
+ for (const [key, value] of urlObj.searchParams.entries()) {
+ if (value && value.length > 50 && /^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/.test(value)) {
+ urlObj.searchParams.set(key, '[REDACTED_JWT]');
+ }
+ }
+
+ return urlObj.toString();
+ } catch {
+ // If URL parsing fails, do basic redaction
+ return url.replace(/([?&](jwt|token|key|secret|auth|signature|sig)=)[^&]+/gi, '$1[REDACTED]');
+ }
+}
+
+// ============================================================================
+// IMAGE DOWNLOAD FUNCTION
+// ============================================================================
+// Downloads the image from the URL
+async function downloadImage(url) {
+ const safeLogUrl = sanitizeUrlForLogging(url);
+ console.log(`Downloading: ${safeLogUrl.substring(0, 100)}...`);
+
+ // Validate URL hostname before making request
+ try {
+ const urlObj = new URL(url);
+ if (urlObj.hostname.toLowerCase() !== ALLOWED_HOSTNAME) {
+ throw new Error(`Invalid hostname. Only ${ALLOWED_HOSTNAME} URLs are accepted.`);
+ }
+ if (urlObj.protocol !== 'https:') {
+ throw new Error('Only HTTPS URLs are allowed.');
+ }
+ if (!urlObj.searchParams.has('jwt')) {
+ throw new Error('URL missing required JWT token. Please copy the full image URL from GitHub.');
+ }
+ } catch (error) {
+ if (error.message.includes('Invalid hostname') ||
+ error.message.includes('Only HTTPS') ||
+ error.message.includes('JWT token')) {
+ throw error;
+ }
+ throw new Error(`Invalid URL format: ${error.message}`);
+ }
+
+ try {
+ const headers = {
+ 'User-Agent': 'GitHub-Image-Upload-Bot/1.0',
+ 'Accept': 'image/*'
+ };
+
+ const response = await axios({
+ url,
+ method: 'GET',
+ responseType: 'arraybuffer',
+ maxContentLength: MAX_FILE_SIZE,
+ maxBodyLength: MAX_FILE_SIZE,
+ timeout: REQUEST_TIMEOUT,
+ maxRedirects: 0,
+ headers,
+ validateStatus: (status) => status >= 200 && status < 300,
+ beforeRedirect: (options, { headers: responseHeaders }) => {
+ throw new Error('Redirects are not allowed for security reasons');
+ }
+ });
+
+ // Validate Content-Type header to ensure we're receiving an image
+ const contentType = response.headers['content-type'];
+ if (contentType) {
+ const normalizedContentType = contentType.toLowerCase().split(';')[0].trim();
+ const isValidImageType = ALLOWED_CONTENT_TYPES.some(
+ allowed => normalizedContentType === allowed
+ );
+
+ if (!isValidImageType) {
+ throw new Error(`Invalid Content-Type: ${normalizedContentType}. Expected: ${ALLOWED_CONTENT_TYPES.join(', ')}`);
+ }
+ console.log(`Content-Type: ${normalizedContentType}`);
+ } else {
+ throw new Error('Missing Content-Type header in response');
+ }
+
+ const buffer = Buffer.from(response.data);
+
+ if (buffer.length > MAX_FILE_SIZE) {
+ throw new Error(`Image size (${(buffer.length / 1024 / 1024).toFixed(2)}MB) exceeds maximum allowed size (${MAX_FILE_SIZE / 1024 / 1024}MB)`);
+ }
+
+ if (buffer.length === 0) {
+ throw new Error('Downloaded image is empty');
+ }
+
+ console.log(`✓ Downloaded ${(buffer.length / 1024).toFixed(2)}KB`);
+ return buffer;
+ } catch (error) {
+ if (error.response) {
+ const status = error.response.status;
+
+ if (status === 400 || status === 404) {
+ throw new Error(
+ 'Image URL expired or invalid (HTTP ' + status + '). ' +
+ 'GitHub image URLs expire in ~5 minutes. ' +
+ 'Please: 1) Refresh the PR page, 2) Copy a fresh image URL, 3) Run /img-bot again immediately.'
+ );
+ }
+ throw new Error(`HTTP ${status}: ${error.response.statusText || 'Request failed'}`);
+ }
+
+ if (error.code === 'ECONNABORTED') {
+ throw new Error('Download timed out. Please try again.');
+ }
+
+ throw new Error(`Download failed: ${error.message}`);
+ }
+}
+
+// ============================================================================
+// IMAGE VALIDATION FUNCTION
+// ============================================================================
+// Validates that the downloaded buffer is a valid image
+async function validateImage(buffer) {
+ console.log('Validating image...');
+
+ try {
+ const sharpInstance = sharp(buffer, {
+ limitInputPixels: MAX_PIXELS,
+ sequentialRead: true,
+ failOn: 'error'
+ });
+
+ const metadata = await sharpInstance.metadata();
+
+ console.log('Image metadata:', {
+ format: metadata.format,
+ width: metadata.width,
+ height: metadata.height,
+ size: `${(buffer.length / 1024).toFixed(2)}KB`
+ });
+
+ // Validate format
+ if (!ALLOWED_FORMATS.includes(metadata.format)) {
+ throw new Error(`Invalid format: ${metadata.format}. Allowed: ${ALLOWED_FORMATS.join(', ')}`);
+ }
+
+ // Validate dimensions (prevents overly large images)
+ if (!metadata.width || !metadata.height) {
+ throw new Error('Unable to determine image dimensions');
+ }
+
+ if (metadata.width > MAX_WIDTH || metadata.height > MAX_HEIGHT) {
+ throw new Error(`Image dimensions ${metadata.width}x${metadata.height} exceed maximum ${MAX_WIDTH}x${MAX_HEIGHT}`);
+ }
+
+ if (metadata.width < 1 || metadata.height < 1) {
+ throw new Error('Invalid image dimensions');
+ }
+
+ // Check total pixel count
+ const totalPixels = metadata.width * metadata.height;
+ if (totalPixels > MAX_PIXELS) {
+ throw new Error(`Image pixel count ${totalPixels.toLocaleString()} exceeds maximum ${MAX_PIXELS.toLocaleString()}`);
+ }
+
+ const channels = metadata.channels || 4;
+ const bitsPerChannel = metadata.depth === 'uchar' ? 8 : (metadata.depth === 'ushort' ? 16 : 8);
+ const bytesPerPixel = channels * (bitsPerChannel / 8);
+ const estimatedUncompressedSize = metadata.width * metadata.height * bytesPerPixel;
+ const compressionRatio = estimatedUncompressedSize / buffer.length;
+
+ console.log(`Compression ratio: ${compressionRatio.toFixed(1)}:1`);
+
+ if (compressionRatio > MAX_COMPRESSION_RATIO) {
+ throw new Error(
+ `Suspicious compression ratio (${compressionRatio.toFixed(1)}:1) exceeds maximum allowed (${MAX_COMPRESSION_RATIO}:1). ` +
+ `This may indicate a decompression bomb.`
+ );
+ }
+
+ console.log('✓ Image validation passed');
+ return metadata;
+ } catch (error) {
+ const safeMessage = error.message
+ .replace(/\/[^\s]+/g, '[PATH]')
+ .substring(0, 200);
+ throw new Error(`Image validation failed: ${safeMessage}`);
+ }
+}
+
+// ============================================================================
+// EXIF STRIPPING FUNCTION
+// ============================================================================
+// Strips EXIF metadata from images
+async function stripExifMetadata(buffer, format) {
+ console.log('Stripping EXIF metadata...');
+
+ try {
+ const sharpInstance = sharp(buffer, {
+ limitInputPixels: MAX_PIXELS,
+ sequentialRead: true
+ });
+
+ let processed = sharpInstance.rotate();
+
+ if (format === 'png') {
+ processed = processed.png({
+ compressionLevel: 9,
+ effort: 10
+ });
+ } else {
+ processed = processed.jpeg({
+ quality: 95,
+ mozjpeg: true
+ });
+ }
+
+ const strippedBuffer = await processed.toBuffer();
+
+ console.log(`✓ EXIF stripped. Original: ${(buffer.length / 1024).toFixed(2)}KB, New: ${(strippedBuffer.length / 1024).toFixed(2)}KB`);
+ return strippedBuffer;
+ } catch (error) {
+ console.warn(`Warning: Could not strip EXIF metadata: ${error.message}`);
+ return buffer;
+ }
+}
+
+// ============================================================================
+// FILENAME GENERATION FUNCTION
+// ============================================================================
+// Generates a unique filename for the uploaded image
+function generateUniqueFilename(originalUrl, format) {
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
+
+ // Use full UUID for better collision resistance
+ const uniqueId = uuidv4();
+ const randomBytes = crypto.randomBytes(16).toString('hex');
+ const hash = crypto.createHash('sha256')
+ .update(originalUrl)
+ .update(randomBytes)
+ .update(Date.now().toString())
+ .digest('hex')
+ .substring(0, 12);
+
+ const sanitizedFormat = format.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();
+
+ const safeFormats = ['jpeg', 'jpg', 'png'];
+ if (!safeFormats.includes(sanitizedFormat)) {
+ throw new Error(`Invalid format for filename: ${format}`);
+ }
+
+ return `${timestamp}_${uniqueId}_${hash}.${sanitizedFormat}`;
+}
+
+// ============================================================================
+// S3 UPLOAD FUNCTION
+// ============================================================================
+// Uploads the image buffer to AWS S3
+async function uploadToS3(buffer, filename, contentType) {
+ console.log(`Uploading to S3: ${filename}`);
+
+ try {
+ const bucket = process.env.AWS_S3_BUCKET;
+ const region = process.env.AWS_REGION;
+
+ if (!bucket || !region) {
+ throw new Error('AWS_S3_BUCKET and AWS_REGION environment variables are required');
+ }
+
+ const upload = new Upload({
+ client: s3Client,
+ params: {
+ Bucket: bucket,
+ Key: `images/${filename}`,
+ Body: buffer,
+ ContentType: contentType,
+ CacheControl: 'public, max-age=31536000, immutable',
+ ContentDisposition: `inline; filename="${filename}"`,
+ Metadata: {
+ 'uploaded-by': 'img-bot',
+ 'upload-timestamp': new Date().toISOString()
+ }
+ }
+ });
+
+ await upload.done();
+
+ const publicUrl = `https://${bucket}.s3.${region}.amazonaws.com/images/${filename}`;
+
+ console.log(`✓ Uploaded to S3: ${publicUrl}`);
+ return publicUrl;
+ } catch (error) {
+ const safeMessage = error.message
+ .replace(/arn:[^\s]+/gi, '[ARN]')
+ .replace(/[a-z0-9-]+\.s3\.[a-z0-9-]+\.amazonaws\.com/gi, '[S3_ENDPOINT]')
+ .replace(/s3:\/\/[^\s]+/gi, '[S3_PATH]')
+ .substring(0, 200);
+
+ throw new Error(`S3 upload failed: ${safeMessage}`);
+ }
+}
+
+// ============================================================================
+// MAIN IMAGE PROCESSING FUNCTION
+// ============================================================================
+// Processes a single image: download, validate, strip EXIF, upload
+async function processImage(url, index) {
+ const safeLogUrl = sanitizeUrlForLogging(url).substring(0, 80) + '...';
+
+ try {
+ const buffer = await downloadImage(url);
+
+ const metadata = await validateImage(buffer);
+
+ const strippedBuffer = await stripExifMetadata(buffer, metadata.format);
+
+ const filename = generateUniqueFilename(url, metadata.format);
+
+ const s3Url = await uploadToS3(
+ strippedBuffer,
+ filename,
+ `image/${metadata.format}`
+ );
+
+ return {
+ success: true,
+ originalUrl: safeLogUrl,
+ s3Url: s3Url,
+ filename: filename,
+ metadata: {
+ format: metadata.format,
+ width: metadata.width,
+ height: metadata.height,
+ size: `${(strippedBuffer.length / 1024).toFixed(2)}KB`
+ }
+ };
+ } catch (error) {
+ // We don't throw the error here so other images can still be processed
+ return {
+ success: false,
+ originalUrl: safeLogUrl,
+ error: error.message.substring(0, 300)
+ };
+ }
+}
+
+// ============================================================================
+// MAIN ENTRY POINT
+// ============================================================================
+// Reads URLs from file and processes them sequentially
+async function main() {
+ let urls;
+
+ try {
+ const urlsPath = process.env.URLS_FILE_PATH || 'urls.json';
+
+ if (!fs.existsSync(urlsPath)) {
+ throw new Error(`URLs file not found: ${urlsPath}`);
+ }
+
+ const rawData = fs.readFileSync(urlsPath, 'utf8');
+ urls = JSON.parse(rawData);
+
+ if (!Array.isArray(urls)) {
+ throw new Error('URLs file does not contain an array');
+ }
+
+ if (urls.length === 0) {
+ throw new Error('URLs array is empty');
+ }
+
+ if (urls.length > MAX_IMAGES_PER_REQUEST) {
+ throw new Error(
+ `Too many images (${urls.length}). Maximum allowed per request: ${MAX_IMAGES_PER_REQUEST}`
+ );
+ }
+
+ for (const url of urls) {
+ if (typeof url !== 'string' || !url.startsWith('https://')) {
+ throw new Error('Invalid URL format in input array');
+ }
+ }
+
+ console.log(`Processing ${urls.length} image(s)...`);
+ } catch (error) {
+ console.error('Failed to read/parse URLs file:', error.message);
+ // Output error result so workflow can parse and report it
+ console.log('\nRESULTS:', JSON.stringify([{
+ success: false,
+ originalUrl: 'unknown',
+ error: `Failed to read/parse URLs: ${error.message.substring(0, 200)}`
+ }], null, 2));
+ process.exit(1);
+ }
+
+ // Process each URL sequentially
+ const results = [];
+ for (let i = 0; i < urls.length; i++) {
+ const url = urls[i];
+ const safeLogUrl = sanitizeUrlForLogging(url).substring(0, 60);
+ console.log(`\n[${i + 1}/${urls.length}] Processing: ${safeLogUrl}...`);
+
+ const result = await processImage(url, i);
+ results.push(result);
+
+ if (result.success) {
+ console.log(`✓ Success: ${result.filename}`);
+ } else {
+ console.error(`✗ Failed: ${result.error}`);
+ }
+ }
+
+ // Summary
+ const successCount = results.filter(r => r.success).length;
+ const failCount = results.filter(r => !r.success).length;
+ console.log(`\n========================================`);
+ console.log(`Summary: ${successCount} succeeded, ${failCount} failed`);
+ console.log(`========================================`);
+
+ // Always output RESULTS, even if empty (for workflow parsing)
+ console.log('\nRESULTS:', JSON.stringify(results, null, 2));
+
+ // Exit with code 1 only if all images failed
+ const allFailed = results.length > 0 && results.every(r => !r.success);
+ if (allFailed) {
+ console.error('\n✗ All images failed to process');
+ process.exit(1);
+ }
+}
+
+// Run main function and handle any unhandled errors
+main().catch(error => {
+ console.error('Fatal error:', error.message);
+ // Output empty results so workflow can still parse and report the error
+ console.log('\nRESULTS:', JSON.stringify([{
+ success: false,
+ originalUrl: 'unknown',
+ error: `Fatal error: ${error.message.substring(0, 200)}`
+ }], null, 2));
+ process.exit(1);
+});
diff --git a/.github/workflows/s3-upload.yml b/.github/workflows/s3-upload.yml
new file mode 100644
index 00000000..6137df3d
--- /dev/null
+++ b/.github/workflows/s3-upload.yml
@@ -0,0 +1,428 @@
+name: Process and Upload Images
+
+# This workflow processes image URLs from PRs comments and uploads them to the S3 bucket
+# It triggers when a comment is created on an issue or pull request
+on:
+ issue_comment:
+ types: [created]
+
+permissions:
+ pull-requests: write
+ issues: write
+ contents: read
+ id-token: write
+
+jobs:
+ upload-images:
+ concurrency:
+ group: upload-images-${{ github.event.issue.number }}
+ cancel-in-progress: false
+
+ # Conditional execution: Only run if ALL conditions are met:
+ # 1. Comment is on a pull request (not a regular issue)
+ # 2. Comment starts with '/img-bot' command
+ # 3. Commenter has appropriate permissions (COLLABORATOR/MEMBER/OWNER)
+ if: |
+ github.event.issue.pull_request &&
+ startsWith(github.event.comment.body, '/img-bot') &&
+ (
+ github.event.comment.author_association == 'COLLABORATOR' ||
+ github.event.comment.author_association == 'MEMBER' ||
+ github.event.comment.author_association == 'OWNER'
+ )
+
+ runs-on: ubuntu-latest
+
+ steps:
+ # Step 0: Verify user permissions
+ - name: Verify user permissions
+ id: check-permissions
+ uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
+ with:
+ script: |
+ const allowed = ['admin', 'maintain', 'triage'];
+ const username = context.payload.comment.user.login;
+
+ // Get the permission level via API
+ const { data } = await github.rest.repos.getCollaboratorPermissionLevel({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ username: username,
+ });
+
+ const perm = data.permission;
+
+ if (!allowed.includes(perm)) {
+ core.setFailed(`User ${username} has insufficient permissions (${perm}).`);
+ return;
+ }
+
+ console.log(`✅ User ${username} allowed (${perm} permission).`);
+
+ # Step 1: Acknowledge the command by adding a reaction
+ - name: React to command
+ uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
+ with:
+ script: |
+ // Add an "eyes" emoji reaction to the comment to show we're processing
+ await github.rest.reactions.createForIssueComment({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ comment_id: context.payload.comment.id,
+ content: 'eyes'
+ });
+
+ # Step 2: Extract GitHub image URLs from the comment
+ - name: Extract GitHub image URLs
+ id: extract-urls
+ uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
+ with:
+ script: |
+ const comment = context.payload.comment.body;
+
+ // Extract URLs from comment using regex
+ const urlRegex = /(https:\/\/[^\s\]\)]+)/g;
+ const urls = comment.match(urlRegex) || [];
+
+ const validatedUrls = [];
+ const validationErrors = [];
+
+ // Only allowed hostname
+ const ALLOWED_HOSTNAME = 'private-user-images.githubusercontent.com';
+
+ const VALID_PATH_PATTERN = /^\/\d+\/\d+-[a-f0-9-]{36}\.(png|jpg|jpeg)$/i;
+
+ for (const url of urls) {
+ if (url === '/img-bot') continue;
+
+ try {
+ const urlObj = new URL(url);
+
+ if (urlObj.protocol !== 'https:') {
+ validationErrors.push(`Only HTTPS URLs are allowed`);
+ continue;
+ }
+
+ // Strict hostname validation
+ const hostname = urlObj.hostname.toLowerCase();
+
+ if (hostname !== ALLOWED_HOSTNAME) {
+ validationErrors.push(`Invalid hostname '${hostname}'. Only ${ALLOWED_HOSTNAME} URLs are accepted.`);
+ continue;
+ }
+
+ // Validate pathname format
+ const pathname = decodeURIComponent(urlObj.pathname);
+
+ // Check for path traversal attempts
+ if (pathname.includes('..') || pathname.includes('//') || pathname.includes('\\')) {
+ validationErrors.push(`Invalid path pattern detected`);
+ continue;
+ }
+
+ // Validate path matches expected GitHub image URL format
+ if (!VALID_PATH_PATTERN.test(pathname)) {
+ validationErrors.push(`URL path does not match expected GitHub image format`);
+ continue;
+ }
+
+ // Must have JWT token (required for authentication)
+ if (!urlObj.searchParams.has('jwt')) {
+ validationErrors.push(`URL missing required JWT token. Please copy the full image URL from GitHub.`);
+ continue;
+ }
+
+ // Store original URL for download, sanitized for logging
+ const sanitizedUrl = `${urlObj.protocol}//${urlObj.hostname}${urlObj.pathname}?jwt=[REDACTED]`;
+
+ validatedUrls.push({
+ original: url,
+ sanitized: sanitizedUrl
+ });
+ } catch (error) {
+ validationErrors.push(`Invalid URL format - ${error.message}`);
+ }
+ }
+
+ if (validatedUrls.length === 0 && validationErrors.length === 0) {
+ throw new Error(
+ 'No valid GitHub image URLs found in comment.\n\n' +
+ 'To get the correct URL:\n' +
+ '1. Refresh the PR page (important - JWT tokens expire in ~5 minutes)\n' +
+ '2. Right-click the image and select "Copy image address"\n' +
+ '3. Paste the URL in your /img-bot comment'
+ );
+ }
+
+ if (validationErrors.length > 0) {
+ throw new Error(
+ `URL validation failed:\n${validationErrors.join('\n')}\n\n` +
+ `Please ensure all URLs are GitHub-hosted image URLs.`
+ );
+ }
+
+ console.log(`Extracted ${validatedUrls.length} GitHub image URL(s)`);
+ console.log('URLs (sanitized):', validatedUrls.map(u => u.sanitized));
+
+ // Warn about JWT expiration
+ console.log('⚠️ Note: JWT tokens expire in ~5 minutes. Ensure URLs were copied from a freshly loaded page.');
+
+ // Return only the original URLs for processing (script needs full URL with JWT)
+ return validatedUrls.map(u => u.original);
+ result-encoding: json
+
+ # Step 3: Validate that all required AWS secrets are configured
+ - name: Validate OIDC authentication
+ run: |
+ if [ -z "${{ secrets.AWS_ROLE_ARN }}" ]; then
+ echo "::error::AWS_ROLE_ARN secret is not configured"
+ exit 1
+ fi
+
+ if [ -z "${{ secrets.AWS_REGION }}" ]; then
+ echo "::error::AWS_REGION secret is not configured"
+ exit 1
+ fi
+
+ if [ -z "${{ secrets.AWS_S3_BUCKET }}" ]; then
+ echo "::error::AWS_S3_BUCKET secret is not configured"
+ exit 1
+ fi
+
+ echo "✓ OIDC authentication configured"
+
+ # Step 4: Checkout repository
+ - name: Checkout repository
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+
+ # Step 5: Setup Node.js and pnpm
+ - name: Setup Node.js
+ uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0
+ with:
+ node-version: "20"
+
+ # Step 6: Install pnpm
+ - name: Setup pnpm
+ uses: pnpm/action-setup@fe02b34f77f8bc703788d5817da081398fad5dd2 # v4.0.0
+ with:
+ version: 10.15.0
+ run_install: false
+
+ # Step 7: Cache pnpm dependencies
+ - name: Cache pnpm dependencies
+ uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
+ id: pnpm-cache
+ with:
+ path: |
+ node_modules
+ ~/.pnpm-store
+ key: ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }}
+ restore-keys: |
+ ${{ runner.os }}-pnpm-
+
+ # Step 8: Install dependencies
+ - name: Install dependencies
+ run: |
+ # Install dependencies using pnpm
+ pnpm install --frozen-lockfile
+
+ # Step 9: Write URLs to a temp file for the processing script
+ - name: Write URLs to file
+ uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
+ with:
+ script: |
+ const fs = require('fs');
+ const path = require('path');
+
+ // Get URLs directly from the step output (already JSON)
+ const urls = ${{ steps.extract-urls.outputs.result }};
+
+ // Write to a secure temp location
+ const urlsPath = path.join(process.env.RUNNER_TEMP || '/tmp', 'urls.json');
+ fs.writeFileSync(urlsPath, JSON.stringify(urls, null, 2), { mode: 0o600 });
+
+ // Export path for next step
+ core.exportVariable('URLS_FILE_PATH', urlsPath);
+
+ console.log(`Wrote ${urls.length} URL(s) to secure temp file`);
+
+ # Step 9b: Configure AWS credentials using OIDC (just-in-time before upload)
+ - name: Configure AWS credentials
+ uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0
+ with:
+ role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
+ aws-region: ${{ secrets.AWS_REGION }}
+ role-session-name: img-bot-${{ github.run_id }}
+
+ # Step 10: Process and upload images
+ - name: Process and upload images
+ id: process
+ env:
+ AWS_REGION: ${{ secrets.AWS_REGION }}
+ AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }}
+ URLS_FILE_PATH: ${{ env.URLS_FILE_PATH }}
+ run: |
+ # Run script and capture output
+ TEMP_OUTPUT=$(mktemp)
+ set +e
+ node .github/scripts/process-images.js > "$TEMP_OUTPUT" 2>&1
+ EXIT_CODE=$?
+ set -e
+
+ # Extract RESULTS from script output
+ RESULTS=$(perl -0777 -pe 's/.*RESULTS:\s*//s' "$TEMP_OUTPUT" 2>/dev/null || echo '')
+ RESULTS=$(echo "$RESULTS" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
+
+ # Validate and write results
+ RESULTS_PATH=$(mktemp)
+ if [ -z "$RESULTS" ] || ! echo "$RESULTS" | grep -q '^\['; then
+ echo "::error::Failed to extract valid RESULTS from script output"
+ tail -20 "$TEMP_OUTPUT" | grep -v -E '(jwt=|token=|Bearer |Authorization:)'
+ rm -f "$TEMP_OUTPUT"
+ exit 1
+ fi
+
+ echo "$RESULTS" > "$RESULTS_PATH"
+ echo "RESULTS_FILE_PATH=$RESULTS_PATH" >> $GITHUB_ENV
+
+ # Show script output for debugging (only if script failed)
+ if [ "$EXIT_CODE" -ne 0 ]; then
+ echo "Script output (filtered):"
+ cat "$TEMP_OUTPUT" | grep -v -E '(jwt=|token=|Bearer |Authorization:)'
+ fi
+
+ # Clean up temp output
+ rm -f "$TEMP_OUTPUT"
+
+ # Step 11: Comment results back to PR and check for failures
+ - name: Comment results and check failures
+ uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
+ env:
+ RESULTS_FILE_PATH: ${{ env.RESULTS_FILE_PATH }}
+ with:
+ script: |
+ const fs = require('fs');
+ let results;
+ try {
+ const resultsPath = process.env.RESULTS_FILE_PATH;
+ if (!resultsPath || !fs.existsSync(resultsPath)) {
+ throw new Error('Results file not found - workflow may have failed before processing');
+ }
+
+ const resultsStr = fs.readFileSync(resultsPath, 'utf8').trim();
+ if (!resultsStr || resultsStr === '') {
+ throw new Error('Results file is empty - workflow may have failed before processing');
+ }
+
+ results = JSON.parse(resultsStr);
+
+ if (!Array.isArray(results)) {
+ throw new Error(`Results is not an array: ${typeof results}`);
+ }
+
+ if (results.length === 0) {
+ throw new Error('No results found in results array');
+ }
+ } catch (error) {
+ await github.rest.issues.createComment({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: context.payload.issue.number,
+ body: `❌ **Error**: Failed to parse workflow results.\n\nPlease check the workflow logs for details.`
+ });
+ throw error;
+ }
+
+ // URL sanitization to prevent markdown injection
+ function sanitizeUrl(str) {
+ if (!str) return '';
+ return str
+ .replace(/[<>]/g, '')
+ .replace(/[\[\]()]/g, '')
+ .replace(/\n/g, ' ')
+ .replace(/\|/g, '\\|')
+ .substring(0, 500);
+ }
+
+ // Separate successful and failed uploads
+ const successful = results.filter(r => r.success);
+ const failed = results.filter(r => !r.success);
+
+ // Build comment body with results
+ let commentBody = '## Image Upload Results\n\n';
+
+ // Add successful uploads as a table with preview
+ if (successful.length > 0) {
+ commentBody += '| S3 URL | Preview |\n';
+ commentBody += '|:------:|:-------:|\n';
+
+ successful.forEach((result) => {
+ const safeS3Url = sanitizeUrl(result.s3Url);
+ commentBody += `| \`${safeS3Url}\` |
|\n`;
+ });
+
+ commentBody += '\n**Next step:** Copy the URL and use it in your contribution:\n';
+ commentBody += '```md\n\n```\n\n';
+ }
+
+ // Add failed uploads section
+ if (failed.length > 0) {
+ commentBody += '**Failed:**\n';
+ failed.forEach((result) => {
+ const safeError = sanitizeUrl(result.error);
+ commentBody += `- ${safeError}\n`;
+ });
+ }
+
+ // Post comment to PR
+ await github.rest.issues.createComment({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: context.payload.issue.number,
+ body: commentBody
+ });
+
+ // Add reaction to original comment to indicate completion
+ await github.rest.reactions.createForIssueComment({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ comment_id: context.payload.comment.id,
+ content: successful.length === results.length ? 'hooray' : 'confused'
+ });
+
+ # Step 12: Check for failures and fail workflow if needed
+ - name: Check for failures
+ env:
+ RESULTS_FILE_PATH: ${{ env.RESULTS_FILE_PATH }}
+ run: |
+ # Read results from file
+ if [ -z "$RESULTS_FILE_PATH" ] || [ ! -f "$RESULTS_FILE_PATH" ]; then
+ echo "::error::Results file not found"
+ exit 1
+ fi
+
+ # Count failed uploads using jq (JSON processor)
+ FAILED=$(jq '[.[] | select(.success == false)] | length' "$RESULTS_FILE_PATH")
+
+ # If any uploads failed, exit with error
+ if [ "$FAILED" -gt 0 ]; then
+ echo "::error::$FAILED image(s) failed to upload"
+ exit 1
+ fi
+
+ echo "✓ All images uploaded successfully!"
+
+ # Step 13: Cleanup temporary files
+ - name: Cleanup temporary files
+ if: always()
+ run: |
+ # Remove temporary files
+ if [ -n "$URLS_FILE_PATH" ] && [ -f "$URLS_FILE_PATH" ]; then
+ shred -u "$URLS_FILE_PATH" 2>/dev/null || rm -f "$URLS_FILE_PATH"
+ fi
+ if [ -n "$RESULTS_FILE_PATH" ] && [ -f "$RESULTS_FILE_PATH" ]; then
+ shred -u "$RESULTS_FILE_PATH" 2>/dev/null || rm -f "$RESULTS_FILE_PATH"
+ fi
+ # Clean up any stray temp files
+ rm -f urls.json output.log results.json 2>/dev/null || true
+ echo "✓ Cleaned up temporary files"
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 8616d0a3..a550e91c 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -321,19 +321,28 @@ where it fits, for example in block-quotes.
### Visual representation / drawings
-Like GitHub, we also support Mermaid!
-
-You can use codeblocks using the `mermaid` keyword, and you can create beautiful graphical representations.
-There's a
-[playground](https://www.mermaidchart.com/play#pako:eNqrVkrOT0lVslIqyExVKMksyUlVCM9ILFEIy89JSc3NLypRSMlPLc5TL1HISCxLtY_JU4CBGCW3IE9XP5fgGCUFKwUjVBlHX0-fSLCEMYqEn3-wK1jYxDQmT6kWAEyMIfc)
-where you can jump straight to draw!
-
-```mermaid
-pie title What Voldemort doesn't have?
- "FRIENDS" : 2
- "FAMILY" : 3
- "NOSE" : 45
-```
+- Like GitHub, we also support Mermaid!
+
+ You can use codeblocks using the `mermaid` keyword, and you can create beautiful graphical representations.
+ There's a
+ [playground](https://www.mermaidchart.com/play#pako:eNqrVkrOT0lVslIqyExVKMksyUlVCM9ILFEIy89JSc3NLypRSMlPLc5TL1HISCxLtY_JU4CBGCW3IE9XP5fgGCUFKwUjVBlHX0-fSLCEMYqEn3-wK1jYxDQmT6kWAEyMIfc)
+ where you can jump straight to draw!
+
+ ```mermaid
+ pie title What Voldemort doesn't have?
+ "FRIENDS" : 2
+ "FAMILY" : 3
+ "NOSE" : 45
+ ```
+- Adding images is welcome and encouraged.
+ Please follow the steps below to include them correctly:
+
+ 1. After making your changes and opening a PR, add the images you want to include in the PR's comments (by uploading them directly)
+ 2. During the review, a maintainer will upload your images to our S3 bucket and reply with the links you should use.
+ 3. Once you receive the new links, update your PR to add the images' links.
+
+> ⚠️ Please do not add images directly to the repository.
+> This helps us avoid bloating the Git history and ensures all images follow our standardized storage and delivery method.
### Linking resources
diff --git a/docs/pages/contribute/contributing.mdx b/docs/pages/contribute/contributing.mdx
index a48dfce0..9e7d3a37 100644
--- a/docs/pages/contribute/contributing.mdx
+++ b/docs/pages/contribute/contributing.mdx
@@ -350,19 +350,29 @@ fits, for example in block-quotes.
### Visual representation / drawings
-Like GitHub, we also support Mermaid!
-
-You can use codeblocks using the `mermaid` keyword, and you can create beautiful graphical representations.
-There's a
-[playground](https://www.mermaidchart.com/play#pako:eNqrVkrOT0lVslIqyExVKMksyUlVCM9ILFEIy89JSc3NLypRSMlPLc5TL1HISCxLtY_JU4CBGCW3IE9XP5fgGCUFKwUjVBlHX0-fSLCEMYqEn3-wK1jYxDQmT6kWAEyMIfc)
-where you can jump straight to draw!
-
-
+- Like GitHub, we also support Mermaid!
+
+ You can use codeblocks using the `mermaid` keyword, and you can create beautiful graphical representations.
+ There's a
+ [playground](https://www.mermaidchart.com/play#pako:eNqrVkrOT0lVslIqyExVKMksyUlVCM9ILFEIy89JSc3NLypRSMlPLc5TL1HISCxLtY_JU4CBGCW3IE9XP5fgGCUFKwUjVBlHX0-fSLCEMYqEn3-wK1jYxDQmT6kWAEyMIfc)
+ where you can jump straight to draw!
+
+
+
+- Adding images is welcome and encouraged.
+ Please follow the steps below to include them correctly:
+
+ 1. After making your changes and opening a PR, add the images you want to include in the PR's comments (by uploading them directly)
+ 2. During the review, a maintainer will upload your images to our S3 bucket and reply with the links you should use.
+ 3. Once you receive the new links, update your PR to add the images' links.
+
+> ⚠️ Please do not add images directly to the repository.
+> This helps us avoid bloating the Git history and ensures all images follow our standardized storage and delivery method.
### Linking resources
diff --git a/package.json b/package.json
index 095cd648..131dac72 100644
--- a/package.json
+++ b/package.json
@@ -38,6 +38,9 @@
},
"packageManager": "pnpm@10.15.0",
"dependencies": {
+ "@aws-sdk/client-s3": "^3.968.0",
+ "@aws-sdk/lib-storage": "^3.967.0",
+ "axios": "^1.13.2",
"exceljs": "^4.4.0",
"gray-matter": "^4.0.3",
"just-install": "^2.0.2",
@@ -46,6 +49,8 @@
"playwright": "^1.57.0",
"react": "^19.2.1",
"react-dom": "^19.2.1",
- "react-router-dom": "^7.12.0"
+ "react-router-dom": "^7.12.0",
+ "sharp": "^0.34.5",
+ "uuid": "^13.0.0"
}
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 29d4ec25..336ab489 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -8,6 +8,15 @@ importers:
.:
dependencies:
+ '@aws-sdk/client-s3':
+ specifier: ^3.968.0
+ version: 3.971.0
+ '@aws-sdk/lib-storage':
+ specifier: ^3.967.0
+ version: 3.971.0(@aws-sdk/client-s3@3.971.0)
+ axios:
+ specifier: ^1.13.2
+ version: 1.13.2
exceljs:
specifier: ^4.4.0
version: 4.4.0
@@ -35,6 +44,12 @@ importers:
react-router-dom:
specifier: ^7.12.0
version: 7.12.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
+ sharp:
+ specifier: ^0.34.5
+ version: 0.34.5
+ uuid:
+ specifier: ^13.0.0
+ version: 13.0.0
devDependencies:
'@types/exceljs':
specifier: ^1.3.2
@@ -60,6 +75,175 @@ packages:
'@antfu/install-pkg@1.1.0':
resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==}
+ '@aws-crypto/crc32@5.2.0':
+ resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==}
+ engines: {node: '>=16.0.0'}
+
+ '@aws-crypto/crc32c@5.2.0':
+ resolution: {integrity: sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==}
+
+ '@aws-crypto/sha1-browser@5.2.0':
+ resolution: {integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==}
+
+ '@aws-crypto/sha256-browser@5.2.0':
+ resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==}
+
+ '@aws-crypto/sha256-js@5.2.0':
+ resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==}
+ engines: {node: '>=16.0.0'}
+
+ '@aws-crypto/supports-web-crypto@5.2.0':
+ resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==}
+
+ '@aws-crypto/util@5.2.0':
+ resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==}
+
+ '@aws-sdk/client-s3@3.971.0':
+ resolution: {integrity: sha512-BBUne390fKa4C4QvZlUZ5gKcu+Uyid4IyQ20N4jl0vS7SK2xpfXlJcgKqPW5ts6kx6hWTQBk6sH5Lf12RvuJxg==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/client-sso@3.971.0':
+ resolution: {integrity: sha512-Xx+w6DQqJxDdymYyIxyKJnRzPvVJ4e/Aw0czO7aC9L/iraaV7AG8QtRe93OGW6aoHSh72CIiinnpJJfLsQqP4g==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/core@3.970.0':
+ resolution: {integrity: sha512-klpzObldOq8HXzDjDlY6K8rMhYZU6mXRz6P9F9N+tWnjoYFfeBMra8wYApydElTUYQKP1O7RLHwH1OKFfKcqIA==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/crc64-nvme@3.969.0':
+ resolution: {integrity: sha512-IGNkP54HD3uuLnrPCYsv3ZD478UYq+9WwKrIVJ9Pdi3hxPg8562CH3ZHf8hEgfePN31P9Kj+Zu9kq2Qcjjt61A==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/credential-provider-env@3.970.0':
+ resolution: {integrity: sha512-rtVzXzEtAfZBfh+lq3DAvRar4c3jyptweOAJR2DweyXx71QSMY+O879hjpMwES7jl07a3O1zlnFIDo4KP/96kQ==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/credential-provider-http@3.970.0':
+ resolution: {integrity: sha512-CjDbWL7JxjLc9ZxQilMusWSw05yRvUJKRpz59IxDpWUnSMHC9JMMUUkOy5Izk8UAtzi6gupRWArp4NG4labt9Q==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/credential-provider-ini@3.971.0':
+ resolution: {integrity: sha512-c0TGJG4xyfTZz3SInXfGU8i5iOFRrLmy4Bo7lMyH+IpngohYMYGYl61omXqf2zdwMbDv+YJ9AviQTcCaEUKi8w==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/credential-provider-login@3.971.0':
+ resolution: {integrity: sha512-yhbzmDOsk0RXD3rTPhZra4AWVnVAC4nFWbTp+sUty1hrOPurUmhuz8bjpLqYTHGnlMbJp+UqkQONhS2+2LzW2g==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/credential-provider-node@3.971.0':
+ resolution: {integrity: sha512-epUJBAKivtJqalnEBRsYIULKYV063o/5mXNJshZfyvkAgNIzc27CmmKRXTN4zaNOZg8g/UprFp25BGsi19x3nQ==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/credential-provider-process@3.970.0':
+ resolution: {integrity: sha512-0XeT8OaT9iMA62DFV9+m6mZfJhrD0WNKf4IvsIpj2Z7XbaYfz3CoDDvNoALf3rPY9NzyMHgDxOspmqdvXP00mw==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/credential-provider-sso@3.971.0':
+ resolution: {integrity: sha512-dY0hMQ7dLVPQNJ8GyqXADxa9w5wNfmukgQniLxGVn+dMRx3YLViMp5ZpTSQpFhCWNF0oKQrYAI5cHhUJU1hETw==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/credential-provider-web-identity@3.971.0':
+ resolution: {integrity: sha512-F1AwfNLr7H52T640LNON/h34YDiMuIqW/ZreGzhRR6vnFGaSPtNSKAKB2ssAMkLM8EVg8MjEAYD3NCUiEo+t/w==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/lib-storage@3.971.0':
+ resolution: {integrity: sha512-THTCXZiYjuAU2kPD8rIuvtYRT83BxEzbv4uayPlQJ8v5bybLTYDbNEbpfZGilyAqUAdSGTMOkoLu9ROryCJ3/g==}
+ engines: {node: '>=20.0.0'}
+ peerDependencies:
+ '@aws-sdk/client-s3': 3.971.0
+
+ '@aws-sdk/middleware-bucket-endpoint@3.969.0':
+ resolution: {integrity: sha512-MlbrlixtkTVhYhoasblKOkr7n2yydvUZjjxTnBhIuHmkyBS1619oGnTfq/uLeGYb4NYXdeQ5OYcqsRGvmWSuTw==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/middleware-expect-continue@3.969.0':
+ resolution: {integrity: sha512-qXygzSi8osok7tH9oeuS3HoKw6jRfbvg5Me/X5RlHOvSSqQz8c5O9f3MjUApaCUSwbAU92KrbZWasw2PKiaVHg==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/middleware-flexible-checksums@3.971.0':
+ resolution: {integrity: sha512-+hGUDUxeIw8s2kkjfeXym0XZxdh0cqkHkDpEanWYdS1gnWkIR+gf9u/DKbKqGHXILPaqHXhWpLTQTVlaB4sI7Q==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/middleware-host-header@3.969.0':
+ resolution: {integrity: sha512-AWa4rVsAfBR4xqm7pybQ8sUNJYnjyP/bJjfAw34qPuh3M9XrfGbAHG0aiAfQGrBnmS28jlO6Kz69o+c6PRw1dw==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/middleware-location-constraint@3.969.0':
+ resolution: {integrity: sha512-zH7pDfMLG/C4GWMOpvJEoYcSpj7XsNP9+irlgqwi667sUQ6doHQJ3yyDut3yiTk0maq1VgmriPFELyI9lrvH/g==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/middleware-logger@3.969.0':
+ resolution: {integrity: sha512-xwrxfip7Y2iTtCMJ+iifN1E1XMOuhxIHY9DreMCvgdl4r7+48x2S1bCYPWH3eNY85/7CapBWdJ8cerpEl12sQQ==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/middleware-recursion-detection@3.969.0':
+ resolution: {integrity: sha512-2r3PuNquU3CcS1Am4vn/KHFwLi8QFjMdA/R+CRDXT4AFO/0qxevF/YStW3gAKntQIgWgQV8ZdEtKAoJvLI4UWg==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/middleware-sdk-s3@3.970.0':
+ resolution: {integrity: sha512-v/Y5F1lbFFY7vMeG5yYxuhnn0CAshz6KMxkz1pDyPxejNE9HtA0w8R6OTBh/bVdIm44QpjhbI7qeLdOE/PLzXQ==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/middleware-ssec@3.971.0':
+ resolution: {integrity: sha512-QGVhvRveYG64ZhnS/b971PxXM6N2NU79Fxck4EfQ7am8v1Br0ctoeDDAn9nXNblLGw87we9Z65F7hMxxiFHd3w==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/middleware-user-agent@3.970.0':
+ resolution: {integrity: sha512-dnSJGGUGSFGEX2NzvjwSefH+hmZQ347AwbLhAsi0cdnISSge+pcGfOFrJt2XfBIypwFe27chQhlfuf/gWdzpZg==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/nested-clients@3.971.0':
+ resolution: {integrity: sha512-TWaILL8GyYlhGrxxnmbkazM4QsXatwQgoWUvo251FXmUOsiXDFDVX3hoGIfB3CaJhV2pJPfebHUNJtY6TjZ11g==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/region-config-resolver@3.969.0':
+ resolution: {integrity: sha512-scj9OXqKpcjJ4jsFLtqYWz3IaNvNOQTFFvEY8XMJXTv+3qF5I7/x9SJtKzTRJEBF3spjzBUYPtGFbs9sj4fisQ==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/signature-v4-multi-region@3.970.0':
+ resolution: {integrity: sha512-z3syXfuK/x/IsKf/AeYmgc2NT7fcJ+3fHaGO+fkghkV9WEba3fPyOwtTBX4KpFMNb2t50zDGZwbzW1/5ighcUQ==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/token-providers@3.971.0':
+ resolution: {integrity: sha512-4hKGWZbmuDdONMJV0HJ+9jwTDb0zLfKxcCLx2GEnBY31Gt9GeyIQ+DZ97Bb++0voawj6pnZToFikXTyrEq2x+w==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/types@3.969.0':
+ resolution: {integrity: sha512-7IIzM5TdiXn+VtgPdVLjmE6uUBUtnga0f4RiSEI1WW10RPuNvZ9U+pL3SwDiRDAdoGrOF9tSLJOFZmfuwYuVYQ==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/util-arn-parser@3.968.0':
+ resolution: {integrity: sha512-gqqvYcitIIM2K4lrDX9de9YvOfXBcVdxfT/iLnvHJd4YHvSXlt+gs+AsL4FfPCxG4IG9A+FyulP9Sb1MEA75vw==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/util-endpoints@3.970.0':
+ resolution: {integrity: sha512-TZNZqFcMUtjvhZoZRtpEGQAdULYiy6rcGiXAbLU7e9LSpIYlRqpLa207oMNfgbzlL2PnHko+eVg8rajDiSOYCg==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/util-locate-window@3.965.2':
+ resolution: {integrity: sha512-qKgO7wAYsXzhwCHhdbaKFyxd83Fgs8/1Ka+jjSPrv2Ll7mB55Wbwlo0kkfMLh993/yEc8aoDIAc1Fz9h4Spi4Q==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/util-user-agent-browser@3.969.0':
+ resolution: {integrity: sha512-bpJGjuKmFr0rA6UKUCmN8D19HQFMLXMx5hKBXqBlPFdalMhxJSjcxzX9DbQh0Fn6bJtxCguFmRGOBdQqNOt49g==}
+
+ '@aws-sdk/util-user-agent-node@3.971.0':
+ resolution: {integrity: sha512-Eygjo9mFzQYjbGY3MYO6CsIhnTwAMd3WmuFalCykqEmj2r5zf0leWrhPaqvA5P68V5JdGfPYgj7vhNOd6CtRBQ==}
+ engines: {node: '>=20.0.0'}
+ peerDependencies:
+ aws-crt: '>=1.0.0'
+ peerDependenciesMeta:
+ aws-crt:
+ optional: true
+
+ '@aws-sdk/xml-builder@3.969.0':
+ resolution: {integrity: sha512-BSe4Lx/qdRQQdX8cSSI7Et20vqBspzAjBy8ZmXVoyLkol3y4sXBXzn+BiLtR+oh60ExQn6o2DU4QjdOZbXaKIQ==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws/lambda-invoke-store@0.2.3':
+ resolution: {integrity: sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw==}
+ engines: {node: '>=18.0.0'}
+
'@babel/code-frame@7.27.1':
resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
engines: {node: '>=6.9.0'}
@@ -401,6 +585,9 @@ packages:
resolution: {integrity: sha512-nt88P6m20AaVbqMxsyPf8KqyWPaFEW2UANi0ijBxc2xTkD2KiUovxfZUYW6NMU9XBYZlovT5LztkEhst2yBcSA==}
engines: {node: '>=20'}
+ '@emnapi/runtime@1.8.1':
+ resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==}
+
'@emotion/hash@0.9.2':
resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==}
@@ -759,6 +946,143 @@ packages:
'@iconify/utils@3.1.0':
resolution: {integrity: sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==}
+ '@img/colour@1.0.0':
+ resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==}
+ engines: {node: '>=18'}
+
+ '@img/sharp-darwin-arm64@0.34.5':
+ resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@img/sharp-darwin-x64@0.34.5':
+ resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [darwin]
+
+ '@img/sharp-libvips-darwin-arm64@1.2.4':
+ resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@img/sharp-libvips-darwin-x64@1.2.4':
+ resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@img/sharp-libvips-linux-arm64@1.2.4':
+ resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-arm@1.2.4':
+ resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==}
+ cpu: [arm]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-ppc64@1.2.4':
+ resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-riscv64@1.2.4':
+ resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-s390x@1.2.4':
+ resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==}
+ cpu: [s390x]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-x64@1.2.4':
+ resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-libvips-linuxmusl-arm64@1.2.4':
+ resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-libvips-linuxmusl-x64@1.2.4':
+ resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-linux-arm64@0.34.5':
+ resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-linux-arm@0.34.5':
+ resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm]
+ os: [linux]
+
+ '@img/sharp-linux-ppc64@0.34.5':
+ resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@img/sharp-linux-riscv64@0.34.5':
+ resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@img/sharp-linux-s390x@0.34.5':
+ resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [s390x]
+ os: [linux]
+
+ '@img/sharp-linux-x64@0.34.5':
+ resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-linuxmusl-arm64@0.34.5':
+ resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-linuxmusl-x64@0.34.5':
+ resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-wasm32@0.34.5':
+ resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [wasm32]
+
+ '@img/sharp-win32-arm64@0.34.5':
+ resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [win32]
+
+ '@img/sharp-win32-ia32@0.34.5':
+ resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [ia32]
+ os: [win32]
+
+ '@img/sharp-win32-x64@0.34.5':
+ resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [win32]
+
'@jridgewell/gen-mapping@0.3.13':
resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
@@ -1681,6 +2005,222 @@ packages:
'@shikijs/vscode-textmate@10.0.2':
resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==}
+ '@smithy/abort-controller@4.2.8':
+ resolution: {integrity: sha512-peuVfkYHAmS5ybKxWcfraK7WBBP0J+rkfUcbHJJKQ4ir3UAUNQI+Y4Vt/PqSzGqgloJ5O1dk7+WzNL8wcCSXbw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/chunked-blob-reader-native@4.2.1':
+ resolution: {integrity: sha512-lX9Ay+6LisTfpLid2zZtIhSEjHMZoAR5hHCR4H7tBz/Zkfr5ea8RcQ7Tk4mi0P76p4cN+Btz16Ffno7YHpKXnQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/chunked-blob-reader@5.2.0':
+ resolution: {integrity: sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/config-resolver@4.4.6':
+ resolution: {integrity: sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/core@3.20.7':
+ resolution: {integrity: sha512-aO7jmh3CtrmPsIJxUwYIzI5WVlMK8BMCPQ4D4nTzqTqBhbzvxHNzBMGcEg13yg/z9R2Qsz49NUFl0F0lVbTVFw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/credential-provider-imds@4.2.8':
+ resolution: {integrity: sha512-FNT0xHS1c/CPN8upqbMFP83+ul5YgdisfCfkZ86Jh2NSmnqw/AJ6x5pEogVCTVvSm7j9MopRU89bmDelxuDMYw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/eventstream-codec@4.2.8':
+ resolution: {integrity: sha512-jS/O5Q14UsufqoGhov7dHLOPCzkYJl9QDzusI2Psh4wyYx/izhzvX9P4D69aTxcdfVhEPhjK+wYyn/PzLjKbbw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/eventstream-serde-browser@4.2.8':
+ resolution: {integrity: sha512-MTfQT/CRQz5g24ayXdjg53V0mhucZth4PESoA5IhvaWVDTOQLfo8qI9vzqHcPsdd2v6sqfTYqF5L/l+pea5Uyw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/eventstream-serde-config-resolver@4.3.8':
+ resolution: {integrity: sha512-ah12+luBiDGzBruhu3efNy1IlbwSEdNiw8fOZksoKoWW1ZHvO/04MQsdnws/9Aj+5b0YXSSN2JXKy/ClIsW8MQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/eventstream-serde-node@4.2.8':
+ resolution: {integrity: sha512-cYpCpp29z6EJHa5T9WL0KAlq3SOKUQkcgSoeRfRVwjGgSFl7Uh32eYGt7IDYCX20skiEdRffyDpvF2efEZPC0A==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/eventstream-serde-universal@4.2.8':
+ resolution: {integrity: sha512-iJ6YNJd0bntJYnX6s52NC4WFYcZeKrPUr1Kmmr5AwZcwCSzVpS7oavAmxMR7pMq7V+D1G4s9F5NJK0xwOsKAlQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/fetch-http-handler@5.3.9':
+ resolution: {integrity: sha512-I4UhmcTYXBrct03rwzQX1Y/iqQlzVQaPxWjCjula++5EmWq9YGBrx6bbGqluGc1f0XEfhSkiY4jhLgbsJUMKRA==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/hash-blob-browser@4.2.9':
+ resolution: {integrity: sha512-m80d/iicI7DlBDxyQP6Th7BW/ejDGiF0bgI754+tiwK0lgMkcaIBgvwwVc7OFbY4eUzpGtnig52MhPAEJ7iNYg==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/hash-node@4.2.8':
+ resolution: {integrity: sha512-7ZIlPbmaDGxVoxErDZnuFG18WekhbA/g2/i97wGj+wUBeS6pcUeAym8u4BXh/75RXWhgIJhyC11hBzig6MljwA==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/hash-stream-node@4.2.8':
+ resolution: {integrity: sha512-v0FLTXgHrTeheYZFGhR+ehX5qUm4IQsjAiL9qehad2cyjMWcN2QG6/4mSwbSgEQzI7jwfoXj7z4fxZUx/Mhj2w==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/invalid-dependency@4.2.8':
+ resolution: {integrity: sha512-N9iozRybwAQ2dn9Fot9kI6/w9vos2oTXLhtK7ovGqwZjlOcxu6XhPlpLpC+INsxktqHinn5gS2DXDjDF2kG5sQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/is-array-buffer@2.2.0':
+ resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/is-array-buffer@4.2.0':
+ resolution: {integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/md5-js@4.2.8':
+ resolution: {integrity: sha512-oGMaLj4tVZzLi3itBa9TCswgMBr7k9b+qKYowQ6x1rTyTuO1IU2YHdHUa+891OsOH+wCsH7aTPRsTJO3RMQmjQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/middleware-content-length@4.2.8':
+ resolution: {integrity: sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/middleware-endpoint@4.4.8':
+ resolution: {integrity: sha512-TV44qwB/T0OMMzjIuI+JeS0ort3bvlPJ8XIH0MSlGADraXpZqmyND27ueuAL3E14optleADWqtd7dUgc2w+qhQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/middleware-retry@4.4.24':
+ resolution: {integrity: sha512-yiUY1UvnbUFfP5izoKLtfxDSTRv724YRRwyiC/5HYY6vdsVDcDOXKSXmkJl/Hovcxt5r+8tZEUAdrOaCJwrl9Q==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/middleware-serde@4.2.9':
+ resolution: {integrity: sha512-eMNiej0u/snzDvlqRGSN3Vl0ESn3838+nKyVfF2FKNXFbi4SERYT6PR392D39iczngbqqGG0Jl1DlCnp7tBbXQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/middleware-stack@4.2.8':
+ resolution: {integrity: sha512-w6LCfOviTYQjBctOKSwy6A8FIkQy7ICvglrZFl6Bw4FmcQ1Z420fUtIhxaUZZshRe0VCq4kvDiPiXrPZAe8oRA==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/node-config-provider@4.3.8':
+ resolution: {integrity: sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/node-http-handler@4.4.8':
+ resolution: {integrity: sha512-q9u+MSbJVIJ1QmJ4+1u+cERXkrhuILCBDsJUBAW1MPE6sFonbCNaegFuwW9ll8kh5UdyY3jOkoOGlc7BesoLpg==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/property-provider@4.2.8':
+ resolution: {integrity: sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/protocol-http@5.3.8':
+ resolution: {integrity: sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/querystring-builder@4.2.8':
+ resolution: {integrity: sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/querystring-parser@4.2.8':
+ resolution: {integrity: sha512-vUurovluVy50CUlazOiXkPq40KGvGWSdmusa3130MwrR1UNnNgKAlj58wlOe61XSHRpUfIIh6cE0zZ8mzKaDPA==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/service-error-classification@4.2.8':
+ resolution: {integrity: sha512-mZ5xddodpJhEt3RkCjbmUQuXUOaPNTkbMGR0bcS8FE0bJDLMZlhmpgrvPNCYglVw5rsYTpSnv19womw9WWXKQQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/shared-ini-file-loader@4.4.3':
+ resolution: {integrity: sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/signature-v4@5.3.8':
+ resolution: {integrity: sha512-6A4vdGj7qKNRF16UIcO8HhHjKW27thsxYci+5r/uVRkdcBEkOEiY8OMPuydLX4QHSrJqGHPJzPRwwVTqbLZJhg==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/smithy-client@4.10.9':
+ resolution: {integrity: sha512-Je0EvGXVJ0Vrrr2lsubq43JGRIluJ/hX17aN/W/A0WfE+JpoMdI8kwk2t9F0zTX9232sJDGcoH4zZre6m6f/sg==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/types@4.12.0':
+ resolution: {integrity: sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/url-parser@4.2.8':
+ resolution: {integrity: sha512-NQho9U68TGMEU639YkXnVMV3GEFFULmmaWdlu1E9qzyIePOHsoSnagTGSDv1Zi8DCNN6btxOSdgmy5E/hsZwhA==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-base64@4.3.0':
+ resolution: {integrity: sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-body-length-browser@4.2.0':
+ resolution: {integrity: sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-body-length-node@4.2.1':
+ resolution: {integrity: sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-buffer-from@2.2.0':
+ resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/util-buffer-from@4.2.0':
+ resolution: {integrity: sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-config-provider@4.2.0':
+ resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-defaults-mode-browser@4.3.23':
+ resolution: {integrity: sha512-mMg+r/qDfjfF/0psMbV4zd7F/i+rpyp7Hjh0Wry7eY15UnzTEId+xmQTGDU8IdZtDfbGQxuWNfgBZKBj+WuYbA==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-defaults-mode-node@4.2.26':
+ resolution: {integrity: sha512-EQqe/WkbCinah0h1lMWh9ICl0Ob4lyl20/10WTB35SC9vDQfD8zWsOT+x2FIOXKAoZQ8z/y0EFMoodbcqWJY/w==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-endpoints@3.2.8':
+ resolution: {integrity: sha512-8JaVTn3pBDkhZgHQ8R0epwWt+BqPSLCjdjXXusK1onwJlRuN69fbvSK66aIKKO7SwVFM6x2J2ox5X8pOaWcUEw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-hex-encoding@4.2.0':
+ resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-middleware@4.2.8':
+ resolution: {integrity: sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-retry@4.2.8':
+ resolution: {integrity: sha512-CfJqwvoRY0kTGe5AkQokpURNCT1u/MkRzMTASWMPPo2hNSnKtF1D45dQl3DE2LKLr4m+PW9mCeBMJr5mCAVThg==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-stream@4.5.10':
+ resolution: {integrity: sha512-jbqemy51UFSZSp2y0ZmRfckmrzuKww95zT9BYMmuJ8v3altGcqjwoV1tzpOwuHaKrwQrCjIzOib499ymr2f98g==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-uri-escape@4.2.0':
+ resolution: {integrity: sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-utf8@2.3.0':
+ resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/util-utf8@4.2.0':
+ resolution: {integrity: sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-waiter@4.2.8':
+ resolution: {integrity: sha512-n+lahlMWk+aejGuax7DPWtqav8HYnWxQwR+LCG2BgCUmaGcTe9qZCFsmw8TMg9iG75HOwhrJCX9TCJRLH+Yzqg==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/uuid@1.1.0':
+ resolution: {integrity: sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==}
+ engines: {node: '>=18.0.0'}
+
'@standard-schema/spec@1.0.0':
resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==}
@@ -2013,6 +2553,9 @@ packages:
async@3.2.6:
resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==}
+ asynckit@0.4.0:
+ resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+
autoprefixer@10.4.22:
resolution: {integrity: sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg==}
engines: {node: ^10 || ^12 || >=14}
@@ -2020,6 +2563,9 @@ packages:
peerDependencies:
postcss: ^8.1.0
+ axios@1.13.2:
+ resolution: {integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==}
+
bail@2.0.2:
resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
@@ -2055,6 +2601,9 @@ packages:
boolbase@1.0.0:
resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+ bowser@2.13.1:
+ resolution: {integrity: sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw==}
+
brace-expansion@1.1.12:
resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==}
@@ -2073,6 +2622,9 @@ packages:
resolution: {integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==}
engines: {node: '>=0.10'}
+ buffer@5.6.0:
+ resolution: {integrity: sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==}
+
buffer@5.7.1:
resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
@@ -2091,6 +2643,10 @@ packages:
resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
engines: {node: '>=8'}
+ call-bind-apply-helpers@1.0.2:
+ resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
+ engines: {node: '>= 0.4'}
+
callsites@3.1.0:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'}
@@ -2154,6 +2710,10 @@ packages:
collapse-white-space@2.1.0:
resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==}
+ combined-stream@1.0.8:
+ resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+ engines: {node: '>= 0.8'}
+
comma-separated-tokens@2.0.3:
resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
@@ -2479,6 +3039,10 @@ packages:
delaunator@5.0.1:
resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==}
+ delayed-stream@1.0.0:
+ resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+ engines: {node: '>=0.4.0'}
+
depd@2.0.0:
resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
engines: {node: '>= 0.8'}
@@ -2512,6 +3076,10 @@ packages:
dompurify@3.3.0:
resolution: {integrity: sha512-r+f6MYR1gGN1eJv0TVQbhA7if/U7P87cdPl3HN5rikqaBSBxLiCb/b9O+2eG0cxz0ghyU+mU1QkbsOwERMYlWQ==}
+ dunder-proto@1.0.1:
+ resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
+ engines: {node: '>= 0.4'}
+
duplexer2@0.1.4:
resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==}
@@ -2553,9 +3121,25 @@ packages:
resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ es-define-property@1.0.1:
+ resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
+ engines: {node: '>= 0.4'}
+
+ es-errors@1.3.0:
+ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+ engines: {node: '>= 0.4'}
+
es-module-lexer@1.7.0:
resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==}
+ es-object-atoms@1.1.1:
+ resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
+ engines: {node: '>= 0.4'}
+
+ es-set-tostringtag@2.1.0:
+ resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
+ engines: {node: '>= 0.4'}
+
esast-util-from-estree@2.0.0:
resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==}
@@ -2623,6 +3207,10 @@ packages:
resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==}
engines: {node: '>= 0.8'}
+ events@3.3.0:
+ resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
+ engines: {node: '>=0.8.x'}
+
exceljs@4.4.0:
resolution: {integrity: sha512-XctvKaEMaj1Ii9oDOqbW/6e1gXknSY4g/aLCDicOXqBE4M0nRWkUu0PTp++UPNzoFY12BNHMfs/VadKIS6llvg==}
engines: {node: '>=8.3.0'}
@@ -2654,6 +3242,10 @@ packages:
fast-json-stable-stringify@2.1.0:
resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+ fast-xml-parser@5.2.5:
+ resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==}
+ hasBin: true
+
fault@2.0.1:
resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==}
@@ -2680,6 +3272,19 @@ packages:
flatted@3.3.3:
resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==}
+ follow-redirects@1.15.11:
+ resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==}
+ engines: {node: '>=4.0'}
+ peerDependencies:
+ debug: '*'
+ peerDependenciesMeta:
+ debug:
+ optional: true
+
+ form-data@4.0.5:
+ resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==}
+ engines: {node: '>= 6'}
+
format@0.2.2:
resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==}
engines: {node: '>=0.4.x'}
@@ -2720,6 +3325,9 @@ packages:
engines: {node: '>=0.6'}
deprecated: This package is no longer supported.
+ function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
gensequence@8.0.8:
resolution: {integrity: sha512-omMVniXEXpdx/vKxGnPRoO2394Otlze28TyxECbFVyoSpZ9H3EO7lemjcB12OpQJzRW4e5tt/dL1rOxry6aMHg==}
engines: {node: '>=20'}
@@ -2728,10 +3336,18 @@ packages:
resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
engines: {node: '>=6.9.0'}
+ get-intrinsic@1.3.0:
+ resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
+ engines: {node: '>= 0.4'}
+
get-nonce@1.0.1:
resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
engines: {node: '>=6'}
+ get-proto@1.0.1:
+ resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
+ engines: {node: '>= 0.4'}
+
get-stream@5.2.0:
resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
engines: {node: '>=8'}
@@ -2751,6 +3367,10 @@ packages:
resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==}
engines: {node: '>=18'}
+ gopd@1.2.0:
+ resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
+ engines: {node: '>= 0.4'}
+
graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
@@ -2761,6 +3381,18 @@ packages:
hachure-fill@0.5.2:
resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==}
+ has-symbols@1.1.0:
+ resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
+ engines: {node: '>= 0.4'}
+
+ has-tostringtag@1.0.2:
+ resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
+ engines: {node: '>= 0.4'}
+
+ hasown@2.0.2:
+ resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+ engines: {node: '>= 0.4'}
+
hast-util-classnames@3.0.0:
resolution: {integrity: sha512-tI3JjoGDEBVorMAWK4jNRsfLMYmih1BUOG3VV36pH36njs1IEl7xkNrVTD2mD2yYHmQCa5R/fj61a8IAF4bRaQ==}
@@ -3120,6 +3752,10 @@ packages:
engines: {node: '>= 20'}
hasBin: true
+ math-intrinsics@1.1.0:
+ resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
+ engines: {node: '>= 0.4'}
+
mdast-util-directive@3.1.0:
resolution: {integrity: sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==}
@@ -3302,10 +3938,18 @@ packages:
micromark@4.0.2:
resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==}
+ mime-db@1.52.0:
+ resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+ engines: {node: '>= 0.6'}
+
mime-db@1.54.0:
resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==}
engines: {node: '>= 0.6'}
+ mime-types@2.1.35:
+ resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+ engines: {node: '>= 0.6'}
+
mime@1.6.0:
resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
engines: {node: '>=4'}
@@ -3529,6 +4173,9 @@ packages:
property-information@7.1.0:
resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==}
+ proxy-from-env@1.1.0:
+ resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
+
pump@3.0.3:
resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==}
@@ -3775,6 +4422,10 @@ packages:
setprototypeof@1.2.0:
resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
+ sharp@0.34.5:
+ resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+
shebang-command@2.0.0:
resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
engines: {node: '>=8'}
@@ -3818,6 +4469,9 @@ packages:
resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ stream-browserify@3.0.0:
+ resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==}
+
string-width@6.1.0:
resolution: {integrity: sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==}
engines: {node: '>=16'}
@@ -3843,6 +4497,9 @@ packages:
resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
engines: {node: '>=6'}
+ strnum@2.1.2:
+ resolution: {integrity: sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==}
+
style-to-js@1.1.21:
resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==}
@@ -4010,6 +4667,10 @@ packages:
resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==}
hasBin: true
+ uuid@13.0.0:
+ resolution: {integrity: sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==}
+ hasBin: true
+
uuid@8.3.2:
resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
hasBin: true
@@ -4161,10 +4822,506 @@ snapshots:
package-manager-detector: 1.6.0
tinyexec: 1.0.2
- '@babel/code-frame@7.27.1':
+ '@aws-crypto/crc32@5.2.0':
dependencies:
- '@babel/helper-validator-identifier': 7.28.5
- js-tokens: 4.0.0
+ '@aws-crypto/util': 5.2.0
+ '@aws-sdk/types': 3.969.0
+ tslib: 2.8.1
+
+ '@aws-crypto/crc32c@5.2.0':
+ dependencies:
+ '@aws-crypto/util': 5.2.0
+ '@aws-sdk/types': 3.969.0
+ tslib: 2.8.1
+
+ '@aws-crypto/sha1-browser@5.2.0':
+ dependencies:
+ '@aws-crypto/supports-web-crypto': 5.2.0
+ '@aws-crypto/util': 5.2.0
+ '@aws-sdk/types': 3.969.0
+ '@aws-sdk/util-locate-window': 3.965.2
+ '@smithy/util-utf8': 2.3.0
+ tslib: 2.8.1
+
+ '@aws-crypto/sha256-browser@5.2.0':
+ dependencies:
+ '@aws-crypto/sha256-js': 5.2.0
+ '@aws-crypto/supports-web-crypto': 5.2.0
+ '@aws-crypto/util': 5.2.0
+ '@aws-sdk/types': 3.969.0
+ '@aws-sdk/util-locate-window': 3.965.2
+ '@smithy/util-utf8': 2.3.0
+ tslib: 2.8.1
+
+ '@aws-crypto/sha256-js@5.2.0':
+ dependencies:
+ '@aws-crypto/util': 5.2.0
+ '@aws-sdk/types': 3.969.0
+ tslib: 2.8.1
+
+ '@aws-crypto/supports-web-crypto@5.2.0':
+ dependencies:
+ tslib: 2.8.1
+
+ '@aws-crypto/util@5.2.0':
+ dependencies:
+ '@aws-sdk/types': 3.969.0
+ '@smithy/util-utf8': 2.3.0
+ tslib: 2.8.1
+
+ '@aws-sdk/client-s3@3.971.0':
+ dependencies:
+ '@aws-crypto/sha1-browser': 5.2.0
+ '@aws-crypto/sha256-browser': 5.2.0
+ '@aws-crypto/sha256-js': 5.2.0
+ '@aws-sdk/core': 3.970.0
+ '@aws-sdk/credential-provider-node': 3.971.0
+ '@aws-sdk/middleware-bucket-endpoint': 3.969.0
+ '@aws-sdk/middleware-expect-continue': 3.969.0
+ '@aws-sdk/middleware-flexible-checksums': 3.971.0
+ '@aws-sdk/middleware-host-header': 3.969.0
+ '@aws-sdk/middleware-location-constraint': 3.969.0
+ '@aws-sdk/middleware-logger': 3.969.0
+ '@aws-sdk/middleware-recursion-detection': 3.969.0
+ '@aws-sdk/middleware-sdk-s3': 3.970.0
+ '@aws-sdk/middleware-ssec': 3.971.0
+ '@aws-sdk/middleware-user-agent': 3.970.0
+ '@aws-sdk/region-config-resolver': 3.969.0
+ '@aws-sdk/signature-v4-multi-region': 3.970.0
+ '@aws-sdk/types': 3.969.0
+ '@aws-sdk/util-endpoints': 3.970.0
+ '@aws-sdk/util-user-agent-browser': 3.969.0
+ '@aws-sdk/util-user-agent-node': 3.971.0
+ '@smithy/config-resolver': 4.4.6
+ '@smithy/core': 3.20.7
+ '@smithy/eventstream-serde-browser': 4.2.8
+ '@smithy/eventstream-serde-config-resolver': 4.3.8
+ '@smithy/eventstream-serde-node': 4.2.8
+ '@smithy/fetch-http-handler': 5.3.9
+ '@smithy/hash-blob-browser': 4.2.9
+ '@smithy/hash-node': 4.2.8
+ '@smithy/hash-stream-node': 4.2.8
+ '@smithy/invalid-dependency': 4.2.8
+ '@smithy/md5-js': 4.2.8
+ '@smithy/middleware-content-length': 4.2.8
+ '@smithy/middleware-endpoint': 4.4.8
+ '@smithy/middleware-retry': 4.4.24
+ '@smithy/middleware-serde': 4.2.9
+ '@smithy/middleware-stack': 4.2.8
+ '@smithy/node-config-provider': 4.3.8
+ '@smithy/node-http-handler': 4.4.8
+ '@smithy/protocol-http': 5.3.8
+ '@smithy/smithy-client': 4.10.9
+ '@smithy/types': 4.12.0
+ '@smithy/url-parser': 4.2.8
+ '@smithy/util-base64': 4.3.0
+ '@smithy/util-body-length-browser': 4.2.0
+ '@smithy/util-body-length-node': 4.2.1
+ '@smithy/util-defaults-mode-browser': 4.3.23
+ '@smithy/util-defaults-mode-node': 4.2.26
+ '@smithy/util-endpoints': 3.2.8
+ '@smithy/util-middleware': 4.2.8
+ '@smithy/util-retry': 4.2.8
+ '@smithy/util-stream': 4.5.10
+ '@smithy/util-utf8': 4.2.0
+ '@smithy/util-waiter': 4.2.8
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+
+ '@aws-sdk/client-sso@3.971.0':
+ dependencies:
+ '@aws-crypto/sha256-browser': 5.2.0
+ '@aws-crypto/sha256-js': 5.2.0
+ '@aws-sdk/core': 3.970.0
+ '@aws-sdk/middleware-host-header': 3.969.0
+ '@aws-sdk/middleware-logger': 3.969.0
+ '@aws-sdk/middleware-recursion-detection': 3.969.0
+ '@aws-sdk/middleware-user-agent': 3.970.0
+ '@aws-sdk/region-config-resolver': 3.969.0
+ '@aws-sdk/types': 3.969.0
+ '@aws-sdk/util-endpoints': 3.970.0
+ '@aws-sdk/util-user-agent-browser': 3.969.0
+ '@aws-sdk/util-user-agent-node': 3.971.0
+ '@smithy/config-resolver': 4.4.6
+ '@smithy/core': 3.20.7
+ '@smithy/fetch-http-handler': 5.3.9
+ '@smithy/hash-node': 4.2.8
+ '@smithy/invalid-dependency': 4.2.8
+ '@smithy/middleware-content-length': 4.2.8
+ '@smithy/middleware-endpoint': 4.4.8
+ '@smithy/middleware-retry': 4.4.24
+ '@smithy/middleware-serde': 4.2.9
+ '@smithy/middleware-stack': 4.2.8
+ '@smithy/node-config-provider': 4.3.8
+ '@smithy/node-http-handler': 4.4.8
+ '@smithy/protocol-http': 5.3.8
+ '@smithy/smithy-client': 4.10.9
+ '@smithy/types': 4.12.0
+ '@smithy/url-parser': 4.2.8
+ '@smithy/util-base64': 4.3.0
+ '@smithy/util-body-length-browser': 4.2.0
+ '@smithy/util-body-length-node': 4.2.1
+ '@smithy/util-defaults-mode-browser': 4.3.23
+ '@smithy/util-defaults-mode-node': 4.2.26
+ '@smithy/util-endpoints': 3.2.8
+ '@smithy/util-middleware': 4.2.8
+ '@smithy/util-retry': 4.2.8
+ '@smithy/util-utf8': 4.2.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+
+ '@aws-sdk/core@3.970.0':
+ dependencies:
+ '@aws-sdk/types': 3.969.0
+ '@aws-sdk/xml-builder': 3.969.0
+ '@smithy/core': 3.20.7
+ '@smithy/node-config-provider': 4.3.8
+ '@smithy/property-provider': 4.2.8
+ '@smithy/protocol-http': 5.3.8
+ '@smithy/signature-v4': 5.3.8
+ '@smithy/smithy-client': 4.10.9
+ '@smithy/types': 4.12.0
+ '@smithy/util-base64': 4.3.0
+ '@smithy/util-middleware': 4.2.8
+ '@smithy/util-utf8': 4.2.0
+ tslib: 2.8.1
+
+ '@aws-sdk/crc64-nvme@3.969.0':
+ dependencies:
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@aws-sdk/credential-provider-env@3.970.0':
+ dependencies:
+ '@aws-sdk/core': 3.970.0
+ '@aws-sdk/types': 3.969.0
+ '@smithy/property-provider': 4.2.8
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@aws-sdk/credential-provider-http@3.970.0':
+ dependencies:
+ '@aws-sdk/core': 3.970.0
+ '@aws-sdk/types': 3.969.0
+ '@smithy/fetch-http-handler': 5.3.9
+ '@smithy/node-http-handler': 4.4.8
+ '@smithy/property-provider': 4.2.8
+ '@smithy/protocol-http': 5.3.8
+ '@smithy/smithy-client': 4.10.9
+ '@smithy/types': 4.12.0
+ '@smithy/util-stream': 4.5.10
+ tslib: 2.8.1
+
+ '@aws-sdk/credential-provider-ini@3.971.0':
+ dependencies:
+ '@aws-sdk/core': 3.970.0
+ '@aws-sdk/credential-provider-env': 3.970.0
+ '@aws-sdk/credential-provider-http': 3.970.0
+ '@aws-sdk/credential-provider-login': 3.971.0
+ '@aws-sdk/credential-provider-process': 3.970.0
+ '@aws-sdk/credential-provider-sso': 3.971.0
+ '@aws-sdk/credential-provider-web-identity': 3.971.0
+ '@aws-sdk/nested-clients': 3.971.0
+ '@aws-sdk/types': 3.969.0
+ '@smithy/credential-provider-imds': 4.2.8
+ '@smithy/property-provider': 4.2.8
+ '@smithy/shared-ini-file-loader': 4.4.3
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+
+ '@aws-sdk/credential-provider-login@3.971.0':
+ dependencies:
+ '@aws-sdk/core': 3.970.0
+ '@aws-sdk/nested-clients': 3.971.0
+ '@aws-sdk/types': 3.969.0
+ '@smithy/property-provider': 4.2.8
+ '@smithy/protocol-http': 5.3.8
+ '@smithy/shared-ini-file-loader': 4.4.3
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+
+ '@aws-sdk/credential-provider-node@3.971.0':
+ dependencies:
+ '@aws-sdk/credential-provider-env': 3.970.0
+ '@aws-sdk/credential-provider-http': 3.970.0
+ '@aws-sdk/credential-provider-ini': 3.971.0
+ '@aws-sdk/credential-provider-process': 3.970.0
+ '@aws-sdk/credential-provider-sso': 3.971.0
+ '@aws-sdk/credential-provider-web-identity': 3.971.0
+ '@aws-sdk/types': 3.969.0
+ '@smithy/credential-provider-imds': 4.2.8
+ '@smithy/property-provider': 4.2.8
+ '@smithy/shared-ini-file-loader': 4.4.3
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+
+ '@aws-sdk/credential-provider-process@3.970.0':
+ dependencies:
+ '@aws-sdk/core': 3.970.0
+ '@aws-sdk/types': 3.969.0
+ '@smithy/property-provider': 4.2.8
+ '@smithy/shared-ini-file-loader': 4.4.3
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@aws-sdk/credential-provider-sso@3.971.0':
+ dependencies:
+ '@aws-sdk/client-sso': 3.971.0
+ '@aws-sdk/core': 3.970.0
+ '@aws-sdk/token-providers': 3.971.0
+ '@aws-sdk/types': 3.969.0
+ '@smithy/property-provider': 4.2.8
+ '@smithy/shared-ini-file-loader': 4.4.3
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+
+ '@aws-sdk/credential-provider-web-identity@3.971.0':
+ dependencies:
+ '@aws-sdk/core': 3.970.0
+ '@aws-sdk/nested-clients': 3.971.0
+ '@aws-sdk/types': 3.969.0
+ '@smithy/property-provider': 4.2.8
+ '@smithy/shared-ini-file-loader': 4.4.3
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+
+ '@aws-sdk/lib-storage@3.971.0(@aws-sdk/client-s3@3.971.0)':
+ dependencies:
+ '@aws-sdk/client-s3': 3.971.0
+ '@smithy/abort-controller': 4.2.8
+ '@smithy/middleware-endpoint': 4.4.8
+ '@smithy/smithy-client': 4.10.9
+ buffer: 5.6.0
+ events: 3.3.0
+ stream-browserify: 3.0.0
+ tslib: 2.8.1
+
+ '@aws-sdk/middleware-bucket-endpoint@3.969.0':
+ dependencies:
+ '@aws-sdk/types': 3.969.0
+ '@aws-sdk/util-arn-parser': 3.968.0
+ '@smithy/node-config-provider': 4.3.8
+ '@smithy/protocol-http': 5.3.8
+ '@smithy/types': 4.12.0
+ '@smithy/util-config-provider': 4.2.0
+ tslib: 2.8.1
+
+ '@aws-sdk/middleware-expect-continue@3.969.0':
+ dependencies:
+ '@aws-sdk/types': 3.969.0
+ '@smithy/protocol-http': 5.3.8
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@aws-sdk/middleware-flexible-checksums@3.971.0':
+ dependencies:
+ '@aws-crypto/crc32': 5.2.0
+ '@aws-crypto/crc32c': 5.2.0
+ '@aws-crypto/util': 5.2.0
+ '@aws-sdk/core': 3.970.0
+ '@aws-sdk/crc64-nvme': 3.969.0
+ '@aws-sdk/types': 3.969.0
+ '@smithy/is-array-buffer': 4.2.0
+ '@smithy/node-config-provider': 4.3.8
+ '@smithy/protocol-http': 5.3.8
+ '@smithy/types': 4.12.0
+ '@smithy/util-middleware': 4.2.8
+ '@smithy/util-stream': 4.5.10
+ '@smithy/util-utf8': 4.2.0
+ tslib: 2.8.1
+
+ '@aws-sdk/middleware-host-header@3.969.0':
+ dependencies:
+ '@aws-sdk/types': 3.969.0
+ '@smithy/protocol-http': 5.3.8
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@aws-sdk/middleware-location-constraint@3.969.0':
+ dependencies:
+ '@aws-sdk/types': 3.969.0
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@aws-sdk/middleware-logger@3.969.0':
+ dependencies:
+ '@aws-sdk/types': 3.969.0
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@aws-sdk/middleware-recursion-detection@3.969.0':
+ dependencies:
+ '@aws-sdk/types': 3.969.0
+ '@aws/lambda-invoke-store': 0.2.3
+ '@smithy/protocol-http': 5.3.8
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@aws-sdk/middleware-sdk-s3@3.970.0':
+ dependencies:
+ '@aws-sdk/core': 3.970.0
+ '@aws-sdk/types': 3.969.0
+ '@aws-sdk/util-arn-parser': 3.968.0
+ '@smithy/core': 3.20.7
+ '@smithy/node-config-provider': 4.3.8
+ '@smithy/protocol-http': 5.3.8
+ '@smithy/signature-v4': 5.3.8
+ '@smithy/smithy-client': 4.10.9
+ '@smithy/types': 4.12.0
+ '@smithy/util-config-provider': 4.2.0
+ '@smithy/util-middleware': 4.2.8
+ '@smithy/util-stream': 4.5.10
+ '@smithy/util-utf8': 4.2.0
+ tslib: 2.8.1
+
+ '@aws-sdk/middleware-ssec@3.971.0':
+ dependencies:
+ '@aws-sdk/types': 3.969.0
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@aws-sdk/middleware-user-agent@3.970.0':
+ dependencies:
+ '@aws-sdk/core': 3.970.0
+ '@aws-sdk/types': 3.969.0
+ '@aws-sdk/util-endpoints': 3.970.0
+ '@smithy/core': 3.20.7
+ '@smithy/protocol-http': 5.3.8
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@aws-sdk/nested-clients@3.971.0':
+ dependencies:
+ '@aws-crypto/sha256-browser': 5.2.0
+ '@aws-crypto/sha256-js': 5.2.0
+ '@aws-sdk/core': 3.970.0
+ '@aws-sdk/middleware-host-header': 3.969.0
+ '@aws-sdk/middleware-logger': 3.969.0
+ '@aws-sdk/middleware-recursion-detection': 3.969.0
+ '@aws-sdk/middleware-user-agent': 3.970.0
+ '@aws-sdk/region-config-resolver': 3.969.0
+ '@aws-sdk/types': 3.969.0
+ '@aws-sdk/util-endpoints': 3.970.0
+ '@aws-sdk/util-user-agent-browser': 3.969.0
+ '@aws-sdk/util-user-agent-node': 3.971.0
+ '@smithy/config-resolver': 4.4.6
+ '@smithy/core': 3.20.7
+ '@smithy/fetch-http-handler': 5.3.9
+ '@smithy/hash-node': 4.2.8
+ '@smithy/invalid-dependency': 4.2.8
+ '@smithy/middleware-content-length': 4.2.8
+ '@smithy/middleware-endpoint': 4.4.8
+ '@smithy/middleware-retry': 4.4.24
+ '@smithy/middleware-serde': 4.2.9
+ '@smithy/middleware-stack': 4.2.8
+ '@smithy/node-config-provider': 4.3.8
+ '@smithy/node-http-handler': 4.4.8
+ '@smithy/protocol-http': 5.3.8
+ '@smithy/smithy-client': 4.10.9
+ '@smithy/types': 4.12.0
+ '@smithy/url-parser': 4.2.8
+ '@smithy/util-base64': 4.3.0
+ '@smithy/util-body-length-browser': 4.2.0
+ '@smithy/util-body-length-node': 4.2.1
+ '@smithy/util-defaults-mode-browser': 4.3.23
+ '@smithy/util-defaults-mode-node': 4.2.26
+ '@smithy/util-endpoints': 3.2.8
+ '@smithy/util-middleware': 4.2.8
+ '@smithy/util-retry': 4.2.8
+ '@smithy/util-utf8': 4.2.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+
+ '@aws-sdk/region-config-resolver@3.969.0':
+ dependencies:
+ '@aws-sdk/types': 3.969.0
+ '@smithy/config-resolver': 4.4.6
+ '@smithy/node-config-provider': 4.3.8
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@aws-sdk/signature-v4-multi-region@3.970.0':
+ dependencies:
+ '@aws-sdk/middleware-sdk-s3': 3.970.0
+ '@aws-sdk/types': 3.969.0
+ '@smithy/protocol-http': 5.3.8
+ '@smithy/signature-v4': 5.3.8
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@aws-sdk/token-providers@3.971.0':
+ dependencies:
+ '@aws-sdk/core': 3.970.0
+ '@aws-sdk/nested-clients': 3.971.0
+ '@aws-sdk/types': 3.969.0
+ '@smithy/property-provider': 4.2.8
+ '@smithy/shared-ini-file-loader': 4.4.3
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+
+ '@aws-sdk/types@3.969.0':
+ dependencies:
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@aws-sdk/util-arn-parser@3.968.0':
+ dependencies:
+ tslib: 2.8.1
+
+ '@aws-sdk/util-endpoints@3.970.0':
+ dependencies:
+ '@aws-sdk/types': 3.969.0
+ '@smithy/types': 4.12.0
+ '@smithy/url-parser': 4.2.8
+ '@smithy/util-endpoints': 3.2.8
+ tslib: 2.8.1
+
+ '@aws-sdk/util-locate-window@3.965.2':
+ dependencies:
+ tslib: 2.8.1
+
+ '@aws-sdk/util-user-agent-browser@3.969.0':
+ dependencies:
+ '@aws-sdk/types': 3.969.0
+ '@smithy/types': 4.12.0
+ bowser: 2.13.1
+ tslib: 2.8.1
+
+ '@aws-sdk/util-user-agent-node@3.971.0':
+ dependencies:
+ '@aws-sdk/middleware-user-agent': 3.970.0
+ '@aws-sdk/types': 3.969.0
+ '@smithy/node-config-provider': 4.3.8
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@aws-sdk/xml-builder@3.969.0':
+ dependencies:
+ '@smithy/types': 4.12.0
+ fast-xml-parser: 5.2.5
+ tslib: 2.8.1
+
+ '@aws/lambda-invoke-store@0.2.3': {}
+
+ '@babel/code-frame@7.27.1':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.28.5
+ js-tokens: 4.0.0
picocolors: 1.1.1
'@babel/compat-data@7.28.5': {}
@@ -4524,6 +5681,11 @@ snapshots:
'@cspell/url@9.4.0': {}
+ '@emnapi/runtime@1.8.1':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
'@emotion/hash@0.9.2': {}
'@esbuild/aix-ppc64@0.25.12':
@@ -4740,6 +5902,102 @@ snapshots:
'@iconify/types': 2.0.0
mlly: 1.8.0
+ '@img/colour@1.0.0': {}
+
+ '@img/sharp-darwin-arm64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-arm64': 1.2.4
+ optional: true
+
+ '@img/sharp-darwin-x64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-x64': 1.2.4
+ optional: true
+
+ '@img/sharp-libvips-darwin-arm64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-darwin-x64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-ppc64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-riscv64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-s390x@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-x64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linuxmusl-arm64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linuxmusl-x64@1.2.4':
+ optional: true
+
+ '@img/sharp-linux-arm64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm64': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-arm@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-ppc64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-ppc64': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-riscv64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-riscv64': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-s390x@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-s390x': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-x64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-x64': 1.2.4
+ optional: true
+
+ '@img/sharp-linuxmusl-arm64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-arm64': 1.2.4
+ optional: true
+
+ '@img/sharp-linuxmusl-x64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-x64': 1.2.4
+ optional: true
+
+ '@img/sharp-wasm32@0.34.5':
+ dependencies:
+ '@emnapi/runtime': 1.8.1
+ optional: true
+
+ '@img/sharp-win32-arm64@0.34.5':
+ optional: true
+
+ '@img/sharp-win32-ia32@0.34.5':
+ optional: true
+
+ '@img/sharp-win32-x64@0.34.5':
+ optional: true
+
'@jridgewell/gen-mapping@0.3.13':
dependencies:
'@jridgewell/sourcemap-codec': 1.5.5
@@ -5723,6 +6981,344 @@ snapshots:
'@shikijs/vscode-textmate@10.0.2': {}
+ '@smithy/abort-controller@4.2.8':
+ dependencies:
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@smithy/chunked-blob-reader-native@4.2.1':
+ dependencies:
+ '@smithy/util-base64': 4.3.0
+ tslib: 2.8.1
+
+ '@smithy/chunked-blob-reader@5.2.0':
+ dependencies:
+ tslib: 2.8.1
+
+ '@smithy/config-resolver@4.4.6':
+ dependencies:
+ '@smithy/node-config-provider': 4.3.8
+ '@smithy/types': 4.12.0
+ '@smithy/util-config-provider': 4.2.0
+ '@smithy/util-endpoints': 3.2.8
+ '@smithy/util-middleware': 4.2.8
+ tslib: 2.8.1
+
+ '@smithy/core@3.20.7':
+ dependencies:
+ '@smithy/middleware-serde': 4.2.9
+ '@smithy/protocol-http': 5.3.8
+ '@smithy/types': 4.12.0
+ '@smithy/util-base64': 4.3.0
+ '@smithy/util-body-length-browser': 4.2.0
+ '@smithy/util-middleware': 4.2.8
+ '@smithy/util-stream': 4.5.10
+ '@smithy/util-utf8': 4.2.0
+ '@smithy/uuid': 1.1.0
+ tslib: 2.8.1
+
+ '@smithy/credential-provider-imds@4.2.8':
+ dependencies:
+ '@smithy/node-config-provider': 4.3.8
+ '@smithy/property-provider': 4.2.8
+ '@smithy/types': 4.12.0
+ '@smithy/url-parser': 4.2.8
+ tslib: 2.8.1
+
+ '@smithy/eventstream-codec@4.2.8':
+ dependencies:
+ '@aws-crypto/crc32': 5.2.0
+ '@smithy/types': 4.12.0
+ '@smithy/util-hex-encoding': 4.2.0
+ tslib: 2.8.1
+
+ '@smithy/eventstream-serde-browser@4.2.8':
+ dependencies:
+ '@smithy/eventstream-serde-universal': 4.2.8
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@smithy/eventstream-serde-config-resolver@4.3.8':
+ dependencies:
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@smithy/eventstream-serde-node@4.2.8':
+ dependencies:
+ '@smithy/eventstream-serde-universal': 4.2.8
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@smithy/eventstream-serde-universal@4.2.8':
+ dependencies:
+ '@smithy/eventstream-codec': 4.2.8
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@smithy/fetch-http-handler@5.3.9':
+ dependencies:
+ '@smithy/protocol-http': 5.3.8
+ '@smithy/querystring-builder': 4.2.8
+ '@smithy/types': 4.12.0
+ '@smithy/util-base64': 4.3.0
+ tslib: 2.8.1
+
+ '@smithy/hash-blob-browser@4.2.9':
+ dependencies:
+ '@smithy/chunked-blob-reader': 5.2.0
+ '@smithy/chunked-blob-reader-native': 4.2.1
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@smithy/hash-node@4.2.8':
+ dependencies:
+ '@smithy/types': 4.12.0
+ '@smithy/util-buffer-from': 4.2.0
+ '@smithy/util-utf8': 4.2.0
+ tslib: 2.8.1
+
+ '@smithy/hash-stream-node@4.2.8':
+ dependencies:
+ '@smithy/types': 4.12.0
+ '@smithy/util-utf8': 4.2.0
+ tslib: 2.8.1
+
+ '@smithy/invalid-dependency@4.2.8':
+ dependencies:
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@smithy/is-array-buffer@2.2.0':
+ dependencies:
+ tslib: 2.8.1
+
+ '@smithy/is-array-buffer@4.2.0':
+ dependencies:
+ tslib: 2.8.1
+
+ '@smithy/md5-js@4.2.8':
+ dependencies:
+ '@smithy/types': 4.12.0
+ '@smithy/util-utf8': 4.2.0
+ tslib: 2.8.1
+
+ '@smithy/middleware-content-length@4.2.8':
+ dependencies:
+ '@smithy/protocol-http': 5.3.8
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@smithy/middleware-endpoint@4.4.8':
+ dependencies:
+ '@smithy/core': 3.20.7
+ '@smithy/middleware-serde': 4.2.9
+ '@smithy/node-config-provider': 4.3.8
+ '@smithy/shared-ini-file-loader': 4.4.3
+ '@smithy/types': 4.12.0
+ '@smithy/url-parser': 4.2.8
+ '@smithy/util-middleware': 4.2.8
+ tslib: 2.8.1
+
+ '@smithy/middleware-retry@4.4.24':
+ dependencies:
+ '@smithy/node-config-provider': 4.3.8
+ '@smithy/protocol-http': 5.3.8
+ '@smithy/service-error-classification': 4.2.8
+ '@smithy/smithy-client': 4.10.9
+ '@smithy/types': 4.12.0
+ '@smithy/util-middleware': 4.2.8
+ '@smithy/util-retry': 4.2.8
+ '@smithy/uuid': 1.1.0
+ tslib: 2.8.1
+
+ '@smithy/middleware-serde@4.2.9':
+ dependencies:
+ '@smithy/protocol-http': 5.3.8
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@smithy/middleware-stack@4.2.8':
+ dependencies:
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@smithy/node-config-provider@4.3.8':
+ dependencies:
+ '@smithy/property-provider': 4.2.8
+ '@smithy/shared-ini-file-loader': 4.4.3
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@smithy/node-http-handler@4.4.8':
+ dependencies:
+ '@smithy/abort-controller': 4.2.8
+ '@smithy/protocol-http': 5.3.8
+ '@smithy/querystring-builder': 4.2.8
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@smithy/property-provider@4.2.8':
+ dependencies:
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@smithy/protocol-http@5.3.8':
+ dependencies:
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@smithy/querystring-builder@4.2.8':
+ dependencies:
+ '@smithy/types': 4.12.0
+ '@smithy/util-uri-escape': 4.2.0
+ tslib: 2.8.1
+
+ '@smithy/querystring-parser@4.2.8':
+ dependencies:
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@smithy/service-error-classification@4.2.8':
+ dependencies:
+ '@smithy/types': 4.12.0
+
+ '@smithy/shared-ini-file-loader@4.4.3':
+ dependencies:
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@smithy/signature-v4@5.3.8':
+ dependencies:
+ '@smithy/is-array-buffer': 4.2.0
+ '@smithy/protocol-http': 5.3.8
+ '@smithy/types': 4.12.0
+ '@smithy/util-hex-encoding': 4.2.0
+ '@smithy/util-middleware': 4.2.8
+ '@smithy/util-uri-escape': 4.2.0
+ '@smithy/util-utf8': 4.2.0
+ tslib: 2.8.1
+
+ '@smithy/smithy-client@4.10.9':
+ dependencies:
+ '@smithy/core': 3.20.7
+ '@smithy/middleware-endpoint': 4.4.8
+ '@smithy/middleware-stack': 4.2.8
+ '@smithy/protocol-http': 5.3.8
+ '@smithy/types': 4.12.0
+ '@smithy/util-stream': 4.5.10
+ tslib: 2.8.1
+
+ '@smithy/types@4.12.0':
+ dependencies:
+ tslib: 2.8.1
+
+ '@smithy/url-parser@4.2.8':
+ dependencies:
+ '@smithy/querystring-parser': 4.2.8
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@smithy/util-base64@4.3.0':
+ dependencies:
+ '@smithy/util-buffer-from': 4.2.0
+ '@smithy/util-utf8': 4.2.0
+ tslib: 2.8.1
+
+ '@smithy/util-body-length-browser@4.2.0':
+ dependencies:
+ tslib: 2.8.1
+
+ '@smithy/util-body-length-node@4.2.1':
+ dependencies:
+ tslib: 2.8.1
+
+ '@smithy/util-buffer-from@2.2.0':
+ dependencies:
+ '@smithy/is-array-buffer': 2.2.0
+ tslib: 2.8.1
+
+ '@smithy/util-buffer-from@4.2.0':
+ dependencies:
+ '@smithy/is-array-buffer': 4.2.0
+ tslib: 2.8.1
+
+ '@smithy/util-config-provider@4.2.0':
+ dependencies:
+ tslib: 2.8.1
+
+ '@smithy/util-defaults-mode-browser@4.3.23':
+ dependencies:
+ '@smithy/property-provider': 4.2.8
+ '@smithy/smithy-client': 4.10.9
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@smithy/util-defaults-mode-node@4.2.26':
+ dependencies:
+ '@smithy/config-resolver': 4.4.6
+ '@smithy/credential-provider-imds': 4.2.8
+ '@smithy/node-config-provider': 4.3.8
+ '@smithy/property-provider': 4.2.8
+ '@smithy/smithy-client': 4.10.9
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@smithy/util-endpoints@3.2.8':
+ dependencies:
+ '@smithy/node-config-provider': 4.3.8
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@smithy/util-hex-encoding@4.2.0':
+ dependencies:
+ tslib: 2.8.1
+
+ '@smithy/util-middleware@4.2.8':
+ dependencies:
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@smithy/util-retry@4.2.8':
+ dependencies:
+ '@smithy/service-error-classification': 4.2.8
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@smithy/util-stream@4.5.10':
+ dependencies:
+ '@smithy/fetch-http-handler': 5.3.9
+ '@smithy/node-http-handler': 4.4.8
+ '@smithy/types': 4.12.0
+ '@smithy/util-base64': 4.3.0
+ '@smithy/util-buffer-from': 4.2.0
+ '@smithy/util-hex-encoding': 4.2.0
+ '@smithy/util-utf8': 4.2.0
+ tslib: 2.8.1
+
+ '@smithy/util-uri-escape@4.2.0':
+ dependencies:
+ tslib: 2.8.1
+
+ '@smithy/util-utf8@2.3.0':
+ dependencies:
+ '@smithy/util-buffer-from': 2.2.0
+ tslib: 2.8.1
+
+ '@smithy/util-utf8@4.2.0':
+ dependencies:
+ '@smithy/util-buffer-from': 4.2.0
+ tslib: 2.8.1
+
+ '@smithy/util-waiter@4.2.8':
+ dependencies:
+ '@smithy/abort-controller': 4.2.8
+ '@smithy/types': 4.12.0
+ tslib: 2.8.1
+
+ '@smithy/uuid@1.1.0':
+ dependencies:
+ tslib: 2.8.1
+
'@standard-schema/spec@1.0.0': {}
'@tailwindcss/node@4.1.15':
@@ -6150,6 +7746,8 @@ snapshots:
async@3.2.6: {}
+ asynckit@0.4.0: {}
+
autoprefixer@10.4.22(postcss@8.5.6):
dependencies:
browserslist: 4.28.1
@@ -6160,6 +7758,14 @@ snapshots:
postcss: 8.5.6
postcss-value-parser: 4.2.0
+ axios@1.13.2:
+ dependencies:
+ follow-redirects: 1.15.11
+ form-data: 4.0.5
+ proxy-from-env: 1.1.0
+ transitivePeerDependencies:
+ - debug
+
bail@2.0.2: {}
balanced-match@1.0.2: {}
@@ -6193,6 +7799,8 @@ snapshots:
boolbase@1.0.0: {}
+ bowser@2.13.1: {}
+
brace-expansion@1.1.12:
dependencies:
balanced-match: 1.0.2
@@ -6214,6 +7822,11 @@ snapshots:
buffer-indexof-polyfill@1.0.2: {}
+ buffer@5.6.0:
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+
buffer@5.7.1:
dependencies:
base64-js: 1.5.1
@@ -6230,6 +7843,11 @@ snapshots:
cac@6.7.14: {}
+ call-bind-apply-helpers@1.0.2:
+ dependencies:
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+
callsites@3.1.0: {}
caniuse-lite@1.0.30001759: {}
@@ -6285,6 +7903,10 @@ snapshots:
collapse-white-space@2.1.0: {}
+ combined-stream@1.0.8:
+ dependencies:
+ delayed-stream: 1.0.0
+
comma-separated-tokens@2.0.3: {}
commander@14.0.2: {}
@@ -6667,6 +8289,8 @@ snapshots:
dependencies:
robust-predicates: 3.0.2
+ delayed-stream@1.0.0: {}
+
depd@2.0.0: {}
dequal@2.0.3: {}
@@ -6691,6 +8315,12 @@ snapshots:
optionalDependencies:
'@types/trusted-types': 2.0.7
+ dunder-proto@1.0.1:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-errors: 1.3.0
+ gopd: 1.2.0
+
duplexer2@0.1.4:
dependencies:
readable-stream: 2.3.8
@@ -6722,8 +8352,23 @@ snapshots:
env-paths@3.0.0: {}
+ es-define-property@1.0.1: {}
+
+ es-errors@1.3.0: {}
+
es-module-lexer@1.7.0: {}
+ es-object-atoms@1.1.1:
+ dependencies:
+ es-errors: 1.3.0
+
+ es-set-tostringtag@2.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ has-tostringtag: 1.0.2
+ hasown: 2.0.2
+
esast-util-from-estree@2.0.0:
dependencies:
'@types/estree-jsx': 1.0.5
@@ -6850,6 +8495,8 @@ snapshots:
'@types/node': 24.10.1
require-like: 0.1.2
+ events@3.3.0: {}
+
exceljs@4.4.0:
dependencies:
archiver: 5.3.2
@@ -6899,6 +8546,10 @@ snapshots:
fast-json-stable-stringify@2.1.0: {}
+ fast-xml-parser@5.2.5:
+ dependencies:
+ strnum: 2.1.2
+
fault@2.0.1:
dependencies:
format: 0.2.2
@@ -6923,6 +8574,16 @@ snapshots:
flatted@3.3.3: {}
+ follow-redirects@1.15.11: {}
+
+ form-data@4.0.5:
+ dependencies:
+ asynckit: 0.4.0
+ combined-stream: 1.0.8
+ es-set-tostringtag: 2.1.0
+ hasown: 2.0.2
+ mime-types: 2.1.35
+
format@0.2.2: {}
formdata-polyfill@4.0.10:
@@ -6956,12 +8617,32 @@ snapshots:
mkdirp: 0.5.6
rimraf: 2.7.1
+ function-bind@1.1.2: {}
+
gensequence@8.0.8: {}
gensync@1.0.0-beta.2: {}
+ get-intrinsic@1.3.0:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ function-bind: 1.1.2
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ has-symbols: 1.1.0
+ hasown: 2.0.2
+ math-intrinsics: 1.1.0
+
get-nonce@1.0.1: {}
+ get-proto@1.0.1:
+ dependencies:
+ dunder-proto: 1.0.1
+ es-object-atoms: 1.1.1
+
get-stream@5.2.0:
dependencies:
pump: 3.0.3
@@ -6983,6 +8664,8 @@ snapshots:
dependencies:
ini: 4.1.1
+ gopd@1.2.0: {}
+
graceful-fs@4.2.11: {}
gray-matter@4.0.3:
@@ -6994,6 +8677,16 @@ snapshots:
hachure-fill@0.5.2: {}
+ has-symbols@1.1.0: {}
+
+ has-tostringtag@1.0.2:
+ dependencies:
+ has-symbols: 1.1.0
+
+ hasown@2.0.2:
+ dependencies:
+ function-bind: 1.1.2
+
hast-util-classnames@3.0.0:
dependencies:
'@types/hast': 3.0.4
@@ -7392,6 +9085,8 @@ snapshots:
marked@16.4.2: {}
+ math-intrinsics@1.1.0: {}
+
mdast-util-directive@3.1.0:
dependencies:
'@types/mdast': 4.0.4
@@ -7897,8 +9592,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ mime-db@1.52.0: {}
+
mime-db@1.54.0: {}
+ mime-types@2.1.35:
+ dependencies:
+ mime-db: 1.52.0
+
mime@1.6.0: {}
mimic-fn@2.1.0: {}
@@ -8093,6 +9794,8 @@ snapshots:
property-information@7.1.0: {}
+ proxy-from-env@1.1.0: {}
+
pump@3.0.3:
dependencies:
end-of-stream: 1.4.5
@@ -8501,6 +10204,37 @@ snapshots:
setprototypeof@1.2.0: {}
+ sharp@0.34.5:
+ dependencies:
+ '@img/colour': 1.0.0
+ detect-libc: 2.1.2
+ semver: 7.7.3
+ optionalDependencies:
+ '@img/sharp-darwin-arm64': 0.34.5
+ '@img/sharp-darwin-x64': 0.34.5
+ '@img/sharp-libvips-darwin-arm64': 1.2.4
+ '@img/sharp-libvips-darwin-x64': 1.2.4
+ '@img/sharp-libvips-linux-arm': 1.2.4
+ '@img/sharp-libvips-linux-arm64': 1.2.4
+ '@img/sharp-libvips-linux-ppc64': 1.2.4
+ '@img/sharp-libvips-linux-riscv64': 1.2.4
+ '@img/sharp-libvips-linux-s390x': 1.2.4
+ '@img/sharp-libvips-linux-x64': 1.2.4
+ '@img/sharp-libvips-linuxmusl-arm64': 1.2.4
+ '@img/sharp-libvips-linuxmusl-x64': 1.2.4
+ '@img/sharp-linux-arm': 0.34.5
+ '@img/sharp-linux-arm64': 0.34.5
+ '@img/sharp-linux-ppc64': 0.34.5
+ '@img/sharp-linux-riscv64': 0.34.5
+ '@img/sharp-linux-s390x': 0.34.5
+ '@img/sharp-linux-x64': 0.34.5
+ '@img/sharp-linuxmusl-arm64': 0.34.5
+ '@img/sharp-linuxmusl-x64': 0.34.5
+ '@img/sharp-wasm32': 0.34.5
+ '@img/sharp-win32-arm64': 0.34.5
+ '@img/sharp-win32-ia32': 0.34.5
+ '@img/sharp-win32-x64': 0.34.5
+
shebang-command@2.0.0:
dependencies:
shebang-regex: 3.0.0
@@ -8538,6 +10272,11 @@ snapshots:
dependencies:
bl: 5.1.0
+ stream-browserify@3.0.0:
+ dependencies:
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+
string-width@6.1.0:
dependencies:
eastasianwidth: 0.2.0
@@ -8565,6 +10304,8 @@ snapshots:
strip-final-newline@2.0.0: {}
+ strnum@2.1.2: {}
+
style-to-js@1.1.21:
dependencies:
style-to-object: 1.0.14
@@ -8743,6 +10484,8 @@ snapshots:
uuid@11.1.0: {}
+ uuid@13.0.0: {}
+
uuid@8.3.2: {}
vary@1.1.2: {}