diff --git a/backend/Dockerfile.pe b/backend/Dockerfile.pe index d40a383fd..100921e99 100644 --- a/backend/Dockerfile.pe +++ b/backend/Dockerfile.pe @@ -7,7 +7,7 @@ COPY ./package* ./ COPY src ./src -RUN apt update && apt install git zlib1g-dev +RUN apt update && apt install -y git zlib1g-dev RUN apt-get update && apt-get install -y jq diff --git a/backend/env.yml b/backend/env.yml index 90d2f5996..bea8c6c46 100644 --- a/backend/env.yml +++ b/backend/env.yml @@ -6,6 +6,7 @@ dev: REGION: us-east-1 staging-cd: + IS_DMZ: 1 REGION: us-east-1 ENDPOINT_TYPE: REGIONAL COGNITO_URL: https://cognito-idp.us-east-1.amazonaws.com @@ -24,6 +25,8 @@ staging-cd: MDL_USERNAME: ${ssm:/crossfeed/staging/MDL_USERNAME} MDL_PASSWORD: ${ssm:/crossfeed/staging/MDL_PASSWORD} MDL_NAME: ${ssm:/crossfeed/staging/MDL_NAME} + POSTGRES_SCAN_USER: ${ssm:/crossfeed/staging/POSTGRES_SCAN_USER} + POSTGRES_SCAN_PASSWORD: ${ssm:/crossfeed/staging/POSTGRES_SCAN_PASSWORD} MI_ACCOUNT_NAME: ${ssm:/readysetcyber/staging/MI_ACCOUNT_NAME} MI_PASSWORD: ${ssm:/readysetcyber/staging/MI_ACCOUNT_PASSWORD} PE_DB_NAME: ${ssm:/crossfeed/staging/PE_DB_NAME} @@ -78,6 +81,7 @@ staging-cd: REACT_APP_COGNITO_CALLBACK_URL: https://staging-cd.crossfeed.cyber.dhs.gov/okta-callback integration: + IS_DMZ: 1 REGION: us-east-1 ENDPOINT_TYPE: REGIONAL COGNITO_URL: https://cognito-idp.us-east-1.amazonaws.com @@ -95,6 +99,8 @@ integration: MDL_USERNAME: ${ssm:/crossfeed/integration/MDL_USERNAME} MDL_PASSWORD: ${ssm:/crossfeed/integration/MDL_PASSWORD} MDL_NAME: ${ssm:/crossfeed/integration/MDL_NAME} + POSTGRES_SCAN_USER: ${ssm:/crossfeed/integration/POSTGRES_SCAN_USER} + POSTGRES_SCAN_PASSWORD: ${ssm:/crossfeed/integration/POSTGRES_SCAN_PASSWORD} MI_ACCOUNT_NAME: ${ssm:/readysetcyber/integration/MI_ACCOUNT_NAME} MI_PASSWORD: ${ssm:/readysetcyber/integration/MI_ACCOUNT_PASSWORD} JWT_SECRET: ${ssm:/crossfeed/integration/APP_JWT_SECRET} @@ -142,6 +148,7 @@ integration: ELASTICACHE_ENDPOINT: ${ssm:/crossfeed/integration/ELASTICACHE_ENDPOINT} staging: + IS_DMZ: 0 REGION: us-gov-east-1 ENDPOINT_TYPE: PRIVATE COGNITO_URL: https://cognito-idp.us-gov-west-1.amazonaws.com @@ -157,6 +164,8 @@ staging: DB_NAME: ${ssm:/crossfeed/staging/DATABASE_NAME} DB_USERNAME: ${ssm:/crossfeed/staging/DATABASE_USER} DB_PASSWORD: ${ssm:/crossfeed/staging/DATABASE_PASSWORD} + POSTGRES_SCAN_USER: ${ssm:/crossfeed/staging/POSTGRES_SCAN_USER} + POSTGRES_SCAN_PASSWORD: ${ssm:/crossfeed/staging/POSTGRES_SCAN_PASSWORD} JWT_SECRET: ${ssm:/crossfeed/staging/APP_JWT_SECRET} JWT_ALGORITHM: ${ssm:/crossfeed/staging/JWT_ALGORITHM} JWT_TIMEOUT_HOURS: ${ssm:/crossfeed/staging/JWT_TIMEOUT_HOURS} @@ -204,6 +213,7 @@ staging: ELASTICACHE_ENDPOINT: ${ssm:/crossfeed/staging/ELASTICACHE_ENDPOINT} prod: + IS_DMZ: 0 REGION: us-gov-east-1 ENDPOINT_TYPE: PRIVATE COGNITO_URL: https://cognito-idp.us-gov-west-1.amazonaws.com @@ -223,6 +233,8 @@ prod: MDL_PASSWORD: ${ssm:/crossfeed/prod/MDL_PASSWORD} DJANGO_SECRET: ${ssm:/crossfeed/prod/DJANGO_SECRECT} MDL_NAME: ${ssm:/crossfeed/prod/MDL_NAME} + POSTGRES_SCAN_USER: ${ssm:/crossfeed/prod/POSTGRES_SCAN_USER} + POSTGRES_SCAN_PASSWORD: ${ssm:/crossfeed/prod/POSTGRES_SCAN_PASSWORD} JWT_SECRET: ${ssm:/crossfeed/prod/APP_JWT_SECRET} JWT_ALGORITHM: ${ssm:/crossfeed/prod/JWT_ALGORITHM} JWT_TIMEOUT_HOURS: ${ssm:/crossfeed/prod/JWT_TIMEOUT_HOURS} diff --git a/backend/scripts/populateCountiesCities/cities.py b/backend/scripts/populateCountiesCities/cities.py index 8adc3c4ec..c497bdc5c 100644 --- a/backend/scripts/populateCountiesCities/cities.py +++ b/backend/scripts/populateCountiesCities/cities.py @@ -117,7 +117,7 @@ def pull_cities(): ) time.sleep(1) except Exception as e: - print(f"Error: {e}") + print("Error: {}".format(e)) pass df = pd.DataFrame(holding_pen, columns=["State", "County", "City", "URL"]) diff --git a/backend/scripts/populateCountiesCities/counties.py b/backend/scripts/populateCountiesCities/counties.py index 34823f8cf..1a96c0658 100644 --- a/backend/scripts/populateCountiesCities/counties.py +++ b/backend/scripts/populateCountiesCities/counties.py @@ -62,7 +62,7 @@ def pull_counties(): } ) except Exception as e: - print(f"Error: {e}") + print("Error: {}".format(e)) pass time.sleep(1) diff --git a/backend/serverless.yml b/backend/serverless.yml index d7f578c09..6faf1f04f 100644 --- a/backend/serverless.yml +++ b/backend/serverless.yml @@ -59,7 +59,9 @@ custom: Condition: IpAddress: aws:SourceIp: - - ${file(env.yml):${self:provider.stage}.DMZ_CIDR, ''} + 'Fn::Split': + - ',' + - ${file(env.yml):${self:provider.stage}.DMZ_CIDR, ''} # Conditional logic for GovCloud vs # non-GovCloud (Private endpoints require a VPC Endpoint) diff --git a/backend/src/api/app.ts b/backend/src/api/app.ts index e7499e723..c29041215 100644 --- a/backend/src/api/app.ts +++ b/backend/src/api/app.ts @@ -444,17 +444,17 @@ app.use( // API Gateway isn't able to proxy fonts properly -- so we're using a CDN instead. if (req.path === '/plugins/Morpheus/fonts/matomo.woff2') { return res.redirect( - 'https://cdn.jsdelivr.net/gh/matomo-org/matomo@3.14.1/plugins/Morpheus/fonts/matomo.woff2' + 'https://cdn.jsdelivr.net/gh/matomo-org/matomo@5.2.1/plugins/Morpheus/fonts/matomo.woff2' ); } if (req.path === '/plugins/Morpheus/fonts/matomo.woff') { return res.redirect( - 'https://cdn.jsdelivr.net/gh/matomo-org/matomo@3.14.1/plugins/Morpheus/fonts/matomo.woff' + 'https://cdn.jsdelivr.net/gh/matomo-org/matomo@5.2.1/plugins/Morpheus/fonts/matomo.woff' ); } if (req.path === '/plugins/Morpheus/fonts/matomo.ttf') { return res.redirect( - 'https://cdn.jsdelivr.net/gh/matomo-org/matomo@3.14.1/plugins/Morpheus/fonts/matomo.ttf' + 'https://cdn.jsdelivr.net/gh/matomo-org/matomo@5.2.1/plugins/Morpheus/fonts/matomo.ttf' ); } // Only allow global admins to access all other paths. diff --git a/backend/src/api/users.ts b/backend/src/api/users.ts index 91aaaf1cf..b91ee5c07 100644 --- a/backend/src/api/users.ts +++ b/backend/src/api/users.ts @@ -899,7 +899,9 @@ export const updateV2 = wrapHandler(async (event) => { } // Check if authorizer's region matches the user's - if (!matchesUserRegion(event, user.regionId)) return Unauthorized; + // Allows new users to select their state without a region on initial account creation + if (user.invitePending === false && !matchesUserRegion(event, user.regionId)) + return Unauthorized; if (body.state) { body.regionId = REGION_STATE_MAP[body.state]; diff --git a/backend/src/api/vulnerabilities.ts b/backend/src/api/vulnerabilities.ts index 1e0cbe6ad..7e433a529 100644 --- a/backend/src/api/vulnerabilities.ts +++ b/backend/src/api/vulnerabilities.ts @@ -124,11 +124,12 @@ class VulnerabilitySearch { if (this.filters?.severity) { if (this.filters.severity === 'N/A') { qs.andWhere( - "vulnerability.severity IS NULL OR vulnerability.severity = ''" + "vulnerability.severity IS NULL OR vulnerability.severity = '' OR vulnerability.severity ILIKE 'N/A' OR vulnerability.severity ILIKE 'NULL'" ); } else if (this.filters.severity === 'Other') { qs.andWhere( - `vulnerability.severity NOT ILIKE 'N/A' AND + `vulnerability.severity NOT ILIKE 'NULL' AND + vulnerability.severity NOT ILIKE 'N/A' AND vulnerability.severity NOT ILIKE 'Low' AND vulnerability.severity NOT ILIKE 'Medium' AND vulnerability.severity NOT ILIKE 'High' AND diff --git a/backend/src/tasks/functions.yml b/backend/src/tasks/functions.yml index 53d739556..8a4d20511 100644 --- a/backend/src/tasks/functions.yml +++ b/backend/src/tasks/functions.yml @@ -12,6 +12,10 @@ syncdb: timeout: 900 handler: src/xfd_django/xfd_api/tasks/run_syncdb.handler +syncmdl: + timeout: 900 + handler: src/xfd_django/xfd_api/tasks/run_syncmdl.handler + bastion: timeout: 900 handler: src/xfd_django/xfd_api/tasks/bastion.handler diff --git a/backend/src/xfd_django/xfd_api/api_methods/auth.py b/backend/src/xfd_django/xfd_api/api_methods/auth.py index d8ea4c888..0b2db4ab0 100644 --- a/backend/src/xfd_django/xfd_api/api_methods/auth.py +++ b/backend/src/xfd_django/xfd_api/api_methods/auth.py @@ -8,20 +8,20 @@ async def handle_okta_callback(request): """POST API LOGIC.""" - print(f"Request from /auth/okta-callback: {str(request)}") + print("Request from /auth/okta-callback: {}".format(str(request))) body = await request.json() - print(f"Request json from callback: {str(request)}") - print(f"Request json from callback: {body}") - print(f"Body type: {type(body)}") + print("Request json from callback: {}".format(str(request))) + print("Request json from callback: {}".format(body)) + print("Body type: {}".format(type(body))) code = body.get("code") - print(f"Code: {code}") + print("Code: {}".format(code)) if not code: return HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="Code not found in request body", ) jwt_data = await get_jwt_from_code(code) - print(f"JWT Data: {jwt_data}") + print("JWT Data: {}".format(jwt_data)) if jwt_data is None: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, diff --git a/backend/src/xfd_django/xfd_api/api_methods/domain.py b/backend/src/xfd_django/xfd_api/api_methods/domain.py index ff8f5d519..92d22b4ae 100644 --- a/backend/src/xfd_django/xfd_api/api_methods/domain.py +++ b/backend/src/xfd_django/xfd_api/api_methods/domain.py @@ -167,7 +167,7 @@ def export_domains(domain_search: DomainSearch, current_user): for product in service.products.all(): if product.name: product_entry = ( - f"{product.name} {product.version}" + "{} {}".format(product.name, product.version) if product.version else product.name ) @@ -221,5 +221,5 @@ def export_domains(domain_search: DomainSearch, current_user): except Exception as e: # Log the exception for debugging (optional) - print(f"Error exporting domains: {e}") + print("Error exporting domains: {}".format(e)) raise HTTPException(status_code=500, detail=str(e)) diff --git a/backend/src/xfd_django/xfd_api/api_methods/organization.py b/backend/src/xfd_django/xfd_api/api_methods/organization.py index 96a486759..866cb47f2 100644 --- a/backend/src/xfd_django/xfd_api/api_methods/organization.py +++ b/backend/src/xfd_django/xfd_api/api_methods/organization.py @@ -250,7 +250,7 @@ def get_organization(organization_id, current_user): raise http_exc except Exception as e: - print(f"An error occurred: {e}") + print("An error occurred: {}".format(e)) raise HTTPException(status_code=500, detail=str(e)) @@ -715,7 +715,7 @@ def delete_organization(org_id: str, current_user): # Return success response return { "status": "success", - "message": f"Organization {org_id} has been deleted successfully.", + "message": "Organization {} has been deleted successfully.".format(org_id), } except HTTPException as http_exc: @@ -1064,7 +1064,7 @@ def search_organizations_task(search_body, current_user: User): # Use match_all if searchTerm is empty if search_body.searchTerm.strip(): query_body["query"]["bool"]["must"].append( - {"wildcard": {"name": f"*{search_body.searchTerm}*"}} + {"wildcard": {"name": "*{}*".format(search_body.searchTerm)}} ) else: query_body["query"]["bool"]["must"].append({"match_all": {}}) @@ -1076,7 +1076,7 @@ def search_organizations_task(search_body, current_user: User): ) # Log the query for debugging - print(f"Query body: {query_body}") + print("Query body: {}".format(query_body)) # Execute the search search_results = client.search_organizations(query_body) diff --git a/backend/src/xfd_django/xfd_api/api_methods/proxy.py b/backend/src/xfd_django/xfd_api/api_methods/proxy.py index 467924f22..526655e91 100644 --- a/backend/src/xfd_django/xfd_api/api_methods/proxy.py +++ b/backend/src/xfd_django/xfd_api/api_methods/proxy.py @@ -32,13 +32,13 @@ async def proxy_request( if cookie_name: cookies = manipulate_cookie(request, cookie_name) if cookies: - headers["Cookie"] = f"{cookie_name}={cookies[cookie_name]}" + headers["Cookie"] = "{}={}".format(cookie_name, cookies[cookie_name]) # Make the request to the target URL async with httpx.AsyncClient() as client: proxy_response = await client.request( method=request.method, - url=f"{target_url}/{path}", + url="{}/{}".format(target_url, path), headers=headers, params=request.query_params, content=await request.body(), diff --git a/backend/src/xfd_django/xfd_api/api_methods/saved_search.py b/backend/src/xfd_django/xfd_api/api_methods/saved_search.py index caae0428e..1bd4a2134 100644 --- a/backend/src/xfd_django/xfd_api/api_methods/saved_search.py +++ b/backend/src/xfd_django/xfd_api/api_methods/saved_search.py @@ -235,7 +235,7 @@ def delete_saved_search(saved_search_id, user): return JsonResponse( { "status": "success", - "message": f"Saved search id:{saved_search_id} deleted.", + "message": "Saved search id:{} deleted.".format(saved_search_id), } ) except User.DoesNotExist: diff --git a/backend/src/xfd_django/xfd_api/api_methods/scan.py b/backend/src/xfd_django/xfd_api/api_methods/scan.py index 5241f8248..782484bd3 100644 --- a/backend/src/xfd_django/xfd_api/api_methods/scan.py +++ b/backend/src/xfd_django/xfd_api/api_methods/scan.py @@ -270,7 +270,10 @@ def delete_scan(scan_id: str, current_user): scan.delete() - return {"status": "success", "message": f"Scan {scan_id} deleted successfully."} + return { + "status": "success", + "message": "Scan {} deleted successfully.".format(scan_id), + } except HTTPException as http_exc: raise http_exc @@ -297,7 +300,7 @@ def run_scan(scan_id: str, current_user): scan.save() return { "status": "success", - "message": f"Scan {scan_id} set to manualRunPending.", + "message": "Scan {} set to manualRunPending.".format(scan_id), } except HTTPException as http_exc: @@ -320,7 +323,7 @@ async def invoke_scheduler(current_user): lambda_client = LambdaClient() # Form the lambda function name using environment variable - lambda_function_name = f"{os.getenv('SLS_LAMBDA_PREFIX')}-scheduler" + lambda_function_name = "{}-scheduler".format(os.getenv("SLS_LAMBDA_PREFIX")) print(lambda_function_name) # Run the Lambda command diff --git a/backend/src/xfd_django/xfd_api/api_methods/scan_tasks.py b/backend/src/xfd_django/xfd_api/api_methods/scan_tasks.py index 9a251139d..bd169eb17 100644 --- a/backend/src/xfd_django/xfd_api/api_methods/scan_tasks.py +++ b/backend/src/xfd_django/xfd_api/api_methods/scan_tasks.py @@ -37,9 +37,9 @@ def list_scan_tasks(search_data: Optional[ScanTaskSearch], current_user): # Determine the correct ordering based on the 'order' field ordering_field = ( - f"-{search_data.sort}" + "-{}".format(search_data.sort) if search_data.order and search_data.order.upper() == "DESC" - else search_data.sort + else "{}".format(search_data.sort) ) # Construct query based on filters @@ -71,7 +71,7 @@ def list_scan_tasks(search_data: Optional[ScanTaskSearch], current_user): for task in qs: # Ensure scan is not None before accessing its properties if task.scan is None: - print(f"Warning: ScanTask {task.id} has no scan associated.") + print("Warning: ScanTask {} has no scan associated.".format(task.id)) scan_data = None else: scan_data = { @@ -177,7 +177,7 @@ def kill_scan_task(scan_task_id, current_user): utc_now = datetime.now(timezone.utc) scan_task.status = "failed" scan_task.finishedAt = utc_now - scan_task.output = f"Manually stopped at {utc_now.isoformat()}" + scan_task.output = "Manually stopped at {}".format(utc_now.isoformat()) scan_task.save() return {"statusCode": 200, "message": "ScanTask successfully marked as failed."} diff --git a/backend/src/xfd_django/xfd_api/api_methods/search.py b/backend/src/xfd_django/xfd_api/api_methods/search.py index 94b3e460e..fdf175bf7 100644 --- a/backend/src/xfd_django/xfd_api/api_methods/search.py +++ b/backend/src/xfd_django/xfd_api/api_methods/search.py @@ -67,7 +67,7 @@ async def fetch_all_results( try: response = client.search_domains(request) except Exception as e: - print(f"Elasticsearch error: {e}") + print("Elasticsearch error: {}".format(e)) raise HTTPException(status_code=500, detail="Error querying Elasticsearch.") hits = response.get("hits", {}).get("hits", []) @@ -97,9 +97,9 @@ def process_results(results: List[Dict[str, Any]]) -> List[Dict[str, Any]]: if "name" in product: product_name = product["name"].lower() product_version = product.get("version", "") - products[ - product_name - ] = f"{product['name']} {product_version}".strip() + products[product_name] = "{} {}".format( + product["name"], product_version + ).strip() res["products"] = ", ".join(products.values()) processed_results.append(res) @@ -204,7 +204,7 @@ async def search_export(search_body: DomainSearchBody, current_user) -> Dict[str try: csv_url = s3_client.save_csv(csv_content, "domains") except Exception as e: - print(f"S3 upload error: {e}") + print("S3 upload error: {}".format(e)) raise HTTPException(status_code=500, detail="Error uploading CSV to S3.") return {"url": csv_url} diff --git a/backend/src/xfd_django/xfd_api/api_methods/stats.py b/backend/src/xfd_django/xfd_api/api_methods/stats.py index 3828a5a69..7d4a92420 100644 --- a/backend/src/xfd_django/xfd_api/api_methods/stats.py +++ b/backend/src/xfd_django/xfd_api/api_methods/stats.py @@ -22,7 +22,7 @@ async def safe_fetch(fetch_fn, *args, **kwargs): try: return await fetch_fn(*args, **kwargs) except Exception as e: - print(f"Error fetching stats with {fetch_fn.__name__}: {e}") + print("Error fetching stats with {}: {}".format(fetch_fn.__name__, e)) return [] filtered_org_ids = get_stats_org_ids(current_user, filter_data) @@ -98,7 +98,7 @@ async def safe_fetch(fetch_fn, *args, **kwargs): } except Exception as e: raise HTTPException( - status_code=500, detail=f"An unexpected error occurred: {e}" + status_code=500, detail="An unexpected error occurred: {}".format(e) ) @@ -130,11 +130,13 @@ async def get_user_services_count( return services_data except aioredis.RedisError as redis_error: - raise HTTPException(status_code=500, detail=f"Redis error: {redis_error}") + raise HTTPException( + status_code=500, detail="Redis error: {}".format(redis_error) + ) except Exception as e: raise HTTPException( - status_code=500, detail=f"An unexpected error occurred: {e}" + status_code=500, detail="An unexpected error occurred: {}".format(e) ) @@ -166,11 +168,13 @@ async def get_user_ports_count( return ports_data except aioredis.RedisError as redis_error: - raise HTTPException(status_code=500, detail=f"Redis error: {redis_error}") + raise HTTPException( + status_code=500, detail="Redis error: {}".format(redis_error) + ) except Exception as e: raise HTTPException( - status_code=500, detail=f"An unexpected error occurred: {e}" + status_code=500, detail="An unexpected error occurred: {}".format(e) ) @@ -200,11 +204,13 @@ async def get_num_vulns(filter_data, current_user, redis_client, filtered_org_id return num_vulns_data except aioredis.RedisError as redis_error: - raise HTTPException(status_code=500, detail=f"Redis error: {redis_error}") + raise HTTPException( + status_code=500, detail="Redis error: {}".format(redis_error) + ) except Exception as e: raise HTTPException( - status_code=500, detail=f"An unexpected error occurred: {e}" + status_code=500, detail="An unexpected error occurred: {}".format(e) ) @@ -236,11 +242,13 @@ async def get_severity_stats( return severity_data except aioredis.RedisError as redis_error: - raise HTTPException(status_code=500, detail=f"Redis error: {redis_error}") + raise HTTPException( + status_code=500, detail="Redis error: {}".format(redis_error) + ) except Exception as e: raise HTTPException( - status_code=500, detail=f"An unexpected error occurred: {e}" + status_code=500, detail="An unexpected error occurred: {}".format(e) ) @@ -265,7 +273,9 @@ async def stats_latest_vulns( ) # Generate all Redis keys at once - redis_keys = [f"latest_vulnerabilities:{org_id}" for org_id in filtered_org_ids] + redis_keys = [ + "latest_vulnerabilities:{}".format(org_id) for org_id in filtered_org_ids + ] # Use MGET to fetch all keys in a single operation results = await safe_redis_mget( @@ -293,12 +303,14 @@ async def stats_latest_vulns( return vulnerabilities except aioredis.RedisError as redis_error: - raise HTTPException(status_code=500, detail=f"Redis error: {redis_error}") + raise HTTPException( + status_code=500, detail="Redis error: {}".format(redis_error) + ) except Exception as e: raise HTTPException( status_code=500, - detail=f"An unexpected error occurred: {e}", + detail="An unexpected error occurred: {}".format(e), ) @@ -324,7 +336,8 @@ async def stats_most_common_vulns( # Generate all Redis keys at once redis_keys = [ - f"most_common_vulnerabilities:{org_id}" for org_id in filtered_org_ids + "most_common_vulnerabilities:{}".format(org_id) + for org_id in filtered_org_ids ] # Use MGET to fetch all keys in a single operation @@ -347,12 +360,14 @@ async def stats_most_common_vulns( return vulnerabilities except aioredis.RedisError as redis_error: - raise HTTPException(status_code=500, detail=f"Redis error: {redis_error}") + raise HTTPException( + status_code=500, detail="Redis error: {}".format(redis_error) + ) except Exception as e: raise HTTPException( status_code=500, - detail=f"An unexpected error occurred: {e}", + detail="An unexpected error occurred: {}".format(e), ) @@ -376,7 +391,7 @@ async def get_by_org_stats( # Fetch data from Redis for each organization ID for org_id in filtered_org_ids: - redis_key = f"by_org_stats:{org_id}" + redis_key = "by_org_stats:{}".format(org_id) org_stats = await redis_client.get(redis_key) if org_stats: by_org_data.append( @@ -392,10 +407,12 @@ async def get_by_org_stats( return by_org_data except aioredis.RedisError as redis_error: - raise HTTPException(status_code=500, detail=f"Redis error: {redis_error}") + raise HTTPException( + status_code=500, detail="Redis error: {}".format(redis_error) + ) except Exception as e: raise HTTPException( status_code=500, - detail=f"An unexpected error occurred: {e}", + detail="An unexpected error occurred: {}".format(e), ) diff --git a/backend/src/xfd_django/xfd_api/api_methods/user.py b/backend/src/xfd_django/xfd_api/api_methods/user.py index 507501d6d..4b3ed2e10 100644 --- a/backend/src/xfd_django/xfd_api/api_methods/user.py +++ b/backend/src/xfd_django/xfd_api/api_methods/user.py @@ -171,7 +171,7 @@ def delete_user(target_user_id, current_user): # Return success response return { "status": "success", - "message": f"User {target_user_id} has been deleted successfully.", + "message": "User {} has been deleted successfully.".format(target_user_id), } except Exception as e: @@ -362,7 +362,7 @@ async def update_user(target_user_id, body, current_user): user = User.objects.get(id=target_user_id) user.firstName = update_data.firstName or user.firstName user.lastName = update_data.lastName or user.lastName - user.fullName = f"{user.firstName} {user.lastName}" + user.fullName = "{} {}".format(user.firstName, user.lastName) user.userType = update_data.userType or user.userType user.state = update_data.state or user.state user.regionId = update_data.regionId or user.regionId @@ -456,7 +456,7 @@ def update_user_v2(user_id, user_data, current_user): except HTTPException as http_exc: raise http_exc except Exception as e: - print(f"Error updating user: {e}") + print("Error updating user: {}".format(e)) raise HTTPException(status_code=500, detail="An unexpected error occurred.") @@ -490,7 +490,9 @@ def approve_user_registration(user_id, current_user): raise http_exc except Exception as e: - raise HTTPException(status_code=500, detail=f"Failed to send email: {str(e)}") + raise HTTPException( + status_code=500, detail="Failed to send email: {}".format(str(e)) + ) return {"statusCode": 200, "body": "User registration approved."} @@ -528,7 +530,7 @@ def deny_user_registration(user_id: str, current_user: User): except ObjectDoesNotExist: raise HTTPException(status_code=404, detail="User not found.") except Exception as e: - print(f"Error denying registration: {e}") + print("Error denying registration: {}".format(e)) raise HTTPException( status_code=500, detail="Error processing registration denial." ) @@ -627,5 +629,5 @@ def invite(new_user_data, current_user): raise http_exc except Exception as e: - print(f"Error inviting user: {e}") + print("Error inviting user: {}".format(e)) raise HTTPException(status_code=500, detail="Error inviting user.") diff --git a/backend/src/xfd_django/xfd_api/api_methods/vulnerability.py b/backend/src/xfd_django/xfd_api/api_methods/vulnerability.py index 4bedb1e3b..fa7a41cb3 100644 --- a/backend/src/xfd_django/xfd_api/api_methods/vulnerability.py +++ b/backend/src/xfd_django/xfd_api/api_methods/vulnerability.py @@ -120,7 +120,9 @@ def update_vulnerability( except Vulnerability.DoesNotExist: raise HTTPException(status_code=404, detail="Vulnerability not found.") except Exception as e: - raise HTTPException(status_code=500, detail=f"Internal Server Error: {e}") + raise HTTPException( + status_code=500, detail="Internal Server Error: {}".format(e) + ) def search_vulnerabilities(vulnerability_search: VulnerabilitySearch, current_user): @@ -134,13 +136,21 @@ def search_vulnerabilities(vulnerability_search: VulnerabilitySearch, current_us ) # Permissions check - if not is_global_view_admin(current_user): + if ( + not is_global_view_admin(current_user) + and not current_user.userType == "regionalAdmin" + ): org_ids = get_org_memberships(current_user) if not org_ids: return [], 0 # User has no accessible organizations vulnerabilities = vulnerabilities.filter( domain__organization_id__in=org_ids ) + # Regional Admins can only view vulnerabilities in their region + if current_user.userType == "regionalAdmin" and current_user.regionId: + vulnerabilities = vulnerabilities.filter( + domain__organization__regionId=current_user.regionId + ) # Apply custom FCEB and CIDR filter vulnerabilities = vulnerabilities.filter( diff --git a/backend/src/xfd_django/xfd_api/auth.py b/backend/src/xfd_django/xfd_api/auth.py index b4627ed5a..4d92d7b45 100644 --- a/backend/src/xfd_django/xfd_api/auth.py +++ b/backend/src/xfd_django/xfd_api/auth.py @@ -5,6 +5,7 @@ import hashlib from hashlib import sha256 import os +import re from typing import List, Optional from urllib.parse import urlencode import uuid @@ -213,8 +214,7 @@ def hash_key(key: str) -> str: # async def get_user_info_from_cognito(token): # """Get user info from cognito.""" # jwks_url = ( -# f"https://cognito-idp.us-east-1.amazonaws.com/" -# f"{os.getenv('REACT_APP_USER_POOL_ID')}/.well-known/jwks.json" +# "https://cognito-idp.us-east-1.amazonaws.com/{}/.well-known/jwks.json".format(os.getenv('REACT_APP_USER_POOL_ID')) # ) # response = requests.get(jwks_url) # jwks = response.json() @@ -273,34 +273,38 @@ def get_current_active_user( if api_key: user = get_user_by_api_key(api_key) elif token: - try: - # Decode token in Authorization header to get user - payload = jwt.decode(token, JWT_SECRET, algorithms=[JWT_ALGORITHM]) - user_id = payload.get("id") - - if user_id is None: - print("No user ID found in token") + # Check if token is an API key + if re.match(r"^[A-Fa-f0-9]{32}$", token): + user = get_user_by_api_key(token) + else: + try: + # Decode token in Authorization header to get user + payload = jwt.decode(token, JWT_SECRET, algorithms=[JWT_ALGORITHM]) + user_id = payload.get("id") + + if user_id is None: + print("No user ID found in token") + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Invalid token", + headers={"WWW-Authenticate": "Bearer"}, + ) + # Fetch the user by ID from the database + user = User.objects.get(id=user_id) + except jwt.ExpiredSignatureError: + print("Token has expired") + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Token has expired", + headers={"WWW-Authenticate": "Bearer"}, + ) + except jwt.InvalidTokenError: + print("Invalid token") raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid token", headers={"WWW-Authenticate": "Bearer"}, ) - # Fetch the user by ID from the database - user = User.objects.get(id=user_id) - except jwt.ExpiredSignatureError: - print("Token has expired") - raise HTTPException( - status_code=status.HTTP_401_UNAUTHORIZED, - detail="Token has expired", - headers={"WWW-Authenticate": "Bearer"}, - ) - except jwt.InvalidTokenError: - print("Invalid token") - raise HTTPException( - status_code=status.HTTP_401_UNAUTHORIZED, - detail="Invalid token", - headers={"WWW-Authenticate": "Bearer"}, - ) else: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, @@ -368,7 +372,7 @@ async def get_jwt_from_code(auth_code: str): proxy_url = os.getenv("LZ_PROXY_URL") scope = "openid" - authorize_token_url = f"https://{domain}/oauth2/token" + authorize_token_url = "https://{}/oauth2/token".format(domain) authorize_token_body = { "grant_type": "authorization_code", "client_id": client_id, @@ -400,7 +404,7 @@ async def get_jwt_from_code(auth_code: str): # Decode the token without verifying the signature (if needed) decoded_token = jwt.decode(id_token, options={"verify_signature": False}) - print(f"decoded token: {decoded_token}") + print("decoded token: {}".format(decoded_token)) return { "refresh_token": refresh_token, "id_token": id_token, @@ -409,7 +413,7 @@ async def get_jwt_from_code(auth_code: str): } except Exception as error: - print(f"get_jwt_from_code post error: {error}") + print("get_jwt_from_code post error: {}".format(error)) def can_access_user(current_user, target_user_id) -> bool: @@ -541,6 +545,7 @@ def get_stats_org_ids(current_user, filters): is_global_view_admin(current_user) or (is_regional_admin_for_organization(current_user, org_id)) or (is_org_admin(current_user, org_id)) + or (get_org_memberships(current_user)) ): organization_ids.add(org_id) diff --git a/backend/src/xfd_django/xfd_api/helpers/elastic_search.py b/backend/src/xfd_django/xfd_api/helpers/elastic_search.py index 2a703f0cd..4999b63d2 100644 --- a/backend/src/xfd_django/xfd_api/helpers/elastic_search.py +++ b/backend/src/xfd_django/xfd_api/helpers/elastic_search.py @@ -19,7 +19,7 @@ def build_sort(sort_direction: str, sort_field: str) -> Optional[List[Dict[str, return None if sort_field in NON_KEYWORD_FIELDS: return [{sort_field: {"order": sort_direction}}] - return [{f"{sort_field}.keyword": {"order": sort_direction}}] + return [{"{}.keyword".format(sort_field): {"order": sort_direction}}] def build_match(search_term: str) -> Dict[str, Any]: @@ -54,8 +54,8 @@ def get_term_filter_value(field, field_value): if isinstance(field_value, (int, float)): return {field: field_value} if field == "name" and field_value and "*" not in field_value: - field_value = f"*{field_value}*" - return {f"{field}.keyword": field_value} + field_value = "*{}*".format(field_value) + return {"{}.keyword".format(field): field_value} def get_term_filter(term_filter): diff --git a/backend/src/xfd_django/xfd_api/helpers/email.py b/backend/src/xfd_django/xfd_api/helpers/email.py index d842eb5c7..88f32dcc3 100644 --- a/backend/src/xfd_django/xfd_api/helpers/email.py +++ b/backend/src/xfd_django/xfd_api/helpers/email.py @@ -34,8 +34,10 @@ def send_invite_email(email, organization=None): frontend_domain = settings.FRONTEND_DOMAIN reply_to = settings.CROSSFEED_SUPPORT_EMAIL_REPLYTO - org_name_part = f"the {organization.name} organization on " if organization else "" - message = f""" + org_name_part = ( + "the {} organization on ".format(organization.name) if organization else "" + ) + message = """ Hi there, You've been invited to join {org_name_part}CyHy Dashboard. To accept the invitation and start using CyHy Dashboard, sign on at {frontend_domain}/signup. @@ -52,7 +54,9 @@ def send_invite_email(email, organization=None): For more information on using CyHy Dashboard, view the CyHy Dashboard user guide at https://docs.crossfeed.cyber.dhs.gov/user-guide/quickstart/. If you encounter any difficulties, please feel free to reply to this email (or send an email to {reply_to}). - """ + """.format( + org_name_part=org_name_part, frontend_domain=frontend_domain, reply_to=reply_to + ) send_email(email, "CyHy Dashboard Invitation", message) @@ -73,9 +77,9 @@ def send_email(recipient, subject, body): try: ses_client.send_email(**email_params) - print(f"Email sent to {recipient}") + print("Email sent to {}".format(recipient)) except ClientError as e: - print(f"Error sending email: {e}") + print("Error sending email: {}".format(e)) def send_registration_approved_email( diff --git a/backend/src/xfd_django/xfd_api/helpers/filter_helpers.py b/backend/src/xfd_django/xfd_api/helpers/filter_helpers.py index 3366e542f..598d23439 100644 --- a/backend/src/xfd_django/xfd_api/helpers/filter_helpers.py +++ b/backend/src/xfd_django/xfd_api/helpers/filter_helpers.py @@ -6,6 +6,20 @@ from ..models import Vulnerability from ..schema_models.vulnerability import VulnerabilityFilters +# Define the severity levels +SEVERITY_LEVELS = ["Low", "Medium", "High", "Critical"] +NULL_VALUES = ["None", "Null", "N/A", "Undefined", ""] + + +def format_severity(severity: str) -> str: + """Format severity to classify as 'N/A', standard severity, or 'Other'.""" + if severity is None or severity in NULL_VALUES: + return "N/A" + elif severity.title() in SEVERITY_LEVELS: + return severity.title() + else: + return "Other" + def sort_direction(sort, order): """ @@ -100,7 +114,34 @@ def apply_vuln_filters( # Partial match on severity if vulnerability_filters.severity: - q &= Q(severity__icontains=vulnerability_filters.severity) + severity_category = format_severity(vulnerability_filters.severity) + + if severity_category == "N/A": + q &= ( + Q(severity=None) + | Q(severity__icontains="none") + | Q(severity__icontains="null") + | Q(severity__icontains="n/a") + | Q(severity__icontains="undefined") + | Q(severity="") + ) + + elif severity_category == "Other": + q &= ~( + Q(severity=None) + | Q(severity__icontains="none") + | Q(severity__icontains="null") + | Q(severity__icontains="undefined") + | Q(severity="") + | Q(severity__icontains="N/A") + | Q(severity__icontains="Low") + | Q(severity__icontains="Medium") + | Q(severity__icontains="High") + | Q(severity__icontains="Critical") + ) + + elif severity_category in SEVERITY_LEVELS: + q &= Q(severity__icontains=severity_category) # Partial match on cpe if vulnerability_filters.cpe: diff --git a/backend/src/xfd_django/xfd_api/helpers/s3_client.py b/backend/src/xfd_django/xfd_api/helpers/s3_client.py index 1d6e3b9c6..f42c0a0a8 100644 --- a/backend/src/xfd_django/xfd_api/helpers/s3_client.py +++ b/backend/src/xfd_django/xfd_api/helpers/s3_client.py @@ -39,7 +39,9 @@ def __init__(self, is_local=None): def save_csv(self, body, name=""): """Save a CSV file in S3 and returns a temporary URL for access.""" try: - key = f"{random.random()}/{name}-{datetime.utcnow().isoformat()}.csv" + key = "{}/{}-{}.csv".format( + random.random(), name, datetime.utcnow().isoformat() + ) bucket = os.getenv("EXPORT_BUCKET_NAME") # Save CSV to S3 @@ -61,7 +63,7 @@ def save_csv(self, body, name=""): def export_report(self, report_name, org_id): """Generate a presigned URL for a report.""" try: - key = f"{org_id}/{report_name}" + key = "{}/{}".format(org_id, report_name) bucket = os.getenv("REPORTS_BUCKET_NAME") url = self.s3.generate_presigned_url( @@ -78,7 +80,7 @@ def list_reports(self, org_id): """List all reports in a specified organization's folder.""" try: bucket = os.getenv("REPORTS_BUCKET_NAME") - prefix = f"{org_id}/" + prefix = "{}/".format(org_id) response = self.s3.list_objects_v2( Bucket=bucket, Prefix=prefix, Delimiter="" @@ -95,9 +97,9 @@ def pull_daily_vs(self, filename): try: response = self.s3.head_object(Bucket=bucket, Key=filename) if response: - print(f"File '{filename}' exists in bucket {bucket}.") + print("File '{}' exists in bucket {}.".format(filename, bucket)) except self.s3.exceptions.NoSuchKey: - print(f"File '{filename}' does not exist in bucket {bucket}.") + print("File '{}' does not exist in bucket {}.".format(filename, bucket)) return None except ClientError as e: print("Error checking for file in S3: %s", e) diff --git a/backend/src/xfd_django/xfd_api/helpers/stats_helpers.py b/backend/src/xfd_django/xfd_api/helpers/stats_helpers.py index fb7cead76..6fe9ab80a 100644 --- a/backend/src/xfd_django/xfd_api/helpers/stats_helpers.py +++ b/backend/src/xfd_django/xfd_api/helpers/stats_helpers.py @@ -22,7 +22,9 @@ async def get_stats_count_from_cache(redis_client, redis_key_prefix, filtered_or aggregated_stats = defaultdict(int) # Fetch data from Redis by organization ID - redis_keys = [f"{redis_key_prefix}:{org_id}" for org_id in filtered_org_ids] + redis_keys = [ + "{}:{}".format(redis_key_prefix, org_id) for org_id in filtered_org_ids + ] redis_responses = await asyncio.gather( *(redis_client.get(redis_key) for redis_key in redis_keys), return_exceptions=True, @@ -34,7 +36,14 @@ async def get_stats_count_from_cache(redis_client, redis_key_prefix, filtered_or if response: stats_list = json.loads(response) for stat in stats_list: - aggregated_stats[stat["id"]] += stat["value"] + stat_id = stat["id"] + # Handle the case where the stat ID is None. + # None/Null values come from Redis as "0" and cannot be incremented. + if stat_id in [None, "None"]: + stat_id = "None" + if stat["value"] == 0: + stat["value"] = 1 + aggregated_stats[stat_id] += stat["value"] return [ {"id": stat_id, "value": value, "label": stat_id} @@ -92,18 +101,18 @@ def populate_stats_cache( # Store stats in Redis for group_id, data in stats_by_group.items(): - redis_key = f"{redis_key_prefix}:{group_id}" + redis_key = "{}:{}".format(redis_key_prefix, group_id) redis_client.set(redis_key, json.dumps(data)) return { "status": "success", - "message": f"Cache populated successfully for {redis_key_prefix}.", + "message": "Cache populated successfully for {}.".format(redis_key_prefix), } except Exception as e: return { "status": "error", - "message": f"An unexpected error occurred: {e}", + "message": "An unexpected error occurred: {}".format(e), } @@ -119,5 +128,5 @@ async def get_total_count(filtered_org_ids): return total_count except Exception as e: - print(f"Unexpected error fetching total count: {e}") + print("Unexpected error fetching total count: {}".format(e)) return 0 diff --git a/backend/src/xfd_django/xfd_api/login_gov.py b/backend/src/xfd_django/xfd_api/login_gov.py index 2bc3362ac..9b9ad52cc 100644 --- a/backend/src/xfd_django/xfd_api/login_gov.py +++ b/backend/src/xfd_django/xfd_api/login_gov.py @@ -16,7 +16,7 @@ try: jwk_set = {"keys": [json.loads(os.getenv("LOGIN_GOV_JWT_KEY", ""))]} except Exception as error: - print(f"Error: {error}") + print("Error: {}".format(error)) jwk_set = {"keys": [{}]} # OpenID Connect Client Configuration @@ -46,12 +46,12 @@ def login(): state = random_string(32) # Create authorization URL - authorization_url = ( - f"{config['authorization_endpoint']}?response_type=code" - f"&client_id={client_options['client_id']}" - f"&redirect_uri={client_options['redirect_uris'][0]}" - f"&scope=openid+email" - f"&nonce={nonce}&state={state}&prompt=select_account" + authorization_url = "{}?response_type=code&client_id={}&redirect_uri={}&scope=openid+email&nonce={}&state={}&prompt=select_account".format( + config["authorization_endpoint"], + client_options["client_id"], + client_options["redirect_uris"][0], + nonce, + state, ) return {"url": authorization_url, "state": state, "nonce": nonce} @@ -90,5 +90,5 @@ def callback(body): # Decode the ID token without verifying the signature # (optional depending on your security model) decoded_token = jwt.decode(id_token, options={"verify_signature": False}) - print(f"Decoded Token from login_gov: {decoded_token}") + print("Decoded Token from login_gov: {}".format(decoded_token)) return decoded_token diff --git a/backend/src/xfd_django/xfd_api/management/commands/local_scan_execution.py b/backend/src/xfd_django/xfd_api/management/commands/local_scan_execution.py index 7adb5b004..6f86b59e3 100644 --- a/backend/src/xfd_django/xfd_api/management/commands/local_scan_execution.py +++ b/backend/src/xfd_django/xfd_api/management/commands/local_scan_execution.py @@ -35,7 +35,7 @@ def handle(self, *args, **options): desired_count = options["desired_count"] api_key_list = options["api_key_list"] org_list = options.get("org_list", []) - queue = options.get("queue", f"staging-{scan_type}-queue") + queue = options.get("queue", "staging-{}-queue".format(scan_type)) if not org_list: self.stdout.write(self.style.ERROR("Organization list cannot be empty.")) @@ -76,7 +76,7 @@ def send_message_to_queue(message, queue): # Close the connection connection.close() except Exception as e: - print(f"Error sending message to queue {queue}: {e}") + print("Error sending message to queue {}: {}".format(queue, e)) @staticmethod def local_scan_execution(scan_type, desired_count, api_key_list=""): diff --git a/backend/src/xfd_django/xfd_api/management/commands/syncdb.py b/backend/src/xfd_django/xfd_api/management/commands/syncdb.py index c029f718c..0338512a9 100644 --- a/backend/src/xfd_django/xfd_api/management/commands/syncdb.py +++ b/backend/src/xfd_django/xfd_api/management/commands/syncdb.py @@ -3,6 +3,7 @@ from django.core.management.base import BaseCommand from xfd_api.tasks.searchSync import handler as sync_es_domains from xfd_api.tasks.syncdb_helpers import ( + create_scan_user, drop_all_tables, manage_elasticsearch_indices, populate_sample_data, @@ -48,7 +49,11 @@ def handle(self, *args, **options): # Step 2: Elasticsearch Index Management manage_elasticsearch_indices(dangerouslyforce) - # Step 3: Populate Sample Data + # Step 3: Create the scanning user if doesn't exist + self.stdout.write("Creating and configuring the scanning user...") + create_scan_user() + + # Step 4: Populate Sample Data if populate: self.stdout.write("Populating the database with sample data...") populate_sample_data() diff --git a/backend/src/xfd_django/xfd_api/models.py b/backend/src/xfd_django/xfd_api/models.py index 3f8916d9d..f0297f669 100644 --- a/backend/src/xfd_django/xfd_api/models.py +++ b/backend/src/xfd_django/xfd_api/models.py @@ -582,7 +582,7 @@ class User(models.Model): def save(self, *args, **kwargs): """Save user with fullName.""" - self.fullName = f"{self.firstName} {self.lastName}" + self.fullName = "{} {}".format(self.firstName, self.lastName) super().save(*args, **kwargs) class Meta: diff --git a/backend/src/xfd_django/xfd_api/tasks/bastion.py b/backend/src/xfd_django/xfd_api/tasks/bastion.py index e7f13ec68..350ed4458 100644 --- a/backend/src/xfd_django/xfd_api/tasks/bastion.py +++ b/backend/src/xfd_django/xfd_api/tasks/bastion.py @@ -27,7 +27,7 @@ def handler(event, context): elif mode == "es": return handle_es_query(query) else: - return {"statusCode": 400, "body": f"Unsupported mode: {mode}"} + return {"statusCode": 400, "body": "Unsupported mode: {}".format(mode)} except Exception as e: return {"statusCode": 500, "body": str(e)} @@ -50,4 +50,7 @@ def handle_es_query(query): client.delete_all() return {"statusCode": 200, "body": "Index successfully deleted."} else: - return {"statusCode": 400, "body": f"Unsupported Elasticsearch query: {query}"} + return { + "statusCode": 400, + "body": "Unsupported Elasticsearch query: {}".format(query), + } diff --git a/backend/src/xfd_django/xfd_api/tasks/checkUserExpiration.py b/backend/src/xfd_django/xfd_api/tasks/checkUserExpiration.py index b6300f3b9..3c394a287 100644 --- a/backend/src/xfd_django/xfd_api/tasks/checkUserExpiration.py +++ b/backend/src/xfd_django/xfd_api/tasks/checkUserExpiration.py @@ -39,17 +39,19 @@ def check_user_expiration(): # Notify users of inactivity (30 days) for user in users_to_notify: subject = "Account Inactivity Notice" - body = f""" - Hello {user.firstName} {user.lastName}, + body = """ + Hello {firstName} {lastName}, Your account has been inactive for over 30 days. If your account reaches 45 days of inactivity, your password will be reset, requiring action to reactivate your account. Thank you, The Crossfeed Team - """ + """.format( + firstName=user.firstName, lastName=user.lastName + ) send_email(user.email, subject, body) - print(f"30-day inactivity notice sent to {user.email}.") + print("30-day inactivity notice sent to {}.".format(user.email)) # Users to deactivate (45 days of inactivity) users_to_deactivate = User.objects.filter( @@ -58,8 +60,8 @@ def check_user_expiration(): for user in users_to_deactivate: subject = "Account Deactivation Notice" - body = f""" - Hello {user.firstName} {user.lastName}, + body = """ + Hello {firstName} {lastName}, Your account has been inactive for over 45 days. As a result, your password has been reset. You will need to set a new password the next time you log in. If your account reaches 90 days of inactivity, @@ -67,7 +69,9 @@ def check_user_expiration(): Thank you, The Crossfeed Team - """ + """.format( + firstName=user.firstName, lastName=user.lastName + ) # Send inactivity notification send_email(user.email, subject, body) @@ -79,24 +83,30 @@ def check_user_expiration(): Password=os.getenv("REACT_APP_RANDOM_PASSWORD"), Permanent=False, ) - print(f"Password reset for user {user.email} due to 45 days of inactivity.") + print( + "Password reset for user {} due to 45 days of inactivity.".format( + user.email + ) + ) except ClientError as e: - print(f"Error resetting password for {user.email}: {e}") + print("Error resetting password for {}: {}".format(user.email, e)) # Users to remove (90 days of inactivity) users_to_remove = User.objects.filter(lastLoggedIn__lt=cutoff_90_days) for user in users_to_remove: subject = "Account Removal Notice" - body = f""" - Hello {user.firstName} {user.lastName}, + body = """ + Hello {firstName} {lastName}, Your account has been inactive for over 90 days and has been removed. You will need to recreate your account if you wish to use our services again. Thank you, The Crossfeed Team - """ + """.format( + firstName=user.firstName, lastName=user.lastName + ) # Notify user of account removal send_email(user.email, subject, body) @@ -107,15 +117,17 @@ def check_user_expiration(): UserPoolId=user_pool_id, Username=user.cognitoId, ) - print(f"Removed user {user.email} from Cognito.") + print("Removed user {} from Cognito.".format(user.email)) # Remove from database user.delete() print( - f"Removed user {user.email} from the database due to 90 days of inactivity." + "Removed user {} from the database due to 90 days of inactivity.".format( + user.email + ) ) except ClientError as e: - print(f"Error removing user {user.email}: {e}") + print("Error removing user {}: {}".format(user.email, e)) def handler(event, context): @@ -127,5 +139,5 @@ def handler(event, context): "body": "User expiration check completed successfully.", } except Exception as e: - print(f"Error during user expiration check: {e}") + print("Error during user expiration check: {}".format(e)) return {"statusCode": 500, "body": str(e)} diff --git a/backend/src/xfd_django/xfd_api/tasks/cveSync.py b/backend/src/xfd_django/xfd_api/tasks/cveSync.py index a8d90aa35..8d0f6c0c6 100644 --- a/backend/src/xfd_django/xfd_api/tasks/cveSync.py +++ b/backend/src/xfd_django/xfd_api/tasks/cveSync.py @@ -34,7 +34,9 @@ def main(): task_request = fetch_cve_data(page) if not task_request or task_request.get("status") != "Processing": raise Exception( - f"Error: {task_request.get('error')} - Status: {task_request.get('status')}" + "Error: {} - Status: {}".format( + task_request.get("error"), task_request.get("status") + ) ) while task_request.get("status") == "Processing": @@ -53,13 +55,15 @@ def main(): page += 1 else: raise Exception( - f"Task error: {task_request.get('error')} - Status: {task_request.get('status')}" + "Task error: {} - Status: {}".format( + task_request.get("error"), task_request.get("status") + ) ) def fetch_cve_data(page): """Fetch CVE data for a specific page.""" - print(f"Fetching CVE data for page {page}") + print("Fetching CVE data for page {}".format(page)) headers = { "X-API-KEY": os.getenv("CF_API_KEY"), "access_token": os.getenv("PE_API_KEY"), @@ -77,13 +81,15 @@ def fetch_cve_data(page): response.raise_for_status() return response.json() except requests.exceptions.RequestException as e: - print(f"Error fetching CVE data: {e}") + print("Error fetching CVE data: {}".format(e)) return None def fetch_cve_data_task(task_id): """Fetch task result for CVE data.""" - url = f"https://api.staging-cd.crossfeed.cyber.dhs.gov/pe/apiv1/cves_by_modified_date/task/{task_id}" + url = "https://api.staging-cd.crossfeed.cyber.dhs.gov/pe/apiv1/cves_by_modified_date/task/{}".format( + task_id + ) headers = { "X-API-KEY": os.getenv("CF_API_KEY"), "access_token": os.getenv("PE_API_KEY"), @@ -95,7 +101,7 @@ def fetch_cve_data_task(task_id): response.raise_for_status() return response.json() except requests.exceptions.RequestException as e: - print(f"Error fetching CVE task data: {e}") + print("Error fetching CVE task data: {}".format(e)) return None @@ -134,7 +140,7 @@ def save_cpes_to_db(cpes): ) cpe_ids.append(cpe_obj.id) except Exception as e: - print(f"Error saving CPE: {e}") + print("Error saving CPE: {}".format(e)) return cpe_ids @@ -159,4 +165,4 @@ def save_cve_to_db(cve, cpe_ids): cve_obj.cpes.add(*cpe_ids) cve_obj.save() except Exception as e: - print(f"Error saving CVE: {e}") + print("Error saving CVE: {}".format(e)) diff --git a/backend/src/xfd_django/xfd_api/tasks/ecs_client.py b/backend/src/xfd_django/xfd_api/tasks/ecs_client.py index 8d3f88056..977c2e035 100644 --- a/backend/src/xfd_django/xfd_api/tasks/ecs_client.py +++ b/backend/src/xfd_django/xfd_api/tasks/ecs_client.py @@ -54,7 +54,12 @@ def run_command(self, command_options): # Run the command in a local Docker container try: container_name = to_snake_case( - f"crossfeed_worker_{'global' if global_scan else organization_name}_{scan_name}_{int(os.urandom(4).hex(), 16)}" + "crossfeed_worker_{global_str}_{organization}_{scan}_{random}".format( + global_str="global" if global_scan else organization_name, + organization=organization_name, + scan=scan_name, + random=int(os.urandom(4).hex(), 16), + ) ) container = self.docker.containers.run( "crossfeed-worker", @@ -143,7 +148,7 @@ def run_command(self, command_options): }, { "name": "NODE_OPTIONS", - "value": f"--max_old_space_size={memory}" + "value": "--max_old_space_size={}".format(memory) if memory else "", }, @@ -164,7 +169,7 @@ def get_logs(self, fargate_task_arn): # Process and return the logs return "\n".join(line for line in log_stream.decode("utf-8").splitlines()) else: - log_stream_name = f"worker/main/{fargate_task_arn.split('/')[-1]}" + log_stream_name = "worker/main/{}".format(fargate_task_arn.split("/")[-1]) # Fetch logs from AWS CloudWatch response = self.cloudwatch_logs.get_log_events( @@ -180,7 +185,12 @@ def get_logs(self, fargate_task_arn): # Format the logs as "timestamp message" formatted_logs = "\n".join( - f"{datetime.utcfromtimestamp(event['timestamp'] / 1000).isoformat(timespec='seconds')} {event['message']}" + "{} {}".format( + datetime.fromtimestamp( + event["timestamp"] / 1000, datetime.timezone.utc + ).isoformat(timespec="seconds"), + event["message"], + ) for event in events ) return formatted_logs diff --git a/backend/src/xfd_django/xfd_api/tasks/elasticache_tasks.py b/backend/src/xfd_django/xfd_api/tasks/elasticache_tasks.py index 164dc3b64..b63d2c8d2 100644 --- a/backend/src/xfd_django/xfd_api/tasks/elasticache_tasks.py +++ b/backend/src/xfd_django/xfd_api/tasks/elasticache_tasks.py @@ -114,7 +114,7 @@ def populate_latest_vulns_cache(event, context): # Store each organization's vulnerabilities in Redis for org_id, data in vulnerabilities_by_org.items(): - redis_key = f"latest_vulnerabilities:{org_id}" + redis_key = "latest_vulnerabilities:{}".format(org_id) redis_client.set(redis_key, json.dumps(data)) return { @@ -125,7 +125,9 @@ def populate_latest_vulns_cache(event, context): except Exception as e: return { "status": "error", - "message": f"An unexpected error occurred while populating the cache: {e}", + "message": "An unexpected error occurred while populating the cache: {}".format( + e + ), } @@ -171,7 +173,7 @@ def populate_most_common_vulns_cache(event, context): # Store each organization's vulnerabilities in Redis for org_id, data in vulnerabilities_by_org.items(): - redis_key = f"most_common_vulnerabilities:{org_id}" + redis_key = "most_common_vulnerabilities:{}".format(org_id) redis_client.set(redis_key, json.dumps(data)) return { @@ -182,7 +184,9 @@ def populate_most_common_vulns_cache(event, context): except Exception as e: return { "status": "error", - "message": f"An unexpected error occurred while populating the cache: {e}", + "message": "An unexpected error occurred while populating the cache: {}".format( + e + ), } @@ -235,7 +239,7 @@ def populate_by_org_cache(event, context): for vuln in vulnerabilities: org_id = str(vuln["domain__organization__id"]) org_name = vuln["domain__organization__name"] - redis_key = f"by_org_stats:{org_id}" + redis_key = "by_org_stats:{}".format(org_id) data = { "id": org_name, # Organization name as "id" "orgId": org_id, # Organization ID @@ -252,5 +256,7 @@ def populate_by_org_cache(event, context): except Exception as e: return { "status": "error", - "message": f"An unexpected error occurred while populating the cache: {e}", + "message": "An unexpected error occurred while populating the cache: {}".format( + e + ), } diff --git a/backend/src/xfd_django/xfd_api/tasks/es_client.py b/backend/src/xfd_django/xfd_api/tasks/es_client.py index 3cad3e97f..17871615b 100644 --- a/backend/src/xfd_django/xfd_api/tasks/es_client.py +++ b/backend/src/xfd_django/xfd_api/tasks/es_client.py @@ -1,5 +1,6 @@ """ES client.""" # Standard Python Libraries +import logging import os # Third-Party Libraries @@ -37,7 +38,7 @@ def sync_organizations_index(self): """Create or updates the organizations index with mappings.""" try: if not self.client.indices.exists(index=ORGANIZATIONS_INDEX): - print(f"Creating index {ORGANIZATIONS_INDEX}...") + logging.info("Creating index %s...", ORGANIZATIONS_INDEX) self.client.indices.create( index=ORGANIZATIONS_INDEX, body={ @@ -46,19 +47,19 @@ def sync_organizations_index(self): }, ) else: - print(f"Updating index {ORGANIZATIONS_INDEX}...") + logging.info("Updating index %s...", ORGANIZATIONS_INDEX) self.client.indices.put_mapping( index=ORGANIZATIONS_INDEX, body=organization_mapping ) except Exception as e: - print(f"Error syncing organizations index: {e}") + logging.error("Error syncing organizations index: %s", e) raise e def sync_domains_index(self): """Create or updates the domains index with mappings.""" try: if not self.client.indices.exists(index=DOMAINS_INDEX): - print(f"Creating index {DOMAINS_INDEX}...") + logging.info("Creating index %s...", DOMAINS_INDEX) self.client.indices.create( index=DOMAINS_INDEX, body={ @@ -67,7 +68,7 @@ def sync_domains_index(self): }, ) else: - print(f"Updating index {DOMAINS_INDEX}...") + logging.info("Updating index %s...", DOMAINS_INDEX) self.client.indices.put_mapping( index=DOMAINS_INDEX, body=domain_mapping ) @@ -76,7 +77,7 @@ def sync_domains_index(self): index=DOMAINS_INDEX, body={"settings": {"refresh_interval": "1800s"}} ) except Exception as e: - print(f"Error syncing domains index: {e}") + logging.error("Error syncing domains index: %s", e) raise e def update_organizations(self, organizations): @@ -117,7 +118,7 @@ def update_webpages(self, webpages): { "_op_type": "update", "_index": DOMAINS_INDEX, - "_id": f"webpage_{webpage['webpage_id']}", + "_id": "webpage_{}".format(webpage["webpage_id"]), "routing": webpage["webpage_domainId"], "doc": { **webpage, @@ -139,7 +140,7 @@ def delete_all(self): print("Deleting all indices...") self.client.indices.delete(index="*") except Exception as e: - print(f"Error deleting all indices: {e}") + logging.error("Error deleting all indices: %s", e) raise e def search_domains(self, body): @@ -156,15 +157,17 @@ def _bulk_update(self, actions): success_count, response = helpers.bulk( self.client, actions, raise_on_error=False ) - print(f"Bulk operation success count: {success_count}") + logging.info("Bulk operation success count: %s", success_count) for idx, item in enumerate(response): if "update" in item and item["update"].get("error"): - print(f"Error indexing document {idx}: {item['update']['error']}") + logging.error( + "Error indexing document %s: %s", idx, item["update"]["error"] + ) else: - print(f"Successfully indexed document {idx}: {item}") + logging.info("Successfully indexed document %s: %s", idx, item) self.client.indices.refresh(index="domains-5") except Exception as e: - print(f"Bulk operation error: {e}") + logging.error("Bulk operation error: %s", e) raise e diff --git a/backend/src/xfd_django/xfd_api/tasks/flagFloatingIps.py b/backend/src/xfd_django/xfd_api/tasks/flagFloatingIps.py index 46f40a3f9..6c399e62e 100644 --- a/backend/src/xfd_django/xfd_api/tasks/flagFloatingIps.py +++ b/backend/src/xfd_django/xfd_api/tasks/flagFloatingIps.py @@ -23,7 +23,7 @@ async def check_ip_in_cidr(ip: str, acronym: str) -> bool: network__contains=ip, id__in=organization.cidrs.values_list("id", flat=True) ).exists() except Exception as e: - print(f"Error checking IP in CIDR: {e}") + print("Error checking IP in CIDR: {}".format(e)) return False @@ -52,7 +52,7 @@ def is_executive(organization: Organization) -> bool: # Check if the organization or any of its parents belong to the EXECUTIVE sector return is_executive(organization) except Exception as e: - print(f"Error checking organization is FCEB: {e}") + print("Error checking organization is FCEB: {}".format(e)) return False @@ -61,7 +61,7 @@ async def handler(command_options): organization_id = command_options.get("organizationId") organization_name = command_options.get("organizationName") - print(f"Running flagFloatingIps for {organization_name}...") + print("Running flagFloatingIps for {}...".format(organization_name)) try: # Fetch organization with related domains @@ -74,7 +74,7 @@ async def handler(command_options): ) for organization in organizations: - print(f"Processing organization: {organization_name}...") + print("Processing organization: {}...".format(organization_name)) # Check if the organization is executive (isFceb) is_executive = await check_org_is_fceb(organization.acronym) @@ -85,7 +85,9 @@ async def handler(command_options): Domain.objects.filter( id__in=[domain.id for domain in domains_to_update] ).update(isFceb=True) - print(f"Marked all domains in {organization_name} as isFceb=True.") + print( + "Marked all domains in {} as isFceb=True.".format(organization_name) + ) else: # Update domains' fromCidr status for domain in organization.domains.all(): @@ -96,9 +98,13 @@ async def handler(command_options): if domain.fromCidr != from_cidr: domain.fromCidr = from_cidr domain.save() # Save domain only if `fromCidr` changes - print(f"Updated domain {domain.name}: fromCidr={from_cidr}") + print( + "Updated domain {}: fromCidr={}".format( + domain.name, from_cidr + ) + ) - print(f"Completed processing for organization: {organization_name}.") + print("Completed processing for organization: {}.".format(organization_name)) except Exception as e: - print(f"Error processing organization {organization_name}: {e}") + print("Error processing organization {}: {}".format(organization_name, e)) diff --git a/backend/src/xfd_django/xfd_api/tasks/lambda_client.py b/backend/src/xfd_django/xfd_api/tasks/lambda_client.py index 11ec81986..27e94c0e7 100644 --- a/backend/src/xfd_django/xfd_api/tasks/lambda_client.py +++ b/backend/src/xfd_django/xfd_api/tasks/lambda_client.py @@ -24,7 +24,7 @@ def __init__(self): def run_command(self, name: str): """Invoke a lambda function with the given name.""" - print(f"Invoking lambda function: {name}") + print("Invoking lambda function: {}".format(name)) if self.is_local: # If running locally, directly call the scheduler function scheduler({}, {}) diff --git a/backend/src/xfd_django/xfd_api/tasks/run_syncdb.py b/backend/src/xfd_django/xfd_api/tasks/run_syncdb.py index ac01356ea..775066101 100644 --- a/backend/src/xfd_django/xfd_api/tasks/run_syncdb.py +++ b/backend/src/xfd_django/xfd_api/tasks/run_syncdb.py @@ -55,8 +55,8 @@ def handler(event, context): "body": "Database synchronization completed successfully.", } except Exception as e: - print(f"Error during syncdb: {str(e)}") + print("Error during syncdb: {}".format(str(e))) return { "statusCode": 500, - "body": f"Database synchronization failed: {str(e)}", + "body": "Database synchronization failed: {}".format(str(e)), } diff --git a/backend/src/xfd_django/xfd_api/tasks/run_syncmdl.py b/backend/src/xfd_django/xfd_api/tasks/run_syncmdl.py new file mode 100644 index 000000000..e01b98024 --- /dev/null +++ b/backend/src/xfd_django/xfd_api/tasks/run_syncmdl.py @@ -0,0 +1,32 @@ +"""Run syncmdl.""" +# Standard Python Libraries +import os + +# Third-Party Libraries +import django +from django.core.management import call_command + +# Set the Django settings module +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xfd_django.settings") +os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true" + +# Initialize Django +django.setup() + + +def handler(event, context): + """Trigger syncmdl.""" + dangerouslyforce = event.get("dangerouslyforce", False) + + try: + call_command("syncmdl", dangerouslyforce=dangerouslyforce) + return { + "statusCode": 200, + "body": "Database synchronization completed successfully.", + } + except Exception as e: + print("Error during syncmdl: {}".format(str(e))) + return { + "statusCode": 500, + "body": "Database synchronization failed: {}".format(str(e)), + } diff --git a/backend/src/xfd_django/xfd_api/tasks/scanExecution.py b/backend/src/xfd_django/xfd_api/tasks/scanExecution.py index 461a715a3..53dd36a76 100644 --- a/backend/src/xfd_django/xfd_api/tasks/scanExecution.py +++ b/backend/src/xfd_django/xfd_api/tasks/scanExecution.py @@ -49,7 +49,7 @@ def to_snake_case(input_string): def start_desired_tasks(scan_type, desired_count, shodan_api_keys=None): """Start the desired number of tasks on AWS ECS or local Docker based on configuration.""" shodan_api_keys = shodan_api_keys or [] - queue_url = f"{QUEUE_URL}{scan_type}-queue" + queue_url = "{}{}-queue".format(QUEUE_URL, scan_type) batch_size = 1 if scan_type == "shodan" else 10 remaining_count = desired_count @@ -96,9 +96,9 @@ def start_desired_tasks(scan_type, desired_count, shodan_api_keys=None): ] }, ) - print(f"Tasks started: {current_batch_count}") + print("Tasks started: {}".format(current_batch_count)) except ClientError as e: - print(f"Error starting tasks: {e}") + print("Error starting tasks: {}".format(e)) raise e remaining_count -= current_batch_count @@ -109,7 +109,9 @@ def start_local_containers(count, scan_type, queue_url, shodan_api_key=""): for i in range(count): try: container_name = to_snake_case( - f"crossfeed_worker_{scan_type}_{i}_{random.randint(1, 10_000_000)}" + "crossfeed_worker_{}_{}_{}".format( + scan_type, i, random.randint(1, 10_000_000) + ) ) container = docker.containers.create( name=container_name, @@ -118,25 +120,25 @@ def start_local_containers(count, scan_type, queue_url, shodan_api_key=""): mem_limit="4g", detach=True, environment=[ - f"DB_DIALECT={os.getenv('DB_DIALECT')}", - f"DB_HOST={os.getenv('DB_HOST')}", + "DB_DIALECT={}".format(os.getenv("DB_DIALECT")), + "DB_HOST={}".format(os.getenv("DB_HOST")), "IS_LOCAL=true", - f"DB_PORT={os.getenv('DB_PORT')}", - f"DB_NAME={os.getenv('DB_NAME')}", - f"DB_USERNAME={os.getenv('DB_USERNAME')}", - f"DB_PASSWORD={os.getenv('DB_PASSWORD')}", - f"SERVICE_QUEUE_URL={queue_url}", - f"SERVICE_TYPE={scan_type}", - f"PE_SHODAN_API_KEYS={shodan_api_key}", - f"WHOIS_XML_KEY={os.getenv('WHOIS_XML_KEY')}", - f"QUALYS_USERNAME={os.getenv('QUALYS_USERNAME')}", - f"QUALYS_PASSWORD={os.getenv('QUALYS_PASSWORD')}", + "DB_PORT={}".format(os.getenv("DB_PORT")), + "DB_NAME={}".format(os.getenv("DB_NAME")), + "DB_USERNAME={}".format(os.getenv("DB_USERNAME")), + "DB_PASSWORD={}".format(os.getenv("DB_PASSWORD")), + "SERVICE_QUEUE_URL={}".format(queue_url), + "SERVICE_TYPE={}".format(scan_type), + "PE_SHODAN_API_KEYS={}".format(shodan_api_key), + "WHOIS_XML_KEY={}".format(os.getenv("WHOIS_XML_KEY")), + "QUALYS_USERNAME={}".format(os.getenv("QUALYS_USERNAME")), + "QUALYS_PASSWORD={}".format(os.getenv("QUALYS_PASSWORD")), ], ) container.start() - print(f"Started container: {container_name}") + print("Started container: {}".format(container_name)) except Exception as e: - print(f"Error starting container {i}: {e}") + print("Error starting container {}: {}".format(i, e)) def handler(event, context): @@ -171,5 +173,5 @@ def handler(event, context): return {"statusCode": 200, "body": "Tasks started successfully."} except Exception as e: - print(f"Error in handler: {e}") + print("Error in handler: {}".format(e)) return {"statusCode": 500, "body": json.dumps(str(e))} diff --git a/backend/src/xfd_django/xfd_api/tasks/scheduler.py b/backend/src/xfd_django/xfd_api/tasks/scheduler.py index e94731229..2e510b896 100644 --- a/backend/src/xfd_django/xfd_api/tasks/scheduler.py +++ b/backend/src/xfd_django/xfd_api/tasks/scheduler.py @@ -49,8 +49,8 @@ def initialize(self, scans, organizations, queued_scan_tasks, orgs_per_scan_task self.orgs_per_scan_task = orgs_per_scan_task self.num_existing_tasks = self.ecs.get_num_tasks() - print(f"Number of running Fargate tasks: {self.num_existing_tasks}") - print(f"Number of queued scan tasks: {len(self.queued_scan_tasks)}") + print("Number of running Fargate tasks: {}".format(self.num_existing_tasks)) + print("Number of queued scan tasks: {}".format(len(self.queued_scan_tasks))) def launch_single_scan_task( self, @@ -92,7 +92,9 @@ def launch_single_scan_task( scan_task.status = "queued" if not scan_task.queuedAt: scan_task.queuedAt = timezone.now() - print(f"Reached maximum concurrency, queueing scantask {scan_task.id}") + print( + "Reached maximum concurrency, queueing scantask {}".format(scan_task.id) + ) scan_task.save() return @@ -101,25 +103,29 @@ def launch_single_scan_task( result = self.ecs.run_command(command_options) if not result.get("tasks"): print( - f"Failed to start Fargate task for scan {scan.name}, failures: {result.get('failures')}" + "Failed to start Fargate task for scan {}, failures: {}".format( + scan.name, result.get("failures") + ) ) raise Exception( - f"Failed to start Fargate task for scan {scan.name}" + "Failed to start Fargate task for scan {}".format(scan.name) ) task_arn = result["tasks"][0]["taskArn"] scan_task.fargateTaskArn = task_arn print( - f"Successfully invoked scan {scan.name} with Fargate on {len(organizations)} organizations. Task ARN: {task_arn}" + "Successfully invoked scan {} with Fargate on {} organizations. Task ARN: {}".format( + scan.name, len(organizations), task_arn + ) ) else: - raise Exception(f"Invalid task type: {task_type}") + raise Exception("Invalid task type: {}".format(task_type)) scan_task.status = "requested" scan_task.requestedAt = timezone.now() self.num_launched_tasks += 1 except Exception as error: - print(f"Error invoking {scan.name} scan: {error}") + print("Error invoking {} scan: {}".format(scan.name, error)) scan_task.output = str(error) scan_task.status = "failed" scan_task.finishedAt = timezone.now() @@ -165,7 +171,7 @@ def run(self): prev_num_launched_tasks = self.num_launched_tasks if scan.name not in SCAN_SCHEMA: - print(f"Invalid scan name: {scan.name}") + print("Invalid scan name: {}".format(scan.name)) continue scan_schema = SCAN_SCHEMA[scan.name] diff --git a/backend/src/xfd_django/xfd_api/tasks/searchSync.py b/backend/src/xfd_django/xfd_api/tasks/searchSync.py index 10e36fbf0..b1eaed259 100644 --- a/backend/src/xfd_django/xfd_api/tasks/searchSync.py +++ b/backend/src/xfd_django/xfd_api/tasks/searchSync.py @@ -46,7 +46,7 @@ def handler(command_options): if domain_id: domain_queryset = domain_queryset.filter(id=domain_id) - print(f"Found {domain_queryset.count()} domains to sync.") + print("Found {} domains to sync.".format(domain_queryset.count())) # Chunk domains for processing for domain_chunk in chunked_queryset(domain_queryset, DOMAIN_CHUNK_SIZE): @@ -55,7 +55,7 @@ def handler(command_options): .select_related("organization") .prefetch_related("vulnerabilities", "services") ) - print(f"Syncing {len(domains)} domains...") + print("Syncing {} domains...".format(len(domains))) # Update Elasticsearch try: @@ -156,7 +156,7 @@ def handler(command_options): ] ) except Exception as e: - print(f"Error syncing domains to Elasticsearch: {e}") + print("Error syncing domains to Elasticsearch: {}".format(e)) continue # Mark domains as synced diff --git a/backend/src/xfd_django/xfd_api/tasks/syncdb_helpers.py b/backend/src/xfd_django/xfd_api/tasks/syncdb_helpers.py index 1c7f1238b..ade33a49e 100644 --- a/backend/src/xfd_django/xfd_api/tasks/syncdb_helpers.py +++ b/backend/src/xfd_django/xfd_api/tasks/syncdb_helpers.py @@ -59,7 +59,7 @@ def manage_elasticsearch_indices(dangerouslyforce): es_client.sync_domains_index() print("Elasticsearch indices synchronized.") except Exception as e: - print(f"Error managing Elasticsearch indices: {e}") + print("Error managing Elasticsearch indices: {}".format(e)) def populate_sample_data(): @@ -96,7 +96,7 @@ def create_sample_user(organization): user = User.objects.create( firstName="Sample", lastName="User", - email=f"user{random.randint(1, 1000)}@example.com", + email="user{}@example.com".format(random.randint(1, 1000)), userType=UserType.GLOBAL_ADMIN, state=random.choice(SAMPLE_STATES), regionId=random.choice(SAMPLE_REGION_IDS), @@ -125,7 +125,7 @@ def create_api_key_for_user(user): ) # Print the raw key for debugging or manual testing - print(f"Created API key for user {user.email}: {key}") + print("Created API key for user {}: {}".format(user.email, key)) def generate_random_name(): @@ -133,14 +133,14 @@ def generate_random_name(): adjective = random.choice(adjectives) noun = random.choice(nouns) entity = random.choice(["City", "County", "Agency", "Department"]) - return f"{adjective.capitalize()} {entity} {noun.capitalize()}" + return "{} {} {}".format(adjective.capitalize(), entity, noun.capitalize()) def create_sample_domain(organization): """Create a sample domain linked to an organization.""" - domain_name = ( - f"{random.choice(adjectives)}-{random.choice(nouns)}.crossfeed.local".lower() - ) + domain_name = "{}-{}.crossfeed.local".format( + random.choice(adjectives), random.choice(nouns) + ).lower() ip = ".".join(map(str, (random.randint(0, 255) for _ in range(4)))) return Domain.objects.create( name=domain_name, @@ -174,7 +174,30 @@ def create_sample_services_and_vulnerabilities(domain): domain=domain, service=None, description="Sample description", - severity=random.choice(["Low", "Medium", "High"]), + severity=random.choice( + [ + None, + "N/A", + "n/a", + "Null", + "null", + "Undefined", + "undefined", + "", + "Low", + "Medium", + "High", + "Critical", + "Other", + "!@#$%^&*()", + 1234, + "low", + "medium", + "high", + "critical", + "other", + ] + ), needsPopulation=True, state="open", substate="unconfirmed", @@ -211,7 +234,7 @@ def synchronize(target_app_label=None): ) # Get database name for 'connections': - # The 'connections' object gets all databases defined in setting.py + # The 'connections' object gets all databases defined in settings.py database = db_mapping.get(target_app_label, "default") print( "Synchronizing database schema for app '{}' in database '{}'...".format( @@ -224,7 +247,7 @@ def synchronize(target_app_label=None): # Step 1: Process models in dependency order ordered_models = get_ordered_models(target_app_label) for model in ordered_models: - print(f"Processing model: {model.__name__}") + print("Processing model: {}".format(model.__name__)) process_model(schema_editor, model, database) # Step 2: Handle Many-to-Many tables @@ -274,7 +297,7 @@ def get_ordered_models(target_app_label): print("Circular dependencies detected. Breaking cycles arbitrarily.") for model, deps in dependencies.items(): if deps: - print(f"Breaking dependency for model: {model.__name__}") + print("Breaking dependency for model: {}".format(model.__name__)) dependencies[model] = set() ordered.extend(dependencies.keys()) @@ -293,13 +316,13 @@ def process_model(schema_editor: BaseDatabaseSchemaEditor, model, database): table_exists = cursor.fetchone()[0] is not None if table_exists: - print(f"Updating table for model: {model.__name__}") + print("Updating table for model: {}".format(model.__name__)) update_table(schema_editor, model, database) else: - print(f"Creating table for model: {model.__name__}") + print("Creating table for model: {}".format(model.__name__)) schema_editor.create_model(model) except Exception as e: - print(f"Error processing model {model.__name__}: {e}") + print("Error processing model {}: {}".format(model.__name__, e)) def process_m2m_tables(schema_editor: BaseDatabaseSchemaEditor, models, database): @@ -310,15 +333,17 @@ def process_m2m_tables(schema_editor: BaseDatabaseSchemaEditor, models, database m2m_table_name = field.m2m_db_table() # Check if the M2M table exists - cursor.execute(f"SELECT to_regclass('{m2m_table_name}');") + cursor.execute("SELECT to_regclass('{}');".format(m2m_table_name)) table_exists = cursor.fetchone()[0] is not None if not table_exists: - print(f"Creating Many-to-Many table: {m2m_table_name}") + print("Creating Many-to-Many table: {}".format(m2m_table_name)) schema_editor.create_model(field.remote_field.through) else: print( - f"Many-to-Many table {m2m_table_name} already exists. Skipping." + "Many-to-Many table {} already exists. Skipping.".format( + m2m_table_name + ) ) @@ -339,13 +364,17 @@ def update_table(schema_editor: BaseDatabaseSchemaEditor, model, database): missing_columns = db_fields - existing_columns for field in model._meta.fields: if field.column in missing_columns: - print(f"Adding column '{field.column}' to table '{table_name}'") + print( + "Adding column '{}' to table '{}'".format(field.column, table_name) + ) schema_editor.add_field(model, field) # Remove extra columns extra_columns = existing_columns - db_fields for column in extra_columns: - print(f"Removing extra column '{column}' from table '{table_name}'") + print( + "Removing extra column '{}' from table '{}'".format(column, table_name) + ) try: # Safely quote table and column names safe_table_name = connections[database].ops.quote_name(table_name) @@ -357,7 +386,9 @@ def update_table(schema_editor: BaseDatabaseSchemaEditor, model, database): cursor.execute(query) except Exception as e: print( - f"Error dropping column '{column}' from table '{table_name}': {e}" + "Error dropping column '{}' from table '{}': {}".format( + column, table_name, e + ) ) @@ -406,12 +437,16 @@ def drop_all_tables(app_label=None): if app_label not in allowed_labels: raise ValueError( - f"Invalid 'app_label' provided. Must be one of: {', '.join(allowed_labels)}." + "Invalid 'app_label' provided. Must be one of: {}.".format( + ", ".join(allowed_labels) + ) ) database = db_mapping.get(app_label, "default") print( - f"Resetting database schema for app '{app_label}' in database '{database}'..." + "Resetting database schema for app '{}' in database '{}'...".format( + app_label, database + ) ) with connections[database].cursor() as cursor: @@ -424,7 +459,7 @@ def drop_all_tables(app_label=None): ) cursor.execute("GRANT ALL ON SCHEMA public TO public;") except Exception as e: - print(f"Error resetting schema: {e}") + print("Error resetting schema: {}".format(e)) print("Database schema reset successfully.") @@ -446,7 +481,7 @@ def sync_es_organizations(): try: # Fetch all organization IDs organization_ids = list(Organization.objects.values_list("id", flat=True)) - print(f"Found {len(organization_ids)} organizations to sync.") + print("Found {} organizations to sync.".format(len(organization_ids))) if organization_ids: # Split IDs into chunks @@ -459,7 +494,7 @@ def sync_es_organizations(): "id", "name", "country", "state", "regionId", "tags" ) ) - print(f"Syncing {len(organizations)} organizations...") + print("Syncing {} organizations...".format(len(organizations))) # Attempt to update Elasticsearch update_organization_chunk(es_client, organizations) @@ -469,5 +504,54 @@ def sync_es_organizations(): print("No organizations to sync.") except Exception as e: - print(f"Error syncing organizations: {e}") + print("Error syncing organizations: {}".format(e)) raise e + + +def create_scan_user(): + """Create and configure the scanning user if it does not already exist.""" + # Only create if not in the DMZ + is_dmz = os.getenv("IS_DMZ", "0") == "1" + + if is_dmz: + print("IS_DMZ is set to 1. Skipping creation of the scanning user.") + return + + user = os.getenv("POSTGRES_SCAN_USER") + password = os.getenv("POSTGRES_SCAN_PASSWORD") + if not user or not password: + print("POSTGRES_SCAN_USER or POSTGRES_SCAN_PASSWORD is not set.") + return + + db_name = settings.DATABASES["default"]["NAME"] + + with connections["default"].cursor() as cursor: + try: + # Check if the user already exists + cursor.execute("SELECT 1 FROM pg_roles WHERE rolname = %s;", [user]) + user_exists = cursor.fetchone() is not None + + if not user_exists: + # Create the user + cursor.execute( + "CREATE ROLE {} LOGIN PASSWORD %s;".format(user), [password] + ) + print("User '{}' created successfully.".format(user)) + else: + print("User '{}' already exists. Skipping creation.".format(user)) + + # Grant privileges (idempotent as well) + cursor.execute("GRANT CONNECT ON DATABASE {} TO {};".format(db_name, user)) + cursor.execute("GRANT USAGE ON SCHEMA public TO {};".format(user)) + cursor.execute( + "GRANT SELECT ON ALL TABLES IN SCHEMA public TO {};".format(user) + ) + cursor.execute( + "ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO {};".format( + user + ) + ) + + print("User '{}' configured successfully.".format(user)) + except Exception as e: + print("Error creating or configuring scan user: {}".format(e)) diff --git a/backend/src/xfd_django/xfd_api/tasks/updateScanTaskStatus.py b/backend/src/xfd_django/xfd_api/tasks/updateScanTaskStatus.py index ce13c40f5..6ad826e35 100644 --- a/backend/src/xfd_django/xfd_api/tasks/updateScanTaskStatus.py +++ b/backend/src/xfd_django/xfd_api/tasks/updateScanTaskStatus.py @@ -36,7 +36,9 @@ def handler(event, context): scan_task = retry_find_scan_task(task_arn) if not scan_task: - raise ValueError(f"Couldn't find scan task with taskArn: {task_arn}") + raise ValueError( + "Couldn't find scan task with taskArn: {}".format(task_arn) + ) old_status = scan_task.status @@ -47,20 +49,22 @@ def handler(event, context): scan_task.status = "finished" else: scan_task.status = "failed" - scan_task.output = f"{stop_code}: {stopped_reason}" + scan_task.output = "{}: {}".format(stop_code, stopped_reason) scan_task.finishedAt = now() else: # No update needed for other statuses return {"statusCode": 204, "body": "No status change required."} print( - f"Updating status of ScanTask {scan_task.id} from {old_status} to {scan_task.status}." + "Updating status of ScanTask {} from {} to {}.".format( + scan_task.id, old_status, scan_task.status + ) ) scan_task.save() return { "statusCode": 200, - "body": f"ScanTask {scan_task.id} updated successfully.", + "body": "ScanTask {} updated successfully.".format(scan_task.id), } except Exception as e: @@ -75,9 +79,9 @@ def retry_find_scan_task(task_arn, retries=3): if scan_task: return scan_task except OperationalError as e: - print(f"Database error on attempt {attempt + 1}: {e}") + print("Database error on attempt {}: {}".format(attempt + 1, e)) except Exception as e: - print(f"Unexpected error on attempt {attempt + 1}: {e}") + print("Unexpected error on attempt {}: {}".format(attempt + 1, e)) if attempt < retries - 1: continue return None diff --git a/backend/src/xfd_django/xfd_api/tasks/vulnSync.py b/backend/src/xfd_django/xfd_api/tasks/vulnSync.py index 744e27d6b..74e87bfbb 100644 --- a/backend/src/xfd_django/xfd_api/tasks/vulnSync.py +++ b/backend/src/xfd_django/xfd_api/tasks/vulnSync.py @@ -36,12 +36,16 @@ def main(): # For each organization, fetch vulnerability data for org in all_orgs: - print(f"Processing organization: {org.acronym}, {org.name}") + print("Processing organization: {}, {}".format(org.acronym, org.name)) # Fetch PE vulnerability task data data = fetch_pe_vuln_task(org.acronym) if not data or not data.get("tasks_dict"): - print(f"Failed to start PE API task for org: {org.acronym}, {org.name}") + print( + "Failed to start PE API task for org: {}, {}".format( + org.acronym, org.name + ) + ) continue all_vulns = [] @@ -53,7 +57,9 @@ def main(): if response and response.get("status") == "Failure": print( - f"Failed fetching data for task {task_id} for org {org.acronym}, {org.name}" + "Failed fetching data for task {} for org {}, {}".format( + task_id, org.acronym, org.name + ) ) continue @@ -67,7 +73,7 @@ def main(): def fetch_pe_vuln_task(org_acronym): """Fetch PE vulnerability task data.""" - print(f"Fetching PE vulnerability task for organization: {org_acronym}") + print("Fetching PE vulnerability task for organization: {}".format(org_acronym)) headers = { "X-API-KEY": os.getenv("CF_API_KEY"), "access_token": os.getenv("PE_API_KEY"), @@ -85,13 +91,15 @@ def fetch_pe_vuln_task(org_acronym): response.raise_for_status() return response.json() except requests.exceptions.RequestException as e: - print(f"Error fetching PE task: {e}") + print("Error fetching PE task: {}".format(e)) return None def fetch_pe_vuln_data(scan_name, task_id): """Fetch PE vulnerability data for a task.""" - url = f"https://api.staging-cd.crossfeed.cyber.dhs.gov/pe/apiv1/crossfeed_vulns/task/?task_id={task_id}&scan_name={scan_name}" + url = "https://api.staging-cd.crossfeed.cyber.dhs.gov/pe/apiv1/crossfeed_vulns/task/?task_id={}&scan_name={}".format( + task_id, scan_name + ) headers = { "X-API-KEY": os.getenv("CF_API_KEY"), "access_token": os.getenv("PE_API_KEY"), @@ -103,7 +111,7 @@ def fetch_pe_vuln_data(scan_name, task_id): response.raise_for_status() return response.json() except requests.exceptions.RequestException as e: - print(f"Error fetching PE vulnerability data: {e}") + print("Error fetching PE vulnerability data: {}".format(e)) return None @@ -114,7 +122,7 @@ def process_vulnerability(vuln, org): service = save_service(vuln, domain) save_vulnerability(vuln, domain, service) except Exception as e: - print(f"Error processing vulnerability: {e}") + print("Error processing vulnerability: {}".format(e)) def save_domain(vuln, org): @@ -149,13 +157,13 @@ def save_domain(vuln, org): "fromRootDomain": None if ip_only else ".".join(service_domain.split(".")[-2:]), - "subdomainSource": f"P&E - {vuln['source']}", + "subdomainSource": "P&E - {}".format(vuln["source"]), "ipOnly": ip_only, }, ) return domain except Exception as e: - print(f"Failed to save domain: {e}") + print("Failed to save domain: {}".format(e)) raise @@ -183,7 +191,7 @@ def save_service(vuln, domain): ) return service except Exception as e: - print(f"Failed to save service: {e}") + print("Failed to save service: {}".format(e)) raise @@ -208,5 +216,5 @@ def save_vulnerability(vuln, domain, service): }, ) except Exception as e: - print(f"Failed to save vulnerability: {e}") + print("Failed to save vulnerability: {}".format(e)) raise diff --git a/backend/src/xfd_django/xfd_api/tests/test_api_key.py b/backend/src/xfd_django/xfd_api/tests/test_api_key.py index 644f58cd2..29fea4826 100644 --- a/backend/src/xfd_django/xfd_api/tests/test_api_key.py +++ b/backend/src/xfd_django/xfd_api/tests/test_api_key.py @@ -13,7 +13,7 @@ # user = User.objects.create( # firstName="Test", # lastName="User", -# email=f"{secrets.token_hex(4)}@example.com", +# email="{}@example.com".format(secrets.token_hex(4)), # userType="STANDARD", # createdAt=datetime.now(), # updatedAt=datetime.now(), @@ -45,7 +45,7 @@ # user = User.objects.create( # firstName="Test", # lastName="User", -# email=f"{secrets.token_hex(4)}@example.com", +# email="{}@example.com".format(secrets.token_hex(4)), # userType="STANDARD", # createdAt=datetime.now(), # updatedAt=datetime.now(), @@ -56,7 +56,7 @@ # user=user, # ) # response = client.delete( -# f"/api-keys/{api_key.id}", +# "/api-keys/{}".format(api_key.id), # headers={ # "Authorization": create_jwt_token({"id": user.id, "userType": "STANDARD"}) # }, @@ -78,7 +78,7 @@ # user1 = User.objects.create( # firstName="Test1", # lastName="User1", -# email=f"{secrets.token_hex(4)}@example.com", +# email="{}@example.com".format(secrets.token_hex(4)), # userType="STANDARD", # createdAt=datetime.now(), # updatedAt=datetime.now(), @@ -86,7 +86,7 @@ # user2 = User.objects.create( # firstName="Test2", # lastName="User2", -# email=f"{secrets.token_hex(4)}@example.com", +# email="{}@example.com".format(secrets.token_hex(4)), # userType="GLOBAL_ADMIN", # createdAt=datetime.now(), # updatedAt=datetime.now(), @@ -99,7 +99,7 @@ # # Try to delete user1's API key as user2 # response = client.delete( -# f"/api-keys/{api_key.id}", +# "/api-keys/{}".format(api_key.id), # headers={ # "Authorization": create_jwt_token( # {"id": user2.id, "userType": "GLOBAL_ADMIN"} @@ -124,7 +124,7 @@ # user = User.objects.create( # firstName="Test", # lastName="User", -# email=f"{secrets.token_hex(4)}@example.com", +# email="{}@example.com".format(secrets.token_hex(4)), # userType="STANDARD", # createdAt=datetime.now(), # updatedAt=datetime.now(), @@ -148,7 +148,7 @@ # User.objects.create( # firstName="Test", # lastName="User", -# email=f"{secrets.token_hex(4)}@example.com", +# email="{}@example.com".format(secrets.token_hex(4)), # userType="STANDARD", # createdAt=datetime.now(), # updatedAt=datetime.now(), @@ -163,7 +163,7 @@ # user = User.objects.create( # firstName="Test", # lastName="User", -# email=f"{secrets.token_hex(4)}@example.com", +# email="{}@example.com".format(secrets.token_hex(4)), # userType="STANDARD", # createdAt=datetime.now(), # updatedAt=datetime.now(), @@ -180,7 +180,7 @@ # # Revoke the API key # response = client.delete( -# f"/api-keys/{api_key_id}", +# "/api-keys/{}".format(api_key_id), # headers={ # "Authorization": create_jwt_token({"id": user.id, "userType": "STANDARD"}) # }, diff --git a/backend/src/xfd_django/xfd_api/tests/test_domain.py b/backend/src/xfd_django/xfd_api/tests/test_domain.py index e01b827bd..a67e6e468 100644 --- a/backend/src/xfd_django/xfd_api/tests/test_domain.py +++ b/backend/src/xfd_django/xfd_api/tests/test_domain.py @@ -30,7 +30,7 @@ def user(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_ADMIN, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -118,7 +118,7 @@ def test_get_domain_by_id(user, domain): """Test domain by id.""" # Get domain by Id. response = client.get( - f"/domain/{domain.id}", + "/domain/{}".format(domain.id), headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -134,7 +134,7 @@ def test_get_domain_by_id_fails_404(user, domain): """Test domain by id to fail.""" # Get domain by Id. response = client.get( - f"/domain/{bad_id}", + "/domain/{}".format(bad_id), headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -159,9 +159,9 @@ def test_search_domain_by_ip(user, vulnerability): # Validate result contain the correct IP for domain in data["result"]: - assert ( - domain["ip"] == search_fields["ip"] - ), f"Expected IP {search_fields['ip']}, but got {domain['ip']}" + assert domain["ip"] == search_fields["ip"], "Expected IP {}, but got {}".format( + search_fields["ip"], domain["ip"] + ) @pytest.mark.django_db(transaction=True) @@ -186,7 +186,9 @@ def test_search_domain_by_port(user, vulnerability): for service in services: assert ( str(service.port) == search_fields["port"] - ), f"Domain with ID {domain_id} does not have a service with port {vulnerability.service.port}" + ), "Domain with ID {} does not have a service with port {}".format( + domain_id, vulnerability.service.port + ) @pytest.mark.django_db(transaction=True) @@ -216,7 +218,9 @@ def test_search_domain_by_service(user, vulnerability): service_match = services.filter(id=vulnerability.service.id) assert ( service_match is not None - ), f"Domain with ID {domain_id} is not related a service with ID {vulnerability.service.id}" + ), "Domain with ID {} is not related a service with ID {}".format( + domain_id, vulnerability.service.id + ) @pytest.mark.django_db(transaction=True) @@ -268,7 +272,9 @@ def test_search_domain_by_organization_name(user, vulnerability): organization = Organization.objects.get(id=domain["organization"]["id"]) assert ( organization.name == search_fields["organizationName"] - ), f"Domain with ID {domain['id']} did not contain Organization Id {search_fields['organizationName']}" + ), "Domain with ID {} did not contain Organization Id {}".format( + domain["id"], search_fields["organizationName"] + ) @pytest.mark.django_db(transaction=True) @@ -292,7 +298,9 @@ def test_search_domain_by_vulnerabilities(user, vulnerability): for domain in data["result"]: assert str(vulnerability.domain.id) == str( domain["id"] - ), f"Response domain {domain['id']} did not relate back to the expected vulnerability {vulnerability.domain.id}" + ), "Response domain {} did not relate back to the expected vulnerability {}".format( + domain["id"], vulnerability.domain.id + ) @pytest.mark.django_db(transaction=True) @@ -316,7 +324,9 @@ def test_search_domains_multiple_criteria(user, vulnerability): for domain in data["result"]: assert ( domain["ip"] == search_fields["ip"] - ), f"Domain with ID {domain['id']} does not have an IP {search_fields['ip']}" + ), "Domain with ID {} does not have an IP {}".format( + domain["id"], search_fields["ip"] + ) domain_id = domain.get("id", None) assert domain_id is not None, "Domain Id not found in Response" @@ -324,7 +334,9 @@ def test_search_domains_multiple_criteria(user, vulnerability): for service in services: assert ( str(service.port) == search_fields["port"] - ), f"Domain with ID {domain_id} does not have a service with port {vulnerability.service.port}" + ), "Domain with ID {} does not have a service with port {}".format( + domain_id, vulnerability.service.port + ) @pytest.mark.django_db(transaction=True) diff --git a/backend/src/xfd_django/xfd_api/tests/test_notification.py b/backend/src/xfd_django/xfd_api/tests/test_notification.py index e15a79097..a6ccdd342 100644 --- a/backend/src/xfd_django/xfd_api/tests/test_notification.py +++ b/backend/src/xfd_django/xfd_api/tests/test_notification.py @@ -55,7 +55,7 @@ # # Send the DELETE request # response = client.delete( -# f"/notifications/{notification.id}", +# "/notifications/{}".format(notification.id), # headers={ # "Authorization": create_jwt_token({"id": user.id, "userType": "STANDARD"}) # }, @@ -123,7 +123,7 @@ # # Send the GET request # response = client.get( -# f"/notifications/{notification.id}", +# "/notifications/{}".format(notification.id), # headers={ # "Authorization": create_jwt_token({"id": user.id, "userType": "STANDARD"}) # }, diff --git a/backend/src/xfd_django/xfd_api/tests/test_organization.py b/backend/src/xfd_django/xfd_api/tests/test_organization.py index 3c8047686..8612e9011 100644 --- a/backend/src/xfd_django/xfd_api/tests/test_organization.py +++ b/backend/src/xfd_django/xfd_api/tests/test_organization.py @@ -28,13 +28,13 @@ def test_create_org_by_global_admin(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_ADMIN, createdAt=datetime.now(), updatedAt=datetime.now(), ) - name = f"test-{secrets.token_hex(4)}" + name = "test-{}".format(secrets.token_hex(4)) acronym = secrets.token_hex(2) response = client.post( @@ -64,13 +64,13 @@ def test_create_duplicate_org_fails(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_ADMIN, createdAt=datetime.now(), updatedAt=datetime.now(), ) - name = f"test-{secrets.token_hex(4)}" + name = "test-{}".format(secrets.token_hex(4)) acronym = secrets.token_hex(2) client.post( @@ -110,14 +110,14 @@ def test_create_org_by_global_view_fails(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_VIEW, createdAt=datetime.now(), updatedAt=datetime.now(), ) print(user) - name = f"test-{secrets.token_hex(4)}" + name = "test-{}".format(secrets.token_hex(4)) acronym = secrets.token_hex(2) response = client.post( @@ -143,7 +143,7 @@ def test_update_org_by_global_admin(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_ADMIN, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -151,7 +151,7 @@ def test_update_org_by_global_admin(): organization = Organization.objects.create( acronym=secrets.token_hex(2), - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), rootDomains=["test.com"], ipBlocks=[], isPassive=False, @@ -159,7 +159,7 @@ def test_update_org_by_global_admin(): updatedAt=datetime.now(), ) - new_name = f"test-{secrets.token_hex(4)}" + new_name = "test-{}".format(secrets.token_hex(4)) new_acronym = secrets.token_hex(2) new_root_domains = ["newdomain.com"] new_ip_blocks = ["1.1.1.1"] @@ -167,7 +167,7 @@ def test_update_org_by_global_admin(): tags = [{"name": "updated"}] response = client.put( - f"/organizations/{organization.id}", + "/organizations/{}".format(organization.id), json={ "name": new_name, "acronym": new_acronym, @@ -195,7 +195,7 @@ def test_update_org_by_global_view_fails(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_VIEW, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -203,7 +203,7 @@ def test_update_org_by_global_view_fails(): organization = Organization.objects.create( acronym=secrets.token_hex(2), - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), rootDomains=["test.com"], ipBlocks=[], isPassive=False, @@ -211,7 +211,7 @@ def test_update_org_by_global_view_fails(): updatedAt=datetime.now(), ) - new_name = f"test-{secrets.token_hex(4)}" + new_name = "test-{}".format(secrets.token_hex(4)) new_acronym = secrets.token_hex(2) new_root_domains = ["newdomain.com"] new_ip_blocks = ["1.1.1.1"] @@ -219,7 +219,7 @@ def test_update_org_by_global_view_fails(): tags = [{"name": "updated"}] response = client.put( - f"/organizations/{organization.id}", + "/organizations/{}".format(organization.id), json={ "name": new_name, "acronym": new_acronym, @@ -242,14 +242,14 @@ def test_delete_org_by_global_admin(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_ADMIN, createdAt=datetime.now(), updatedAt=datetime.now(), ) organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), rootDomains=["test.com"], ipBlocks=[], isPassive=False, @@ -258,7 +258,7 @@ def test_delete_org_by_global_admin(): ) response = client.delete( - f"/organizations/{organization.id}", + "/organizations/{}".format(organization.id), headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -272,14 +272,14 @@ def test_delete_org_by_org_admin_fails(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), ) organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), rootDomains=["test.com"], ipBlocks=[], isPassive=False, @@ -295,7 +295,7 @@ def test_delete_org_by_org_admin_fails(): ) response = client.delete( - f"/organizations/{organization.id}", + "/organizations/{}".format(organization.id), headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -310,7 +310,7 @@ def test_delete_org_by_global_view_fails(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_VIEW, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -318,7 +318,7 @@ def test_delete_org_by_global_view_fails(): organization = Organization.objects.create( acronym=secrets.token_hex(2), - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), rootDomains=["test.com"], ipBlocks=[], isPassive=False, @@ -327,7 +327,7 @@ def test_delete_org_by_global_view_fails(): ) response = client.delete( - f"/organizations/{organization.id}", + "/organizations/{}".format(organization.id), headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -342,7 +342,7 @@ def test_list_orgs_by_global_view_succeeds(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_VIEW, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -350,8 +350,8 @@ def test_list_orgs_by_global_view_succeeds(): # Create an organization Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", - rootDomains=["test-" + secrets.token_hex(4)], + name="test-{}".format(secrets.token_hex(4)), + rootDomains=["test-{}".format(secrets.token_hex(4))], ipBlocks=[], isPassive=False, createdAt=datetime.now(), @@ -375,7 +375,7 @@ def test_list_orgs_by_org_member_only_gets_their_org(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -383,8 +383,8 @@ def test_list_orgs_by_org_member_only_gets_their_org(): # Create organizations organization1 = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", - rootDomains=["test-" + secrets.token_hex(4)], + name="test-{}".format(secrets.token_hex(4)), + rootDomains=["test-{}".format(secrets.token_hex(4))], ipBlocks=[], isPassive=False, createdAt=datetime.now(), @@ -392,8 +392,8 @@ def test_list_orgs_by_org_member_only_gets_their_org(): ) Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", - rootDomains=["test-" + secrets.token_hex(4)], + name="test-{}".format(secrets.token_hex(4)), + rootDomains=["test-{}".format(secrets.token_hex(4))], ipBlocks=[], isPassive=False, createdAt=datetime.now(), @@ -426,15 +426,15 @@ def test_get_org_by_global_view_fails(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_VIEW, createdAt=datetime.now(), updatedAt=datetime.now(), ) organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", - rootDomains=["test-" + secrets.token_hex(4)], + name="test-{}".format(secrets.token_hex(4)), + rootDomains=["test-{}".format(secrets.token_hex(4))], ipBlocks=[], isPassive=False, createdAt=datetime.now(), @@ -442,7 +442,7 @@ def test_get_org_by_global_view_fails(): ) response = client.get( - f"/organizations/{organization.id}", + "/organizations/{}".format(organization.id), headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -457,15 +457,15 @@ def test_get_org_by_org_admin_succeeds(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), ) organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", - rootDomains=["test-" + secrets.token_hex(4)], + name="test-{}".format(secrets.token_hex(4)), + rootDomains=["test-{}".format(secrets.token_hex(4))], ipBlocks=[], isPassive=False, createdAt=datetime.now(), @@ -480,7 +480,7 @@ def test_get_org_by_org_admin_succeeds(): ) response = client.get( - f"/organizations/{organization.id}", + "/organizations/{}".format(organization.id), headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -496,15 +496,15 @@ def test_get_org_by_org_admin_of_different_org_fails(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), ) organization1 = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", - rootDomains=["test-" + secrets.token_hex(4)], + name="test-{}".format(secrets.token_hex(4)), + rootDomains=["test-{}".format(secrets.token_hex(4))], ipBlocks=[], isPassive=False, createdAt=datetime.now(), @@ -512,8 +512,8 @@ def test_get_org_by_org_admin_of_different_org_fails(): ) organization2 = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", - rootDomains=["test-" + secrets.token_hex(4)], + name="test-{}".format(secrets.token_hex(4)), + rootDomains=["test-{}".format(secrets.token_hex(4))], ipBlocks=[], isPassive=False, createdAt=datetime.now(), @@ -528,7 +528,7 @@ def test_get_org_by_org_admin_of_different_org_fails(): ) response = client.get( - f"/organizations/{organization2.id}", + "/organizations/{}".format(organization2.id), headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -543,15 +543,15 @@ def test_get_org_by_org_regular_user_fails(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), ) organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", - rootDomains=["test-" + secrets.token_hex(4)], + name="test-{}".format(secrets.token_hex(4)), + rootDomains=["test-{}".format(secrets.token_hex(4))], ipBlocks=[], isPassive=False, createdAt=datetime.now(), @@ -566,7 +566,7 @@ def test_get_org_by_org_regular_user_fails(): ) response = client.get( - f"/organizations/{organization.id}", + "/organizations/{}".format(organization.id), headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -581,15 +581,15 @@ def test_get_org_with_scan_tasks_by_org_admin_succeeds(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), ) organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", - rootDomains=["test-" + secrets.token_hex(4)], + name="test-{}".format(secrets.token_hex(4)), + rootDomains=["test-{}".format(secrets.token_hex(4))], ipBlocks=[], isPassive=False, createdAt=datetime.now(), @@ -615,7 +615,7 @@ def test_get_org_with_scan_tasks_by_org_admin_succeeds(): scan_task.organizations.add(organization) response = client.get( - f"/organizations/{organization.id}", + "/organizations/{}".format(organization.id), headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -634,14 +634,14 @@ def test_enable_user_modifiable_scan_by_org_admin_succeeds(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), ) organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), rootDomains=["test-" + secrets.token_hex(4)], ipBlocks=[], isPassive=False, @@ -664,7 +664,7 @@ def test_enable_user_modifiable_scan_by_org_admin_succeeds(): ) response = client.post( - f"/organizations/{organization.id}/granularScans/{scan.id}/update", + "/organizations/{}/granularScans/{}/update".format(organization.id, scan.id), json={"enabled": True}, headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -682,14 +682,14 @@ def test_disable_user_modifiable_scan_by_org_admin_succeeds(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), ) organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), rootDomains=["test-" + secrets.token_hex(4)], ipBlocks=[], isPassive=False, @@ -719,7 +719,7 @@ def test_disable_user_modifiable_scan_by_org_admin_succeeds(): scan_task.organizations.add(organization) response = client.post( - f"/organizations/{organization.id}/granularScans/{scan.id}/update", + "/organizations/{}/granularScans/{}/update".format(organization.id, scan.id), json={"enabled": False}, headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -736,14 +736,14 @@ def test_enable_user_modifiable_scan_by_org_user_fails(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), ) organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), rootDomains=["test-" + secrets.token_hex(4)], ipBlocks=[], isPassive=False, @@ -766,7 +766,7 @@ def test_enable_user_modifiable_scan_by_org_user_fails(): ) response = client.post( - f"/organizations/{organization.id}/granularScans/{scan.id}/update", + "/organizations/{}/granularScans/{}/update".format(organization.id, scan.id), json={"enabled": True}, headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -781,14 +781,14 @@ def test_enable_user_modifiable_scan_by_global_admin_succeeds(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_ADMIN, createdAt=datetime.now(), updatedAt=datetime.now(), ) organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), rootDomains=["test-" + secrets.token_hex(4)], ipBlocks=[], isPassive=False, @@ -805,7 +805,7 @@ def test_enable_user_modifiable_scan_by_global_admin_succeeds(): ) response = client.post( - f"/organizations/{organization.id}/granularScans/{scan.id}/update", + "/organizations/{}/granularScans/{}/update".format(organization.id, scan.id), json={"enabled": True}, headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -823,14 +823,14 @@ def test_enable_non_user_modifiable_scan_by_org_admin_fails(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), ) organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), rootDomains=["test-" + secrets.token_hex(4)], ipBlocks=[], isPassive=False, @@ -853,7 +853,7 @@ def test_enable_non_user_modifiable_scan_by_org_admin_fails(): ) response = client.post( - f"/organizations/{organization.id}/granularScans/{scan.id}/update", + "/organizations/{}/granularScans/{}/update".format(organization.id, scan.id), json={"enabled": True}, headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -868,7 +868,7 @@ def test_approve_role_by_global_admin_succeeds(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_ADMIN, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -877,14 +877,14 @@ def test_approve_role_by_global_admin_succeeds(): user2 = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), ) organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), rootDomains=["test-" + secrets.token_hex(4)], ipBlocks=[], isPassive=False, @@ -897,7 +897,7 @@ def test_approve_role_by_global_admin_succeeds(): ) response = client.post( - f"/organizations/{organization.id}/roles/{role.id}/approve", + "/organizations/{}/roles/{}/approve".format(organization.id, role.id), headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -913,7 +913,7 @@ def test_approve_role_by_global_view_fails(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_VIEW, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -922,14 +922,14 @@ def test_approve_role_by_global_view_fails(): user2 = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), ) organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), rootDomains=["test-" + secrets.token_hex(4)], ipBlocks=[], isPassive=False, @@ -942,13 +942,11 @@ def test_approve_role_by_global_view_fails(): ) response = client.post( - f"/organizations/{organization.id}/roles/{role.id}/approve", + "/organizations/{}/roles/{}/approve".format(organization.id, role.id), headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) assert response.status_code == 403 - role.refresh_from_db() - assert role.approved is False # Test: Approving a role by org admin should succeed @@ -958,7 +956,7 @@ def test_approve_role_by_org_admin_succeeds(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -967,14 +965,14 @@ def test_approve_role_by_org_admin_succeeds(): user2 = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), ) organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), rootDomains=["test-" + secrets.token_hex(4)], ipBlocks=[], isPassive=False, @@ -993,7 +991,7 @@ def test_approve_role_by_org_admin_succeeds(): ) response = client.post( - f"/organizations/{organization.id}/roles/{role.id}/approve", + "/organizations/{}/roles/{}/approve".format(organization.id, role.id), headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -1009,7 +1007,7 @@ def test_approve_role_by_org_user_fails(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -1018,14 +1016,14 @@ def test_approve_role_by_org_user_fails(): user2 = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), ) organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), rootDomains=["test-" + secrets.token_hex(4)], ipBlocks=[], isPassive=False, @@ -1044,7 +1042,7 @@ def test_approve_role_by_org_user_fails(): ) response = client.post( - f"/organizations/{organization.id}/roles/{role.id}/approve", + "/organizations/{}/roles/{}/approve".format(organization.id, role.id), headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -1060,7 +1058,7 @@ def test_remove_role_by_global_admin_succeeds(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_ADMIN, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -1069,14 +1067,14 @@ def test_remove_role_by_global_admin_succeeds(): user2 = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), ) organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), rootDomains=["test-" + secrets.token_hex(4)], ipBlocks=[], isPassive=False, @@ -1089,7 +1087,7 @@ def test_remove_role_by_global_admin_succeeds(): ) response = client.post( - f"/organizations/{organization.id}/roles/{role.id}/remove", + "/organizations/{}/roles/{}/remove".format(organization.id, role.id), headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -1103,7 +1101,7 @@ def test_remove_role_by_global_view_fails(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_VIEW, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -1112,14 +1110,14 @@ def test_remove_role_by_global_view_fails(): user2 = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), ) organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), rootDomains=["test-" + secrets.token_hex(4)], ipBlocks=[], isPassive=False, @@ -1132,7 +1130,7 @@ def test_remove_role_by_global_view_fails(): ) response = client.post( - f"/organizations/{organization.id}/roles/{role.id}/remove", + "/organizations/{}/roles/{}/remove".format(organization.id, role.id), headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -1147,7 +1145,7 @@ def test_remove_role_by_org_admin_succeeds(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -1155,14 +1153,14 @@ def test_remove_role_by_org_admin_succeeds(): user2 = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), ) organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), rootDomains=["test-" + secrets.token_hex(4)], ipBlocks=[], isPassive=False, @@ -1181,7 +1179,7 @@ def test_remove_role_by_org_admin_succeeds(): ) response = client.post( - f"/organizations/{organization.id}/roles/{role.id}/remove", + "/organizations/{}/roles/{}/remove".format(organization.id, role.id), headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -1195,7 +1193,7 @@ def test_remove_role_by_org_user_fails(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -1204,14 +1202,14 @@ def test_remove_role_by_org_user_fails(): user2 = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), ) organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), rootDomains=["test-" + secrets.token_hex(4)], ipBlocks=[], isPassive=False, @@ -1230,7 +1228,7 @@ def test_remove_role_by_org_user_fails(): ) response = client.post( - f"/organizations/{organization.id}/roles/{role.id}/remove", + "/organizations/{}/roles/{}/remove".format(organization.id, role.id), headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -1245,14 +1243,14 @@ def test_get_tags_by_global_admin_succeeds(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_ADMIN, createdAt=datetime.now(), updatedAt=datetime.now(), ) OrganizationTag.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), ) response = client.get( @@ -1271,14 +1269,14 @@ def test_get_tags_by_standard_user_returns_no_tags(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), ) OrganizationTag.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), ) response = client.get( diff --git a/backend/src/xfd_django/xfd_api/tests/test_proxy.py b/backend/src/xfd_django/xfd_api/tests/test_proxy.py index 28328801e..981b10415 100644 --- a/backend/src/xfd_django/xfd_api/tests/test_proxy.py +++ b/backend/src/xfd_django/xfd_api/tests/test_proxy.py @@ -21,7 +21,7 @@ def test_standard_user_not_authorized_to_access_pe_proxy(): user = User.objects.create( firstName="Standard", lastName="User", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -31,7 +31,7 @@ def test_standard_user_not_authorized_to_access_pe_proxy(): token = create_jwt_token(user) # Make a GET request to the P&E proxy endpoint with the user's token - response = client.get("/pe", headers={"Authorization": f"Bearer {token}"}) + response = client.get("/pe", headers={"Authorization": "Bearer {}".format(token)}) # Assert that the user receives a 403 Unauthorized response assert response.status_code == 403 @@ -45,7 +45,7 @@ def test_global_admin_authorized_to_access_pe_proxy(): user = User.objects.create( firstName="Admin", lastName="User", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_ADMIN, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -55,7 +55,7 @@ def test_global_admin_authorized_to_access_pe_proxy(): token = create_jwt_token(user) # Make a GET request to the P&E proxy endpoint with the global admin's token - response = client.get("/pe", headers={"Authorization": f"Bearer {token}"}) + response = client.get("/pe", headers={"Authorization": "Bearer {}".format(token)}) # Assert that the global admin is authorized and receives either a 200 or 504 response assert response.status_code in [200, 504] @@ -68,7 +68,7 @@ def test_global_view_user_authorized_to_access_pe_proxy(): user = User.objects.create( firstName="View", lastName="User", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_VIEW, createdAt=datetime.now(), updatedAt=datetime.now(), diff --git a/backend/src/xfd_django/xfd_api/tests/test_saved_searches.py b/backend/src/xfd_django/xfd_api/tests/test_saved_searches.py index 9bc2f5ec7..2a218e4cd 100644 --- a/backend/src/xfd_django/xfd_api/tests/test_saved_searches.py +++ b/backend/src/xfd_django/xfd_api/tests/test_saved_searches.py @@ -19,7 +19,7 @@ def create_global_admin(): global_admin_user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_ADMIN, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -34,7 +34,7 @@ def create_global_view(): global_view_user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_VIEW, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -49,7 +49,7 @@ def create_standard_user(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -64,7 +64,7 @@ def create_secondary_standard_user(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -85,7 +85,7 @@ def test_create_saved_search_by_user(create_standard_user): The response data should include the correct name and createdById fields. """ user = create_standard_user - name = f"test-{secrets.token_hex(4)}" + name = "test-{}".format(secrets.token_hex(4)) response = client.post( "/saved-searches/", headers={"Authorization": "Bearer " + create_jwt_token(user)}, @@ -121,7 +121,7 @@ def test_update_saved_search_by_global_admin_fails( global_admin_user = create_global_admin standard_user = create_standard_user body = { - "name": f"test-{secrets.token_hex(4)}", + "name": "test-{}".format(secrets.token_hex(4)), "count": 3, "sortDirection": "", "sortField": "", @@ -131,12 +131,12 @@ def test_update_saved_search_by_global_admin_fails( "updatedAt": datetime.now(), # Include updatedAt field } search = SavedSearch.objects.create(**body, createdById=standard_user) - body["name"] = f"test-{secrets.token_hex(4)}" + body["name"] = "test-{}".format(secrets.token_hex(4)) body["searchTerm"] = "123" body["updatedAt"] = datetime.now().isoformat() # Update the timestamp response = client.put( - f"/saved-searches/{search.id}", + "/saved-searches/{}".format(search.id), json=body, headers={"Authorization": "Bearer " + create_jwt_token(global_admin_user)}, ) @@ -164,7 +164,7 @@ def test_update_saved_search_by_global_view_fails( global_view_user = create_global_view user = create_standard_user body = { - "name": f"test-{secrets.token_hex(4)}", + "name": "test-{}".format(secrets.token_hex(4)), "count": 3, "sortDirection": "", "sortField": "", @@ -176,11 +176,11 @@ def test_update_saved_search_by_global_view_fails( saved_search = SavedSearch.objects.create(**body, createdById=user) # Attempt to update the saved search with the global view user - body["name"] = f"test-{secrets.token_hex(4)}" + body["name"] = "test-{}".format(secrets.token_hex(4)) body["searchTerm"] = "123" body["updatedAt"] = datetime.now().isoformat() # Update the timestamp response = client.put( - f"/saved-searches/{saved_search.id}", + "/saved-searches/{}".format(saved_search.id), json=body, headers={"Authorization": "Bearer " + create_jwt_token(global_view_user)}, ) @@ -204,7 +204,7 @@ def test_update_saved_search_by_standard_user_with_access(create_standard_user): """ user = create_standard_user body = { - "name": f"test-{secrets.token_hex(4)}", + "name": "test-{}".format(secrets.token_hex(4)), "count": 3, "sortDirection": "", "sortField": "", @@ -214,12 +214,12 @@ def test_update_saved_search_by_standard_user_with_access(create_standard_user): "updatedAt": datetime.now(), # Include updatedAt field } search = SavedSearch.objects.create(**body, createdById=user) - body["name"] = f"test-{secrets.token_hex(4)}" + body["name"] = "test-{}".format(secrets.token_hex(4)) body["searchTerm"] = "123" body["updatedAt"] = datetime.now().isoformat() # Update the timestamp response = client.put( - f"/saved-searches/{search.id}", + "/saved-searches/{}".format(search.id), json=body, headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -246,7 +246,7 @@ def test_update_saved_search_by_standard_user_without_access_fails( user_with_access = create_standard_user user_without_access = create_secondary_standard_user body = { - "name": f"test-{secrets.token_hex(4)}", + "name": "test-{}".format(secrets.token_hex(4)), "count": 3, "sortDirection": "", "sortField": "", @@ -257,7 +257,7 @@ def test_update_saved_search_by_standard_user_without_access_fails( } search = SavedSearch.objects.create(**body, createdById=user_with_access) response = client.put( - f"/saved-searches/{search.id}", + "/saved-searches/{}".format(search.id), json=body, headers={"Authorization": "Bearer " + create_jwt_token(user_without_access)}, ) @@ -282,7 +282,7 @@ def test_delete_saved_search_by_global_admin_fails( standard_user = create_standard_user search = SavedSearch.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), count=3, sortDirection="", sortField="", @@ -292,7 +292,7 @@ def test_delete_saved_search_by_global_admin_fails( createdById=standard_user, ) response = client.delete( - f"/saved-searches/{search.id}", + "/saved-searches/{}".format(search.id), headers={"Authorization": "Bearer " + create_jwt_token(global_admin_user)}, ) assert response.status_code == 404 @@ -321,7 +321,7 @@ def test_delete_saved_search_by_global_view_fails( user = create_standard_user saved_search = SavedSearch.objects.create( - name=f"test-search-{secrets.token_hex(4)}", + name="test-search-{}".format(secrets.token_hex(4)), count=5, sortDirection="", sortField="", @@ -333,7 +333,7 @@ def test_delete_saved_search_by_global_view_fails( # Attempt to delete the saved search with the global view user response = client.delete( - f"/saved-searches/{saved_search.id}", + "/saved-searches/{}".format(saved_search.id), headers={"Authorization": "Bearer " + create_jwt_token(global_view_user)}, ) @@ -355,7 +355,7 @@ def test_delete_saved_search_by_user_with_access(create_standard_user): """ user = create_standard_user search = SavedSearch.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), count=3, sortDirection="", sortField="", @@ -365,7 +365,7 @@ def test_delete_saved_search_by_user_with_access(create_standard_user): createdById=user, ) response = client.delete( - f"/saved-searches/{search.id}", + "/saved-searches/{}".format(search.id), headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -390,7 +390,7 @@ def test_delete_saved_search_by_user_without_access_fails( user_with_access = create_standard_user user_without_access = create_secondary_standard_user search = SavedSearch.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), count=3, sortDirection="", sortField="", @@ -400,7 +400,7 @@ def test_delete_saved_search_by_user_without_access_fails( createdById=user_with_access, ) response = client.delete( - f"/saved-searches/{search.id}", + "/saved-searches/{}".format(search.id), headers={"Authorization": "Bearer " + create_jwt_token(user_without_access)}, ) assert response.status_code == 404 @@ -422,7 +422,7 @@ def test_list_saved_searches_by_global_view_returns_none(create_global_view): """ global_view_user = create_global_view search = SavedSearch.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), count=3, sortDirection="", sortField="", @@ -457,7 +457,7 @@ def test_list_saved_searches_by_user_only_gets_their_search( primary_user = create_standard_user secondary_user = create_secondary_standard_user search = SavedSearch.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), count=3, sortDirection="", sortField="", @@ -467,7 +467,7 @@ def test_list_saved_searches_by_user_only_gets_their_search( createdById=primary_user, ) search2 = SavedSearch.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), count=3, sortDirection="", sortField="", @@ -502,7 +502,7 @@ def test_get_saved_search_by_global_view_fails(create_global_view): """ global_view_user = create_global_view search = SavedSearch.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), count=3, sortDirection="", sortField="", @@ -511,7 +511,7 @@ def test_get_saved_search_by_global_view_fails(create_global_view): filters=[], ) response = client.get( - f"/saved-searches/{search.id}", + "/saved-searches/{}".format(search.id), headers={"Authorization": "Bearer " + create_jwt_token(global_view_user)}, ) assert response.status_code == 404 @@ -532,7 +532,7 @@ def test_get_saved_search_by_user_passes(create_standard_user): """ user = create_standard_user search = SavedSearch.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), count=3, sortDirection="", sortField="", @@ -542,7 +542,7 @@ def test_get_saved_search_by_user_passes(create_standard_user): createdById=user, ) response = client.get( - f"/saved-searches/{search.id}", + "/saved-searches/{}".format(search.id), headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) assert response.status_code == 200 @@ -566,7 +566,7 @@ def test_get_saved_search_by_different_user_fails( user_with_access = create_standard_user user_without_access = create_secondary_standard_user search = SavedSearch.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), count=3, sortDirection="", sortField="", @@ -576,7 +576,7 @@ def test_get_saved_search_by_different_user_fails( createdById=user_with_access, ) response = client.get( - f"/saved-searches/{search.id}", + "/saved-searches/{}".format(search.id), headers={"Authorization": "Bearer " + create_jwt_token(user_without_access)}, ) assert response.status_code == 404 diff --git a/backend/src/xfd_django/xfd_api/tests/test_scan.py b/backend/src/xfd_django/xfd_api/tests/test_scan.py index de0151fc6..6d88f99f4 100644 --- a/backend/src/xfd_django/xfd_api/tests/test_scan.py +++ b/backend/src/xfd_django/xfd_api/tests/test_scan.py @@ -21,13 +21,13 @@ def test_list_scans_by_global_admin(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_ADMIN, createdAt=datetime.now(), updatedAt=datetime.now(), ) - name = f"test-{secrets.token_hex(4)}" + name = "test-{}".format(secrets.token_hex(4)) Scan.objects.create( name=name, @@ -37,7 +37,7 @@ def test_list_scans_by_global_admin(): updatedAt=datetime.now(), ) Scan.objects.create( - name=f"{name}-2", + name="{}-2".format(name), arguments={}, frequency=999999, createdAt=datetime.now(), @@ -45,7 +45,7 @@ def test_list_scans_by_global_admin(): ) organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), rootDomains=["test-" + secrets.token_hex(4)], ipBlocks=[], isPassive=False, @@ -72,7 +72,7 @@ def test_create_scan_by_global_admin(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_ADMIN, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -115,7 +115,7 @@ def test_create_granular_scan_by_global_admin(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_ADMIN, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -126,7 +126,7 @@ def test_create_granular_scan_by_global_admin(): frequency = 999999 organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), rootDomains=["test-" + secrets.token_hex(4)], ipBlocks=[], isPassive=False, @@ -165,7 +165,7 @@ def test_create_by_global_view_fails(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_VIEW, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -196,7 +196,7 @@ def test_update_by_global_admin_succeeds(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_ADMIN, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -205,7 +205,7 @@ def test_update_by_global_admin_succeeds(): scan = Scan.objects.create(name="censys", arguments="{}", frequency=999999) response = client.put( - f"/scans/{scan.id}", + "/scans/{}".format(scan.id), json={ "name": "findomain", "arguments": "{}", @@ -233,7 +233,7 @@ def test_update_non_granular_to_granular_by_global_admin(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_ADMIN, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -247,9 +247,9 @@ def test_update_non_granular_to_granular_by_global_admin(): isSingleScan=False, ) - tag = OrganizationTag.objects.create(name=f"test-{secrets.token_hex(4)}") + tag = OrganizationTag.objects.create(name="test-{}".format(secrets.token_hex(4))) organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), rootDomains=["test-" + secrets.token_hex(4)], ipBlocks=[], isPassive=False, @@ -259,7 +259,7 @@ def test_update_non_granular_to_granular_by_global_admin(): organization.tags.set([tag]) response = client.put( - f"/scans/{scan.id}", + "/scans/{}".format(scan.id), json={ "name": "findomain", "arguments": "{}", @@ -291,7 +291,7 @@ def test_update_by_global_view_fails(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_VIEW, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -300,7 +300,7 @@ def test_update_by_global_view_fails(): scan = Scan.objects.create(name="censys", arguments="{}", frequency=999999) response = client.put( - f"/scans/{scan.id}", + "/scans/{}".format(scan.id), json={"name": "findomain", "arguments": "{}", "frequency": 999991}, headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -317,7 +317,7 @@ def test_delete_by_global_admin_succeeds(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_ADMIN, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -326,7 +326,7 @@ def test_delete_by_global_admin_succeeds(): scan = Scan.objects.create(name="censys", arguments="{}", frequency=999999) response = client.delete( - f"/scans/{scan.id}", + "/scans/{}".format(scan.id), headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -340,7 +340,7 @@ def test_delete_by_global_view_fails(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_VIEW, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -349,7 +349,7 @@ def test_delete_by_global_view_fails(): scan = Scan.objects.create(name="censys", arguments="{}", frequency=999999) response = client.delete( - f"/scans/{scan.id}", + "/scans/{}".format(scan.id), headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -364,7 +364,7 @@ def test_get_by_global_view_succeeds(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_VIEW, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -373,7 +373,7 @@ def test_get_by_global_view_succeeds(): scan = Scan.objects.create(name="censys", arguments="{}", frequency=999999) response = client.get( - f"/scans/{scan.id}", + "/scans/{}".format(scan.id), headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -389,7 +389,7 @@ def test_get_by_regular_user_fails(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -398,7 +398,7 @@ def test_get_by_regular_user_fails(): scan = Scan.objects.create(name="censys", arguments="{}", frequency=999999) response = client.get( - f"/scans/{scan.id}", + "/scans/{}".format(scan.id), headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -415,7 +415,7 @@ def test_scheduler_invoke_by_global_admin(mock_scheduler): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_ADMIN, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -439,7 +439,7 @@ def test_scheduler_invoke_by_global_view_fails(mock_scheduler): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_VIEW, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -462,7 +462,7 @@ def test_run_scan_should_set_manualRunPending_to_true(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_ADMIN, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -476,7 +476,7 @@ def test_run_scan_should_set_manualRunPending_to_true(): ) response = client.post( - f"/scans/{scan.id}/run", + "/scans/{}/run".format(scan.id), headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -490,7 +490,7 @@ def test_run_scan_by_global_view_fails(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_VIEW, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -504,7 +504,7 @@ def test_run_scan_by_global_view_fails(): ) response = client.post( - f"/scans/{scan.id}/run", + "/scans/{}/run".format(scan.id), headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) diff --git a/backend/src/xfd_django/xfd_api/tests/test_scan_task.py b/backend/src/xfd_django/xfd_api/tests/test_scan_task.py index f8da19b6f..f6eaf0d6f 100644 --- a/backend/src/xfd_django/xfd_api/tests/test_scan_task.py +++ b/backend/src/xfd_django/xfd_api/tests/test_scan_task.py @@ -21,14 +21,14 @@ def test_list_scan_tasks_by_global_view(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_VIEW, createdAt=datetime.now(), updatedAt=datetime.now(), ) organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), rootDomains=["test-" + secrets.token_hex(4)], ipBlocks=[], isPassive=False, @@ -58,14 +58,14 @@ def test_list_filtered_scan_tasks_by_global_view(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_VIEW, createdAt=datetime.now(), updatedAt=datetime.now(), ) organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), rootDomains=["test-" + secrets.token_hex(4)], ipBlocks=[], isPassive=False, @@ -102,14 +102,14 @@ def test_list_scan_tasks_by_regular_user_fails(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), ) organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), rootDomains=["test-" + secrets.token_hex(4)], ipBlocks=[], isPassive=False, @@ -135,14 +135,14 @@ def test_kill_scan_task_by_global_admin(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_ADMIN, createdAt=datetime.now(), updatedAt=datetime.now(), ) organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), rootDomains=["test-" + secrets.token_hex(4)], ipBlocks=[], isPassive=False, @@ -155,7 +155,7 @@ def test_kill_scan_task_by_global_admin(): scan_task.organizations.add(organization) response = client.post( - f"/scan-tasks/{scan_task.id}/kill", + "/scan-tasks/{}/kill".format(scan_task.id), headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -170,14 +170,14 @@ def test_kill_finished_scan_task_by_global_admin_fails(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_ADMIN, createdAt=datetime.now(), updatedAt=datetime.now(), ) organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), rootDomains=["test-" + secrets.token_hex(4)], ipBlocks=[], isPassive=False, @@ -190,7 +190,7 @@ def test_kill_finished_scan_task_by_global_admin_fails(): scan_task.organizations.add(organization) response = client.post( - f"/scan-tasks/{scan_task.id}/kill", + "/scan-tasks/{}/kill".format(scan_task.id), headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -205,14 +205,14 @@ def test_kill_scan_task_by_global_view_fails(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_VIEW, createdAt=datetime.now(), updatedAt=datetime.now(), ) organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), rootDomains=["test-" + secrets.token_hex(4)], ipBlocks=[], isPassive=False, @@ -225,7 +225,7 @@ def test_kill_scan_task_by_global_view_fails(): scan_task.organizations.add(organization) response = client.post( - f"/scan-tasks/{scan_task.id}/kill", + "/scan-tasks/{}/kill".format(scan_task.id), headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -243,14 +243,14 @@ def test_get_logs_by_global_view(mock_get_logs): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_VIEW, createdAt=datetime.now(), updatedAt=datetime.now(), ) organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), rootDomains=["test-" + secrets.token_hex(4)], ipBlocks=[], isPassive=False, @@ -265,7 +265,7 @@ def test_get_logs_by_global_view(mock_get_logs): scan_task.organizations.add(organization) response = client.get( - f"/scan-tasks/{scan_task.id}/logs", + "/scan-tasks/{}/logs".format(scan_task.id), headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -285,14 +285,14 @@ def test_get_logs_by_regular_user_fails(mock_get_logs): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), ) organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", + name="test-{}".format(secrets.token_hex(4)), rootDomains=["test-" + secrets.token_hex(4)], ipBlocks=[], isPassive=False, @@ -307,7 +307,7 @@ def test_get_logs_by_regular_user_fails(mock_get_logs): scan_task.organizations.add(organization) response = client.get( - f"/scan-tasks/{scan_task.id}/logs", + "/scan-tasks/{}/logs".format(scan_task.id), headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) diff --git a/backend/src/xfd_django/xfd_api/tests/test_user.py b/backend/src/xfd_django/xfd_api/tests/test_user.py index 2550c5927..0279004d6 100644 --- a/backend/src/xfd_django/xfd_api/tests/test_user.py +++ b/backend/src/xfd_django/xfd_api/tests/test_user.py @@ -20,14 +20,14 @@ def test_invite_by_regular_user_should_not_work(): user = User.objects.create( firstName="first", lastName="last", - email=f"{secrets.token_hex(4)}@crossfeed.cisa.gov", + email="{}@crossfeed.cisa.gov".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), ) organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", - rootDomains=[f"test-{secrets.token_hex(4)}"], + name="test-{}".format(secrets.token_hex(4)), + rootDomains=["test-{}".format(secrets.token_hex(4))], ipBlocks=[], isPassive=False, createdAt=datetime.now(), @@ -46,9 +46,9 @@ def test_invite_by_regular_user_should_not_work(): json={ "firstName": "first name", "lastName": "last name", - "email": f"{secrets.token_hex(4)}@crossfeed.cisa.gov", + "email": "{}@crossfeed.cisa.gov".format(secrets.token_hex(4)), }, - headers={"Authorization": f"Bearer {create_jwt_token(user)}"}, + headers={"Authorization": "Bearer {}".format(create_jwt_token(user))}, ) assert response.status_code == 403 @@ -61,16 +61,16 @@ def test_invite_by_global_admin_should_work(): user = User.objects.create( firstName="first", lastName="last", - email=f"{secrets.token_hex(4)}@crossfeed.cisa.gov", + email="{}@crossfeed.cisa.gov".format(secrets.token_hex(4)), userType=UserType.GLOBAL_ADMIN, createdAt=datetime.now(), updatedAt=datetime.now(), ) - email = f"{secrets.token_hex(4)}@crossfeed.cisa.gov" + email = "{}@crossfeed.cisa.gov".format(secrets.token_hex(4)) response = client.post( "/users", json={"firstName": "first name", "lastName": "last name", "email": email}, - headers={"Authorization": f"Bearer {create_jwt_token(user)}"}, + headers={"Authorization": "Bearer {}".format(create_jwt_token(user))}, ) assert response.status_code == 200 @@ -89,12 +89,12 @@ def test_invite_by_global_admin_with_user_type_setting(): user = User.objects.create( firstName="first", lastName="last", - email=f"{secrets.token_hex(4)}@crossfeed.cisa.gov", + email="{}@crossfeed.cisa.gov".format(secrets.token_hex(4)), userType=UserType.GLOBAL_ADMIN, createdAt=datetime.now(), updatedAt=datetime.now(), ) - email = f"{secrets.token_hex(4)}@crossfeed.cisa.gov" + email = "{}@crossfeed.cisa.gov".format(secrets.token_hex(4)) response = client.post( "/users", json={ @@ -103,7 +103,7 @@ def test_invite_by_global_admin_with_user_type_setting(): "email": email, "userType": UserType.GLOBAL_ADMIN, }, - headers={"Authorization": f"Bearer {create_jwt_token(user)}"}, + headers={"Authorization": "Bearer {}".format(create_jwt_token(user))}, ) assert response.status_code == 200 @@ -122,7 +122,7 @@ def test_invite_by_global_view_should_not_work(): user = User.objects.create( firstName="first", lastName="last", - email=f"{secrets.token_hex(4)}@crossfeed.cisa.gov", + email="{}@crossfeed.cisa.gov".format(secrets.token_hex(4)), userType=UserType.GLOBAL_VIEW, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -132,9 +132,9 @@ def test_invite_by_global_view_should_not_work(): json={ "firstName": "first name", "lastName": "last name", - "email": f"{secrets.token_hex(4)}@crossfeed.cisa.gov", + "email": "{}@crossfeed.cisa.gov".format(secrets.token_hex(4)), }, - headers={"Authorization": f"Bearer {create_jwt_token(user)}"}, + headers={"Authorization": "Bearer {}".format(create_jwt_token(user))}, ) print(response.json()) @@ -148,14 +148,14 @@ def test_invite_by_organization_admin_should_work(): user = User.objects.create( firstName="first", lastName="last", - email=f"{secrets.token_hex(4)}@crossfeed.cisa.gov", + email="{}@crossfeed.cisa.gov".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), ) organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", - rootDomains=[f"test-{secrets.token_hex(4)}"], + name="test-{}".format(secrets.token_hex(4)), + rootDomains=["test-{}".format(secrets.token_hex(4))], ipBlocks=[], isPassive=False, createdAt=datetime.now(), @@ -168,7 +168,7 @@ def test_invite_by_organization_admin_should_work(): role="admin", ) - email = f"{secrets.token_hex(4)}@crossfeed.cisa.gov" + email = "{}@crossfeed.cisa.gov".format(secrets.token_hex(4)) print("here") response = client.post( "/users", @@ -176,10 +176,10 @@ def test_invite_by_organization_admin_should_work(): "firstName": "first name", "lastName": "last name", "email": email, - "organization": str(organization.id), + "organization": "{}".format(organization.id), "organizationAdmin": False, }, - headers={"Authorization": f"Bearer {create_jwt_token(user)}"}, + headers={"Authorization": "Bearer {}".format(create_jwt_token(user))}, ) assert response.status_code == 200 @@ -199,15 +199,15 @@ def test_invite_by_organization_admin_should_not_work_if_setting_user_type(): user = User.objects.create( firstName="first", lastName="last", - email=f"{secrets.token_hex(4)}@crossfeed.cisa.gov", + email="{}@crossfeed.cisa.gov".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), ) organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", - rootDomains=[f"test-{secrets.token_hex(4)}"], + name="test-{}".format(secrets.token_hex(4)), + rootDomains=["test-{}".format(secrets.token_hex(4))], ipBlocks=[], isPassive=False, createdAt=datetime.now(), @@ -220,18 +220,18 @@ def test_invite_by_organization_admin_should_not_work_if_setting_user_type(): role="admin", ) - email = f"{secrets.token_hex(4)}@crossfeed.cisa.gov" + email = "{}@crossfeed.cisa.gov".format(secrets.token_hex(4)) response = client.post( "/users", json={ "firstName": "first name", "lastName": "last name", "email": email, - "organization": str(organization.id), + "organization": "{}".format(organization.id), "organizationAdmin": False, "userType": UserType.GLOBAL_ADMIN, }, - headers={"Authorization": f"Bearer {create_jwt_token(user)}"}, + headers={"Authorization": "Bearer {}".format(create_jwt_token(user))}, ) assert response.status_code == 403 @@ -242,23 +242,23 @@ def test_invite_by_organization_admin_should_not_work_if_setting_user_type(): def test_invite_existing_user_by_different_org_admin_should_not_modify_other_user_details(): """Invite existing user by a different organization admin should work, and should not modify other user details.""" organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", - rootDomains=[f"test-{secrets.token_hex(4)}"], + name="test-{}".format(secrets.token_hex(4)), + rootDomains=["test-{}".format(secrets.token_hex(4))], ipBlocks=[], isPassive=False, createdAt=datetime.now(), updatedAt=datetime.now(), ) organization2 = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", - rootDomains=[f"test-{secrets.token_hex(4)}"], + name="test-{}".format(secrets.token_hex(4)), + rootDomains=["test-{}".format(secrets.token_hex(4))], ipBlocks=[], isPassive=False, createdAt=datetime.now(), updatedAt=datetime.now(), ) - email = f"{secrets.token_hex(4)}@crossfeed.cisa.gov" + email = "{}@crossfeed.cisa.gov".format(secrets.token_hex(4)) user = User.objects.create( firstName="first name", lastName="last name", email=email ) @@ -269,7 +269,7 @@ def test_invite_existing_user_by_different_org_admin_should_not_modify_other_use user2 = User.objects.create( firstName="first", lastName="last", - email=f"{secrets.token_hex(4)}@crossfeed.cisa.gov", + email="{}@crossfeed.cisa.gov".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -288,10 +288,10 @@ def test_invite_existing_user_by_different_org_admin_should_not_modify_other_use "firstName": "new first name", "lastName": "new last name", "email": email, - "organization": str(organization2.id), + "organization": "{}".format(organization2.id), "organizationAdmin": False, }, - headers={"Authorization": f"Bearer {create_jwt_token(user2)}"}, + headers={"Authorization": "Bearer {}".format(create_jwt_token(user2))}, ) assert response.status_code == 200 @@ -306,7 +306,7 @@ def test_invite_existing_user_by_different_org_admin_should_not_modify_other_use for role in data["roles"] if role["organization"]["id"] == str(organization2.id) ] - assert role_for_org2, f"No role found for organization {organization2.id}" + assert role_for_org2, "No role found for organization {}".format(organization2.id) assert role_for_org2[0]["approved"] is True assert role_for_org2[0]["role"] == "user" @@ -315,23 +315,23 @@ def test_invite_existing_user_by_different_org_admin_should_not_modify_other_use def test_invite_existing_user_by_different_org_admin_should_modify_user_name_if_initially_blank(): """Invite existing user by a different organization admin should modify user name if user name is initially blank.""" organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", - rootDomains=[f"test-{secrets.token_hex(4)}"], + name="test-{}".format(secrets.token_hex(4)), + rootDomains=["test-{}".format(secrets.token_hex(4))], ipBlocks=[], isPassive=False, createdAt=datetime.now(), updatedAt=datetime.now(), ) organization2 = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", - rootDomains=[f"test-{secrets.token_hex(4)}"], + name="test-{}".format(secrets.token_hex(4)), + rootDomains=["test-{}".format(secrets.token_hex(4))], ipBlocks=[], isPassive=False, createdAt=datetime.now(), updatedAt=datetime.now(), ) - email = f"{secrets.token_hex(4)}@crossfeed.cisa.gov" + email = "{}@crossfeed.cisa.gov".format(secrets.token_hex(4)) user = User.objects.create(firstName="", lastName="", email=email) Role.objects.create( role="user", approved=False, organization=organization, user=user @@ -340,7 +340,7 @@ def test_invite_existing_user_by_different_org_admin_should_modify_user_name_if_ user2 = User.objects.create( firstName="first", lastName="last", - email=f"{secrets.token_hex(4)}@crossfeed.cisa.gov", + email="{}@crossfeed.cisa.gov".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -359,10 +359,10 @@ def test_invite_existing_user_by_different_org_admin_should_modify_user_name_if_ "firstName": "new first name", "lastName": "new last name", "email": email, - "organization": str(organization2.id), + "organization": "{}".format(organization2.id), "organizationAdmin": False, }, - headers={"Authorization": f"Bearer {create_jwt_token(user2)}"}, + headers={"Authorization": "Bearer {}".format(create_jwt_token(user2))}, ) assert response.status_code == 200 @@ -377,7 +377,7 @@ def test_invite_existing_user_by_different_org_admin_should_modify_user_name_if_ for role in data["roles"] if role["organization"]["id"] == str(organization2.id) ] - assert role_for_org2, f"No role found for organization {organization2.id}" + assert role_for_org2, "No role found for organization {}".format(organization2.id) assert role_for_org2[0]["approved"] is True assert role_for_org2[0]["role"] == "user" @@ -386,8 +386,8 @@ def test_invite_existing_user_by_different_org_admin_should_modify_user_name_if_ def test_invite_existing_user_by_same_org_admin_should_update_user_org_role(): """Invite existing user by same organization admin should work, and should update the user organization role.""" organization = Organization.objects.create( - name=f"test-{secrets.token_hex(4)}", - rootDomains=[f"test-{secrets.token_hex(4)}"], + name="test-{}".format(secrets.token_hex(4)), + rootDomains=["test-{}".format(secrets.token_hex(4))], ipBlocks=[], isPassive=False, createdAt=datetime.now(), @@ -396,9 +396,9 @@ def test_invite_existing_user_by_same_org_admin_should_update_user_org_role(): admin_user = User.objects.create( firstName="first", lastName="last", - email=f"{secrets.token_hex(4)}@crossfeed.cisa.gov", + email="{}@crossfeed.cisa.gov".format(secrets.token_hex(4)), ) - email = f"{secrets.token_hex(4)}@crossfeed.cisa.gov" + email = "{}@crossfeed.cisa.gov".format(secrets.token_hex(4)) user = User.objects.create(firstName="first", lastName="last", email=email) Role.objects.create( role="user", @@ -412,7 +412,7 @@ def test_invite_existing_user_by_same_org_admin_should_update_user_org_role(): user2 = User.objects.create( firstName="first", lastName="last", - email=f"{secrets.token_hex(4)}@crossfeed.cisa.gov", + email="{}@crossfeed.cisa.gov".format(secrets.token_hex(4)), userType=UserType.STANDARD, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -431,10 +431,10 @@ def test_invite_existing_user_by_same_org_admin_should_update_user_org_role(): "firstName": "first", "lastName": "last", "email": email, - "organization": str(organization.id), + "organization": "{}".format(organization.id), "organizationAdmin": True, }, - headers={"Authorization": f"Bearer {create_jwt_token(user2)}"}, + headers={"Authorization": "Bearer {}".format(create_jwt_token(user2))}, ) assert response.status_code == 200 @@ -454,15 +454,15 @@ def test_invite_existing_user_by_global_admin_should_update_user_type(): User.objects.create( firstName="first", lastName="last", - email=f"{secrets.token_hex(4)}@crossfeed.cisa.gov", + email="{}@crossfeed.cisa.gov".format(secrets.token_hex(4)), ) - email = f"{secrets.token_hex(4)}@crossfeed.cisa.gov" + email = "{}@crossfeed.cisa.gov".format(secrets.token_hex(4)) user = User.objects.create(firstName="first", lastName="last", email=email) user2 = User.objects.create( firstName="first", lastName="last", - email=f"{secrets.token_hex(4)}@crossfeed.cisa.gov", + email="{}@crossfeed.cisa.gov".format(secrets.token_hex(4)), userType=UserType.GLOBAL_ADMIN, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -476,7 +476,7 @@ def test_invite_existing_user_by_global_admin_should_update_user_type(): "email": email, "userType": UserType.GLOBAL_ADMIN, }, - headers={"Authorization": f"Bearer {create_jwt_token(user2)}"}, + headers={"Authorization": "Bearer {}".format(create_jwt_token(user2))}, ) assert response.status_code == 200 @@ -496,15 +496,15 @@ def test_invite_existing_user_by_global_view_should_not_work(): User.objects.create( firstName="first", lastName="last", - email=f"{secrets.token_hex(4)}@crossfeed.cisa.gov", + email="{}@crossfeed.cisa.gov".format(secrets.token_hex(4)), ) - email = f"{secrets.token_hex(4)}@crossfeed.cisa.gov" + email = "{}@crossfeed.cisa.gov".format(secrets.token_hex(4)) User.objects.create(firstName="first", lastName="last", email=email) user2 = User.objects.create( firstName="first", lastName="last", - email=f"{secrets.token_hex(4)}@crossfeed.cisa.gov", + email="{}@crossfeed.cisa.gov".format(secrets.token_hex(4)), userType=UserType.GLOBAL_VIEW, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -513,7 +513,7 @@ def test_invite_existing_user_by_global_view_should_not_work(): response = client.post( "/users", json={"firstName": "first", "lastName": "last", "email": email}, - headers={"Authorization": f"Bearer {create_jwt_token(user2)}"}, + headers={"Authorization": "Bearer {}".format(create_jwt_token(user2))}, ) assert response.status_code == 403 @@ -528,7 +528,7 @@ def test_register_approve_success(mock_email): current_user = User.objects.create( firstName="Admin", lastName="User", - email=f"{secrets.token_hex(4)}@crossfeed.cisa.gov", + email="{}@crossfeed.cisa.gov".format(secrets.token_hex(4)), userType=UserType.GLOBAL_ADMIN, regionId="region-1", createdAt=datetime.now(), @@ -537,16 +537,15 @@ def test_register_approve_success(mock_email): user_to_approve = User.objects.create( firstName="Test", lastName="User", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), regionId="region-1", createdAt=datetime.now(), updatedAt=datetime.now(), ) - # Mock email sending response = client.put( - f"/users/{user_to_approve.id}/register/approve", - headers={"Authorization": f"Bearer {create_jwt_token(current_user)}"}, + "/users/{}/register/approve".format(user_to_approve.id), + headers={"Authorization": "Bearer {}".format(create_jwt_token(current_user))}, ) assert response.status_code == 200 @@ -567,7 +566,7 @@ def test_register_approve_unauthorized_region(): current_user = User.objects.create( firstName="Admin", lastName="User", - email=f"{secrets.token_hex(4)}@crossfeed.cisa.gov", + email="{}@crossfeed.cisa.gov".format(secrets.token_hex(4)), userType=UserType.REGIONAL_ADMIN, regionId="1", createdAt=datetime.now(), @@ -576,15 +575,15 @@ def test_register_approve_unauthorized_region(): user_to_approve = User.objects.create( firstName="Test", lastName="User", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), regionId="2", createdAt=datetime.now(), updatedAt=datetime.now(), ) response = client.put( - f"/users/{user_to_approve.id}/register/approve", - headers={"Authorization": f"Bearer {create_jwt_token(current_user)}"}, + "/users/{}/register/approve".format(user_to_approve.id), + headers={"Authorization": "Bearer {}".format(create_jwt_token(current_user))}, ) assert response.status_code == 403 @@ -599,7 +598,7 @@ def test_register_deny_success(mock_denied_email): current_user = User.objects.create( firstName="Admin", lastName="User", - email=f"{secrets.token_hex(4)}@crossfeed.cisa.gov", + email="{}@crossfeed.cisa.gov".format(secrets.token_hex(4)), userType=UserType.GLOBAL_ADMIN, regionId="1", createdAt=datetime.now(), @@ -608,14 +607,14 @@ def test_register_deny_success(mock_denied_email): user_to_deny = User.objects.create( firstName="Test", lastName="User", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), regionId="1", createdAt=datetime.now(), updatedAt=datetime.now(), ) response = client.put( - f"/users/{user_to_deny.id}/register/deny", - headers={"Authorization": f"Bearer {create_jwt_token(current_user)}"}, + "/users/{}/register/deny".format(user_to_deny.id), + headers={"Authorization": "Bearer {}".format(create_jwt_token(current_user))}, ) assert response.status_code == 200 @@ -635,7 +634,7 @@ def test_register_deny_unauthorized_region(): current_user = User.objects.create( firstName="Admin", lastName="User", - email=f"{secrets.token_hex(4)}@crossfeed.cisa.gov", + email="{}@crossfeed.cisa.gov".format(secrets.token_hex(4)), userType=UserType.REGIONAL_ADMIN, regionId="1", createdAt=datetime.now(), @@ -644,15 +643,15 @@ def test_register_deny_unauthorized_region(): user_to_deny = User.objects.create( firstName="Test", lastName="User", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), regionId="2", createdAt=datetime.now(), updatedAt=datetime.now(), ) response = client.put( - f"/users/{user_to_deny.id}/register/deny", - headers={"Authorization": f"Bearer {create_jwt_token(current_user)}"}, + "/users/{}/register/deny".format(user_to_deny.id), + headers={"Authorization": "Bearer {}".format(create_jwt_token(current_user))}, ) print(response.json()) diff --git a/backend/src/xfd_django/xfd_api/tests/test_vulnerabilities.py b/backend/src/xfd_django/xfd_api/tests/test_vulnerabilities.py index bfb3c62b9..476259c58 100644 --- a/backend/src/xfd_django/xfd_api/tests/test_vulnerabilities.py +++ b/backend/src/xfd_django/xfd_api/tests/test_vulnerabilities.py @@ -35,7 +35,7 @@ def user(): user = User.objects.create( firstName="", lastName="", - email=f"{secrets.token_hex(4)}@example.com", + email="{}@example.com".format(secrets.token_hex(4)), userType=UserType.GLOBAL_ADMIN, createdAt=datetime.now(), updatedAt=datetime.now(), @@ -152,7 +152,7 @@ def test_get_vulnerability_by_id(user, vulnerability): """Test vulnerability.""" # Get vulnerability by Id. response = client.get( - f"/vulnerabilities/{str(vulnerability.id)}", + "/vulnerabilities/{}".format(str(vulnerability.id)), headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) data = response.json() @@ -168,7 +168,7 @@ def test_get_vulnerability_by_id_fails_404(user, vulnerability): """Test vulnerability.""" # Get error 404 if vulnerability does not exist response = client.get( - f"/vulnerabilities/{bad_id}", + "/vulnerabilities/{}".format(bad_id), headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -205,7 +205,7 @@ def test_update_vulnerability(user, vulnerability): } response = client.put( - f"/vulnerabilities/{str(vulnerability.id)}", + "/vulnerabilities/{}".format(str(vulnerability.id)), json=new_data, headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -255,7 +255,7 @@ def test_update_vulnerability_fails_404(user, vulnerability): } response = client.put( - f"/vulnerabilities/{bad_id}", + "/vulnerabilities/{}".format(bad_id), json=new_data, headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -287,7 +287,7 @@ def test_update_vulnerability_fails_422(user, vulnerability): } response = client.put( - f"/vulnerabilities/{vulnerability.id}", + "/vulnerabilities/{}".format(vulnerability.id), json=new_data, headers={"Authorization": "Bearer " + create_jwt_token(user)}, ) @@ -312,7 +312,9 @@ def test_search_vulnerabilities_id(user, vulnerability): for vuln in data["result"]: assert vuln["id"] == str( vulnerability.id - ), f"Vulnerability ID {vuln['id']} does not match the expected {vulnerability.id}" + ), "Vulnerability ID {} does not match the expected {}".format( + vuln["id"], vulnerability.id + ) @pytest.mark.django_db(transaction=True) @@ -334,7 +336,9 @@ def test_search_vulnerabilities_by_title(user, vulnerability): for vuln in data["result"]: assert ( vuln["title"] == search_fields["title"] - ), f"Vulnerability title {vuln['title']} does not match the expected {search_fields['title']}" + ), "Vulnerability title {} does not match the expected {}".format( + vuln["title"], search_fields["title"] + ) @pytest.mark.django_db(transaction=True) @@ -357,7 +361,9 @@ def test_search_vulnerabilities_by_cpe(user, vulnerability): for vuln in data["result"]: assert ( vuln["cpe"] == search_fields["cpe"] - ), f"Vulnerability CPE {vuln['cpe']} does not match the expected {search_fields['cpe']}" + ), "Vulnerability CPE {} does not match the expected {}".format( + vuln["cpe"], search_fields["cpe"] + ) @pytest.mark.django_db(transaction=True) @@ -385,7 +391,9 @@ def test_search_vulnerabilities_by_severity(user, vulnerability): for vuln in data["result"]: assert ( vuln["severity"] == search_fields["severity"] - ), f"Vulnerability severity {vuln['severity']} does not match the expected {search_fields['severity']}" + ), "Vulnerability severity {} does not match the expected {}".format( + vuln["severity"], search_fields["severity"] + ) @pytest.mark.django_db(transaction=True) @@ -410,7 +418,9 @@ def test_search_vulnerabilities_by_domain_id(user, vulnerability): for vuln in data["result"]: assert ( str(vuln["domain"]["name"]) == domain_name - ), f"Vulnerability with ID {vuln['id']} does not have the expected domain_id {domain_name}" + ), "Vulnerability with ID {} does not have the expected domain_id {}".format( + vuln["id"], domain_name + ) @pytest.mark.django_db(transaction=True) @@ -435,7 +445,9 @@ def test_search_vulnerabilities_by_state(user, vulnerability): for vuln in data["result"]: assert ( vuln["state"] == state_to_search - ), f"Vulnerability with ID {vuln['id']} does not have the expected state {state_to_search}" + ), "Vulnerability with ID {} does not have the expected state {}".format( + vuln["id"], state_to_search + ) @pytest.mark.django_db(transaction=True) @@ -460,7 +472,9 @@ def test_search_vulnerabilities_by_substate(user, vulnerability): for vuln in data["result"]: assert ( vuln["substate"] == substate_to_search - ), f"Vulnerability with ID {vuln['id']} does not have the expected substate {substate_to_search}" + ), "Vulnerability with ID {} does not have the expected substate {}".format( + vuln["id"], substate_to_search + ) @pytest.mark.django_db(transaction=True) @@ -491,10 +505,14 @@ def test_search_vulnerabilities_by_organization_id(user, vulnerability): domain = Domain.objects.get(id=domain_id) assert ( str(domain.organization.id) == organization_id - ), f"Vulnerability with ID {vulnerability_data.get('id', 'N/A')} does not belong to the expected organization" + ), "Vulnerability with ID {} does not belong to the expected organization".format( + vulnerability_data.get("id", "N/A") + ) else: print( - f"Warning: 'domain_id' key not found in vulnerability with ID {vulnerability_data.get('id', 'N/A')}" + "Warning: 'domain_id' key not found in vulnerability with ID {}".format( + vulnerability_data.get("id", "N/A") + ) ) @@ -517,12 +535,14 @@ def test_search_vulnerabilities_by_is_kev(user, vulnerability): assert "result" in data, "Response does not contain 'result' key" assert ( len(data["result"]) > 0 - ), f"No vulnerabilities found for the given isKev value {is_kev_to_search}" + ), "No vulnerabilities found for the given isKev value {}".format(is_kev_to_search) for vuln in data["result"]: assert ( vuln["isKev"] == is_kev_to_search - ), f"Vulnerability with ID {vuln['id']} does not have the expected 'isKev' value {is_kev_to_search}" + ), "Vulnerability with ID {} does not have the expected 'isKev' value {}".format( + vuln["id"], is_kev_to_search + ) @pytest.mark.django_db(transaction=True) @@ -552,15 +572,21 @@ def test_search_vulnerabilities_by_multiple_criteria(user, vulnerability): assert "result" in data, "Response does not contain 'result' key" assert ( len(data["result"]) > 0 - ), f"No vulnerabilities found for the given 'state' = {state_to_search} and 'substate' = {substate_to_search}" + ), "No vulnerabilities found for the given 'state' = {} and 'substate' = {}".format( + state_to_search, substate_to_search + ) for vuln in data["result"]: assert ( vuln["state"] == state_to_search - ), f"Vulnerability with ID {vuln['id']} does not have the expected 'state' value {state_to_search}" + ), "Vulnerability with ID {} does not have the expected 'state' value {}".format( + vuln["id"], state_to_search + ) assert ( vuln["substate"] == substate_to_search - ), f"Vulnerability with ID {vuln['id']} does not have the expected 'substate' value {substate_to_search}" + ), "Vulnerability with ID {} does not have the expected 'substate' value {}".format( + vuln["id"], substate_to_search + ) @pytest.mark.django_db(transaction=True) diff --git a/backend/src/xfd_django/xfd_api/views.py b/backend/src/xfd_django/xfd_api/views.py index 6e8e9cef0..004e95cf7 100644 --- a/backend/src/xfd_django/xfd_api/views.py +++ b/backend/src/xfd_django/xfd_api/views.py @@ -129,7 +129,9 @@ async def matomo_proxy( "/plugins/Morpheus/fonts/matomo.ttf", ]: return RedirectResponse( - url=f"https://cdn.jsdelivr.net/gh/matomo-org/matomo@3.14.1{request.url.path}" + url="https://cdn.jsdelivr.net/gh/matomo-org/matomo@5.2.1{}".format( + request.url.path + ) ) # Ensure only global admin can access other paths @@ -1209,7 +1211,9 @@ async def call_search_vulnerabilities( # Convert each ORM instance to a Pydantic model result = [GetVulnerabilityResponse.model_validate(v) for v in vulnerabilities] except Exception as e: - raise HTTPException(status_code=500, detail=f"Serialization error: {str(e)}") + raise HTTPException( + status_code=500, detail="Serialization error: {}".format(str(e)) + ) return VulnerabilitySearchResponse(result=result, count=count) diff --git a/backend/src/xfd_django/xfd_django/asgi.py b/backend/src/xfd_django/xfd_django/asgi.py index bf1fb729b..a461fdc1d 100644 --- a/backend/src/xfd_django/xfd_django/asgi.py +++ b/backend/src/xfd_django/xfd_django/asgi.py @@ -38,7 +38,7 @@ def set_security_headers(response: Response): # Set Content Security Policy (CSP) csp_value = "; ".join( [ - f"{key} {' '.join(map(str, value))}" + "{} {}".format(key, " ".join(map(str, value))) for key, value in settings.SECURE_CSP_POLICY.items() if isinstance(value, (list, tuple)) ] @@ -98,7 +98,7 @@ async def startup(): """Start up Redis with ElastiCache.""" # Initialize Redis with the ElastiCache endpoint app.state.redis = await aioredis.from_url( - f"redis://{settings.ELASTICACHE_ENDPOINT}", + "redis://{}".format(settings.ELASTICACHE_ENDPOINT), encoding="utf-8", decode_responses=True, max_connections=100, @@ -139,7 +139,7 @@ async def run_scheduler(): await scheduler_handler({}, {}) await asyncio.sleep(120) # Run every 120 seconds except Exception as e: - print(f"Error running local scheduler: {e}") + print("Error running local scheduler: {}".format(e)) app = get_application() diff --git a/backend/src/xfd_django/xfd_django/docker_events.py b/backend/src/xfd_django/xfd_django/docker_events.py index 82a398df7..0cfe32c50 100644 --- a/backend/src/xfd_django/xfd_django/docker_events.py +++ b/backend/src/xfd_django/xfd_django/docker_events.py @@ -67,11 +67,13 @@ def listen_for_docker_events(): continue # Log and process the event - print(f"Processing Docker event: {json.dumps(payload, indent=2)}") + print( + "Processing Docker event: {}".format(json.dumps(payload, indent=2)) + ) # Use asyncio to process the event asyncio.run(update_scan_task_status(payload, None)) except Exception as e: - print(f"Error processing Docker event: {e}") + print("Error processing Docker event: {}".format(e)) except Exception as e: - print(f"Error connecting to Docker: {e}") + print("Error connecting to Docker: {}".format(e)) diff --git a/backend/src/xfd_django/xfd_django/settings.py b/backend/src/xfd_django/xfd_django/settings.py index ab0bc2776..10bbc1964 100644 --- a/backend/src/xfd_django/xfd_django/settings.py +++ b/backend/src/xfd_django/xfd_django/settings.py @@ -99,6 +99,9 @@ "PASSWORD": os.getenv("MDL_PASSWORD"), "HOST": os.getenv("DB_HOST"), "PORT": "5432", + "TEST": { + "NAME": "mini_data_lake_test", # Test database for mini_data_lake + }, }, } diff --git a/backend/worker/generate_config.sh b/backend/worker/generate_config.sh index dbec44545..89c9e7367 100755 --- a/backend/worker/generate_config.sh +++ b/backend/worker/generate_config.sh @@ -14,7 +14,7 @@ key1=${PE_SHODAN_API_KEYS} [pe_api] pe_api_key=${PE_API_KEY} -pe_api_url=https://api.staging-cd.crossfeed.cyber.dhs.gov/pe/apiv1/ +pe_api_url=${PE_API_URL} cf_api_key=${CF_API_KEY} [staging] diff --git a/backend/worker/mitmproxy_sign_requests.py b/backend/worker/mitmproxy_sign_requests.py index c98ac6e3b..85ec423ef 100644 --- a/backend/worker/mitmproxy_sign_requests.py +++ b/backend/worker/mitmproxy_sign_requests.py @@ -109,7 +109,7 @@ def request(self, flow): except Exception as e: flow.response = http.HTTPResponse.make( 500, - f"mitmproxy failed:
{e}

{traceback.format_exc()}", + "mitmproxy failed:
{}

{}".format(e, traceback.format_exc()), {"Content-Type": "text/html"}, ) diff --git a/backend/worker/worker.py b/backend/worker/worker.py index 3819ac083..004aff39f 100644 --- a/backend/worker/worker.py +++ b/backend/worker/worker.py @@ -28,15 +28,15 @@ async def main(): # Validate the scan name and dynamically load the appropriate handler try: - task_module = importlib.import_module(f"xfd_api.tasks.{scan_name}") + task_module = importlib.import_module("xfd_api.tasks.{}".format(scan_name)) scan_fn = task_module.handler except ModuleNotFoundError: - raise ValueError(f"No task handler found for scan name: {scan_name}") + raise ValueError("No task handler found for scan name: {}".format(scan_name)) # Fetch scan schema scan_schema = SCAN_SCHEMA.get(scan_name) if not scan_schema: - raise ValueError(f"No schema found for scan name: {scan_name}") + raise ValueError("No schema found for scan name: {}".format(scan_name)) # Execute the task if getattr(scan_schema, "global_scan", False): diff --git a/dev.env.example b/dev.env.example index a6cf80689..bd5e885ba 100644 --- a/dev.env.example +++ b/dev.env.example @@ -6,7 +6,9 @@ DB_PASSWORD=password DB_NAME=crossfeed JWT_SECRET=CHANGE_ME -MDL_USERNAME=mdl +# Make the username the same as default db +# so pytest can create both test DBs +MDL_USERNAME=crossfeed MDL_PASSWORD=password MDL_NAME=crossfeed_mini_datalake @@ -126,3 +128,7 @@ ELASTICACHE_ENDPOINT=redis WHOIS_XML_KEY=change_me QUALYS_USERNAME=change_me QUALYS_PASSWORD=change_me + +IS_DMZ=1 +POSTGRES_SCAN_USER= +POSTGRES_SCAN_PASSWORD= diff --git a/docker-compose.yml b/docker-compose.yml index fd45cb38c..2be9bd074 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -112,7 +112,7 @@ services: # LOGGING_QUIET: 'true' matomodb: - image: mariadb:10.6 + image: mariadb:11.4 command: --max-allowed-packet=64MB networks: - backend @@ -122,9 +122,11 @@ services: - MYSQL_ROOT_PASSWORD=password logging: driver: none + ports: + - 3306:3306 matomo: - image: matomo:3.14.1 + image: matomo:5.2.1 user: root networks: - backend @@ -141,6 +143,9 @@ services: - MATOMO_GENERAL_ASSUME_SECURE_PROTOCOL=1 logging: driver: none + ports: + - "8080:80" + # rabbitmq: # image: 'rabbitmq:3.8-management' # ports: diff --git a/docs/package-lock.json b/docs/package-lock.json index a76caa000..bfd82d4f8 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -6,6 +6,8 @@ "dependencies": { "@reach/router": "^1.3.4", "clipboardy": "^3.0.0", + "cross-spawn": "^7.0.6", + "nanoid": "^5.0.9", "resolve-url-loader": "^5.0.0", "swagger-jsdoc": "^5.0.1" }, @@ -8225,9 +8227,9 @@ "engines": { "node": ">= 8" }, - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "version": "7.0.3" + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "version": "7.0.6" }, "node_modules/crypto-random-string": { "dev": true, @@ -15895,10 +15897,10 @@ }, "node_modules/nanoid": { "bin": { - "nanoid": "bin/nanoid.cjs" + "nanoid": "bin/nanoid.js" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": "^18 || >=20" }, "funding": [ { @@ -15906,9 +15908,9 @@ "url": "https://github.com/sponsors/ai" } ], - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "version": "3.3.6" + "integrity": "sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.9.tgz", + "version": "5.0.9" }, "node_modules/napi-build-utils": { "dev": true, @@ -18008,6 +18010,23 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "version": "4.2.0" }, + "node_modules/postcss/node_modules/nanoid": { + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "version": "3.3.8" + }, "node_modules/prebuild-install": { "bin": { "prebuild-install": "bin.js" diff --git a/docs/package.json b/docs/package.json index 956afbd29..9d36ba28e 100644 --- a/docs/package.json +++ b/docs/package.json @@ -2,6 +2,8 @@ "dependencies": { "@reach/router": "^1.3.4", "clipboardy": "^3.0.0", + "cross-spawn": "^7.0.6", + "nanoid": "^5.0.9", "resolve-url-loader": "^5.0.0", "swagger-jsdoc": "^5.0.1" }, diff --git a/frontend/package-lock.json b/frontend/package-lock.json index e73e72ad2..ab505ee31 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -22,19 +22,25 @@ "@trussworks/react-uswds": "^5.1.1", "autoprefixer": "^10.4.13", "aws-amplify": "^5.3.12", - "axios": "^1.6.2", + "axios": "^1.7.9", "classnames": "^2.3.2", + "cookie": "^1.0.2", "cors": "^2.8.5", + "cross-spawn": "^7.0.6", "d3-scale": "^4.0.2", "date-fns": "^3.6.0", "date-fns-tz": "^3.1.3", "decamelize": "^6.0.0", - "dompurify": "^3.0.5", + "dompurify": "^2.5.8", "express-rate-limit": "^7.1.3", + "fast-xml-parser": "^4.5.1", "file-saver": "^2.0.5", + "http-proxy-middleware": "^3.0.3", "jspdf": "^2.5.1", "jwt-decode": "^3.1.2", + "nanoid": "^5.0.9", "papaparse": "^5.3.2", + "path-to-regexp": "^8.2.0", "postcss": "^8.4.18", "query-string": "^7.1.1", "react": "^18.2.0", @@ -52,7 +58,8 @@ "react-table": "^7.8.0", "react-to-print": "^2.15.1", "resolve-url-loader": "^5.0.0", - "universal-cookie": "^4.0.4", + "rollup": "^2.79.2", + "universal-cookie": "^7.2.2", "uswds": "^2.13.3", "web-vitals": "^2.1.4" }, @@ -83,7 +90,7 @@ "eslint-config-react-app": "^7.0.1", "eslint-plugin-prettier": "^5.1.2", "eslint-plugin-react": "^7.31.10", - "express": "^4.18.2", + "express": "^4.21.2", "helmet": "^7.0.0", "jest-date-mock": "^1.0.8", "prettier": "^3.0.3", @@ -97,7 +104,7 @@ "serverless-webpack": "^5.11.0", "ts-jest": "^29.1.1", "typescript": "^4.8.4", - "webpack": "^5.88", + "webpack": "^5.97.1", "webpack-cli": "^5.1" }, "engines": { @@ -171,8 +178,8 @@ }, "node_modules/@aws-amplify/analytics": { "dependencies": { - "@aws-amplify/cache": "5.1.18", - "@aws-amplify/core": "5.8.12", + "@aws-amplify/cache": "5.1.20", + "@aws-amplify/core": "5.8.14", "@aws-sdk/client-firehose": "3.6.1", "@aws-sdk/client-kinesis": "3.6.1", "@aws-sdk/client-personalize-events": "3.6.1", @@ -181,9 +188,9 @@ "tslib": "^1.8.0", "uuid": "^3.2.1" }, - "integrity": "sha512-8z3mXLzUoMkR47W9UrK/yNw7Qo98HuhYaPW9gQa0/H5mC4IIiN/ka0RurefKTx89xkPUxIuv7pAIWqMcg8NMCA==", - "resolved": "https://registry.npmjs.org/@aws-amplify/analytics/-/analytics-6.5.12.tgz", - "version": "6.5.12" + "integrity": "sha512-sAv7X8t3WL+t+0z+zAahIXhx/f5rrstCy1RlMEykxP5FWEwKKTpDBO9LdWZLGNnR1nYeTUeKwSl2zzn2FdYS0w==", + "resolved": "https://registry.npmjs.org/@aws-amplify/analytics/-/analytics-6.5.14.tgz", + "version": "6.5.14" }, "node_modules/@aws-amplify/analytics/node_modules/tslib": { "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", @@ -192,29 +199,29 @@ }, "node_modules/@aws-amplify/api": { "dependencies": { - "@aws-amplify/api-graphql": "3.4.18", - "@aws-amplify/api-rest": "3.5.12", + "@aws-amplify/api-graphql": "3.4.22", + "@aws-amplify/api-rest": "3.5.14", "tslib": "^1.8.0" }, - "integrity": "sha512-LHxfHpwu6hFm6sMiPB6UAKzj5Aoccp/r4527dTg6N/aQwQXyWEGkGSK4dBSSM/Sf0vPADo9jn6WGNttCXulDyw==", - "resolved": "https://registry.npmjs.org/@aws-amplify/api/-/api-5.4.12.tgz", - "version": "5.4.12" + "integrity": "sha512-j4yTG0cOK0YvBNItamY2Nhugn5mP3WJEDyhUZSGY16k1h4GWzG0k247GMqAJpDwDp6e5KvQZKt92i+c1+ZW+dg==", + "resolved": "https://registry.npmjs.org/@aws-amplify/api/-/api-5.4.16.tgz", + "version": "5.4.16" }, "node_modules/@aws-amplify/api-graphql": { "dependencies": { - "@aws-amplify/api-rest": "3.5.12", - "@aws-amplify/auth": "5.6.12", - "@aws-amplify/cache": "5.1.18", - "@aws-amplify/core": "5.8.12", - "@aws-amplify/pubsub": "5.5.12", + "@aws-amplify/api-rest": "3.5.14", + "@aws-amplify/auth": "5.6.15", + "@aws-amplify/cache": "5.1.20", + "@aws-amplify/core": "5.8.14", + "@aws-amplify/pubsub": "5.6.2", "graphql": "15.8.0", "tslib": "^1.8.0", "uuid": "^3.2.1", "zen-observable-ts": "0.8.19" }, - "integrity": "sha512-4rZ0vhfTQnP+kCL+uc0BZdHsjNU1vLj5+xOPIkNrI0Y0VdN9I2aKfWjBQx8i2BIPeF3B+xSKKuGhIJD6WCxcpg==", - "resolved": "https://registry.npmjs.org/@aws-amplify/api-graphql/-/api-graphql-3.4.18.tgz", - "version": "3.4.18" + "integrity": "sha512-6Y8G+RfAZWy4tjTf8iC/c8YEDT15GvpLNep7NGhKAsemQ35CDg/AtktlFKbk5MrRP9+gd/qlU0hWBgTa1pQOGw==", + "resolved": "https://registry.npmjs.org/@aws-amplify/api-graphql/-/api-graphql-3.4.22.tgz", + "version": "3.4.22" }, "node_modules/@aws-amplify/api-graphql/node_modules/tslib": { "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", @@ -223,14 +230,14 @@ }, "node_modules/@aws-amplify/api-rest": { "dependencies": { - "@aws-amplify/core": "5.8.12", + "@aws-amplify/core": "5.8.14", "axios": "^1.6.5", "tslib": "^1.8.0", "url": "0.11.0" }, - "integrity": "sha512-WWUZU7MaKxxt9xw+FwnSWfbsXEwoDbGH6G8/S0YrcQeILbutLLcW4boW3d2vRaYjjC/1saVUHyrdO1mWZ++C5Q==", - "resolved": "https://registry.npmjs.org/@aws-amplify/api-rest/-/api-rest-3.5.12.tgz", - "version": "3.5.12" + "integrity": "sha512-+vqdckBs4+T/J1+uTbg8Lxd8toH1n0ttV8K89LQ7t9aaGntomLEQJlfBLtZyII8lM3oJyKB26J0Eh9z15IaH7Q==", + "resolved": "https://registry.npmjs.org/@aws-amplify/api-rest/-/api-rest-3.5.14.tgz", + "version": "3.5.14" }, "node_modules/@aws-amplify/api-rest/node_modules/tslib": { "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", @@ -244,15 +251,15 @@ }, "node_modules/@aws-amplify/auth": { "dependencies": { - "@aws-amplify/core": "5.8.12", - "amazon-cognito-identity-js": "6.3.13", + "@aws-amplify/core": "5.8.14", + "amazon-cognito-identity-js": "6.3.14", "buffer": "4.9.2", "tslib": "^1.8.0", "url": "0.11.0" }, - "integrity": "sha512-NX5E2l9Ovsbfsh2R0iNweNVVY3QtJRWpBrHPIOxzhqSxiwK0Cay/+9bQ8Uv7/O8s2NHByG1+kXM7zR+iDuYxfA==", - "resolved": "https://registry.npmjs.org/@aws-amplify/auth/-/auth-5.6.12.tgz", - "version": "5.6.12" + "integrity": "sha512-bMaP09rd/tIZvDAbhhVEEBdpoEgnt1ua5S6efQzfY6zpwdDLEgP+ZJ8hJLCjgPx5SpZ9G0+ltg0Ig5tBWAo2vA==", + "resolved": "https://registry.npmjs.org/@aws-amplify/auth/-/auth-5.6.15.tgz", + "version": "5.6.15" }, "node_modules/@aws-amplify/auth/node_modules/tslib": { "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", @@ -261,12 +268,12 @@ }, "node_modules/@aws-amplify/cache": { "dependencies": { - "@aws-amplify/core": "5.8.12", + "@aws-amplify/core": "5.8.14", "tslib": "^1.8.0" }, - "integrity": "sha512-1aZ8MvA+8PJur5cnJAbBUnCUCw3ACfjCI/s/qY+Fx1jKahci3J9Yl2+pf4A6Nk6e0IjtN6FVCOKUKcWV/5+QYQ==", - "resolved": "https://registry.npmjs.org/@aws-amplify/cache/-/cache-5.1.18.tgz", - "version": "5.1.18" + "integrity": "sha512-3mnfVm/u2ndio3j/0yywbKT3HpAuS2RJeuTlwqXpMOhZBdJJmzNMBTo5ZIkl5MlnppozQ3LD62sdT372hOwZiQ==", + "resolved": "https://registry.npmjs.org/@aws-amplify/cache/-/cache-5.1.20.tgz", + "version": "5.1.20" }, "node_modules/@aws-amplify/cache/node_modules/tslib": { "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", @@ -283,12 +290,12 @@ "isomorphic-unfetch": "^3.0.0", "react-native-url-polyfill": "^1.3.0", "tslib": "^1.8.0", - "universal-cookie": "^4.0.4", + "universal-cookie": "^7.2.2", "zen-observable-ts": "0.8.19" }, - "integrity": "sha512-kQkIRBiowtMawBPTviAkz6q9Od6IImrYxdnjFebHNqF1fuLq016jxhBLxiq5ztZDvkZX+IpSr1gzOZtNGkikvA==", - "resolved": "https://registry.npmjs.org/@aws-amplify/core/-/core-5.8.12.tgz", - "version": "5.8.12" + "integrity": "sha512-QU+3zQspE9f2CrZOtGDuHBZU9WqZ6PDQUEslVV+VCu2CduBDTtfnl1hCfVJ6vnUIxhwB24onpBwKz/IGZgh86g==", + "resolved": "https://registry.npmjs.org/@aws-amplify/core/-/core-5.8.14.tgz", + "version": "5.8.14" }, "node_modules/@aws-amplify/core/node_modules/tslib": { "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", @@ -297,11 +304,11 @@ }, "node_modules/@aws-amplify/datastore": { "dependencies": { - "@aws-amplify/api": "5.4.12", - "@aws-amplify/auth": "5.6.12", - "@aws-amplify/core": "5.8.12", - "@aws-amplify/pubsub": "5.5.12", - "amazon-cognito-identity-js": "6.3.13", + "@aws-amplify/api": "5.4.16", + "@aws-amplify/auth": "5.6.15", + "@aws-amplify/core": "5.8.14", + "@aws-amplify/pubsub": "5.6.2", + "amazon-cognito-identity-js": "6.3.14", "buffer": "4.9.2", "idb": "5.0.6", "immer": "9.0.6", @@ -310,21 +317,21 @@ "zen-observable-ts": "0.8.19", "zen-push": "0.2.1" }, - "integrity": "sha512-BnyZZPvYAka6D4OHfid7/UCBvXgpZTvXTydBW0YFZ3mIoRiTZC9+rcWm0i3EjtjUuGJuzbLhxDqklXGvUsXCkg==", - "resolved": "https://registry.npmjs.org/@aws-amplify/datastore/-/datastore-4.7.12.tgz", - "version": "4.7.12" + "integrity": "sha512-o+YAzARAlvtv4+iHERkyeClT84uP11HKPZ8s084TwwE03o/L1ym5dDBbhYq4vaB7meDurCNiuQLHVHosPYPlLQ==", + "resolved": "https://registry.npmjs.org/@aws-amplify/datastore/-/datastore-4.7.16.tgz", + "version": "4.7.16" }, "node_modules/@aws-amplify/geo": { "dependencies": { - "@aws-amplify/core": "5.8.12", - "@aws-sdk/client-location": "3.186.3", + "@aws-amplify/core": "5.8.14", + "@aws-sdk/client-location": "3.186.4", "@turf/boolean-clockwise": "6.5.0", "camelcase-keys": "6.2.2", "tslib": "^1.8.0" }, - "integrity": "sha512-H8cyusFfWhXANefNJz/rYAMAmD8cNPC36xzFfXrqHJTKplEUY+3dRMvkOx2gDZpqYF8Ij9qJ5BOoPfs7Jh6ySA==", - "resolved": "https://registry.npmjs.org/@aws-amplify/geo/-/geo-2.3.12.tgz", - "version": "2.3.12" + "integrity": "sha512-HKJlxu1e+yd5P7kD8tCwbMRaNJdusVPifargT7E8i0AY6FXiylYz2U8PedhcIRlgJykCIhuNoTMMA8nOVYgKHg==", + "resolved": "https://registry.npmjs.org/@aws-amplify/geo/-/geo-2.3.14.tgz", + "version": "2.3.14" }, "node_modules/@aws-amplify/geo/node_modules/tslib": { "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", @@ -333,17 +340,17 @@ }, "node_modules/@aws-amplify/interactions": { "dependencies": { - "@aws-amplify/core": "5.8.12", - "@aws-sdk/client-lex-runtime-service": "3.186.3", - "@aws-sdk/client-lex-runtime-v2": "3.186.3", + "@aws-amplify/core": "5.8.14", + "@aws-sdk/client-lex-runtime-service": "3.186.4", + "@aws-sdk/client-lex-runtime-v2": "3.186.4", "base-64": "1.0.0", "fflate": "0.7.3", "pako": "2.0.4", "tslib": "^1.8.0" }, - "integrity": "sha512-K1oo6GFS7kgq86QMjmF+dabuFEeJLAu1FK1tfTyFIhvrgZ4xfVnzdTXlJhS+ZJ5ZKc6WyzVmE8di/KllI+pTAA==", - "resolved": "https://registry.npmjs.org/@aws-amplify/interactions/-/interactions-5.2.18.tgz", - "version": "5.2.18" + "integrity": "sha512-RduNt/0zZOgsQa1sC/1Ro3q6m4rQ4JStdqEXWEujtkzmiRB6I1BzdxuM0bjOLvDAXqdVGy2dWRMgpmhRzg7JOg==", + "resolved": "https://registry.npmjs.org/@aws-amplify/interactions/-/interactions-5.2.21.tgz", + "version": "5.2.21" }, "node_modules/@aws-amplify/interactions/node_modules/tslib": { "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", @@ -352,20 +359,20 @@ }, "node_modules/@aws-amplify/notifications": { "dependencies": { - "@aws-amplify/cache": "5.1.18", - "@aws-amplify/core": "5.8.12", - "@aws-amplify/rtn-push-notification": "1.1.14", + "@aws-amplify/cache": "5.1.20", + "@aws-amplify/core": "5.8.14", + "@aws-amplify/rtn-push-notification": "1.1.15", "lodash": "^4.17.21", "uuid": "^3.2.1" }, - "integrity": "sha512-fH1k8P1Nts/1OIy8IKQjWpJgdsql0562CPpwGBVvPnRYqnkPxvzImjZdhwTgpu+vxjDBKEky/Buu9ws+ST7Myg==", - "resolved": "https://registry.npmjs.org/@aws-amplify/notifications/-/notifications-1.6.13.tgz", - "version": "1.6.13" + "integrity": "sha512-gLz26cdn0H1J4rbOJg4K6pnUARAUgfUb9OtlfoTYaHjPR8rWBphrACNEJBOWZKuRuJi3bSIVQy0EZT8sbYr4tA==", + "resolved": "https://registry.npmjs.org/@aws-amplify/notifications/-/notifications-1.6.16.tgz", + "version": "1.6.16" }, "node_modules/@aws-amplify/predictions": { "dependencies": { - "@aws-amplify/core": "5.8.12", - "@aws-amplify/storage": "5.9.12", + "@aws-amplify/core": "5.8.14", + "@aws-amplify/storage": "5.9.16", "@aws-sdk/client-comprehend": "3.6.1", "@aws-sdk/client-polly": "3.6.1", "@aws-sdk/client-rekognition": "3.6.1", @@ -377,9 +384,9 @@ "tslib": "^1.8.0", "uuid": "^3.2.1" }, - "integrity": "sha512-KY2YUDkhNGtRIHDYDcuNIVxAfUbLP2vH1268TXRoUaZvRz5NKTKAje8Ht5AnoCDhSWTN7nduoivL97fRzo6bJA==", - "resolved": "https://registry.npmjs.org/@aws-amplify/predictions/-/predictions-5.5.12.tgz", - "version": "5.5.12" + "integrity": "sha512-8Zu/BQjK8PAD3KI44OMSadz/o9WGujipQAW2qH6LgVpOS4e7l1g2cPEw5xwSBrodJOiXJ6REyWbzujXlp1ZTDw==", + "resolved": "https://registry.npmjs.org/@aws-amplify/predictions/-/predictions-5.5.17.tgz", + "version": "5.5.17" }, "node_modules/@aws-amplify/predictions/node_modules/tslib": { "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", @@ -388,9 +395,9 @@ }, "node_modules/@aws-amplify/pubsub": { "dependencies": { - "@aws-amplify/auth": "5.6.12", - "@aws-amplify/cache": "5.1.18", - "@aws-amplify/core": "5.8.12", + "@aws-amplify/auth": "5.6.15", + "@aws-amplify/cache": "5.1.20", + "@aws-amplify/core": "5.8.14", "buffer": "4.9.2", "graphql": "15.8.0", "tslib": "^1.8.0", @@ -398,9 +405,9 @@ "uuid": "^3.2.1", "zen-observable-ts": "0.8.19" }, - "integrity": "sha512-eD57TUee9n7ECNPWFIl1TcZmQf8+usiB2vo7t6nBgjCoudYRhYh8ZPfxg94uqfDdWBXMbRoBI0JPISyEQo2xKA==", - "resolved": "https://registry.npmjs.org/@aws-amplify/pubsub/-/pubsub-5.5.12.tgz", - "version": "5.5.12" + "integrity": "sha512-aOrBMcEO9ulsPlTy0p91OS8PU9SiFNcFoT3NKmlTYok9XR/1Yf0dgAaXCttuOYCjjlt9T+QKyJ96m3z3cIJr1Q==", + "resolved": "https://registry.npmjs.org/@aws-amplify/pubsub/-/pubsub-5.6.2.tgz", + "version": "5.6.2" }, "node_modules/@aws-amplify/pubsub/node_modules/tslib": { "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", @@ -408,13 +415,13 @@ "version": "1.14.1" }, "node_modules/@aws-amplify/rtn-push-notification": { - "integrity": "sha512-C3y+iL8/9800wWOyIAVYAKzrHZkFeI3y2ZoJlj0xot+dCbQZkMr/XjO2ZwfC58XRKUiDKFfzCJW/XoyZlvthfw==", - "resolved": "https://registry.npmjs.org/@aws-amplify/rtn-push-notification/-/rtn-push-notification-1.1.14.tgz", - "version": "1.1.14" + "integrity": "sha512-nqn+xZkO4pX107rQmVieBRLGC9Qj65PDJqutmY5BX85DIt8vsPfWqLnuZlx4Y6uvaddosgmyt441U/Rd7Kc8ig==", + "resolved": "https://registry.npmjs.org/@aws-amplify/rtn-push-notification/-/rtn-push-notification-1.1.15.tgz", + "version": "1.1.15" }, "node_modules/@aws-amplify/storage": { "dependencies": { - "@aws-amplify/core": "5.8.12", + "@aws-amplify/core": "5.8.14", "@aws-sdk/md5-js": "3.6.1", "@aws-sdk/types": "3.6.1", "buffer": "4.9.2", @@ -422,9 +429,9 @@ "fast-xml-parser": "^4.2.5", "tslib": "^1.8.0" }, - "integrity": "sha512-aQ9JCRJL+Dlrg5mxlvZtKuBm1NjrU/8aFZ51VdHr4BWQBfAchSk9s3UcnHeh+o8pGWCl1z9W05yp12eXTWauEw==", - "resolved": "https://registry.npmjs.org/@aws-amplify/storage/-/storage-5.9.12.tgz", - "version": "5.9.12" + "integrity": "sha512-Ck2h2D14Hw1HdBaJ4e/QWtknvE+Whnn8iHLndSo9Z9rCU0QK8arIYs2KogvggihRi0drT+3ykfsZfpZYco/WCg==", + "resolved": "https://registry.npmjs.org/@aws-amplify/storage/-/storage-5.9.16.tgz", + "version": "5.9.16" }, "node_modules/@aws-amplify/storage/node_modules/tslib": { "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", @@ -546,36 +553,36 @@ }, "node_modules/@aws-crypto/crc32/node_modules/@aws-sdk/types": { "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" }, - "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", - "version": "3.609.0" + "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", + "version": "3.723.0" }, "node_modules/@aws-crypto/crc32/node_modules/@aws-sdk/types/node_modules/tslib": { - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "version": "2.6.3" + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "version": "2.8.1" }, "node_modules/@aws-crypto/crc32/node_modules/@smithy/types": { "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" }, - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "version": "3.3.0" + "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", + "version": "4.1.0" }, "node_modules/@aws-crypto/crc32/node_modules/@smithy/types/node_modules/tslib": { - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "version": "2.6.3" + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "version": "2.8.1" }, "node_modules/@aws-crypto/crc32/node_modules/tslib": { "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", @@ -3445,7 +3452,7 @@ "dependencies": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/client-sts": "3.186.3", + "@aws-sdk/client-sts": "3.186.4", "@aws-sdk/config-resolver": "3.186.0", "@aws-sdk/credential-provider-node": "3.186.0", "@aws-sdk/fetch-http-handler": "3.186.0", @@ -3481,9 +3488,9 @@ "engines": { "node": ">=12.0.0" }, - "integrity": "sha512-YP+GDY9OxyW4rJDqjreaNpiDBvH1uzO3ShJKl57hT92Kw2auDQxttcMf//J8dQXvrVkW/fVXCLI9TmtxS7XJOQ==", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-lex-runtime-service/-/client-lex-runtime-service-3.186.3.tgz", - "version": "3.186.3" + "integrity": "sha512-ftPIjDR5gmoSu9YXQLWdtiSxGfdSlHSWi+Zqun24f3YHZuLACN514JppvHTcNBztpmtnCU4qx3eFjKg6aMOosg==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lex-runtime-service/-/client-lex-runtime-service-3.186.4.tgz", + "version": "3.186.4" }, "node_modules/@aws-sdk/client-lex-runtime-service/node_modules/@aws-crypto/ie11-detection": { "dependencies": { @@ -4092,7 +4099,7 @@ "dependencies": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/client-sts": "3.186.3", + "@aws-sdk/client-sts": "3.186.4", "@aws-sdk/config-resolver": "3.186.0", "@aws-sdk/credential-provider-node": "3.186.0", "@aws-sdk/eventstream-handler-node": "3.186.0", @@ -4133,9 +4140,9 @@ "engines": { "node": ">=12.0.0" }, - "integrity": "sha512-4MJfSnb+qM8BYW4ToCvg7sDWN0NcEqK738hCZUV89cjp7pIHZ6osJuS/PsmZEommVj+71GviZ4buu5KUCfCGFQ==", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-lex-runtime-v2/-/client-lex-runtime-v2-3.186.3.tgz", - "version": "3.186.3" + "integrity": "sha512-ELoZYwTIoQWVw1a+ImE1n4z8b/5DqgzXti8QSoC2VaKv8dNwDO1xWal2LJhw20HPcTkAhHL8IA3gU/tTrWXk1g==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lex-runtime-v2/-/client-lex-runtime-v2-3.186.4.tgz", + "version": "3.186.4" }, "node_modules/@aws-sdk/client-lex-runtime-v2/node_modules/@aws-crypto/ie11-detection": { "dependencies": { @@ -4795,7 +4802,7 @@ "dependencies": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/client-sts": "3.186.3", + "@aws-sdk/client-sts": "3.186.4", "@aws-sdk/config-resolver": "3.186.0", "@aws-sdk/credential-provider-node": "3.186.0", "@aws-sdk/fetch-http-handler": "3.186.0", @@ -4831,9 +4838,9 @@ "engines": { "node": ">=12.0.0" }, - "integrity": "sha512-LCMFgoWfvKBnZhhtl93RLhrsHCalM7huaxErHSKoqWDBUDP0i7rOX73qW8E25j/vQ4emEkT0d6ts1rDu4EnlNw==", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-location/-/client-location-3.186.3.tgz", - "version": "3.186.3" + "integrity": "sha512-wHRVFdIDZVbae2w1axi4R8idiWH3CRZy22Zrtybfs/fvrC5xZZxFaLwXQtvPJdOf0RUGgQeOTsvJl2sInKSj+w==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-location/-/client-location-3.186.4.tgz", + "version": "3.186.4" }, "node_modules/@aws-sdk/client-location/node_modules/@aws-crypto/ie11-detection": { "dependencies": { @@ -7158,15 +7165,15 @@ "@aws-sdk/util-utf8-browser": "3.186.0", "@aws-sdk/util-utf8-node": "3.186.0", "entities": "2.2.0", - "fast-xml-parser": "4.2.5", + "fast-xml-parser": "4.4.1", "tslib": "^2.3.1" }, "engines": { "node": ">=12.0.0" }, - "integrity": "sha512-mnttdyYBtqO+FkDtOT3F1FGi8qD11fF5/3zYLaNuFFULqKneaIwW2YIsjFlgvPGpmoyo/tNplnZwhQ9xQtT3Sw==", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.186.3.tgz", - "version": "3.186.3" + "integrity": "sha512-KeC7eNoasv5A/cwC3uyM7xwyFiLYA0wz8YSG2rmvWHsW7vRn/95ATyNGlzNCpTQq3rlNORJ39yxpQCY7AxTb9g==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.186.4.tgz", + "version": "3.186.4" }, "node_modules/@aws-sdk/client-sts/node_modules/@aws-crypto/ie11-detection": { "dependencies": { @@ -7779,18 +7786,18 @@ "strnum": "^1.0.5" }, "funding": [ - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - }, { "type": "github", "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" } ], - "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", - "version": "4.2.5" + "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", + "version": "4.4.1" }, "node_modules/@aws-sdk/client-textract": { "dependencies": { @@ -10504,36 +10511,37 @@ }, "node_modules/@babel/code-frame": { "dependencies": { - "@babel/highlight": "^7.24.7", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "version": "7.24.7" + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "version": "7.26.2" }, "node_modules/@babel/compat-data": { "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", - "version": "7.22.9" + "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", + "version": "7.26.5" }, "node_modules/@babel/core": { "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.3", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.3", - "@babel/types": "^7.23.3", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -10547,9 +10555,9 @@ "type": "opencollective", "url": "https://opencollective.com/babel" }, - "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", - "version": "7.23.3" + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "version": "7.26.0" }, "node_modules/@babel/core/node_modules/convert-source-map": { "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", @@ -10583,28 +10591,29 @@ }, "node_modules/@babel/generator": { "dependencies": { - "@babel/types": "^7.24.9", + "@babel/parser": "^7.26.5", + "@babel/types": "^7.26.5", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg==", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.10.tgz", - "version": "7.24.10" + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", + "version": "7.26.5" }, "node_modules/@babel/helper-annotate-as-pure": { "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "version": "7.22.5" + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { "dependencies": { @@ -10619,56 +10628,54 @@ }, "node_modules/@babel/helper-compilation-targets": { "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "version": "7.22.15" + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "version": "7.26.5" }, "node_modules/@babel/helper-create-class-features-plugin": { "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-cBXU1vZni/CpGF29iTu4YRbOZt3Wat6zCoMDxRF1MayiEc4URxOj31tT65HUM0CRpMowA3HCJaAOVOUnMf96cw==", + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", "peerDependencies": { "@babel/core": "^7.0.0" }, - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.6.tgz", - "version": "7.23.6" + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/helper-create-regexp-features-plugin": { "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.2.0", "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==", + "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==", "peerDependencies": { "@babel/core": "^7.0.0" }, - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz", - "version": "7.22.9" + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz", + "version": "7.26.3" }, "node_modules/@babel/helper-define-polyfill-provider": { "dependencies": { @@ -10685,29 +10692,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", "version": "0.4.2" }, - "node_modules/@babel/helper-environment-visitor": { - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "version": "7.24.7" - }, - "node_modules/@babel/helper-function-name": { - "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", - "version": "7.24.7" - }, "node_modules/@babel/helper-hoist-variables": { "dependencies": { "@babel/types": "^7.24.7" @@ -10721,118 +10705,106 @@ }, "node_modules/@babel/helper-member-expression-to-functions": { "dependencies": { - "@babel/traverse": "^7.24.8", - "@babel/types": "^7.24.8" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", - "version": "7.24.8" + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/helper-module-imports": { "dependencies": { - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "version": "7.22.15" + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/helper-module-transforms": { "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "peerDependencies": { "@babel/core": "^7.0.0" }, - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "version": "7.23.3" + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "version": "7.26.0" }, "node_modules/@babel/helper-optimise-call-expression": { "dependencies": { - "@babel/types": "^7.24.7" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", - "version": "7.24.7" + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/helper-plugin-utils": { "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", - "version": "7.24.8" + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "version": "7.26.5" }, "node_modules/@babel/helper-remap-async-to-generator": { "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-wrap-function": "^7.22.9" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", "peerDependencies": { "@babel/core": "^7.0.0" }, - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", - "version": "7.22.9" + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/helper-replace-supers": { "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.7", - "@babel/helper-optimise-call-expression": "^7.24.7" + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.26.5" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", + "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", "peerDependencies": { "@babel/core": "^7.0.0" }, - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", - "version": "7.24.7" - }, - "node_modules/@babel/helper-simple-access": { - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "version": "7.22.5" + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", + "version": "7.26.5" }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", - "version": "7.24.7" + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/helper-split-export-declaration": { "dependencies": { @@ -10849,76 +10821,64 @@ "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "version": "7.24.8" + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/helper-validator-identifier": { "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "version": "7.24.7" + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/helper-validator-option": { "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", - "version": "7.24.8" + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/helper-wrap-function": { "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.10" + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz", - "version": "7.22.10" + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/helpers": { "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.6", - "@babel/types": "^7.23.6" + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.6.tgz", - "version": "7.23.6" - }, - "node_modules/@babel/highlight": { - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "version": "7.24.7" + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "version": "7.26.0" }, "node_modules/@babel/parser": { "bin": { "parser": "bin/babel-parser.js" }, + "dependencies": { + "@babel/types": "^7.26.5" + }, "engines": { "node": ">=6.0.0" }, - "integrity": "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz", - "version": "7.24.8" + "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz", + "version": "7.26.5" }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "dependencies": { @@ -10950,25 +10910,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", "version": "7.22.5" }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.", - "engines": { - "node": ">=6.9.0" - }, - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "peer": true, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - }, - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "version": "7.20.7" - }, "node_modules/@babel/plugin-proposal-class-properties": { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", @@ -11004,36 +10945,18 @@ }, "node_modules/@babel/plugin-proposal-export-default-from": { "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-export-default-from": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-CcmFwUJ3tKhLjPdt4NP+SHMshebytF8ZTYOv5ZDpkzq2sin80Wb5vJrGt8fhPrORQCfoSa0LAxC/DW+GAC5+Hw==", + "integrity": "sha512-ykqgwNfSnNOB+C8fV5X4mG3AVmvu+WVxcaU9xHHtBb7PCrPeweMmPjGsn8eMaeJg6SJuoUuZENeeSWaarWqonQ==", "peer": true, "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.24.7.tgz", - "version": "7.24.7" - }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-logical-assignment-operators instead.", - "engines": { - "node": ">=6.9.0" - }, - "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", - "peer": true, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - }, - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", - "version": "7.20.7" + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { "dependencies": { @@ -11065,43 +10988,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", "version": "7.18.6" }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" - }, - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", - "engines": { - "node": ">=6.9.0" - }, - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "peer": true, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - }, - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "version": "7.20.7" - }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead.", - "engines": { - "node": ">=6.9.0" - }, - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "peer": true, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - }, - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "version": "7.18.6" - }, "node_modules/@babel/plugin-proposal-optional-chaining": { "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", @@ -11225,18 +11111,18 @@ }, "node_modules/@babel/plugin-syntax-export-default-from": { "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-bTPz4/635WQ9WhwsyPdxUJDVpsi/X9BMmy/8Rf/UAlOO4jSql4CxUCjWI5PiM+jG+c4LVPTScoTw80geFj9+Bw==", + "integrity": "sha512-9MhJ/SMTsVqsd69GyQg89lYR4o9T+oDGv5F6IsigxxqFVOyR/IflDLYP8WDI1l8fkhNGGktqkvL5qwNCtGEpgQ==", "peer": true, "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.24.7.tgz", - "version": "7.24.7" + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/plugin-syntax-export-namespace-from": { "dependencies": { @@ -11251,17 +11137,17 @@ }, "node_modules/@babel/plugin-syntax-flow": { "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw==", + "integrity": "sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==", "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.7.tgz", - "version": "7.24.7" + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.26.0.tgz", + "version": "7.26.0" }, "node_modules/@babel/plugin-syntax-import-assertions": { "dependencies": { @@ -11315,17 +11201,17 @@ }, "node_modules/@babel/plugin-syntax-jsx": { "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "version": "7.23.3" + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "dependencies": { @@ -11423,17 +11309,17 @@ }, "node_modules/@babel/plugin-syntax-typescript": { "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "version": "7.23.3" + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/plugin-syntax-unicode-sets-regex": { "dependencies": { @@ -11452,50 +11338,49 @@ }, "node_modules/@babel/plugin-transform-arrow-functions": { "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", - "version": "7.22.5" + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/plugin-transform-async-generator-functions": { "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-0pAlmeRJn6wU84zzZsEOx1JV1Jf8fqO9ok7wofIJwUnplYo247dcd24P+cMJht7ts9xkzdtB0EPHmOb7F+KzXw==", + "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.11.tgz", - "version": "7.22.11" + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/plugin-transform-async-to-generator": { "dependencies": { - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", - "version": "7.22.5" + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/plugin-transform-block-scoped-functions": { "dependencies": { @@ -11513,32 +11398,32 @@ }, "node_modules/@babel/plugin-transform-block-scoping": { "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg==", + "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz", - "version": "7.22.10" + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/plugin-transform-class-properties": { "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", - "version": "7.22.5" + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/plugin-transform-class-static-block": { "dependencies": { @@ -11558,54 +11443,51 @@ }, "node_modules/@babel/plugin-transform-classes": { "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", - "version": "7.22.6" + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/plugin-transform-computed-properties": { "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", - "version": "7.22.5" + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/plugin-transform-destructuring": { "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw==", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz", - "version": "7.22.10" + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/plugin-transform-dotall-regex": { "dependencies": { @@ -11683,48 +11565,49 @@ }, "node_modules/@babel/plugin-transform-flow-strip-types": { "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-flow": "^7.24.7" + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/plugin-syntax-flow": "^7.26.0" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-cjRKJ7FobOH2eakx7Ja+KpJRj8+y+/SiB3ooYm/n2UJfxu0oEaOoxOinitkJcPqv9KxS0kxTGPUaR7L2XcXDXA==", + "integrity": "sha512-eGK26RsbIkYUns3Y8qKl362juDDYK+wEdPGHGrhzUl6CewZFo55VZ7hg+CyMFU4dd5QQakBN86nBMpRsFpRvbQ==", "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.24.7.tgz", - "version": "7.24.7" + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.26.5.tgz", + "version": "7.26.5" }, "node_modules/@babel/plugin-transform-for-of": { "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", + "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", - "version": "7.22.5" + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/plugin-transform-function-name": { "dependencies": { - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", - "version": "7.22.5" + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/plugin-transform-json-strings": { "dependencies": { @@ -11743,32 +11626,31 @@ }, "node_modules/@babel/plugin-transform-literals": { "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", - "version": "7.22.5" + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", - "version": "7.22.11" + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/plugin-transform-member-expression-literals": { "dependencies": { @@ -11801,19 +11683,18 @@ }, "node_modules/@babel/plugin-transform-modules-commonjs": { "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", - "version": "7.23.3" + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", + "version": "7.26.3" }, "node_modules/@babel/plugin-transform-modules-systemjs": { "dependencies": { @@ -11849,18 +11730,18 @@ }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", "peerDependencies": { "@babel/core": "^7.0.0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "version": "7.22.5" + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/plugin-transform-new-target": { "dependencies": { @@ -11878,51 +11759,47 @@ }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", + "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", - "version": "7.22.11" + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz", + "version": "7.26.6" }, "node_modules/@babel/plugin-transform-numeric-separator": { "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", - "version": "7.22.11" + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/plugin-transform-object-rest-spread": { "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.10", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.5" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-nX8cPFa6+UmbepISvlf5jhQyaC7ASs/7UxHmMkuJ/k5xSHvDPPaibMo+v3TXwU/Pjqhep/nFNpd3zn4YR59pnw==", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.11.tgz", - "version": "7.22.11" + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/plugin-transform-object-super": { "dependencies": { @@ -11941,80 +11818,77 @@ }, "node_modules/@babel/plugin-transform-optional-catch-binding": { "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", - "version": "7.22.11" + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/plugin-transform-optional-chaining": { "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", - "version": "7.23.4" + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/plugin-transform-parameters": { "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", - "version": "7.22.5" + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/plugin-transform-private-methods": { "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", - "version": "7.22.5" + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/plugin-transform-private-property-in-object": { "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.11", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", - "version": "7.22.11" + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/plugin-transform-property-literals": { "dependencies": { @@ -12046,35 +11920,35 @@ }, "node_modules/@babel/plugin-transform-react-display-name": { "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==", + "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==", "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz", - "version": "7.22.5" + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/plugin-transform-react-jsx": { "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==", + "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz", - "version": "7.22.5" + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/plugin-transform-react-jsx-development": { "dependencies": { @@ -12092,33 +11966,33 @@ }, "node_modules/@babel/plugin-transform-react-jsx-self": { "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==", + "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", "peer": true, "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz", - "version": "7.24.7" + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/plugin-transform-react-jsx-source": { "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==", + "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", "peer": true, "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz", - "version": "7.24.7" + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/plugin-transform-react-pure-annotations": { "dependencies": { @@ -12137,18 +12011,18 @@ }, "node_modules/@babel/plugin-transform-regenerator": { "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.25.9", "regenerator-transform": "^0.15.2" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", + "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", - "version": "7.22.10" + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/plugin-transform-reserved-words": { "dependencies": { @@ -12166,65 +12040,103 @@ }, "node_modules/@babel/plugin-transform-runtime": { "dependencies": { - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.5", - "babel-plugin-polyfill-corejs3": "^0.8.3", - "babel-plugin-polyfill-regenerator": "^0.5.2", + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-RchI7HePu1eu0CYNKHHHQdfenZcM4nz8rew5B1VWqeRKdcwW5aQ5HeG9eTUbWiAS1UrmHVLmoxTWHt3iLD/NhA==", + "integrity": "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==", "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.10.tgz", - "version": "7.22.10" + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz", + "version": "7.25.9" + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/@babel/helper-define-polyfill-provider": { + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + }, + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", + "version": "0.6.3" + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/babel-plugin-polyfill-corejs3": { + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" + }, + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + }, + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "version": "0.10.6" + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/babel-plugin-polyfill-regenerator": { + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.3" + }, + "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + }, + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz", + "version": "0.6.3" }, "node_modules/@babel/plugin-transform-shorthand-properties": { "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", - "version": "7.22.5" + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/plugin-transform-spread": { "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", - "version": "7.22.5" + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/plugin-transform-sticky-regex": { "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", - "version": "7.22.5" + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/plugin-transform-template-literals": { "dependencies": { @@ -12256,67 +12168,21 @@ }, "node_modules/@babel/plugin-transform-typescript": { "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-create-class-features-plugin": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/plugin-syntax-typescript": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "integrity": "sha512-CgFgtN61BbdOGCP4fLaAMOPkzWUh6yQZNMr5YSt8uz2cZSSiQONCQFWqsE4NeVfOIhqDOlS9CR3WD91FzMeB2Q==", - "peerDependencies": { - "@babel/core": "^7.0.0-0" - }, - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.8.tgz", - "version": "7.24.8" - }, - "node_modules/@babel/plugin-transform-typescript/node_modules/@babel/helper-annotate-as-pure": { - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "version": "7.24.7" - }, - "node_modules/@babel/plugin-transform-typescript/node_modules/@babel/helper-create-class-features-plugin": { - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.8", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "integrity": "sha512-4f6Oqnmyp2PP3olgUMmOwC3akxSm5aBYraQ6YDdKy7NcAMkDECHWG0DEnV6M2UAkERgIBhYt8S27rURPg7SxWA==", - "peerDependencies": { - "@babel/core": "^7.0.0" - }, - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.8.tgz", - "version": "7.24.8" - }, - "node_modules/@babel/plugin-transform-typescript/node_modules/@babel/plugin-syntax-typescript": { - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-syntax-typescript": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", + "integrity": "sha512-GJhPO0y8SD5EYVCy2Zr+9dSZcEgaSmq5BLR0Oc25TOEhC+ba49vUAGZFjy8v79z9E1mdldq4x9d1xgh4L1d5dQ==", "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", - "version": "7.24.7" + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.5.tgz", + "version": "7.26.5" }, "node_modules/@babel/plugin-transform-unicode-escapes": { "dependencies": { @@ -12349,18 +12215,18 @@ }, "node_modules/@babel/plugin-transform-unicode-regex": { "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", - "version": "7.22.5" + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { "dependencies": { @@ -12483,20 +12349,20 @@ }, "node_modules/@babel/preset-flow": { "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "@babel/plugin-transform-flow-strip-types": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-transform-flow-strip-types": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-NL3Lo0NorCU607zU3NwRyJbpaB6E3t0xtd3LfAQKDfkeX4/ggcDXvkmkW42QWT5owUeW/jAe4hn+2qvkV1IbfQ==", + "integrity": "sha512-EASHsAhE+SSlEzJ4bzfusnXSHiU+JfAYzj+jbw2vgQKgq5HrUr8qs+vgtiEL5dOH6sEweI+PNt2D7AqrDSHyqQ==", "peer": true, "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.24.7.tgz", - "version": "7.24.7" + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/preset-modules": { "dependencies": { @@ -12559,13 +12425,13 @@ "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w==", + "integrity": "sha512-8D43jXtGsYmEeDvm4MWHYUpWf8iiXgWYx3fW7E7Wb7Oe6FWqJPl5K6TuFW0dOwNZzEE5rjlaSJYH9JjrUKJszA==", "peer": true, "peerDependencies": { "@babel/core": "^7.0.0-0" }, - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.24.6.tgz", - "version": "7.24.6" + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/register/node_modules/make-dir": { "dependencies": { @@ -12608,11 +12474,6 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "version": "0.5.21" }, - "node_modules/@babel/regjsgen": { - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "version": "0.8.0" - }, "node_modules/@babel/runtime": { "dependencies": { "regenerator-runtime": "^0.14.0" @@ -12620,55 +12481,70 @@ "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", - "version": "7.23.2" + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "version": "7.26.0" }, "node_modules/@babel/template": { "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "version": "7.24.7" + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "version": "7.25.9" }, "node_modules/@babel/traverse": { "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.8", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.8", - "@babel/types": "^7.24.8", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.5", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.5", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz", + "version": "7.26.5" + }, + "node_modules/@babel/traverse--for-generate-function-map": { + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.5", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.5", "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.8.tgz", - "version": "7.24.8" + "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==", + "name": "@babel/traverse", + "peer": true, + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz", + "version": "7.26.5" }, "node_modules/@babel/types": { "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, - "integrity": "sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.9.tgz", - "version": "7.24.9" + "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz", + "version": "7.26.5" }, "node_modules/@bcoe/v8-coverage": { "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", @@ -13289,21 +13165,6 @@ "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-5.1.0.tgz", "version": "5.1.0" }, - "node_modules/@hapi/hoek": { - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "version": "9.3.0" - }, - "node_modules/@hapi/topo": { - "dependencies": { - "@hapi/hoek": "^9.0.0" - }, - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "peer": true, - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "version": "5.1.0" - }, "node_modules/@humanwhocodes/config-array": { "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -13963,28 +13824,26 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "write-file-atomic": "^4.0.2" }, - "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "peer": true, - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", - "version": "29.6.4" + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "version": "29.7.0" }, "node_modules/@jest/transform/node_modules/ansi-styles": { "dependencies": { "color-convert": "^2.0.1" }, - "dev": true, "engines": { "node": ">=8" }, @@ -14001,7 +13860,6 @@ "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, - "dev": true, "engines": { "node": ">=10" }, @@ -14017,7 +13875,6 @@ "dependencies": { "color-name": "~1.1.4" }, - "dev": true, "engines": { "node": ">=7.0.0" }, @@ -14027,21 +13884,18 @@ "version": "2.0.1" }, "node_modules/@jest/transform/node_modules/color-name": { - "dev": true, "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "peer": true, "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "version": "1.1.4" }, "node_modules/@jest/transform/node_modules/convert-source-map": { - "dev": true, "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "peer": true, "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "version": "2.0.0" }, "node_modules/@jest/transform/node_modules/has-flag": { - "dev": true, "engines": { "node": ">=8" }, @@ -14054,7 +13908,6 @@ "dependencies": { "has-flag": "^4.0.0" }, - "dev": true, "engines": { "node": ">=8" }, @@ -15165,1399 +15018,400 @@ "@radix-ui/react-use-size": "1.0.0", "@radix-ui/rect": "1.0.0" }, - "integrity": "sha512-k2dDd+1Wl0XWAMs9ZvAxxYsB9sOsEhrFQV4CINd7IUZf0wfdye4OHen9siwxvZImbzhgVeKTJi68OQmPRvVdMg==", - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.0.0.tgz", - "version": "1.0.0" - }, - "node_modules/@radix-ui/react-popper/node_modules/@floating-ui/core": { - "integrity": "sha512-buc8BXHmG9l82+OQXOFU3Kr2XQx9ys01U/Q9HMIrZ300iLc8HLMgh7dcCqgYzAzf4BkoQvDcXf5Y+CuEZ5JBYg==", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-0.7.3.tgz", - "version": "0.7.3" - }, - "node_modules/@radix-ui/react-popper/node_modules/@floating-ui/dom": { - "dependencies": { - "@floating-ui/core": "^0.7.3" - }, - "integrity": "sha512-419BMceRLq0RrmTSDxn8hf9R3VCJv2K9PUfugh5JyEFmdjzDo+e8U5EdR8nzKq8Yj1htzLm3b6eQEEam3/rrtg==", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-0.5.4.tgz", - "version": "0.5.4" - }, - "node_modules/@radix-ui/react-popper/node_modules/@floating-ui/react-dom": { - "dependencies": { - "@floating-ui/dom": "^0.5.3", - "use-isomorphic-layout-effect": "^1.1.1" - }, - "integrity": "sha512-1T0sJcpHgX/u4I1OzIEhlcrvkUN8ln39nz7fMoE/2HDHrPiMFoOGR7++GYyfUmIQHkkrTinaeQsO3XWubjSvGg==", - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - }, - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-0.7.2.tgz", - "version": "0.7.2" - }, - "node_modules/@radix-ui/react-portal": { - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.0" - }, - "integrity": "sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA==", - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.0.tgz", - "version": "1.0.0" - }, - "node_modules/@radix-ui/react-presence": { - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.0", - "@radix-ui/react-use-layout-effect": "1.0.0" - }, - "integrity": "sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==", - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.0.tgz", - "version": "1.0.0" - }, - "node_modules/@radix-ui/react-primitive": { - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-slot": "1.0.0" - }, - "integrity": "sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==", - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.0.tgz", - "version": "1.0.0" - }, - "node_modules/@radix-ui/react-roving-focus": { - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.0", - "@radix-ui/react-collection": "1.0.0", - "@radix-ui/react-compose-refs": "1.0.0", - "@radix-ui/react-context": "1.0.0", - "@radix-ui/react-direction": "1.0.0", - "@radix-ui/react-id": "1.0.0", - "@radix-ui/react-primitive": "1.0.0", - "@radix-ui/react-use-callback-ref": "1.0.0", - "@radix-ui/react-use-controllable-state": "1.0.0" - }, - "integrity": "sha512-lHvO4MhvoWpeNbiJAoyDsEtbKqP2jkkdwsMVJ3kfqbkC71J/aXE6Th6gkZA1xHEqSku+t+UgoDjvE7Z3gsBpcg==", - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.0.tgz", - "version": "1.0.0" - }, - "node_modules/@radix-ui/react-slider": { - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/number": "1.0.0", - "@radix-ui/primitive": "1.0.0", - "@radix-ui/react-collection": "1.0.0", - "@radix-ui/react-compose-refs": "1.0.0", - "@radix-ui/react-context": "1.0.0", - "@radix-ui/react-direction": "1.0.0", - "@radix-ui/react-primitive": "1.0.0", - "@radix-ui/react-use-controllable-state": "1.0.0", - "@radix-ui/react-use-layout-effect": "1.0.0", - "@radix-ui/react-use-previous": "1.0.0", - "@radix-ui/react-use-size": "1.0.0" - }, - "integrity": "sha512-LMZET7vn7HYwYSjsc9Jcen8Vn4cJXZZxQT7T+lGlqp+F+FofX+H86TBF2yDq+L51d99f1KLEsflTGBz9WRLSig==", - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.0.0.tgz", - "version": "1.0.0" - }, - "node_modules/@radix-ui/react-slot": { - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.0" - }, - "integrity": "sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==", - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - }, - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.0.tgz", - "version": "1.0.0" - }, - "node_modules/@radix-ui/react-tabs": { - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.0", - "@radix-ui/react-context": "1.0.0", - "@radix-ui/react-direction": "1.0.0", - "@radix-ui/react-id": "1.0.0", - "@radix-ui/react-presence": "1.0.0", - "@radix-ui/react-primitive": "1.0.0", - "@radix-ui/react-roving-focus": "1.0.0", - "@radix-ui/react-use-controllable-state": "1.0.0" - }, - "integrity": "sha512-oKUwEDsySVC0uuSEH7SHCVt1+ijmiDFAI9p+fHCtuZdqrRDKIFs09zp5nrmu4ggP6xqSx9lj1VSblnDH+n3IBA==", - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.0.0.tgz", - "version": "1.0.0" - }, - "node_modules/@radix-ui/react-use-callback-ref": { - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "integrity": "sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==", - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - }, - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz", - "version": "1.0.0" - }, - "node_modules/@radix-ui/react-use-controllable-state": { - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-callback-ref": "1.0.0" - }, - "integrity": "sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==", - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - }, - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz", - "version": "1.0.0" - }, - "node_modules/@radix-ui/react-use-escape-keydown": { - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-callback-ref": "1.0.0" - }, - "integrity": "sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg==", - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - }, - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.0.tgz", - "version": "1.0.0" - }, - "node_modules/@radix-ui/react-use-layout-effect": { - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "integrity": "sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==", - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - }, - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz", - "version": "1.0.0" - }, - "node_modules/@radix-ui/react-use-previous": { - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "integrity": "sha512-RG2K8z/K7InnOKpq6YLDmT49HGjNmrK+fr82UCVKT2sW0GYfVnYp4wZWBooT/EYfQ5faA9uIjvsuMMhH61rheg==", - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - }, - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.0.0.tgz", - "version": "1.0.0" - }, - "node_modules/@radix-ui/react-use-rect": { - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/rect": "1.0.0" - }, - "integrity": "sha512-TB7pID8NRMEHxb/qQJpvSt3hQU4sqNPM1VCTjTRjEOa7cEop/QMuq8S6fb/5Tsz64kqSvB9WnwsDHtjnrM9qew==", - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - }, - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.0.0.tgz", - "version": "1.0.0" - }, - "node_modules/@radix-ui/react-use-size": { - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-layout-effect": "1.0.0" - }, - "integrity": "sha512-imZ3aYcoYCKhhgNpkNDh/aTiU05qw9hX+HHI1QDBTyIlcFjgeFlKKySNGMwTp7nYFLQg/j0VA2FmCY4WPDDHMg==", - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - }, - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.0.0.tgz", - "version": "1.0.0" - }, - "node_modules/@radix-ui/rect": { - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "integrity": "sha512-d0O68AYy/9oeEy1DdC07bz1/ZXX+DqCskRd3i4JzLSTXwefzaepQrKjXC7aNM8lTHjFLDO0pDgaEiQ7jEk+HVg==", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.0.0.tgz", - "version": "1.0.0" - }, - "node_modules/@react-native-community/cli": { - "bin": { - "rnc-cli": "build/bin.js" - }, - "dependencies": { - "@react-native-community/cli-clean": "13.6.9", - "@react-native-community/cli-config": "13.6.9", - "@react-native-community/cli-debugger-ui": "13.6.9", - "@react-native-community/cli-doctor": "13.6.9", - "@react-native-community/cli-hermes": "13.6.9", - "@react-native-community/cli-server-api": "13.6.9", - "@react-native-community/cli-tools": "13.6.9", - "@react-native-community/cli-types": "13.6.9", - "chalk": "^4.1.2", - "commander": "^9.4.1", - "deepmerge": "^4.3.0", - "execa": "^5.0.0", - "find-up": "^4.1.0", - "fs-extra": "^8.1.0", - "graceful-fs": "^4.1.3", - "prompts": "^2.4.2", - "semver": "^7.5.2" - }, - "engines": { - "node": ">=18" - }, - "integrity": "sha512-hFJL4cgLPxncJJd/epQ4dHnMg5Jy/7Q56jFvA3MHViuKpzzfTCJCB+pGY54maZbtym53UJON9WTGpM3S81UfjQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-13.6.9.tgz", - "version": "13.6.9" - }, - "node_modules/@react-native-community/cli-clean": { - "dependencies": { - "@react-native-community/cli-tools": "13.6.9", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "fast-glob": "^3.3.2" - }, - "integrity": "sha512-7Dj5+4p9JggxuVNOjPbduZBAP1SUgNhLKVw5noBUzT/3ZpUZkDM+RCSwyoyg8xKWoE4OrdUAXwAFlMcFDPKykA==", - "peer": true, - "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-13.6.9.tgz", - "version": "13.6.9" - }, - "node_modules/@react-native-community/cli-clean/node_modules/ansi-styles": { - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - }, - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "peer": true, - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "version": "4.3.0" - }, - "node_modules/@react-native-community/cli-clean/node_modules/chalk": { - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - }, - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "peer": true, - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "version": "4.1.2" - }, - "node_modules/@react-native-community/cli-clean/node_modules/color-convert": { - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - }, - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "version": "2.0.1" - }, - "node_modules/@react-native-community/cli-clean/node_modules/color-name": { - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true, - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "version": "1.1.4" - }, - "node_modules/@react-native-community/cli-clean/node_modules/has-flag": { - "engines": { - "node": ">=8" - }, - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "version": "4.0.0" - }, - "node_modules/@react-native-community/cli-clean/node_modules/supports-color": { - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - }, - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "peer": true, - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "version": "7.2.0" - }, - "node_modules/@react-native-community/cli-config": { - "dependencies": { - "@react-native-community/cli-tools": "13.6.9", - "chalk": "^4.1.2", - "cosmiconfig": "^5.1.0", - "deepmerge": "^4.3.0", - "fast-glob": "^3.3.2", - "joi": "^17.2.1" - }, - "integrity": "sha512-rFfVBcNojcMm+KKHE/xqpqXg8HoKl4EC7bFHUrahMJ+y/tZll55+oX/PGG37rzB8QzP2UbMQ19DYQKC1G7kXeg==", - "peer": true, - "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-13.6.9.tgz", - "version": "13.6.9" - }, - "node_modules/@react-native-community/cli-config/node_modules/ansi-styles": { - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - }, - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "peer": true, - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "version": "4.3.0" - }, - "node_modules/@react-native-community/cli-config/node_modules/argparse": { - "dependencies": { - "sprintf-js": "~1.0.2" - }, - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "peer": true, - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "version": "1.0.10" - }, - "node_modules/@react-native-community/cli-config/node_modules/chalk": { - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - }, - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "peer": true, - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "version": "4.1.2" - }, - "node_modules/@react-native-community/cli-config/node_modules/color-convert": { - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - }, - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "version": "2.0.1" - }, - "node_modules/@react-native-community/cli-config/node_modules/color-name": { - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true, - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "version": "1.1.4" - }, - "node_modules/@react-native-community/cli-config/node_modules/cosmiconfig": { - "dependencies": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, - "engines": { - "node": ">=4" - }, - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "peer": true, - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "version": "5.2.1" - }, - "node_modules/@react-native-community/cli-config/node_modules/deepmerge": { - "engines": { - "node": ">=0.10.0" - }, - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "peer": true, - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "version": "4.3.1" - }, - "node_modules/@react-native-community/cli-config/node_modules/has-flag": { - "engines": { - "node": ">=8" - }, - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "version": "4.0.0" - }, - "node_modules/@react-native-community/cli-config/node_modules/import-fresh": { - "dependencies": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - }, - "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", - "peer": true, - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "version": "2.0.0" - }, - "node_modules/@react-native-community/cli-config/node_modules/js-yaml": { - "bin": { - "js-yaml": "bin/js-yaml.js" - }, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "peer": true, - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "version": "3.14.1" - }, - "node_modules/@react-native-community/cli-config/node_modules/parse-json": { - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - }, - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "peer": true, - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "version": "4.0.0" - }, - "node_modules/@react-native-community/cli-config/node_modules/resolve-from": { - "engines": { - "node": ">=4" - }, - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "peer": true, - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "version": "3.0.0" - }, - "node_modules/@react-native-community/cli-config/node_modules/supports-color": { - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - }, - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "peer": true, - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "version": "7.2.0" - }, - "node_modules/@react-native-community/cli-debugger-ui": { - "dependencies": { - "serve-static": "^1.13.1" - }, - "integrity": "sha512-TkN7IdFmGPPvTpAo3nCAH9uwGCPxWBEAwpqEZDrq0NWllI7Tdie8vDpGdrcuCcKalmhq6OYnkXzeBah7O1Ztpw==", - "peer": true, - "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-13.6.9.tgz", - "version": "13.6.9" - }, - "node_modules/@react-native-community/cli-doctor": { - "dependencies": { - "@react-native-community/cli-config": "13.6.9", - "@react-native-community/cli-platform-android": "13.6.9", - "@react-native-community/cli-platform-apple": "13.6.9", - "@react-native-community/cli-platform-ios": "13.6.9", - "@react-native-community/cli-tools": "13.6.9", - "chalk": "^4.1.2", - "command-exists": "^1.2.8", - "deepmerge": "^4.3.0", - "envinfo": "^7.10.0", - "execa": "^5.0.0", - "hermes-profile-transformer": "^0.0.6", - "node-stream-zip": "^1.9.1", - "ora": "^5.4.1", - "semver": "^7.5.2", - "strip-ansi": "^5.2.0", - "wcwidth": "^1.0.1", - "yaml": "^2.2.1" - }, - "integrity": "sha512-5quFaLdWFQB+677GXh5dGU9I5eg2z6Vg4jOX9vKnc9IffwyIFAyJfCZHrxLSRPDGNXD7biDQUdoezXYGwb6P/A==", - "peer": true, - "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-13.6.9.tgz", - "version": "13.6.9" - }, - "node_modules/@react-native-community/cli-doctor/node_modules/ansi-regex": { - "engines": { - "node": ">=6" - }, - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "peer": true, - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "version": "4.1.1" - }, - "node_modules/@react-native-community/cli-doctor/node_modules/ansi-styles": { - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - }, - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "peer": true, - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "version": "4.3.0" - }, - "node_modules/@react-native-community/cli-doctor/node_modules/chalk": { - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - }, - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "peer": true, - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "version": "4.1.2" - }, - "node_modules/@react-native-community/cli-doctor/node_modules/color-convert": { - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - }, - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "version": "2.0.1" - }, - "node_modules/@react-native-community/cli-doctor/node_modules/color-name": { - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true, - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "version": "1.1.4" - }, - "node_modules/@react-native-community/cli-doctor/node_modules/deepmerge": { - "engines": { - "node": ">=0.10.0" - }, - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "peer": true, - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "version": "4.3.1" - }, - "node_modules/@react-native-community/cli-doctor/node_modules/has-flag": { - "engines": { - "node": ">=8" - }, - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "version": "4.0.0" - }, - "node_modules/@react-native-community/cli-doctor/node_modules/strip-ansi": { - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - }, - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "peer": true, - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "version": "5.2.0" - }, - "node_modules/@react-native-community/cli-doctor/node_modules/supports-color": { - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - }, - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "peer": true, - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "version": "7.2.0" - }, - "node_modules/@react-native-community/cli-hermes": { - "dependencies": { - "@react-native-community/cli-platform-android": "13.6.9", - "@react-native-community/cli-tools": "13.6.9", - "chalk": "^4.1.2", - "hermes-profile-transformer": "^0.0.6" - }, - "integrity": "sha512-GvwiwgvFw4Ws+krg2+gYj8sR3g05evmNjAHkKIKMkDTJjZ8EdyxbkifRUs1ZCq3TMZy2oeblZBXCJVOH4W7ZbA==", - "peer": true, - "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-13.6.9.tgz", - "version": "13.6.9" - }, - "node_modules/@react-native-community/cli-hermes/node_modules/ansi-styles": { - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - }, - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "peer": true, - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "version": "4.3.0" - }, - "node_modules/@react-native-community/cli-hermes/node_modules/chalk": { - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - }, - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "peer": true, - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "version": "4.1.2" - }, - "node_modules/@react-native-community/cli-hermes/node_modules/color-convert": { - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - }, - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "version": "2.0.1" - }, - "node_modules/@react-native-community/cli-hermes/node_modules/color-name": { - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true, - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "version": "1.1.4" - }, - "node_modules/@react-native-community/cli-hermes/node_modules/has-flag": { - "engines": { - "node": ">=8" - }, - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "version": "4.0.0" - }, - "node_modules/@react-native-community/cli-hermes/node_modules/supports-color": { - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - }, - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "peer": true, - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "version": "7.2.0" - }, - "node_modules/@react-native-community/cli-platform-android": { - "dependencies": { - "@react-native-community/cli-tools": "13.6.9", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "fast-glob": "^3.3.2", - "fast-xml-parser": "^4.2.4", - "logkitty": "^0.7.1" - }, - "integrity": "sha512-9KsYGdr08QhdvT3Ht7e8phQB3gDX9Fs427NJe0xnoBh+PDPTI2BD5ks5ttsH8CzEw8/P6H8tJCHq6hf2nxd9cw==", - "peer": true, - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-13.6.9.tgz", - "version": "13.6.9" - }, - "node_modules/@react-native-community/cli-platform-android/node_modules/ansi-styles": { - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - }, - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "peer": true, - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "version": "4.3.0" - }, - "node_modules/@react-native-community/cli-platform-android/node_modules/chalk": { - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - }, - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "peer": true, - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "version": "4.1.2" - }, - "node_modules/@react-native-community/cli-platform-android/node_modules/color-convert": { - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - }, - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "version": "2.0.1" - }, - "node_modules/@react-native-community/cli-platform-android/node_modules/color-name": { - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true, - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "version": "1.1.4" - }, - "node_modules/@react-native-community/cli-platform-android/node_modules/has-flag": { - "engines": { - "node": ">=8" - }, - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "version": "4.0.0" - }, - "node_modules/@react-native-community/cli-platform-android/node_modules/supports-color": { - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - }, - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "peer": true, - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "version": "7.2.0" - }, - "node_modules/@react-native-community/cli-platform-apple": { - "dependencies": { - "@react-native-community/cli-tools": "13.6.9", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "fast-glob": "^3.3.2", - "fast-xml-parser": "^4.0.12", - "ora": "^5.4.1" - }, - "integrity": "sha512-KoeIHfhxMhKXZPXmhQdl6EE+jGKWwoO9jUVWgBvibpVmsNjo7woaG/tfJMEWfWF3najX1EkQAoJWpCDBMYWtlA==", - "peer": true, - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-apple/-/cli-platform-apple-13.6.9.tgz", - "version": "13.6.9" - }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/ansi-styles": { - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - }, - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "peer": true, - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "version": "4.3.0" - }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/chalk": { - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - }, - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "peer": true, - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "version": "4.1.2" - }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/color-convert": { - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - }, - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "version": "2.0.1" - }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/color-name": { - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true, - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "version": "1.1.4" - }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/has-flag": { - "engines": { - "node": ">=8" - }, - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "version": "4.0.0" - }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/supports-color": { - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - }, - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "peer": true, - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "version": "7.2.0" - }, - "node_modules/@react-native-community/cli-platform-ios": { - "dependencies": { - "@react-native-community/cli-platform-apple": "13.6.9" - }, - "integrity": "sha512-CiUcHlGs8vE0CAB4oi1f+dzniqfGuhWPNrDvae2nm8dewlahTBwIcK5CawyGezjcJoeQhjBflh9vloska+nlnw==", - "peer": true, - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-13.6.9.tgz", - "version": "13.6.9" - }, - "node_modules/@react-native-community/cli-server-api": { - "dependencies": { - "@react-native-community/cli-debugger-ui": "13.6.9", - "@react-native-community/cli-tools": "13.6.9", - "compression": "^1.7.1", - "connect": "^3.6.5", - "errorhandler": "^1.5.1", - "nocache": "^3.0.1", - "pretty-format": "^26.6.2", - "serve-static": "^1.13.1", - "ws": "^6.2.2" - }, - "integrity": "sha512-W8FSlCPWymO+tlQfM3E0JmM8Oei5HZsIk5S0COOl0MRi8h0NmHI4WSTF2GCfbFZkcr2VI/fRsocoN8Au4EZAug==", - "peer": true, - "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-13.6.9.tgz", - "version": "13.6.9" - }, - "node_modules/@react-native-community/cli-server-api/node_modules/@jest/types": { - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": ">= 10.14.2" - }, - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "version": "26.6.2" - }, - "node_modules/@react-native-community/cli-server-api/node_modules/@types/yargs": { - "dependencies": { - "@types/yargs-parser": "*" - }, - "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", - "peer": true, - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", - "version": "15.0.19" - }, - "node_modules/@react-native-community/cli-server-api/node_modules/ansi-styles": { - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - }, - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "peer": true, - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "version": "4.3.0" - }, - "node_modules/@react-native-community/cli-server-api/node_modules/chalk": { - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - }, - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "peer": true, - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "version": "4.1.2" - }, - "node_modules/@react-native-community/cli-server-api/node_modules/color-convert": { - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - }, - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "version": "2.0.1" - }, - "node_modules/@react-native-community/cli-server-api/node_modules/color-name": { - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true, - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "version": "1.1.4" - }, - "node_modules/@react-native-community/cli-server-api/node_modules/has-flag": { - "engines": { - "node": ">=8" - }, - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "version": "4.0.0" - }, - "node_modules/@react-native-community/cli-server-api/node_modules/pretty-format": { - "dependencies": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": ">= 10" + "integrity": "sha512-k2dDd+1Wl0XWAMs9ZvAxxYsB9sOsEhrFQV4CINd7IUZf0wfdye4OHen9siwxvZImbzhgVeKTJi68OQmPRvVdMg==", + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" }, - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", - "peer": true, - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "version": "26.6.2" + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.0.0.tgz", + "version": "1.0.0" }, - "node_modules/@react-native-community/cli-server-api/node_modules/react-is": { - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "peer": true, - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "version": "17.0.2" + "node_modules/@radix-ui/react-popper/node_modules/@floating-ui/core": { + "integrity": "sha512-buc8BXHmG9l82+OQXOFU3Kr2XQx9ys01U/Q9HMIrZ300iLc8HLMgh7dcCqgYzAzf4BkoQvDcXf5Y+CuEZ5JBYg==", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-0.7.3.tgz", + "version": "0.7.3" }, - "node_modules/@react-native-community/cli-server-api/node_modules/supports-color": { + "node_modules/@radix-ui/react-popper/node_modules/@floating-ui/dom": { "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "@floating-ui/core": "^0.7.3" }, - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "peer": true, - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "version": "7.2.0" + "integrity": "sha512-419BMceRLq0RrmTSDxn8hf9R3VCJv2K9PUfugh5JyEFmdjzDo+e8U5EdR8nzKq8Yj1htzLm3b6eQEEam3/rrtg==", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-0.5.4.tgz", + "version": "0.5.4" }, - "node_modules/@react-native-community/cli-tools": { + "node_modules/@radix-ui/react-popper/node_modules/@floating-ui/react-dom": { "dependencies": { - "appdirsjs": "^1.2.4", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "find-up": "^5.0.0", - "mime": "^2.4.1", - "node-fetch": "^2.6.0", - "open": "^6.2.0", - "ora": "^5.4.1", - "semver": "^7.5.2", - "shell-quote": "^1.7.3", - "sudo-prompt": "^9.0.0" + "@floating-ui/dom": "^0.5.3", + "use-isomorphic-layout-effect": "^1.1.1" }, - "integrity": "sha512-OXaSjoN0mZVw3nrAwcY1PC0uMfyTd9fz7Cy06dh+EJc+h0wikABsVRzV8cIOPrVV+PPEEXE0DBrH20T2puZzgQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-13.6.9.tgz", - "version": "13.6.9" + "integrity": "sha512-1T0sJcpHgX/u4I1OzIEhlcrvkUN8ln39nz7fMoE/2HDHrPiMFoOGR7++GYyfUmIQHkkrTinaeQsO3XWubjSvGg==", + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + }, + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-0.7.2.tgz", + "version": "0.7.2" }, - "node_modules/@react-native-community/cli-tools/node_modules/ansi-styles": { + "node_modules/@radix-ui/react-portal": { "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "integrity": "sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA==", + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" }, - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "peer": true, - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "version": "4.3.0" + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.0.tgz", + "version": "1.0.0" }, - "node_modules/@react-native-community/cli-tools/node_modules/chalk": { + "node_modules/@radix-ui/react-presence": { "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "integrity": "sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==", + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" }, - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "peer": true, - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "version": "4.1.2" + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.0.tgz", + "version": "1.0.0" }, - "node_modules/@react-native-community/cli-tools/node_modules/color-convert": { + "node_modules/@radix-ui/react-primitive": { "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.0" }, - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "version": "2.0.1" - }, - "node_modules/@react-native-community/cli-tools/node_modules/color-name": { - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true, - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "version": "1.1.4" - }, - "node_modules/@react-native-community/cli-tools/node_modules/has-flag": { - "engines": { - "node": ">=8" + "integrity": "sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==", + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" }, - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "version": "4.0.0" + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.0.tgz", + "version": "1.0.0" }, - "node_modules/@react-native-community/cli-tools/node_modules/supports-color": { + "node_modules/@radix-ui/react-roving-focus": { "dependencies": { - "has-flag": "^4.0.0" + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-collection": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-direction": "1.0.0", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-primitive": "1.0.0", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-controllable-state": "1.0.0" }, - "engines": { - "node": ">=8" + "integrity": "sha512-lHvO4MhvoWpeNbiJAoyDsEtbKqP2jkkdwsMVJ3kfqbkC71J/aXE6Th6gkZA1xHEqSku+t+UgoDjvE7Z3gsBpcg==", + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" }, - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "peer": true, - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "version": "7.2.0" + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.0.tgz", + "version": "1.0.0" }, - "node_modules/@react-native-community/cli-types": { + "node_modules/@radix-ui/react-slider": { "dependencies": { - "joi": "^17.2.1" + "@babel/runtime": "^7.13.10", + "@radix-ui/number": "1.0.0", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-collection": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-direction": "1.0.0", + "@radix-ui/react-primitive": "1.0.0", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0", + "@radix-ui/react-use-previous": "1.0.0", + "@radix-ui/react-use-size": "1.0.0" }, - "integrity": "sha512-RLxDppvRxXfs3hxceW/mShi+6o5yS+kFPnPqZTaMKKR5aSg7LwDpLQW4K2D22irEG8e6RKDkZUeH9aL3vO2O0w==", - "peer": true, - "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-13.6.9.tgz", - "version": "13.6.9" + "integrity": "sha512-LMZET7vn7HYwYSjsc9Jcen8Vn4cJXZZxQT7T+lGlqp+F+FofX+H86TBF2yDq+L51d99f1KLEsflTGBz9WRLSig==", + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.0.0.tgz", + "version": "1.0.0" }, - "node_modules/@react-native-community/cli/node_modules/ansi-styles": { + "node_modules/@radix-ui/react-slot": { "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "integrity": "sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==", + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" }, - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "peer": true, - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "version": "4.3.0" + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.0.tgz", + "version": "1.0.0" }, - "node_modules/@react-native-community/cli/node_modules/chalk": { + "node_modules/@radix-ui/react-tabs": { "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-direction": "1.0.0", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.0", + "@radix-ui/react-roving-focus": "1.0.0", + "@radix-ui/react-use-controllable-state": "1.0.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "integrity": "sha512-oKUwEDsySVC0uuSEH7SHCVt1+ijmiDFAI9p+fHCtuZdqrRDKIFs09zp5nrmu4ggP6xqSx9lj1VSblnDH+n3IBA==", + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" }, - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "peer": true, - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "version": "4.1.2" + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.0.0.tgz", + "version": "1.0.0" }, - "node_modules/@react-native-community/cli/node_modules/color-convert": { + "node_modules/@radix-ui/react-use-callback-ref": { "dependencies": { - "color-name": "~1.1.4" + "@babel/runtime": "^7.13.10" }, - "engines": { - "node": ">=7.0.0" + "integrity": "sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==", + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" }, - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "version": "2.0.1" - }, - "node_modules/@react-native-community/cli/node_modules/color-name": { - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true, - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "version": "1.1.4" + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz", + "version": "1.0.0" }, - "node_modules/@react-native-community/cli/node_modules/deepmerge": { - "engines": { - "node": ">=0.10.0" + "node_modules/@radix-ui/react-use-controllable-state": { + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.0" }, - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "peer": true, - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "version": "4.3.1" + "integrity": "sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==", + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + }, + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz", + "version": "1.0.0" }, - "node_modules/@react-native-community/cli/node_modules/find-up": { + "node_modules/@radix-ui/react-use-escape-keydown": { "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.0" }, - "engines": { - "node": ">=8" + "integrity": "sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg==", + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" }, - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "peer": true, - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "version": "4.1.0" + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.0.tgz", + "version": "1.0.0" }, - "node_modules/@react-native-community/cli/node_modules/has-flag": { - "engines": { - "node": ">=8" + "node_modules/@radix-ui/react-use-layout-effect": { + "dependencies": { + "@babel/runtime": "^7.13.10" }, - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "version": "4.0.0" + "integrity": "sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==", + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + }, + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz", + "version": "1.0.0" }, - "node_modules/@react-native-community/cli/node_modules/locate-path": { + "node_modules/@radix-ui/react-use-previous": { "dependencies": { - "p-locate": "^4.1.0" + "@babel/runtime": "^7.13.10" }, - "engines": { - "node": ">=8" + "integrity": "sha512-RG2K8z/K7InnOKpq6YLDmT49HGjNmrK+fr82UCVKT2sW0GYfVnYp4wZWBooT/EYfQ5faA9uIjvsuMMhH61rheg==", + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" }, - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "peer": true, - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "version": "5.0.0" + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.0.0.tgz", + "version": "1.0.0" }, - "node_modules/@react-native-community/cli/node_modules/p-limit": { + "node_modules/@radix-ui/react-use-rect": { "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" + "@babel/runtime": "^7.13.10", + "@radix-ui/rect": "1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "integrity": "sha512-TB7pID8NRMEHxb/qQJpvSt3hQU4sqNPM1VCTjTRjEOa7cEop/QMuq8S6fb/5Tsz64kqSvB9WnwsDHtjnrM9qew==", + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" }, - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "peer": true, - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "version": "2.3.0" + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.0.0.tgz", + "version": "1.0.0" }, - "node_modules/@react-native-community/cli/node_modules/p-locate": { + "node_modules/@radix-ui/react-use-size": { "dependencies": { - "p-limit": "^2.2.0" + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.0" }, - "engines": { - "node": ">=8" + "integrity": "sha512-imZ3aYcoYCKhhgNpkNDh/aTiU05qw9hX+HHI1QDBTyIlcFjgeFlKKySNGMwTp7nYFLQg/j0VA2FmCY4WPDDHMg==", + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" }, - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "peer": true, - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "version": "4.1.0" + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.0.0.tgz", + "version": "1.0.0" }, - "node_modules/@react-native-community/cli/node_modules/supports-color": { + "node_modules/@radix-ui/rect": { "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "@babel/runtime": "^7.13.10" }, - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "peer": true, - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "version": "7.2.0" + "integrity": "sha512-d0O68AYy/9oeEy1DdC07bz1/ZXX+DqCskRd3i4JzLSTXwefzaepQrKjXC7aNM8lTHjFLDO0pDgaEiQ7jEk+HVg==", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.0.0.tgz", + "version": "1.0.0" }, "node_modules/@react-native/assets-registry": { "engines": { "node": ">=18" }, - "integrity": "sha512-59YmIQxfGDw4aP9S/nAM+sjSFdW8fUP6fsqczCcXgL2YVEjyER9XCaUT0J1K+PdHep8pi05KUgIKUds8P3jbmA==", + "integrity": "sha512-YI8HoReYiIwdFQs+k9Q9qpFTnsyYikZxgs/UVtVbhKixXDQF6F9LLvj2naOx4cfV+RGybNKxwmDl1vUok/dRFQ==", "peer": true, - "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.74.85.tgz", - "version": "0.74.85" + "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.76.6.tgz", + "version": "0.76.6" }, "node_modules/@react-native/babel-plugin-codegen": { "dependencies": { - "@react-native/codegen": "0.74.85" + "@react-native/codegen": "0.76.6" }, "engines": { "node": ">=18" }, - "integrity": "sha512-48TSDclRB5OMXiImiJkLxyCfRyLsqkCgI8buugCZzvXcYslfV7gCvcyFyQldtcOmerV+CK4RAj7QS4hmB5Mr8Q==", + "integrity": "sha512-yFC9I/aDBOBz3ZMlqKn2NY/mDUtCksUNZ7AQmBiTAeVTUP0ujEjE0hTOx5Qd+kok7A7hwZEX87HdSgjiJZfr5g==", "peer": true, - "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.74.85.tgz", - "version": "0.74.85" + "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.76.6.tgz", + "version": "0.76.6" }, "node_modules/@react-native/babel-preset": { "dependencies": { - "@babel/core": "^7.20.0", - "@babel/plugin-proposal-async-generator-functions": "^7.0.0", - "@babel/plugin-proposal-class-properties": "^7.18.0", - "@babel/plugin-proposal-export-default-from": "^7.0.0", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.0", - "@babel/plugin-proposal-numeric-separator": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.20.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-export-default-from": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.18.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-syntax-optional-chaining": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-async-to-generator": "^7.20.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.20.0", - "@babel/plugin-transform-flow-strip-types": "^7.20.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.11", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-self": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0", - "@babel/plugin-transform-runtime": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-sticky-regex": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.5.0", - "@babel/plugin-transform-unicode-regex": "^7.0.0", - "@babel/template": "^7.0.0", - "@react-native/babel-plugin-codegen": "0.74.85", + "@babel/core": "^7.25.2", + "@babel/plugin-proposal-export-default-from": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-default-from": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.4", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.25.0", + "@babel/plugin-transform-class-properties": "^7.25.4", + "@babel/plugin-transform-classes": "^7.25.4", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.8", + "@babel/plugin-transform-flow-strip-types": "^7.25.2", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.25.1", + "@babel/plugin-transform-literals": "^7.25.2", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.8", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-react-display-name": "^7.24.7", + "@babel/plugin-transform-react-jsx": "^7.25.2", + "@babel/plugin-transform-react-jsx-self": "^7.24.7", + "@babel/plugin-transform-react-jsx-source": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-runtime": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-typescript": "^7.25.2", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/template": "^7.25.0", + "@react-native/babel-plugin-codegen": "0.76.6", + "babel-plugin-syntax-hermes-parser": "^0.25.1", "babel-plugin-transform-flow-enums": "^0.0.2", "react-refresh": "^0.14.0" }, "engines": { "node": ">=18" }, - "integrity": "sha512-yMHUlN8INbK5BBwiBuQMftdWkpm1IgCsoJTKcGD2OpSgZhwwm8RUSvGhdRMzB2w7bsqqBmaEMleGtW6aCR7B9w==", + "integrity": "sha512-ojlVWY6S/VE/nb9hIRetPMTsW9ZmGb2R3dnToEXAtQQDz41eHMHXbkw/k2h0THp6qhas25ruNvn3N5n2o+lBzg==", "peer": true, "peerDependencies": { "@babel/core": "*" }, - "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.74.85.tgz", - "version": "0.74.85" + "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.76.6.tgz", + "version": "0.76.6" + }, + "node_modules/@react-native/babel-preset/node_modules/babel-plugin-syntax-hermes-parser": { + "dependencies": { + "hermes-parser": "0.25.1" + }, + "integrity": "sha512-IVNpGzboFLfXZUAwkLFcI/bnqVbwky0jP3eBno4HKtqvQJAHBLdgxiG6lQ4to0+Q/YCN3PO0od5NZwIKyY4REQ==", + "peer": true, + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.25.1.tgz", + "version": "0.25.1" + }, + "node_modules/@react-native/babel-preset/node_modules/hermes-estree": { + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "peer": true, + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "version": "0.25.1" + }, + "node_modules/@react-native/babel-preset/node_modules/hermes-parser": { + "dependencies": { + "hermes-estree": "0.25.1" + }, + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "peer": true, + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "version": "0.25.1" }, "node_modules/@react-native/codegen": { "dependencies": { - "@babel/parser": "^7.20.0", + "@babel/parser": "^7.25.3", "glob": "^7.1.1", - "hermes-parser": "0.19.1", + "hermes-parser": "0.23.1", "invariant": "^2.2.4", "jscodeshift": "^0.14.0", "mkdirp": "^0.5.1", - "nullthrows": "^1.1.1" + "nullthrows": "^1.1.1", + "yargs": "^17.6.2" }, "engines": { "node": ">=18" }, - "integrity": "sha512-N7QwoS4Hq/uQmoH83Ewedy6D0M7xbQsOU3OMcQf0eY3ltQ7S2hd9/R4UTalQWRn1OUJfXR6OG12QJ4FStKgV6Q==", + "integrity": "sha512-BABb3e5G/+hyQYEYi0AODWh2km2d8ERoASZr6Hv90pVXdUHRYR+yxCatX7vSd9rnDUYndqRTzD0hZWAucPNAKg==", "peer": true, "peerDependencies": { "@babel/preset-env": "^7.1.6" }, - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.74.85.tgz", - "version": "0.74.85" + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.76.6.tgz", + "version": "0.76.6" }, "node_modules/@react-native/community-cli-plugin": { "dependencies": { - "@react-native-community/cli-server-api": "13.6.9", - "@react-native-community/cli-tools": "13.6.9", - "@react-native/dev-middleware": "0.74.85", - "@react-native/metro-babel-transformer": "0.74.85", + "@react-native/dev-middleware": "0.76.6", + "@react-native/metro-babel-transformer": "0.76.6", "chalk": "^4.0.0", "execa": "^5.1.1", - "metro": "^0.80.3", - "metro-config": "^0.80.3", - "metro-core": "^0.80.3", + "invariant": "^2.2.4", + "metro": "^0.81.0", + "metro-config": "^0.81.0", + "metro-core": "^0.81.0", "node-fetch": "^2.2.0", - "querystring": "^0.2.1", - "readline": "^1.3.0" + "readline": "^1.3.0", + "semver": "^7.1.3" }, "engines": { "node": ">=18" }, - "integrity": "sha512-ODzND33eA2owAY3g9jgCdqB+BjAh8qJ7dvmSotXgrgDYr3MJMpd8gvHTIPe2fg4Kab+wk8uipRhrE0i0RYMwtQ==", + "integrity": "sha512-nETlc/+U5cESVluzzgN0OcVfcoMijGBaDWzOaJhoYUodcuqnqtu75XsSEc7yzlYjwNQG+vF83mu9CQGezruNMA==", "peer": true, - "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.74.85.tgz", - "version": "0.74.85" + "peerDependencies": { + "@react-native-community/cli-server-api": "*" + }, + "peerDependenciesMeta": { + "@react-native-community/cli-server-api": { + "optional": true + } + }, + "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.76.6.tgz", + "version": "0.76.6" }, "node_modules/@react-native/community-cli-plugin/node_modules/ansi-styles": { "dependencies": { @@ -16617,16 +15471,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "version": "4.0.0" }, - "node_modules/@react-native/community-cli-plugin/node_modules/querystring": { - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "engines": { - "node": ">=0.4.x" - }, - "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==", - "peer": true, - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", - "version": "0.2.1" - }, "node_modules/@react-native/community-cli-plugin/node_modules/supports-color": { "dependencies": { "has-flag": "^4.0.0" @@ -16643,34 +15487,32 @@ "engines": { "node": ">=18" }, - "integrity": "sha512-gUIhhpsYLUTYWlWw4vGztyHaX/kNlgVspSvKe2XaPA7o3jYKUoNLc3Ov7u70u/MBWfKdcEffWq44eSe3j3s5JQ==", + "integrity": "sha512-kP97xMQjiANi5/lmf8MakS7d8FTJl+BqYHQMqyvNiY+eeWyKnhqW2GL2v3eEUBAuyPBgJGivuuO4RvjZujduJg==", "peer": true, - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.74.85.tgz", - "version": "0.74.85" + "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.76.6.tgz", + "version": "0.76.6" }, "node_modules/@react-native/dev-middleware": { "dependencies": { "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.74.85", - "@rnx-kit/chromium-edge-launcher": "^1.0.0", + "@react-native/debugger-frontend": "0.76.6", "chrome-launcher": "^0.15.2", + "chromium-edge-launcher": "^0.2.0", "connect": "^3.6.5", "debug": "^2.2.0", - "node-fetch": "^2.2.0", "nullthrows": "^1.1.1", "open": "^7.0.3", "selfsigned": "^2.4.1", "serve-static": "^1.13.1", - "temp-dir": "^2.0.0", - "ws": "^6.2.2" + "ws": "^6.2.3" }, "engines": { "node": ">=18" }, - "integrity": "sha512-BRmgCK5vnMmHaKRO+h8PKJmHHH3E6JFuerrcfE3wG2eZ1bcSr+QTu8DAlpxsDWvJvHpCi8tRJGauxd+Ssj/c7w==", + "integrity": "sha512-1bAyd2/X48Nzb45s5l2omM75vy764odx/UnDs4sJfFCuK+cupU4nRPgl0XWIqgdM/2+fbQ3E4QsVS/WIKTFxvQ==", "peer": true, - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.74.85.tgz", - "version": "0.74.85" + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.76.6.tgz", + "version": "0.76.6" }, "node_modules/@react-native/dev-middleware/node_modules/debug": { "dependencies": { @@ -16687,63 +15529,47 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "version": "2.0.0" }, - "node_modules/@react-native/dev-middleware/node_modules/open": { - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - }, - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "peer": true, - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "version": "7.4.2" - }, "node_modules/@react-native/gradle-plugin": { "engines": { "node": ">=18" }, - "integrity": "sha512-1VQSLukJzaVMn1MYcs8Weo1nUW8xCas2XU1KuoV7OJPk6xPnEBFJmapmEGP5mWeEy7kcTXJmddEgy1wwW0tcig==", + "integrity": "sha512-sDzpf4eiynryoS6bpYCweGoxSmWgCSx9lzBoxIIW+S6siyGiTaffzZHWCm8mIn9UZsSPlEO37q62ggnR9Zu/OA==", "peer": true, - "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.74.85.tgz", - "version": "0.74.85" + "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.76.6.tgz", + "version": "0.76.6" }, "node_modules/@react-native/js-polyfills": { "engines": { "node": ">=18" }, - "integrity": "sha512-gp4Rg9le3lVZeW7Cie6qLfekvRKZuhJ3LKgi1SFB4N154z1wIclypAJXVXgWBsy8JKJfTwRI+sffC4qZDlvzrg==", + "integrity": "sha512-cDD7FynxWYxHkErZzAJtzPGhJ13JdOgL+R0riTh0hCovOfIUz9ItffdLQv2nx48lnvMTQ+HZXMnGOZnsFCNzQw==", "peer": true, - "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.74.85.tgz", - "version": "0.74.85" + "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.76.6.tgz", + "version": "0.76.6" }, "node_modules/@react-native/metro-babel-transformer": { "dependencies": { - "@babel/core": "^7.20.0", - "@react-native/babel-preset": "0.74.85", - "hermes-parser": "0.19.1", + "@babel/core": "^7.25.2", + "@react-native/babel-preset": "0.76.6", + "hermes-parser": "0.23.1", "nullthrows": "^1.1.1" }, "engines": { "node": ">=18" }, - "integrity": "sha512-JIrXqEwhTvWPtGArgMptIPGstMdXQIkwSjKVYt+7VC4a9Pw1GurIWanIJheEW6ZuCVvTc0VZkwglFz9JVjzDjA==", + "integrity": "sha512-xSBi9jPliThu5HRSJvluqUlDOLLEmf34zY/U7RDDjEbZqC0ufPcPS7c5XsSg0GDPiXc7lgjBVesPZsKFkoIBgA==", "peer": true, "peerDependencies": { "@babel/core": "*" }, - "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.74.85.tgz", - "version": "0.74.85" + "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.76.6.tgz", + "version": "0.76.6" }, "node_modules/@react-native/normalize-colors": { - "integrity": "sha512-pcE4i0X7y3hsAE0SpIl7t6dUc0B0NZLd1yv7ssm4FrLhWG+CGyIq4eFDXpmPU1XHmL5PPySxTAjEMiwv6tAmOw==", + "integrity": "sha512-1n4udXH2Cla31iA/8eLRdhFHpYUYK1NKWCn4m1Sr9L4SarWKAYuRFliK1fcLvPPALCFoFlWvn8I0ekdUOHMzDQ==", "peer": true, - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.74.85.tgz", - "version": "0.74.85" + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.76.6.tgz", + "version": "0.76.6" }, "node_modules/@react-native/virtualized-lists": { "dependencies": { @@ -16753,7 +15579,7 @@ "engines": { "node": ">=18" }, - "integrity": "sha512-jx2Zw0qlZteoQ+0KxRc7s4drsljLBEP534FaNZ950e9+CN9nVkLsV6rigcTjDR8wjKMSBWhKf0C0C3egYz7Ehg==", + "integrity": "sha512-0HUWVwJbRq1BWFOu11eOWGTSmK9nMHhoMPyoI27wyWcl/nqUx7HOxMbRVq0DsTCyATSMPeF+vZ6o1REapcNWKw==", "peer": true, "peerDependencies": { "@types/react": "^18.2.6", @@ -16765,8 +15591,8 @@ "optional": true } }, - "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.74.85.tgz", - "version": "0.74.85" + "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.76.6.tgz", + "version": "0.76.6" }, "node_modules/@react-spring/animated": { "dependencies": { @@ -16835,44 +15661,6 @@ "resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.4.5.tgz", "version": "9.4.5" }, - "node_modules/@rnx-kit/chromium-edge-launcher": { - "dependencies": { - "@types/node": "^18.0.0", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0", - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=14.15" - }, - "integrity": "sha512-lzD84av1ZQhYUS+jsGqJiCMaJO2dn9u+RTT9n9q6D3SaKVwWqv+7AoRKqBu19bkwyE+iFRl1ymr40QS90jVFYg==", - "peer": true, - "resolved": "https://registry.npmjs.org/@rnx-kit/chromium-edge-launcher/-/chromium-edge-launcher-1.0.0.tgz", - "version": "1.0.0" - }, - "node_modules/@rnx-kit/chromium-edge-launcher/node_modules/@types/node": { - "dependencies": { - "undici-types": "~5.26.4" - }, - "integrity": "sha512-nPwTRDKUctxw3di5b4TfT3I0sWDiWoPQCZjXhvdkINntwr8lcoVCKsTgnXeRubKIlfnV+eN/HYk6Jb40tbcEAQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.39.tgz", - "version": "18.19.39" - }, - "node_modules/@rnx-kit/chromium-edge-launcher/node_modules/mkdirp": { - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - }, - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "peer": true, - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "version": "1.0.4" - }, "node_modules/@rollup/plugin-babel": { "dependencies": { "@babel/helper-module-imports": "^7.10.4", @@ -17450,22 +16238,6 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "version": "6.1.0" }, - "node_modules/@serverless/dashboard-plugin/node_modules/open": { - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - }, - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "version": "7.4.2" - }, "node_modules/@serverless/dashboard-plugin/node_modules/tslib": { "dev": true, "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", @@ -17690,12 +16462,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "version": "4.0.0" }, - "node_modules/@serverless/utils/node_modules/ms": { - "dev": true, - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "version": "2.1.3" - }, "node_modules/@serverless/utils/node_modules/open": { "dependencies": { "define-lazy-prop": "^2.0.0", @@ -17728,27 +16494,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "version": "8.1.1" }, - "node_modules/@sideway/address": { - "dependencies": { - "@hapi/hoek": "^9.0.0" - }, - "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", - "peer": true, - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", - "version": "4.1.5" - }, - "node_modules/@sideway/formula": { - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", - "peer": true, - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "version": "3.0.1" - }, - "node_modules/@sideway/pinpoint": { - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "version": "2.0.0" - }, "node_modules/@sinclair/typebox": { "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -19538,9 +18283,9 @@ "version": "1.5.0" }, "node_modules/@types/cookie": { - "integrity": "sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow==", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.3.3.tgz", - "version": "0.3.3" + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "version": "0.6.0" }, "node_modules/@types/cors": { "dependencies": { @@ -19637,14 +18382,14 @@ "@types/eslint": "*", "@types/estree": "*" }, - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "version": "3.7.4" + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "version": "3.7.7" }, "node_modules/@types/estree": { - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "version": "1.0.1" + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "version": "1.0.6" }, "node_modules/@types/express": { "dependencies": { @@ -19722,9 +18467,9 @@ "dependencies": { "@types/node": "*" }, - "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", - "version": "1.17.11" + "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", + "version": "1.17.15" }, "node_modules/@types/istanbul-lib-coverage": { "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", @@ -20043,9 +18788,9 @@ "version": "5.14.9" }, "node_modules/@types/trusted-types": { - "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", - "version": "2.0.3" + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "version": "2.0.7" }, "node_modules/@types/unist": { "integrity": "sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==", @@ -20308,134 +19053,134 @@ }, "node_modules/@webassemblyjs/ast": { "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" }, - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "version": "1.11.6" + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "version": "1.14.1" }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "version": "1.11.6" + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "version": "1.13.2" }, "node_modules/@webassemblyjs/helper-api-error": { - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "version": "1.11.6" + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "version": "1.13.2" }, "node_modules/@webassemblyjs/helper-buffer": { - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "version": "1.11.6" + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "version": "1.14.1" }, "node_modules/@webassemblyjs/helper-numbers": { "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" }, - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "version": "1.11.6" + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "version": "1.13.2" }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "version": "1.11.6" + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "version": "1.13.2" }, "node_modules/@webassemblyjs/helper-wasm-section": { "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" }, - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "version": "1.11.6" + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "version": "1.14.1" }, "node_modules/@webassemblyjs/ieee754": { "dependencies": { "@xtuc/ieee754": "^1.2.0" }, - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "version": "1.11.6" + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "version": "1.13.2" }, "node_modules/@webassemblyjs/leb128": { "dependencies": { "@xtuc/long": "4.2.2" }, - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "version": "1.11.6" + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "version": "1.13.2" }, "node_modules/@webassemblyjs/utf8": { - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "version": "1.11.6" + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "version": "1.13.2" }, "node_modules/@webassemblyjs/wasm-edit": { "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" - }, - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "version": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + }, + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "version": "1.14.1" }, "node_modules/@webassemblyjs/wasm-gen": { "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" }, - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "version": "1.11.6" + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "version": "1.14.1" }, "node_modules/@webassemblyjs/wasm-opt": { "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" }, - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "version": "1.11.6" + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "version": "1.14.1" }, "node_modules/@webassemblyjs/wasm-parser": { "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" }, - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "version": "1.11.6" + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "version": "1.14.1" }, "node_modules/@webassemblyjs/wast-printer": { "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" }, - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "version": "1.11.6" + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "version": "1.14.1" }, "node_modules/@webpack-cli/configtest": { "dev": true, @@ -20548,9 +19293,9 @@ "engines": { "node": ">=0.4.0" }, - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "version": "8.10.0" + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "version": "8.14.0" }, "node_modules/acorn-globals": { "dependencies": { @@ -20572,14 +19317,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "version": "7.4.1" }, - "node_modules/acorn-import-assertions": { - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "peerDependencies": { - "acorn": "^8" - }, - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "version": "1.9.0" - }, "node_modules/acorn-jsx": { "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "peerDependencies": { @@ -20686,9 +19423,9 @@ "isomorphic-unfetch": "^3.0.0", "js-cookie": "^2.2.1" }, - "integrity": "sha512-AOROAQHQYvXYnhzhB9L1cZdz+linq/xaPTBfXhvXsx1tyhbbzmA7HX8Ap3mKBPsjsG8UWfzDhdRCb7hmH3S14A==", - "resolved": "https://registry.npmjs.org/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.3.13.tgz", - "version": "6.3.13" + "integrity": "sha512-nxN8L5AAwLIsgQKyKMOsNwr5xeY7+fccv+A/ALiYxmGiM341XX0dcoMuM+LlJmzfIfuPmTrXSehhTunTTQFAow==", + "resolved": "https://registry.npmjs.org/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.3.14.tgz", + "version": "6.3.14" }, "node_modules/anser": { "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", @@ -20710,38 +19447,6 @@ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "version": "4.3.2" }, - "node_modules/ansi-fragments": { - "dependencies": { - "colorette": "^1.0.7", - "slice-ansi": "^2.0.0", - "strip-ansi": "^5.0.0" - }, - "integrity": "sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==", - "peer": true, - "resolved": "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz", - "version": "0.2.1" - }, - "node_modules/ansi-fragments/node_modules/ansi-regex": { - "engines": { - "node": ">=6" - }, - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "peer": true, - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "version": "4.1.1" - }, - "node_modules/ansi-fragments/node_modules/strip-ansi": { - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - }, - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "peer": true, - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "version": "5.2.0" - }, "node_modules/ansi-html-community": { "bin": { "ansi-html": "bin/ansi-html" @@ -20765,6 +19470,7 @@ "dependencies": { "color-convert": "^1.9.0" }, + "dev": true, "engines": { "node": ">=4" }, @@ -20789,12 +19495,6 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "version": "3.1.3" }, - "node_modules/appdirsjs": { - "integrity": "sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==", - "peer": true, - "resolved": "https://registry.npmjs.org/appdirsjs/-/appdirsjs-1.2.7.tgz", - "version": "1.2.7" - }, "node_modules/archive-type": { "dependencies": { "file-type": "^4.2.0" @@ -21105,15 +19805,6 @@ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", "version": "0.0.7" }, - "node_modules/astral-regex": { - "engines": { - "node": ">=4" - }, - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "peer": true, - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "version": "1.0.0" - }, "node_modules/async": { "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", @@ -21206,23 +19897,23 @@ }, "node_modules/aws-amplify": { "dependencies": { - "@aws-amplify/analytics": "6.5.12", - "@aws-amplify/api": "5.4.12", - "@aws-amplify/auth": "5.6.12", - "@aws-amplify/cache": "5.1.18", - "@aws-amplify/core": "5.8.12", - "@aws-amplify/datastore": "4.7.12", - "@aws-amplify/geo": "2.3.12", - "@aws-amplify/interactions": "5.2.18", - "@aws-amplify/notifications": "1.6.13", - "@aws-amplify/predictions": "5.5.12", - "@aws-amplify/pubsub": "5.5.12", - "@aws-amplify/storage": "5.9.12", + "@aws-amplify/analytics": "6.5.14", + "@aws-amplify/api": "5.4.16", + "@aws-amplify/auth": "5.6.15", + "@aws-amplify/cache": "5.1.20", + "@aws-amplify/core": "5.8.14", + "@aws-amplify/datastore": "4.7.16", + "@aws-amplify/geo": "2.3.14", + "@aws-amplify/interactions": "5.2.21", + "@aws-amplify/notifications": "1.6.16", + "@aws-amplify/predictions": "5.5.17", + "@aws-amplify/pubsub": "5.6.2", + "@aws-amplify/storage": "5.9.16", "tslib": "^2.0.0" }, - "integrity": "sha512-/Sbgow1Zfe5RDnKyVlNZblaDuphz2g7IPBF6w6NKnM1JfuVCREHb5FwKUPr5RzfH8JAdCh/OFiCqhLDk2wo7dw==", - "resolved": "https://registry.npmjs.org/aws-amplify/-/aws-amplify-5.3.19.tgz", - "version": "5.3.19" + "integrity": "sha512-L4impLEBZKwNWRuM8jyfV4IUkGlh0ayLM1yRabd/Gm50leY8VSUbq5eXYhHzZpE2xcuqqIhuySo6Ui/y0gZ/iQ==", + "resolved": "https://registry.npmjs.org/aws-amplify/-/aws-amplify-5.3.27.tgz", + "version": "5.3.27" }, "node_modules/aws-sdk": { "dependencies": { @@ -21290,9 +19981,9 @@ "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" }, - "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", - "version": "1.7.2" + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", + "version": "1.7.9" }, "node_modules/axios/node_modules/form-data": { "dependencies": { @@ -21326,7 +20017,7 @@ }, "node_modules/babel-jest": { "dependencies": { - "@jest/transform": "^29.6.4", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -21334,23 +20025,21 @@ "graceful-fs": "^4.2.9", "slash": "^3.0.0" }, - "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "peer": true, "peerDependencies": { "@babel/core": "^7.8.0" }, - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", - "version": "29.6.4" + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "version": "29.7.0" }, "node_modules/babel-jest/node_modules/ansi-styles": { "dependencies": { "color-convert": "^2.0.1" }, - "dev": true, "engines": { "node": ">=8" }, @@ -21367,7 +20056,6 @@ "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, - "dev": true, "engines": { "node": ">=10" }, @@ -21383,7 +20071,6 @@ "dependencies": { "color-name": "~1.1.4" }, - "dev": true, "engines": { "node": ">=7.0.0" }, @@ -21393,14 +20080,12 @@ "version": "2.0.1" }, "node_modules/babel-jest/node_modules/color-name": { - "dev": true, "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "peer": true, "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "version": "1.1.4" }, "node_modules/babel-jest/node_modules/has-flag": { - "dev": true, "engines": { "node": ">=8" }, @@ -21413,7 +20098,6 @@ "dependencies": { "has-flag": "^4.0.0" }, - "dev": true, "engines": { "node": ">=8" }, @@ -21580,7 +20264,6 @@ "@types/babel__core": "^7.1.14", "@types/babel__traverse": "^7.0.6" }, - "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, @@ -21614,15 +20297,30 @@ "node_modules/babel-plugin-polyfill-corejs2": { "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.2", + "@babel/helper-define-polyfill-provider": "^0.6.3", "semver": "^6.3.1" }, - "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", + "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + }, + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz", + "version": "0.4.12" + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/@babel/helper-define-polyfill-provider": { + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" }, - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", - "version": "0.4.5" + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", + "version": "0.6.3" }, "node_modules/babel-plugin-polyfill-corejs3": { "dependencies": { @@ -21647,6 +20345,15 @@ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", "version": "0.5.2" }, + "node_modules/babel-plugin-syntax-hermes-parser": { + "dependencies": { + "hermes-parser": "0.23.1" + }, + "integrity": "sha512-uNLD0tk2tLUjGFdmCk+u/3FEw2o+BAwW4g+z2QVlxJrzZYOOPADroEcNtTPt5lNiScctaUmnsTkVEnOwZUOLhA==", + "peer": true, + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.23.1.tgz", + "version": "0.23.1" + }, "node_modules/babel-plugin-transform-flow-enums": { "dependencies": { "@babel/plugin-syntax-flow": "^7.12.1" @@ -21688,7 +20395,6 @@ "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" }, - "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, @@ -21820,6 +20526,7 @@ "inherits": "^2.0.4", "readable-stream": "^3.4.0" }, + "dev": true, "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "version": "4.1.0" @@ -21829,6 +20536,7 @@ "base64-js": "^1.3.1", "ieee754": "^1.1.13" }, + "dev": true, "funding": [ { "type": "github", @@ -21862,7 +20570,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -21871,9 +20579,9 @@ "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" }, - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "version": "1.20.2" + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "version": "1.20.3" }, "node_modules/body-parser/node_modules/bytes": { "engines": { @@ -21918,20 +20626,6 @@ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "version": "2.4.1" }, - "node_modules/body-parser/node_modules/qs": { - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - }, - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "version": "6.11.0" - }, "node_modules/bonjour-service": { "dependencies": { "array-flatten": "^2.1.2", @@ -21983,10 +20677,10 @@ "browserslist": "cli.js" }, "dependencies": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" @@ -22005,9 +20699,9 @@ "url": "https://github.com/sponsors/ai" } ], - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "version": "4.21.10" + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "version": "4.24.4" }, "node_modules/bs-logger": { "dependencies": { @@ -22174,6 +20868,33 @@ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "version": "1.0.2" }, + "node_modules/call-bind-apply-helpers": { + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + }, + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "version": "1.0.1" + }, + "node_modules/call-bound": { + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + }, + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "version": "1.0.3" + }, "node_modules/caller-callsite": { "dependencies": { "callsites": "^2.0.0" @@ -22282,9 +21003,9 @@ "url": "https://github.com/sponsors/ai" } ], - "integrity": "sha512-Jj917pJtYg9HSJBF95HVX3Cdr89JUyLT4IZ8SvM5aDRni95swKgYi3TgYLH5hnGfPE/U1dg6IfZ50UsIlLkwSA==", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001524.tgz", - "version": "1.0.30001524" + "integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz", + "version": "1.0.30001692" }, "node_modules/canvg": { "dependencies": { @@ -22335,6 +21056,7 @@ "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" }, + "dev": true, "engines": { "node": ">=4" }, @@ -22343,6 +21065,7 @@ "version": "2.4.2" }, "node_modules/chalk/node_modules/escape-string-regexp": { + "dev": true, "engines": { "node": ">=0.8.0" }, @@ -22422,9 +21145,9 @@ "engines": { "node": ">=4.8" }, - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "version": "6.0.5" + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "version": "6.0.6" }, "node_modules/child-process-ext/node_modules/path-key": { "dev": true, @@ -22540,6 +21263,32 @@ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", "version": "1.0.3" }, + "node_modules/chromium-edge-launcher": { + "dependencies": { + "@types/node": "*", + "escape-string-regexp": "^4.0.0", + "is-wsl": "^2.2.0", + "lighthouse-logger": "^1.0.0", + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", + "peer": true, + "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz", + "version": "0.2.0" + }, + "node_modules/chromium-edge-launcher/node_modules/mkdirp": { + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + }, + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "peer": true, + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "version": "1.0.4" + }, "node_modules/ci-info": { "engines": { "node": ">=8" @@ -22609,6 +21358,7 @@ "dependencies": { "restore-cursor": "^3.1.0" }, + "dev": true, "engines": { "node": ">=8" }, @@ -22635,6 +21385,7 @@ "version": "2.3.2" }, "node_modules/cli-spinners": { + "dev": true, "engines": { "node": ">=6" }, @@ -22696,6 +21447,7 @@ "version": "8.0.1" }, "node_modules/clone": { + "dev": true, "engines": { "node": ">=0.8" }, @@ -22754,11 +21506,13 @@ "dependencies": { "color-name": "1.1.3" }, + "dev": true, "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "version": "1.9.3" }, "node_modules/color-name": { + "dev": true, "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "version": "1.1.3" @@ -22768,12 +21522,6 @@ "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", "version": "2.9.3" }, - "node_modules/colorette": { - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", - "peer": true, - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "version": "1.4.0" - }, "node_modules/combined-stream": { "dependencies": { "delayed-stream": "~1.0.0" @@ -22794,20 +21542,14 @@ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", "version": "2.0.3" }, - "node_modules/command-exists": { - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", - "peer": true, - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "version": "1.2.9" - }, "node_modules/commander": { "engines": { - "node": "^12.20.0 || >=14" + "node": ">=18" }, - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "peer": true, - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "version": "9.5.0" + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "version": "12.1.0" }, "node_modules/common-path-prefix": { "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", @@ -23001,11 +21743,11 @@ }, "node_modules/cookie": { "engines": { - "node": ">= 0.6" + "node": ">=18" }, - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "version": "0.6.0" + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "version": "1.0.2" }, "node_modules/cookie-signature": { "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", @@ -23085,15 +21827,15 @@ }, "node_modules/core-js-compat": { "dependencies": { - "browserslist": "^4.21.10" + "browserslist": "^4.24.3" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" }, - "integrity": "sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA==", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.1.tgz", - "version": "3.32.1" + "integrity": "sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.40.0.tgz", + "version": "3.40.0" }, "node_modules/core-js-pure": { "funding": { @@ -23177,9 +21919,9 @@ "engines": { "node": ">= 8" }, - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "version": "7.0.3" + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "version": "7.0.6" }, "node_modules/crypto-random-string": { "engines": { @@ -23786,25 +22528,26 @@ "version": "3.1.3" }, "node_modules/dayjs": { + "dev": true, "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", "version": "1.11.10" }, "node_modules/debug": { "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" }, - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "peerDependenciesMeta": { "supports-color": { "optional": true } }, - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "version": "4.3.4" + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "version": "4.4.0" }, "node_modules/decamelize": { "engines": { @@ -24103,6 +22846,7 @@ "dependencies": { "clone": "^1.0.2" }, + "dev": true, "funding": { "url": "https://github.com/sponsors/sindresorhus" }, @@ -24427,9 +23171,9 @@ "version": "4.3.1" }, "node_modules/dompurify": { - "integrity": "sha512-F9e6wPGtY+8KNMRAVfxeCOHU0/NPWMSENNq4pQctuXRqqdEPW7q3CrLbR5Nse044WwacyjHGOMlvNsBe1y6z9A==", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.5.tgz", - "version": "3.0.5" + "integrity": "sha512-o1vSNgrmYMQObbSSvF/1brBYEQPHhV1+gsmrusO7/GXtp1T9rCS8cXFqVxK/9crT1jA6Ccv+5MTSjBNqr7Sovw==", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.5.8.tgz", + "version": "2.5.8" }, "node_modules/domready": { "integrity": "sha512-uIzsOJUNk+AdGE9a6VDeessoMCzF8RrZvJCX/W8QtyfgdR6Uofn/MvRonih3OtCO79b2VDzDOymuiABrQ4z3XA==", @@ -24490,6 +23234,19 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "version": "16.13.1" }, + "node_modules/dunder-proto": { + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + }, + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "version": "1.0.1" + }, "node_modules/duplexer": { "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -24525,9 +23282,9 @@ "version": "3.1.10" }, "node_modules/electron-to-chromium": { - "integrity": "sha512-cSMwIAd8yUh54VwitVRVvHK66QqHWE39C3DRj8SWiXitEpVSY3wNPD9y1pxQtLIi4w3UdzF9klLsmuPshz09DQ==", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.504.tgz", - "version": "1.4.504" + "integrity": "sha512-LcUDPqSt+V0QmI47XLzZrz5OqILSMGsPFkDYus22rIbgorSvBYEFqq854ltTmUdHkY92FSdAAvsh4jWEULMdfQ==", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.83.tgz", + "version": "1.5.83" }, "node_modules/element-closest": { "engines": { @@ -24593,9 +23350,9 @@ "engines": { "node": ">=10.13.0" }, - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "version": "5.15.0" + "integrity": "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz", + "version": "5.18.0" }, "node_modules/entities": { "funding": { @@ -24609,6 +23366,7 @@ "bin": { "envinfo": "dist/cli.js" }, + "dev": true, "engines": { "node": ">=4" }, @@ -24632,19 +23390,6 @@ "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", "version": "2.1.4" }, - "node_modules/errorhandler": { - "dependencies": { - "accepts": "~1.3.7", - "escape-html": "~1.0.3" - }, - "engines": { - "node": ">= 0.8" - }, - "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==", - "peer": true, - "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", - "version": "1.5.1" - }, "node_modules/es-abstract": { "dependencies": { "array-buffer-byte-length": "^1.0.0", @@ -24697,6 +23442,22 @@ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", "version": "1.22.1" }, + "node_modules/es-define-property": { + "engines": { + "node": ">= 0.4" + }, + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "version": "1.0.1" + }, + "node_modules/es-errors": { + "engines": { + "node": ">= 0.4" + }, + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "version": "1.3.0" + }, "node_modules/es-get-iterator": { "dependencies": { "call-bind": "^1.0.2", @@ -24747,6 +23508,17 @@ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", "version": "1.3.0" }, + "node_modules/es-object-atoms": { + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "version": "1.1.1" + }, "node_modules/es-set-tostringtag": { "dependencies": { "get-intrinsic": "^1.1.3", @@ -24869,9 +23641,9 @@ "engines": { "node": ">=6" }, - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "version": "3.1.1" + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "version": "3.2.0" }, "node_modules/escape-html": { "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", @@ -25797,34 +24569,40 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "version": "7.2.0" }, + "node_modules/exponential-backoff": { + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "peer": true, + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "version": "3.1.1" + }, "node_modules/express": { "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -25834,9 +24612,13 @@ "engines": { "node": ">= 0.10.0" }, - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "version": "4.19.2" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + }, + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "version": "4.21.2" }, "node_modules/express-rate-limit": { "engines": { @@ -25857,6 +24639,14 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "version": "1.1.1" }, + "node_modules/express/node_modules/cookie": { + "engines": { + "node": ">= 0.6" + }, + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "version": "0.7.1" + }, "node_modules/express/node_modules/debug": { "dependencies": { "ms": "2.0.0" @@ -25865,10 +24655,18 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "version": "2.6.9" }, + "node_modules/express/node_modules/encodeurl": { + "engines": { + "node": ">= 0.8" + }, + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "version": "2.0.0" + }, "node_modules/express/node_modules/finalhandler": { "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -25878,9 +24676,9 @@ "engines": { "node": ">= 0.8" }, - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "version": "1.2.0" + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "version": "1.3.1" }, "node_modules/express/node_modules/ms": { "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", @@ -25899,23 +24697,9 @@ "version": "2.4.1" }, "node_modules/express/node_modules/path-to-regexp": { - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "version": "0.1.7" - }, - "node_modules/express/node_modules/qs": { - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - }, - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "version": "6.11.0" + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "version": "0.1.12" }, "node_modules/express/node_modules/safe-buffer": { "funding": [ @@ -26084,9 +24868,9 @@ "url": "https://paypal.me/naturalintelligence" } ], - "integrity": "sha512-kLY3jFlwIYwBNDojclKsNAC12sfD6NwW74QB2CoNGPvtVxjliYehVunB3HYyNi+n4Tt1dAcgwYvmKF/Z18flqg==", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.0.tgz", - "version": "4.4.0" + "integrity": "sha512-y655CeyUQ+jj7KBbYMc4FG01V8ZQqjN+gDYGJ50RtfsUB8iG9AmwmwoAgeKLJdmueKKMrH1RJ7yXHTSoczdv5w==", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.1.tgz", + "version": "4.5.1" }, "node_modules/fastest-levenshtein": { "dev": true, @@ -26565,10 +25349,10 @@ "engines": { "node": ">=0.4.0" }, - "integrity": "sha512-topOrETNxJ6T2gAnQiWqAlzGPj8uI2wtmNOlDIMNB+qyvGJZ6R++STbUOTAYmvPhOMz2gXnXPH0hOvURYmrBow==", + "integrity": "sha512-xiXLmMH2Z7OmdE9Q+MjljUMr/rbemFqZIRxaeZieVScG4HzQrKKhNcCYZbWTGpoN7ZPi7z8ClQbeVPq6t5AszQ==", "peer": true, - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.239.1.tgz", - "version": "0.239.1" + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.259.1.tgz", + "version": "0.259.1" }, "node_modules/follow-redirects": { "engines": { @@ -26868,6 +25652,7 @@ "jsonfile": "^4.0.0", "universalify": "^0.1.0" }, + "dev": true, "engines": { "node": ">=6 <7 || >=8" }, @@ -26947,9 +25732,12 @@ "version": "2.3.3" }, "node_modules/function-bind": { - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "version": "1.1.1" + "funding": { + "url": "https://github.com/sponsors/ljharb" + }, + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "version": "1.1.2" }, "node_modules/function.prototype.name": { "dependencies": { @@ -26994,17 +25782,26 @@ }, "node_modules/get-intrinsic": { "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "call-bind-apply-helpers": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "function-bind": "^1.1.2", + "get-proto": "^1.0.0", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" }, - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "version": "1.2.1" + "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", + "version": "1.2.7" }, "node_modules/get-nonce": { "engines": { @@ -27027,6 +25824,18 @@ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "version": "0.1.0" }, + "node_modules/get-proto": { + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "version": "1.0.1" + }, "node_modules/get-stdin": { "dev": true, "engines": { @@ -27192,15 +26001,15 @@ "version": "11.1.0" }, "node_modules/gopd": { - "dependencies": { - "get-intrinsic": "^1.1.3" + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" }, - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "version": "1.0.1" + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "version": "1.2.0" }, "node_modules/got": { "dependencies": { @@ -27298,6 +26107,7 @@ "version": "1.0.2" }, "node_modules/has-flag": { + "dev": true, "engines": { "node": ">=4" }, @@ -27334,9 +26144,9 @@ "funding": { "url": "https://github.com/sponsors/ljharb" }, - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "version": "1.0.3" + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "version": "1.1.0" }, "node_modules/has-tostringtag": { "dependencies": { @@ -27352,6 +26162,17 @@ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "version": "1.0.0" }, + "node_modules/hasown": { + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + }, + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "version": "2.0.2" + }, "node_modules/hast-util-whitespace": { "funding": { "type": "opencollective", @@ -27388,40 +26209,19 @@ "version": "7.0.0" }, "node_modules/hermes-estree": { - "integrity": "sha512-daLGV3Q2MKk8w4evNMKwS8zBE/rcpA800nu1Q5kM08IKijoSnPe9Uo1iIxzPKRkn95IxxsgBMPeYHt3VG4ej2g==", + "integrity": "sha512-eT5MU3f5aVhTqsfIReZ6n41X5sYn4IdQL0nvz6yO+MMlPxw49aSARHLg/MSehQftyjnrE8X6bYregzSumqc6cg==", "peer": true, - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.19.1.tgz", - "version": "0.19.1" + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.23.1.tgz", + "version": "0.23.1" }, "node_modules/hermes-parser": { "dependencies": { - "hermes-estree": "0.19.1" - }, - "integrity": "sha512-Vp+bXzxYJWrpEuJ/vXxUsLnt0+y4q9zyi4zUlkLqD8FKv4LjIfOvP69R/9Lty3dCyKh0E2BU7Eypqr63/rKT/A==", - "peer": true, - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.19.1.tgz", - "version": "0.19.1" - }, - "node_modules/hermes-profile-transformer": { - "dependencies": { - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=8" + "hermes-estree": "0.23.1" }, - "integrity": "sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==", + "integrity": "sha512-oxl5h2DkFW83hT4DAUJorpah8ou4yvmweUzLJmmr6YV2cezduCdlil1AvU/a/xSsAFo4WUcNA4GoV5Bvq6JffA==", "peer": true, - "resolved": "https://registry.npmjs.org/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz", - "version": "0.0.6" - }, - "node_modules/hermes-profile-transformer/node_modules/source-map": { - "engines": { - "node": ">= 8" - }, - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "peer": true, - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "version": "0.7.4" + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.23.1.tgz", + "version": "0.23.1" }, "node_modules/hexoid": { "dev": true, @@ -27678,37 +26478,27 @@ }, "node_modules/http-proxy-middleware": { "dependencies": { - "@types/http-proxy": "^1.17.8", + "@types/http-proxy": "^1.17.15", + "debug": "^4.3.6", "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" + "is-glob": "^4.0.3", + "is-plain-object": "^5.0.0", + "micromatch": "^4.0.8" }, "engines": { - "node": ">=12.0.0" - }, - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "version": "2.0.6" + "integrity": "sha512-usY0HG5nyDUwtqpiZdETNbmKtw3QQ1jwYFZ9wi5iHzX2BcILwQKtYDJPo7XHTsu5Z0B2Hj3W9NNnbd+AjFWjqg==", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.3.tgz", + "version": "3.0.3" }, - "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "node_modules/http-proxy-middleware/node_modules/is-plain-object": { "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" }, - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "version": "3.0.0" + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "version": "5.0.0" }, "node_modules/http2-wrapper": { "dependencies": { @@ -27830,10 +26620,10 @@ "engines": { "node": ">=16.x" }, - "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", + "integrity": "sha512-4S8fwbO6w3GeCVN6OPtA9I5IGKkcDMPcKndtUlpJuCwu7JLjtj7JZpwqLuyY2nrmQT3AWsCJLSKPsc2mPBSl3w==", "peer": true, - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", - "version": "1.1.1" + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.0.tgz", + "version": "1.2.0" }, "node_modules/immediate": { "dev": true, @@ -28304,15 +27094,6 @@ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", "version": "1.0.2" }, - "node_modules/is-fullwidth-code-point": { - "engines": { - "node": ">=4" - }, - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "peer": true, - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "version": "2.0.0" - }, "node_modules/is-generator-fn": { "engines": { "node": ">=6" @@ -28347,6 +27128,7 @@ "version": "4.0.3" }, "node_modules/is-interactive": { + "dev": true, "engines": { "node": ">=8" }, @@ -28564,6 +27346,7 @@ "version": "1.0.0" }, "node_modules/is-unicode-supported": { + "dev": true, "engines": { "node": ">=10" }, @@ -29774,22 +28557,21 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, - "devOptional": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "optionalDependencies": { "fsevents": "^2.3.2" }, "peer": true, - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", - "version": "29.6.4" + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "version": "29.7.0" }, "node_modules/jest-jasmine2": { "dependencies": { @@ -30594,7 +29376,6 @@ "version": "1.2.3" }, "node_modules/jest-regex-util": { - "devOptional": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, @@ -31135,9 +29916,9 @@ "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "version": "29.6.3" + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "version": "29.7.0" }, "node_modules/jest-util/node_modules/ansi-styles": { "dependencies": { @@ -31427,16 +30208,16 @@ "node_modules/jest-worker": { "dependencies": { "@types/node": "*", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", - "version": "29.6.4" + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "version": "29.7.0" }, "node_modules/jest-worker/node_modules/has-flag": { "engines": { @@ -31477,19 +30258,6 @@ "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", "version": "0.16.0" }, - "node_modules/joi": { - "dependencies": { - "@hapi/hoek": "^9.3.0", - "@hapi/topo": "^5.1.0", - "@sideway/address": "^4.1.5", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - }, - "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", - "peer": true, - "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", - "version": "17.13.3" - }, "node_modules/js-cookie": { "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==", "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", @@ -31751,11 +30519,11 @@ "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" }, - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "version": "2.5.2" + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "version": "3.1.0" }, "node_modules/json-buffer": { "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", @@ -31885,6 +30653,7 @@ "version": "3.2.0" }, "node_modules/jsonfile": { + "dev": true, "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "optionalDependencies": { "graceful-fs": "^4.1.6" @@ -31917,12 +30686,6 @@ "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-2.5.1.tgz", "version": "2.5.1" }, - "node_modules/jspdf/node_modules/dompurify": { - "integrity": "sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ==", - "optional": true, - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.7.tgz", - "version": "2.4.7" - }, "node_modules/jspdf/node_modules/fflate": { "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz", @@ -32324,6 +31087,7 @@ "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" }, + "dev": true, "engines": { "node": ">=10" }, @@ -32338,6 +31102,7 @@ "dependencies": { "color-convert": "^2.0.1" }, + "dev": true, "engines": { "node": ">=8" }, @@ -32353,6 +31118,7 @@ "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, + "dev": true, "engines": { "node": ">=10" }, @@ -32367,6 +31133,7 @@ "dependencies": { "color-name": "~1.1.4" }, + "dev": true, "engines": { "node": ">=7.0.0" }, @@ -32375,11 +31142,13 @@ "version": "2.0.1" }, "node_modules/log-symbols/node_modules/color-name": { + "dev": true, "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "version": "1.1.4" }, "node_modules/log-symbols/node_modules/has-flag": { + "dev": true, "engines": { "node": ">=8" }, @@ -32391,6 +31160,7 @@ "dependencies": { "has-flag": "^4.0.0" }, + "dev": true, "engines": { "node": ">=8" }, @@ -32398,180 +31168,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "version": "7.2.0" }, - "node_modules/logkitty": { - "bin": { - "logkitty": "bin/logkitty.js" - }, - "dependencies": { - "ansi-fragments": "^0.2.1", - "dayjs": "^1.8.15", - "yargs": "^15.1.0" - }, - "integrity": "sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.7.1.tgz", - "version": "0.7.1" - }, - "node_modules/logkitty/node_modules/ansi-styles": { - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - }, - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "peer": true, - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "version": "4.3.0" - }, - "node_modules/logkitty/node_modules/cliui": { - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - }, - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "version": "6.0.0" - }, - "node_modules/logkitty/node_modules/color-convert": { - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - }, - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "version": "2.0.1" - }, - "node_modules/logkitty/node_modules/color-name": { - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true, - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "version": "1.1.4" - }, - "node_modules/logkitty/node_modules/decamelize": { - "engines": { - "node": ">=0.10.0" - }, - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "peer": true, - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "version": "1.2.0" - }, - "node_modules/logkitty/node_modules/find-up": { - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - }, - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "peer": true, - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "version": "4.1.0" - }, - "node_modules/logkitty/node_modules/locate-path": { - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "peer": true, - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "version": "5.0.0" - }, - "node_modules/logkitty/node_modules/p-limit": { - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - }, - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "peer": true, - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "version": "2.3.0" - }, - "node_modules/logkitty/node_modules/p-locate": { - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - }, - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "peer": true, - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "version": "4.1.0" - }, - "node_modules/logkitty/node_modules/wrap-ansi": { - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "peer": true, - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "version": "6.2.0" - }, - "node_modules/logkitty/node_modules/y18n": { - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "version": "4.0.3" - }, - "node_modules/logkitty/node_modules/yargs": { - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - }, - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "peer": true, - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "version": "15.4.1" - }, - "node_modules/logkitty/node_modules/yargs-parser": { - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - }, - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "version": "18.1.3" - }, "node_modules/loose-envify": { "bin": { "loose-envify": "cli.js" @@ -32687,6 +31283,14 @@ "resolved": "https://registry.npmjs.org/matches-selector/-/matches-selector-1.2.0.tgz", "version": "1.2.0" }, + "node_modules/math-intrinsics": { + "engines": { + "node": ">= 0.4" + }, + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "version": "1.1.0" + }, "node_modules/mdast-util-definitions": { "dependencies": { "@types/mdast": "^3.0.0", @@ -32802,9 +31406,12 @@ "version": "0.4.15" }, "node_modules/merge-descriptors": { - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "version": "1.0.1" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + }, + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "version": "1.0.3" }, "node_modules/merge-stream": { "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", @@ -32832,13 +31439,13 @@ "metro": "src/cli.js" }, "dependencies": { - "@babel/code-frame": "^7.0.0", - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.0", - "@babel/parser": "^7.20.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.20.0", - "@babel/types": "^7.20.0", + "@babel/code-frame": "^7.24.7", + "@babel/core": "^7.25.2", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.3", + "@babel/types": "^7.25.2", "accepts": "^1.3.7", "chalk": "^4.0.0", "ci-info": "^2.0.0", @@ -32846,112 +31453,117 @@ "debug": "^2.2.0", "denodeify": "^1.2.1", "error-stack-parser": "^2.0.6", + "flow-enums-runtime": "^0.0.6", "graceful-fs": "^4.2.4", - "hermes-parser": "0.20.1", + "hermes-parser": "0.24.0", "image-size": "^1.0.2", "invariant": "^2.2.4", "jest-worker": "^29.6.3", "jsc-safe-url": "^0.2.2", "lodash.throttle": "^4.1.1", - "metro-babel-transformer": "0.80.9", - "metro-cache": "0.80.9", - "metro-cache-key": "0.80.9", - "metro-config": "0.80.9", - "metro-core": "0.80.9", - "metro-file-map": "0.80.9", - "metro-resolver": "0.80.9", - "metro-runtime": "0.80.9", - "metro-source-map": "0.80.9", - "metro-symbolicate": "0.80.9", - "metro-transform-plugins": "0.80.9", - "metro-transform-worker": "0.80.9", + "metro-babel-transformer": "0.81.0", + "metro-cache": "0.81.0", + "metro-cache-key": "0.81.0", + "metro-config": "0.81.0", + "metro-core": "0.81.0", + "metro-file-map": "0.81.0", + "metro-resolver": "0.81.0", + "metro-runtime": "0.81.0", + "metro-source-map": "0.81.0", + "metro-symbolicate": "0.81.0", + "metro-transform-plugins": "0.81.0", + "metro-transform-worker": "0.81.0", "mime-types": "^2.1.27", - "node-fetch": "^2.2.0", "nullthrows": "^1.1.1", - "rimraf": "^3.0.2", "serialize-error": "^2.1.0", "source-map": "^0.5.6", "strip-ansi": "^6.0.0", "throat": "^5.0.0", - "ws": "^7.5.1", + "ws": "^7.5.10", "yargs": "^17.6.2" }, "engines": { - "node": ">=18" + "node": ">=18.18" }, - "integrity": "sha512-Bc57Xf3GO2Xe4UWQsBj/oW6YfLPABEu8jfDVDiNmJvoQW4CO34oDPuYKe4KlXzXhcuNsqOtSxpbjCRRVjhhREg==", + "integrity": "sha512-kzdzmpL0gKhEthZ9aOV7sTqvg6NuTxDV8SIm9pf9sO8VVEbKrQk5DNcwupOUjgPPFAuKUc2NkT0suyT62hm2xg==", "peer": true, - "resolved": "https://registry.npmjs.org/metro/-/metro-0.80.9.tgz", - "version": "0.80.9" + "resolved": "https://registry.npmjs.org/metro/-/metro-0.81.0.tgz", + "version": "0.81.0" }, "node_modules/metro-babel-transformer": { "dependencies": { - "@babel/core": "^7.20.0", - "hermes-parser": "0.20.1", + "@babel/core": "^7.25.2", + "flow-enums-runtime": "^0.0.6", + "hermes-parser": "0.24.0", "nullthrows": "^1.1.1" }, "engines": { - "node": ">=18" + "node": ">=18.18" }, - "integrity": "sha512-d76BSm64KZam1nifRZlNJmtwIgAeZhZG3fi3K+EmPOlrR8rDtBxQHDSN3fSGeNB9CirdTyabTMQCkCup6BXFSQ==", + "integrity": "sha512-Dc0QWK4wZIeHnyZ3sevWGTnnSkIDDn/SWyfrn99zbKbDOCoCYy71PAn9uCRrP/hduKLJQOy+tebd63Rr9D8tXg==", "peer": true, - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.80.9.tgz", - "version": "0.80.9" + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.81.0.tgz", + "version": "0.81.0" }, "node_modules/metro-babel-transformer/node_modules/hermes-estree": { - "integrity": "sha512-SQpZK4BzR48kuOg0v4pb3EAGNclzIlqMj3Opu/mu7bbAoFw6oig6cEt/RAi0zTFW/iW6Iz9X9ggGuZTAZ/yZHg==", + "integrity": "sha512-LyoXLB7IFzeZW0EvAbGZacbxBN7t6KKSDqFJPo3Ydow7wDlrDjXwsdiAHV6XOdvEN9MEuWXsSIFN4tzpyrXIHw==", "peer": true, - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.20.1.tgz", - "version": "0.20.1" + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.24.0.tgz", + "version": "0.24.0" }, "node_modules/metro-babel-transformer/node_modules/hermes-parser": { "dependencies": { - "hermes-estree": "0.20.1" + "hermes-estree": "0.24.0" }, - "integrity": "sha512-BL5P83cwCogI8D7rrDCgsFY0tdYUtmFP9XaXtl2IQjC+2Xo+4okjfXintlTxcIwl4qeGddEl28Z11kbVIw0aNA==", + "integrity": "sha512-IJooSvvu2qNRe7oo9Rb04sUT4omtZqZqf9uq9WM25Tb6v3usmvA93UqfnnoWs5V0uYjEl9Al6MNU10MCGKLwpg==", "peer": true, - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.20.1.tgz", - "version": "0.20.1" + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.24.0.tgz", + "version": "0.24.0" }, "node_modules/metro-cache": { "dependencies": { - "metro-core": "0.80.9", - "rimraf": "^3.0.2" + "exponential-backoff": "^3.1.1", + "flow-enums-runtime": "^0.0.6", + "metro-core": "0.81.0" }, "engines": { - "node": ">=18" + "node": ">=18.18" }, - "integrity": "sha512-ujEdSI43QwI+Dj2xuNax8LMo8UgKuXJEdxJkzGPU6iIx42nYa1byQ+aADv/iPh5sh5a//h5FopraW5voXSgm2w==", + "integrity": "sha512-DyuqySicHXkHUDZFVJmh0ygxBSx6pCKUrTcSgb884oiscV/ROt1Vhye+x+OIHcsodyA10gzZtrVtxIFV4l9I4g==", "peer": true, - "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.80.9.tgz", - "version": "0.80.9" + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.81.0.tgz", + "version": "0.81.0" }, "node_modules/metro-cache-key": { + "dependencies": { + "flow-enums-runtime": "^0.0.6" + }, "engines": { - "node": ">=18" + "node": ">=18.18" }, - "integrity": "sha512-hRcYGhEiWIdM87hU0fBlcGr+tHDEAT+7LYNCW89p5JhErFt/QaAkVx4fb5bW3YtXGv5BTV7AspWPERoIb99CXg==", + "integrity": "sha512-qX/IwtknP9bQZL78OK9xeSvLM/xlGfrs6SlUGgHvrxtmGTRSsxcyqxR+c+7ch1xr05n62Gin/O44QKg5V70rNQ==", "peer": true, - "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.80.9.tgz", - "version": "0.80.9" + "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.81.0.tgz", + "version": "0.81.0" }, "node_modules/metro-config": { "dependencies": { "connect": "^3.6.5", "cosmiconfig": "^5.0.5", + "flow-enums-runtime": "^0.0.6", "jest-validate": "^29.6.3", - "metro": "0.80.9", - "metro-cache": "0.80.9", - "metro-core": "0.80.9", - "metro-runtime": "0.80.9" + "metro": "0.81.0", + "metro-cache": "0.81.0", + "metro-core": "0.81.0", + "metro-runtime": "0.81.0" }, "engines": { - "node": ">=18" + "node": ">=18.18" }, - "integrity": "sha512-28wW7CqS3eJrunRGnsibWldqgwRP9ywBEf7kg+uzUHkSFJNKPM1K3UNSngHmH0EZjomizqQA2Zi6/y6VdZMolg==", + "integrity": "sha512-6CinEaBe3WLpRlKlYXXu8r1UblJhbwD6Gtnoib5U8j6Pjp7XxMG9h/DGMeNp9aGLDu1OieUqiXpFo7O0/rR5Kg==", "peer": true, - "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.80.9.tgz", - "version": "0.80.9" + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.81.0.tgz", + "version": "0.81.0" }, "node_modules/metro-config/node_modules/argparse": { "dependencies": { @@ -33027,22 +31639,24 @@ }, "node_modules/metro-core": { "dependencies": { + "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", - "metro-resolver": "0.80.9" + "metro-resolver": "0.81.0" }, "engines": { - "node": ">=18" + "node": ">=18.18" }, - "integrity": "sha512-tbltWQn+XTdULkGdzHIxlxk4SdnKxttvQQV3wpqqFbHDteR4gwCyTR2RyYJvxgU7HELfHtrVbqgqAdlPByUSbg==", + "integrity": "sha512-CVkM5YCOAFkNMvJai6KzA0RpztzfEKRX62/PFMOJ9J7K0uq/UkOFLxcgpcncMIrfy0PbfEj811b69tjULUQe1Q==", "peer": true, - "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.80.9.tgz", - "version": "0.80.9" + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.81.0.tgz", + "version": "0.81.0" }, "node_modules/metro-file-map": { "dependencies": { "anymatch": "^3.0.3", "debug": "^2.2.0", "fb-watchman": "^2.0.0", + "flow-enums-runtime": "^0.0.6", "graceful-fs": "^4.2.4", "invariant": "^2.2.4", "jest-worker": "^29.6.3", @@ -33052,15 +31666,15 @@ "walker": "^1.0.7" }, "engines": { - "node": ">=18" + "node": ">=18.18" }, - "integrity": "sha512-sBUjVtQMHagItJH/wGU9sn3k2u0nrCl0CdR4SFMO1tksXLKbkigyQx4cbpcyPVOAmGTVuy3jyvBlELaGCAhplQ==", + "integrity": "sha512-zMDI5uYhQCyxbye/AuFx/pAbsz9K+vKL7h1ShUXdN2fz4VUPiyQYRsRqOoVG1DsiCgzd5B6LW0YW77NFpjDQeg==", "optionalDependencies": { "fsevents": "^2.3.2" }, "peer": true, - "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.80.9.tgz", - "version": "0.80.9" + "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.81.0.tgz", + "version": "0.81.0" }, "node_modules/metro-file-map/node_modules/debug": { "dependencies": { @@ -33079,114 +31693,124 @@ }, "node_modules/metro-minify-terser": { "dependencies": { + "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" }, "engines": { - "node": ">=18" + "node": ">=18.18" }, - "integrity": "sha512-FEeCeFbkvvPuhjixZ1FYrXtO0araTpV6UbcnGgDUpH7s7eR5FG/PiJz3TsuuPP/HwCK19cZtQydcA2QrCw446A==", + "integrity": "sha512-U2ramh3W822ZR1nfXgIk+emxsf5eZSg10GbQrT0ZizImK8IZ5BmJY+BHRIkQgHzWFpExOVxC7kWbGL1bZALswA==", "peer": true, - "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.80.9.tgz", - "version": "0.80.9" + "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.81.0.tgz", + "version": "0.81.0" }, "node_modules/metro-resolver": { + "dependencies": { + "flow-enums-runtime": "^0.0.6" + }, "engines": { - "node": ">=18" + "node": ">=18.18" }, - "integrity": "sha512-wAPIjkN59BQN6gocVsAvvpZ1+LQkkqUaswlT++cJafE/e54GoVkMNCmrR4BsgQHr9DknZ5Um/nKueeN7kaEz9w==", + "integrity": "sha512-Uu2Q+buHhm571cEwpPek8egMbdSTqmwT/5U7ZVNpK6Z2ElQBBCxd7HmFAslKXa7wgpTO2FAn6MqGeERbAtVDUA==", "peer": true, - "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.80.9.tgz", - "version": "0.80.9" + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.81.0.tgz", + "version": "0.81.0" }, "node_modules/metro-runtime": { "dependencies": { - "@babel/runtime": "^7.0.0" + "@babel/runtime": "^7.25.0", + "flow-enums-runtime": "^0.0.6" }, "engines": { - "node": ">=18" + "node": ">=18.18" }, - "integrity": "sha512-8PTVIgrVcyU+X/rVCy/9yxNlvXsBCk5JwwkbAm/Dm+Abo6NBGtNjWF0M1Xo/NWCb4phamNWcD7cHdR91HhbJvg==", + "integrity": "sha512-6oYB5HOt37RuGz2eV4A6yhcl+PUTwJYLDlY9vhT+aVjbUWI6MdBCf69vc4f5K5Vpt+yOkjy+2LDwLS0ykWFwYw==", "peer": true, - "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.80.9.tgz", - "version": "0.80.9" + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.81.0.tgz", + "version": "0.81.0" }, "node_modules/metro-source-map": { "dependencies": { - "@babel/traverse": "^7.20.0", - "@babel/types": "^7.20.0", + "@babel/traverse": "^7.25.3", + "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", + "@babel/types": "^7.25.2", + "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", - "metro-symbolicate": "0.80.9", + "metro-symbolicate": "0.81.0", "nullthrows": "^1.1.1", - "ob1": "0.80.9", + "ob1": "0.81.0", "source-map": "^0.5.6", "vlq": "^1.0.0" }, "engines": { - "node": ">=18" + "node": ">=18.18" }, - "integrity": "sha512-RMn+XS4VTJIwMPOUSj61xlxgBvPeY4G6s5uIn6kt6HB6A/k9ekhr65UkkDD7WzHYs3a9o869qU8tvOZvqeQzgw==", + "integrity": "sha512-TzsVxhH83dyxg4A4+L1nzNO12I7ps5IHLjKGZH3Hrf549eiZivkdjYiq/S5lOB+p2HiQ+Ykcwtmcja95LIC62g==", "peer": true, - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.80.9.tgz", - "version": "0.80.9" + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.81.0.tgz", + "version": "0.81.0" }, "node_modules/metro-symbolicate": { "bin": { "metro-symbolicate": "src/index.js" }, "dependencies": { + "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", - "metro-source-map": "0.80.9", + "metro-source-map": "0.81.0", "nullthrows": "^1.1.1", "source-map": "^0.5.6", "through2": "^2.0.1", "vlq": "^1.0.0" }, "engines": { - "node": ">=18" + "node": ">=18.18" }, - "integrity": "sha512-Ykae12rdqSs98hg41RKEToojuIW85wNdmSe/eHUgMkzbvCFNVgcC0w3dKZEhSsqQOXapXRlLtHkaHLil0UD/EA==", + "integrity": "sha512-C/1rWbNTPYp6yzID8IPuQPpVGzJ2rbWYBATxlvQ9dfK5lVNoxcwz77hjcY8ISLsRRR15hyd/zbjCNKPKeNgE1Q==", "peer": true, - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.80.9.tgz", - "version": "0.80.9" + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.81.0.tgz", + "version": "0.81.0" }, "node_modules/metro-transform-plugins": { "dependencies": { - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.20.0", + "@babel/core": "^7.25.2", + "@babel/generator": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.3", + "flow-enums-runtime": "^0.0.6", "nullthrows": "^1.1.1" }, "engines": { - "node": ">=18" + "node": ">=18.18" }, - "integrity": "sha512-UlDk/uc8UdfLNJhPbF3tvwajyuuygBcyp+yBuS/q0z3QSuN/EbLllY3rK8OTD9n4h00qZ/qgxGv/lMFJkwP4vg==", + "integrity": "sha512-uErLAPBvttGCrmGSCa0dNHlOTk3uJFVEVWa5WDg6tQ79PRmuYRwzUgLhVzn/9/kyr75eUX3QWXN79Jvu4txt6Q==", "peer": true, - "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.80.9.tgz", - "version": "0.80.9" + "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.81.0.tgz", + "version": "0.81.0" }, "node_modules/metro-transform-worker": { "dependencies": { - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.0", - "@babel/parser": "^7.20.0", - "@babel/types": "^7.20.0", - "metro": "0.80.9", - "metro-babel-transformer": "0.80.9", - "metro-cache": "0.80.9", - "metro-cache-key": "0.80.9", - "metro-minify-terser": "0.80.9", - "metro-source-map": "0.80.9", - "metro-transform-plugins": "0.80.9", + "@babel/core": "^7.25.2", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/types": "^7.25.2", + "flow-enums-runtime": "^0.0.6", + "metro": "0.81.0", + "metro-babel-transformer": "0.81.0", + "metro-cache": "0.81.0", + "metro-cache-key": "0.81.0", + "metro-minify-terser": "0.81.0", + "metro-source-map": "0.81.0", + "metro-transform-plugins": "0.81.0", "nullthrows": "^1.1.1" }, "engines": { - "node": ">=18" + "node": ">=18.18" }, - "integrity": "sha512-c/IrzMUVnI0hSVVit4TXzt3A1GiUltGVlzCmLJWxNrBGHGrJhvgePj38+GXl1Xf4Fd4vx6qLUkKMQ3ux73bFLQ==", + "integrity": "sha512-HrQ0twiruhKy0yA+9nK5bIe3WQXZcC66PXTvRIos61/EASLAP2DzEmW7IxN/MGsfZegN2UzqL2CG38+mOB45vg==", "peer": true, - "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.80.9.tgz", - "version": "0.80.9" + "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.81.0.tgz", + "version": "0.81.0" }, "node_modules/metro/node_modules/ansi-styles": { "dependencies": { @@ -33262,19 +31886,19 @@ "version": "4.0.0" }, "node_modules/metro/node_modules/hermes-estree": { - "integrity": "sha512-SQpZK4BzR48kuOg0v4pb3EAGNclzIlqMj3Opu/mu7bbAoFw6oig6cEt/RAi0zTFW/iW6Iz9X9ggGuZTAZ/yZHg==", + "integrity": "sha512-LyoXLB7IFzeZW0EvAbGZacbxBN7t6KKSDqFJPo3Ydow7wDlrDjXwsdiAHV6XOdvEN9MEuWXsSIFN4tzpyrXIHw==", "peer": true, - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.20.1.tgz", - "version": "0.20.1" + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.24.0.tgz", + "version": "0.24.0" }, "node_modules/metro/node_modules/hermes-parser": { "dependencies": { - "hermes-estree": "0.20.1" + "hermes-estree": "0.24.0" }, - "integrity": "sha512-BL5P83cwCogI8D7rrDCgsFY0tdYUtmFP9XaXtl2IQjC+2Xo+4okjfXintlTxcIwl4qeGddEl28Z11kbVIw0aNA==", + "integrity": "sha512-IJooSvvu2qNRe7oo9Rb04sUT4omtZqZqf9uq9WM25Tb6v3usmvA93UqfnnoWs5V0uYjEl9Al6MNU10MCGKLwpg==", "peer": true, - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.20.1.tgz", - "version": "0.20.1" + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.24.0.tgz", + "version": "0.24.0" }, "node_modules/metro/node_modules/ms": { "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", @@ -33738,20 +32362,21 @@ }, "node_modules/micromatch": { "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" }, - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "version": "4.0.5" + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "version": "4.0.8" }, "node_modules/mime": { "bin": { "mime": "cli.js" }, + "dev": true, "engines": { "node": ">=4.0.0" }, @@ -33912,9 +32537,9 @@ "version": "1.2.0" }, "node_modules/ms": { - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "version": "2.1.2" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "version": "2.1.3" }, "node_modules/multicast-dns": { "bin": { @@ -33946,10 +32571,10 @@ }, "node_modules/nanoid": { "bin": { - "nanoid": "bin/nanoid.cjs" + "nanoid": "bin/nanoid.js" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": "^18 || >=20" }, "funding": [ { @@ -33957,9 +32582,9 @@ "url": "https://github.com/sponsors/ai" } ], - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "version": "3.3.6" + "integrity": "sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.9.tgz", + "version": "5.0.9" }, "node_modules/native-promise-only": { "dev": true, @@ -34036,15 +32661,6 @@ "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", "version": "3.0.4" }, - "node_modules/nocache": { - "engines": { - "node": ">=12.0.0" - }, - "integrity": "sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==", - "peer": true, - "resolved": "https://registry.npmjs.org/nocache/-/nocache-3.0.4.tgz", - "version": "3.0.4" - }, "node_modules/node-abort-controller": { "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", "peer": true, @@ -34095,22 +32711,9 @@ "version": "0.4.0" }, "node_modules/node-releases": { - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "version": "2.0.13" - }, - "node_modules/node-stream-zip": { - "engines": { - "node": ">=0.12.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/antelle" - }, - "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==", - "peer": true, - "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz", - "version": "1.15.0" + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "version": "2.0.19" }, "node_modules/normalize-path": { "engines": { @@ -34192,13 +32795,16 @@ "version": "2.2.7" }, "node_modules/ob1": { + "dependencies": { + "flow-enums-runtime": "^0.0.6" + }, "engines": { - "node": ">=18" + "node": ">=18.18" }, - "integrity": "sha512-v9yOxowkZbxWhKOaaTyLjIm1aLy4ebMNcSn4NYJKOAI/Qv+SkfEfszpLr2GIxsccmb2Y2HA9qtsqiIJ80ucpVA==", + "integrity": "sha512-6Cvrkxt1tqaRdWqTAMcVYEiO5i1xcF9y7t06nFdjFqkfPsEloCf8WwhXdwBpNUkVYSQlSGS7cDgVQR86miBfBQ==", "peer": true, - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.80.9.tgz", - "version": "0.80.9" + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.81.0.tgz", + "version": "0.81.0" }, "node_modules/object-assign": { "engines": { @@ -34217,12 +32823,15 @@ "version": "3.0.0" }, "node_modules/object-inspect": { + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" }, - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "version": "1.12.3" + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "version": "1.13.3" }, "node_modules/object-is": { "dependencies": { @@ -34381,24 +32990,18 @@ }, "node_modules/open": { "dependencies": { - "is-wsl": "^1.1.0" + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" }, "engines": { "node": ">=8" }, - "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", - "peer": true, - "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", - "version": "6.4.0" - }, - "node_modules/open/node_modules/is-wsl": { - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" }, - "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", - "peer": true, - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "version": "1.1.0" + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "version": "7.4.2" }, "node_modules/optionator": { "dependencies": { @@ -34428,6 +33031,7 @@ "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" }, + "dev": true, "engines": { "node": ">=10" }, @@ -34442,6 +33046,7 @@ "dependencies": { "color-convert": "^2.0.1" }, + "dev": true, "engines": { "node": ">=8" }, @@ -34457,6 +33062,7 @@ "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, + "dev": true, "engines": { "node": ">=10" }, @@ -34471,6 +33077,7 @@ "dependencies": { "color-name": "~1.1.4" }, + "dev": true, "engines": { "node": ">=7.0.0" }, @@ -34479,11 +33086,13 @@ "version": "2.0.1" }, "node_modules/ora/node_modules/color-name": { + "dev": true, "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "version": "1.1.4" }, "node_modules/ora/node_modules/has-flag": { + "dev": true, "engines": { "node": ">=8" }, @@ -34495,6 +33104,7 @@ "dependencies": { "has-flag": "^4.0.0" }, + "dev": true, "engines": { "node": ">=8" }, @@ -34792,17 +33402,12 @@ "version": "1.0.7" }, "node_modules/path-to-regexp": { - "dependencies": { - "isarray": "0.0.1" + "engines": { + "node": ">=16" }, - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "version": "1.8.0" - }, - "node_modules/path-to-regexp/node_modules/isarray": { - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "version": "0.0.1" + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "version": "8.2.0" }, "node_modules/path-type": { "engines": { @@ -34843,9 +33448,9 @@ "version": "2.1.0" }, "node_modules/picocolors": { - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "version": "1.0.0" + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "version": "1.1.1" }, "node_modules/picomatch": { "engines": { @@ -36149,6 +34754,23 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "version": "4.2.0" }, + "node_modules/postcss/node_modules/nanoid": { + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "version": "3.3.8" + }, "node_modules/prelude-ls": { "engines": { "node": ">= 0.8.0" @@ -36603,7 +35225,7 @@ }, "node_modules/qs": { "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -36611,9 +35233,9 @@ "funding": { "url": "https://github.com/sponsors/ljharb" }, - "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", - "version": "6.11.2" + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "version": "6.13.0" }, "node_modules/query-string": { "dependencies": { @@ -36952,10 +35574,10 @@ "shell-quote": "^1.6.1", "ws": "^7" }, - "integrity": "sha512-7FSb9meX0btdBQLwdFOwt6bGqvRPabmVMMslv8fgoSPqXyuGpgQe36kx8gR86XPw7aV1yVouTp6fyZ0EH+NfUw==", + "integrity": "sha512-crr9HkVrDiJ0A4zot89oS0Cgv0Oa4OG1Em4jit3P3ZxZSKPMYyMjfwMqgcJna9o625g8oN87rBm8SWWrSTBZxg==", "peer": true, - "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-5.3.1.tgz", - "version": "5.3.1" + "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-5.3.2.tgz", + "version": "5.3.2" }, "node_modules/react-devtools-core/node_modules/ws": { "engines": { @@ -37101,59 +35723,60 @@ }, "dependencies": { "@jest/create-cache-key-function": "^29.6.3", - "@react-native-community/cli": "13.6.9", - "@react-native-community/cli-platform-android": "13.6.9", - "@react-native-community/cli-platform-ios": "13.6.9", - "@react-native/assets-registry": "0.74.85", - "@react-native/codegen": "0.74.85", - "@react-native/community-cli-plugin": "0.74.85", - "@react-native/gradle-plugin": "0.74.85", - "@react-native/js-polyfills": "0.74.85", - "@react-native/normalize-colors": "0.74.85", - "@react-native/virtualized-lists": "0.74.85", + "@react-native/assets-registry": "0.76.6", + "@react-native/codegen": "0.76.6", + "@react-native/community-cli-plugin": "0.76.6", + "@react-native/gradle-plugin": "0.76.6", + "@react-native/js-polyfills": "0.76.6", + "@react-native/normalize-colors": "0.76.6", + "@react-native/virtualized-lists": "0.76.6", "abort-controller": "^3.0.0", "anser": "^1.4.9", "ansi-regex": "^5.0.0", + "babel-jest": "^29.7.0", + "babel-plugin-syntax-hermes-parser": "^0.23.1", "base64-js": "^1.5.1", "chalk": "^4.0.0", + "commander": "^12.0.0", "event-target-shim": "^5.0.1", "flow-enums-runtime": "^0.0.6", + "glob": "^7.1.1", "invariant": "^2.2.4", "jest-environment-node": "^29.6.3", "jsc-android": "^250231.0.0", "memoize-one": "^5.0.0", - "metro-runtime": "^0.80.3", - "metro-source-map": "^0.80.3", + "metro-runtime": "^0.81.0", + "metro-source-map": "^0.81.0", "mkdirp": "^0.5.1", "nullthrows": "^1.1.1", - "pretty-format": "^26.5.2", + "pretty-format": "^29.7.0", "promise": "^8.3.0", - "react-devtools-core": "^5.0.0", + "react-devtools-core": "^5.3.1", "react-refresh": "^0.14.0", - "react-shallow-renderer": "^16.15.0", "regenerator-runtime": "^0.13.2", "scheduler": "0.24.0-canary-efb381bbf-20230505", + "semver": "^7.1.3", "stacktrace-parser": "^0.1.10", "whatwg-fetch": "^3.0.0", - "ws": "^6.2.2", + "ws": "^6.2.3", "yargs": "^17.6.2" }, "engines": { "node": ">=18" }, - "integrity": "sha512-UFutCC6WEw6HkxlcpQ2BemKqi0JkwrgDchYB5Svi8Sp4Xwt4HA6LGEjNQgZ+3KM44bjyFRpofQym0uh0jACGng==", + "integrity": "sha512-AsRi+ud6v6ADH7ZtSOY42kRB4nbM0KtSu450pGO4pDudl4AEK/AF96ai88snb2/VJJSGGa/49QyJVFXxz/qoFg==", "peer": true, "peerDependencies": { "@types/react": "^18.2.6", - "react": "18.2.0" + "react": "^18.2.0" }, "peerDependenciesMeta": { "@types/react": { "optional": true } }, - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.74.3.tgz", - "version": "0.74.3" + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.76.6.tgz", + "version": "0.76.6" }, "node_modules/react-native-get-random-values": { "dependencies": { @@ -37177,31 +35800,6 @@ "resolved": "https://registry.npmjs.org/react-native-url-polyfill/-/react-native-url-polyfill-1.3.0.tgz", "version": "1.3.0" }, - "node_modules/react-native/node_modules/@jest/types": { - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": ">= 10.14.2" - }, - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "version": "26.6.2" - }, - "node_modules/react-native/node_modules/@types/yargs": { - "dependencies": { - "@types/yargs-parser": "*" - }, - "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", - "peer": true, - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", - "version": "15.0.19" - }, "node_modules/react-native/node_modules/ansi-styles": { "dependencies": { "color-convert": "^2.0.1" @@ -37262,24 +35860,29 @@ }, "node_modules/react-native/node_modules/pretty-format": { "dependencies": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, "engines": { - "node": ">= 10" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "peer": true, - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "version": "26.6.2" + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "version": "29.7.0" }, - "node_modules/react-native/node_modules/react-is": { - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "node_modules/react-native/node_modules/pretty-format/node_modules/ansi-styles": { + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + }, + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "peer": true, - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "version": "17.0.2" + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "version": "5.2.0" }, "node_modules/react-native/node_modules/regenerator-runtime": { "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", @@ -37416,6 +36019,19 @@ "resolved": "https://registry.npmjs.org/react-router-hash-link/-/react-router-hash-link-2.4.3.tgz", "version": "2.4.3" }, + "node_modules/react-router/node_modules/isarray": { + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "version": "0.0.1" + }, + "node_modules/react-router/node_modules/path-to-regexp": { + "dependencies": { + "isarray": "0.0.1" + }, + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "version": "1.9.0" + }, "node_modules/react-router/node_modules/react-is": { "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -38935,19 +37551,6 @@ "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", "version": "6.0.0" }, - "node_modules/react-shallow-renderer": { - "dependencies": { - "object-assign": "^4.1.1", - "react-is": "^16.12.0 || ^17.0.0 || ^18.0.0" - }, - "integrity": "sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==", - "peer": true, - "peerDependencies": { - "react": "^16.0.0 || ^17.0.0 || ^18.0.0" - }, - "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz", - "version": "16.15.0" - }, "node_modules/react-simple-maps": { "dependencies": { "d3-geo": "^2.0.2", @@ -39245,9 +37848,9 @@ "engines": { "node": ">=4" }, - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "version": "10.1.0" + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "version": "10.2.0" }, "node_modules/regenerator-runtime": { "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", @@ -39285,38 +37888,46 @@ }, "node_modules/regexpu-core": { "dependencies": { - "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" }, "engines": { "node": ">=4" }, - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "version": "5.3.2" + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "version": "6.2.0" + }, + "node_modules/regjsgen": { + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "version": "0.8.0" }, "node_modules/regjsparser": { "bin": { "regjsparser": "bin/parser" }, "dependencies": { - "jsesc": "~0.5.0" + "jsesc": "~3.0.2" }, - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "version": "0.9.1" + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "version": "0.12.0" }, "node_modules/regjsparser/node_modules/jsesc": { "bin": { "jsesc": "bin/jsesc" }, - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "version": "0.5.0" + "engines": { + "node": ">=6" + }, + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "version": "3.0.2" }, "node_modules/relateurl": { "engines": { @@ -39507,6 +38118,7 @@ "onetime": "^5.1.0", "signal-exit": "^3.0.2" }, + "dev": true, "engines": { "node": ">=8" }, @@ -39561,12 +38173,12 @@ "engines": { "node": ">=10.0.0" }, - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", "optionalDependencies": { "fsevents": "~2.3.2" }, - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "version": "2.79.1" + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "version": "2.79.2" }, "node_modules/rollup-plugin-terser": { "dependencies": { @@ -39577,18 +38189,18 @@ "engines": { "node": ">=14.0.0" }, - "integrity": "sha512-EF0oejTMtkyhrkwCdg0HJ0IpkcaVg1MMSf2olHb2Jp+1mnLM04OhjpJWGma4HobiDTF0WCyViWuvadyE9ch2XA==", + "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", "name": "@rollup/plugin-terser", "peerDependencies": { - "rollup": "^2.x || ^3.x" + "rollup": "^2.0.0||^3.0.0||^4.0.0" }, "peerDependenciesMeta": { "rollup": { "optional": true } }, - "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.3.tgz", - "version": "0.4.3" + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", + "version": "0.4.4" }, "node_modules/run-async": { "dev": true, @@ -39801,15 +38413,15 @@ "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "version": "4.2.0" + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "version": "4.3.0" }, "node_modules/seek-bzip": { "bin": { @@ -39896,9 +38508,9 @@ "engines": { "node": ">= 0.8.0" }, - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "version": "0.18.0" + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "version": "0.19.0" }, "node_modules/send/node_modules/debug": { "dependencies": { @@ -39924,11 +38536,6 @@ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "version": "1.6.0" }, - "node_modules/send/node_modules/ms": { - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "version": "2.1.3" - }, "node_modules/send/node_modules/on-finished": { "dependencies": { "ee-first": "1.1.1" @@ -39971,9 +38578,9 @@ "dependencies": { "randombytes": "^2.1.0" }, - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "version": "6.0.1" + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "version": "6.0.2" }, "node_modules/serve-index": { "dependencies": { @@ -40039,17 +38646,25 @@ }, "node_modules/serve-static": { "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" }, - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "version": "1.15.0" + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "version": "1.16.2" + }, + "node_modules/serve-static/node_modules/encodeurl": { + "engines": { + "node": ">= 0.8" + }, + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "version": "2.0.0" }, "node_modules/serverless": { "bin": { @@ -40561,16 +39176,71 @@ }, "node_modules/side-channel": { "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + }, + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "version": "1.1.0" + }, + "node_modules/side-channel-list": { + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" }, - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "version": "1.0.4" + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "version": "1.0.0" + }, + "node_modules/side-channel-map": { + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + }, + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "version": "1.0.1" + }, + "node_modules/side-channel-weakmap": { + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + }, + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "version": "1.0.2" }, "node_modules/signal-exit": { "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", @@ -40605,20 +39275,6 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "version": "3.0.0" }, - "node_modules/slice-ansi": { - "dependencies": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "version": "2.1.0" - }, "node_modules/smart-buffer": { "dev": true, "engines": { @@ -40630,9 +39286,9 @@ "version": "4.2.0" }, "node_modules/smob": { - "integrity": "sha512-MqR3fVulhjWuRNSMydnTlweu38UhQ0HXM4buStD/S3mc/BzX3CuM9OmhyQpmtYCvoYdl5ris6TI0ZqH355Ymqg==", - "resolved": "https://registry.npmjs.org/smob/-/smob-1.4.0.tgz", - "version": "1.4.0" + "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", + "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", + "version": "1.5.0" }, "node_modules/snake-case": { "dependencies": { @@ -41437,12 +40093,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "version": "7.1.6" }, - "node_modules/sudo-prompt": { - "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==", - "peer": true, - "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", - "version": "9.2.1" - }, "node_modules/superagent": { "dependencies": { "component-emitter": "^1.3.0", @@ -41484,6 +40134,7 @@ "dependencies": { "has-flag": "^3.0.0" }, + "dev": true, "engines": { "node": ">=4" }, @@ -41891,17 +40542,17 @@ "engines": { "node": ">=10" }, - "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", - "version": "5.19.2" + "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", + "version": "5.37.0" }, "node_modules/terser-webpack-plugin": { "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" }, "engines": { "node": ">= 10.13.0" @@ -41910,7 +40561,7 @@ "type": "opencollective", "url": "https://opencollective.com/webpack" }, - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==", "peerDependencies": { "webpack": "^5.1.0" }, @@ -41925,31 +40576,8 @@ "optional": true } }, - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "version": "5.3.9" - }, - "node_modules/terser-webpack-plugin/node_modules/ajv": { - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - }, - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "version": "6.12.6" - }, - "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - }, - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "version": "3.5.2" + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz", + "version": "5.3.11" }, "node_modules/terser-webpack-plugin/node_modules/has-flag": { "engines": { @@ -41972,28 +40600,6 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "version": "27.5.1" }, - "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "version": "0.4.1" - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "version": "3.3.0" - }, "node_modules/terser-webpack-plugin/node_modules/supports-color": { "dependencies": { "has-flag": "^4.0.0" @@ -42179,14 +40785,6 @@ "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", "version": "1.1.1" }, - "node_modules/to-fast-properties": { - "engines": { - "node": ">=4" - }, - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "version": "2.0.0" - }, "node_modules/to-regex-range": { "dependencies": { "is-number": "^7.0.0" @@ -42675,12 +41273,6 @@ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "version": "5.7.1" }, - "node_modules/undici-types": { - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "peer": true, - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "version": "5.26.5" - }, "node_modules/unfetch": { "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==", "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", @@ -42699,9 +41291,9 @@ "engines": { "node": ">=4" }, - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "version": "2.0.0" + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "version": "2.0.1" }, "node_modules/unicode-match-property-ecmascript": { "dependencies": { @@ -42719,9 +41311,9 @@ "engines": { "node": ">=4" }, - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "version": "2.1.0" + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "version": "2.2.0" }, "node_modules/unicode-property-aliases-ecmascript": { "engines": { @@ -42834,22 +41426,23 @@ }, "node_modules/universal-cookie": { "dependencies": { - "@types/cookie": "^0.3.3", - "cookie": "^0.4.0" + "@types/cookie": "^0.6.0", + "cookie": "^0.7.2" }, - "integrity": "sha512-lbRVHoOMtItjWbM7TwDLdl8wug7izB0tq3/YVKhT/ahB4VDvWMyvnADfnJI8y6fSvsjh51Ix7lTGC6Tn4rMPhw==", - "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-4.0.4.tgz", - "version": "4.0.4" + "integrity": "sha512-fMiOcS3TmzP2x5QV26pIH3mvhexLIT0HmPa3V7Q7knRfT9HG6kTwq02HZGLPw0sAOXrAmotElGRvTLCMbJsvxQ==", + "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-7.2.2.tgz", + "version": "7.2.2" }, "node_modules/universal-cookie/node_modules/cookie": { "engines": { "node": ">= 0.6" }, - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "version": "0.4.2" + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "version": "0.7.2" }, "node_modules/universalify": { + "dev": true, "engines": { "node": ">= 4.0.0" }, @@ -42888,8 +41481,8 @@ "update-browserslist-db": "cli.js" }, "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, "funding": [ { @@ -42905,12 +41498,12 @@ "url": "https://github.com/sponsors/ai" } ], - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", "peerDependencies": { "browserslist": ">= 4.21.0" }, - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "version": "1.0.11" + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", + "version": "1.1.2" }, "node_modules/upper-case": { "dependencies": { @@ -43227,9 +41820,9 @@ "engines": { "node": ">=10.13.0" }, - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "version": "2.4.0" + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "version": "2.4.2" }, "node_modules/wbuf": { "dependencies": { @@ -43243,6 +41836,7 @@ "dependencies": { "defaults": "^1.0.3" }, + "dev": true, "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "version": "1.0.1" @@ -43262,29 +41856,28 @@ "webpack": "bin/webpack.js" }, "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "engines": { @@ -43294,14 +41887,14 @@ "type": "opencollective", "url": "https://opencollective.com/webpack" }, - "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", "peerDependenciesMeta": { "webpack-cli": { "optional": true } }, - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", - "version": "5.88.2" + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", + "version": "5.97.1" }, "node_modules/webpack-cli": { "bin": { @@ -43453,6 +42046,40 @@ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", "version": "2.0.20" }, + "node_modules/webpack-dev-server/node_modules/http-proxy-middleware": { + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + }, + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", + "version": "2.0.7" + }, + "node_modules/webpack-dev-server/node_modules/is-plain-obj": { + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + }, + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "version": "3.0.0" + }, "node_modules/webpack-dev-server/node_modules/open": { "dependencies": { "define-lazy-prop": "^2.0.0", @@ -44160,7 +42787,6 @@ "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" }, - "dev": true, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" }, diff --git a/frontend/package.json b/frontend/package.json index 5bc8f4fa6..280a1fefb 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -30,19 +30,25 @@ "@trussworks/react-uswds": "^5.1.1", "autoprefixer": "^10.4.13", "aws-amplify": "^5.3.12", - "axios": "^1.6.2", + "axios": "^1.7.9", "classnames": "^2.3.2", + "cookie": "^1.0.2", "cors": "^2.8.5", + "cross-spawn": "^7.0.6", "d3-scale": "^4.0.2", "date-fns": "^3.6.0", "date-fns-tz": "^3.1.3", "decamelize": "^6.0.0", - "dompurify": "^3.0.5", + "dompurify": "^2.5.8", "express-rate-limit": "^7.1.3", + "fast-xml-parser": "^4.5.1", "file-saver": "^2.0.5", + "http-proxy-middleware": "^3.0.3", "jspdf": "^2.5.1", "jwt-decode": "^3.1.2", + "nanoid": "^5.0.9", "papaparse": "^5.3.2", + "path-to-regexp": "^8.2.0", "postcss": "^8.4.18", "query-string": "^7.1.1", "react": "^18.2.0", @@ -60,7 +66,8 @@ "react-table": "^7.8.0", "react-to-print": "^2.15.1", "resolve-url-loader": "^5.0.0", - "universal-cookie": "^4.0.4", + "rollup": "^2.79.2", + "universal-cookie": "^7.2.2", "uswds": "^2.13.3", "web-vitals": "^2.1.4" }, @@ -91,7 +98,7 @@ "eslint-config-react-app": "^7.0.1", "eslint-plugin-prettier": "^5.1.2", "eslint-plugin-react": "^7.31.10", - "express": "^4.18.2", + "express": "^4.21.2", "helmet": "^7.0.0", "jest-date-mock": "^1.0.8", "prettier": "^3.0.3", @@ -105,7 +112,7 @@ "serverless-webpack": "^5.11.0", "ts-jest": "^29.1.1", "typescript": "^4.8.4", - "webpack": "^5.88", + "webpack": "^5.97.1", "webpack-cli": "^5.1" }, "engines": { diff --git a/frontend/public/index.html b/frontend/public/index.html index fa2a5d118..d5ffb026e 100644 --- a/frontend/public/index.html +++ b/frontend/public/index.html @@ -7,6 +7,25 @@ CyHy Dashboard + + +
diff --git a/frontend/serverless.yml b/frontend/serverless.yml index 6c7cb815c..f5a4beff6 100644 --- a/frontend/serverless.yml +++ b/frontend/serverless.yml @@ -40,7 +40,9 @@ custom: Condition: IpAddress: aws:SourceIp: - - ${file(env.yml):${self:provider.stage}.DMZ_CIDR, ''} + 'Fn::Split': + - ',' + - ${file(env.yml):${self:provider.stage}.DMZ_CIDR, ''} # Conditional logic for GovCloud vs # non-GovCloud (Private endpoints require a VPC Endpoint) diff --git a/frontend/src/components/Register/UpdateUserStateForm.tsx b/frontend/src/components/Register/UpdateUserStateForm.tsx index 23444a589..e1e0cd3e2 100644 --- a/frontend/src/components/Register/UpdateUserStateForm.tsx +++ b/frontend/src/components/Register/UpdateUserStateForm.tsx @@ -33,7 +33,7 @@ export const UpdateStateForm: React.FC<{ const [values, setValues] = useState(defaultValues); const [errorRequestMessage, setErrorRequestMessage] = useState(''); const [isLoading, setIsLoading] = useState(false); - const { apiPut } = useAuthContext(); + const { apiPut, user } = useAuthContext(); const handleChange = (event: SelectChangeEvent) => { setValues((values: any) => ({ @@ -63,7 +63,16 @@ export const UpdateStateForm: React.FC<{ }; return ( - + { + if (reason !== 'backdropClick' && reason !== 'escapeKeyDown') { + onClose(); + } + }} + maxWidth="xs" + fullWidth + > Update State Information {errorRequestMessage && ( @@ -92,7 +101,11 @@ export const UpdateStateForm: React.FC<{ -