From d9bae37cccb3c1b93c4bcae2f84120400812a89e Mon Sep 17 00:00:00 2001 From: nsxshota Date: Mon, 20 Nov 2023 17:44:07 +0900 Subject: [PATCH 001/203] add cdk scripts --- deploy/scripts/cdk/.gitignore | 9 + deploy/scripts/cdk/.npmignore | 6 + deploy/scripts/cdk/README.md | 14 + deploy/scripts/cdk/bin/cdk.ts | 21 + deploy/scripts/cdk/cdk.json | 55 + deploy/scripts/cdk/delete-ecr.sh | 4 + deploy/scripts/cdk/jest.config.js | 8 + deploy/scripts/cdk/lib/cdk-stack.ts | 55 + deploy/scripts/cdk/lib/construct/backend.ts | 110 + deploy/scripts/cdk/lib/construct/db.ts | 64 + deploy/scripts/cdk/lib/construct/ecr.ts | 76 + deploy/scripts/cdk/lib/construct/frontend.ts | 109 + deploy/scripts/cdk/lib/construct/index.ts | 5 + deploy/scripts/cdk/lib/construct/network.ts | 180 + deploy/scripts/cdk/package-lock.json | 4601 ++++++++++++++++++ deploy/scripts/cdk/package.json | 28 + deploy/scripts/cdk/test/cdk.test.ts | 17 + 17 files changed, 5362 insertions(+) create mode 100644 deploy/scripts/cdk/.gitignore create mode 100644 deploy/scripts/cdk/.npmignore create mode 100644 deploy/scripts/cdk/README.md create mode 100644 deploy/scripts/cdk/bin/cdk.ts create mode 100644 deploy/scripts/cdk/cdk.json create mode 100644 deploy/scripts/cdk/delete-ecr.sh create mode 100644 deploy/scripts/cdk/jest.config.js create mode 100644 deploy/scripts/cdk/lib/cdk-stack.ts create mode 100644 deploy/scripts/cdk/lib/construct/backend.ts create mode 100644 deploy/scripts/cdk/lib/construct/db.ts create mode 100644 deploy/scripts/cdk/lib/construct/ecr.ts create mode 100644 deploy/scripts/cdk/lib/construct/frontend.ts create mode 100644 deploy/scripts/cdk/lib/construct/index.ts create mode 100644 deploy/scripts/cdk/lib/construct/network.ts create mode 100644 deploy/scripts/cdk/package-lock.json create mode 100644 deploy/scripts/cdk/package.json create mode 100644 deploy/scripts/cdk/test/cdk.test.ts diff --git a/deploy/scripts/cdk/.gitignore b/deploy/scripts/cdk/.gitignore new file mode 100644 index 000000000..1a7a1528b --- /dev/null +++ b/deploy/scripts/cdk/.gitignore @@ -0,0 +1,9 @@ +*.js +!jest.config.js +*.d.ts +node_modules + +# CDK asset staging directory +.cdk.staging +cdk.out +!/lib diff --git a/deploy/scripts/cdk/.npmignore b/deploy/scripts/cdk/.npmignore new file mode 100644 index 000000000..c1d6d45dc --- /dev/null +++ b/deploy/scripts/cdk/.npmignore @@ -0,0 +1,6 @@ +*.ts +!*.d.ts + +# CDK asset staging directory +.cdk.staging +cdk.out diff --git a/deploy/scripts/cdk/README.md b/deploy/scripts/cdk/README.md new file mode 100644 index 000000000..320efc02a --- /dev/null +++ b/deploy/scripts/cdk/README.md @@ -0,0 +1,14 @@ +# Welcome to your CDK TypeScript project + +This is a blank project for CDK development with TypeScript. + +The `cdk.json` file tells the CDK Toolkit how to execute your app. + +## Useful commands + +* `npm run build` compile typescript to js +* `npm run watch` watch for changes and compile +* `npm run test` perform the jest unit tests +* `cdk deploy` deploy this stack to your default AWS account/region +* `cdk diff` compare deployed stack with current state +* `cdk synth` emits the synthesized CloudFormation template diff --git a/deploy/scripts/cdk/bin/cdk.ts b/deploy/scripts/cdk/bin/cdk.ts new file mode 100644 index 000000000..c680f3e98 --- /dev/null +++ b/deploy/scripts/cdk/bin/cdk.ts @@ -0,0 +1,21 @@ +#!/usr/bin/env node +import 'source-map-support/register'; +import * as cdk from 'aws-cdk-lib'; +import { LangflowAppStack } from '../lib/cdk-stack'; + +const app = new cdk.App(); +new LangflowAppStack(app, 'LangflowAppStack', { + /* If you don't specify 'env', this stack will be environment-agnostic. + * Account/Region-dependent features and context lookups will not work, + * but a single synthesized template can be deployed anywhere. */ + + /* Uncomment the next line to specialize this stack for the AWS Account + * and Region that are implied by the current CLI configuration. */ + // env: { account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEFAULT_REGION }, + + /* Uncomment the next line if you know exactly what Account and Region you + * want to deploy the stack to. */ + // env: { account: '123456789012', region: 'us-east-1' }, + + /* For more information, see https://docs.aws.amazon.com/cdk/latest/guide/environments.html */ +}); \ No newline at end of file diff --git a/deploy/scripts/cdk/cdk.json b/deploy/scripts/cdk/cdk.json new file mode 100644 index 000000000..dc8ab711a --- /dev/null +++ b/deploy/scripts/cdk/cdk.json @@ -0,0 +1,55 @@ +{ + "app": "npx ts-node --prefer-ts-exts bin/cdk.ts", + "watch": { + "include": [ + "**" + ], + "exclude": [ + "README.md", + "cdk*.json", + "**/*.d.ts", + "**/*.js", + "tsconfig.json", + "package*.json", + "yarn.lock", + "node_modules", + "test" + ] + }, + "context": { + "@aws-cdk/aws-lambda:recognizeLayerVersion": true, + "@aws-cdk/core:checkSecretUsage": true, + "@aws-cdk/core:target-partitions": [ + "aws", + "aws-cn" + ], + "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true, + "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true, + "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": true, + "@aws-cdk/aws-iam:minimizePolicies": true, + "@aws-cdk/core:validateSnapshotRemovalPolicy": true, + "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": true, + "@aws-cdk/aws-s3:createDefaultLoggingPolicy": true, + "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": true, + "@aws-cdk/aws-apigateway:disableCloudWatchRole": true, + "@aws-cdk/core:enablePartitionLiterals": true, + "@aws-cdk/aws-events:eventsTargetQueueSameAccount": true, + "@aws-cdk/aws-iam:standardizedServicePrincipals": true, + "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true, + "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": true, + "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": true, + "@aws-cdk/aws-route53-patters:useCertificate": true, + "@aws-cdk/customresources:installLatestAwsSdkDefault": false, + "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": true, + "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": true, + "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": true, + "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": true, + "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": true, + "@aws-cdk/aws-redshift:columnId": true, + "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": true, + "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": true, + "@aws-cdk/aws-apigateway:requestValidatorUniqueId": true, + "@aws-cdk/aws-kms:aliasNameRef": true, + "@aws-cdk/core:includePrefixInUniqueNameGeneration": true + } +} diff --git a/deploy/scripts/cdk/delete-ecr.sh b/deploy/scripts/cdk/delete-ecr.sh new file mode 100644 index 000000000..be7a5dab9 --- /dev/null +++ b/deploy/scripts/cdk/delete-ecr.sh @@ -0,0 +1,4 @@ +aws cloudformation delete-stack --stack-name LangflowAppStack +aws ecr delete-repository --repository-name langflow-backend-repository --force +aws ecr delete-repository --repository-name langflow-frontend-repository --force +aws ecr describe-repositories --output json | jq -re ".repositories[].repositoryName" \ No newline at end of file diff --git a/deploy/scripts/cdk/jest.config.js b/deploy/scripts/cdk/jest.config.js new file mode 100644 index 000000000..08263b895 --- /dev/null +++ b/deploy/scripts/cdk/jest.config.js @@ -0,0 +1,8 @@ +module.exports = { + testEnvironment: 'node', + roots: ['/test'], + testMatch: ['**/*.test.ts'], + transform: { + '^.+\\.tsx?$': 'ts-jest' + } +}; diff --git a/deploy/scripts/cdk/lib/cdk-stack.ts b/deploy/scripts/cdk/lib/cdk-stack.ts new file mode 100644 index 000000000..f83fcb0f5 --- /dev/null +++ b/deploy/scripts/cdk/lib/cdk-stack.ts @@ -0,0 +1,55 @@ +import * as cdk from 'aws-cdk-lib'; +import { Construct } from 'constructs'; +import * as ecs from 'aws-cdk-lib/aws-ecs' + +import { Network, EcrRepository, FrontEndCluster, BackEndCluster, Rds } from './construct'; +// import * as sqs from 'aws-cdk-lib/aws-sqs'; + +export class LangflowAppStack extends cdk.Stack { + constructor(scope: Construct, id: string, props?: cdk.StackProps) { + super(scope, id, props); + // Arch + const arch = ecs.CpuArchitecture.X86_64 + + // VPC + const { vpc, cluster, alb, targetGroup, cloudmapNamespace, ecsFrontSG, ecsBackSG, dbSG, albSG, backendTaskRole, TaskExecutionRole, frontendTaskRole, backendLogGroup, frontendLogGroup} = new Network(this, 'Network') + // ECR + const { ecrFrontEndRepository,ecrBackEndRepository} = new EcrRepository(this, 'Ecr', { + cloudmapNamespace:cloudmapNamespace, + arch:arch + }) + + // RDS + // VPCとSGのリソース情報をPropsとして引き渡す + const { rdsCluster } = new Rds(this, 'Rds', { vpc, dbSG }) + + const backendService = new BackEndCluster(this, 'backend', { + cluster:cluster, + ecsBackSG:ecsBackSG, + ecrBackEndRepository:ecrBackEndRepository, + backendTaskRole:backendTaskRole, + backendTaskExecutionRole:TaskExecutionRole, + backendLogGroup:backendLogGroup, + cloudmapNamespace:cloudmapNamespace, + rdsCluster:rdsCluster, + alb:alb, + arch:arch + }) + + new FrontEndCluster(this, 'frontend',{ + cluster:cluster, + ecsFrontSG:ecsFrontSG, + ecrFrontEndRepository:ecrFrontEndRepository, + targetGroup: targetGroup, + backendServiceName: backendService.backendServiceName, + frontendTaskRole: frontendTaskRole, + frontendTaskExecutionRole: TaskExecutionRole, + frontendLogGroup: frontendLogGroup, + cloudmapNamespace: cloudmapNamespace, + arch:arch + }) + + // S3+CloudFront + // new Web(this,'Cloudfront-S3') + } +} diff --git a/deploy/scripts/cdk/lib/construct/backend.ts b/deploy/scripts/cdk/lib/construct/backend.ts new file mode 100644 index 000000000..3d05fe616 --- /dev/null +++ b/deploy/scripts/cdk/lib/construct/backend.ts @@ -0,0 +1,110 @@ +import { Duration } from 'aws-cdk-lib' +import { Construct } from 'constructs'; +import { + aws_ec2 as ec2, + aws_ecs as ecs, + aws_ecr as ecr, + aws_rds as rds, + aws_servicediscovery as servicediscovery, + aws_iam as iam, + aws_logs as logs, + aws_elasticloadbalancingv2 as elb, +} from 'aws-cdk-lib'; + +interface BackEndProps { + cluster: ecs.Cluster + ecsBackSG:ec2.SecurityGroup + ecrBackEndRepository:ecr.Repository + backendTaskRole: iam.Role; + backendTaskExecutionRole: iam.Role; + backendLogGroup: logs.LogGroup; + cloudmapNamespace: servicediscovery.PrivateDnsNamespace; + rdsCluster:rds.DatabaseCluster + alb:elb.IApplicationLoadBalancer + arch:ecs.CpuArchitecture +} + +export class BackEndCluster extends Construct { + readonly backendServiceName: string + + constructor(scope: Construct, id: string, props:BackEndProps) { + super(scope, id) + const containerPort = 7860 + // Secrets ManagerからDB認証情報を取ってくる + const secretsDB = props.rdsCluster.secret!; + + // Create Backend Fargate Service + const backendTaskDefinition = new ecs.FargateTaskDefinition( + this, + 'BackEndTaskDef', + { + memoryLimitMiB: 512, + cpu: 256, + executionRole: props.backendTaskExecutionRole, + runtimePlatform:{ + operatingSystemFamily: ecs.OperatingSystemFamily.LINUX, + cpuArchitecture: props.arch, + }, + taskRole: props.backendTaskRole, + } + ); + backendTaskDefinition.addContainer('backendContainer', { + image: ecs.ContainerImage.fromEcrRepository(props.ecrBackEndRepository, "latest"), + containerName:'langflow-back-container', + logging: ecs.LogDriver.awsLogs({ + streamPrefix: 'my-stream', + logGroup: props.backendLogGroup, + }), + environment:{ + // user:pass@endpoint:port/dbname + "LANGFLOW_DATABASE_URL" : `mysql+pymysql://${ecs.Secret.fromSecretsManager(secretsDB, 'username')}:${ecs.Secret.fromSecretsManager(secretsDB, 'password')}@${ecs.Secret.fromSecretsManager(secretsDB, 'host')}:3306/${ecs.Secret.fromSecretsManager(secretsDB, 'dbname')}`, + "LANGFLOW_AUTO_LOGIN" : "false", + "LANGFLOW_SUPERUSER" : "admin", + "LANGFLOW_SUPERUSER_PASSWORD" : "1234567" + }, + portMappings: [ + { + containerPort: containerPort, + protocol: ecs.Protocol.TCP, + }, + ], + // Secretの設定 + secrets: { + "dbname": ecs.Secret.fromSecretsManager(secretsDB, 'dbname'), + "username": ecs.Secret.fromSecretsManager(secretsDB, 'username'), + "host": ecs.Secret.fromSecretsManager(secretsDB, 'host'), + "password": ecs.Secret.fromSecretsManager(secretsDB, 'password'), + }, + }); + this.backendServiceName = 'langflow-backend-service' + const backendService = new ecs.FargateService(this, 'BackEndService', { + cluster: props.cluster, + serviceName: this.backendServiceName, + taskDefinition: backendTaskDefinition, + enableExecuteCommand: true, + securityGroups: [props.ecsBackSG], + cloudMapOptions: { + cloudMapNamespace: props.cloudmapNamespace, + containerPort: containerPort, + dnsRecordType: servicediscovery.DnsRecordType.A, + dnsTtl: Duration.seconds(10), + name: this.backendServiceName + }, + vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS }, + }); + + const ecsBackEndExecutionRole = iam.Role.fromRoleArn( + this, + "ecsBackEndExecutionRole", + backendService.taskDefinition.executionRole!.roleArn, + {} + ); + ecsBackEndExecutionRole.attachInlinePolicy(new iam.Policy(this, 'SMGetPolicy', { + statements: [new iam.PolicyStatement({ + actions: ['secretsmanager:GetSecretValue'], + resources: [secretsDB.secretArn], + })], + })); + + } +} \ No newline at end of file diff --git a/deploy/scripts/cdk/lib/construct/db.ts b/deploy/scripts/cdk/lib/construct/db.ts new file mode 100644 index 000000000..8be1f5212 --- /dev/null +++ b/deploy/scripts/cdk/lib/construct/db.ts @@ -0,0 +1,64 @@ +import { Construct } from 'constructs'; +import * as ec2 from 'aws-cdk-lib/aws-ec2' +import * as rds from "aws-cdk-lib/aws-rds"; + +interface RdsProps { + vpc: ec2.Vpc + dbSG:ec2.SecurityGroup +} + +export class Rds extends Construct{ + readonly rdsCluster: rds.DatabaseCluster + + constructor(scope: Construct, id:string, props: RdsProps){ + super(scope, id); + + const {vpc, dbSG} = props + const instanceType = ec2.InstanceType.of(ec2.InstanceClass.BURSTABLE4_GRAVITON, ec2.InstanceSize.MEDIUM) + + // RDSのパスワードを自動生成してSecrets Managerに格納 + const rdsCredentials = rds.Credentials.fromGeneratedSecret('db_user',{ + secretName: 'langflow-DbSecret', + }) + + // DB クラスターのパラメータグループ作成 + const clusterParameterGroup = new rds.ParameterGroup(scope, 'ClusterParameterGroup',{ + engine: rds.DatabaseClusterEngine.auroraMysql({ + version: rds.AuroraMysqlEngineVersion.VER_3_02_0 + }), + description: 'for-langflow', + }) + clusterParameterGroup.bindToCluster({}) + + // DB インスタンスのパラメタグループ作成 + const instanceParameterGroup = new rds.ParameterGroup(scope, 'InstanceParameterGroup',{ + engine: rds.DatabaseClusterEngine.auroraMysql({ + version: rds.AuroraMysqlEngineVersion.VER_3_02_0, + }), + description: 'for-langflow', + }) + instanceParameterGroup.bindToInstance({}) + + this.rdsCluster = new rds.DatabaseCluster(scope, 'LangflowDbCluster', { + engine: rds.DatabaseClusterEngine.auroraMysql({ + version: rds.AuroraMysqlEngineVersion.VER_3_02_0, + }), + storageEncrypted: true, + credentials: rdsCredentials, + instanceIdentifierBase: 'langflow-instance', + vpc:vpc, + vpcSubnets:vpc.selectSubnets({ + subnetGroupName: 'langflow-Isolated', + }), + securityGroups:[dbSG], + writer: rds.ClusterInstance.provisioned("WriterInstance", { + instanceType: instanceType, + enablePerformanceInsights: true, + parameterGroup:instanceParameterGroup, + }), + // 2台目以降はreaders:で設定 + parameterGroup: clusterParameterGroup, + defaultDatabaseName: 'langflow', + }) + } +} diff --git a/deploy/scripts/cdk/lib/construct/ecr.ts b/deploy/scripts/cdk/lib/construct/ecr.ts new file mode 100644 index 000000000..6e6db707b --- /dev/null +++ b/deploy/scripts/cdk/lib/construct/ecr.ts @@ -0,0 +1,76 @@ +import { RemovalPolicy } from 'aws-cdk-lib' +import * as ecr from 'aws-cdk-lib/aws-ecr' +import * as ecrdeploy from 'cdk-ecr-deployment' +import * as ecs from 'aws-cdk-lib/aws-ecs' +import * as servicediscovery from 'aws-cdk-lib/aws-servicediscovery' +import { DockerImageAsset, Platform } from 'aws-cdk-lib/aws-ecr-assets' +import * as path from "path"; +import { Construct } from 'constructs' + + +interface ECRProps { + cloudmapNamespace: servicediscovery.PrivateDnsNamespace; + arch:ecs.CpuArchitecture; +} + +export class EcrRepository extends Construct { + readonly ecrFrontEndRepository: ecr.Repository + readonly ecrBackEndRepository: ecr.Repository + + constructor(scope: Construct, id: string, props: ECRProps) { + super(scope, id) + + const imagePlatform = props.arch == ecs.CpuArchitecture.ARM64 ? Platform.LINUX_ARM64 : Platform.LINUX_AMD64 + const backendPath = path.join(__dirname, "../../../../../../", "langflow") + const frontendPath = path.join(__dirname, "../../../../../src/", "frontend") + const excludeDir = ['node_modules','.git', 'cdk.out'] + const LifecycleRule = { + tagStatus: ecr.TagStatus.ANY, + description: 'Delete more than 30 image', + maxImageCount: 30, + } + + // リポジトリ作成 + this.ecrFrontEndRepository = new ecr.Repository(scope, 'LangflowFrontEndRepository', { + repositoryName: 'langflow-frontend-repository', + removalPolicy: RemovalPolicy.RETAIN, + imageScanOnPush: true, + }) + this.ecrBackEndRepository = new ecr.Repository(scope, 'LangflowBackEndRepository', { + repositoryName: 'langflow-backend-repository', + removalPolicy: RemovalPolicy.RETAIN, + imageScanOnPush: true, + }) + // LifecycleRule作成 + this.ecrFrontEndRepository.addLifecycleRule(LifecycleRule) + this.ecrBackEndRepository.addLifecycleRule(LifecycleRule) + + // Create Docker Image Asset + const dockerFrontEndImageAsset = new DockerImageAsset(this, "DockerFrontEndImageAsset", { + directory: frontendPath, + buildArgs:{ + "BACKEND_URL":`http://${props.cloudmapNamespace.namespaceName}:7860` + }, + exclude: excludeDir, + platform: imagePlatform, + }); + const dockerBackEndImageAsset = new DockerImageAsset(this, "DockerBackEndImageAsset", { + directory: backendPath, + exclude: excludeDir, + platform: imagePlatform, + }); + + // Deploy Docker Image to ECR Repository + new ecrdeploy.ECRDeployment(this, "DeployFrontEndImage", { + src: new ecrdeploy.DockerImageName(dockerFrontEndImageAsset.imageUri), + dest: new ecrdeploy.DockerImageName(this.ecrFrontEndRepository.repositoryUri) + }); + + // Deploy Docker Image to ECR Repository + new ecrdeploy.ECRDeployment(this, "DeployBackEndImage", { + src: new ecrdeploy.DockerImageName(dockerBackEndImageAsset.imageUri), + dest: new ecrdeploy.DockerImageName(this.ecrBackEndRepository.repositoryUri) + }); + + } +} diff --git a/deploy/scripts/cdk/lib/construct/frontend.ts b/deploy/scripts/cdk/lib/construct/frontend.ts new file mode 100644 index 000000000..e4463000d --- /dev/null +++ b/deploy/scripts/cdk/lib/construct/frontend.ts @@ -0,0 +1,109 @@ +import { Duration } from 'aws-cdk-lib' +import { Construct } from 'constructs' +import { + aws_ec2 as ec2, + aws_ecs as ecs, + aws_ecr as ecr, + aws_servicediscovery as servicediscovery, + aws_iam as iam, + aws_logs as logs, + aws_elasticloadbalancingv2 as elb, +} from 'aws-cdk-lib'; +import { CpuArchitecture } from 'aws-cdk-lib/aws-ecs'; + +interface FrontEndProps { + cluster:ecs.Cluster + ecsFrontSG:ec2.SecurityGroup + ecrFrontEndRepository:ecr.Repository + targetGroup: elb.ApplicationTargetGroup; + backendServiceName: string; + frontendTaskRole: iam.Role; + frontendTaskExecutionRole: iam.Role; + frontendLogGroup: logs.LogGroup; + cloudmapNamespace: servicediscovery.PrivateDnsNamespace; + arch:ecs.CpuArchitecture; +} + +export class FrontEndCluster extends Construct { + constructor(scope: Construct, id: string, props:FrontEndProps) { + super(scope, id) + + const containerPort = 3000 + const frontendTaskDefinition = new ecs.FargateTaskDefinition( + this, + 'FrontendTaskDef', + { + memoryLimitMiB: 512, + cpu: 256, + executionRole: props.frontendTaskExecutionRole, + runtimePlatform:{ + operatingSystemFamily: ecs.OperatingSystemFamily.LINUX, + cpuArchitecture: props.arch, + }, + taskRole: props.frontendTaskRole, + } + ); + + frontendTaskDefinition.addContainer('frontendContainer', { + image: ecs.ContainerImage.fromEcrRepository(props.ecrFrontEndRepository, "latest"), + containerName:'langflow-front-container', + environment: { + BACKEND_SERVICE_NAME: props.backendServiceName, + BACKEND_URL: `http://${props.backendServiceName}.${props.cloudmapNamespace.namespaceName}:7860/`, + VITE_PROXY_TARGET: `http://${props.backendServiceName}.${props.cloudmapNamespace.namespaceName}:7860/`, + }, + logging: ecs.LogDriver.awsLogs({ + streamPrefix: 'my-stream', + logGroup: props.frontendLogGroup, + }), + portMappings: [ + { + containerPort: containerPort, + protocol: ecs.Protocol.TCP, + }, + ], + }); + + const frontendService = new ecs.FargateService( + this, + 'FrontendService', + { + serviceName: 'langflow-frontend-service', + cluster: props.cluster, + desiredCount: 1, + assignPublicIp: false, + taskDefinition: frontendTaskDefinition, + enableExecuteCommand: true, + securityGroups: [props.ecsFrontSG], + // healthCheckGracePeriod: Duration.seconds(300), + } + ); + + // props.targetGroup.addTarget(frontendService); + + // // Create ALB and ECS Fargate Service + // const frontService = new ecs_patterns.ApplicationLoadBalancedFargateService( + // this, + // "FrontEndService", + // { + // cluster: cluster, + // serviceName: 'langflow-frontend-service', + // cpu: 256, + // memoryLimitMiB: 512, + // listenerPort: 80, + // assignPublicIp: true, // Public facing - ALB + // taskSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS }, + // securityGroups:[ecsFrontSG], + // taskImageOptions: { + // family: 'langflow-taskdef', + // containerName: 'langflow-front-container', + // image: ecs.ContainerImage.fromEcrRepository(ecrFrontEndRepository, "latest"), + // containerPort: 3000, // L2なので、TargetGroupのportが3000で設定されるはず + // }, + // loadBalancer:alb, + // openListener:false, + // } + // ); + + } +} \ No newline at end of file diff --git a/deploy/scripts/cdk/lib/construct/index.ts b/deploy/scripts/cdk/lib/construct/index.ts new file mode 100644 index 000000000..8ca22911a --- /dev/null +++ b/deploy/scripts/cdk/lib/construct/index.ts @@ -0,0 +1,5 @@ +export * from './db'; +export * from './ecr'; +export * from './frontend'; +export * from './backend'; +export * from './network'; \ No newline at end of file diff --git a/deploy/scripts/cdk/lib/construct/network.ts b/deploy/scripts/cdk/lib/construct/network.ts new file mode 100644 index 000000000..035a051bc --- /dev/null +++ b/deploy/scripts/cdk/lib/construct/network.ts @@ -0,0 +1,180 @@ +import { RemovalPolicy, Duration } from 'aws-cdk-lib' +import { Construct } from 'constructs' +import { + aws_ec2 as ec2, + aws_ecs as ecs, + aws_dynamodb as dynamodb, + aws_iam as iam, + aws_logs as logs, + aws_servicediscovery as servicediscovery, + aws_elasticloadbalancingv2 as elb, +} from 'aws-cdk-lib'; + +export class Network extends Construct { + readonly vpc: ec2.Vpc; + readonly cluster: ecs.Cluster; + readonly alb: elb.IApplicationLoadBalancer; + readonly targetGroup: elb.ApplicationTargetGroup; + readonly cloudmapNamespace: servicediscovery.PrivateDnsNamespace; + readonly ecsFrontSG: ec2.SecurityGroup; + readonly ecsBackSG: ec2.SecurityGroup; + readonly dbSG: ec2.SecurityGroup; + readonly albSG: ec2.SecurityGroup; + readonly backendTaskRole: iam.Role; + readonly TaskExecutionRole: iam.Role; + readonly frontendTaskRole: iam.Role; + readonly backendLogGroup: logs.LogGroup; + readonly frontendLogGroup: logs.LogGroup; + + constructor(scope: Construct, id: string) { + super(scope, id) + + // VPC等リソースの作成 + this.vpc = new ec2.Vpc(scope, 'VPC', { + vpcName: 'langflow-vpc', + ipAddresses: ec2.IpAddresses.cidr('10.0.0.0/16'), + maxAzs: 3, + subnetConfiguration: [ + { + cidrMask: 24, + name: 'langflow-Isolated', + subnetType: ec2.SubnetType.PRIVATE_ISOLATED, + }, + { + cidrMask: 24, + name: 'langflow-Public', + subnetType: ec2.SubnetType.PUBLIC, + }, + { + cidrMask: 24, + name: 'langflow-Private', + subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS + }, + ], + natGateways: 1, + }) + + this.cluster = new ecs.Cluster(this, 'EcsCluster', { + clusterName: 'langflow-cluster', + vpc: this.vpc, + }); + + // Private DNS + this.cloudmapNamespace = new servicediscovery.PrivateDnsNamespace( + this, + 'Namespace', + { + name: 'ecs-deploy.com', + vpc: this.vpc, + } + ); + + // ALBに設定するセキュリティグループ + this.albSG = new ec2.SecurityGroup(scope, 'ALBSecurityGroup', { + securityGroupName: 'alb-sg', + description: 'for alb', + vpc: this.vpc, + }) + this.albSG.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(80)) + + this.alb = new elb.ApplicationLoadBalancer(this,'alb',{ + internetFacing: true, //インターネットからのアクセスを許可するかどうか指定 + loadBalancerName: 'alb', + securityGroup: this.albSG, //作成したセキュリティグループを割り当てる + vpc:this.vpc, + }) + + const listener = this.alb.addListener('Listener', { port: 80 }); + + this.targetGroup = listener.addTargets('targetGroup', { + port: 3000, + protocol: elb.ApplicationProtocol.HTTP, + healthCheck: { + enabled: true, + path: '/health', + healthyThresholdCount: 2, + unhealthyThresholdCount: 4, + interval: Duration.seconds(100), + timeout: Duration.seconds(30), + healthyHttpCodes: '200', + }, + }); + + // ECS FrontEndに設定するセキュリティグループ + this.ecsFrontSG = new ec2.SecurityGroup(scope, 'ECSFrontEndSecurityGroup', { + securityGroupName: 'langflow-ecs-front-sg', + description: 'for langflow-front-ecs', + vpc: this.vpc, + }) + this.ecsFrontSG.addIngressRule(this.albSG, ec2.Port.allTcp()) + + // ECS BackEndに設定するセキュリティグループ + this.ecsBackSG = new ec2.SecurityGroup(scope, 'ECSBackEndSecurityGroup', { + securityGroupName: 'langflow-ecs-back-sg', + description: 'for langflow-back-ecs', + vpc: this.vpc, + }) + this.ecsBackSG.addIngressRule(this.ecsFrontSG, ec2.Port.tcp(7860)) + + // RDSに設定するセキュリティグループ + this.dbSG = new ec2.SecurityGroup(scope, 'DBSecurityGroup', { + allowAllOutbound: true, + securityGroupName: 'langflow-db', + description: 'for langflow-db', + vpc: this.vpc, + }) + // AppRunnerSecurityGroupからのポート3306:mysql(5432:postgres)のインバウンドを許可 + this.dbSG.addIngressRule(this.ecsBackSG, ec2.Port.tcp(3306)) + + // ECS Policy State + const ECSExecPolicyStatement = new iam.PolicyStatement({ + sid: 'allowECSExec', + resources: ['*'], + actions: [ + 'ecr:GetAuthorizationToken', + 'ecr:BatchCheckLayerAvailability', + 'ecr:GetDownloadUrlForLayer', + 'ecr:BatchGetImage', + 'ssmmessages:CreateControlChannel', + 'ssmmessages:CreateDataChannel', + 'ssmmessages:OpenControlChannel', + 'ssmmessages:OpenDataChannel', + 'logs:CreateLogStream', + 'logs:DescribeLogGroups', + 'logs:DescribeLogStreams', + 'logs:PutLogEvents', + ], + }); + + this.backendTaskRole = new iam.Role(this, 'BackendTaskRole', { + assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), + }); + this.backendTaskRole.addToPolicy(ECSExecPolicyStatement); + + this.frontendTaskRole = new iam.Role(this, 'FrontendTaskRole', { + assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), + }); + this.frontendTaskRole.addToPolicy(ECSExecPolicyStatement); + + this.TaskExecutionRole = new iam.Role(this, 'TaskExecutionRole', { + assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), + managedPolicies: [ + { + managedPolicyArn: + 'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy', + }, + ], + }); + + // Create CloudWatch Log Group + this.backendLogGroup = new logs.LogGroup(this, 'backendLogGroup', { + logGroupName: 'myapp-backend', + removalPolicy: RemovalPolicy.DESTROY, + }); + + this.frontendLogGroup = new logs.LogGroup(this, 'frontendLogGroup', { + logGroupName: 'myapp-frontend', + removalPolicy: RemovalPolicy.DESTROY, + }); + } +} \ No newline at end of file diff --git a/deploy/scripts/cdk/package-lock.json b/deploy/scripts/cdk/package-lock.json new file mode 100644 index 000000000..3c19966e2 --- /dev/null +++ b/deploy/scripts/cdk/package-lock.json @@ -0,0 +1,4601 @@ +{ + "name": "cdk", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "cdk", + "version": "0.1.0", + "dependencies": { + "aws-cdk-lib": "2.86.0", + "cdk-ecr-deployment": "^2.5.30", + "constructs": "^10.0.0", + "source-map-support": "^0.5.21" + }, + "bin": { + "cdk": "bin/cdk.js" + }, + "devDependencies": { + "@types/jest": "^29.5.1", + "@types/node": "20.1.7", + "aws-cdk": "2.86.0", + "jest": "^29.5.0", + "ts-jest": "^29.1.0", + "ts-node": "^10.9.1", + "typescript": "~5.1.3" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@aws-cdk/asset-awscli-v1": { + "version": "2.2.201", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.201.tgz", + "integrity": "sha512-INZqcwDinNaIdb5CtW3ez5s943nX5stGBQS6VOP2JDlOFP81hM3fds/9NDknipqfUkZM43dx+HgVvkXYXXARCQ==" + }, + "node_modules/@aws-cdk/asset-kubectl-v20": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-kubectl-v20/-/asset-kubectl-v20-2.1.2.tgz", + "integrity": "sha512-3M2tELJOxQv0apCIiuKQ4pAbncz9GuLwnKFqxifWfe77wuMxyTRPmxssYHs42ePqzap1LT6GDcPygGs+hHstLg==" + }, + "node_modules/@aws-cdk/asset-node-proxy-agent-v5": { + "version": "2.0.166", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v5/-/asset-node-proxy-agent-v5-2.0.166.tgz", + "integrity": "sha512-j0xnccpUQHXJKPgCwQcGGNu4lRiC1PptYfdxBIH1L4dRK91iBxtSQHESRQX+yB47oGLaF/WfNN/aF3WXwlhikg==" + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", + "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", + "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", + "dev": true, + "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", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", + "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.3", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, + "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" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", + "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz", + "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.3", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.3", + "@babel/types": "^7.23.3", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", + "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.4.tgz", + "integrity": "sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.7", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", + "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", + "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.8", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.8.tgz", + "integrity": "sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/node": { + "version": "20.1.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.7.tgz", + "integrity": "sha512-WCuw/o4GSwDGMoonES8rcvwsig77dGCMbZDrZr2x4ZZiNW4P/gcoZXe/0twgtobcTkmg9TuKflxYL/DuwDyJzg==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "17.0.31", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", + "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", + "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aws-cdk": { + "version": "2.86.0", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.86.0.tgz", + "integrity": "sha512-GRcdU6p00Zu3fIZYPG+EbpDYppYMtzebuf0jrmCfKhCytRGaPWDHHfu3hrv0de4d0zbUD/+AmiODPMu3J6nXbQ==", + "dev": true, + "bin": { + "cdk": "bin/cdk" + }, + "engines": { + "node": ">= 14.15.0" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/aws-cdk-lib": { + "version": "2.86.0", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.86.0.tgz", + "integrity": "sha512-76yZ2MawAGXLD3ox4FjhUIPmAMXteGKkeo3tPMthemusDCCkD2X6DBssXBHjB7r9GnrOMMf8JH5BGq2lOZ539g==", + "bundleDependencies": [ + "@balena/dockerignore", + "case", + "fs-extra", + "ignore", + "jsonschema", + "minimatch", + "punycode", + "semver", + "table", + "yaml" + ], + "dependencies": { + "@aws-cdk/asset-awscli-v1": "^2.2.177", + "@aws-cdk/asset-kubectl-v20": "^2.1.1", + "@aws-cdk/asset-node-proxy-agent-v5": "^2.0.148", + "@balena/dockerignore": "^1.0.2", + "case": "1.6.3", + "fs-extra": "^11.1.1", + "ignore": "^5.2.4", + "jsonschema": "^1.4.1", + "minimatch": "^3.1.2", + "punycode": "^2.3.0", + "semver": "^7.5.1", + "table": "^6.8.1", + "yaml": "1.10.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "constructs": "^10.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/@balena/dockerignore": { + "version": "1.0.2", + "inBundle": true, + "license": "Apache-2.0" + }, + "node_modules/aws-cdk-lib/node_modules/ajv": { + "version": "8.12.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/aws-cdk-lib/node_modules/ansi-regex": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/ansi-styles": { + "version": "4.3.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/aws-cdk-lib/node_modules/astral-regex": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/balanced-match": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/brace-expansion": { + "version": "1.1.11", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/aws-cdk-lib/node_modules/case": { + "version": "1.6.3", + "inBundle": true, + "license": "(MIT OR GPL-3.0-or-later)", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/color-convert": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/color-name": { + "version": "1.1.4", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/concat-map": { + "version": "0.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/emoji-regex": { + "version": "8.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/fast-deep-equal": { + "version": "3.1.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/fs-extra": { + "version": "11.1.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/aws-cdk-lib/node_modules/graceful-fs": { + "version": "4.2.11", + "inBundle": true, + "license": "ISC" + }, + "node_modules/aws-cdk-lib/node_modules/ignore": { + "version": "5.2.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/aws-cdk-lib/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/json-schema-traverse": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/jsonfile": { + "version": "6.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/aws-cdk-lib/node_modules/jsonschema": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/aws-cdk-lib/node_modules/lodash.truncate": { + "version": "4.4.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aws-cdk-lib/node_modules/minimatch": { + "version": "3.1.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/aws-cdk-lib/node_modules/punycode": { + "version": "2.3.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/aws-cdk-lib/node_modules/require-from-string": { + "version": "2.0.2", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/semver": { + "version": "7.5.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aws-cdk-lib/node_modules/slice-ansi": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/aws-cdk-lib/node_modules/string-width": { + "version": "4.2.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/strip-ansi": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/table": { + "version": "6.8.1", + "inBundle": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/universalify": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/uri-js": { + "version": "4.4.1", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/aws-cdk-lib/node_modules/yaml": { + "version": "1.10.2", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001561", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz", + "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/cdk-ecr-deployment": { + "version": "2.5.30", + "resolved": "https://registry.npmjs.org/cdk-ecr-deployment/-/cdk-ecr-deployment-2.5.30.tgz", + "integrity": "sha512-IFS/DD6OmNcXv24YKjjaz1sb04xxsoUb7vPYwx7kTBAOxOnT0CuAadF8/HVfM/YVoqoOPXCJe3ikAXy1iI0nKw==", + "bundleDependencies": [ + "got", + "hpagent" + ], + "dependencies": { + "aws-cdk-lib": "^2.0.0", + "constructs": "^10.0.5", + "got": "^11.8.6", + "hpagent": "^0.1.2" + }, + "peerDependencies": { + "aws-cdk-lib": "^2.0.0", + "constructs": "^10.0.5" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/@sindresorhus/is": { + "version": "4.6.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "inBundle": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/@types/cacheable-request": { + "version": "6.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/@types/cacheable-request/node_modules/@types/node": { + "version": "20.3.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdk-ecr-deployment/node_modules/@types/http-cache-semantics": { + "version": "4.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdk-ecr-deployment/node_modules/@types/keyv": { + "version": "3.1.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/@types/keyv/node_modules/@types/node": { + "version": "20.3.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdk-ecr-deployment/node_modules/@types/responselike": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/@types/responselike/node_modules/@types/node": { + "version": "20.3.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdk-ecr-deployment/node_modules/cacheable-lookup": { + "version": "5.0.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/cacheable-request": { + "version": "7.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/clone-response": { + "version": "1.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/clone-response/node_modules/mimic-response": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/decompress-response": { + "version": "6.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/defer-to-connect": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/end-of-stream": { + "version": "1.4.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/got": { + "version": "11.8.6", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/hpagent": { + "version": "0.1.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdk-ecr-deployment/node_modules/http-cache-semantics": { + "version": "4.1.1", + "inBundle": true, + "license": "BSD-2-Clause" + }, + "node_modules/cdk-ecr-deployment/node_modules/http2-wrapper": { + "version": "1.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/json-buffer": { + "version": "3.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdk-ecr-deployment/node_modules/keyv": { + "version": "4.5.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/lowercase-keys": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/mimic-response": { + "version": "3.1.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/normalize-url": { + "version": "6.1.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/once": { + "version": "1.4.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/p-cancelable": { + "version": "2.1.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/pump": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/quick-lru": { + "version": "5.1.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/resolve-alpn": { + "version": "1.2.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdk-ecr-deployment/node_modules/responselike": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/wrappy": { + "version": "1.0.2", + "inBundle": true, + "license": "ISC" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/constructs": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.3.0.tgz", + "integrity": "sha512-vbK8i3rIb/xwZxSpTjz3SagHn1qq9BChLEfy5Hf6fB3/2eFbrwt2n9kHwQcS0CPTRBesreeAcsJfMq2229FnbQ==", + "engines": { + "node": ">= 16.14.0" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.580", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.580.tgz", + "integrity": "sha512-T5q3pjQon853xxxHUq3ZP68ZpvJHuSMY2+BZaW3QzjS4HvNuvsMmZ/+lU+nCrftre1jFZ+OSlExynXWBihnXzw==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", + "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "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" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pure-rand": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", + "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-jest": { + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", + "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "^7.5.3", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz", + "integrity": "sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/deploy/scripts/cdk/package.json b/deploy/scripts/cdk/package.json new file mode 100644 index 000000000..c6643368b --- /dev/null +++ b/deploy/scripts/cdk/package.json @@ -0,0 +1,28 @@ +{ + "name": "cdk", + "version": "0.1.0", + "bin": { + "cdk": "bin/cdk.js" + }, + "scripts": { + "build": "tsc", + "watch": "tsc -w", + "test": "jest", + "cdk": "cdk" + }, + "devDependencies": { + "@types/jest": "^29.5.1", + "@types/node": "20.1.7", + "aws-cdk": "2.86.0", + "jest": "^29.5.0", + "ts-jest": "^29.1.0", + "ts-node": "^10.9.1", + "typescript": "~5.1.3" + }, + "dependencies": { + "aws-cdk-lib": "2.86.0", + "cdk-ecr-deployment": "^2.5.30", + "constructs": "^10.0.0", + "source-map-support": "^0.5.21" + } +} diff --git a/deploy/scripts/cdk/test/cdk.test.ts b/deploy/scripts/cdk/test/cdk.test.ts new file mode 100644 index 000000000..1e6b29c85 --- /dev/null +++ b/deploy/scripts/cdk/test/cdk.test.ts @@ -0,0 +1,17 @@ +// import * as cdk from 'aws-cdk-lib'; +// import { Template } from 'aws-cdk-lib/assertions'; +// import * as Cdk from '../lib/cdk-stack'; + +// example test. To run these tests, uncomment this file along with the +// example resource in lib/cdk-stack.ts +test('SQS Queue Created', () => { +// const app = new cdk.App(); +// // WHEN +// const stack = new Cdk.CdkStack(app, 'MyTestStack'); +// // THEN +// const template = Template.fromStack(stack); + +// template.hasResourceProperties('AWS::SQS::Queue', { +// VisibilityTimeout: 300 +// }); +}); From 576b62e17f1c832fd731bec4785b2864fe87bbf1 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Mon, 20 Nov 2023 17:45:20 +0900 Subject: [PATCH 002/203] modified: dockerignore for cdk --- .dockerignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.dockerignore b/.dockerignore index 0cafc1cde..4e7226768 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1 +1,2 @@ -.venv/ \ No newline at end of file +.venv/ +**/cdk \ No newline at end of file From a7834ca4a9bb146313597b2a0967b83da7d013be Mon Sep 17 00:00:00 2001 From: nsxshota Date: Mon, 20 Nov 2023 19:21:27 +0900 Subject: [PATCH 003/203] modified: conflicts --- poetry.lock | 162 +++++++++++++++++++++++++++++++++++++++++++++++++ pyproject.toml | 5 ++ 2 files changed, 167 insertions(+) diff --git a/poetry.lock b/poetry.lock index 68e6c22bc..da925ca48 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2456,6 +2456,7 @@ description = "Lightweight in-process concurrent programming" optional = false python-versions = ">=3.7" files = [ +<<<<<<< HEAD {file = "greenlet-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f89e21afe925fcfa655965ca8ea10f24773a1791400989ff32f467badfe4a064"}, {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28e89e232c7593d33cac35425b58950789962011cc274aa43ef8865f2e11f46d"}, {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8ba29306c5de7717b5761b9ea74f9c72b9e2b834e24aa984da99cbfc70157fd"}, @@ -2513,6 +2514,70 @@ files = [ {file = "greenlet-3.0.1-cp39-cp39-win32.whl", hash = "sha256:cf868e08690cb89360eebc73ba4be7fb461cfbc6168dd88e2fbbe6f31812cd57"}, {file = "greenlet-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:ac4a39d1abae48184d420aa8e5e63efd1b75c8444dd95daa3e03f6c6310e9619"}, {file = "greenlet-3.0.1.tar.gz", hash = "sha256:816bd9488a94cba78d93e1abb58000e8266fa9cc2aa9ccdd6eb0696acb24005b"}, +======= + {file = "greenlet-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e09dea87cc91aea5500262993cbd484b41edf8af74f976719dd83fe724644cd6"}, + {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f47932c434a3c8d3c86d865443fadc1fbf574e9b11d6650b656e602b1797908a"}, + {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bdfaeecf8cc705d35d8e6de324bf58427d7eafb55f67050d8f28053a3d57118c"}, + {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a68d670c8f89ff65c82b936275369e532772eebc027c3be68c6b87ad05ca695"}, + {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ad562a104cd41e9d4644f46ea37167b93190c6d5e4048fcc4b80d34ecb278f"}, + {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02a807b2a58d5cdebb07050efe3d7deaf915468d112dfcf5e426d0564aa3aa4a"}, + {file = "greenlet-3.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b1660a15a446206c8545edc292ab5c48b91ff732f91b3d3b30d9a915d5ec4779"}, + {file = "greenlet-3.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:813720bd57e193391dfe26f4871186cf460848b83df7e23e6bef698a7624b4c9"}, + {file = "greenlet-3.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:aa15a2ec737cb609ed48902b45c5e4ff6044feb5dcdfcf6fa8482379190330d7"}, + {file = "greenlet-3.0.0-cp310-universal2-macosx_11_0_x86_64.whl", hash = "sha256:7709fd7bb02b31908dc8fd35bfd0a29fc24681d5cc9ac1d64ad07f8d2b7db62f"}, + {file = "greenlet-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:211ef8d174601b80e01436f4e6905aca341b15a566f35a10dd8d1e93f5dbb3b7"}, + {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6512592cc49b2c6d9b19fbaa0312124cd4c4c8a90d28473f86f92685cc5fef8e"}, + {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:871b0a8835f9e9d461b7fdaa1b57e3492dd45398e87324c047469ce2fc9f516c"}, + {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b505fcfc26f4148551826a96f7317e02c400665fa0883fe505d4fcaab1dabfdd"}, + {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:123910c58234a8d40eaab595bc56a5ae49bdd90122dde5bdc012c20595a94c14"}, + {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:96d9ea57292f636ec851a9bb961a5cc0f9976900e16e5d5647f19aa36ba6366b"}, + {file = "greenlet-3.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0b72b802496cccbd9b31acea72b6f87e7771ccfd7f7927437d592e5c92ed703c"}, + {file = "greenlet-3.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:527cd90ba3d8d7ae7dceb06fda619895768a46a1b4e423bdb24c1969823b8362"}, + {file = "greenlet-3.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:37f60b3a42d8b5499be910d1267b24355c495064f271cfe74bf28b17b099133c"}, + {file = "greenlet-3.0.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1482fba7fbed96ea7842b5a7fc11d61727e8be75a077e603e8ab49d24e234383"}, + {file = "greenlet-3.0.0-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:be557119bf467d37a8099d91fbf11b2de5eb1fd5fc5b91598407574848dc910f"}, + {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73b2f1922a39d5d59cc0e597987300df3396b148a9bd10b76a058a2f2772fc04"}, + {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1e22c22f7826096ad503e9bb681b05b8c1f5a8138469b255eb91f26a76634f2"}, + {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1d363666acc21d2c204dd8705c0e0457d7b2ee7a76cb16ffc099d6799744ac99"}, + {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:334ef6ed8337bd0b58bb0ae4f7f2dcc84c9f116e474bb4ec250a8bb9bd797a66"}, + {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6672fdde0fd1a60b44fb1751a7779c6db487e42b0cc65e7caa6aa686874e79fb"}, + {file = "greenlet-3.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:952256c2bc5b4ee8df8dfc54fc4de330970bf5d79253c863fb5e6761f00dda35"}, + {file = "greenlet-3.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:269d06fa0f9624455ce08ae0179430eea61085e3cf6457f05982b37fd2cefe17"}, + {file = "greenlet-3.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:9adbd8ecf097e34ada8efde9b6fec4dd2a903b1e98037adf72d12993a1c80b51"}, + {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6b5ce7f40f0e2f8b88c28e6691ca6806814157ff05e794cdd161be928550f4c"}, + {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecf94aa539e97a8411b5ea52fc6ccd8371be9550c4041011a091eb8b3ca1d810"}, + {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80dcd3c938cbcac986c5c92779db8e8ce51a89a849c135172c88ecbdc8c056b7"}, + {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e52a712c38e5fb4fd68e00dc3caf00b60cb65634d50e32281a9d6431b33b4af1"}, + {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5539f6da3418c3dc002739cb2bb8d169056aa66e0c83f6bacae0cd3ac26b423"}, + {file = "greenlet-3.0.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:343675e0da2f3c69d3fb1e894ba0a1acf58f481f3b9372ce1eb465ef93cf6fed"}, + {file = "greenlet-3.0.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:abe1ef3d780de56defd0c77c5ba95e152f4e4c4e12d7e11dd8447d338b85a625"}, + {file = "greenlet-3.0.0-cp37-cp37m-win32.whl", hash = "sha256:e693e759e172fa1c2c90d35dea4acbdd1d609b6936115d3739148d5e4cd11947"}, + {file = "greenlet-3.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bdd696947cd695924aecb3870660b7545a19851f93b9d327ef8236bfc49be705"}, + {file = "greenlet-3.0.0-cp37-universal2-macosx_11_0_x86_64.whl", hash = "sha256:cc3e2679ea13b4de79bdc44b25a0c4fcd5e94e21b8f290791744ac42d34a0353"}, + {file = "greenlet-3.0.0-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:63acdc34c9cde42a6534518e32ce55c30f932b473c62c235a466469a710bfbf9"}, + {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a1a6244ff96343e9994e37e5b4839f09a0207d35ef6134dce5c20d260d0302c"}, + {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b822fab253ac0f330ee807e7485769e3ac85d5eef827ca224feaaefa462dc0d0"}, + {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8060b32d8586e912a7b7dac2d15b28dbbd63a174ab32f5bc6d107a1c4143f40b"}, + {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:621fcb346141ae08cb95424ebfc5b014361621b8132c48e538e34c3c93ac7365"}, + {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6bb36985f606a7c49916eff74ab99399cdfd09241c375d5a820bb855dfb4af9f"}, + {file = "greenlet-3.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:10b5582744abd9858947d163843d323d0b67be9432db50f8bf83031032bc218d"}, + {file = "greenlet-3.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f351479a6914fd81a55c8e68963609f792d9b067fb8a60a042c585a621e0de4f"}, + {file = "greenlet-3.0.0-cp38-cp38-win32.whl", hash = "sha256:9de687479faec7db5b198cc365bc34addd256b0028956501f4d4d5e9ca2e240a"}, + {file = "greenlet-3.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:3fd2b18432e7298fcbec3d39e1a0aa91ae9ea1c93356ec089421fabc3651572b"}, + {file = "greenlet-3.0.0-cp38-universal2-macosx_11_0_x86_64.whl", hash = "sha256:3c0d36f5adc6e6100aedbc976d7428a9f7194ea79911aa4bf471f44ee13a9464"}, + {file = "greenlet-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4cd83fb8d8e17633ad534d9ac93719ef8937568d730ef07ac3a98cb520fd93e4"}, + {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a5b2d4cdaf1c71057ff823a19d850ed5c6c2d3686cb71f73ae4d6382aaa7a06"}, + {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e7dcdfad252f2ca83c685b0fa9fba00e4d8f243b73839229d56ee3d9d219314"}, + {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c94e4e924d09b5a3e37b853fe5924a95eac058cb6f6fb437ebb588b7eda79870"}, + {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad6fb737e46b8bd63156b8f59ba6cdef46fe2b7db0c5804388a2d0519b8ddb99"}, + {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d55db1db455c59b46f794346efce896e754b8942817f46a1bada2d29446e305a"}, + {file = "greenlet-3.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:56867a3b3cf26dc8a0beecdb4459c59f4c47cdd5424618c08515f682e1d46692"}, + {file = "greenlet-3.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9a812224a5fb17a538207e8cf8e86f517df2080c8ee0f8c1ed2bdaccd18f38f4"}, + {file = "greenlet-3.0.0-cp39-cp39-win32.whl", hash = "sha256:0d3f83ffb18dc57243e0151331e3c383b05e5b6c5029ac29f754745c800f8ed9"}, + {file = "greenlet-3.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:831d6f35037cf18ca5e80a737a27d822d87cd922521d18ed3dbc8a6967be50ce"}, + {file = "greenlet-3.0.0-cp39-universal2-macosx_11_0_x86_64.whl", hash = "sha256:a048293392d4e058298710a54dfaefcefdf49d287cd33fb1f7d63d55426e4355"}, + {file = "greenlet-3.0.0.tar.gz", hash = "sha256:19834e3f91f485442adc1ee440171ec5d9a4840a1f7bd5ed97833544719ce10b"}, +>>>>>>> ddce84dd (modify: poetory install pymysql) ] [package.extras] @@ -3736,10 +3801,13 @@ files = [ {file = "lxml-4.9.3-cp27-cp27m-macosx_11_0_x86_64.whl", hash = "sha256:b0a545b46b526d418eb91754565ba5b63b1c0b12f9bd2f808c852d9b4b2f9b5c"}, {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:075b731ddd9e7f68ad24c635374211376aa05a281673ede86cbe1d1b3455279d"}, {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1e224d5755dba2f4a9498e150c43792392ac9b5380aa1b845f98a1618c94eeef"}, + {file = "lxml-4.9.3-cp27-cp27m-win32.whl", hash = "sha256:2c74524e179f2ad6d2a4f7caf70e2d96639c0954c943ad601a9e146c76408ed7"}, + {file = "lxml-4.9.3-cp27-cp27m-win_amd64.whl", hash = "sha256:4f1026bc732b6a7f96369f7bfe1a4f2290fb34dce00d8644bc3036fb351a4ca1"}, {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0781a98ff5e6586926293e59480b64ddd46282953203c76ae15dbbbf302e8bb"}, {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cef2502e7e8a96fe5ad686d60b49e1ab03e438bd9123987994528febd569868e"}, {file = "lxml-4.9.3-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b86164d2cff4d3aaa1f04a14685cbc072efd0b4f99ca5708b2ad1b9b5988a991"}, {file = "lxml-4.9.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:42871176e7896d5d45138f6d28751053c711ed4d48d8e30b498da155af39aebd"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:ae8b9c6deb1e634ba4f1930eb67ef6e6bf6a44b6eb5ad605642b2d6d5ed9ce3c"}, {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:411007c0d88188d9f621b11d252cce90c4a2d1a49db6c068e3c16422f306eab8"}, {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:cd47b4a0d41d2afa3e58e5bf1f62069255aa2fd6ff5ee41604418ca925911d76"}, {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e2cb47860da1f7e9a5256254b74ae331687b9672dfa780eed355c4c9c3dbd23"}, @@ -3748,6 +3816,7 @@ files = [ {file = "lxml-4.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:97047f0d25cd4bcae81f9ec9dc290ca3e15927c192df17331b53bebe0e3ff96d"}, {file = "lxml-4.9.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:1f447ea5429b54f9582d4b955f5f1985f278ce5cf169f72eea8afd9502973dd5"}, {file = "lxml-4.9.3-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:57d6ba0ca2b0c462f339640d22882acc711de224d769edf29962b09f77129cbf"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:9767e79108424fb6c3edf8f81e6730666a50feb01a328f4a016464a5893f835a"}, {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:71c52db65e4b56b8ddc5bb89fb2e66c558ed9d1a74a45ceb7dcb20c191c3df2f"}, {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d73d8ecf8ecf10a3bd007f2192725a34bd62898e8da27eb9d32a58084f93962b"}, {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0a3d3487f07c1d7f150894c238299934a2a074ef590b583103a45002035be120"}, @@ -3767,6 +3836,7 @@ files = [ {file = "lxml-4.9.3-cp36-cp36m-macosx_11_0_x86_64.whl", hash = "sha256:64f479d719dc9f4c813ad9bb6b28f8390360660b73b2e4beb4cb0ae7104f1c12"}, {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:dd708cf4ee4408cf46a48b108fb9427bfa00b9b85812a9262b5c668af2533ea5"}, {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c31c7462abdf8f2ac0577d9f05279727e698f97ecbb02f17939ea99ae8daa98"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e3cd95e10c2610c360154afdc2f1480aea394f4a4f1ea0a5eacce49640c9b190"}, {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:4930be26af26ac545c3dffb662521d4e6268352866956672231887d18f0eaab2"}, {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4aec80cde9197340bc353d2768e2a75f5f60bacda2bab72ab1dc499589b3878c"}, {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:14e019fd83b831b2e61baed40cab76222139926b1fb5ed0e79225bc0cae14584"}, @@ -3776,6 +3846,7 @@ files = [ {file = "lxml-4.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bef4e656f7d98aaa3486d2627e7d2df1157d7e88e7efd43a65aa5dd4714916cf"}, {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:46f409a2d60f634fe550f7133ed30ad5321ae2e6630f13657fb9479506b00601"}, {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:4c28a9144688aef80d6ea666c809b4b0e50010a2aca784c97f5e6bf143d9f129"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:141f1d1a9b663c679dc524af3ea1773e618907e96075262726c7612c02b149a4"}, {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:53ace1c1fd5a74ef662f844a0413446c0629d151055340e9893da958a374f70d"}, {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17a753023436a18e27dd7769e798ce302963c236bc4114ceee5b25c18c52c693"}, {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7d298a1bd60c067ea75d9f684f5f3992c9d6766fadbc0bcedd39750bf344c2f4"}, @@ -3785,6 +3856,7 @@ files = [ {file = "lxml-4.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:120fa9349a24c7043854c53cae8cec227e1f79195a7493e09e0c12e29f918e52"}, {file = "lxml-4.9.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4d2d1edbca80b510443f51afd8496be95529db04a509bc8faee49c7b0fb6d2cc"}, {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8d7e43bd40f65f7d97ad8ef5c9b1778943d02f04febef12def25f7583d19baac"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:71d66ee82e7417828af6ecd7db817913cb0cf9d4e61aa0ac1fde0583d84358db"}, {file = "lxml-4.9.3-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:6fc3c450eaa0b56f815c7b62f2b7fba7266c4779adcf1cece9e6deb1de7305ce"}, {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65299ea57d82fb91c7f019300d24050c4ddeb7c5a190e076b5f48a2b43d19c42"}, {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:eadfbbbfb41b44034a4c757fd5d70baccd43296fb894dba0295606a7cf3124aa"}, @@ -3794,6 +3866,7 @@ files = [ {file = "lxml-4.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:92af161ecbdb2883c4593d5ed4815ea71b31fafd7fd05789b23100d081ecac96"}, {file = "lxml-4.9.3-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:9bb6ad405121241e99a86efff22d3ef469024ce22875a7ae045896ad23ba2340"}, {file = "lxml-4.9.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8ed74706b26ad100433da4b9d807eae371efaa266ffc3e9191ea436087a9d6a7"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fbf521479bcac1e25a663df882c46a641a9bff6b56dc8b0fafaebd2f66fb231b"}, {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:303bf1edce6ced16bf67a18a1cf8339d0db79577eec5d9a6d4a80f0fb10aa2da"}, {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:5515edd2a6d1a5a70bfcdee23b42ec33425e405c5b351478ab7dc9347228f96e"}, {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:690dafd0b187ed38583a648076865d8c229661ed20e48f2335d68e2cf7dc829d"}, @@ -3804,13 +3877,16 @@ files = [ {file = "lxml-4.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:4dd9a263e845a72eacb60d12401e37c616438ea2e5442885f65082c276dfb2b2"}, {file = "lxml-4.9.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6689a3d7fd13dc687e9102a27e98ef33730ac4fe37795d5036d18b4d527abd35"}, {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:f6bdac493b949141b733c5345b6ba8f87a226029cbabc7e9e121a413e49441e0"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:05186a0f1346ae12553d66df1cfce6f251589fea3ad3da4f3ef4e34b2d58c6a3"}, {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c2006f5c8d28dee289f7020f721354362fa304acbaaf9745751ac4006650254b"}, {file = "lxml-4.9.3-pp38-pypy38_pp73-macosx_11_0_x86_64.whl", hash = "sha256:5c245b783db29c4e4fbbbfc9c5a78be496c9fea25517f90606aa1f6b2b3d5f7b"}, {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4fb960a632a49f2f089d522f70496640fdf1218f1243889da3822e0a9f5f3ba7"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:50670615eaf97227d5dc60de2dc99fb134a7130d310d783314e7724bf163f75d"}, {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9719fe17307a9e814580af1f5c6e05ca593b12fb7e44fe62450a5384dbf61b4b"}, {file = "lxml-4.9.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3331bece23c9ee066e0fb3f96c61322b9e0f54d775fccefff4c38ca488de283a"}, {file = "lxml-4.9.3-pp39-pypy39_pp73-macosx_11_0_x86_64.whl", hash = "sha256:ed667f49b11360951e201453fc3967344d0d0263aa415e1619e85ae7fd17b4e0"}, {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8b77946fd508cbf0fccd8e400a7f71d4ac0e1595812e66025bac475a8e811694"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e4da8ca0c0c0aea88fd46be8e44bd49716772358d648cce45fe387f7b92374a7"}, {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fe4bda6bd4340caa6e5cf95e73f8fea5c4bfc55763dd42f1b50a94c1b4a2fbd4"}, {file = "lxml-4.9.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f3df3db1d336b9356dd3112eae5f5c2b8b377f3bc826848567f10bfddfee77e9"}, {file = "lxml-4.9.3.tar.gz", hash = "sha256:48628bd53a426c9eb9bc066a923acaa0878d1e86129fd5359aee99285f4eed9c"}, @@ -3892,6 +3968,16 @@ files = [ {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, @@ -5363,6 +5449,17 @@ files = [ {file = "psycopg_binary-3.1.12-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:000838cb5ab7851116b462e58893a96b0f1e35864135a6283f3242a730ec45d3"}, {file = "psycopg_binary-3.1.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7949e1aefe339f04dbecac6aa036c9cd137a58f966c4b96ab933823c340ee12"}, {file = "psycopg_binary-3.1.12-cp311-cp311-win_amd64.whl", hash = "sha256:b32922872460575083487de41e17e8cf308c3550da02c704efe42960bc6c19de"}, + {file = "psycopg_binary-3.1.12-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:70054ada2f890d004dc3d5ff908e34aecb085fd599d40db2975c09a39c50dfc3"}, + {file = "psycopg_binary-3.1.12-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7544d6d74f5b5f9daafe8a4ed7d266787d62a2bf16f5120c45d42d1f4a856bc8"}, + {file = "psycopg_binary-3.1.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43197161099cb4e36a9ca44c10657908b619d7263ffcff30932ad4627430dc3c"}, + {file = "psycopg_binary-3.1.12-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68398cdf3aedd4042b1126b9aba34615f1ab592831483282f19f0159fce5ca75"}, + {file = "psycopg_binary-3.1.12-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77ae6cda3ffee2425aca9ea7af57296d0c701e2ac5897b48b95dfee050234592"}, + {file = "psycopg_binary-3.1.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:278e8888e90fb6ebd7eae8ccb85199eafd712b734e641e0d40f2a903e946102d"}, + {file = "psycopg_binary-3.1.12-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:047c4ba8d3089465b0a69c4c669128df43403867858d78da6b40b33788bfa89f"}, + {file = "psycopg_binary-3.1.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8248b11ac490bb74de80457ab0e9cef31c08164ff7b867031927a17e5c9e19ed"}, + {file = "psycopg_binary-3.1.12-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6979c02acb9783c6134ee516751b8f891a2d4db7f73ebecc9e92750283d6fb99"}, + {file = "psycopg_binary-3.1.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:eaf2375b724ad61ee82a5c2a849e57b12b3cb510ec8845084132bbb907cb3335"}, + {file = "psycopg_binary-3.1.12-cp312-cp312-win_amd64.whl", hash = "sha256:6177cfa6f872a9cc84dbfc7dc163af6ef01639c50acc9a441673f29c2305c37a"}, {file = "psycopg_binary-3.1.12-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b81427fd5a97c9b4ac12f3b8d985870b0c3866b5fc2e72e51cacd3630ffd6466"}, {file = "psycopg_binary-3.1.12-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f17a2c393879aa54f840540009d0e70a30d22ffa0038d81e258ac2c99b15d74"}, {file = "psycopg_binary-3.1.12-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c6a5d125a61101ef5ab7384206e43952fe2a5fca997b96d28a28a752512f900"}, @@ -5430,6 +5527,7 @@ files = [ {file = "psycopg2_binary-2.9.9-cp311-cp311-win32.whl", hash = "sha256:dc4926288b2a3e9fd7b50dc6a1909a13bbdadfc67d93f3374d984e56f885579d"}, {file = "psycopg2_binary-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:b76bedd166805480ab069612119ea636f5ab8f8771e640ae103e05a4aae3e417"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8532fd6e6e2dc57bcb3bc90b079c60de896d2128c5d9d6f24a63875a95a088cf"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0605eaed3eb239e87df0d5e3c6489daae3f7388d455d0c0b4df899519c6a38d"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f8544b092a29a6ddd72f3556a9fcf249ec412e10ad28be6a0c0d948924f2212"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d423c8d8a3c82d08fe8af900ad5b613ce3632a1249fd6a223941d0735fce493"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e5afae772c00980525f6d6ecf7cbca55676296b580c0e6abb407f15f3706996"}, @@ -5438,6 +5536,8 @@ files = [ {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cb16c65dcb648d0a43a2521f2f0a2300f40639f6f8c1ecbc662141e4e3e1ee07"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:911dda9c487075abd54e644ccdf5e5c16773470a6a5d3826fda76699410066fb"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:57fede879f08d23c85140a360c6a77709113efd1c993923c59fde17aa27599fe"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-win32.whl", hash = "sha256:64cf30263844fa208851ebb13b0732ce674d8ec6a0c86a4e160495d299ba3c93"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:81ff62668af011f9a48787564ab7eded4e9fb17a4a6a74af5ffa6a457400d2ab"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2293b001e319ab0d869d660a704942c9e2cce19745262a8aba2115ef41a0a42a"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ef7df18daf2c4c07e2695e8cfd5ee7f748a1d54d802330985a78d2a5a6dca9"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a602ea5aff39bb9fac6308e9c9d82b9a35c2bf288e184a816002c9fae930b77"}, @@ -5952,6 +6052,21 @@ snappy = ["python-snappy"] test = ["pytest (>=7)"] zstd = ["zstandard"] +[[package]] +name = "pymysql" +version = "1.0.2" +description = "Pure Python MySQL Driver" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyMySQL-1.0.2-py3-none-any.whl", hash = "sha256:41fc3a0c5013d5f039639442321185532e3e2c8924687abe6537de157d403641"}, + {file = "PyMySQL-1.0.2.tar.gz", hash = "sha256:816927a350f38d56072aeca5dfb10221fe1dc653745853d30a216637f5d7ad36"}, +] + +[package.extras] +ed25519 = ["PyNaCl (>=1.4.0)"] +rsa = ["cryptography"] + [[package]] name = "pyparsing" version = "2.4.7" @@ -6248,6 +6363,7 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -6255,8 +6371,15 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -6273,6 +6396,7 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -6280,6 +6404,7 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -7045,6 +7170,7 @@ description = "A set of python modules for machine learning and data mining" optional = true python-versions = ">=3.8" files = [ +<<<<<<< HEAD {file = "scikit-learn-1.3.2.tar.gz", hash = "sha256:a2f54c76accc15a34bfb9066e6c7a56c1e7235dda5762b990792330b52ccfb05"}, {file = "scikit_learn-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e326c0eb5cf4d6ba40f93776a20e9a7a69524c4db0757e7ce24ba222471ee8a1"}, {file = "scikit_learn-1.3.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:535805c2a01ccb40ca4ab7d081d771aea67e535153e35a1fd99418fcedd1648a"}, @@ -7071,6 +7197,34 @@ files = [ {file = "scikit_learn-1.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d08ada33e955c54355d909b9c06a4789a729977f165b8bae6f225ff0a60ec4a"}, {file = "scikit_learn-1.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:763f0ae4b79b0ff9cca0bf3716bcc9915bdacff3cebea15ec79652d1cc4fa5c9"}, {file = "scikit_learn-1.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:ed932ea780517b00dae7431e031faae6b49b20eb6950918eb83bd043237950e0"}, +======= + {file = "scikit-learn-1.3.1.tar.gz", hash = "sha256:1a231cced3ee3fa04756b4a7ab532dc9417acd581a330adff5f2c01ac2831fcf"}, + {file = "scikit_learn-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3153612ff8d36fa4e35ef8b897167119213698ea78f3fd130b4068e6f8d2da5a"}, + {file = "scikit_learn-1.3.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:6bb9490fdb8e7e00f1354621689187bef3cab289c9b869688f805bf724434755"}, + {file = "scikit_learn-1.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7135a03af71138669f19bc96e7d0cc8081aed4b3565cc3b131135d65fc642ba"}, + {file = "scikit_learn-1.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d8dee8c1f40eeba49a85fe378bdf70a07bb64aba1a08fda1e0f48d27edfc3e6"}, + {file = "scikit_learn-1.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:4d379f2b34096105a96bd857b88601dffe7389bd55750f6f29aaa37bc6272eb5"}, + {file = "scikit_learn-1.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14e8775eba072ab10866a7e0596bc9906873e22c4c370a651223372eb62de180"}, + {file = "scikit_learn-1.3.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:58b0c2490eff8355dc26e884487bf8edaccf2ba48d09b194fb2f3a026dd64f9d"}, + {file = "scikit_learn-1.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f66eddfda9d45dd6cadcd706b65669ce1df84b8549875691b1f403730bdef217"}, + {file = "scikit_learn-1.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c6448c37741145b241eeac617028ba6ec2119e1339b1385c9720dae31367f2be"}, + {file = "scikit_learn-1.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:c413c2c850241998168bbb3bd1bb59ff03b1195a53864f0b80ab092071af6028"}, + {file = "scikit_learn-1.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ef540e09873e31569bc8b02c8a9f745ee04d8e1263255a15c9969f6f5caa627f"}, + {file = "scikit_learn-1.3.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:9147a3a4df4d401e618713880be023e36109c85d8569b3bf5377e6cd3fecdeac"}, + {file = "scikit_learn-1.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2cd3634695ad192bf71645702b3df498bd1e246fc2d529effdb45a06ab028b4"}, + {file = "scikit_learn-1.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c275a06c5190c5ce00af0acbb61c06374087949f643ef32d355ece12c4db043"}, + {file = "scikit_learn-1.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:0e1aa8f206d0de814b81b41d60c1ce31f7f2c7354597af38fae46d9c47c45122"}, + {file = "scikit_learn-1.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:52b77cc08bd555969ec5150788ed50276f5ef83abb72e6f469c5b91a0009bbca"}, + {file = "scikit_learn-1.3.1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a683394bc3f80b7c312c27f9b14ebea7766b1f0a34faf1a2e9158d80e860ec26"}, + {file = "scikit_learn-1.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15d964d9eb181c79c190d3dbc2fff7338786bf017e9039571418a1d53dab236"}, + {file = "scikit_learn-1.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ce9233cdf0cdcf0858a5849d306490bf6de71fa7603a3835124e386e62f2311"}, + {file = "scikit_learn-1.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:1ec668ce003a5b3d12d020d2cde0abd64b262ac5f098b5c84cf9657deb9996a8"}, + {file = "scikit_learn-1.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ccbbedae99325628c1d1cbe3916b7ef58a1ce949672d8d39c8b190e10219fd32"}, + {file = "scikit_learn-1.3.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:845f81c7ceb4ea6bac64ab1c9f2ce8bef0a84d0f21f3bece2126adcc213dfecd"}, + {file = "scikit_learn-1.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8454d57a22d856f1fbf3091bd86f9ebd4bff89088819886dc0c72f47a6c30652"}, + {file = "scikit_learn-1.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d993fb70a1d78c9798b8f2f28705bfbfcd546b661f9e2e67aa85f81052b9c53"}, + {file = "scikit_learn-1.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:66f7bb1fec37d65f4ef85953e1df5d3c98a0f0141d394dcdaead5a6de9170347"}, +>>>>>>> ddce84dd (modify: poetory install pymysql) ] [package.dependencies] @@ -7360,8 +7514,12 @@ files = [ ] [package.dependencies] +<<<<<<< HEAD greenlet = {version = "!=0.4.17", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} typing-extensions = ">=4.2.0" +======= +greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} +>>>>>>> ddce84dd (modify: poetory install pymysql) [package.extras] aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] @@ -8927,4 +9085,8 @@ local = ["ctransformers", "llama-cpp-python", "sentence-transformers"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.11" +<<<<<<< HEAD content-hash = "27f6f86ca62ee5cfdae333daae4f043a745ed2fff0d958a201b514fac36068d4" +======= +content-hash = "e2580ab8f9412219c2e647fda0c424e28519e9d0febd885c72e27aeebc0dba8e" +>>>>>>> ddce84dd (modify: poetory install pymysql) diff --git a/pyproject.toml b/pyproject.toml index 3481d3ef9..5c1b11272 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -101,7 +101,12 @@ jq = "^1.6.0" boto3 = "^1.28.63" numexpr = "^2.8.6" qianfan = "0.0.5" +<<<<<<< HEAD pgvector = "^0.2.3" +======= +pymysql = "1.0.2" + +>>>>>>> ddce84dd (modify: poetory install pymysql) [tool.poetry.group.dev.dependencies] types-redis = "^4.6.0.5" From fe086518ea21bc38e9de09e9fce1e0cc76b7fe63 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Mon, 20 Nov 2023 17:56:57 +0900 Subject: [PATCH 004/203] modified: Dockerfile for cdk --- Dockerfile | 22 +++++++++++++--------- dev.Dockerfile | 18 ------------------ prod.Dockerfile | 15 +++++++++++++++ src/frontend/Dockerfile | 36 +++++++++++++++++++++++------------- src/frontend/dev.Dockerfile | 26 -------------------------- src/frontend/prod.Dockerfile | 16 ++++++++++++++++ 6 files changed, 67 insertions(+), 66 deletions(-) delete mode 100644 dev.Dockerfile create mode 100644 prod.Dockerfile delete mode 100644 src/frontend/dev.Dockerfile create mode 100644 src/frontend/prod.Dockerfile diff --git a/Dockerfile b/Dockerfile index 346348c0a..762c27f90 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,15 +1,19 @@ -FROM python:3.10-slim +FROM --platform=linux/amd64 python:3.10-slim -RUN apt-get update && apt-get install gcc g++ git make -y && apt-get clean \ - && rm -rf /var/lib/apt/lists/* -RUN useradd -m -u 1000 user -USER user -ENV HOME=/home/user \ - PATH=/home/user/.local/bin:$PATH +WORKDIR /app -WORKDIR $HOME/app +# Install Poetry +RUN apt-get update && apt-get install gcc g++ curl build-essential postgresql-server-dev-all -y +RUN curl -sSL https://install.python-poetry.org | python3 - +# # Add Poetry to PATH +ENV PATH="${PATH}:/root/.local/bin" +# # Copy the pyproject.toml and poetry.lock files +COPY poetry.lock pyproject.toml ./ +# Copy the rest of the application codes +COPY ./ ./ -COPY --chown=user . $HOME/app +# Install dependencies +RUN poetry config virtualenvs.create false && poetry install --no-interaction --no-ansi RUN pip install langflow>==0.5.0 -U --user CMD ["python", "-m", "langflow", "run", "--host", "0.0.0.0", "--port", "7860"] diff --git a/dev.Dockerfile b/dev.Dockerfile deleted file mode 100644 index ed3631516..000000000 --- a/dev.Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -FROM python:3.10-slim - -WORKDIR /app - -# Install Poetry -RUN apt-get update && apt-get install gcc g++ curl build-essential postgresql-server-dev-all -y -RUN curl -sSL https://install.python-poetry.org | python3 - -# # Add Poetry to PATH -ENV PATH="${PATH}:/root/.local/bin" -# # Copy the pyproject.toml and poetry.lock files -COPY poetry.lock pyproject.toml ./ -# Copy the rest of the application codes -COPY ./ ./ - -# Install dependencies -RUN poetry config virtualenvs.create false && poetry install --no-interaction --no-ansi - -CMD ["uvicorn", "--factory", "src.backend.langflow.main:create_app", "--host", "0.0.0.0", "--port", "7860", "--reload", "--log-level", "debug"] diff --git a/prod.Dockerfile b/prod.Dockerfile new file mode 100644 index 000000000..520c407de --- /dev/null +++ b/prod.Dockerfile @@ -0,0 +1,15 @@ +FROM python:3.10-slim + +RUN apt-get update && apt-get install gcc g++ git make -y && apt-get clean \ + && rm -rf /var/lib/apt/lists/* +RUN useradd -m -u 1000 user +USER user +ENV HOME=/home/user \ + PATH=/home/user/.local/bin:$PATH + +WORKDIR $HOME/app + +COPY --chown=user . $HOME/app + +RUN pip install langflow>==0.0.86 -U --user +CMD ["python", "-m", "langflow", "run", "--host", "0.0.0.0", "--port", "7860"] diff --git a/src/frontend/Dockerfile b/src/frontend/Dockerfile index 024eab562..612af5314 100644 --- a/src/frontend/Dockerfile +++ b/src/frontend/Dockerfile @@ -1,16 +1,26 @@ -FROM node:20-alpine as frontend_build +#baseline +FROM --platform=linux/amd64 node:19-bullseye-slim AS base +RUN mkdir -p /home/node/app +RUN chown -R node:node /home/node && chmod -R 770 /home/node +RUN apt-get update && apt-get install -y jq +WORKDIR /home/node/app + +# client build +FROM base AS builder-client ARG BACKEND_URL -WORKDIR /app +ENV BACKEND_URL $BACKEND_URL +RUN echo "BACKEND_URL: $BACKEND_URL" -COPY ./package.json ./package-lock.json ./tsconfig.json ./vite.config.ts ./index.html ./tailwind.config.js ./postcss.config.js ./prettier.config.js /app/ -RUN npm install -COPY ./src /app/src -RUN npm run build +WORKDIR /home/node/app +COPY --chown=node:node . ./ -FROM nginx -COPY --from=frontend_build /app/build/ /usr/share/nginx/html -COPY /nginx.conf /etc/nginx/conf.d/default.conf -COPY start-nginx.sh /start-nginx.sh -RUN chmod +x /start-nginx.sh -ENV BACKEND_URL=$BACKEND_URL -CMD ["/start-nginx.sh"] \ No newline at end of file +COPY ./set_proxy.sh . +RUN chmod +x set_proxy.sh && \ + cat set_proxy.sh | tr -d '\r' > set_proxy_unix.sh && \ + chmod +x set_proxy_unix.sh && \ + ./set_proxy_unix.sh + +USER node + +RUN npm install --loglevel warn +CMD ["npm", "run", "dev:docker"] \ No newline at end of file diff --git a/src/frontend/dev.Dockerfile b/src/frontend/dev.Dockerfile deleted file mode 100644 index 8678b02dd..000000000 --- a/src/frontend/dev.Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -#baseline -FROM node:19-bullseye-slim AS base -RUN mkdir -p /home/node/app -RUN chown -R node:node /home/node && chmod -R 770 /home/node -RUN apt-get update && apt-get install -y jq -WORKDIR /home/node/app - -# client build -FROM base AS builder-client -ARG BACKEND_URL -ENV BACKEND_URL $BACKEND_URL -RUN echo "BACKEND_URL: $BACKEND_URL" - -WORKDIR /home/node/app -COPY --chown=node:node . ./ - -COPY ./set_proxy.sh . -RUN chmod +x set_proxy.sh && \ - cat set_proxy.sh | tr -d '\r' > set_proxy_unix.sh && \ - chmod +x set_proxy_unix.sh && \ - ./set_proxy_unix.sh - -USER node - -RUN npm install --loglevel warn -CMD ["npm", "run", "dev:docker"] \ No newline at end of file diff --git a/src/frontend/prod.Dockerfile b/src/frontend/prod.Dockerfile new file mode 100644 index 000000000..024eab562 --- /dev/null +++ b/src/frontend/prod.Dockerfile @@ -0,0 +1,16 @@ +FROM node:20-alpine as frontend_build +ARG BACKEND_URL +WORKDIR /app + +COPY ./package.json ./package-lock.json ./tsconfig.json ./vite.config.ts ./index.html ./tailwind.config.js ./postcss.config.js ./prettier.config.js /app/ +RUN npm install +COPY ./src /app/src +RUN npm run build + +FROM nginx +COPY --from=frontend_build /app/build/ /usr/share/nginx/html +COPY /nginx.conf /etc/nginx/conf.d/default.conf +COPY start-nginx.sh /start-nginx.sh +RUN chmod +x /start-nginx.sh +ENV BACKEND_URL=$BACKEND_URL +CMD ["/start-nginx.sh"] \ No newline at end of file From 22b703235582fe5efe034c683ca5ffbfa95f7fbc Mon Sep 17 00:00:00 2001 From: nsxshota Date: Mon, 20 Nov 2023 19:18:34 +0900 Subject: [PATCH 005/203] add curl --- docker-compose.yml | 13 ++++++++++--- src/frontend/Dockerfile | 2 +- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 13d39e1f3..21d1ad8d5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,20 +1,25 @@ version: "3" +networks: + langflow: services: backend: build: context: ./ - dockerfile: ./dev.Dockerfile + dockerfile: ./Dockerfile + env_file: + - .env ports: - "7860:7860" volumes: - ./:/app command: bash -c "uvicorn --factory src.backend.langflow.main:create_app --host 0.0.0.0 --port 7860 --reload" - + networks: + - langflow frontend: build: context: ./src/frontend - dockerfile: ./dev.Dockerfile + dockerfile: ./Dockerfile args: - BACKEND_URL=http://backend:7860 environment: @@ -26,3 +31,5 @@ services: - ./src/frontend/src:/home/node/app/src - ./src/frontend/package.json:/home/node/app/package.json restart: on-failure + networks: + - langflow diff --git a/src/frontend/Dockerfile b/src/frontend/Dockerfile index 612af5314..0b33e09b8 100644 --- a/src/frontend/Dockerfile +++ b/src/frontend/Dockerfile @@ -2,7 +2,7 @@ FROM --platform=linux/amd64 node:19-bullseye-slim AS base RUN mkdir -p /home/node/app RUN chown -R node:node /home/node && chmod -R 770 /home/node -RUN apt-get update && apt-get install -y jq +RUN apt-get update && apt-get install -y jq curl WORKDIR /home/node/app # client build From d1a6567a62e0331ce65d3b941819a16543a588ce Mon Sep 17 00:00:00 2001 From: nsxshota Date: Mon, 20 Nov 2023 19:30:43 +0900 Subject: [PATCH 006/203] modified: backend dockerfile --- Dockerfile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 762c27f90..ce5715e1f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,5 +15,4 @@ COPY ./ ./ # Install dependencies RUN poetry config virtualenvs.create false && poetry install --no-interaction --no-ansi -RUN pip install langflow>==0.5.0 -U --user -CMD ["python", "-m", "langflow", "run", "--host", "0.0.0.0", "--port", "7860"] +CMD ["uvicorn", "--factory", "src.backend.langflow.main:create_app", "--host", "0.0.0.0", "--port", "7860", "--reload", "--log-level", "debug"] From 1f4a8743e13b11e34f6aa9ee58a402b3caea9cd7 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Mon, 20 Nov 2023 19:48:53 +0900 Subject: [PATCH 007/203] modify: poetry lock file --- poetry.lock | 106 ++----------------------------------------------- pyproject.toml | 6 +-- 2 files changed, 4 insertions(+), 108 deletions(-) diff --git a/poetry.lock b/poetry.lock index da925ca48..7d3a7ec01 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2456,7 +2456,6 @@ description = "Lightweight in-process concurrent programming" optional = false python-versions = ">=3.7" files = [ -<<<<<<< HEAD {file = "greenlet-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f89e21afe925fcfa655965ca8ea10f24773a1791400989ff32f467badfe4a064"}, {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28e89e232c7593d33cac35425b58950789962011cc274aa43ef8865f2e11f46d"}, {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8ba29306c5de7717b5761b9ea74f9c72b9e2b834e24aa984da99cbfc70157fd"}, @@ -2514,70 +2513,6 @@ files = [ {file = "greenlet-3.0.1-cp39-cp39-win32.whl", hash = "sha256:cf868e08690cb89360eebc73ba4be7fb461cfbc6168dd88e2fbbe6f31812cd57"}, {file = "greenlet-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:ac4a39d1abae48184d420aa8e5e63efd1b75c8444dd95daa3e03f6c6310e9619"}, {file = "greenlet-3.0.1.tar.gz", hash = "sha256:816bd9488a94cba78d93e1abb58000e8266fa9cc2aa9ccdd6eb0696acb24005b"}, -======= - {file = "greenlet-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e09dea87cc91aea5500262993cbd484b41edf8af74f976719dd83fe724644cd6"}, - {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f47932c434a3c8d3c86d865443fadc1fbf574e9b11d6650b656e602b1797908a"}, - {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bdfaeecf8cc705d35d8e6de324bf58427d7eafb55f67050d8f28053a3d57118c"}, - {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a68d670c8f89ff65c82b936275369e532772eebc027c3be68c6b87ad05ca695"}, - {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ad562a104cd41e9d4644f46ea37167b93190c6d5e4048fcc4b80d34ecb278f"}, - {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02a807b2a58d5cdebb07050efe3d7deaf915468d112dfcf5e426d0564aa3aa4a"}, - {file = "greenlet-3.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b1660a15a446206c8545edc292ab5c48b91ff732f91b3d3b30d9a915d5ec4779"}, - {file = "greenlet-3.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:813720bd57e193391dfe26f4871186cf460848b83df7e23e6bef698a7624b4c9"}, - {file = "greenlet-3.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:aa15a2ec737cb609ed48902b45c5e4ff6044feb5dcdfcf6fa8482379190330d7"}, - {file = "greenlet-3.0.0-cp310-universal2-macosx_11_0_x86_64.whl", hash = "sha256:7709fd7bb02b31908dc8fd35bfd0a29fc24681d5cc9ac1d64ad07f8d2b7db62f"}, - {file = "greenlet-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:211ef8d174601b80e01436f4e6905aca341b15a566f35a10dd8d1e93f5dbb3b7"}, - {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6512592cc49b2c6d9b19fbaa0312124cd4c4c8a90d28473f86f92685cc5fef8e"}, - {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:871b0a8835f9e9d461b7fdaa1b57e3492dd45398e87324c047469ce2fc9f516c"}, - {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b505fcfc26f4148551826a96f7317e02c400665fa0883fe505d4fcaab1dabfdd"}, - {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:123910c58234a8d40eaab595bc56a5ae49bdd90122dde5bdc012c20595a94c14"}, - {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:96d9ea57292f636ec851a9bb961a5cc0f9976900e16e5d5647f19aa36ba6366b"}, - {file = "greenlet-3.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0b72b802496cccbd9b31acea72b6f87e7771ccfd7f7927437d592e5c92ed703c"}, - {file = "greenlet-3.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:527cd90ba3d8d7ae7dceb06fda619895768a46a1b4e423bdb24c1969823b8362"}, - {file = "greenlet-3.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:37f60b3a42d8b5499be910d1267b24355c495064f271cfe74bf28b17b099133c"}, - {file = "greenlet-3.0.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1482fba7fbed96ea7842b5a7fc11d61727e8be75a077e603e8ab49d24e234383"}, - {file = "greenlet-3.0.0-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:be557119bf467d37a8099d91fbf11b2de5eb1fd5fc5b91598407574848dc910f"}, - {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73b2f1922a39d5d59cc0e597987300df3396b148a9bd10b76a058a2f2772fc04"}, - {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1e22c22f7826096ad503e9bb681b05b8c1f5a8138469b255eb91f26a76634f2"}, - {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1d363666acc21d2c204dd8705c0e0457d7b2ee7a76cb16ffc099d6799744ac99"}, - {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:334ef6ed8337bd0b58bb0ae4f7f2dcc84c9f116e474bb4ec250a8bb9bd797a66"}, - {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6672fdde0fd1a60b44fb1751a7779c6db487e42b0cc65e7caa6aa686874e79fb"}, - {file = "greenlet-3.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:952256c2bc5b4ee8df8dfc54fc4de330970bf5d79253c863fb5e6761f00dda35"}, - {file = "greenlet-3.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:269d06fa0f9624455ce08ae0179430eea61085e3cf6457f05982b37fd2cefe17"}, - {file = "greenlet-3.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:9adbd8ecf097e34ada8efde9b6fec4dd2a903b1e98037adf72d12993a1c80b51"}, - {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6b5ce7f40f0e2f8b88c28e6691ca6806814157ff05e794cdd161be928550f4c"}, - {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecf94aa539e97a8411b5ea52fc6ccd8371be9550c4041011a091eb8b3ca1d810"}, - {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80dcd3c938cbcac986c5c92779db8e8ce51a89a849c135172c88ecbdc8c056b7"}, - {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e52a712c38e5fb4fd68e00dc3caf00b60cb65634d50e32281a9d6431b33b4af1"}, - {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5539f6da3418c3dc002739cb2bb8d169056aa66e0c83f6bacae0cd3ac26b423"}, - {file = "greenlet-3.0.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:343675e0da2f3c69d3fb1e894ba0a1acf58f481f3b9372ce1eb465ef93cf6fed"}, - {file = "greenlet-3.0.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:abe1ef3d780de56defd0c77c5ba95e152f4e4c4e12d7e11dd8447d338b85a625"}, - {file = "greenlet-3.0.0-cp37-cp37m-win32.whl", hash = "sha256:e693e759e172fa1c2c90d35dea4acbdd1d609b6936115d3739148d5e4cd11947"}, - {file = "greenlet-3.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bdd696947cd695924aecb3870660b7545a19851f93b9d327ef8236bfc49be705"}, - {file = "greenlet-3.0.0-cp37-universal2-macosx_11_0_x86_64.whl", hash = "sha256:cc3e2679ea13b4de79bdc44b25a0c4fcd5e94e21b8f290791744ac42d34a0353"}, - {file = "greenlet-3.0.0-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:63acdc34c9cde42a6534518e32ce55c30f932b473c62c235a466469a710bfbf9"}, - {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a1a6244ff96343e9994e37e5b4839f09a0207d35ef6134dce5c20d260d0302c"}, - {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b822fab253ac0f330ee807e7485769e3ac85d5eef827ca224feaaefa462dc0d0"}, - {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8060b32d8586e912a7b7dac2d15b28dbbd63a174ab32f5bc6d107a1c4143f40b"}, - {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:621fcb346141ae08cb95424ebfc5b014361621b8132c48e538e34c3c93ac7365"}, - {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6bb36985f606a7c49916eff74ab99399cdfd09241c375d5a820bb855dfb4af9f"}, - {file = "greenlet-3.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:10b5582744abd9858947d163843d323d0b67be9432db50f8bf83031032bc218d"}, - {file = "greenlet-3.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f351479a6914fd81a55c8e68963609f792d9b067fb8a60a042c585a621e0de4f"}, - {file = "greenlet-3.0.0-cp38-cp38-win32.whl", hash = "sha256:9de687479faec7db5b198cc365bc34addd256b0028956501f4d4d5e9ca2e240a"}, - {file = "greenlet-3.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:3fd2b18432e7298fcbec3d39e1a0aa91ae9ea1c93356ec089421fabc3651572b"}, - {file = "greenlet-3.0.0-cp38-universal2-macosx_11_0_x86_64.whl", hash = "sha256:3c0d36f5adc6e6100aedbc976d7428a9f7194ea79911aa4bf471f44ee13a9464"}, - {file = "greenlet-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4cd83fb8d8e17633ad534d9ac93719ef8937568d730ef07ac3a98cb520fd93e4"}, - {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a5b2d4cdaf1c71057ff823a19d850ed5c6c2d3686cb71f73ae4d6382aaa7a06"}, - {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e7dcdfad252f2ca83c685b0fa9fba00e4d8f243b73839229d56ee3d9d219314"}, - {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c94e4e924d09b5a3e37b853fe5924a95eac058cb6f6fb437ebb588b7eda79870"}, - {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad6fb737e46b8bd63156b8f59ba6cdef46fe2b7db0c5804388a2d0519b8ddb99"}, - {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d55db1db455c59b46f794346efce896e754b8942817f46a1bada2d29446e305a"}, - {file = "greenlet-3.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:56867a3b3cf26dc8a0beecdb4459c59f4c47cdd5424618c08515f682e1d46692"}, - {file = "greenlet-3.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9a812224a5fb17a538207e8cf8e86f517df2080c8ee0f8c1ed2bdaccd18f38f4"}, - {file = "greenlet-3.0.0-cp39-cp39-win32.whl", hash = "sha256:0d3f83ffb18dc57243e0151331e3c383b05e5b6c5029ac29f754745c800f8ed9"}, - {file = "greenlet-3.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:831d6f35037cf18ca5e80a737a27d822d87cd922521d18ed3dbc8a6967be50ce"}, - {file = "greenlet-3.0.0-cp39-universal2-macosx_11_0_x86_64.whl", hash = "sha256:a048293392d4e058298710a54dfaefcefdf49d287cd33fb1f7d63d55426e4355"}, - {file = "greenlet-3.0.0.tar.gz", hash = "sha256:19834e3f91f485442adc1ee440171ec5d9a4840a1f7bd5ed97833544719ce10b"}, ->>>>>>> ddce84dd (modify: poetory install pymysql) ] [package.extras] @@ -4713,6 +4648,7 @@ optional = false python-versions = ">=3.7" files = [ {file = "opentelemetry_instrumentation-0.42b0-py3-none-any.whl", hash = "sha256:65ae54ddb90ca2d05d2d16bf6863173e7141eba1bbbf41fc9bbb02446adbe369"}, + {file = "opentelemetry_instrumentation-0.42b0.tar.gz", hash = "sha256:6a653a1fed0f76eea32885321d77c750483e987eeefa4cbf219fc83559543198"}, ] [package.dependencies] @@ -4728,6 +4664,7 @@ optional = false python-versions = ">=3.7" files = [ {file = "opentelemetry_instrumentation_aiohttp_client-0.42b0-py3-none-any.whl", hash = "sha256:130a58fe4a702a5c828e87190c1bba8321fd2ecdad0834daeb90b494e51369c7"}, + {file = "opentelemetry_instrumentation_aiohttp_client-0.42b0.tar.gz", hash = "sha256:6ac5b2181b02232e169a5c1540fe1d104592cd5d5993ffb3581e7ac659f673be"}, ] [package.dependencies] @@ -7170,7 +7107,6 @@ description = "A set of python modules for machine learning and data mining" optional = true python-versions = ">=3.8" files = [ -<<<<<<< HEAD {file = "scikit-learn-1.3.2.tar.gz", hash = "sha256:a2f54c76accc15a34bfb9066e6c7a56c1e7235dda5762b990792330b52ccfb05"}, {file = "scikit_learn-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e326c0eb5cf4d6ba40f93776a20e9a7a69524c4db0757e7ce24ba222471ee8a1"}, {file = "scikit_learn-1.3.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:535805c2a01ccb40ca4ab7d081d771aea67e535153e35a1fd99418fcedd1648a"}, @@ -7197,34 +7133,6 @@ files = [ {file = "scikit_learn-1.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d08ada33e955c54355d909b9c06a4789a729977f165b8bae6f225ff0a60ec4a"}, {file = "scikit_learn-1.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:763f0ae4b79b0ff9cca0bf3716bcc9915bdacff3cebea15ec79652d1cc4fa5c9"}, {file = "scikit_learn-1.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:ed932ea780517b00dae7431e031faae6b49b20eb6950918eb83bd043237950e0"}, -======= - {file = "scikit-learn-1.3.1.tar.gz", hash = "sha256:1a231cced3ee3fa04756b4a7ab532dc9417acd581a330adff5f2c01ac2831fcf"}, - {file = "scikit_learn-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3153612ff8d36fa4e35ef8b897167119213698ea78f3fd130b4068e6f8d2da5a"}, - {file = "scikit_learn-1.3.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:6bb9490fdb8e7e00f1354621689187bef3cab289c9b869688f805bf724434755"}, - {file = "scikit_learn-1.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7135a03af71138669f19bc96e7d0cc8081aed4b3565cc3b131135d65fc642ba"}, - {file = "scikit_learn-1.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d8dee8c1f40eeba49a85fe378bdf70a07bb64aba1a08fda1e0f48d27edfc3e6"}, - {file = "scikit_learn-1.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:4d379f2b34096105a96bd857b88601dffe7389bd55750f6f29aaa37bc6272eb5"}, - {file = "scikit_learn-1.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14e8775eba072ab10866a7e0596bc9906873e22c4c370a651223372eb62de180"}, - {file = "scikit_learn-1.3.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:58b0c2490eff8355dc26e884487bf8edaccf2ba48d09b194fb2f3a026dd64f9d"}, - {file = "scikit_learn-1.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f66eddfda9d45dd6cadcd706b65669ce1df84b8549875691b1f403730bdef217"}, - {file = "scikit_learn-1.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c6448c37741145b241eeac617028ba6ec2119e1339b1385c9720dae31367f2be"}, - {file = "scikit_learn-1.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:c413c2c850241998168bbb3bd1bb59ff03b1195a53864f0b80ab092071af6028"}, - {file = "scikit_learn-1.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ef540e09873e31569bc8b02c8a9f745ee04d8e1263255a15c9969f6f5caa627f"}, - {file = "scikit_learn-1.3.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:9147a3a4df4d401e618713880be023e36109c85d8569b3bf5377e6cd3fecdeac"}, - {file = "scikit_learn-1.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2cd3634695ad192bf71645702b3df498bd1e246fc2d529effdb45a06ab028b4"}, - {file = "scikit_learn-1.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c275a06c5190c5ce00af0acbb61c06374087949f643ef32d355ece12c4db043"}, - {file = "scikit_learn-1.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:0e1aa8f206d0de814b81b41d60c1ce31f7f2c7354597af38fae46d9c47c45122"}, - {file = "scikit_learn-1.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:52b77cc08bd555969ec5150788ed50276f5ef83abb72e6f469c5b91a0009bbca"}, - {file = "scikit_learn-1.3.1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a683394bc3f80b7c312c27f9b14ebea7766b1f0a34faf1a2e9158d80e860ec26"}, - {file = "scikit_learn-1.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15d964d9eb181c79c190d3dbc2fff7338786bf017e9039571418a1d53dab236"}, - {file = "scikit_learn-1.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ce9233cdf0cdcf0858a5849d306490bf6de71fa7603a3835124e386e62f2311"}, - {file = "scikit_learn-1.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:1ec668ce003a5b3d12d020d2cde0abd64b262ac5f098b5c84cf9657deb9996a8"}, - {file = "scikit_learn-1.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ccbbedae99325628c1d1cbe3916b7ef58a1ce949672d8d39c8b190e10219fd32"}, - {file = "scikit_learn-1.3.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:845f81c7ceb4ea6bac64ab1c9f2ce8bef0a84d0f21f3bece2126adcc213dfecd"}, - {file = "scikit_learn-1.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8454d57a22d856f1fbf3091bd86f9ebd4bff89088819886dc0c72f47a6c30652"}, - {file = "scikit_learn-1.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d993fb70a1d78c9798b8f2f28705bfbfcd546b661f9e2e67aa85f81052b9c53"}, - {file = "scikit_learn-1.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:66f7bb1fec37d65f4ef85953e1df5d3c98a0f0141d394dcdaead5a6de9170347"}, ->>>>>>> ddce84dd (modify: poetory install pymysql) ] [package.dependencies] @@ -7514,12 +7422,8 @@ files = [ ] [package.dependencies] -<<<<<<< HEAD greenlet = {version = "!=0.4.17", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} typing-extensions = ">=4.2.0" -======= -greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} ->>>>>>> ddce84dd (modify: poetory install pymysql) [package.extras] aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] @@ -9085,8 +8989,4 @@ local = ["ctransformers", "llama-cpp-python", "sentence-transformers"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.11" -<<<<<<< HEAD -content-hash = "27f6f86ca62ee5cfdae333daae4f043a745ed2fff0d958a201b514fac36068d4" -======= -content-hash = "e2580ab8f9412219c2e647fda0c424e28519e9d0febd885c72e27aeebc0dba8e" ->>>>>>> ddce84dd (modify: poetory install pymysql) +content-hash = "15e903d9e6bdb90cc93c3f9ccf14207f55f4a4674cb939020d480d5f7fabf2cf" diff --git a/pyproject.toml b/pyproject.toml index 5c1b11272..b3aeebe31 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -101,13 +101,9 @@ jq = "^1.6.0" boto3 = "^1.28.63" numexpr = "^2.8.6" qianfan = "0.0.5" -<<<<<<< HEAD pgvector = "^0.2.3" -======= pymysql = "1.0.2" ->>>>>>> ddce84dd (modify: poetory install pymysql) - [tool.poetry.group.dev.dependencies] types-redis = "^4.6.0.5" black = "^23.10.0" @@ -153,4 +149,4 @@ line-length = 120 [build-system] requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" +build-backend = "poetry.core.masonry.api" \ No newline at end of file From f2ad6a20366091bcaf7398087137d5b8c188005d Mon Sep 17 00:00:00 2001 From: nsxshota Date: Tue, 21 Nov 2023 09:56:46 +0900 Subject: [PATCH 008/203] modified: frontend cloudMap --- deploy/scripts/cdk/lib/construct/frontend.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/deploy/scripts/cdk/lib/construct/frontend.ts b/deploy/scripts/cdk/lib/construct/frontend.ts index e4463000d..e61bd9a75 100644 --- a/deploy/scripts/cdk/lib/construct/frontend.ts +++ b/deploy/scripts/cdk/lib/construct/frontend.ts @@ -63,7 +63,7 @@ export class FrontEndCluster extends Construct { }, ], }); - + const frontendServiceName = 'langflow-frontend-service' const frontendService = new ecs.FargateService( this, 'FrontendService', @@ -75,11 +75,18 @@ export class FrontEndCluster extends Construct { taskDefinition: frontendTaskDefinition, enableExecuteCommand: true, securityGroups: [props.ecsFrontSG], - // healthCheckGracePeriod: Duration.seconds(300), + cloudMapOptions: { + cloudMapNamespace: props.cloudmapNamespace, + containerPort: containerPort, + dnsRecordType: servicediscovery.DnsRecordType.A, + dnsTtl: Duration.seconds(10), + name: frontendServiceName + }, + healthCheckGracePeriod: Duration.seconds(1000), } ); - // props.targetGroup.addTarget(frontendService); + props.targetGroup.addTarget(frontendService); // // Create ALB and ECS Fargate Service // const frontService = new ecs_patterns.ApplicationLoadBalancedFargateService( From 5250f141304f4656b1e39098537a0d568b2ff096 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Tue, 21 Nov 2023 13:14:26 +0900 Subject: [PATCH 009/203] modified port --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 21d1ad8d5..50fe44441 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -25,7 +25,7 @@ services: environment: - VITE_PROXY_TARGET=http://backend:7860 ports: - - "3000:3000" + - "8080:3000" volumes: - ./src/frontend/public:/home/node/app/public - ./src/frontend/src:/home/node/app/src From 58726b15c5bceb9264c836f0109bc8b1314b3a51 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Tue, 21 Nov 2023 13:15:29 +0900 Subject: [PATCH 010/203] set env to backend --- deploy/scripts/cdk/lib/construct/backend.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/deploy/scripts/cdk/lib/construct/backend.ts b/deploy/scripts/cdk/lib/construct/backend.ts index 3d05fe616..8d99a610e 100644 --- a/deploy/scripts/cdk/lib/construct/backend.ts +++ b/deploy/scripts/cdk/lib/construct/backend.ts @@ -57,7 +57,9 @@ export class BackEndCluster extends Construct { }), environment:{ // user:pass@endpoint:port/dbname - "LANGFLOW_DATABASE_URL" : `mysql+pymysql://${ecs.Secret.fromSecretsManager(secretsDB, 'username')}:${ecs.Secret.fromSecretsManager(secretsDB, 'password')}@${ecs.Secret.fromSecretsManager(secretsDB, 'host')}:3306/${ecs.Secret.fromSecretsManager(secretsDB, 'dbname')}`, + // "LANGFLOW_DATABASE_URL" : `mysql+pymysql://${ecs.Secret.fromSecretsManager(secretsDB, 'username')}:${ecs.Secret.fromSecretsManager(secretsDB, 'password')}@${ecs.Secret.fromSecretsManager(secretsDB, 'host')}:3306/${ecs.Secret.fromSecretsManager(secretsDB, 'dbname')}`, + "LANGFLOW_DATABASE_URL" : "sqlite:///./langflow.db", + "LANGFLOW_LANGCHAIN_CACHE" : "SQLiteCache", "LANGFLOW_AUTO_LOGIN" : "false", "LANGFLOW_SUPERUSER" : "admin", "LANGFLOW_SUPERUSER_PASSWORD" : "1234567" From 5d75376f2ce83d3958b875f7efdcabbeb535b42a Mon Sep 17 00:00:00 2001 From: nsxshota Date: Tue, 21 Nov 2023 15:24:03 +0900 Subject: [PATCH 011/203] update cdk code --- deploy/scripts/cdk/lib/construct/backend.ts | 2 +- deploy/scripts/cdk/lib/construct/frontend.ts | 5 +++-- deploy/scripts/cdk/lib/construct/network.ts | 14 ++++++++++---- src/frontend/Dockerfile | 1 + 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/deploy/scripts/cdk/lib/construct/backend.ts b/deploy/scripts/cdk/lib/construct/backend.ts index 8d99a610e..62f56762a 100644 --- a/deploy/scripts/cdk/lib/construct/backend.ts +++ b/deploy/scripts/cdk/lib/construct/backend.ts @@ -78,7 +78,7 @@ export class BackEndCluster extends Construct { "password": ecs.Secret.fromSecretsManager(secretsDB, 'password'), }, }); - this.backendServiceName = 'langflow-backend-service' + this.backendServiceName = 'backend' const backendService = new ecs.FargateService(this, 'BackEndService', { cluster: props.cluster, serviceName: this.backendServiceName, diff --git a/deploy/scripts/cdk/lib/construct/frontend.ts b/deploy/scripts/cdk/lib/construct/frontend.ts index e61bd9a75..451438cc5 100644 --- a/deploy/scripts/cdk/lib/construct/frontend.ts +++ b/deploy/scripts/cdk/lib/construct/frontend.ts @@ -60,15 +60,16 @@ export class FrontEndCluster extends Construct { { containerPort: containerPort, protocol: ecs.Protocol.TCP, + appProtocol:ecs.AppProtocol.http, }, ], }); - const frontendServiceName = 'langflow-frontend-service' + const frontendServiceName = 'frontend' const frontendService = new ecs.FargateService( this, 'FrontendService', { - serviceName: 'langflow-frontend-service', + serviceName: frontendServiceName, cluster: props.cluster, desiredCount: 1, assignPublicIp: false, diff --git a/deploy/scripts/cdk/lib/construct/network.ts b/deploy/scripts/cdk/lib/construct/network.ts index 035a051bc..22f12d4ec 100644 --- a/deploy/scripts/cdk/lib/construct/network.ts +++ b/deploy/scripts/cdk/lib/construct/network.ts @@ -28,6 +28,9 @@ export class Network extends Construct { constructor(scope: Construct, id: string) { super(scope, id) + const alb_listen_port=80 + const front_service_port=3000 + const back_service_port=7860 // VPC等リソースの作成 this.vpc = new ec2.Vpc(scope, 'VPC', { @@ -75,7 +78,7 @@ export class Network extends Construct { description: 'for alb', vpc: this.vpc, }) - this.albSG.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(80)) + this.albSG.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(alb_listen_port)) this.alb = new elb.ApplicationLoadBalancer(this,'alb',{ internetFacing: true, //インターネットからのアクセスを許可するかどうか指定 @@ -84,10 +87,10 @@ export class Network extends Construct { vpc:this.vpc, }) - const listener = this.alb.addListener('Listener', { port: 80 }); + const listener = this.alb.addListener('Listener', { port: alb_listen_port }); this.targetGroup = listener.addTargets('targetGroup', { - port: 3000, + port: front_service_port, protocol: elb.ApplicationProtocol.HTTP, healthCheck: { enabled: true, @@ -114,7 +117,7 @@ export class Network extends Construct { description: 'for langflow-back-ecs', vpc: this.vpc, }) - this.ecsBackSG.addIngressRule(this.ecsFrontSG, ec2.Port.tcp(7860)) + this.ecsBackSG.addIngressRule(this.ecsFrontSG, ec2.Port.tcp(back_service_port)) // RDSに設定するセキュリティグループ this.dbSG = new ec2.SecurityGroup(scope, 'DBSecurityGroup', { @@ -150,6 +153,9 @@ export class Network extends Construct { assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), }); this.backendTaskRole.addToPolicy(ECSExecPolicyStatement); + // KendraとBedrockのアクセス権付与 + // this.backendTaskRole.addToPolicy(); + this.frontendTaskRole = new iam.Role(this, 'FrontendTaskRole', { assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), diff --git a/src/frontend/Dockerfile b/src/frontend/Dockerfile index 0b33e09b8..6479c5580 100644 --- a/src/frontend/Dockerfile +++ b/src/frontend/Dockerfile @@ -23,4 +23,5 @@ RUN chmod +x set_proxy.sh && \ USER node RUN npm install --loglevel warn +RUN npm update CMD ["npm", "run", "dev:docker"] \ No newline at end of file From dcf27590d9ba28d378b217d0af7efd590c876a23 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Tue, 21 Nov 2023 15:34:51 +0900 Subject: [PATCH 012/203] add: delete docker images sh --- deploy/scripts/cdk/delete-docker-images.sh | 3 +++ deploy/scripts/cdk/delete-ecr.sh | 8 ++++---- 2 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 deploy/scripts/cdk/delete-docker-images.sh diff --git a/deploy/scripts/cdk/delete-docker-images.sh b/deploy/scripts/cdk/delete-docker-images.sh new file mode 100644 index 000000000..1e1595008 --- /dev/null +++ b/deploy/scripts/cdk/delete-docker-images.sh @@ -0,0 +1,3 @@ +docker stop $(docker ps -aq) +docker rm $(docker ps -aq) +docker rmi -f $(docker images -aq) \ No newline at end of file diff --git a/deploy/scripts/cdk/delete-ecr.sh b/deploy/scripts/cdk/delete-ecr.sh index be7a5dab9..ebe837a8a 100644 --- a/deploy/scripts/cdk/delete-ecr.sh +++ b/deploy/scripts/cdk/delete-ecr.sh @@ -1,4 +1,4 @@ -aws cloudformation delete-stack --stack-name LangflowAppStack -aws ecr delete-repository --repository-name langflow-backend-repository --force -aws ecr delete-repository --repository-name langflow-frontend-repository --force -aws ecr describe-repositories --output json | jq -re ".repositories[].repositoryName" \ No newline at end of file +# aws cloudformation delete-stack --stack-name LangflowAppStack +# aws ecr delete-repository --repository-name langflow-backend-repository --force +# aws ecr delete-repository --repository-name langflow-frontend-repository --force +# aws ecr describe-repositories --output json | jq -re ".repositories[].repositoryName" \ No newline at end of file From a9ebac07ac33dd85b1e397824d776b7a213ce39f Mon Sep 17 00:00:00 2001 From: nsxshota Date: Tue, 21 Nov 2023 16:26:19 +0900 Subject: [PATCH 013/203] add: Bedrock Kendra policy statement --- deploy/scripts/cdk/lib/construct/network.ts | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/deploy/scripts/cdk/lib/construct/network.ts b/deploy/scripts/cdk/lib/construct/network.ts index 22f12d4ec..275fab545 100644 --- a/deploy/scripts/cdk/lib/construct/network.ts +++ b/deploy/scripts/cdk/lib/construct/network.ts @@ -148,13 +148,32 @@ export class Network extends Construct { 'logs:PutLogEvents', ], }); + // Bedrock roll + const BedrockPolicyStatement = new iam.PolicyStatement({ + sid: 'allowBedrockAccess', + resources: ['*'], + actions: [ + 'bedrock:*', + ], + }); + // Kendra roll + const KendraPolicyStatement = new iam.PolicyStatement({ + sid: 'allowKendraAccess', + resources: ['*'], + actions: [ + 'kendra:*' + ], + }); this.backendTaskRole = new iam.Role(this, 'BackendTaskRole', { assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), }); + // ECS Exec Policyの付与 this.backendTaskRole.addToPolicy(ECSExecPolicyStatement); // KendraとBedrockのアクセス権付与 - // this.backendTaskRole.addToPolicy(); + this.backendTaskRole.addToPolicy(KendraPolicyStatement); + this.backendTaskRole.addToPolicy(BedrockPolicyStatement); + this.frontendTaskRole = new iam.Role(this, 'FrontendTaskRole', { From 0e767711ef2cce4d815933f499e79156ec306a54 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Tue, 21 Nov 2023 16:34:41 +0900 Subject: [PATCH 014/203] add portMapping name option --- deploy/scripts/cdk/lib/construct/frontend.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deploy/scripts/cdk/lib/construct/frontend.ts b/deploy/scripts/cdk/lib/construct/frontend.ts index 451438cc5..e5aec96b6 100644 --- a/deploy/scripts/cdk/lib/construct/frontend.ts +++ b/deploy/scripts/cdk/lib/construct/frontend.ts @@ -43,7 +43,7 @@ export class FrontEndCluster extends Construct { taskRole: props.frontendTaskRole, } ); - + const frontendServiceName = 'frontend' frontendTaskDefinition.addContainer('frontendContainer', { image: ecs.ContainerImage.fromEcrRepository(props.ecrFrontEndRepository, "latest"), containerName:'langflow-front-container', @@ -58,13 +58,13 @@ export class FrontEndCluster extends Construct { }), portMappings: [ { + name:frontendServiceName, containerPort: containerPort, protocol: ecs.Protocol.TCP, appProtocol:ecs.AppProtocol.http, }, ], }); - const frontendServiceName = 'frontend' const frontendService = new ecs.FargateService( this, 'FrontendService', From 7a7f92e5558883843e3c066b8a11c6338ebed3d8 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Tue, 21 Nov 2023 16:51:06 +0900 Subject: [PATCH 015/203] add portMapping hostport --- deploy/scripts/cdk/lib/construct/frontend.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/deploy/scripts/cdk/lib/construct/frontend.ts b/deploy/scripts/cdk/lib/construct/frontend.ts index e5aec96b6..cb9e7085c 100644 --- a/deploy/scripts/cdk/lib/construct/frontend.ts +++ b/deploy/scripts/cdk/lib/construct/frontend.ts @@ -59,6 +59,7 @@ export class FrontEndCluster extends Construct { portMappings: [ { name:frontendServiceName, + hostPort:80, containerPort: containerPort, protocol: ecs.Protocol.TCP, appProtocol:ecs.AppProtocol.http, From aa44214fef5b56eb22e66be63c32940637291e64 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Tue, 21 Nov 2023 16:54:04 +0900 Subject: [PATCH 016/203] modified: hostport setting --- deploy/scripts/cdk/lib/construct/frontend.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/deploy/scripts/cdk/lib/construct/frontend.ts b/deploy/scripts/cdk/lib/construct/frontend.ts index cb9e7085c..e5aec96b6 100644 --- a/deploy/scripts/cdk/lib/construct/frontend.ts +++ b/deploy/scripts/cdk/lib/construct/frontend.ts @@ -59,7 +59,6 @@ export class FrontEndCluster extends Construct { portMappings: [ { name:frontendServiceName, - hostPort:80, containerPort: containerPort, protocol: ecs.Protocol.TCP, appProtocol:ecs.AppProtocol.http, From 9daee4ce1a3afd8430539156037cbd7015699e3c Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 23 Nov 2023 09:52:29 +0900 Subject: [PATCH 017/203] remove npm update --- src/frontend/Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/src/frontend/Dockerfile b/src/frontend/Dockerfile index 6479c5580..0b33e09b8 100644 --- a/src/frontend/Dockerfile +++ b/src/frontend/Dockerfile @@ -23,5 +23,4 @@ RUN chmod +x set_proxy.sh && \ USER node RUN npm install --loglevel warn -RUN npm update CMD ["npm", "run", "dev:docker"] \ No newline at end of file From b4101c27946b4a6b8eee2d41d7a91c5c9153af37 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 23 Nov 2023 09:54:41 +0900 Subject: [PATCH 018/203] set window.host and alembic.ini --- src/backend/langflow/alembic.ini | 2 +- src/frontend/src/modals/formModal/index.tsx | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/backend/langflow/alembic.ini b/src/backend/langflow/alembic.ini index 379661422..cba482993 100644 --- a/src/backend/langflow/alembic.ini +++ b/src/backend/langflow/alembic.ini @@ -63,7 +63,7 @@ version_path_separator = os # Use os.pathsep. Default configuration used for ne # This is the path to the db in the root of the project. # When the user runs the Langflow the database url will # be set dinamically. -sqlalchemy.url = sqlite:///../../../langflow.db +# sqlalchemy.url = sqlite:///../../../langflow.db [post_write_hooks] diff --git a/src/frontend/src/modals/formModal/index.tsx b/src/frontend/src/modals/formModal/index.tsx index f6f7c214f..6c8a733ef 100644 --- a/src/frontend/src/modals/formModal/index.tsx +++ b/src/frontend/src/modals/formModal/index.tsx @@ -197,7 +197,8 @@ export default function FormModal({ const isSecureProtocol = window.location.protocol === "https:" || window.location.port === "443"; const webSocketProtocol = isSecureProtocol ? "wss" : "ws"; - const host = isDevelopment ? "localhost:7860" : window.location.host; + // const host = isDevelopment ? "localhost:7860" : window.location.host; + const host = window.location.host; const chatEndpoint = `/api/v1/chat/${chatId}`; return `${ From ca8c0d8fd7fa30ef86a65527634ba25db2247e2c Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 23 Nov 2023 10:00:47 +0900 Subject: [PATCH 019/203] modify BACKEND_URL --- deploy/scripts/cdk/lib/construct/ecr.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/scripts/cdk/lib/construct/ecr.ts b/deploy/scripts/cdk/lib/construct/ecr.ts index 6e6db707b..96424b053 100644 --- a/deploy/scripts/cdk/lib/construct/ecr.ts +++ b/deploy/scripts/cdk/lib/construct/ecr.ts @@ -49,7 +49,7 @@ export class EcrRepository extends Construct { const dockerFrontEndImageAsset = new DockerImageAsset(this, "DockerFrontEndImageAsset", { directory: frontendPath, buildArgs:{ - "BACKEND_URL":`http://${props.cloudmapNamespace.namespaceName}:7860` + "BACKEND_URL":`http://backend.${props.cloudmapNamespace.namespaceName}:7860` }, exclude: excludeDir, platform: imagePlatform, From e34c561b28c09ca7bc33f61ac4e73eda580e76f4 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 23 Nov 2023 10:21:28 +0900 Subject: [PATCH 020/203] modify task memory and cpu --- deploy/scripts/cdk/lib/construct/backend.ts | 4 ++-- deploy/scripts/cdk/lib/construct/frontend.ts | 4 ++-- deploy/scripts/cdk/lib/construct/network.ts | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/deploy/scripts/cdk/lib/construct/backend.ts b/deploy/scripts/cdk/lib/construct/backend.ts index 62f56762a..f64a0f8fd 100644 --- a/deploy/scripts/cdk/lib/construct/backend.ts +++ b/deploy/scripts/cdk/lib/construct/backend.ts @@ -38,8 +38,8 @@ export class BackEndCluster extends Construct { this, 'BackEndTaskDef', { - memoryLimitMiB: 512, - cpu: 256, + memoryLimitMiB: 3072, + cpu: 512, executionRole: props.backendTaskExecutionRole, runtimePlatform:{ operatingSystemFamily: ecs.OperatingSystemFamily.LINUX, diff --git a/deploy/scripts/cdk/lib/construct/frontend.ts b/deploy/scripts/cdk/lib/construct/frontend.ts index e5aec96b6..6ac90e5f2 100644 --- a/deploy/scripts/cdk/lib/construct/frontend.ts +++ b/deploy/scripts/cdk/lib/construct/frontend.ts @@ -33,8 +33,8 @@ export class FrontEndCluster extends Construct { this, 'FrontendTaskDef', { - memoryLimitMiB: 512, - cpu: 256, + memoryLimitMiB: 3072, + cpu: 512, executionRole: props.frontendTaskExecutionRole, runtimePlatform:{ operatingSystemFamily: ecs.OperatingSystemFamily.LINUX, diff --git a/deploy/scripts/cdk/lib/construct/network.ts b/deploy/scripts/cdk/lib/construct/network.ts index 275fab545..9ce50adb3 100644 --- a/deploy/scripts/cdk/lib/construct/network.ts +++ b/deploy/scripts/cdk/lib/construct/network.ts @@ -56,10 +56,11 @@ export class Network extends Construct { ], natGateways: 1, }) - + // Cluster this.cluster = new ecs.Cluster(this, 'EcsCluster', { clusterName: 'langflow-cluster', vpc: this.vpc, + enableFargateCapacityProviders: true, }); // Private DNS From 9e8906e3091b2ecd9a43e94860b52016b970775f Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 23 Nov 2023 10:34:55 +0900 Subject: [PATCH 021/203] modify cpu --- deploy/scripts/cdk/lib/construct/backend.ts | 2 +- deploy/scripts/cdk/lib/construct/frontend.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deploy/scripts/cdk/lib/construct/backend.ts b/deploy/scripts/cdk/lib/construct/backend.ts index f64a0f8fd..b22ba62a8 100644 --- a/deploy/scripts/cdk/lib/construct/backend.ts +++ b/deploy/scripts/cdk/lib/construct/backend.ts @@ -39,7 +39,7 @@ export class BackEndCluster extends Construct { 'BackEndTaskDef', { memoryLimitMiB: 3072, - cpu: 512, + cpu: 1024, executionRole: props.backendTaskExecutionRole, runtimePlatform:{ operatingSystemFamily: ecs.OperatingSystemFamily.LINUX, diff --git a/deploy/scripts/cdk/lib/construct/frontend.ts b/deploy/scripts/cdk/lib/construct/frontend.ts index 6ac90e5f2..8238ed135 100644 --- a/deploy/scripts/cdk/lib/construct/frontend.ts +++ b/deploy/scripts/cdk/lib/construct/frontend.ts @@ -34,7 +34,7 @@ export class FrontEndCluster extends Construct { 'FrontendTaskDef', { memoryLimitMiB: 3072, - cpu: 512, + cpu: 1024, executionRole: props.frontendTaskExecutionRole, runtimePlatform:{ operatingSystemFamily: ecs.OperatingSystemFamily.LINUX, From 2b2d8f3a870ca3fa76a90affb4db8931ec0a3f81 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 23 Nov 2023 11:24:56 +0900 Subject: [PATCH 022/203] modify LANGFLOW_DATABASE_URL --- deploy/scripts/cdk/lib/construct/backend.ts | 6 +++--- src/backend/langflow/__main__.py | 11 ++++++----- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/deploy/scripts/cdk/lib/construct/backend.ts b/deploy/scripts/cdk/lib/construct/backend.ts index b22ba62a8..26100d711 100644 --- a/deploy/scripts/cdk/lib/construct/backend.ts +++ b/deploy/scripts/cdk/lib/construct/backend.ts @@ -57,9 +57,9 @@ export class BackEndCluster extends Construct { }), environment:{ // user:pass@endpoint:port/dbname - // "LANGFLOW_DATABASE_URL" : `mysql+pymysql://${ecs.Secret.fromSecretsManager(secretsDB, 'username')}:${ecs.Secret.fromSecretsManager(secretsDB, 'password')}@${ecs.Secret.fromSecretsManager(secretsDB, 'host')}:3306/${ecs.Secret.fromSecretsManager(secretsDB, 'dbname')}`, - "LANGFLOW_DATABASE_URL" : "sqlite:///./langflow.db", - "LANGFLOW_LANGCHAIN_CACHE" : "SQLiteCache", + // "LANGFLOW_DATABASE_URL" : `mysql+pymysql://${username}:${password}@${host}:3306/${dbname}`, + // "LANGFLOW_DATABASE_URL" : "sqlite:///./langflow.db", + // "LANGFLOW_LANGCHAIN_CACHE" : "SQLiteCache", "LANGFLOW_AUTO_LOGIN" : "false", "LANGFLOW_SUPERUSER" : "admin", "LANGFLOW_SUPERUSER_PASSWORD" : "1234567" diff --git a/src/backend/langflow/__main__.py b/src/backend/langflow/__main__.py index 1bdcf97f2..5665eb409 100644 --- a/src/backend/langflow/__main__.py +++ b/src/backend/langflow/__main__.py @@ -1,6 +1,7 @@ import platform import socket import sys +import os import time import webbrowser from pathlib import Path @@ -128,11 +129,11 @@ def run( dev: bool = typer.Option(False, help="Run in development mode (may contain bugs)"), # This variable does not work but is set by the .env file # and works with Pydantic - # database_url: str = typer.Option( - # None, - # help="Database URL to connect to. If not provided, a local SQLite database will be used.", - # envvar="LANGFLOW_DATABASE_URL", - # ), + database_url: str = typer.Option( + "mysql+pymysql://{}:{}@{}:3306/{}".format(os.environ["username"],os.environ["password"],os.environ["host"],os.environ["dbname"]), + help="Database URL to connect to. If not provided, a local SQLite database will be used.", + envvar="LANGFLOW_DATABASE_URL", + ), path: str = typer.Option( None, help="Path to the frontend directory containing build files. This is for development purposes only.", From 284ed0c1b7a66d20a7805652a90cc24aadd3d9c2 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 23 Nov 2023 12:34:34 +0900 Subject: [PATCH 023/203] add: iam construct --- deploy/scripts/cdk/lib/cdk-stack.ts | 8 ++- deploy/scripts/cdk/lib/construct/backend.ts | 1 + deploy/scripts/cdk/lib/construct/iam.ts | 74 +++++++++++++++++++++ deploy/scripts/cdk/lib/construct/index.ts | 1 + deploy/scripts/cdk/lib/construct/network.ts | 67 ------------------- 5 files changed, 82 insertions(+), 69 deletions(-) create mode 100644 deploy/scripts/cdk/lib/construct/iam.ts diff --git a/deploy/scripts/cdk/lib/cdk-stack.ts b/deploy/scripts/cdk/lib/cdk-stack.ts index f83fcb0f5..b991827f8 100644 --- a/deploy/scripts/cdk/lib/cdk-stack.ts +++ b/deploy/scripts/cdk/lib/cdk-stack.ts @@ -2,7 +2,7 @@ import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; import * as ecs from 'aws-cdk-lib/aws-ecs' -import { Network, EcrRepository, FrontEndCluster, BackEndCluster, Rds } from './construct'; +import { Network, EcrRepository, FrontEndCluster, BackEndCluster, Rds, EcsIAM } from './construct'; // import * as sqs from 'aws-cdk-lib/aws-sqs'; export class LangflowAppStack extends cdk.Stack { @@ -12,7 +12,11 @@ export class LangflowAppStack extends cdk.Stack { const arch = ecs.CpuArchitecture.X86_64 // VPC - const { vpc, cluster, alb, targetGroup, cloudmapNamespace, ecsFrontSG, ecsBackSG, dbSG, albSG, backendTaskRole, TaskExecutionRole, frontendTaskRole, backendLogGroup, frontendLogGroup} = new Network(this, 'Network') + const { vpc, cluster, alb, targetGroup, cloudmapNamespace, ecsFrontSG, ecsBackSG, dbSG, albSG, backendLogGroup, frontendLogGroup} = new Network(this, 'Network') + + // IAM + const { backendTaskRole, TaskExecutionRole, frontendTaskRole } = new EcsIAM(this, 'EcsIAM') + // ECR const { ecrFrontEndRepository,ecrBackEndRepository} = new EcrRepository(this, 'Ecr', { cloudmapNamespace:cloudmapNamespace, diff --git a/deploy/scripts/cdk/lib/construct/backend.ts b/deploy/scripts/cdk/lib/construct/backend.ts index 26100d711..e39d1e210 100644 --- a/deploy/scripts/cdk/lib/construct/backend.ts +++ b/deploy/scripts/cdk/lib/construct/backend.ts @@ -95,6 +95,7 @@ export class BackEndCluster extends Construct { vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS }, }); + // Secrets ManagerからのSecret取得ロール const ecsBackEndExecutionRole = iam.Role.fromRoleArn( this, "ecsBackEndExecutionRole", diff --git a/deploy/scripts/cdk/lib/construct/iam.ts b/deploy/scripts/cdk/lib/construct/iam.ts new file mode 100644 index 000000000..001ed11ec --- /dev/null +++ b/deploy/scripts/cdk/lib/construct/iam.ts @@ -0,0 +1,74 @@ +import { RemovalPolicy, Duration } from 'aws-cdk-lib' +import { Construct } from 'constructs' +import { + aws_ec2 as ec2, + aws_ecs as ecs, + aws_iam as iam, + aws_logs as logs, +} from 'aws-cdk-lib'; + +export class EcsIAM extends Construct { + readonly backendTaskRole: iam.Role; + readonly TaskExecutionRole: iam.Role; + readonly frontendTaskRole: iam.Role; + + constructor(scope: Construct, id: string) { + super(scope, id) + + // Policy Statements + // ECS Policy State + const ECSExecPolicyStatement = new iam.PolicyStatement({ + sid: 'allowECSExec', + resources: ['*'], + actions: [ + 'ecr:GetAuthorizationToken', + 'ecr:BatchCheckLayerAvailability', + 'ecr:GetDownloadUrlForLayer', + 'ecr:BatchGetImage', + ], + }); + // Bedrock Policy State + const BedrockPolicyStatement = new iam.PolicyStatement({ + sid: 'allowBedrockAccess', + resources: ['*'], + actions: [ + 'bedrock:*', + ], + }); + // Kendra Policy State + const KendraPolicyStatement = new iam.PolicyStatement({ + sid: 'allowKendraAccess', + resources: ['*'], + actions: [ + 'kendra:*' + ], + }); + + // FrontEnd Task Role + this.frontendTaskRole = new iam.Role(this, 'FrontendTaskRole', { + assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), + }); + this.frontendTaskRole.addToPolicy(ECSExecPolicyStatement); + + // BackEnd Task Role + this.backendTaskRole = new iam.Role(this, 'BackendTaskRole', { + assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), + }); + // ECS Exec Policyの付与 + this.backendTaskRole.addToPolicy(ECSExecPolicyStatement); + // KendraとBedrockのアクセス権付与 + this.backendTaskRole.addToPolicy(KendraPolicyStatement); + this.backendTaskRole.addToPolicy(BedrockPolicyStatement); + + // Task ExecutionRole -> ここは共通 + this.TaskExecutionRole = new iam.Role(this, 'TaskExecutionRole', { + assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), + managedPolicies: [ + { + managedPolicyArn: + 'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy', + }, + ], + }); + } +} \ No newline at end of file diff --git a/deploy/scripts/cdk/lib/construct/index.ts b/deploy/scripts/cdk/lib/construct/index.ts index 8ca22911a..8c2efcb1b 100644 --- a/deploy/scripts/cdk/lib/construct/index.ts +++ b/deploy/scripts/cdk/lib/construct/index.ts @@ -1,5 +1,6 @@ export * from './db'; export * from './ecr'; +export * from './iam'; export * from './frontend'; export * from './backend'; export * from './network'; \ No newline at end of file diff --git a/deploy/scripts/cdk/lib/construct/network.ts b/deploy/scripts/cdk/lib/construct/network.ts index 9ce50adb3..aa9e48dc5 100644 --- a/deploy/scripts/cdk/lib/construct/network.ts +++ b/deploy/scripts/cdk/lib/construct/network.ts @@ -3,8 +3,6 @@ import { Construct } from 'constructs' import { aws_ec2 as ec2, aws_ecs as ecs, - aws_dynamodb as dynamodb, - aws_iam as iam, aws_logs as logs, aws_servicediscovery as servicediscovery, aws_elasticloadbalancingv2 as elb, @@ -20,9 +18,6 @@ export class Network extends Construct { readonly ecsBackSG: ec2.SecurityGroup; readonly dbSG: ec2.SecurityGroup; readonly albSG: ec2.SecurityGroup; - readonly backendTaskRole: iam.Role; - readonly TaskExecutionRole: iam.Role; - readonly frontendTaskRole: iam.Role; readonly backendLogGroup: logs.LogGroup; readonly frontendLogGroup: logs.LogGroup; @@ -129,68 +124,6 @@ export class Network extends Construct { }) // AppRunnerSecurityGroupからのポート3306:mysql(5432:postgres)のインバウンドを許可 this.dbSG.addIngressRule(this.ecsBackSG, ec2.Port.tcp(3306)) - - // ECS Policy State - const ECSExecPolicyStatement = new iam.PolicyStatement({ - sid: 'allowECSExec', - resources: ['*'], - actions: [ - 'ecr:GetAuthorizationToken', - 'ecr:BatchCheckLayerAvailability', - 'ecr:GetDownloadUrlForLayer', - 'ecr:BatchGetImage', - 'ssmmessages:CreateControlChannel', - 'ssmmessages:CreateDataChannel', - 'ssmmessages:OpenControlChannel', - 'ssmmessages:OpenDataChannel', - 'logs:CreateLogStream', - 'logs:DescribeLogGroups', - 'logs:DescribeLogStreams', - 'logs:PutLogEvents', - ], - }); - // Bedrock roll - const BedrockPolicyStatement = new iam.PolicyStatement({ - sid: 'allowBedrockAccess', - resources: ['*'], - actions: [ - 'bedrock:*', - ], - }); - // Kendra roll - const KendraPolicyStatement = new iam.PolicyStatement({ - sid: 'allowKendraAccess', - resources: ['*'], - actions: [ - 'kendra:*' - ], - }); - - this.backendTaskRole = new iam.Role(this, 'BackendTaskRole', { - assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), - }); - // ECS Exec Policyの付与 - this.backendTaskRole.addToPolicy(ECSExecPolicyStatement); - // KendraとBedrockのアクセス権付与 - this.backendTaskRole.addToPolicy(KendraPolicyStatement); - this.backendTaskRole.addToPolicy(BedrockPolicyStatement); - - - - this.frontendTaskRole = new iam.Role(this, 'FrontendTaskRole', { - assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), - }); - this.frontendTaskRole.addToPolicy(ECSExecPolicyStatement); - - this.TaskExecutionRole = new iam.Role(this, 'TaskExecutionRole', { - assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), - managedPolicies: [ - { - managedPolicyArn: - 'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy', - }, - ], - }); // Create CloudWatch Log Group this.backendLogGroup = new logs.LogGroup(this, 'backendLogGroup', { From 0695a44a26380f79d8b2b53d353ddb29d1bc2880 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 23 Nov 2023 12:45:45 +0900 Subject: [PATCH 024/203] add: iam construct --- deploy/scripts/cdk/lib/cdk-stack.ts | 12 +++--- deploy/scripts/cdk/lib/construct/backend.ts | 14 ------- deploy/scripts/cdk/lib/construct/iam.ts | 45 ++++++++++++++++----- 3 files changed, 42 insertions(+), 29 deletions(-) diff --git a/deploy/scripts/cdk/lib/cdk-stack.ts b/deploy/scripts/cdk/lib/cdk-stack.ts index b991827f8..3ef9abd23 100644 --- a/deploy/scripts/cdk/lib/cdk-stack.ts +++ b/deploy/scripts/cdk/lib/cdk-stack.ts @@ -13,9 +13,6 @@ export class LangflowAppStack extends cdk.Stack { // VPC const { vpc, cluster, alb, targetGroup, cloudmapNamespace, ecsFrontSG, ecsBackSG, dbSG, albSG, backendLogGroup, frontendLogGroup} = new Network(this, 'Network') - - // IAM - const { backendTaskRole, TaskExecutionRole, frontendTaskRole } = new EcsIAM(this, 'EcsIAM') // ECR const { ecrFrontEndRepository,ecrBackEndRepository} = new EcrRepository(this, 'Ecr', { @@ -27,12 +24,17 @@ export class LangflowAppStack extends cdk.Stack { // VPCとSGのリソース情報をPropsとして引き渡す const { rdsCluster } = new Rds(this, 'Rds', { vpc, dbSG }) + // IAM + const { frontendTaskRole, frontendTaskExecutionRole, backendTaskRole, backendTaskExecutionRole } = new EcsIAM(this, 'EcsIAM',{ + rdsCluster:rdsCluster + }) + const backendService = new BackEndCluster(this, 'backend', { cluster:cluster, ecsBackSG:ecsBackSG, ecrBackEndRepository:ecrBackEndRepository, backendTaskRole:backendTaskRole, - backendTaskExecutionRole:TaskExecutionRole, + backendTaskExecutionRole:backendTaskExecutionRole, backendLogGroup:backendLogGroup, cloudmapNamespace:cloudmapNamespace, rdsCluster:rdsCluster, @@ -47,7 +49,7 @@ export class LangflowAppStack extends cdk.Stack { targetGroup: targetGroup, backendServiceName: backendService.backendServiceName, frontendTaskRole: frontendTaskRole, - frontendTaskExecutionRole: TaskExecutionRole, + frontendTaskExecutionRole: frontendTaskExecutionRole, frontendLogGroup: frontendLogGroup, cloudmapNamespace: cloudmapNamespace, arch:arch diff --git a/deploy/scripts/cdk/lib/construct/backend.ts b/deploy/scripts/cdk/lib/construct/backend.ts index e39d1e210..7863f0d3d 100644 --- a/deploy/scripts/cdk/lib/construct/backend.ts +++ b/deploy/scripts/cdk/lib/construct/backend.ts @@ -95,19 +95,5 @@ export class BackEndCluster extends Construct { vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS }, }); - // Secrets ManagerからのSecret取得ロール - const ecsBackEndExecutionRole = iam.Role.fromRoleArn( - this, - "ecsBackEndExecutionRole", - backendService.taskDefinition.executionRole!.roleArn, - {} - ); - ecsBackEndExecutionRole.attachInlinePolicy(new iam.Policy(this, 'SMGetPolicy', { - statements: [new iam.PolicyStatement({ - actions: ['secretsmanager:GetSecretValue'], - resources: [secretsDB.secretArn], - })], - })); - } } \ No newline at end of file diff --git a/deploy/scripts/cdk/lib/construct/iam.ts b/deploy/scripts/cdk/lib/construct/iam.ts index 001ed11ec..6ee20051b 100644 --- a/deploy/scripts/cdk/lib/construct/iam.ts +++ b/deploy/scripts/cdk/lib/construct/iam.ts @@ -1,18 +1,22 @@ import { RemovalPolicy, Duration } from 'aws-cdk-lib' import { Construct } from 'constructs' +import { Props } from '../../cdk.out/asset.a565eb91ccb4c3ed87fd8f7d890173b077c2d2aa3a9837e3e4ecc8349b6a3483/src/frontend/src/types/components/index'; import { - aws_ec2 as ec2, - aws_ecs as ecs, + aws_rds as rds, aws_iam as iam, - aws_logs as logs, } from 'aws-cdk-lib'; -export class EcsIAM extends Construct { - readonly backendTaskRole: iam.Role; - readonly TaskExecutionRole: iam.Role; - readonly frontendTaskRole: iam.Role; +interface IAMProps { + rdsCluster:rds.DatabaseCluster +} - constructor(scope: Construct, id: string) { +export class EcsIAM extends Construct { + readonly frontendTaskRole: iam.Role; + readonly frontendTaskExecutionRole: iam.Role; + readonly backendTaskRole: iam.Role; + readonly backendTaskExecutionRole: iam.Role; + + constructor(scope: Construct, id: string, props:IAMProps) { super(scope, id) // Policy Statements @@ -60,8 +64,8 @@ export class EcsIAM extends Construct { this.backendTaskRole.addToPolicy(KendraPolicyStatement); this.backendTaskRole.addToPolicy(BedrockPolicyStatement); - // Task ExecutionRole -> ここは共通 - this.TaskExecutionRole = new iam.Role(this, 'TaskExecutionRole', { + // FrontEnd Task ExecutionRole + this.frontendTaskExecutionRole = new iam.Role(this, 'TaskExecutionRole', { assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), managedPolicies: [ { @@ -70,5 +74,26 @@ export class EcsIAM extends Construct { }, ], }); + + // Secrets ManagerからDB認証情報を取ってくる + const secretsDB = props.rdsCluster.secret!; + + // BackEnd Task ExecutionRole + this.backendTaskExecutionRole = new iam.Role(this, 'TaskExecutionRole', { + assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), + managedPolicies: [ + { + managedPolicyArn: + 'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy', + }, + ], + }); + + this.backendTaskExecutionRole.attachInlinePolicy(new iam.Policy(this, 'SMGetPolicy', { + statements: [new iam.PolicyStatement({ + actions: ['secretsmanager:GetSecretValue'], + resources: [secretsDB.secretArn], + })], + })); } } \ No newline at end of file From 422489c66ad6e6c90ab707f90b32fb919413fa78 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 23 Nov 2023 12:49:08 +0900 Subject: [PATCH 025/203] add: iam construct --- deploy/scripts/cdk/lib/construct/iam.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/deploy/scripts/cdk/lib/construct/iam.ts b/deploy/scripts/cdk/lib/construct/iam.ts index 6ee20051b..8c90341ea 100644 --- a/deploy/scripts/cdk/lib/construct/iam.ts +++ b/deploy/scripts/cdk/lib/construct/iam.ts @@ -1,6 +1,5 @@ import { RemovalPolicy, Duration } from 'aws-cdk-lib' import { Construct } from 'constructs' -import { Props } from '../../cdk.out/asset.a565eb91ccb4c3ed87fd8f7d890173b077c2d2aa3a9837e3e4ecc8349b6a3483/src/frontend/src/types/components/index'; import { aws_rds as rds, aws_iam as iam, From b048db616a8a4bf2b751313208edd012e5638fea Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 23 Nov 2023 12:53:26 +0900 Subject: [PATCH 026/203] add: iam construct --- deploy/scripts/cdk/lib/construct/iam.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deploy/scripts/cdk/lib/construct/iam.ts b/deploy/scripts/cdk/lib/construct/iam.ts index 8c90341ea..07d046232 100644 --- a/deploy/scripts/cdk/lib/construct/iam.ts +++ b/deploy/scripts/cdk/lib/construct/iam.ts @@ -64,7 +64,7 @@ export class EcsIAM extends Construct { this.backendTaskRole.addToPolicy(BedrockPolicyStatement); // FrontEnd Task ExecutionRole - this.frontendTaskExecutionRole = new iam.Role(this, 'TaskExecutionRole', { + this.frontendTaskExecutionRole = new iam.Role(this, 'frontendTaskExecutionRole', { assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), managedPolicies: [ { @@ -78,7 +78,7 @@ export class EcsIAM extends Construct { const secretsDB = props.rdsCluster.secret!; // BackEnd Task ExecutionRole - this.backendTaskExecutionRole = new iam.Role(this, 'TaskExecutionRole', { + this.backendTaskExecutionRole = new iam.Role(this, 'backendTaskExecutionRole', { assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), managedPolicies: [ { From ca723d6ce9b93116ff74373e842f1af36838fd1c Mon Sep 17 00:00:00 2001 From: nsxshota Date: Fri, 24 Nov 2023 19:14:37 +0900 Subject: [PATCH 027/203] add RAG policy to TaskExeRole --- deploy/scripts/cdk/lib/construct/iam.ts | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/deploy/scripts/cdk/lib/construct/iam.ts b/deploy/scripts/cdk/lib/construct/iam.ts index 07d046232..0a40cf340 100644 --- a/deploy/scripts/cdk/lib/construct/iam.ts +++ b/deploy/scripts/cdk/lib/construct/iam.ts @@ -46,6 +46,17 @@ export class EcsIAM extends Construct { 'kendra:*' ], }); + // Create Rag Policy + const RagAccessPolicy = new iam.Policy(this, 'RAGFullAccess', { + statements: [KendraPolicyStatement,BedrockPolicyStatement], + }) + // Secrets ManagerからDB認証情報を取ってくるためのPolicy + const SecretsManagerPolicy = new iam.Policy(this, 'SMGetPolicy', { + statements: [new iam.PolicyStatement({ + actions: ['secretsmanager:GetSecretValue'], + resources: [props.rdsCluster.secret!.secretArn], + })], + }) // FrontEnd Task Role this.frontendTaskRole = new iam.Role(this, 'FrontendTaskRole', { @@ -60,8 +71,7 @@ export class EcsIAM extends Construct { // ECS Exec Policyの付与 this.backendTaskRole.addToPolicy(ECSExecPolicyStatement); // KendraとBedrockのアクセス権付与 - this.backendTaskRole.addToPolicy(KendraPolicyStatement); - this.backendTaskRole.addToPolicy(BedrockPolicyStatement); + this.backendTaskRole.attachInlinePolicy(RagAccessPolicy); // FrontEnd Task ExecutionRole this.frontendTaskExecutionRole = new iam.Role(this, 'frontendTaskExecutionRole', { @@ -74,9 +84,6 @@ export class EcsIAM extends Construct { ], }); - // Secrets ManagerからDB認証情報を取ってくる - const secretsDB = props.rdsCluster.secret!; - // BackEnd Task ExecutionRole this.backendTaskExecutionRole = new iam.Role(this, 'backendTaskExecutionRole', { assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), @@ -88,11 +95,7 @@ export class EcsIAM extends Construct { ], }); - this.backendTaskExecutionRole.attachInlinePolicy(new iam.Policy(this, 'SMGetPolicy', { - statements: [new iam.PolicyStatement({ - actions: ['secretsmanager:GetSecretValue'], - resources: [secretsDB.secretArn], - })], - })); + this.backendTaskExecutionRole.attachInlinePolicy(SecretsManagerPolicy); + this.backendTaskExecutionRole.attachInlinePolicy(RagAccessPolicy); } } \ No newline at end of file From 90759feb2f11c893e8bd9f1ce4910dc0a03e8806 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Mon, 27 Nov 2023 00:06:26 +0900 Subject: [PATCH 028/203] modify: set_database_url --- src/backend/langflow/__main__.py | 14 +++---- .../langflow/services/settings/base.py | 38 ++++++++++--------- src/backend/langflow/settings.py | 6 ++- 3 files changed, 31 insertions(+), 27 deletions(-) diff --git a/src/backend/langflow/__main__.py b/src/backend/langflow/__main__.py index 5665eb409..87052677e 100644 --- a/src/backend/langflow/__main__.py +++ b/src/backend/langflow/__main__.py @@ -127,13 +127,13 @@ def run( default=None, ), dev: bool = typer.Option(False, help="Run in development mode (may contain bugs)"), - # This variable does not work but is set by the .env file - # and works with Pydantic - database_url: str = typer.Option( - "mysql+pymysql://{}:{}@{}:3306/{}".format(os.environ["username"],os.environ["password"],os.environ["host"],os.environ["dbname"]), - help="Database URL to connect to. If not provided, a local SQLite database will be used.", - envvar="LANGFLOW_DATABASE_URL", - ), + # # This variable does not work but is set by the .env file + # # and works with Pydantic + # database_url: str = typer.Option( + # "mysql+pymysql://{}:{}@{}:3306/{}".format(os.environ["username"],os.environ["password"],os.environ["host"],os.environ["dbname"]), + # help="Database URL to connect to. If not provided, a local SQLite database will be used.", + # envvar="LANGFLOW_DATABASE_URL", + # ), path: str = typer.Option( None, help="Path to the frontend directory containing build files. This is for development purposes only.", diff --git a/src/backend/langflow/services/settings/base.py b/src/backend/langflow/services/settings/base.py index 053c45afd..1f30aa3e0 100644 --- a/src/backend/langflow/services/settings/base.py +++ b/src/backend/langflow/services/settings/base.py @@ -86,29 +86,31 @@ class Settings(BaseSettings): value = langflow_database_url logger.debug("Using LANGFLOW_DATABASE_URL env variable.") else: - logger.debug("No DATABASE_URL env variable, using sqlite database") + # logger.debug("No DATABASE_URL env variable, using sqlite database") + logger.debug("No DATABASE_URL env variable, using custom database from secrets of {}".format(os.environ["host"])) # Originally, we used sqlite:///./langflow.db # so we need to migrate to the new format # if there is a database in that location - if not values["CONFIG_DIR"]: - raise ValueError( - "CONFIG_DIR not set, please set it or provide a DATABASE_URL" - ) + # if not values["CONFIG_DIR"]: + # raise ValueError( + # "CONFIG_DIR not set, please set it or provide a DATABASE_URL" + # ) - new_path = f"{values['CONFIG_DIR']}/langflow.db" - if Path("./langflow.db").exists(): - if Path(new_path).exists(): - logger.debug(f"Database already exists at {new_path}, using it") - else: - try: - logger.debug("Copying existing database to new location") - copy2("./langflow.db", new_path) - logger.debug(f"Copied existing database to {new_path}") - except Exception: - logger.error("Failed to copy database, using default path") - new_path = "./langflow.db" + # new_path = f"{values['CONFIG_DIR']}/langflow.db" + # if Path("./langflow.db").exists(): + # if Path(new_path).exists(): + # logger.debug(f"Database already exists at {new_path}, using it") + # else: + # try: + # logger.debug("Copying existing database to new location") + # copy2("./langflow.db", new_path) + # logger.debug(f"Copied existing database to {new_path}") + # except Exception: + # logger.error("Failed to copy database, using default path") + # new_path = "./langflow.db" - value = f"sqlite:///{new_path}" + # value = f"sqlite:///{new_path}" + value = "mysql+pymysql://{}:{}@{}:3306/{}".format(os.environ["username"],os.environ["password"],os.environ["host"],os.environ["dbname"]) return value diff --git a/src/backend/langflow/settings.py b/src/backend/langflow/settings.py index 6b6e81baf..ab9217d2c 100644 --- a/src/backend/langflow/settings.py +++ b/src/backend/langflow/settings.py @@ -46,8 +46,10 @@ class Settings(BaseSettings): value = langflow_database_url logger.debug("Using LANGFLOW_DATABASE_URL env variable.") else: - logger.debug("No DATABASE_URL env variable, using sqlite database") - value = "sqlite:///./langflow.db" + # logger.debug("No DATABASE_URL env variable, using sqlite database") + logger.debug("No DATABASE_URL env variable, using custom database from secrets of {}".format(os.environ["host"])) + # value = "sqlite:///./langflow.db" + value = "mysql+pymysql://{}:{}@{}:3306/{}".format(os.environ["username"],os.environ["password"],os.environ["host"],os.environ["dbname"]) return value From 6e3c8408f9177f7f4f526fdf3ebaf1bd4f5ed94c Mon Sep 17 00:00:00 2001 From: nsxshota Date: Mon, 27 Nov 2023 19:48:41 +0900 Subject: [PATCH 029/203] modified: add Dependency --- deploy/scripts/cdk/lib/cdk-stack.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/deploy/scripts/cdk/lib/cdk-stack.ts b/deploy/scripts/cdk/lib/cdk-stack.ts index 3ef9abd23..8b637cfcf 100644 --- a/deploy/scripts/cdk/lib/cdk-stack.ts +++ b/deploy/scripts/cdk/lib/cdk-stack.ts @@ -41,8 +41,9 @@ export class LangflowAppStack extends cdk.Stack { alb:alb, arch:arch }) + backendService.node.addDependency(rdsCluster); - new FrontEndCluster(this, 'frontend',{ + const frontendService = new FrontEndCluster(this, 'frontend',{ cluster:cluster, ecsFrontSG:ecsFrontSG, ecrFrontEndRepository:ecrFrontEndRepository, @@ -54,6 +55,8 @@ export class LangflowAppStack extends cdk.Stack { cloudmapNamespace: cloudmapNamespace, arch:arch }) + frontendService.node.addDependency(backendService); + // S3+CloudFront // new Web(this,'Cloudfront-S3') From 2730dbac8262fa1a620b394e264969acaf318660 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Wed, 29 Nov 2023 02:16:46 +0000 Subject: [PATCH 030/203] use env file --- deploy/scripts/cdk/.env.example | 3 +++ deploy/scripts/cdk/lib/construct/backend.ts | 16 +++++++++++++--- deploy/scripts/cdk/package-lock.json | 2 +- deploy/scripts/cdk/package.json | 2 +- 4 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 deploy/scripts/cdk/.env.example diff --git a/deploy/scripts/cdk/.env.example b/deploy/scripts/cdk/.env.example new file mode 100644 index 000000000..6ff0702f4 --- /dev/null +++ b/deploy/scripts/cdk/.env.example @@ -0,0 +1,3 @@ +LANGFLOW_AUTO_LOGIN=false +LANGFLOW_SUPERUSER=langflow +LANGFLOW_SUPERUSER_PASSWORD=654321 \ No newline at end of file diff --git a/deploy/scripts/cdk/lib/construct/backend.ts b/deploy/scripts/cdk/lib/construct/backend.ts index 7863f0d3d..4ddff1e00 100644 --- a/deploy/scripts/cdk/lib/construct/backend.ts +++ b/deploy/scripts/cdk/lib/construct/backend.ts @@ -10,6 +10,13 @@ import { aws_logs as logs, aws_elasticloadbalancingv2 as elb, } from 'aws-cdk-lib'; +import * as dotenv from 'dotenv'; +const path = require('path'); +dotenv.config({path: path.join(__dirname, "../../.env")}); + +console.log(process.env.LANGFLOW_AUTO_LOGIN); +console.log(process.env.LANGFLOW_SUPERUSER); +console.log(process.env.LANGFLOW_SUPERUSER_PASSWORD); interface BackEndProps { cluster: ecs.Cluster @@ -60,9 +67,12 @@ export class BackEndCluster extends Construct { // "LANGFLOW_DATABASE_URL" : `mysql+pymysql://${username}:${password}@${host}:3306/${dbname}`, // "LANGFLOW_DATABASE_URL" : "sqlite:///./langflow.db", // "LANGFLOW_LANGCHAIN_CACHE" : "SQLiteCache", - "LANGFLOW_AUTO_LOGIN" : "false", - "LANGFLOW_SUPERUSER" : "admin", - "LANGFLOW_SUPERUSER_PASSWORD" : "1234567" + // "LANGFLOW_AUTO_LOGIN" : "false", + // "LANGFLOW_SUPERUSER" : "admin", + // "LANGFLOW_SUPERUSER_PASSWORD" : "1234567" + "LANGFLOW_AUTO_LOGIN" : process.env.LANGFLOW_AUTO_LOGIN ?? 'false', + "LANGFLOW_SUPERUSER" : process.env.LANGFLOW_SUPERUSER ?? "admin", + "LANGFLOW_SUPERUSER_PASSWORD" : process.env.LANGFLOW_SUPERUSER_PASSWORD ?? "123456" }, portMappings: [ { diff --git a/deploy/scripts/cdk/package-lock.json b/deploy/scripts/cdk/package-lock.json index 3c19966e2..e5b70161b 100644 --- a/deploy/scripts/cdk/package-lock.json +++ b/deploy/scripts/cdk/package-lock.json @@ -8,7 +8,7 @@ "name": "cdk", "version": "0.1.0", "dependencies": { - "aws-cdk-lib": "2.86.0", + "aws-cdk-lib": "^2.86.0", "cdk-ecr-deployment": "^2.5.30", "constructs": "^10.0.0", "source-map-support": "^0.5.21" diff --git a/deploy/scripts/cdk/package.json b/deploy/scripts/cdk/package.json index c6643368b..05ef554d9 100644 --- a/deploy/scripts/cdk/package.json +++ b/deploy/scripts/cdk/package.json @@ -20,7 +20,7 @@ "typescript": "~5.1.3" }, "dependencies": { - "aws-cdk-lib": "2.86.0", + "aws-cdk-lib": "^2.86.0", "cdk-ecr-deployment": "^2.5.30", "constructs": "^10.0.0", "source-map-support": "^0.5.21" From 093d963a7c7f0b94647cdb2a8a2570dca0b22bd2 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 30 Nov 2023 16:31:13 +0900 Subject: [PATCH 031/203] move cdk folder to scripts/cdk --- deploy/scripts/cdk/.env.example | 3 - deploy/scripts/cdk/.gitignore | 9 - deploy/scripts/cdk/.npmignore | 6 - deploy/scripts/cdk/README.md | 14 - deploy/scripts/cdk/bin/cdk.ts | 21 - deploy/scripts/cdk/cdk.json | 55 - deploy/scripts/cdk/delete-docker-images.sh | 3 - deploy/scripts/cdk/delete-ecr.sh | 4 - deploy/scripts/cdk/jest.config.js | 8 - deploy/scripts/cdk/lib/cdk-stack.ts | 64 - deploy/scripts/cdk/lib/construct/backend.ts | 109 - deploy/scripts/cdk/lib/construct/db.ts | 64 - deploy/scripts/cdk/lib/construct/ecr.ts | 76 - deploy/scripts/cdk/lib/construct/frontend.ts | 117 - deploy/scripts/cdk/lib/construct/iam.ts | 101 - deploy/scripts/cdk/lib/construct/index.ts | 6 - deploy/scripts/cdk/lib/construct/network.ts | 139 - deploy/scripts/cdk/package-lock.json | 4601 ------------------ deploy/scripts/cdk/package.json | 28 - deploy/scripts/cdk/test/cdk.test.ts | 17 - 20 files changed, 5445 deletions(-) delete mode 100644 deploy/scripts/cdk/.env.example delete mode 100644 deploy/scripts/cdk/.gitignore delete mode 100644 deploy/scripts/cdk/.npmignore delete mode 100644 deploy/scripts/cdk/README.md delete mode 100644 deploy/scripts/cdk/bin/cdk.ts delete mode 100644 deploy/scripts/cdk/cdk.json delete mode 100644 deploy/scripts/cdk/delete-docker-images.sh delete mode 100644 deploy/scripts/cdk/delete-ecr.sh delete mode 100644 deploy/scripts/cdk/jest.config.js delete mode 100644 deploy/scripts/cdk/lib/cdk-stack.ts delete mode 100644 deploy/scripts/cdk/lib/construct/backend.ts delete mode 100644 deploy/scripts/cdk/lib/construct/db.ts delete mode 100644 deploy/scripts/cdk/lib/construct/ecr.ts delete mode 100644 deploy/scripts/cdk/lib/construct/frontend.ts delete mode 100644 deploy/scripts/cdk/lib/construct/iam.ts delete mode 100644 deploy/scripts/cdk/lib/construct/index.ts delete mode 100644 deploy/scripts/cdk/lib/construct/network.ts delete mode 100644 deploy/scripts/cdk/package-lock.json delete mode 100644 deploy/scripts/cdk/package.json delete mode 100644 deploy/scripts/cdk/test/cdk.test.ts diff --git a/deploy/scripts/cdk/.env.example b/deploy/scripts/cdk/.env.example deleted file mode 100644 index 6ff0702f4..000000000 --- a/deploy/scripts/cdk/.env.example +++ /dev/null @@ -1,3 +0,0 @@ -LANGFLOW_AUTO_LOGIN=false -LANGFLOW_SUPERUSER=langflow -LANGFLOW_SUPERUSER_PASSWORD=654321 \ No newline at end of file diff --git a/deploy/scripts/cdk/.gitignore b/deploy/scripts/cdk/.gitignore deleted file mode 100644 index 1a7a1528b..000000000 --- a/deploy/scripts/cdk/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -*.js -!jest.config.js -*.d.ts -node_modules - -# CDK asset staging directory -.cdk.staging -cdk.out -!/lib diff --git a/deploy/scripts/cdk/.npmignore b/deploy/scripts/cdk/.npmignore deleted file mode 100644 index c1d6d45dc..000000000 --- a/deploy/scripts/cdk/.npmignore +++ /dev/null @@ -1,6 +0,0 @@ -*.ts -!*.d.ts - -# CDK asset staging directory -.cdk.staging -cdk.out diff --git a/deploy/scripts/cdk/README.md b/deploy/scripts/cdk/README.md deleted file mode 100644 index 320efc02a..000000000 --- a/deploy/scripts/cdk/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# Welcome to your CDK TypeScript project - -This is a blank project for CDK development with TypeScript. - -The `cdk.json` file tells the CDK Toolkit how to execute your app. - -## Useful commands - -* `npm run build` compile typescript to js -* `npm run watch` watch for changes and compile -* `npm run test` perform the jest unit tests -* `cdk deploy` deploy this stack to your default AWS account/region -* `cdk diff` compare deployed stack with current state -* `cdk synth` emits the synthesized CloudFormation template diff --git a/deploy/scripts/cdk/bin/cdk.ts b/deploy/scripts/cdk/bin/cdk.ts deleted file mode 100644 index c680f3e98..000000000 --- a/deploy/scripts/cdk/bin/cdk.ts +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env node -import 'source-map-support/register'; -import * as cdk from 'aws-cdk-lib'; -import { LangflowAppStack } from '../lib/cdk-stack'; - -const app = new cdk.App(); -new LangflowAppStack(app, 'LangflowAppStack', { - /* If you don't specify 'env', this stack will be environment-agnostic. - * Account/Region-dependent features and context lookups will not work, - * but a single synthesized template can be deployed anywhere. */ - - /* Uncomment the next line to specialize this stack for the AWS Account - * and Region that are implied by the current CLI configuration. */ - // env: { account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEFAULT_REGION }, - - /* Uncomment the next line if you know exactly what Account and Region you - * want to deploy the stack to. */ - // env: { account: '123456789012', region: 'us-east-1' }, - - /* For more information, see https://docs.aws.amazon.com/cdk/latest/guide/environments.html */ -}); \ No newline at end of file diff --git a/deploy/scripts/cdk/cdk.json b/deploy/scripts/cdk/cdk.json deleted file mode 100644 index dc8ab711a..000000000 --- a/deploy/scripts/cdk/cdk.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "app": "npx ts-node --prefer-ts-exts bin/cdk.ts", - "watch": { - "include": [ - "**" - ], - "exclude": [ - "README.md", - "cdk*.json", - "**/*.d.ts", - "**/*.js", - "tsconfig.json", - "package*.json", - "yarn.lock", - "node_modules", - "test" - ] - }, - "context": { - "@aws-cdk/aws-lambda:recognizeLayerVersion": true, - "@aws-cdk/core:checkSecretUsage": true, - "@aws-cdk/core:target-partitions": [ - "aws", - "aws-cn" - ], - "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true, - "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true, - "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": true, - "@aws-cdk/aws-iam:minimizePolicies": true, - "@aws-cdk/core:validateSnapshotRemovalPolicy": true, - "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": true, - "@aws-cdk/aws-s3:createDefaultLoggingPolicy": true, - "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": true, - "@aws-cdk/aws-apigateway:disableCloudWatchRole": true, - "@aws-cdk/core:enablePartitionLiterals": true, - "@aws-cdk/aws-events:eventsTargetQueueSameAccount": true, - "@aws-cdk/aws-iam:standardizedServicePrincipals": true, - "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true, - "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": true, - "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": true, - "@aws-cdk/aws-route53-patters:useCertificate": true, - "@aws-cdk/customresources:installLatestAwsSdkDefault": false, - "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": true, - "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": true, - "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": true, - "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": true, - "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": true, - "@aws-cdk/aws-redshift:columnId": true, - "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": true, - "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": true, - "@aws-cdk/aws-apigateway:requestValidatorUniqueId": true, - "@aws-cdk/aws-kms:aliasNameRef": true, - "@aws-cdk/core:includePrefixInUniqueNameGeneration": true - } -} diff --git a/deploy/scripts/cdk/delete-docker-images.sh b/deploy/scripts/cdk/delete-docker-images.sh deleted file mode 100644 index 1e1595008..000000000 --- a/deploy/scripts/cdk/delete-docker-images.sh +++ /dev/null @@ -1,3 +0,0 @@ -docker stop $(docker ps -aq) -docker rm $(docker ps -aq) -docker rmi -f $(docker images -aq) \ No newline at end of file diff --git a/deploy/scripts/cdk/delete-ecr.sh b/deploy/scripts/cdk/delete-ecr.sh deleted file mode 100644 index ebe837a8a..000000000 --- a/deploy/scripts/cdk/delete-ecr.sh +++ /dev/null @@ -1,4 +0,0 @@ -# aws cloudformation delete-stack --stack-name LangflowAppStack -# aws ecr delete-repository --repository-name langflow-backend-repository --force -# aws ecr delete-repository --repository-name langflow-frontend-repository --force -# aws ecr describe-repositories --output json | jq -re ".repositories[].repositoryName" \ No newline at end of file diff --git a/deploy/scripts/cdk/jest.config.js b/deploy/scripts/cdk/jest.config.js deleted file mode 100644 index 08263b895..000000000 --- a/deploy/scripts/cdk/jest.config.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = { - testEnvironment: 'node', - roots: ['/test'], - testMatch: ['**/*.test.ts'], - transform: { - '^.+\\.tsx?$': 'ts-jest' - } -}; diff --git a/deploy/scripts/cdk/lib/cdk-stack.ts b/deploy/scripts/cdk/lib/cdk-stack.ts deleted file mode 100644 index 8b637cfcf..000000000 --- a/deploy/scripts/cdk/lib/cdk-stack.ts +++ /dev/null @@ -1,64 +0,0 @@ -import * as cdk from 'aws-cdk-lib'; -import { Construct } from 'constructs'; -import * as ecs from 'aws-cdk-lib/aws-ecs' - -import { Network, EcrRepository, FrontEndCluster, BackEndCluster, Rds, EcsIAM } from './construct'; -// import * as sqs from 'aws-cdk-lib/aws-sqs'; - -export class LangflowAppStack extends cdk.Stack { - constructor(scope: Construct, id: string, props?: cdk.StackProps) { - super(scope, id, props); - // Arch - const arch = ecs.CpuArchitecture.X86_64 - - // VPC - const { vpc, cluster, alb, targetGroup, cloudmapNamespace, ecsFrontSG, ecsBackSG, dbSG, albSG, backendLogGroup, frontendLogGroup} = new Network(this, 'Network') - - // ECR - const { ecrFrontEndRepository,ecrBackEndRepository} = new EcrRepository(this, 'Ecr', { - cloudmapNamespace:cloudmapNamespace, - arch:arch - }) - - // RDS - // VPCとSGのリソース情報をPropsとして引き渡す - const { rdsCluster } = new Rds(this, 'Rds', { vpc, dbSG }) - - // IAM - const { frontendTaskRole, frontendTaskExecutionRole, backendTaskRole, backendTaskExecutionRole } = new EcsIAM(this, 'EcsIAM',{ - rdsCluster:rdsCluster - }) - - const backendService = new BackEndCluster(this, 'backend', { - cluster:cluster, - ecsBackSG:ecsBackSG, - ecrBackEndRepository:ecrBackEndRepository, - backendTaskRole:backendTaskRole, - backendTaskExecutionRole:backendTaskExecutionRole, - backendLogGroup:backendLogGroup, - cloudmapNamespace:cloudmapNamespace, - rdsCluster:rdsCluster, - alb:alb, - arch:arch - }) - backendService.node.addDependency(rdsCluster); - - const frontendService = new FrontEndCluster(this, 'frontend',{ - cluster:cluster, - ecsFrontSG:ecsFrontSG, - ecrFrontEndRepository:ecrFrontEndRepository, - targetGroup: targetGroup, - backendServiceName: backendService.backendServiceName, - frontendTaskRole: frontendTaskRole, - frontendTaskExecutionRole: frontendTaskExecutionRole, - frontendLogGroup: frontendLogGroup, - cloudmapNamespace: cloudmapNamespace, - arch:arch - }) - frontendService.node.addDependency(backendService); - - - // S3+CloudFront - // new Web(this,'Cloudfront-S3') - } -} diff --git a/deploy/scripts/cdk/lib/construct/backend.ts b/deploy/scripts/cdk/lib/construct/backend.ts deleted file mode 100644 index 4ddff1e00..000000000 --- a/deploy/scripts/cdk/lib/construct/backend.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { Duration } from 'aws-cdk-lib' -import { Construct } from 'constructs'; -import { - aws_ec2 as ec2, - aws_ecs as ecs, - aws_ecr as ecr, - aws_rds as rds, - aws_servicediscovery as servicediscovery, - aws_iam as iam, - aws_logs as logs, - aws_elasticloadbalancingv2 as elb, -} from 'aws-cdk-lib'; -import * as dotenv from 'dotenv'; -const path = require('path'); -dotenv.config({path: path.join(__dirname, "../../.env")}); - -console.log(process.env.LANGFLOW_AUTO_LOGIN); -console.log(process.env.LANGFLOW_SUPERUSER); -console.log(process.env.LANGFLOW_SUPERUSER_PASSWORD); - -interface BackEndProps { - cluster: ecs.Cluster - ecsBackSG:ec2.SecurityGroup - ecrBackEndRepository:ecr.Repository - backendTaskRole: iam.Role; - backendTaskExecutionRole: iam.Role; - backendLogGroup: logs.LogGroup; - cloudmapNamespace: servicediscovery.PrivateDnsNamespace; - rdsCluster:rds.DatabaseCluster - alb:elb.IApplicationLoadBalancer - arch:ecs.CpuArchitecture -} - -export class BackEndCluster extends Construct { - readonly backendServiceName: string - - constructor(scope: Construct, id: string, props:BackEndProps) { - super(scope, id) - const containerPort = 7860 - // Secrets ManagerからDB認証情報を取ってくる - const secretsDB = props.rdsCluster.secret!; - - // Create Backend Fargate Service - const backendTaskDefinition = new ecs.FargateTaskDefinition( - this, - 'BackEndTaskDef', - { - memoryLimitMiB: 3072, - cpu: 1024, - executionRole: props.backendTaskExecutionRole, - runtimePlatform:{ - operatingSystemFamily: ecs.OperatingSystemFamily.LINUX, - cpuArchitecture: props.arch, - }, - taskRole: props.backendTaskRole, - } - ); - backendTaskDefinition.addContainer('backendContainer', { - image: ecs.ContainerImage.fromEcrRepository(props.ecrBackEndRepository, "latest"), - containerName:'langflow-back-container', - logging: ecs.LogDriver.awsLogs({ - streamPrefix: 'my-stream', - logGroup: props.backendLogGroup, - }), - environment:{ - // user:pass@endpoint:port/dbname - // "LANGFLOW_DATABASE_URL" : `mysql+pymysql://${username}:${password}@${host}:3306/${dbname}`, - // "LANGFLOW_DATABASE_URL" : "sqlite:///./langflow.db", - // "LANGFLOW_LANGCHAIN_CACHE" : "SQLiteCache", - // "LANGFLOW_AUTO_LOGIN" : "false", - // "LANGFLOW_SUPERUSER" : "admin", - // "LANGFLOW_SUPERUSER_PASSWORD" : "1234567" - "LANGFLOW_AUTO_LOGIN" : process.env.LANGFLOW_AUTO_LOGIN ?? 'false', - "LANGFLOW_SUPERUSER" : process.env.LANGFLOW_SUPERUSER ?? "admin", - "LANGFLOW_SUPERUSER_PASSWORD" : process.env.LANGFLOW_SUPERUSER_PASSWORD ?? "123456" - }, - portMappings: [ - { - containerPort: containerPort, - protocol: ecs.Protocol.TCP, - }, - ], - // Secretの設定 - secrets: { - "dbname": ecs.Secret.fromSecretsManager(secretsDB, 'dbname'), - "username": ecs.Secret.fromSecretsManager(secretsDB, 'username'), - "host": ecs.Secret.fromSecretsManager(secretsDB, 'host'), - "password": ecs.Secret.fromSecretsManager(secretsDB, 'password'), - }, - }); - this.backendServiceName = 'backend' - const backendService = new ecs.FargateService(this, 'BackEndService', { - cluster: props.cluster, - serviceName: this.backendServiceName, - taskDefinition: backendTaskDefinition, - enableExecuteCommand: true, - securityGroups: [props.ecsBackSG], - cloudMapOptions: { - cloudMapNamespace: props.cloudmapNamespace, - containerPort: containerPort, - dnsRecordType: servicediscovery.DnsRecordType.A, - dnsTtl: Duration.seconds(10), - name: this.backendServiceName - }, - vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS }, - }); - - } -} \ No newline at end of file diff --git a/deploy/scripts/cdk/lib/construct/db.ts b/deploy/scripts/cdk/lib/construct/db.ts deleted file mode 100644 index 8be1f5212..000000000 --- a/deploy/scripts/cdk/lib/construct/db.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { Construct } from 'constructs'; -import * as ec2 from 'aws-cdk-lib/aws-ec2' -import * as rds from "aws-cdk-lib/aws-rds"; - -interface RdsProps { - vpc: ec2.Vpc - dbSG:ec2.SecurityGroup -} - -export class Rds extends Construct{ - readonly rdsCluster: rds.DatabaseCluster - - constructor(scope: Construct, id:string, props: RdsProps){ - super(scope, id); - - const {vpc, dbSG} = props - const instanceType = ec2.InstanceType.of(ec2.InstanceClass.BURSTABLE4_GRAVITON, ec2.InstanceSize.MEDIUM) - - // RDSのパスワードを自動生成してSecrets Managerに格納 - const rdsCredentials = rds.Credentials.fromGeneratedSecret('db_user',{ - secretName: 'langflow-DbSecret', - }) - - // DB クラスターのパラメータグループ作成 - const clusterParameterGroup = new rds.ParameterGroup(scope, 'ClusterParameterGroup',{ - engine: rds.DatabaseClusterEngine.auroraMysql({ - version: rds.AuroraMysqlEngineVersion.VER_3_02_0 - }), - description: 'for-langflow', - }) - clusterParameterGroup.bindToCluster({}) - - // DB インスタンスのパラメタグループ作成 - const instanceParameterGroup = new rds.ParameterGroup(scope, 'InstanceParameterGroup',{ - engine: rds.DatabaseClusterEngine.auroraMysql({ - version: rds.AuroraMysqlEngineVersion.VER_3_02_0, - }), - description: 'for-langflow', - }) - instanceParameterGroup.bindToInstance({}) - - this.rdsCluster = new rds.DatabaseCluster(scope, 'LangflowDbCluster', { - engine: rds.DatabaseClusterEngine.auroraMysql({ - version: rds.AuroraMysqlEngineVersion.VER_3_02_0, - }), - storageEncrypted: true, - credentials: rdsCredentials, - instanceIdentifierBase: 'langflow-instance', - vpc:vpc, - vpcSubnets:vpc.selectSubnets({ - subnetGroupName: 'langflow-Isolated', - }), - securityGroups:[dbSG], - writer: rds.ClusterInstance.provisioned("WriterInstance", { - instanceType: instanceType, - enablePerformanceInsights: true, - parameterGroup:instanceParameterGroup, - }), - // 2台目以降はreaders:で設定 - parameterGroup: clusterParameterGroup, - defaultDatabaseName: 'langflow', - }) - } -} diff --git a/deploy/scripts/cdk/lib/construct/ecr.ts b/deploy/scripts/cdk/lib/construct/ecr.ts deleted file mode 100644 index 96424b053..000000000 --- a/deploy/scripts/cdk/lib/construct/ecr.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { RemovalPolicy } from 'aws-cdk-lib' -import * as ecr from 'aws-cdk-lib/aws-ecr' -import * as ecrdeploy from 'cdk-ecr-deployment' -import * as ecs from 'aws-cdk-lib/aws-ecs' -import * as servicediscovery from 'aws-cdk-lib/aws-servicediscovery' -import { DockerImageAsset, Platform } from 'aws-cdk-lib/aws-ecr-assets' -import * as path from "path"; -import { Construct } from 'constructs' - - -interface ECRProps { - cloudmapNamespace: servicediscovery.PrivateDnsNamespace; - arch:ecs.CpuArchitecture; -} - -export class EcrRepository extends Construct { - readonly ecrFrontEndRepository: ecr.Repository - readonly ecrBackEndRepository: ecr.Repository - - constructor(scope: Construct, id: string, props: ECRProps) { - super(scope, id) - - const imagePlatform = props.arch == ecs.CpuArchitecture.ARM64 ? Platform.LINUX_ARM64 : Platform.LINUX_AMD64 - const backendPath = path.join(__dirname, "../../../../../../", "langflow") - const frontendPath = path.join(__dirname, "../../../../../src/", "frontend") - const excludeDir = ['node_modules','.git', 'cdk.out'] - const LifecycleRule = { - tagStatus: ecr.TagStatus.ANY, - description: 'Delete more than 30 image', - maxImageCount: 30, - } - - // リポジトリ作成 - this.ecrFrontEndRepository = new ecr.Repository(scope, 'LangflowFrontEndRepository', { - repositoryName: 'langflow-frontend-repository', - removalPolicy: RemovalPolicy.RETAIN, - imageScanOnPush: true, - }) - this.ecrBackEndRepository = new ecr.Repository(scope, 'LangflowBackEndRepository', { - repositoryName: 'langflow-backend-repository', - removalPolicy: RemovalPolicy.RETAIN, - imageScanOnPush: true, - }) - // LifecycleRule作成 - this.ecrFrontEndRepository.addLifecycleRule(LifecycleRule) - this.ecrBackEndRepository.addLifecycleRule(LifecycleRule) - - // Create Docker Image Asset - const dockerFrontEndImageAsset = new DockerImageAsset(this, "DockerFrontEndImageAsset", { - directory: frontendPath, - buildArgs:{ - "BACKEND_URL":`http://backend.${props.cloudmapNamespace.namespaceName}:7860` - }, - exclude: excludeDir, - platform: imagePlatform, - }); - const dockerBackEndImageAsset = new DockerImageAsset(this, "DockerBackEndImageAsset", { - directory: backendPath, - exclude: excludeDir, - platform: imagePlatform, - }); - - // Deploy Docker Image to ECR Repository - new ecrdeploy.ECRDeployment(this, "DeployFrontEndImage", { - src: new ecrdeploy.DockerImageName(dockerFrontEndImageAsset.imageUri), - dest: new ecrdeploy.DockerImageName(this.ecrFrontEndRepository.repositoryUri) - }); - - // Deploy Docker Image to ECR Repository - new ecrdeploy.ECRDeployment(this, "DeployBackEndImage", { - src: new ecrdeploy.DockerImageName(dockerBackEndImageAsset.imageUri), - dest: new ecrdeploy.DockerImageName(this.ecrBackEndRepository.repositoryUri) - }); - - } -} diff --git a/deploy/scripts/cdk/lib/construct/frontend.ts b/deploy/scripts/cdk/lib/construct/frontend.ts deleted file mode 100644 index 8238ed135..000000000 --- a/deploy/scripts/cdk/lib/construct/frontend.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { Duration } from 'aws-cdk-lib' -import { Construct } from 'constructs' -import { - aws_ec2 as ec2, - aws_ecs as ecs, - aws_ecr as ecr, - aws_servicediscovery as servicediscovery, - aws_iam as iam, - aws_logs as logs, - aws_elasticloadbalancingv2 as elb, -} from 'aws-cdk-lib'; -import { CpuArchitecture } from 'aws-cdk-lib/aws-ecs'; - -interface FrontEndProps { - cluster:ecs.Cluster - ecsFrontSG:ec2.SecurityGroup - ecrFrontEndRepository:ecr.Repository - targetGroup: elb.ApplicationTargetGroup; - backendServiceName: string; - frontendTaskRole: iam.Role; - frontendTaskExecutionRole: iam.Role; - frontendLogGroup: logs.LogGroup; - cloudmapNamespace: servicediscovery.PrivateDnsNamespace; - arch:ecs.CpuArchitecture; -} - -export class FrontEndCluster extends Construct { - constructor(scope: Construct, id: string, props:FrontEndProps) { - super(scope, id) - - const containerPort = 3000 - const frontendTaskDefinition = new ecs.FargateTaskDefinition( - this, - 'FrontendTaskDef', - { - memoryLimitMiB: 3072, - cpu: 1024, - executionRole: props.frontendTaskExecutionRole, - runtimePlatform:{ - operatingSystemFamily: ecs.OperatingSystemFamily.LINUX, - cpuArchitecture: props.arch, - }, - taskRole: props.frontendTaskRole, - } - ); - const frontendServiceName = 'frontend' - frontendTaskDefinition.addContainer('frontendContainer', { - image: ecs.ContainerImage.fromEcrRepository(props.ecrFrontEndRepository, "latest"), - containerName:'langflow-front-container', - environment: { - BACKEND_SERVICE_NAME: props.backendServiceName, - BACKEND_URL: `http://${props.backendServiceName}.${props.cloudmapNamespace.namespaceName}:7860/`, - VITE_PROXY_TARGET: `http://${props.backendServiceName}.${props.cloudmapNamespace.namespaceName}:7860/`, - }, - logging: ecs.LogDriver.awsLogs({ - streamPrefix: 'my-stream', - logGroup: props.frontendLogGroup, - }), - portMappings: [ - { - name:frontendServiceName, - containerPort: containerPort, - protocol: ecs.Protocol.TCP, - appProtocol:ecs.AppProtocol.http, - }, - ], - }); - const frontendService = new ecs.FargateService( - this, - 'FrontendService', - { - serviceName: frontendServiceName, - cluster: props.cluster, - desiredCount: 1, - assignPublicIp: false, - taskDefinition: frontendTaskDefinition, - enableExecuteCommand: true, - securityGroups: [props.ecsFrontSG], - cloudMapOptions: { - cloudMapNamespace: props.cloudmapNamespace, - containerPort: containerPort, - dnsRecordType: servicediscovery.DnsRecordType.A, - dnsTtl: Duration.seconds(10), - name: frontendServiceName - }, - healthCheckGracePeriod: Duration.seconds(1000), - } - ); - - props.targetGroup.addTarget(frontendService); - - // // Create ALB and ECS Fargate Service - // const frontService = new ecs_patterns.ApplicationLoadBalancedFargateService( - // this, - // "FrontEndService", - // { - // cluster: cluster, - // serviceName: 'langflow-frontend-service', - // cpu: 256, - // memoryLimitMiB: 512, - // listenerPort: 80, - // assignPublicIp: true, // Public facing - ALB - // taskSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS }, - // securityGroups:[ecsFrontSG], - // taskImageOptions: { - // family: 'langflow-taskdef', - // containerName: 'langflow-front-container', - // image: ecs.ContainerImage.fromEcrRepository(ecrFrontEndRepository, "latest"), - // containerPort: 3000, // L2なので、TargetGroupのportが3000で設定されるはず - // }, - // loadBalancer:alb, - // openListener:false, - // } - // ); - - } -} \ No newline at end of file diff --git a/deploy/scripts/cdk/lib/construct/iam.ts b/deploy/scripts/cdk/lib/construct/iam.ts deleted file mode 100644 index 0a40cf340..000000000 --- a/deploy/scripts/cdk/lib/construct/iam.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { RemovalPolicy, Duration } from 'aws-cdk-lib' -import { Construct } from 'constructs' -import { - aws_rds as rds, - aws_iam as iam, -} from 'aws-cdk-lib'; - -interface IAMProps { - rdsCluster:rds.DatabaseCluster -} - -export class EcsIAM extends Construct { - readonly frontendTaskRole: iam.Role; - readonly frontendTaskExecutionRole: iam.Role; - readonly backendTaskRole: iam.Role; - readonly backendTaskExecutionRole: iam.Role; - - constructor(scope: Construct, id: string, props:IAMProps) { - super(scope, id) - - // Policy Statements - // ECS Policy State - const ECSExecPolicyStatement = new iam.PolicyStatement({ - sid: 'allowECSExec', - resources: ['*'], - actions: [ - 'ecr:GetAuthorizationToken', - 'ecr:BatchCheckLayerAvailability', - 'ecr:GetDownloadUrlForLayer', - 'ecr:BatchGetImage', - ], - }); - // Bedrock Policy State - const BedrockPolicyStatement = new iam.PolicyStatement({ - sid: 'allowBedrockAccess', - resources: ['*'], - actions: [ - 'bedrock:*', - ], - }); - // Kendra Policy State - const KendraPolicyStatement = new iam.PolicyStatement({ - sid: 'allowKendraAccess', - resources: ['*'], - actions: [ - 'kendra:*' - ], - }); - // Create Rag Policy - const RagAccessPolicy = new iam.Policy(this, 'RAGFullAccess', { - statements: [KendraPolicyStatement,BedrockPolicyStatement], - }) - // Secrets ManagerからDB認証情報を取ってくるためのPolicy - const SecretsManagerPolicy = new iam.Policy(this, 'SMGetPolicy', { - statements: [new iam.PolicyStatement({ - actions: ['secretsmanager:GetSecretValue'], - resources: [props.rdsCluster.secret!.secretArn], - })], - }) - - // FrontEnd Task Role - this.frontendTaskRole = new iam.Role(this, 'FrontendTaskRole', { - assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), - }); - this.frontendTaskRole.addToPolicy(ECSExecPolicyStatement); - - // BackEnd Task Role - this.backendTaskRole = new iam.Role(this, 'BackendTaskRole', { - assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), - }); - // ECS Exec Policyの付与 - this.backendTaskRole.addToPolicy(ECSExecPolicyStatement); - // KendraとBedrockのアクセス権付与 - this.backendTaskRole.attachInlinePolicy(RagAccessPolicy); - - // FrontEnd Task ExecutionRole - this.frontendTaskExecutionRole = new iam.Role(this, 'frontendTaskExecutionRole', { - assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), - managedPolicies: [ - { - managedPolicyArn: - 'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy', - }, - ], - }); - - // BackEnd Task ExecutionRole - this.backendTaskExecutionRole = new iam.Role(this, 'backendTaskExecutionRole', { - assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), - managedPolicies: [ - { - managedPolicyArn: - 'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy', - }, - ], - }); - - this.backendTaskExecutionRole.attachInlinePolicy(SecretsManagerPolicy); - this.backendTaskExecutionRole.attachInlinePolicy(RagAccessPolicy); - } -} \ No newline at end of file diff --git a/deploy/scripts/cdk/lib/construct/index.ts b/deploy/scripts/cdk/lib/construct/index.ts deleted file mode 100644 index 8c2efcb1b..000000000 --- a/deploy/scripts/cdk/lib/construct/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * from './db'; -export * from './ecr'; -export * from './iam'; -export * from './frontend'; -export * from './backend'; -export * from './network'; \ No newline at end of file diff --git a/deploy/scripts/cdk/lib/construct/network.ts b/deploy/scripts/cdk/lib/construct/network.ts deleted file mode 100644 index aa9e48dc5..000000000 --- a/deploy/scripts/cdk/lib/construct/network.ts +++ /dev/null @@ -1,139 +0,0 @@ -import { RemovalPolicy, Duration } from 'aws-cdk-lib' -import { Construct } from 'constructs' -import { - aws_ec2 as ec2, - aws_ecs as ecs, - aws_logs as logs, - aws_servicediscovery as servicediscovery, - aws_elasticloadbalancingv2 as elb, -} from 'aws-cdk-lib'; - -export class Network extends Construct { - readonly vpc: ec2.Vpc; - readonly cluster: ecs.Cluster; - readonly alb: elb.IApplicationLoadBalancer; - readonly targetGroup: elb.ApplicationTargetGroup; - readonly cloudmapNamespace: servicediscovery.PrivateDnsNamespace; - readonly ecsFrontSG: ec2.SecurityGroup; - readonly ecsBackSG: ec2.SecurityGroup; - readonly dbSG: ec2.SecurityGroup; - readonly albSG: ec2.SecurityGroup; - readonly backendLogGroup: logs.LogGroup; - readonly frontendLogGroup: logs.LogGroup; - - constructor(scope: Construct, id: string) { - super(scope, id) - const alb_listen_port=80 - const front_service_port=3000 - const back_service_port=7860 - - // VPC等リソースの作成 - this.vpc = new ec2.Vpc(scope, 'VPC', { - vpcName: 'langflow-vpc', - ipAddresses: ec2.IpAddresses.cidr('10.0.0.0/16'), - maxAzs: 3, - subnetConfiguration: [ - { - cidrMask: 24, - name: 'langflow-Isolated', - subnetType: ec2.SubnetType.PRIVATE_ISOLATED, - }, - { - cidrMask: 24, - name: 'langflow-Public', - subnetType: ec2.SubnetType.PUBLIC, - }, - { - cidrMask: 24, - name: 'langflow-Private', - subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS - }, - ], - natGateways: 1, - }) - // Cluster - this.cluster = new ecs.Cluster(this, 'EcsCluster', { - clusterName: 'langflow-cluster', - vpc: this.vpc, - enableFargateCapacityProviders: true, - }); - - // Private DNS - this.cloudmapNamespace = new servicediscovery.PrivateDnsNamespace( - this, - 'Namespace', - { - name: 'ecs-deploy.com', - vpc: this.vpc, - } - ); - - // ALBに設定するセキュリティグループ - this.albSG = new ec2.SecurityGroup(scope, 'ALBSecurityGroup', { - securityGroupName: 'alb-sg', - description: 'for alb', - vpc: this.vpc, - }) - this.albSG.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(alb_listen_port)) - - this.alb = new elb.ApplicationLoadBalancer(this,'alb',{ - internetFacing: true, //インターネットからのアクセスを許可するかどうか指定 - loadBalancerName: 'alb', - securityGroup: this.albSG, //作成したセキュリティグループを割り当てる - vpc:this.vpc, - }) - - const listener = this.alb.addListener('Listener', { port: alb_listen_port }); - - this.targetGroup = listener.addTargets('targetGroup', { - port: front_service_port, - protocol: elb.ApplicationProtocol.HTTP, - healthCheck: { - enabled: true, - path: '/health', - healthyThresholdCount: 2, - unhealthyThresholdCount: 4, - interval: Duration.seconds(100), - timeout: Duration.seconds(30), - healthyHttpCodes: '200', - }, - }); - - // ECS FrontEndに設定するセキュリティグループ - this.ecsFrontSG = new ec2.SecurityGroup(scope, 'ECSFrontEndSecurityGroup', { - securityGroupName: 'langflow-ecs-front-sg', - description: 'for langflow-front-ecs', - vpc: this.vpc, - }) - this.ecsFrontSG.addIngressRule(this.albSG, ec2.Port.allTcp()) - - // ECS BackEndに設定するセキュリティグループ - this.ecsBackSG = new ec2.SecurityGroup(scope, 'ECSBackEndSecurityGroup', { - securityGroupName: 'langflow-ecs-back-sg', - description: 'for langflow-back-ecs', - vpc: this.vpc, - }) - this.ecsBackSG.addIngressRule(this.ecsFrontSG, ec2.Port.tcp(back_service_port)) - - // RDSに設定するセキュリティグループ - this.dbSG = new ec2.SecurityGroup(scope, 'DBSecurityGroup', { - allowAllOutbound: true, - securityGroupName: 'langflow-db', - description: 'for langflow-db', - vpc: this.vpc, - }) - // AppRunnerSecurityGroupからのポート3306:mysql(5432:postgres)のインバウンドを許可 - this.dbSG.addIngressRule(this.ecsBackSG, ec2.Port.tcp(3306)) - - // Create CloudWatch Log Group - this.backendLogGroup = new logs.LogGroup(this, 'backendLogGroup', { - logGroupName: 'myapp-backend', - removalPolicy: RemovalPolicy.DESTROY, - }); - - this.frontendLogGroup = new logs.LogGroup(this, 'frontendLogGroup', { - logGroupName: 'myapp-frontend', - removalPolicy: RemovalPolicy.DESTROY, - }); - } -} \ No newline at end of file diff --git a/deploy/scripts/cdk/package-lock.json b/deploy/scripts/cdk/package-lock.json deleted file mode 100644 index e5b70161b..000000000 --- a/deploy/scripts/cdk/package-lock.json +++ /dev/null @@ -1,4601 +0,0 @@ -{ - "name": "cdk", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "cdk", - "version": "0.1.0", - "dependencies": { - "aws-cdk-lib": "^2.86.0", - "cdk-ecr-deployment": "^2.5.30", - "constructs": "^10.0.0", - "source-map-support": "^0.5.21" - }, - "bin": { - "cdk": "bin/cdk.js" - }, - "devDependencies": { - "@types/jest": "^29.5.1", - "@types/node": "20.1.7", - "aws-cdk": "2.86.0", - "jest": "^29.5.0", - "ts-jest": "^29.1.0", - "ts-node": "^10.9.1", - "typescript": "~5.1.3" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@aws-cdk/asset-awscli-v1": { - "version": "2.2.201", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.201.tgz", - "integrity": "sha512-INZqcwDinNaIdb5CtW3ez5s943nX5stGBQS6VOP2JDlOFP81hM3fds/9NDknipqfUkZM43dx+HgVvkXYXXARCQ==" - }, - "node_modules/@aws-cdk/asset-kubectl-v20": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-kubectl-v20/-/asset-kubectl-v20-2.1.2.tgz", - "integrity": "sha512-3M2tELJOxQv0apCIiuKQ4pAbncz9GuLwnKFqxifWfe77wuMxyTRPmxssYHs42ePqzap1LT6GDcPygGs+hHstLg==" - }, - "node_modules/@aws-cdk/asset-node-proxy-agent-v5": { - "version": "2.0.166", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v5/-/asset-node-proxy-agent-v5-2.0.166.tgz", - "integrity": "sha512-j0xnccpUQHXJKPgCwQcGGNu4lRiC1PptYfdxBIH1L4dRK91iBxtSQHESRQX+yB47oGLaF/WfNN/aF3WXwlhikg==" - }, - "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", - "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", - "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", - "dev": true, - "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", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", - "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.3", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dev": true, - "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" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", - "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", - "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz", - "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.3", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.3", - "@babel/types": "^7.23.3", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", - "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-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" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "node_modules/@types/babel__core": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.4.tgz", - "integrity": "sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.7", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", - "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", - "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "29.5.8", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.8.tgz", - "integrity": "sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g==", - "dev": true, - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/node": { - "version": "20.1.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.7.tgz", - "integrity": "sha512-WCuw/o4GSwDGMoonES8rcvwsig77dGCMbZDrZr2x4ZZiNW4P/gcoZXe/0twgtobcTkmg9TuKflxYL/DuwDyJzg==", - "dev": true - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true - }, - "node_modules/@types/yargs": { - "version": "17.0.31", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", - "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", - "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/aws-cdk": { - "version": "2.86.0", - "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.86.0.tgz", - "integrity": "sha512-GRcdU6p00Zu3fIZYPG+EbpDYppYMtzebuf0jrmCfKhCytRGaPWDHHfu3hrv0de4d0zbUD/+AmiODPMu3J6nXbQ==", - "dev": true, - "bin": { - "cdk": "bin/cdk" - }, - "engines": { - "node": ">= 14.15.0" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, - "node_modules/aws-cdk-lib": { - "version": "2.86.0", - "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.86.0.tgz", - "integrity": "sha512-76yZ2MawAGXLD3ox4FjhUIPmAMXteGKkeo3tPMthemusDCCkD2X6DBssXBHjB7r9GnrOMMf8JH5BGq2lOZ539g==", - "bundleDependencies": [ - "@balena/dockerignore", - "case", - "fs-extra", - "ignore", - "jsonschema", - "minimatch", - "punycode", - "semver", - "table", - "yaml" - ], - "dependencies": { - "@aws-cdk/asset-awscli-v1": "^2.2.177", - "@aws-cdk/asset-kubectl-v20": "^2.1.1", - "@aws-cdk/asset-node-proxy-agent-v5": "^2.0.148", - "@balena/dockerignore": "^1.0.2", - "case": "1.6.3", - "fs-extra": "^11.1.1", - "ignore": "^5.2.4", - "jsonschema": "^1.4.1", - "minimatch": "^3.1.2", - "punycode": "^2.3.0", - "semver": "^7.5.1", - "table": "^6.8.1", - "yaml": "1.10.2" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "constructs": "^10.0.0" - } - }, - "node_modules/aws-cdk-lib/node_modules/@balena/dockerignore": { - "version": "1.0.2", - "inBundle": true, - "license": "Apache-2.0" - }, - "node_modules/aws-cdk-lib/node_modules/ajv": { - "version": "8.12.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/aws-cdk-lib/node_modules/ansi-regex": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/aws-cdk-lib/node_modules/ansi-styles": { - "version": "4.3.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/aws-cdk-lib/node_modules/astral-regex": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/aws-cdk-lib/node_modules/balanced-match": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/aws-cdk-lib/node_modules/brace-expansion": { - "version": "1.1.11", - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/aws-cdk-lib/node_modules/case": { - "version": "1.6.3", - "inBundle": true, - "license": "(MIT OR GPL-3.0-or-later)", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/aws-cdk-lib/node_modules/color-convert": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/aws-cdk-lib/node_modules/color-name": { - "version": "1.1.4", - "inBundle": true, - "license": "MIT" - }, - "node_modules/aws-cdk-lib/node_modules/concat-map": { - "version": "0.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/aws-cdk-lib/node_modules/emoji-regex": { - "version": "8.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/aws-cdk-lib/node_modules/fast-deep-equal": { - "version": "3.1.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/aws-cdk-lib/node_modules/fs-extra": { - "version": "11.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/aws-cdk-lib/node_modules/graceful-fs": { - "version": "4.2.11", - "inBundle": true, - "license": "ISC" - }, - "node_modules/aws-cdk-lib/node_modules/ignore": { - "version": "5.2.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/aws-cdk-lib/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/aws-cdk-lib/node_modules/json-schema-traverse": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/aws-cdk-lib/node_modules/jsonfile": { - "version": "6.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/aws-cdk-lib/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/aws-cdk-lib/node_modules/lodash.truncate": { - "version": "4.4.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/aws-cdk-lib/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/aws-cdk-lib/node_modules/minimatch": { - "version": "3.1.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/aws-cdk-lib/node_modules/punycode": { - "version": "2.3.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/aws-cdk-lib/node_modules/require-from-string": { - "version": "2.0.2", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/aws-cdk-lib/node_modules/semver": { - "version": "7.5.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/aws-cdk-lib/node_modules/slice-ansi": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/aws-cdk-lib/node_modules/string-width": { - "version": "4.2.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/aws-cdk-lib/node_modules/strip-ansi": { - "version": "6.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/aws-cdk-lib/node_modules/table": { - "version": "6.8.1", - "inBundle": true, - "license": "BSD-3-Clause", - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/aws-cdk-lib/node_modules/universalify": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/aws-cdk-lib/node_modules/uri-js": { - "version": "4.4.1", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/aws-cdk-lib/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/aws-cdk-lib/node_modules/yaml": { - "version": "1.10.2", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001561", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz", - "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/cdk-ecr-deployment": { - "version": "2.5.30", - "resolved": "https://registry.npmjs.org/cdk-ecr-deployment/-/cdk-ecr-deployment-2.5.30.tgz", - "integrity": "sha512-IFS/DD6OmNcXv24YKjjaz1sb04xxsoUb7vPYwx7kTBAOxOnT0CuAadF8/HVfM/YVoqoOPXCJe3ikAXy1iI0nKw==", - "bundleDependencies": [ - "got", - "hpagent" - ], - "dependencies": { - "aws-cdk-lib": "^2.0.0", - "constructs": "^10.0.5", - "got": "^11.8.6", - "hpagent": "^0.1.2" - }, - "peerDependencies": { - "aws-cdk-lib": "^2.0.0", - "constructs": "^10.0.5" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/@sindresorhus/is": { - "version": "4.6.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "inBundle": true, - "license": "MIT", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/@types/cacheable-request": { - "version": "6.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/@types/cacheable-request/node_modules/@types/node": { - "version": "20.3.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/cdk-ecr-deployment/node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/cdk-ecr-deployment/node_modules/@types/keyv": { - "version": "3.1.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/@types/keyv/node_modules/@types/node": { - "version": "20.3.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/cdk-ecr-deployment/node_modules/@types/responselike": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/@types/responselike/node_modules/@types/node": { - "version": "20.3.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/cdk-ecr-deployment/node_modules/cacheable-lookup": { - "version": "5.0.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/cacheable-request": { - "version": "7.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/clone-response": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/clone-response/node_modules/mimic-response": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/decompress-response": { - "version": "6.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/defer-to-connect": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/end-of-stream": { - "version": "1.4.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/got": { - "version": "11.8.6", - "inBundle": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/hpagent": { - "version": "0.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/cdk-ecr-deployment/node_modules/http-cache-semantics": { - "version": "4.1.1", - "inBundle": true, - "license": "BSD-2-Clause" - }, - "node_modules/cdk-ecr-deployment/node_modules/http2-wrapper": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/json-buffer": { - "version": "3.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/cdk-ecr-deployment/node_modules/keyv": { - "version": "4.5.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/lowercase-keys": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/mimic-response": { - "version": "3.1.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/normalize-url": { - "version": "6.1.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/once": { - "version": "1.4.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/p-cancelable": { - "version": "2.1.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/pump": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/quick-lru": { - "version": "5.1.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/resolve-alpn": { - "version": "1.2.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/cdk-ecr-deployment/node_modules/responselike": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/wrappy": { - "version": "1.0.2", - "inBundle": true, - "license": "ISC" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/constructs": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.3.0.tgz", - "integrity": "sha512-vbK8i3rIb/xwZxSpTjz3SagHn1qq9BChLEfy5Hf6fB3/2eFbrwt2n9kHwQcS0CPTRBesreeAcsJfMq2229FnbQ==", - "engines": { - "node": ">= 16.14.0" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/dedent": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", - "dev": true, - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.580", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.580.tgz", - "integrity": "sha512-T5q3pjQon853xxxHUq3ZP68ZpvJHuSMY2+BZaW3QzjS4HvNuvsMmZ/+lU+nCrftre1jFZ+OSlExynXWBihnXzw==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", - "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner/node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-snapshot/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "dependencies": { - "@types/node": "*", - "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" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pure-rand": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", - "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ] - }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-jest": { - "version": "29.1.1", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", - "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", - "dev": true, - "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "^7.5.3", - "yargs-parser": "^21.0.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/types": "^29.0.0", - "babel-jest": "^29.0.0", - "jest": "^29.0.0", - "typescript": ">=4.3 <6" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/ts-jest/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ts-jest/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ts-jest/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "node_modules/v8-to-istanbul": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz", - "integrity": "sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/deploy/scripts/cdk/package.json b/deploy/scripts/cdk/package.json deleted file mode 100644 index 05ef554d9..000000000 --- a/deploy/scripts/cdk/package.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "cdk", - "version": "0.1.0", - "bin": { - "cdk": "bin/cdk.js" - }, - "scripts": { - "build": "tsc", - "watch": "tsc -w", - "test": "jest", - "cdk": "cdk" - }, - "devDependencies": { - "@types/jest": "^29.5.1", - "@types/node": "20.1.7", - "aws-cdk": "2.86.0", - "jest": "^29.5.0", - "ts-jest": "^29.1.0", - "ts-node": "^10.9.1", - "typescript": "~5.1.3" - }, - "dependencies": { - "aws-cdk-lib": "^2.86.0", - "cdk-ecr-deployment": "^2.5.30", - "constructs": "^10.0.0", - "source-map-support": "^0.5.21" - } -} diff --git a/deploy/scripts/cdk/test/cdk.test.ts b/deploy/scripts/cdk/test/cdk.test.ts deleted file mode 100644 index 1e6b29c85..000000000 --- a/deploy/scripts/cdk/test/cdk.test.ts +++ /dev/null @@ -1,17 +0,0 @@ -// import * as cdk from 'aws-cdk-lib'; -// import { Template } from 'aws-cdk-lib/assertions'; -// import * as Cdk from '../lib/cdk-stack'; - -// example test. To run these tests, uncomment this file along with the -// example resource in lib/cdk-stack.ts -test('SQS Queue Created', () => { -// const app = new cdk.App(); -// // WHEN -// const stack = new Cdk.CdkStack(app, 'MyTestStack'); -// // THEN -// const template = Template.fromStack(stack); - -// template.hasResourceProperties('AWS::SQS::Queue', { -// VisibilityTimeout: 300 -// }); -}); From d6d12b488c59bd50cb3ab597bd187c1aae5c5097 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 30 Nov 2023 16:32:52 +0900 Subject: [PATCH 032/203] move cdk folder to scripts/cdk --- Dockerfile | 25 +- dev.Dockerfile | 18 + prod.Dockerfile | 15 - scripts/cdk/.env.example | 3 + scripts/cdk/.gitignore | 9 + scripts/cdk/.npmignore | 6 + scripts/cdk/README.md | 14 + scripts/cdk/bin/cdk.ts | 21 + scripts/cdk/cdk.json | 55 + scripts/cdk/delete-docker-images.sh | 3 + scripts/cdk/delete-ecr.sh | 4 + scripts/cdk/jest.config.js | 8 + scripts/cdk/lib/cdk-stack.ts | 64 + scripts/cdk/lib/construct/backend.ts | 109 + scripts/cdk/lib/construct/db.ts | 64 + scripts/cdk/lib/construct/ecr.ts | 78 + scripts/cdk/lib/construct/frontend.ts | 117 + scripts/cdk/lib/construct/iam.ts | 101 + scripts/cdk/lib/construct/index.ts | 6 + scripts/cdk/lib/construct/network.ts | 139 + scripts/cdk/package-lock.json | 4601 +++++++++++++++++++++++++ scripts/cdk/package.json | 28 + scripts/cdk/test/cdk.test.ts | 17 + src/frontend/Dockerfile | 36 +- src/frontend/dev.Dockerfile | 26 + src/frontend/prod.Dockerfile | 16 - 26 files changed, 5515 insertions(+), 68 deletions(-) create mode 100644 dev.Dockerfile delete mode 100644 prod.Dockerfile create mode 100644 scripts/cdk/.env.example create mode 100644 scripts/cdk/.gitignore create mode 100644 scripts/cdk/.npmignore create mode 100644 scripts/cdk/README.md create mode 100644 scripts/cdk/bin/cdk.ts create mode 100644 scripts/cdk/cdk.json create mode 100644 scripts/cdk/delete-docker-images.sh create mode 100644 scripts/cdk/delete-ecr.sh create mode 100644 scripts/cdk/jest.config.js create mode 100644 scripts/cdk/lib/cdk-stack.ts create mode 100644 scripts/cdk/lib/construct/backend.ts create mode 100644 scripts/cdk/lib/construct/db.ts create mode 100644 scripts/cdk/lib/construct/ecr.ts create mode 100644 scripts/cdk/lib/construct/frontend.ts create mode 100644 scripts/cdk/lib/construct/iam.ts create mode 100644 scripts/cdk/lib/construct/index.ts create mode 100644 scripts/cdk/lib/construct/network.ts create mode 100644 scripts/cdk/package-lock.json create mode 100644 scripts/cdk/package.json create mode 100644 scripts/cdk/test/cdk.test.ts create mode 100644 src/frontend/dev.Dockerfile delete mode 100644 src/frontend/prod.Dockerfile diff --git a/Dockerfile b/Dockerfile index ce5715e1f..520c407de 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,18 +1,15 @@ -FROM --platform=linux/amd64 python:3.10-slim +FROM python:3.10-slim -WORKDIR /app +RUN apt-get update && apt-get install gcc g++ git make -y && apt-get clean \ + && rm -rf /var/lib/apt/lists/* +RUN useradd -m -u 1000 user +USER user +ENV HOME=/home/user \ + PATH=/home/user/.local/bin:$PATH -# Install Poetry -RUN apt-get update && apt-get install gcc g++ curl build-essential postgresql-server-dev-all -y -RUN curl -sSL https://install.python-poetry.org | python3 - -# # Add Poetry to PATH -ENV PATH="${PATH}:/root/.local/bin" -# # Copy the pyproject.toml and poetry.lock files -COPY poetry.lock pyproject.toml ./ -# Copy the rest of the application codes -COPY ./ ./ +WORKDIR $HOME/app -# Install dependencies -RUN poetry config virtualenvs.create false && poetry install --no-interaction --no-ansi +COPY --chown=user . $HOME/app -CMD ["uvicorn", "--factory", "src.backend.langflow.main:create_app", "--host", "0.0.0.0", "--port", "7860", "--reload", "--log-level", "debug"] +RUN pip install langflow>==0.0.86 -U --user +CMD ["python", "-m", "langflow", "run", "--host", "0.0.0.0", "--port", "7860"] diff --git a/dev.Dockerfile b/dev.Dockerfile new file mode 100644 index 000000000..ce5715e1f --- /dev/null +++ b/dev.Dockerfile @@ -0,0 +1,18 @@ +FROM --platform=linux/amd64 python:3.10-slim + +WORKDIR /app + +# Install Poetry +RUN apt-get update && apt-get install gcc g++ curl build-essential postgresql-server-dev-all -y +RUN curl -sSL https://install.python-poetry.org | python3 - +# # Add Poetry to PATH +ENV PATH="${PATH}:/root/.local/bin" +# # Copy the pyproject.toml and poetry.lock files +COPY poetry.lock pyproject.toml ./ +# Copy the rest of the application codes +COPY ./ ./ + +# Install dependencies +RUN poetry config virtualenvs.create false && poetry install --no-interaction --no-ansi + +CMD ["uvicorn", "--factory", "src.backend.langflow.main:create_app", "--host", "0.0.0.0", "--port", "7860", "--reload", "--log-level", "debug"] diff --git a/prod.Dockerfile b/prod.Dockerfile deleted file mode 100644 index 520c407de..000000000 --- a/prod.Dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -FROM python:3.10-slim - -RUN apt-get update && apt-get install gcc g++ git make -y && apt-get clean \ - && rm -rf /var/lib/apt/lists/* -RUN useradd -m -u 1000 user -USER user -ENV HOME=/home/user \ - PATH=/home/user/.local/bin:$PATH - -WORKDIR $HOME/app - -COPY --chown=user . $HOME/app - -RUN pip install langflow>==0.0.86 -U --user -CMD ["python", "-m", "langflow", "run", "--host", "0.0.0.0", "--port", "7860"] diff --git a/scripts/cdk/.env.example b/scripts/cdk/.env.example new file mode 100644 index 000000000..6ff0702f4 --- /dev/null +++ b/scripts/cdk/.env.example @@ -0,0 +1,3 @@ +LANGFLOW_AUTO_LOGIN=false +LANGFLOW_SUPERUSER=langflow +LANGFLOW_SUPERUSER_PASSWORD=654321 \ No newline at end of file diff --git a/scripts/cdk/.gitignore b/scripts/cdk/.gitignore new file mode 100644 index 000000000..1a7a1528b --- /dev/null +++ b/scripts/cdk/.gitignore @@ -0,0 +1,9 @@ +*.js +!jest.config.js +*.d.ts +node_modules + +# CDK asset staging directory +.cdk.staging +cdk.out +!/lib diff --git a/scripts/cdk/.npmignore b/scripts/cdk/.npmignore new file mode 100644 index 000000000..c1d6d45dc --- /dev/null +++ b/scripts/cdk/.npmignore @@ -0,0 +1,6 @@ +*.ts +!*.d.ts + +# CDK asset staging directory +.cdk.staging +cdk.out diff --git a/scripts/cdk/README.md b/scripts/cdk/README.md new file mode 100644 index 000000000..320efc02a --- /dev/null +++ b/scripts/cdk/README.md @@ -0,0 +1,14 @@ +# Welcome to your CDK TypeScript project + +This is a blank project for CDK development with TypeScript. + +The `cdk.json` file tells the CDK Toolkit how to execute your app. + +## Useful commands + +* `npm run build` compile typescript to js +* `npm run watch` watch for changes and compile +* `npm run test` perform the jest unit tests +* `cdk deploy` deploy this stack to your default AWS account/region +* `cdk diff` compare deployed stack with current state +* `cdk synth` emits the synthesized CloudFormation template diff --git a/scripts/cdk/bin/cdk.ts b/scripts/cdk/bin/cdk.ts new file mode 100644 index 000000000..c680f3e98 --- /dev/null +++ b/scripts/cdk/bin/cdk.ts @@ -0,0 +1,21 @@ +#!/usr/bin/env node +import 'source-map-support/register'; +import * as cdk from 'aws-cdk-lib'; +import { LangflowAppStack } from '../lib/cdk-stack'; + +const app = new cdk.App(); +new LangflowAppStack(app, 'LangflowAppStack', { + /* If you don't specify 'env', this stack will be environment-agnostic. + * Account/Region-dependent features and context lookups will not work, + * but a single synthesized template can be deployed anywhere. */ + + /* Uncomment the next line to specialize this stack for the AWS Account + * and Region that are implied by the current CLI configuration. */ + // env: { account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEFAULT_REGION }, + + /* Uncomment the next line if you know exactly what Account and Region you + * want to deploy the stack to. */ + // env: { account: '123456789012', region: 'us-east-1' }, + + /* For more information, see https://docs.aws.amazon.com/cdk/latest/guide/environments.html */ +}); \ No newline at end of file diff --git a/scripts/cdk/cdk.json b/scripts/cdk/cdk.json new file mode 100644 index 000000000..dc8ab711a --- /dev/null +++ b/scripts/cdk/cdk.json @@ -0,0 +1,55 @@ +{ + "app": "npx ts-node --prefer-ts-exts bin/cdk.ts", + "watch": { + "include": [ + "**" + ], + "exclude": [ + "README.md", + "cdk*.json", + "**/*.d.ts", + "**/*.js", + "tsconfig.json", + "package*.json", + "yarn.lock", + "node_modules", + "test" + ] + }, + "context": { + "@aws-cdk/aws-lambda:recognizeLayerVersion": true, + "@aws-cdk/core:checkSecretUsage": true, + "@aws-cdk/core:target-partitions": [ + "aws", + "aws-cn" + ], + "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true, + "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true, + "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": true, + "@aws-cdk/aws-iam:minimizePolicies": true, + "@aws-cdk/core:validateSnapshotRemovalPolicy": true, + "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": true, + "@aws-cdk/aws-s3:createDefaultLoggingPolicy": true, + "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": true, + "@aws-cdk/aws-apigateway:disableCloudWatchRole": true, + "@aws-cdk/core:enablePartitionLiterals": true, + "@aws-cdk/aws-events:eventsTargetQueueSameAccount": true, + "@aws-cdk/aws-iam:standardizedServicePrincipals": true, + "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true, + "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": true, + "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": true, + "@aws-cdk/aws-route53-patters:useCertificate": true, + "@aws-cdk/customresources:installLatestAwsSdkDefault": false, + "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": true, + "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": true, + "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": true, + "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": true, + "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": true, + "@aws-cdk/aws-redshift:columnId": true, + "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": true, + "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": true, + "@aws-cdk/aws-apigateway:requestValidatorUniqueId": true, + "@aws-cdk/aws-kms:aliasNameRef": true, + "@aws-cdk/core:includePrefixInUniqueNameGeneration": true + } +} diff --git a/scripts/cdk/delete-docker-images.sh b/scripts/cdk/delete-docker-images.sh new file mode 100644 index 000000000..1e1595008 --- /dev/null +++ b/scripts/cdk/delete-docker-images.sh @@ -0,0 +1,3 @@ +docker stop $(docker ps -aq) +docker rm $(docker ps -aq) +docker rmi -f $(docker images -aq) \ No newline at end of file diff --git a/scripts/cdk/delete-ecr.sh b/scripts/cdk/delete-ecr.sh new file mode 100644 index 000000000..ebe837a8a --- /dev/null +++ b/scripts/cdk/delete-ecr.sh @@ -0,0 +1,4 @@ +# aws cloudformation delete-stack --stack-name LangflowAppStack +# aws ecr delete-repository --repository-name langflow-backend-repository --force +# aws ecr delete-repository --repository-name langflow-frontend-repository --force +# aws ecr describe-repositories --output json | jq -re ".repositories[].repositoryName" \ No newline at end of file diff --git a/scripts/cdk/jest.config.js b/scripts/cdk/jest.config.js new file mode 100644 index 000000000..08263b895 --- /dev/null +++ b/scripts/cdk/jest.config.js @@ -0,0 +1,8 @@ +module.exports = { + testEnvironment: 'node', + roots: ['/test'], + testMatch: ['**/*.test.ts'], + transform: { + '^.+\\.tsx?$': 'ts-jest' + } +}; diff --git a/scripts/cdk/lib/cdk-stack.ts b/scripts/cdk/lib/cdk-stack.ts new file mode 100644 index 000000000..8b637cfcf --- /dev/null +++ b/scripts/cdk/lib/cdk-stack.ts @@ -0,0 +1,64 @@ +import * as cdk from 'aws-cdk-lib'; +import { Construct } from 'constructs'; +import * as ecs from 'aws-cdk-lib/aws-ecs' + +import { Network, EcrRepository, FrontEndCluster, BackEndCluster, Rds, EcsIAM } from './construct'; +// import * as sqs from 'aws-cdk-lib/aws-sqs'; + +export class LangflowAppStack extends cdk.Stack { + constructor(scope: Construct, id: string, props?: cdk.StackProps) { + super(scope, id, props); + // Arch + const arch = ecs.CpuArchitecture.X86_64 + + // VPC + const { vpc, cluster, alb, targetGroup, cloudmapNamespace, ecsFrontSG, ecsBackSG, dbSG, albSG, backendLogGroup, frontendLogGroup} = new Network(this, 'Network') + + // ECR + const { ecrFrontEndRepository,ecrBackEndRepository} = new EcrRepository(this, 'Ecr', { + cloudmapNamespace:cloudmapNamespace, + arch:arch + }) + + // RDS + // VPCとSGのリソース情報をPropsとして引き渡す + const { rdsCluster } = new Rds(this, 'Rds', { vpc, dbSG }) + + // IAM + const { frontendTaskRole, frontendTaskExecutionRole, backendTaskRole, backendTaskExecutionRole } = new EcsIAM(this, 'EcsIAM',{ + rdsCluster:rdsCluster + }) + + const backendService = new BackEndCluster(this, 'backend', { + cluster:cluster, + ecsBackSG:ecsBackSG, + ecrBackEndRepository:ecrBackEndRepository, + backendTaskRole:backendTaskRole, + backendTaskExecutionRole:backendTaskExecutionRole, + backendLogGroup:backendLogGroup, + cloudmapNamespace:cloudmapNamespace, + rdsCluster:rdsCluster, + alb:alb, + arch:arch + }) + backendService.node.addDependency(rdsCluster); + + const frontendService = new FrontEndCluster(this, 'frontend',{ + cluster:cluster, + ecsFrontSG:ecsFrontSG, + ecrFrontEndRepository:ecrFrontEndRepository, + targetGroup: targetGroup, + backendServiceName: backendService.backendServiceName, + frontendTaskRole: frontendTaskRole, + frontendTaskExecutionRole: frontendTaskExecutionRole, + frontendLogGroup: frontendLogGroup, + cloudmapNamespace: cloudmapNamespace, + arch:arch + }) + frontendService.node.addDependency(backendService); + + + // S3+CloudFront + // new Web(this,'Cloudfront-S3') + } +} diff --git a/scripts/cdk/lib/construct/backend.ts b/scripts/cdk/lib/construct/backend.ts new file mode 100644 index 000000000..4ddff1e00 --- /dev/null +++ b/scripts/cdk/lib/construct/backend.ts @@ -0,0 +1,109 @@ +import { Duration } from 'aws-cdk-lib' +import { Construct } from 'constructs'; +import { + aws_ec2 as ec2, + aws_ecs as ecs, + aws_ecr as ecr, + aws_rds as rds, + aws_servicediscovery as servicediscovery, + aws_iam as iam, + aws_logs as logs, + aws_elasticloadbalancingv2 as elb, +} from 'aws-cdk-lib'; +import * as dotenv from 'dotenv'; +const path = require('path'); +dotenv.config({path: path.join(__dirname, "../../.env")}); + +console.log(process.env.LANGFLOW_AUTO_LOGIN); +console.log(process.env.LANGFLOW_SUPERUSER); +console.log(process.env.LANGFLOW_SUPERUSER_PASSWORD); + +interface BackEndProps { + cluster: ecs.Cluster + ecsBackSG:ec2.SecurityGroup + ecrBackEndRepository:ecr.Repository + backendTaskRole: iam.Role; + backendTaskExecutionRole: iam.Role; + backendLogGroup: logs.LogGroup; + cloudmapNamespace: servicediscovery.PrivateDnsNamespace; + rdsCluster:rds.DatabaseCluster + alb:elb.IApplicationLoadBalancer + arch:ecs.CpuArchitecture +} + +export class BackEndCluster extends Construct { + readonly backendServiceName: string + + constructor(scope: Construct, id: string, props:BackEndProps) { + super(scope, id) + const containerPort = 7860 + // Secrets ManagerからDB認証情報を取ってくる + const secretsDB = props.rdsCluster.secret!; + + // Create Backend Fargate Service + const backendTaskDefinition = new ecs.FargateTaskDefinition( + this, + 'BackEndTaskDef', + { + memoryLimitMiB: 3072, + cpu: 1024, + executionRole: props.backendTaskExecutionRole, + runtimePlatform:{ + operatingSystemFamily: ecs.OperatingSystemFamily.LINUX, + cpuArchitecture: props.arch, + }, + taskRole: props.backendTaskRole, + } + ); + backendTaskDefinition.addContainer('backendContainer', { + image: ecs.ContainerImage.fromEcrRepository(props.ecrBackEndRepository, "latest"), + containerName:'langflow-back-container', + logging: ecs.LogDriver.awsLogs({ + streamPrefix: 'my-stream', + logGroup: props.backendLogGroup, + }), + environment:{ + // user:pass@endpoint:port/dbname + // "LANGFLOW_DATABASE_URL" : `mysql+pymysql://${username}:${password}@${host}:3306/${dbname}`, + // "LANGFLOW_DATABASE_URL" : "sqlite:///./langflow.db", + // "LANGFLOW_LANGCHAIN_CACHE" : "SQLiteCache", + // "LANGFLOW_AUTO_LOGIN" : "false", + // "LANGFLOW_SUPERUSER" : "admin", + // "LANGFLOW_SUPERUSER_PASSWORD" : "1234567" + "LANGFLOW_AUTO_LOGIN" : process.env.LANGFLOW_AUTO_LOGIN ?? 'false', + "LANGFLOW_SUPERUSER" : process.env.LANGFLOW_SUPERUSER ?? "admin", + "LANGFLOW_SUPERUSER_PASSWORD" : process.env.LANGFLOW_SUPERUSER_PASSWORD ?? "123456" + }, + portMappings: [ + { + containerPort: containerPort, + protocol: ecs.Protocol.TCP, + }, + ], + // Secretの設定 + secrets: { + "dbname": ecs.Secret.fromSecretsManager(secretsDB, 'dbname'), + "username": ecs.Secret.fromSecretsManager(secretsDB, 'username'), + "host": ecs.Secret.fromSecretsManager(secretsDB, 'host'), + "password": ecs.Secret.fromSecretsManager(secretsDB, 'password'), + }, + }); + this.backendServiceName = 'backend' + const backendService = new ecs.FargateService(this, 'BackEndService', { + cluster: props.cluster, + serviceName: this.backendServiceName, + taskDefinition: backendTaskDefinition, + enableExecuteCommand: true, + securityGroups: [props.ecsBackSG], + cloudMapOptions: { + cloudMapNamespace: props.cloudmapNamespace, + containerPort: containerPort, + dnsRecordType: servicediscovery.DnsRecordType.A, + dnsTtl: Duration.seconds(10), + name: this.backendServiceName + }, + vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS }, + }); + + } +} \ No newline at end of file diff --git a/scripts/cdk/lib/construct/db.ts b/scripts/cdk/lib/construct/db.ts new file mode 100644 index 000000000..8be1f5212 --- /dev/null +++ b/scripts/cdk/lib/construct/db.ts @@ -0,0 +1,64 @@ +import { Construct } from 'constructs'; +import * as ec2 from 'aws-cdk-lib/aws-ec2' +import * as rds from "aws-cdk-lib/aws-rds"; + +interface RdsProps { + vpc: ec2.Vpc + dbSG:ec2.SecurityGroup +} + +export class Rds extends Construct{ + readonly rdsCluster: rds.DatabaseCluster + + constructor(scope: Construct, id:string, props: RdsProps){ + super(scope, id); + + const {vpc, dbSG} = props + const instanceType = ec2.InstanceType.of(ec2.InstanceClass.BURSTABLE4_GRAVITON, ec2.InstanceSize.MEDIUM) + + // RDSのパスワードを自動生成してSecrets Managerに格納 + const rdsCredentials = rds.Credentials.fromGeneratedSecret('db_user',{ + secretName: 'langflow-DbSecret', + }) + + // DB クラスターのパラメータグループ作成 + const clusterParameterGroup = new rds.ParameterGroup(scope, 'ClusterParameterGroup',{ + engine: rds.DatabaseClusterEngine.auroraMysql({ + version: rds.AuroraMysqlEngineVersion.VER_3_02_0 + }), + description: 'for-langflow', + }) + clusterParameterGroup.bindToCluster({}) + + // DB インスタンスのパラメタグループ作成 + const instanceParameterGroup = new rds.ParameterGroup(scope, 'InstanceParameterGroup',{ + engine: rds.DatabaseClusterEngine.auroraMysql({ + version: rds.AuroraMysqlEngineVersion.VER_3_02_0, + }), + description: 'for-langflow', + }) + instanceParameterGroup.bindToInstance({}) + + this.rdsCluster = new rds.DatabaseCluster(scope, 'LangflowDbCluster', { + engine: rds.DatabaseClusterEngine.auroraMysql({ + version: rds.AuroraMysqlEngineVersion.VER_3_02_0, + }), + storageEncrypted: true, + credentials: rdsCredentials, + instanceIdentifierBase: 'langflow-instance', + vpc:vpc, + vpcSubnets:vpc.selectSubnets({ + subnetGroupName: 'langflow-Isolated', + }), + securityGroups:[dbSG], + writer: rds.ClusterInstance.provisioned("WriterInstance", { + instanceType: instanceType, + enablePerformanceInsights: true, + parameterGroup:instanceParameterGroup, + }), + // 2台目以降はreaders:で設定 + parameterGroup: clusterParameterGroup, + defaultDatabaseName: 'langflow', + }) + } +} diff --git a/scripts/cdk/lib/construct/ecr.ts b/scripts/cdk/lib/construct/ecr.ts new file mode 100644 index 000000000..2ff25f9e9 --- /dev/null +++ b/scripts/cdk/lib/construct/ecr.ts @@ -0,0 +1,78 @@ +import { RemovalPolicy } from 'aws-cdk-lib' +import * as ecr from 'aws-cdk-lib/aws-ecr' +import * as ecrdeploy from 'cdk-ecr-deployment' +import * as ecs from 'aws-cdk-lib/aws-ecs' +import * as servicediscovery from 'aws-cdk-lib/aws-servicediscovery' +import { DockerImageAsset, Platform } from 'aws-cdk-lib/aws-ecr-assets' +import * as path from "path"; +import { Construct } from 'constructs' + + +interface ECRProps { + cloudmapNamespace: servicediscovery.PrivateDnsNamespace; + arch:ecs.CpuArchitecture; +} + +export class EcrRepository extends Construct { + readonly ecrFrontEndRepository: ecr.Repository + readonly ecrBackEndRepository: ecr.Repository + + constructor(scope: Construct, id: string, props: ECRProps) { + super(scope, id) + + const imagePlatform = props.arch == ecs.CpuArchitecture.ARM64 ? Platform.LINUX_ARM64 : Platform.LINUX_AMD64 + const backendPath = path.join(__dirname, "../../../../../", "langflow") + const frontendPath = path.join(__dirname, "../../../../src/", "frontend") + const excludeDir = ['node_modules','.git', 'cdk.out'] + const LifecycleRule = { + tagStatus: ecr.TagStatus.ANY, + description: 'Delete more than 30 image', + maxImageCount: 30, + } + + // リポジトリ作成 + this.ecrFrontEndRepository = new ecr.Repository(scope, 'LangflowFrontEndRepository', { + repositoryName: 'langflow-frontend-repository', + removalPolicy: RemovalPolicy.RETAIN, + imageScanOnPush: true, + }) + this.ecrBackEndRepository = new ecr.Repository(scope, 'LangflowBackEndRepository', { + repositoryName: 'langflow-backend-repository', + removalPolicy: RemovalPolicy.RETAIN, + imageScanOnPush: true, + }) + // LifecycleRule作成 + this.ecrFrontEndRepository.addLifecycleRule(LifecycleRule) + this.ecrBackEndRepository.addLifecycleRule(LifecycleRule) + + // Create Docker Image Asset + const dockerFrontEndImageAsset = new DockerImageAsset(this, "DockerFrontEndImageAsset", { + directory: frontendPath, + file:"dev.Dockerfile", + buildArgs:{ + "BACKEND_URL":`http://backend.${props.cloudmapNamespace.namespaceName}:7860` + }, + exclude: excludeDir, + platform: imagePlatform, + }); + const dockerBackEndImageAsset = new DockerImageAsset(this, "DockerBackEndImageAsset", { + directory: backendPath, + file:"dev.Dockerfile", + exclude: excludeDir, + platform: imagePlatform, + }); + + // Deploy Docker Image to ECR Repository + new ecrdeploy.ECRDeployment(this, "DeployFrontEndImage", { + src: new ecrdeploy.DockerImageName(dockerFrontEndImageAsset.imageUri), + dest: new ecrdeploy.DockerImageName(this.ecrFrontEndRepository.repositoryUri) + }); + + // Deploy Docker Image to ECR Repository + new ecrdeploy.ECRDeployment(this, "DeployBackEndImage", { + src: new ecrdeploy.DockerImageName(dockerBackEndImageAsset.imageUri), + dest: new ecrdeploy.DockerImageName(this.ecrBackEndRepository.repositoryUri) + }); + + } +} diff --git a/scripts/cdk/lib/construct/frontend.ts b/scripts/cdk/lib/construct/frontend.ts new file mode 100644 index 000000000..8238ed135 --- /dev/null +++ b/scripts/cdk/lib/construct/frontend.ts @@ -0,0 +1,117 @@ +import { Duration } from 'aws-cdk-lib' +import { Construct } from 'constructs' +import { + aws_ec2 as ec2, + aws_ecs as ecs, + aws_ecr as ecr, + aws_servicediscovery as servicediscovery, + aws_iam as iam, + aws_logs as logs, + aws_elasticloadbalancingv2 as elb, +} from 'aws-cdk-lib'; +import { CpuArchitecture } from 'aws-cdk-lib/aws-ecs'; + +interface FrontEndProps { + cluster:ecs.Cluster + ecsFrontSG:ec2.SecurityGroup + ecrFrontEndRepository:ecr.Repository + targetGroup: elb.ApplicationTargetGroup; + backendServiceName: string; + frontendTaskRole: iam.Role; + frontendTaskExecutionRole: iam.Role; + frontendLogGroup: logs.LogGroup; + cloudmapNamespace: servicediscovery.PrivateDnsNamespace; + arch:ecs.CpuArchitecture; +} + +export class FrontEndCluster extends Construct { + constructor(scope: Construct, id: string, props:FrontEndProps) { + super(scope, id) + + const containerPort = 3000 + const frontendTaskDefinition = new ecs.FargateTaskDefinition( + this, + 'FrontendTaskDef', + { + memoryLimitMiB: 3072, + cpu: 1024, + executionRole: props.frontendTaskExecutionRole, + runtimePlatform:{ + operatingSystemFamily: ecs.OperatingSystemFamily.LINUX, + cpuArchitecture: props.arch, + }, + taskRole: props.frontendTaskRole, + } + ); + const frontendServiceName = 'frontend' + frontendTaskDefinition.addContainer('frontendContainer', { + image: ecs.ContainerImage.fromEcrRepository(props.ecrFrontEndRepository, "latest"), + containerName:'langflow-front-container', + environment: { + BACKEND_SERVICE_NAME: props.backendServiceName, + BACKEND_URL: `http://${props.backendServiceName}.${props.cloudmapNamespace.namespaceName}:7860/`, + VITE_PROXY_TARGET: `http://${props.backendServiceName}.${props.cloudmapNamespace.namespaceName}:7860/`, + }, + logging: ecs.LogDriver.awsLogs({ + streamPrefix: 'my-stream', + logGroup: props.frontendLogGroup, + }), + portMappings: [ + { + name:frontendServiceName, + containerPort: containerPort, + protocol: ecs.Protocol.TCP, + appProtocol:ecs.AppProtocol.http, + }, + ], + }); + const frontendService = new ecs.FargateService( + this, + 'FrontendService', + { + serviceName: frontendServiceName, + cluster: props.cluster, + desiredCount: 1, + assignPublicIp: false, + taskDefinition: frontendTaskDefinition, + enableExecuteCommand: true, + securityGroups: [props.ecsFrontSG], + cloudMapOptions: { + cloudMapNamespace: props.cloudmapNamespace, + containerPort: containerPort, + dnsRecordType: servicediscovery.DnsRecordType.A, + dnsTtl: Duration.seconds(10), + name: frontendServiceName + }, + healthCheckGracePeriod: Duration.seconds(1000), + } + ); + + props.targetGroup.addTarget(frontendService); + + // // Create ALB and ECS Fargate Service + // const frontService = new ecs_patterns.ApplicationLoadBalancedFargateService( + // this, + // "FrontEndService", + // { + // cluster: cluster, + // serviceName: 'langflow-frontend-service', + // cpu: 256, + // memoryLimitMiB: 512, + // listenerPort: 80, + // assignPublicIp: true, // Public facing - ALB + // taskSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS }, + // securityGroups:[ecsFrontSG], + // taskImageOptions: { + // family: 'langflow-taskdef', + // containerName: 'langflow-front-container', + // image: ecs.ContainerImage.fromEcrRepository(ecrFrontEndRepository, "latest"), + // containerPort: 3000, // L2なので、TargetGroupのportが3000で設定されるはず + // }, + // loadBalancer:alb, + // openListener:false, + // } + // ); + + } +} \ No newline at end of file diff --git a/scripts/cdk/lib/construct/iam.ts b/scripts/cdk/lib/construct/iam.ts new file mode 100644 index 000000000..0a40cf340 --- /dev/null +++ b/scripts/cdk/lib/construct/iam.ts @@ -0,0 +1,101 @@ +import { RemovalPolicy, Duration } from 'aws-cdk-lib' +import { Construct } from 'constructs' +import { + aws_rds as rds, + aws_iam as iam, +} from 'aws-cdk-lib'; + +interface IAMProps { + rdsCluster:rds.DatabaseCluster +} + +export class EcsIAM extends Construct { + readonly frontendTaskRole: iam.Role; + readonly frontendTaskExecutionRole: iam.Role; + readonly backendTaskRole: iam.Role; + readonly backendTaskExecutionRole: iam.Role; + + constructor(scope: Construct, id: string, props:IAMProps) { + super(scope, id) + + // Policy Statements + // ECS Policy State + const ECSExecPolicyStatement = new iam.PolicyStatement({ + sid: 'allowECSExec', + resources: ['*'], + actions: [ + 'ecr:GetAuthorizationToken', + 'ecr:BatchCheckLayerAvailability', + 'ecr:GetDownloadUrlForLayer', + 'ecr:BatchGetImage', + ], + }); + // Bedrock Policy State + const BedrockPolicyStatement = new iam.PolicyStatement({ + sid: 'allowBedrockAccess', + resources: ['*'], + actions: [ + 'bedrock:*', + ], + }); + // Kendra Policy State + const KendraPolicyStatement = new iam.PolicyStatement({ + sid: 'allowKendraAccess', + resources: ['*'], + actions: [ + 'kendra:*' + ], + }); + // Create Rag Policy + const RagAccessPolicy = new iam.Policy(this, 'RAGFullAccess', { + statements: [KendraPolicyStatement,BedrockPolicyStatement], + }) + // Secrets ManagerからDB認証情報を取ってくるためのPolicy + const SecretsManagerPolicy = new iam.Policy(this, 'SMGetPolicy', { + statements: [new iam.PolicyStatement({ + actions: ['secretsmanager:GetSecretValue'], + resources: [props.rdsCluster.secret!.secretArn], + })], + }) + + // FrontEnd Task Role + this.frontendTaskRole = new iam.Role(this, 'FrontendTaskRole', { + assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), + }); + this.frontendTaskRole.addToPolicy(ECSExecPolicyStatement); + + // BackEnd Task Role + this.backendTaskRole = new iam.Role(this, 'BackendTaskRole', { + assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), + }); + // ECS Exec Policyの付与 + this.backendTaskRole.addToPolicy(ECSExecPolicyStatement); + // KendraとBedrockのアクセス権付与 + this.backendTaskRole.attachInlinePolicy(RagAccessPolicy); + + // FrontEnd Task ExecutionRole + this.frontendTaskExecutionRole = new iam.Role(this, 'frontendTaskExecutionRole', { + assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), + managedPolicies: [ + { + managedPolicyArn: + 'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy', + }, + ], + }); + + // BackEnd Task ExecutionRole + this.backendTaskExecutionRole = new iam.Role(this, 'backendTaskExecutionRole', { + assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), + managedPolicies: [ + { + managedPolicyArn: + 'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy', + }, + ], + }); + + this.backendTaskExecutionRole.attachInlinePolicy(SecretsManagerPolicy); + this.backendTaskExecutionRole.attachInlinePolicy(RagAccessPolicy); + } +} \ No newline at end of file diff --git a/scripts/cdk/lib/construct/index.ts b/scripts/cdk/lib/construct/index.ts new file mode 100644 index 000000000..8c2efcb1b --- /dev/null +++ b/scripts/cdk/lib/construct/index.ts @@ -0,0 +1,6 @@ +export * from './db'; +export * from './ecr'; +export * from './iam'; +export * from './frontend'; +export * from './backend'; +export * from './network'; \ No newline at end of file diff --git a/scripts/cdk/lib/construct/network.ts b/scripts/cdk/lib/construct/network.ts new file mode 100644 index 000000000..aa9e48dc5 --- /dev/null +++ b/scripts/cdk/lib/construct/network.ts @@ -0,0 +1,139 @@ +import { RemovalPolicy, Duration } from 'aws-cdk-lib' +import { Construct } from 'constructs' +import { + aws_ec2 as ec2, + aws_ecs as ecs, + aws_logs as logs, + aws_servicediscovery as servicediscovery, + aws_elasticloadbalancingv2 as elb, +} from 'aws-cdk-lib'; + +export class Network extends Construct { + readonly vpc: ec2.Vpc; + readonly cluster: ecs.Cluster; + readonly alb: elb.IApplicationLoadBalancer; + readonly targetGroup: elb.ApplicationTargetGroup; + readonly cloudmapNamespace: servicediscovery.PrivateDnsNamespace; + readonly ecsFrontSG: ec2.SecurityGroup; + readonly ecsBackSG: ec2.SecurityGroup; + readonly dbSG: ec2.SecurityGroup; + readonly albSG: ec2.SecurityGroup; + readonly backendLogGroup: logs.LogGroup; + readonly frontendLogGroup: logs.LogGroup; + + constructor(scope: Construct, id: string) { + super(scope, id) + const alb_listen_port=80 + const front_service_port=3000 + const back_service_port=7860 + + // VPC等リソースの作成 + this.vpc = new ec2.Vpc(scope, 'VPC', { + vpcName: 'langflow-vpc', + ipAddresses: ec2.IpAddresses.cidr('10.0.0.0/16'), + maxAzs: 3, + subnetConfiguration: [ + { + cidrMask: 24, + name: 'langflow-Isolated', + subnetType: ec2.SubnetType.PRIVATE_ISOLATED, + }, + { + cidrMask: 24, + name: 'langflow-Public', + subnetType: ec2.SubnetType.PUBLIC, + }, + { + cidrMask: 24, + name: 'langflow-Private', + subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS + }, + ], + natGateways: 1, + }) + // Cluster + this.cluster = new ecs.Cluster(this, 'EcsCluster', { + clusterName: 'langflow-cluster', + vpc: this.vpc, + enableFargateCapacityProviders: true, + }); + + // Private DNS + this.cloudmapNamespace = new servicediscovery.PrivateDnsNamespace( + this, + 'Namespace', + { + name: 'ecs-deploy.com', + vpc: this.vpc, + } + ); + + // ALBに設定するセキュリティグループ + this.albSG = new ec2.SecurityGroup(scope, 'ALBSecurityGroup', { + securityGroupName: 'alb-sg', + description: 'for alb', + vpc: this.vpc, + }) + this.albSG.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(alb_listen_port)) + + this.alb = new elb.ApplicationLoadBalancer(this,'alb',{ + internetFacing: true, //インターネットからのアクセスを許可するかどうか指定 + loadBalancerName: 'alb', + securityGroup: this.albSG, //作成したセキュリティグループを割り当てる + vpc:this.vpc, + }) + + const listener = this.alb.addListener('Listener', { port: alb_listen_port }); + + this.targetGroup = listener.addTargets('targetGroup', { + port: front_service_port, + protocol: elb.ApplicationProtocol.HTTP, + healthCheck: { + enabled: true, + path: '/health', + healthyThresholdCount: 2, + unhealthyThresholdCount: 4, + interval: Duration.seconds(100), + timeout: Duration.seconds(30), + healthyHttpCodes: '200', + }, + }); + + // ECS FrontEndに設定するセキュリティグループ + this.ecsFrontSG = new ec2.SecurityGroup(scope, 'ECSFrontEndSecurityGroup', { + securityGroupName: 'langflow-ecs-front-sg', + description: 'for langflow-front-ecs', + vpc: this.vpc, + }) + this.ecsFrontSG.addIngressRule(this.albSG, ec2.Port.allTcp()) + + // ECS BackEndに設定するセキュリティグループ + this.ecsBackSG = new ec2.SecurityGroup(scope, 'ECSBackEndSecurityGroup', { + securityGroupName: 'langflow-ecs-back-sg', + description: 'for langflow-back-ecs', + vpc: this.vpc, + }) + this.ecsBackSG.addIngressRule(this.ecsFrontSG, ec2.Port.tcp(back_service_port)) + + // RDSに設定するセキュリティグループ + this.dbSG = new ec2.SecurityGroup(scope, 'DBSecurityGroup', { + allowAllOutbound: true, + securityGroupName: 'langflow-db', + description: 'for langflow-db', + vpc: this.vpc, + }) + // AppRunnerSecurityGroupからのポート3306:mysql(5432:postgres)のインバウンドを許可 + this.dbSG.addIngressRule(this.ecsBackSG, ec2.Port.tcp(3306)) + + // Create CloudWatch Log Group + this.backendLogGroup = new logs.LogGroup(this, 'backendLogGroup', { + logGroupName: 'myapp-backend', + removalPolicy: RemovalPolicy.DESTROY, + }); + + this.frontendLogGroup = new logs.LogGroup(this, 'frontendLogGroup', { + logGroupName: 'myapp-frontend', + removalPolicy: RemovalPolicy.DESTROY, + }); + } +} \ No newline at end of file diff --git a/scripts/cdk/package-lock.json b/scripts/cdk/package-lock.json new file mode 100644 index 000000000..e5b70161b --- /dev/null +++ b/scripts/cdk/package-lock.json @@ -0,0 +1,4601 @@ +{ + "name": "cdk", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "cdk", + "version": "0.1.0", + "dependencies": { + "aws-cdk-lib": "^2.86.0", + "cdk-ecr-deployment": "^2.5.30", + "constructs": "^10.0.0", + "source-map-support": "^0.5.21" + }, + "bin": { + "cdk": "bin/cdk.js" + }, + "devDependencies": { + "@types/jest": "^29.5.1", + "@types/node": "20.1.7", + "aws-cdk": "2.86.0", + "jest": "^29.5.0", + "ts-jest": "^29.1.0", + "ts-node": "^10.9.1", + "typescript": "~5.1.3" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@aws-cdk/asset-awscli-v1": { + "version": "2.2.201", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.201.tgz", + "integrity": "sha512-INZqcwDinNaIdb5CtW3ez5s943nX5stGBQS6VOP2JDlOFP81hM3fds/9NDknipqfUkZM43dx+HgVvkXYXXARCQ==" + }, + "node_modules/@aws-cdk/asset-kubectl-v20": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-kubectl-v20/-/asset-kubectl-v20-2.1.2.tgz", + "integrity": "sha512-3M2tELJOxQv0apCIiuKQ4pAbncz9GuLwnKFqxifWfe77wuMxyTRPmxssYHs42ePqzap1LT6GDcPygGs+hHstLg==" + }, + "node_modules/@aws-cdk/asset-node-proxy-agent-v5": { + "version": "2.0.166", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v5/-/asset-node-proxy-agent-v5-2.0.166.tgz", + "integrity": "sha512-j0xnccpUQHXJKPgCwQcGGNu4lRiC1PptYfdxBIH1L4dRK91iBxtSQHESRQX+yB47oGLaF/WfNN/aF3WXwlhikg==" + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", + "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", + "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", + "dev": true, + "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", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", + "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.3", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, + "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" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", + "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz", + "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.3", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.3", + "@babel/types": "^7.23.3", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", + "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.4.tgz", + "integrity": "sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.7", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", + "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", + "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.8", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.8.tgz", + "integrity": "sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/node": { + "version": "20.1.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.7.tgz", + "integrity": "sha512-WCuw/o4GSwDGMoonES8rcvwsig77dGCMbZDrZr2x4ZZiNW4P/gcoZXe/0twgtobcTkmg9TuKflxYL/DuwDyJzg==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "17.0.31", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", + "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", + "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aws-cdk": { + "version": "2.86.0", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.86.0.tgz", + "integrity": "sha512-GRcdU6p00Zu3fIZYPG+EbpDYppYMtzebuf0jrmCfKhCytRGaPWDHHfu3hrv0de4d0zbUD/+AmiODPMu3J6nXbQ==", + "dev": true, + "bin": { + "cdk": "bin/cdk" + }, + "engines": { + "node": ">= 14.15.0" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/aws-cdk-lib": { + "version": "2.86.0", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.86.0.tgz", + "integrity": "sha512-76yZ2MawAGXLD3ox4FjhUIPmAMXteGKkeo3tPMthemusDCCkD2X6DBssXBHjB7r9GnrOMMf8JH5BGq2lOZ539g==", + "bundleDependencies": [ + "@balena/dockerignore", + "case", + "fs-extra", + "ignore", + "jsonschema", + "minimatch", + "punycode", + "semver", + "table", + "yaml" + ], + "dependencies": { + "@aws-cdk/asset-awscli-v1": "^2.2.177", + "@aws-cdk/asset-kubectl-v20": "^2.1.1", + "@aws-cdk/asset-node-proxy-agent-v5": "^2.0.148", + "@balena/dockerignore": "^1.0.2", + "case": "1.6.3", + "fs-extra": "^11.1.1", + "ignore": "^5.2.4", + "jsonschema": "^1.4.1", + "minimatch": "^3.1.2", + "punycode": "^2.3.0", + "semver": "^7.5.1", + "table": "^6.8.1", + "yaml": "1.10.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "constructs": "^10.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/@balena/dockerignore": { + "version": "1.0.2", + "inBundle": true, + "license": "Apache-2.0" + }, + "node_modules/aws-cdk-lib/node_modules/ajv": { + "version": "8.12.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/aws-cdk-lib/node_modules/ansi-regex": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/ansi-styles": { + "version": "4.3.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/aws-cdk-lib/node_modules/astral-regex": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/balanced-match": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/brace-expansion": { + "version": "1.1.11", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/aws-cdk-lib/node_modules/case": { + "version": "1.6.3", + "inBundle": true, + "license": "(MIT OR GPL-3.0-or-later)", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/color-convert": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/color-name": { + "version": "1.1.4", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/concat-map": { + "version": "0.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/emoji-regex": { + "version": "8.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/fast-deep-equal": { + "version": "3.1.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/fs-extra": { + "version": "11.1.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/aws-cdk-lib/node_modules/graceful-fs": { + "version": "4.2.11", + "inBundle": true, + "license": "ISC" + }, + "node_modules/aws-cdk-lib/node_modules/ignore": { + "version": "5.2.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/aws-cdk-lib/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/json-schema-traverse": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/jsonfile": { + "version": "6.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/aws-cdk-lib/node_modules/jsonschema": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/aws-cdk-lib/node_modules/lodash.truncate": { + "version": "4.4.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aws-cdk-lib/node_modules/minimatch": { + "version": "3.1.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/aws-cdk-lib/node_modules/punycode": { + "version": "2.3.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/aws-cdk-lib/node_modules/require-from-string": { + "version": "2.0.2", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/semver": { + "version": "7.5.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aws-cdk-lib/node_modules/slice-ansi": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/aws-cdk-lib/node_modules/string-width": { + "version": "4.2.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/strip-ansi": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/table": { + "version": "6.8.1", + "inBundle": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/universalify": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/uri-js": { + "version": "4.4.1", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/aws-cdk-lib/node_modules/yaml": { + "version": "1.10.2", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001561", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz", + "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/cdk-ecr-deployment": { + "version": "2.5.30", + "resolved": "https://registry.npmjs.org/cdk-ecr-deployment/-/cdk-ecr-deployment-2.5.30.tgz", + "integrity": "sha512-IFS/DD6OmNcXv24YKjjaz1sb04xxsoUb7vPYwx7kTBAOxOnT0CuAadF8/HVfM/YVoqoOPXCJe3ikAXy1iI0nKw==", + "bundleDependencies": [ + "got", + "hpagent" + ], + "dependencies": { + "aws-cdk-lib": "^2.0.0", + "constructs": "^10.0.5", + "got": "^11.8.6", + "hpagent": "^0.1.2" + }, + "peerDependencies": { + "aws-cdk-lib": "^2.0.0", + "constructs": "^10.0.5" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/@sindresorhus/is": { + "version": "4.6.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "inBundle": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/@types/cacheable-request": { + "version": "6.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/@types/cacheable-request/node_modules/@types/node": { + "version": "20.3.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdk-ecr-deployment/node_modules/@types/http-cache-semantics": { + "version": "4.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdk-ecr-deployment/node_modules/@types/keyv": { + "version": "3.1.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/@types/keyv/node_modules/@types/node": { + "version": "20.3.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdk-ecr-deployment/node_modules/@types/responselike": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/@types/responselike/node_modules/@types/node": { + "version": "20.3.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdk-ecr-deployment/node_modules/cacheable-lookup": { + "version": "5.0.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/cacheable-request": { + "version": "7.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/clone-response": { + "version": "1.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/clone-response/node_modules/mimic-response": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/decompress-response": { + "version": "6.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/defer-to-connect": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/end-of-stream": { + "version": "1.4.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/got": { + "version": "11.8.6", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/hpagent": { + "version": "0.1.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdk-ecr-deployment/node_modules/http-cache-semantics": { + "version": "4.1.1", + "inBundle": true, + "license": "BSD-2-Clause" + }, + "node_modules/cdk-ecr-deployment/node_modules/http2-wrapper": { + "version": "1.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/json-buffer": { + "version": "3.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdk-ecr-deployment/node_modules/keyv": { + "version": "4.5.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/lowercase-keys": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/mimic-response": { + "version": "3.1.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/normalize-url": { + "version": "6.1.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/once": { + "version": "1.4.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/p-cancelable": { + "version": "2.1.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/pump": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/quick-lru": { + "version": "5.1.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/resolve-alpn": { + "version": "1.2.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdk-ecr-deployment/node_modules/responselike": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/wrappy": { + "version": "1.0.2", + "inBundle": true, + "license": "ISC" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/constructs": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.3.0.tgz", + "integrity": "sha512-vbK8i3rIb/xwZxSpTjz3SagHn1qq9BChLEfy5Hf6fB3/2eFbrwt2n9kHwQcS0CPTRBesreeAcsJfMq2229FnbQ==", + "engines": { + "node": ">= 16.14.0" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.580", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.580.tgz", + "integrity": "sha512-T5q3pjQon853xxxHUq3ZP68ZpvJHuSMY2+BZaW3QzjS4HvNuvsMmZ/+lU+nCrftre1jFZ+OSlExynXWBihnXzw==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", + "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "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" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pure-rand": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", + "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-jest": { + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", + "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "^7.5.3", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz", + "integrity": "sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/scripts/cdk/package.json b/scripts/cdk/package.json new file mode 100644 index 000000000..05ef554d9 --- /dev/null +++ b/scripts/cdk/package.json @@ -0,0 +1,28 @@ +{ + "name": "cdk", + "version": "0.1.0", + "bin": { + "cdk": "bin/cdk.js" + }, + "scripts": { + "build": "tsc", + "watch": "tsc -w", + "test": "jest", + "cdk": "cdk" + }, + "devDependencies": { + "@types/jest": "^29.5.1", + "@types/node": "20.1.7", + "aws-cdk": "2.86.0", + "jest": "^29.5.0", + "ts-jest": "^29.1.0", + "ts-node": "^10.9.1", + "typescript": "~5.1.3" + }, + "dependencies": { + "aws-cdk-lib": "^2.86.0", + "cdk-ecr-deployment": "^2.5.30", + "constructs": "^10.0.0", + "source-map-support": "^0.5.21" + } +} diff --git a/scripts/cdk/test/cdk.test.ts b/scripts/cdk/test/cdk.test.ts new file mode 100644 index 000000000..1e6b29c85 --- /dev/null +++ b/scripts/cdk/test/cdk.test.ts @@ -0,0 +1,17 @@ +// import * as cdk from 'aws-cdk-lib'; +// import { Template } from 'aws-cdk-lib/assertions'; +// import * as Cdk from '../lib/cdk-stack'; + +// example test. To run these tests, uncomment this file along with the +// example resource in lib/cdk-stack.ts +test('SQS Queue Created', () => { +// const app = new cdk.App(); +// // WHEN +// const stack = new Cdk.CdkStack(app, 'MyTestStack'); +// // THEN +// const template = Template.fromStack(stack); + +// template.hasResourceProperties('AWS::SQS::Queue', { +// VisibilityTimeout: 300 +// }); +}); diff --git a/src/frontend/Dockerfile b/src/frontend/Dockerfile index 0b33e09b8..024eab562 100644 --- a/src/frontend/Dockerfile +++ b/src/frontend/Dockerfile @@ -1,26 +1,16 @@ -#baseline -FROM --platform=linux/amd64 node:19-bullseye-slim AS base -RUN mkdir -p /home/node/app -RUN chown -R node:node /home/node && chmod -R 770 /home/node -RUN apt-get update && apt-get install -y jq curl -WORKDIR /home/node/app - -# client build -FROM base AS builder-client +FROM node:20-alpine as frontend_build ARG BACKEND_URL -ENV BACKEND_URL $BACKEND_URL -RUN echo "BACKEND_URL: $BACKEND_URL" +WORKDIR /app -WORKDIR /home/node/app -COPY --chown=node:node . ./ +COPY ./package.json ./package-lock.json ./tsconfig.json ./vite.config.ts ./index.html ./tailwind.config.js ./postcss.config.js ./prettier.config.js /app/ +RUN npm install +COPY ./src /app/src +RUN npm run build -COPY ./set_proxy.sh . -RUN chmod +x set_proxy.sh && \ - cat set_proxy.sh | tr -d '\r' > set_proxy_unix.sh && \ - chmod +x set_proxy_unix.sh && \ - ./set_proxy_unix.sh - -USER node - -RUN npm install --loglevel warn -CMD ["npm", "run", "dev:docker"] \ No newline at end of file +FROM nginx +COPY --from=frontend_build /app/build/ /usr/share/nginx/html +COPY /nginx.conf /etc/nginx/conf.d/default.conf +COPY start-nginx.sh /start-nginx.sh +RUN chmod +x /start-nginx.sh +ENV BACKEND_URL=$BACKEND_URL +CMD ["/start-nginx.sh"] \ No newline at end of file diff --git a/src/frontend/dev.Dockerfile b/src/frontend/dev.Dockerfile new file mode 100644 index 000000000..0b33e09b8 --- /dev/null +++ b/src/frontend/dev.Dockerfile @@ -0,0 +1,26 @@ +#baseline +FROM --platform=linux/amd64 node:19-bullseye-slim AS base +RUN mkdir -p /home/node/app +RUN chown -R node:node /home/node && chmod -R 770 /home/node +RUN apt-get update && apt-get install -y jq curl +WORKDIR /home/node/app + +# client build +FROM base AS builder-client +ARG BACKEND_URL +ENV BACKEND_URL $BACKEND_URL +RUN echo "BACKEND_URL: $BACKEND_URL" + +WORKDIR /home/node/app +COPY --chown=node:node . ./ + +COPY ./set_proxy.sh . +RUN chmod +x set_proxy.sh && \ + cat set_proxy.sh | tr -d '\r' > set_proxy_unix.sh && \ + chmod +x set_proxy_unix.sh && \ + ./set_proxy_unix.sh + +USER node + +RUN npm install --loglevel warn +CMD ["npm", "run", "dev:docker"] \ No newline at end of file diff --git a/src/frontend/prod.Dockerfile b/src/frontend/prod.Dockerfile deleted file mode 100644 index 024eab562..000000000 --- a/src/frontend/prod.Dockerfile +++ /dev/null @@ -1,16 +0,0 @@ -FROM node:20-alpine as frontend_build -ARG BACKEND_URL -WORKDIR /app - -COPY ./package.json ./package-lock.json ./tsconfig.json ./vite.config.ts ./index.html ./tailwind.config.js ./postcss.config.js ./prettier.config.js /app/ -RUN npm install -COPY ./src /app/src -RUN npm run build - -FROM nginx -COPY --from=frontend_build /app/build/ /usr/share/nginx/html -COPY /nginx.conf /etc/nginx/conf.d/default.conf -COPY start-nginx.sh /start-nginx.sh -RUN chmod +x /start-nginx.sh -ENV BACKEND_URL=$BACKEND_URL -CMD ["/start-nginx.sh"] \ No newline at end of file From b2d5a1d808c71eadf4e2526c0d99a2fe76fffb22 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 30 Nov 2023 16:36:13 +0900 Subject: [PATCH 033/203] modify docker-compose --- docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 50fe44441..81914ee40 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,7 +6,7 @@ services: backend: build: context: ./ - dockerfile: ./Dockerfile + dockerfile: ./dev.Dockerfile env_file: - .env ports: @@ -19,7 +19,7 @@ services: frontend: build: context: ./src/frontend - dockerfile: ./Dockerfile + dockerfile: ./dev.Dockerfile args: - BACKEND_URL=http://backend:7860 environment: From d7f40cfda79b5fef9a94677fdd5b7fbe6a2df53c Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 30 Nov 2023 16:47:30 +0900 Subject: [PATCH 034/203] =?UTF-8?q?=E6=9C=AC=E5=AE=B6=E3=81=AE=E8=B8=8F?= =?UTF-8?q?=E8=A5=B2=E3=81=AE=E3=81=9F=E3=82=81=E3=80=81Dockerfile?= =?UTF-8?q?=E3=82=92=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cdk.Dockerfile | 20 ++++++++++++++ dev.Dockerfile | 2 +- scripts/{cdk => aws}/.env.example | 0 scripts/{cdk => aws}/.gitignore | 0 scripts/{cdk => aws}/.npmignore | 0 scripts/{cdk => aws}/README.md | 0 scripts/{cdk => aws}/bin/cdk.ts | 0 scripts/{cdk => aws}/cdk.json | 0 scripts/{cdk => aws}/delete-docker-images.sh | 0 scripts/{cdk => aws}/delete-ecr.sh | 0 scripts/{cdk => aws}/jest.config.js | 0 scripts/{cdk => aws}/lib/cdk-stack.ts | 0 scripts/{cdk => aws}/lib/construct/backend.ts | 0 scripts/{cdk => aws}/lib/construct/db.ts | 0 scripts/{cdk => aws}/lib/construct/ecr.ts | 0 .../{cdk => aws}/lib/construct/frontend.ts | 0 scripts/{cdk => aws}/lib/construct/iam.ts | 0 scripts/{cdk => aws}/lib/construct/index.ts | 0 scripts/{cdk => aws}/lib/construct/network.ts | 0 scripts/{cdk => aws}/package-lock.json | 0 scripts/{cdk => aws}/package.json | 0 scripts/{cdk => aws}/test/cdk.test.ts | 0 src/frontend/cdk.Dockerfile | 26 +++++++++++++++++++ src/frontend/dev.Dockerfile | 4 +-- 24 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 cdk.Dockerfile rename scripts/{cdk => aws}/.env.example (100%) rename scripts/{cdk => aws}/.gitignore (100%) rename scripts/{cdk => aws}/.npmignore (100%) rename scripts/{cdk => aws}/README.md (100%) rename scripts/{cdk => aws}/bin/cdk.ts (100%) rename scripts/{cdk => aws}/cdk.json (100%) rename scripts/{cdk => aws}/delete-docker-images.sh (100%) rename scripts/{cdk => aws}/delete-ecr.sh (100%) rename scripts/{cdk => aws}/jest.config.js (100%) rename scripts/{cdk => aws}/lib/cdk-stack.ts (100%) rename scripts/{cdk => aws}/lib/construct/backend.ts (100%) rename scripts/{cdk => aws}/lib/construct/db.ts (100%) rename scripts/{cdk => aws}/lib/construct/ecr.ts (100%) rename scripts/{cdk => aws}/lib/construct/frontend.ts (100%) rename scripts/{cdk => aws}/lib/construct/iam.ts (100%) rename scripts/{cdk => aws}/lib/construct/index.ts (100%) rename scripts/{cdk => aws}/lib/construct/network.ts (100%) rename scripts/{cdk => aws}/package-lock.json (100%) rename scripts/{cdk => aws}/package.json (100%) rename scripts/{cdk => aws}/test/cdk.test.ts (100%) create mode 100644 src/frontend/cdk.Dockerfile diff --git a/cdk.Dockerfile b/cdk.Dockerfile new file mode 100644 index 000000000..44ccf0acb --- /dev/null +++ b/cdk.Dockerfile @@ -0,0 +1,20 @@ +FROM --platform=linux/amd64 python:3.10-slim + +WORKDIR /app + +# Install Poetry +RUN apt-get update && apt-get install gcc g++ curl build-essential postgresql-server-dev-all -y +RUN curl -sSL https://install.python-poetry.org | python3 - +# # Add Poetry to PATH +ENV PATH="${PATH}:/root/.local/bin" +# # Copy the pyproject.toml and poetry.lock files +COPY poetry.lock pyproject.toml ./ +# Copy the rest of the application codes +COPY ./ ./ + +# Install dependencies +RUN poetry config virtualenvs.create false && poetry install --no-interaction --no-ansi + +RUN poetry add pymysql==1.0.2 + +CMD ["uvicorn", "--factory", "src.backend.langflow.main:create_app", "--host", "0.0.0.0", "--port", "7860", "--reload", "--log-level", "debug"] diff --git a/dev.Dockerfile b/dev.Dockerfile index ce5715e1f..ed3631516 100644 --- a/dev.Dockerfile +++ b/dev.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 python:3.10-slim +FROM python:3.10-slim WORKDIR /app diff --git a/scripts/cdk/.env.example b/scripts/aws/.env.example similarity index 100% rename from scripts/cdk/.env.example rename to scripts/aws/.env.example diff --git a/scripts/cdk/.gitignore b/scripts/aws/.gitignore similarity index 100% rename from scripts/cdk/.gitignore rename to scripts/aws/.gitignore diff --git a/scripts/cdk/.npmignore b/scripts/aws/.npmignore similarity index 100% rename from scripts/cdk/.npmignore rename to scripts/aws/.npmignore diff --git a/scripts/cdk/README.md b/scripts/aws/README.md similarity index 100% rename from scripts/cdk/README.md rename to scripts/aws/README.md diff --git a/scripts/cdk/bin/cdk.ts b/scripts/aws/bin/cdk.ts similarity index 100% rename from scripts/cdk/bin/cdk.ts rename to scripts/aws/bin/cdk.ts diff --git a/scripts/cdk/cdk.json b/scripts/aws/cdk.json similarity index 100% rename from scripts/cdk/cdk.json rename to scripts/aws/cdk.json diff --git a/scripts/cdk/delete-docker-images.sh b/scripts/aws/delete-docker-images.sh similarity index 100% rename from scripts/cdk/delete-docker-images.sh rename to scripts/aws/delete-docker-images.sh diff --git a/scripts/cdk/delete-ecr.sh b/scripts/aws/delete-ecr.sh similarity index 100% rename from scripts/cdk/delete-ecr.sh rename to scripts/aws/delete-ecr.sh diff --git a/scripts/cdk/jest.config.js b/scripts/aws/jest.config.js similarity index 100% rename from scripts/cdk/jest.config.js rename to scripts/aws/jest.config.js diff --git a/scripts/cdk/lib/cdk-stack.ts b/scripts/aws/lib/cdk-stack.ts similarity index 100% rename from scripts/cdk/lib/cdk-stack.ts rename to scripts/aws/lib/cdk-stack.ts diff --git a/scripts/cdk/lib/construct/backend.ts b/scripts/aws/lib/construct/backend.ts similarity index 100% rename from scripts/cdk/lib/construct/backend.ts rename to scripts/aws/lib/construct/backend.ts diff --git a/scripts/cdk/lib/construct/db.ts b/scripts/aws/lib/construct/db.ts similarity index 100% rename from scripts/cdk/lib/construct/db.ts rename to scripts/aws/lib/construct/db.ts diff --git a/scripts/cdk/lib/construct/ecr.ts b/scripts/aws/lib/construct/ecr.ts similarity index 100% rename from scripts/cdk/lib/construct/ecr.ts rename to scripts/aws/lib/construct/ecr.ts diff --git a/scripts/cdk/lib/construct/frontend.ts b/scripts/aws/lib/construct/frontend.ts similarity index 100% rename from scripts/cdk/lib/construct/frontend.ts rename to scripts/aws/lib/construct/frontend.ts diff --git a/scripts/cdk/lib/construct/iam.ts b/scripts/aws/lib/construct/iam.ts similarity index 100% rename from scripts/cdk/lib/construct/iam.ts rename to scripts/aws/lib/construct/iam.ts diff --git a/scripts/cdk/lib/construct/index.ts b/scripts/aws/lib/construct/index.ts similarity index 100% rename from scripts/cdk/lib/construct/index.ts rename to scripts/aws/lib/construct/index.ts diff --git a/scripts/cdk/lib/construct/network.ts b/scripts/aws/lib/construct/network.ts similarity index 100% rename from scripts/cdk/lib/construct/network.ts rename to scripts/aws/lib/construct/network.ts diff --git a/scripts/cdk/package-lock.json b/scripts/aws/package-lock.json similarity index 100% rename from scripts/cdk/package-lock.json rename to scripts/aws/package-lock.json diff --git a/scripts/cdk/package.json b/scripts/aws/package.json similarity index 100% rename from scripts/cdk/package.json rename to scripts/aws/package.json diff --git a/scripts/cdk/test/cdk.test.ts b/scripts/aws/test/cdk.test.ts similarity index 100% rename from scripts/cdk/test/cdk.test.ts rename to scripts/aws/test/cdk.test.ts diff --git a/src/frontend/cdk.Dockerfile b/src/frontend/cdk.Dockerfile new file mode 100644 index 000000000..0b33e09b8 --- /dev/null +++ b/src/frontend/cdk.Dockerfile @@ -0,0 +1,26 @@ +#baseline +FROM --platform=linux/amd64 node:19-bullseye-slim AS base +RUN mkdir -p /home/node/app +RUN chown -R node:node /home/node && chmod -R 770 /home/node +RUN apt-get update && apt-get install -y jq curl +WORKDIR /home/node/app + +# client build +FROM base AS builder-client +ARG BACKEND_URL +ENV BACKEND_URL $BACKEND_URL +RUN echo "BACKEND_URL: $BACKEND_URL" + +WORKDIR /home/node/app +COPY --chown=node:node . ./ + +COPY ./set_proxy.sh . +RUN chmod +x set_proxy.sh && \ + cat set_proxy.sh | tr -d '\r' > set_proxy_unix.sh && \ + chmod +x set_proxy_unix.sh && \ + ./set_proxy_unix.sh + +USER node + +RUN npm install --loglevel warn +CMD ["npm", "run", "dev:docker"] \ No newline at end of file diff --git a/src/frontend/dev.Dockerfile b/src/frontend/dev.Dockerfile index 0b33e09b8..8678b02dd 100644 --- a/src/frontend/dev.Dockerfile +++ b/src/frontend/dev.Dockerfile @@ -1,8 +1,8 @@ #baseline -FROM --platform=linux/amd64 node:19-bullseye-slim AS base +FROM node:19-bullseye-slim AS base RUN mkdir -p /home/node/app RUN chown -R node:node /home/node && chmod -R 770 /home/node -RUN apt-get update && apt-get install -y jq curl +RUN apt-get update && apt-get install -y jq WORKDIR /home/node/app # client build From 979b8e2c467198980708a6282e6216eb7db90e44 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 30 Nov 2023 16:52:54 +0900 Subject: [PATCH 035/203] =?UTF-8?q?Dockerfile=E7=AD=89=E3=82=92v0.5.6?= =?UTF-8?q?=E3=81=AE=E3=82=82=E3=81=AE=E3=81=A8=E4=B8=80=E7=B7=92=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 4 ++-- poetry.lock | 64 +------------------------------------------------- pyproject.toml | 1 - 3 files changed, 3 insertions(+), 66 deletions(-) diff --git a/Dockerfile b/Dockerfile index 520c407de..c44426c64 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,5 +11,5 @@ WORKDIR $HOME/app COPY --chown=user . $HOME/app -RUN pip install langflow>==0.0.86 -U --user -CMD ["python", "-m", "langflow", "run", "--host", "0.0.0.0", "--port", "7860"] +RUN pip install langflow>==0.5.0 -U --user +CMD ["python", "-m", "langflow", "run", "--host", "0.0.0.0", "--port", "7860"] \ No newline at end of file diff --git a/poetry.lock b/poetry.lock index 7d3a7ec01..d5a555874 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3736,13 +3736,10 @@ files = [ {file = "lxml-4.9.3-cp27-cp27m-macosx_11_0_x86_64.whl", hash = "sha256:b0a545b46b526d418eb91754565ba5b63b1c0b12f9bd2f808c852d9b4b2f9b5c"}, {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:075b731ddd9e7f68ad24c635374211376aa05a281673ede86cbe1d1b3455279d"}, {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1e224d5755dba2f4a9498e150c43792392ac9b5380aa1b845f98a1618c94eeef"}, - {file = "lxml-4.9.3-cp27-cp27m-win32.whl", hash = "sha256:2c74524e179f2ad6d2a4f7caf70e2d96639c0954c943ad601a9e146c76408ed7"}, - {file = "lxml-4.9.3-cp27-cp27m-win_amd64.whl", hash = "sha256:4f1026bc732b6a7f96369f7bfe1a4f2290fb34dce00d8644bc3036fb351a4ca1"}, {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0781a98ff5e6586926293e59480b64ddd46282953203c76ae15dbbbf302e8bb"}, {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cef2502e7e8a96fe5ad686d60b49e1ab03e438bd9123987994528febd569868e"}, {file = "lxml-4.9.3-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b86164d2cff4d3aaa1f04a14685cbc072efd0b4f99ca5708b2ad1b9b5988a991"}, {file = "lxml-4.9.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:42871176e7896d5d45138f6d28751053c711ed4d48d8e30b498da155af39aebd"}, - {file = "lxml-4.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:ae8b9c6deb1e634ba4f1930eb67ef6e6bf6a44b6eb5ad605642b2d6d5ed9ce3c"}, {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:411007c0d88188d9f621b11d252cce90c4a2d1a49db6c068e3c16422f306eab8"}, {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:cd47b4a0d41d2afa3e58e5bf1f62069255aa2fd6ff5ee41604418ca925911d76"}, {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e2cb47860da1f7e9a5256254b74ae331687b9672dfa780eed355c4c9c3dbd23"}, @@ -3751,7 +3748,6 @@ files = [ {file = "lxml-4.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:97047f0d25cd4bcae81f9ec9dc290ca3e15927c192df17331b53bebe0e3ff96d"}, {file = "lxml-4.9.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:1f447ea5429b54f9582d4b955f5f1985f278ce5cf169f72eea8afd9502973dd5"}, {file = "lxml-4.9.3-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:57d6ba0ca2b0c462f339640d22882acc711de224d769edf29962b09f77129cbf"}, - {file = "lxml-4.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:9767e79108424fb6c3edf8f81e6730666a50feb01a328f4a016464a5893f835a"}, {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:71c52db65e4b56b8ddc5bb89fb2e66c558ed9d1a74a45ceb7dcb20c191c3df2f"}, {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d73d8ecf8ecf10a3bd007f2192725a34bd62898e8da27eb9d32a58084f93962b"}, {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0a3d3487f07c1d7f150894c238299934a2a074ef590b583103a45002035be120"}, @@ -3771,7 +3767,6 @@ files = [ {file = "lxml-4.9.3-cp36-cp36m-macosx_11_0_x86_64.whl", hash = "sha256:64f479d719dc9f4c813ad9bb6b28f8390360660b73b2e4beb4cb0ae7104f1c12"}, {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:dd708cf4ee4408cf46a48b108fb9427bfa00b9b85812a9262b5c668af2533ea5"}, {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c31c7462abdf8f2ac0577d9f05279727e698f97ecbb02f17939ea99ae8daa98"}, - {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e3cd95e10c2610c360154afdc2f1480aea394f4a4f1ea0a5eacce49640c9b190"}, {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:4930be26af26ac545c3dffb662521d4e6268352866956672231887d18f0eaab2"}, {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4aec80cde9197340bc353d2768e2a75f5f60bacda2bab72ab1dc499589b3878c"}, {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:14e019fd83b831b2e61baed40cab76222139926b1fb5ed0e79225bc0cae14584"}, @@ -3781,7 +3776,6 @@ files = [ {file = "lxml-4.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bef4e656f7d98aaa3486d2627e7d2df1157d7e88e7efd43a65aa5dd4714916cf"}, {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:46f409a2d60f634fe550f7133ed30ad5321ae2e6630f13657fb9479506b00601"}, {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:4c28a9144688aef80d6ea666c809b4b0e50010a2aca784c97f5e6bf143d9f129"}, - {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:141f1d1a9b663c679dc524af3ea1773e618907e96075262726c7612c02b149a4"}, {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:53ace1c1fd5a74ef662f844a0413446c0629d151055340e9893da958a374f70d"}, {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17a753023436a18e27dd7769e798ce302963c236bc4114ceee5b25c18c52c693"}, {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7d298a1bd60c067ea75d9f684f5f3992c9d6766fadbc0bcedd39750bf344c2f4"}, @@ -3791,7 +3785,6 @@ files = [ {file = "lxml-4.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:120fa9349a24c7043854c53cae8cec227e1f79195a7493e09e0c12e29f918e52"}, {file = "lxml-4.9.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4d2d1edbca80b510443f51afd8496be95529db04a509bc8faee49c7b0fb6d2cc"}, {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8d7e43bd40f65f7d97ad8ef5c9b1778943d02f04febef12def25f7583d19baac"}, - {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:71d66ee82e7417828af6ecd7db817913cb0cf9d4e61aa0ac1fde0583d84358db"}, {file = "lxml-4.9.3-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:6fc3c450eaa0b56f815c7b62f2b7fba7266c4779adcf1cece9e6deb1de7305ce"}, {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65299ea57d82fb91c7f019300d24050c4ddeb7c5a190e076b5f48a2b43d19c42"}, {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:eadfbbbfb41b44034a4c757fd5d70baccd43296fb894dba0295606a7cf3124aa"}, @@ -3801,7 +3794,6 @@ files = [ {file = "lxml-4.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:92af161ecbdb2883c4593d5ed4815ea71b31fafd7fd05789b23100d081ecac96"}, {file = "lxml-4.9.3-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:9bb6ad405121241e99a86efff22d3ef469024ce22875a7ae045896ad23ba2340"}, {file = "lxml-4.9.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8ed74706b26ad100433da4b9d807eae371efaa266ffc3e9191ea436087a9d6a7"}, - {file = "lxml-4.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fbf521479bcac1e25a663df882c46a641a9bff6b56dc8b0fafaebd2f66fb231b"}, {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:303bf1edce6ced16bf67a18a1cf8339d0db79577eec5d9a6d4a80f0fb10aa2da"}, {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:5515edd2a6d1a5a70bfcdee23b42ec33425e405c5b351478ab7dc9347228f96e"}, {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:690dafd0b187ed38583a648076865d8c229661ed20e48f2335d68e2cf7dc829d"}, @@ -3812,16 +3804,13 @@ files = [ {file = "lxml-4.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:4dd9a263e845a72eacb60d12401e37c616438ea2e5442885f65082c276dfb2b2"}, {file = "lxml-4.9.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6689a3d7fd13dc687e9102a27e98ef33730ac4fe37795d5036d18b4d527abd35"}, {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:f6bdac493b949141b733c5345b6ba8f87a226029cbabc7e9e121a413e49441e0"}, - {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:05186a0f1346ae12553d66df1cfce6f251589fea3ad3da4f3ef4e34b2d58c6a3"}, {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c2006f5c8d28dee289f7020f721354362fa304acbaaf9745751ac4006650254b"}, {file = "lxml-4.9.3-pp38-pypy38_pp73-macosx_11_0_x86_64.whl", hash = "sha256:5c245b783db29c4e4fbbbfc9c5a78be496c9fea25517f90606aa1f6b2b3d5f7b"}, {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4fb960a632a49f2f089d522f70496640fdf1218f1243889da3822e0a9f5f3ba7"}, - {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:50670615eaf97227d5dc60de2dc99fb134a7130d310d783314e7724bf163f75d"}, {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9719fe17307a9e814580af1f5c6e05ca593b12fb7e44fe62450a5384dbf61b4b"}, {file = "lxml-4.9.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3331bece23c9ee066e0fb3f96c61322b9e0f54d775fccefff4c38ca488de283a"}, {file = "lxml-4.9.3-pp39-pypy39_pp73-macosx_11_0_x86_64.whl", hash = "sha256:ed667f49b11360951e201453fc3967344d0d0263aa415e1619e85ae7fd17b4e0"}, {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8b77946fd508cbf0fccd8e400a7f71d4ac0e1595812e66025bac475a8e811694"}, - {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e4da8ca0c0c0aea88fd46be8e44bd49716772358d648cce45fe387f7b92374a7"}, {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fe4bda6bd4340caa6e5cf95e73f8fea5c4bfc55763dd42f1b50a94c1b4a2fbd4"}, {file = "lxml-4.9.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f3df3db1d336b9356dd3112eae5f5c2b8b377f3bc826848567f10bfddfee77e9"}, {file = "lxml-4.9.3.tar.gz", hash = "sha256:48628bd53a426c9eb9bc066a923acaa0878d1e86129fd5359aee99285f4eed9c"}, @@ -3903,16 +3892,6 @@ files = [ {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, @@ -4648,7 +4627,6 @@ optional = false python-versions = ">=3.7" files = [ {file = "opentelemetry_instrumentation-0.42b0-py3-none-any.whl", hash = "sha256:65ae54ddb90ca2d05d2d16bf6863173e7141eba1bbbf41fc9bbb02446adbe369"}, - {file = "opentelemetry_instrumentation-0.42b0.tar.gz", hash = "sha256:6a653a1fed0f76eea32885321d77c750483e987eeefa4cbf219fc83559543198"}, ] [package.dependencies] @@ -4664,7 +4642,6 @@ optional = false python-versions = ">=3.7" files = [ {file = "opentelemetry_instrumentation_aiohttp_client-0.42b0-py3-none-any.whl", hash = "sha256:130a58fe4a702a5c828e87190c1bba8321fd2ecdad0834daeb90b494e51369c7"}, - {file = "opentelemetry_instrumentation_aiohttp_client-0.42b0.tar.gz", hash = "sha256:6ac5b2181b02232e169a5c1540fe1d104592cd5d5993ffb3581e7ac659f673be"}, ] [package.dependencies] @@ -5386,17 +5363,6 @@ files = [ {file = "psycopg_binary-3.1.12-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:000838cb5ab7851116b462e58893a96b0f1e35864135a6283f3242a730ec45d3"}, {file = "psycopg_binary-3.1.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7949e1aefe339f04dbecac6aa036c9cd137a58f966c4b96ab933823c340ee12"}, {file = "psycopg_binary-3.1.12-cp311-cp311-win_amd64.whl", hash = "sha256:b32922872460575083487de41e17e8cf308c3550da02c704efe42960bc6c19de"}, - {file = "psycopg_binary-3.1.12-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:70054ada2f890d004dc3d5ff908e34aecb085fd599d40db2975c09a39c50dfc3"}, - {file = "psycopg_binary-3.1.12-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7544d6d74f5b5f9daafe8a4ed7d266787d62a2bf16f5120c45d42d1f4a856bc8"}, - {file = "psycopg_binary-3.1.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43197161099cb4e36a9ca44c10657908b619d7263ffcff30932ad4627430dc3c"}, - {file = "psycopg_binary-3.1.12-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68398cdf3aedd4042b1126b9aba34615f1ab592831483282f19f0159fce5ca75"}, - {file = "psycopg_binary-3.1.12-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77ae6cda3ffee2425aca9ea7af57296d0c701e2ac5897b48b95dfee050234592"}, - {file = "psycopg_binary-3.1.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:278e8888e90fb6ebd7eae8ccb85199eafd712b734e641e0d40f2a903e946102d"}, - {file = "psycopg_binary-3.1.12-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:047c4ba8d3089465b0a69c4c669128df43403867858d78da6b40b33788bfa89f"}, - {file = "psycopg_binary-3.1.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8248b11ac490bb74de80457ab0e9cef31c08164ff7b867031927a17e5c9e19ed"}, - {file = "psycopg_binary-3.1.12-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6979c02acb9783c6134ee516751b8f891a2d4db7f73ebecc9e92750283d6fb99"}, - {file = "psycopg_binary-3.1.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:eaf2375b724ad61ee82a5c2a849e57b12b3cb510ec8845084132bbb907cb3335"}, - {file = "psycopg_binary-3.1.12-cp312-cp312-win_amd64.whl", hash = "sha256:6177cfa6f872a9cc84dbfc7dc163af6ef01639c50acc9a441673f29c2305c37a"}, {file = "psycopg_binary-3.1.12-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b81427fd5a97c9b4ac12f3b8d985870b0c3866b5fc2e72e51cacd3630ffd6466"}, {file = "psycopg_binary-3.1.12-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f17a2c393879aa54f840540009d0e70a30d22ffa0038d81e258ac2c99b15d74"}, {file = "psycopg_binary-3.1.12-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c6a5d125a61101ef5ab7384206e43952fe2a5fca997b96d28a28a752512f900"}, @@ -5464,7 +5430,6 @@ files = [ {file = "psycopg2_binary-2.9.9-cp311-cp311-win32.whl", hash = "sha256:dc4926288b2a3e9fd7b50dc6a1909a13bbdadfc67d93f3374d984e56f885579d"}, {file = "psycopg2_binary-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:b76bedd166805480ab069612119ea636f5ab8f8771e640ae103e05a4aae3e417"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8532fd6e6e2dc57bcb3bc90b079c60de896d2128c5d9d6f24a63875a95a088cf"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0605eaed3eb239e87df0d5e3c6489daae3f7388d455d0c0b4df899519c6a38d"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f8544b092a29a6ddd72f3556a9fcf249ec412e10ad28be6a0c0d948924f2212"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d423c8d8a3c82d08fe8af900ad5b613ce3632a1249fd6a223941d0735fce493"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e5afae772c00980525f6d6ecf7cbca55676296b580c0e6abb407f15f3706996"}, @@ -5473,8 +5438,6 @@ files = [ {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cb16c65dcb648d0a43a2521f2f0a2300f40639f6f8c1ecbc662141e4e3e1ee07"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:911dda9c487075abd54e644ccdf5e5c16773470a6a5d3826fda76699410066fb"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:57fede879f08d23c85140a360c6a77709113efd1c993923c59fde17aa27599fe"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-win32.whl", hash = "sha256:64cf30263844fa208851ebb13b0732ce674d8ec6a0c86a4e160495d299ba3c93"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:81ff62668af011f9a48787564ab7eded4e9fb17a4a6a74af5ffa6a457400d2ab"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2293b001e319ab0d869d660a704942c9e2cce19745262a8aba2115ef41a0a42a"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ef7df18daf2c4c07e2695e8cfd5ee7f748a1d54d802330985a78d2a5a6dca9"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a602ea5aff39bb9fac6308e9c9d82b9a35c2bf288e184a816002c9fae930b77"}, @@ -5989,21 +5952,6 @@ snappy = ["python-snappy"] test = ["pytest (>=7)"] zstd = ["zstandard"] -[[package]] -name = "pymysql" -version = "1.0.2" -description = "Pure Python MySQL Driver" -optional = false -python-versions = ">=3.6" -files = [ - {file = "PyMySQL-1.0.2-py3-none-any.whl", hash = "sha256:41fc3a0c5013d5f039639442321185532e3e2c8924687abe6537de157d403641"}, - {file = "PyMySQL-1.0.2.tar.gz", hash = "sha256:816927a350f38d56072aeca5dfb10221fe1dc653745853d30a216637f5d7ad36"}, -] - -[package.extras] -ed25519 = ["PyNaCl (>=1.4.0)"] -rsa = ["cryptography"] - [[package]] name = "pyparsing" version = "2.4.7" @@ -6300,7 +6248,6 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -6308,15 +6255,8 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -6333,7 +6273,6 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -6341,7 +6280,6 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -8989,4 +8927,4 @@ local = ["ctransformers", "llama-cpp-python", "sentence-transformers"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.11" -content-hash = "15e903d9e6bdb90cc93c3f9ccf14207f55f4a4674cb939020d480d5f7fabf2cf" +content-hash = "27f6f86ca62ee5cfdae333daae4f043a745ed2fff0d958a201b514fac36068d4" \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index b3aeebe31..ef7bd9872 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -102,7 +102,6 @@ boto3 = "^1.28.63" numexpr = "^2.8.6" qianfan = "0.0.5" pgvector = "^0.2.3" -pymysql = "1.0.2" [tool.poetry.group.dev.dependencies] types-redis = "^4.6.0.5" From 675e4d61ed851850297ac931e48f8dd0a795271b Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 30 Nov 2023 16:54:12 +0900 Subject: [PATCH 036/203] =?UTF-8?q?Dockerfile=E7=AD=89=E3=82=92v0.5.6?= =?UTF-8?q?=E3=81=AE=E3=82=82=E3=81=AE=E3=81=A8=E4=B8=80=E7=B7=92=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 2 +- poetry.lock | 2 +- pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index c44426c64..346348c0a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,4 +12,4 @@ WORKDIR $HOME/app COPY --chown=user . $HOME/app RUN pip install langflow>==0.5.0 -U --user -CMD ["python", "-m", "langflow", "run", "--host", "0.0.0.0", "--port", "7860"] \ No newline at end of file +CMD ["python", "-m", "langflow", "run", "--host", "0.0.0.0", "--port", "7860"] diff --git a/poetry.lock b/poetry.lock index d5a555874..68e6c22bc 100644 --- a/poetry.lock +++ b/poetry.lock @@ -8927,4 +8927,4 @@ local = ["ctransformers", "llama-cpp-python", "sentence-transformers"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.11" -content-hash = "27f6f86ca62ee5cfdae333daae4f043a745ed2fff0d958a201b514fac36068d4" \ No newline at end of file +content-hash = "27f6f86ca62ee5cfdae333daae4f043a745ed2fff0d958a201b514fac36068d4" diff --git a/pyproject.toml b/pyproject.toml index ef7bd9872..3481d3ef9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -148,4 +148,4 @@ line-length = 120 [build-system] requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" \ No newline at end of file +build-backend = "poetry.core.masonry.api" From 67717570f5b03d50c3789045aaa4f17d2bf658a4 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 30 Nov 2023 16:57:00 +0900 Subject: [PATCH 037/203] =?UTF-8?q?=5F=5Fmain=5F=5F=E3=82=92v0.5.6?= =?UTF-8?q?=E3=81=AE=E3=82=82=E3=81=AE=E3=81=A8=E4=B8=80=E7=B7=92=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/__main__.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/backend/langflow/__main__.py b/src/backend/langflow/__main__.py index 87052677e..1bdcf97f2 100644 --- a/src/backend/langflow/__main__.py +++ b/src/backend/langflow/__main__.py @@ -1,7 +1,6 @@ import platform import socket import sys -import os import time import webbrowser from pathlib import Path @@ -127,10 +126,10 @@ def run( default=None, ), dev: bool = typer.Option(False, help="Run in development mode (may contain bugs)"), - # # This variable does not work but is set by the .env file - # # and works with Pydantic + # This variable does not work but is set by the .env file + # and works with Pydantic # database_url: str = typer.Option( - # "mysql+pymysql://{}:{}@{}:3306/{}".format(os.environ["username"],os.environ["password"],os.environ["host"],os.environ["dbname"]), + # None, # help="Database URL to connect to. If not provided, a local SQLite database will be used.", # envvar="LANGFLOW_DATABASE_URL", # ), From 238ef6d58b75830b37758535a7d8ee26af28e6fa Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 30 Nov 2023 17:14:10 +0900 Subject: [PATCH 038/203] install dotenv --- scripts/aws/package-lock.json | 12 ++++++++++++ scripts/aws/package.json | 1 + 2 files changed, 13 insertions(+) diff --git a/scripts/aws/package-lock.json b/scripts/aws/package-lock.json index e5b70161b..68344e614 100644 --- a/scripts/aws/package-lock.json +++ b/scripts/aws/package-lock.json @@ -11,6 +11,7 @@ "aws-cdk-lib": "^2.86.0", "cdk-ecr-deployment": "^2.5.30", "constructs": "^10.0.0", + "dotenv": "^16.3.1", "source-map-support": "^0.5.21" }, "bin": { @@ -2426,6 +2427,17 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, "node_modules/electron-to-chromium": { "version": "1.4.580", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.580.tgz", diff --git a/scripts/aws/package.json b/scripts/aws/package.json index 05ef554d9..fb7f23e76 100644 --- a/scripts/aws/package.json +++ b/scripts/aws/package.json @@ -23,6 +23,7 @@ "aws-cdk-lib": "^2.86.0", "cdk-ecr-deployment": "^2.5.30", "constructs": "^10.0.0", + "dotenv": "^16.3.1", "source-map-support": "^0.5.21" } } From ceee6569f64219e8a3f6d5028b4abe2ce664e2eb Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 30 Nov 2023 17:31:07 +0900 Subject: [PATCH 039/203] dockerignore aws --- .dockerignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.dockerignore b/.dockerignore index 4e7226768..295affff3 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,2 +1,2 @@ .venv/ -**/cdk \ No newline at end of file +**/aws \ No newline at end of file From fbd29a2071b2533d27ec37baa601abd97470529a Mon Sep 17 00:00:00 2001 From: nsxshota Date: Fri, 1 Dec 2023 10:42:57 +0900 Subject: [PATCH 040/203] modified: cdk Dockerfile --- scripts/aws/lib/construct/ecr.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/aws/lib/construct/ecr.ts b/scripts/aws/lib/construct/ecr.ts index 2ff25f9e9..5162547c3 100644 --- a/scripts/aws/lib/construct/ecr.ts +++ b/scripts/aws/lib/construct/ecr.ts @@ -48,7 +48,7 @@ export class EcrRepository extends Construct { // Create Docker Image Asset const dockerFrontEndImageAsset = new DockerImageAsset(this, "DockerFrontEndImageAsset", { directory: frontendPath, - file:"dev.Dockerfile", + file:"cdk.Dockerfile", buildArgs:{ "BACKEND_URL":`http://backend.${props.cloudmapNamespace.namespaceName}:7860` }, @@ -57,7 +57,7 @@ export class EcrRepository extends Construct { }); const dockerBackEndImageAsset = new DockerImageAsset(this, "DockerBackEndImageAsset", { directory: backendPath, - file:"dev.Dockerfile", + file:"cdk.Dockerfile", exclude: excludeDir, platform: imagePlatform, }); From 7462aa65494be64fa25e8f493799fb06942903ce Mon Sep 17 00:00:00 2001 From: nsxshota Date: Fri, 1 Dec 2023 11:37:39 +0900 Subject: [PATCH 041/203] modiied docker-compose: use cdk.Dockerfile --- docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 81914ee40..8799c90aa 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,7 +6,7 @@ services: backend: build: context: ./ - dockerfile: ./dev.Dockerfile + dockerfile: ./cdk.Dockerfile env_file: - .env ports: @@ -19,7 +19,7 @@ services: frontend: build: context: ./src/frontend - dockerfile: ./dev.Dockerfile + dockerfile: ./cdk.Dockerfile args: - BACKEND_URL=http://backend:7860 environment: From fde48974931a7e6c4ec00795e2c18b792a229bb4 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Fri, 1 Dec 2023 12:09:31 +0900 Subject: [PATCH 042/203] add Cfn Output & Readme --- scripts/aws/README.md | 49 +++++++++++++++++++++------ scripts/aws/img/langflow-cfn.png | Bin 0 -> 11750 bytes scripts/aws/img/langflow-cloud9.png | Bin 0 -> 46825 bytes scripts/aws/lib/construct/backend.ts | 4 --- scripts/aws/lib/construct/network.ts | 14 +++++--- 5 files changed, 48 insertions(+), 19 deletions(-) create mode 100644 scripts/aws/img/langflow-cfn.png create mode 100644 scripts/aws/img/langflow-cloud9.png diff --git a/scripts/aws/README.md b/scripts/aws/README.md index 320efc02a..a7be98720 100644 --- a/scripts/aws/README.md +++ b/scripts/aws/README.md @@ -1,14 +1,43 @@ -# Welcome to your CDK TypeScript project +# Langflow on AWS -This is a blank project for CDK development with TypeScript. +Langflow on AWS は、 Langflow を AWS 上に展開する Project になります。 +この Branch では、AWS CDK を用いて 各種 Dockerfile からコンテナイメージを ECR に展開し、ECS、Aurora MySQL を用いて Langflow を構築します。 -The `cdk.json` file tells the CDK Toolkit how to execute your app. +# デプロイ +[CloudShell](https://us-east-1.console.aws.amazon.com/cloudshell/home?region=us-east-1)を開きます。 -## Useful commands +以下のコマンドを実行します。 +```shell +git clone https://github.com/aws-samples/cloud9-setup-for-prototyping +cd cloud9-setup-for-prototyping +./bin/bootstrap +``` -* `npm run build` compile typescript to js -* `npm run watch` watch for changes and compile -* `npm run test` perform the jest unit tests -* `cdk deploy` deploy this stack to your default AWS account/region -* `cdk diff` compare deployed stack with current state -* `cdk synth` emits the synthesized CloudFormation template +`Done!` と表示されたら [Cloud9](https://us-east-1.console.aws.amazon.com/cloud9control/home?region=us-east-1#/) から `cloud9-for-prototyping` を開きます。 +![make-cloud9](./img/langflow-cloud9.png) + +以下のコマンドを実行します。 + +```shell +git clone -b aws-cdk-dev2 https://github.com/kazuki306/langflow +cd langflow/scripts/aws +cp .env.example .env # この後envの設定が必要ならここで追記 +npm ci +cdk bootstrap +cdk deploy +``` +表示される URL にアクセスします。 +```shell +Outputs: +LangflowAppStack.NetworkURLXXXXXX = http://alb-XXXXXXXXXXX.elb.amazonaws.com +``` + +# 環境の削除 +`Cloud9` で以下のコマンドを実行します。 +```shell +cdk destroy +``` + + +[CloudFormation](https://us-east-1.console.aws.amazon.com/cloudformation/home?region=us-east-1#/getting-started)を開き、`aws-cloud9-cloud9-for-prototyping-XXXX` を選択して削除します。 +![delete-cfn](./img/langflow-cfn.png) \ No newline at end of file diff --git a/scripts/aws/img/langflow-cfn.png b/scripts/aws/img/langflow-cfn.png new file mode 100644 index 0000000000000000000000000000000000000000..fecdeb70cc40e0fd263a9c03e82dc73df90e14d8 GIT binary patch literal 11750 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 V4c2X|-usPX^+ literal 0 HcmV?d00001 diff --git a/scripts/aws/img/langflow-cloud9.png b/scripts/aws/img/langflow-cloud9.png new file mode 100644 index 0000000000000000000000000000000000000000..5fd5023533df94a9e241e3402e8ff2d32861d062 GIT binary patch literal 46825 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
lH{Y6 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 E2WMS2A^-pY literal 0 HcmV?d00001 diff --git a/scripts/aws/lib/construct/backend.ts b/scripts/aws/lib/construct/backend.ts index 4ddff1e00..5c8540bdb 100644 --- a/scripts/aws/lib/construct/backend.ts +++ b/scripts/aws/lib/construct/backend.ts @@ -14,10 +14,6 @@ import * as dotenv from 'dotenv'; const path = require('path'); dotenv.config({path: path.join(__dirname, "../../.env")}); -console.log(process.env.LANGFLOW_AUTO_LOGIN); -console.log(process.env.LANGFLOW_SUPERUSER); -console.log(process.env.LANGFLOW_SUPERUSER_PASSWORD); - interface BackEndProps { cluster: ecs.Cluster ecsBackSG:ec2.SecurityGroup diff --git a/scripts/aws/lib/construct/network.ts b/scripts/aws/lib/construct/network.ts index aa9e48dc5..7dcfabaa0 100644 --- a/scripts/aws/lib/construct/network.ts +++ b/scripts/aws/lib/construct/network.ts @@ -1,4 +1,4 @@ -import { RemovalPolicy, Duration } from 'aws-cdk-lib' +import { RemovalPolicy, Duration, CfnOutput } from 'aws-cdk-lib' import { Construct } from 'constructs' import { aws_ec2 as ec2, @@ -76,9 +76,9 @@ export class Network extends Construct { }) this.albSG.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(alb_listen_port)) - this.alb = new elb.ApplicationLoadBalancer(this,'alb',{ + this.alb = new elb.ApplicationLoadBalancer(this,'langflow-alb',{ internetFacing: true, //インターネットからのアクセスを許可するかどうか指定 - loadBalancerName: 'alb', + loadBalancerName: 'langflow-alb', securityGroup: this.albSG, //作成したセキュリティグループを割り当てる vpc:this.vpc, }) @@ -127,13 +127,17 @@ export class Network extends Construct { // Create CloudWatch Log Group this.backendLogGroup = new logs.LogGroup(this, 'backendLogGroup', { - logGroupName: 'myapp-backend', + logGroupName: 'langflow-backend-logs', removalPolicy: RemovalPolicy.DESTROY, }); this.frontendLogGroup = new logs.LogGroup(this, 'frontendLogGroup', { - logGroupName: 'myapp-frontend', + logGroupName: 'langflow-frontend-logs', removalPolicy: RemovalPolicy.DESTROY, }); + + new CfnOutput(this, 'URL', { + value: `http://${this.alb.loadBalancerDnsName}`, + }); } } \ No newline at end of file From 39e09ca0663610e60e79148ef16a203bb24fc830 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Fri, 1 Dec 2023 06:39:23 +0000 Subject: [PATCH 043/203] add README --- scripts/aws/README.ja.md | 44 +++++++++++++++++++++++++++++++++++++++ scripts/aws/README.md | 29 +++++++++++++------------- scripts/aws/delete-ecr.sh | 6 +++--- 3 files changed, 62 insertions(+), 17 deletions(-) create mode 100644 scripts/aws/README.ja.md diff --git a/scripts/aws/README.ja.md b/scripts/aws/README.ja.md new file mode 100644 index 000000000..f62de113b --- /dev/null +++ b/scripts/aws/README.ja.md @@ -0,0 +1,44 @@ +# Langflow on AWS + +Langflow on AWS では、 Langflow を AWS 上にデプロイする方法を学べます。 + +このチュートリアルは、AWS アカウントと AWS に関する基本的な知識を有していることを前提としています。 + + +# 環境構築とデプロイ方法 +1. [CloudShell](https://us-east-1.console.aws.amazon.com/cloudshell/home?region=us-east-1)を開きます。 + +1. 以下のコマンドを実行します。 +```shell +git clone https://github.com/aws-samples/cloud9-setup-for-prototyping +cd cloud9-setup-for-prototyping +./bin/bootstrap +``` + +1. `Done!` と表示されたら [Cloud9](https://us-east-1.console.aws.amazon.com/cloud9control/home?region=us-east-1#/) から `cloud9-for-prototyping` を開きます。 +![make-cloud9](./img/langflow-cloud9.png) + +1. 以下のコマンドを実行します。 +```shell +git clone -b aws-cdk-dev2 https://github.com/kazuki306/langflow +cd langflow/scripts/aws +cp .env.example .env # 環境設定を変える場合はこのファイル(.env)を編集してください。 +npm ci +cdk bootstrap +cdk deploy +``` +1. 表示される URL にアクセスします。 +```shell +Outputs: +LangflowAppStack.NetworkURLXXXXXX = http://alb-XXXXXXXXXXX.elb.amazonaws.com +``` + +# 環境の削除 +1. `Cloud9` で以下のコマンドを実行します。 +```shell +cdk destroy +``` + + +1. [CloudFormation](https://us-east-1.console.aws.amazon.com/cloudformation/home?region=us-east-1#/getting-started)を開き、`aws-cloud9-cloud9-for-prototyping-XXXX` を選択して削除します。 +![delete-cfn](./img/langflow-cfn.png) \ No newline at end of file diff --git a/scripts/aws/README.md b/scripts/aws/README.md index a7be98720..00eb0eff8 100644 --- a/scripts/aws/README.md +++ b/scripts/aws/README.md @@ -1,43 +1,44 @@ -# Langflow on AWS +# Deploy Langflow on AWS -Langflow on AWS は、 Langflow を AWS 上に展開する Project になります。 -この Branch では、AWS CDK を用いて 各種 Dockerfile からコンテナイメージを ECR に展開し、ECS、Aurora MySQL を用いて Langflow を構築します。 +In this tutorial, you will learn how to deploy langflow on AWS using CDK. -# デプロイ -[CloudShell](https://us-east-1.console.aws.amazon.com/cloudshell/home?region=us-east-1)を開きます。 +This tutorial assumes you have an AWS account and basic knowledge of AWS. -以下のコマンドを実行します。 +# How to set up your environment and deploy langflow +1. Open [CloudShell](https://us-east-1.console.aws.amazon.com/cloudshell/home?region=us-east-1). + +1. Run the following commands in Cloudshell: ```shell git clone https://github.com/aws-samples/cloud9-setup-for-prototyping cd cloud9-setup-for-prototyping ./bin/bootstrap ``` -`Done!` と表示されたら [Cloud9](https://us-east-1.console.aws.amazon.com/cloud9control/home?region=us-east-1#/) から `cloud9-for-prototyping` を開きます。 +1. When you see `Done!`, open `cloud9-for-prototyping` from [Cloud9](https://us-east-1.console.aws.amazon.com/cloud9control/home?region=us-east-1#/). ![make-cloud9](./img/langflow-cloud9.png) -以下のコマンドを実行します。 +1. Run the following command in the Cloud9 terminal. ```shell git clone -b aws-cdk-dev2 https://github.com/kazuki306/langflow cd langflow/scripts/aws -cp .env.example .env # この後envの設定が必要ならここで追記 +cp .env.example .env # Edit this file if you need environment settings npm ci cdk bootstrap cdk deploy ``` -表示される URL にアクセスします。 +1. Access the URL displayed. ```shell Outputs: LangflowAppStack.NetworkURLXXXXXX = http://alb-XXXXXXXXXXX.elb.amazonaws.com ``` -# 環境の削除 -`Cloud9` で以下のコマンドを実行します。 +# Cleanup +1. `Cloud9` で以下のコマンドを実行します。 ```shell cdk destroy +bash delete-ecr.sh ``` - -[CloudFormation](https://us-east-1.console.aws.amazon.com/cloudformation/home?region=us-east-1#/getting-started)を開き、`aws-cloud9-cloud9-for-prototyping-XXXX` を選択して削除します。 +1. Open [CloudFormation](https://us-east-1.console.aws.amazon.com/cloudformation/home?region=us-east-1#/getting-started), select `aws-cloud9-cloud9-for-prototyping-XXXX` and remove it. ![delete-cfn](./img/langflow-cfn.png) \ No newline at end of file diff --git a/scripts/aws/delete-ecr.sh b/scripts/aws/delete-ecr.sh index ebe837a8a..8e3b6a261 100644 --- a/scripts/aws/delete-ecr.sh +++ b/scripts/aws/delete-ecr.sh @@ -1,4 +1,4 @@ # aws cloudformation delete-stack --stack-name LangflowAppStack -# aws ecr delete-repository --repository-name langflow-backend-repository --force -# aws ecr delete-repository --repository-name langflow-frontend-repository --force -# aws ecr describe-repositories --output json | jq -re ".repositories[].repositoryName" \ No newline at end of file +aws ecr delete-repository --repository-name langflow-backend-repository --force +aws ecr delete-repository --repository-name langflow-frontend-repository --force +aws ecr describe-repositories --output json | jq -re ".repositories[].repositoryName" \ No newline at end of file From de1f9306067d0f862d3b3070ad922bdbc9ee456c Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Fri, 1 Dec 2023 06:44:29 +0000 Subject: [PATCH 044/203] add README --- scripts/aws/README.md | 4 ++-- scripts/aws/img/langflow-cloud9.png | Bin 46825 -> 110224 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/aws/README.md b/scripts/aws/README.md index 00eb0eff8..0210870d5 100644 --- a/scripts/aws/README.md +++ b/scripts/aws/README.md @@ -34,11 +34,11 @@ LangflowAppStack.NetworkURLXXXXXX = http://alb-XXXXXXXXXXX.elb.amazonaws.com ``` # Cleanup -1. `Cloud9` で以下のコマンドを実行します。 +1. Run the following command in the `Cloud9` terminal. ```shell cdk destroy bash delete-ecr.sh ``` -1. Open [CloudFormation](https://us-east-1.console.aws.amazon.com/cloudformation/home?region=us-east-1#/getting-started), select `aws-cloud9-cloud9-for-prototyping-XXXX` and remove it. +1. Open [CloudFormation](https://us-east-1.console.aws.amazon.com/cloudformation/home?region=us-east-1#/getting-started), select `aws-cloud9-cloud9-for-prototyping-XXXX` and delete it. ![delete-cfn](./img/langflow-cfn.png) \ No newline at end of file diff --git a/scripts/aws/img/langflow-cloud9.png b/scripts/aws/img/langflow-cloud9.png index 5fd5023533df94a9e241e3402e8ff2d32861d062..a0679de0b705a8f26c044da873accfc861eac4ab 100644 GIT binary patch literal 110224 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
5|3S$D9rd4By6N$X8_{+t<#ovs6o&PNfQVkzNGy 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 fG?@+3Jo8VwV#gTe~DWM4fu2|S6 literal 46825 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
lH{Y6 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 E2WMS2A^-pY From 086c1365b79d1e035e03ba6a4513587b894839f3 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Fri, 1 Dec 2023 06:46:08 +0000 Subject: [PATCH 045/203] add README --- scripts/aws/README.md | 2 +- .../{langflow-cloud9.png => langflow-cloud9-en.png} | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename scripts/aws/img/{langflow-cloud9.png => langflow-cloud9-en.png} (100%) diff --git a/scripts/aws/README.md b/scripts/aws/README.md index 0210870d5..91124be26 100644 --- a/scripts/aws/README.md +++ b/scripts/aws/README.md @@ -15,7 +15,7 @@ cd cloud9-setup-for-prototyping ``` 1. When you see `Done!`, open `cloud9-for-prototyping` from [Cloud9](https://us-east-1.console.aws.amazon.com/cloud9control/home?region=us-east-1#/). -![make-cloud9](./img/langflow-cloud9.png) +![make-cloud9](./img/langflow-cloud9-en.png) 1. Run the following command in the Cloud9 terminal. diff --git a/scripts/aws/img/langflow-cloud9.png b/scripts/aws/img/langflow-cloud9-en.png similarity index 100% rename from scripts/aws/img/langflow-cloud9.png rename to scripts/aws/img/langflow-cloud9-en.png From fd84d2a2fa8608520e0c612cb646c5ef4d474b9f Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Fri, 1 Dec 2023 06:49:12 +0000 Subject: [PATCH 046/203] add README --- scripts/aws/README.md | 49 +++++++++++++++++++------------------------ 1 file changed, 22 insertions(+), 27 deletions(-) diff --git a/scripts/aws/README.md b/scripts/aws/README.md index 91124be26..0c4636489 100644 --- a/scripts/aws/README.md +++ b/scripts/aws/README.md @@ -6,39 +6,34 @@ This tutorial assumes you have an AWS account and basic knowledge of AWS. # How to set up your environment and deploy langflow 1. Open [CloudShell](https://us-east-1.console.aws.amazon.com/cloudshell/home?region=us-east-1). - 1. Run the following commands in Cloudshell: -```shell -git clone https://github.com/aws-samples/cloud9-setup-for-prototyping -cd cloud9-setup-for-prototyping -./bin/bootstrap -``` - + ```shell + git clone https://github.com/aws-samples/cloud9-setup-for-prototyping + cd cloud9-setup-for-prototyping + ./bin/bootstrap + ``` 1. When you see `Done!`, open `cloud9-for-prototyping` from [Cloud9](https://us-east-1.console.aws.amazon.com/cloud9control/home?region=us-east-1#/). -![make-cloud9](./img/langflow-cloud9-en.png) - - + ![make-cloud9](./img/langflow-cloud9-en.png) 1. Run the following command in the Cloud9 terminal. -```shell -git clone -b aws-cdk-dev2 https://github.com/kazuki306/langflow -cd langflow/scripts/aws -cp .env.example .env # Edit this file if you need environment settings -npm ci -cdk bootstrap -cdk deploy -``` + ```shell + git clone -b aws-cdk-dev2 https://github.com/kazuki306/langflow + cd langflow/scripts/aws + cp .env.example .env # Edit this file if you need environment settings + npm ci + cdk bootstrap + cdk deploy + ``` 1. Access the URL displayed. -```shell -Outputs: -LangflowAppStack.NetworkURLXXXXXX = http://alb-XXXXXXXXXXX.elb.amazonaws.com -``` + ```shell + Outputs: + LangflowAppStack.NetworkURLXXXXXX = http://alb-XXXXXXXXXXX.elb.amazonaws.com + ``` # Cleanup 1. Run the following command in the `Cloud9` terminal. -```shell -cdk destroy -bash delete-ecr.sh -``` - + ```shell + cdk destroy + bash delete-ecr.sh + ``` 1. Open [CloudFormation](https://us-east-1.console.aws.amazon.com/cloudformation/home?region=us-east-1#/getting-started), select `aws-cloud9-cloud9-for-prototyping-XXXX` and delete it. ![delete-cfn](./img/langflow-cfn.png) \ No newline at end of file From 60c49f625d4c067dd53e5062d73bee2c3f61acbd Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Fri, 1 Dec 2023 06:52:58 +0000 Subject: [PATCH 047/203] add README --- scripts/aws/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/aws/README.md b/scripts/aws/README.md index 0c4636489..c18c25db0 100644 --- a/scripts/aws/README.md +++ b/scripts/aws/README.md @@ -12,7 +12,7 @@ This tutorial assumes you have an AWS account and basic knowledge of AWS. cd cloud9-setup-for-prototyping ./bin/bootstrap ``` -1. When you see `Done!`, open `cloud9-for-prototyping` from [Cloud9](https://us-east-1.console.aws.amazon.com/cloud9control/home?region=us-east-1#/). +1. When you see `Done!` in Cloudshell, open `cloud9-for-prototyping` from [Cloud9](https://us-east-1.console.aws.amazon.com/cloud9control/home?region=us-east-1#/). ![make-cloud9](./img/langflow-cloud9-en.png) 1. Run the following command in the Cloud9 terminal. ```shell From 321c04648f75bc59b2895d7d25b9dc1ae8e36797 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Fri, 1 Dec 2023 06:53:35 +0000 Subject: [PATCH 048/203] add README --- scripts/aws/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/aws/README.md b/scripts/aws/README.md index c18c25db0..ddbccb10b 100644 --- a/scripts/aws/README.md +++ b/scripts/aws/README.md @@ -30,7 +30,7 @@ This tutorial assumes you have an AWS account and basic knowledge of AWS. ``` # Cleanup -1. Run the following command in the `Cloud9` terminal. +1. Run the following command in the Cloud9 terminal. ```shell cdk destroy bash delete-ecr.sh From f101c63874cf188a39f724250ad7e0d347089532 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Sat, 2 Dec 2023 01:11:30 +0000 Subject: [PATCH 049/203] add archi --- scripts/aws/.env.example | 12 +++++-- scripts/aws/README.ja.md | 51 ++++++++++++++++------------ scripts/aws/README.md | 8 +++++ scripts/aws/img/langflow-archi.png | Bin 0 -> 279821 bytes scripts/aws/img/langflow-signin.png | Bin 0 -> 169654 bytes 5 files changed, 48 insertions(+), 23 deletions(-) create mode 100644 scripts/aws/img/langflow-archi.png create mode 100644 scripts/aws/img/langflow-signin.png diff --git a/scripts/aws/.env.example b/scripts/aws/.env.example index 6ff0702f4..4778f7ca7 100644 --- a/scripts/aws/.env.example +++ b/scripts/aws/.env.example @@ -1,3 +1,11 @@ +# Description: Example of .env file +# Usage: Copy this file to .env and change the values +# according to your needs +# Do not commit .env file to git +# Do not change .env.example file +#     You can set up a superuser's username and password +# If there is no need for user management, set LANGFLOW_AUTO_LOGIN=true and delete LANGFLOW_SUPERUSER and LANGFLOW_SUPERUSER_PASSWORD. + LANGFLOW_AUTO_LOGIN=false -LANGFLOW_SUPERUSER=langflow -LANGFLOW_SUPERUSER_PASSWORD=654321 \ No newline at end of file +LANGFLOW_SUPERUSER=admin +LANGFLOW_SUPERUSER_PASSWORD=123456 \ No newline at end of file diff --git a/scripts/aws/README.ja.md b/scripts/aws/README.ja.md index f62de113b..d7fa5b0a4 100644 --- a/scripts/aws/README.ja.md +++ b/scripts/aws/README.ja.md @@ -4,41 +4,50 @@ Langflow on AWS では、 Langflow を AWS 上にデプロイする方法を学 このチュートリアルは、AWS アカウントと AWS に関する基本的な知識を有していることを前提としています。 +作成するアプリケーションのアーキテクチャです。 +![langflow-archi](./img/langflow-archi.png) +[AWS CDK](https://aws.amazon.com/cdk/?nc2=type_a) によって [Application Load Balancer](https://aws.amazon.com/elasticloadbalancing/application-load-balancer/?nc1=h_ls), [AWS Fargate](https://aws.amazon.com/fargate/?nc2=type_a) and [Amazon Aurora](https://aws.amazon.com/rds/aurora/?nc2=type_a) を作成します。 +Auroraのシークレットは [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/?nc2=type_a) によって管理されます。 +Fargate のタスクはフロントエンドとバックエンドに分かれており、サービス検出によって通信します。 +リソースをデプロイするだけであれば、上記の各サービスについて深い知識は必要ありません。 # 環境構築とデプロイ方法 1. [CloudShell](https://us-east-1.console.aws.amazon.com/cloudshell/home?region=us-east-1)を開きます。 1. 以下のコマンドを実行します。 -```shell -git clone https://github.com/aws-samples/cloud9-setup-for-prototyping -cd cloud9-setup-for-prototyping -./bin/bootstrap -``` + ```shell + git clone https://github.com/aws-samples/cloud9-setup-for-prototyping + cd cloud9-setup-for-prototyping + ./bin/bootstrap + ``` 1. `Done!` と表示されたら [Cloud9](https://us-east-1.console.aws.amazon.com/cloud9control/home?region=us-east-1#/) から `cloud9-for-prototyping` を開きます。 -![make-cloud9](./img/langflow-cloud9.png) + ![make-cloud9](./img/langflow-cloud9.png) 1. 以下のコマンドを実行します。 -```shell -git clone -b aws-cdk-dev2 https://github.com/kazuki306/langflow -cd langflow/scripts/aws -cp .env.example .env # 環境設定を変える場合はこのファイル(.env)を編集してください。 -npm ci -cdk bootstrap -cdk deploy + ```shell + git clone -b aws-cdk-dev2 https://github.com/kazuki306/langflow + cd langflow/scripts/aws + cp .env.example .env # 環境設定を変える場合はこのファイル(.env)を編集してください。 + npm ci + cdk bootstrap + cdk deploy ``` 1. 表示される URL にアクセスします。 -```shell -Outputs: -LangflowAppStack.NetworkURLXXXXXX = http://alb-XXXXXXXXXXX.elb.amazonaws.com -``` + ```shell + Outputs: + LangflowAppStack.NetworkURLXXXXXX = http://alb-XXXXXXXXXXX.elb.amazonaws.com + ``` +1. サインイン画面でユーザー名とパスワードを入力します。`.env`ファイルでユーザー名とパスワードを設定していない場合、ユーザー名は`admin`、パスワードは`123456`で設定されます。 + ![make-cloud9](./img/langflow-signin.png) # 環境の削除 1. `Cloud9` で以下のコマンドを実行します。 -```shell -cdk destroy -``` + ```shell + cdk destroy + bash delete-ecr.sh + ``` 1. [CloudFormation](https://us-east-1.console.aws.amazon.com/cloudformation/home?region=us-east-1#/getting-started)を開き、`aws-cloud9-cloud9-for-prototyping-XXXX` を選択して削除します。 -![delete-cfn](./img/langflow-cfn.png) \ No newline at end of file + ![delete-cfn](./img/langflow-cfn.png) \ No newline at end of file diff --git a/scripts/aws/README.md b/scripts/aws/README.md index ddbccb10b..3912d5792 100644 --- a/scripts/aws/README.md +++ b/scripts/aws/README.md @@ -4,6 +4,12 @@ In this tutorial, you will learn how to deploy langflow on AWS using CDK. This tutorial assumes you have an AWS account and basic knowledge of AWS. +The architecture of the application to be created: [Application Load Balancer](https://aws.amazon.com/elasticloadbalancing/application-load-balancer/?nc1=h_ls), [AWS Fargate](https://aws.amazon.com/fargate/?nc2=type_a) and [Amazon Aurora](https://aws.amazon.com/rds/aurora/?nc2=type_a) are created by [AWS CDK](https://aws.amazon.com/cdk/?nc2=type_a). +![langflow-archi](./img/langflow-archi.png) +The aurora's secrets are managed by [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/?nc2=type_a). +The Fargate task is divided into a frontend and a backend, which communicate through service discovery. +If you just want to deploy resources, you do not need in-depth knowledge of each of the above services. + # How to set up your environment and deploy langflow 1. Open [CloudShell](https://us-east-1.console.aws.amazon.com/cloudshell/home?region=us-east-1). 1. Run the following commands in Cloudshell: @@ -28,6 +34,8 @@ This tutorial assumes you have an AWS account and basic knowledge of AWS. Outputs: LangflowAppStack.NetworkURLXXXXXX = http://alb-XXXXXXXXXXX.elb.amazonaws.com ``` +1. Enter your user name and password to sign in. If you have not set a user name and password in your `.env` file, the user name will be set to `admin` and the password to `123456`. + ![signin-langflow](./img/langflow-signin.png) # Cleanup 1. Run the following command in the Cloud9 terminal. diff --git a/scripts/aws/img/langflow-archi.png b/scripts/aws/img/langflow-archi.png new file mode 100644 index 0000000000000000000000000000000000000000..c46ae811dae5b9033fadf2e28bfe33a3852e5cda GIT binary patch literal 279821 zcmeFacUY6#);(%N6a-X2lq#Y$DFV_$wNa!gRl3qU(g{^`BTAJn9iqCd`9;W%%YvseNKi+fX&>=tbL&tu+M+dO+NhZ zpO}2)&v&01Og{SO>*K5Vaia6{d*I8-$1<7@hYs=9;Qt(EHPRY7bV%}$?Cl$>u7~GG zpcRp71A@!M^@n3jRVDA=zfphqOa{dnKV{x{2LYPvt>{({_Jw@=%tGE)>1JBFRz^hp zo!gHk@7=#~qwWkL^O;vS?zv(Hoo41e$97IVIg+@9^=Nb7gfA8?el554*qPW(y!z>) zg)#{~Q0XY`%S_ADd+tL?cbpNPf_xlY5!*0{}d&^ zbMyZ_xtUt!$F-`{`A7v(=RgGK6i@yH*S`v@8Ltn}=oE3#zN#fD9Y?uGQY!vWiRN#o zr{*r>MY95B4-%WF{{%vRdwmb@5T6*#p0Taj_?hefx6q(YbofSGj%P7Gde=N>iuHAOrE43BVoedcdh{GYDq`aQ5B z$FcS9RzF!Be4k(+WiVWsjPKV5A7{U4)+Jf(8lvz^%XtqBS3y6L`lZ3`k_5-Bsb{E` z@_%hB-vz_(inaXhKKsWVME&kbvcl25aWR2k3S&ta7!LEh@N0vQQl2g}Pu8zMF#qFq z{@vZNg5hi%*A5;g{~79L$w1a8Sr5SU|L1oPzH`&S@HBdpUmHxKD%qayRrj)4r$(GR@hHHy7(&fcD zDbRxS{OMTB25E=sy7>Wz@f?@YpnUG25Mc)t=Y*Pi&_WP3zrTXO;59d!D%nEw5%yS0 z(dpJW20qi);1cFa8ge~PPVv_~4n3~tU1Wa(f6Qv|*=DO5GxIHBB#R&6)V>~4x#P`- zU8<6sFRgX%$exAp+vpdX-LDXG_84}ZOR&RuJ~RCIl%Q;`+*yx%e+*Ma8AOw(Ct79J zG48sy;4&W8oEuC)Of|j8#_g=>J+igAB7HkcoipVX^ksbj(`b_DmHl;;Wx%88)eYzx zMU?QiHli*)&M}}z9p}c z$6zkUjl#QXEr@A?FayV{M=ilv;9W}suk+ejM|Ni@>|D&P{MsuomiM?JMCqm2&O)s4 z`fNs0L!P&{W_qHA%%hkkZwyV$tv(%ZIcBqPI3|Ao*;3toKN9~Q4V;T4Ye9bYt3cmb_;_m+eFS9aNYX8=-F;ZaHZ3oLR*&lFR_1E zH6?w}W_)PB<`gZJ$0^7yp*pj;YQUkhC7WKQ@y1L-b;Cb8y*4g~8~C zc)ak{hAJIu(z^*Bxn;Ybgf?G1o1^`}R;@=wuu!(sHf8MaGg#$A$&sAWO0<7OC-K{@ zWw#t*Q|-*ZRZeYd*EU?n3ngEq54iCZwZb@Vsu?C@c}nCzwdR zt>a;i5|^`>tre(rYtXXHxxnCEk({b0KJWoy(vjLYI5joy5gsJ)qBlpYA&|^;nm&(R zz@nSgdA`89$FXtgV~99C?5g6%N}T@Qb*xp1(?(|)GJuLZ7?U9%L?#hW8E}rQ`5x!YINrelT_UwC&>*~CmVT;n<8EdSZiIk85V*#&b*(@aK|im zl)Eg+&}FNqtt^%=HE7#bQrcE+Plt^am?DGQ5=0QpaaLz(Y%Am}1|Pq6R_jpRdM>7U z_EM%+=_s5o;A?y(v98-@zcuQCVNioFmpE}2=}u+f5h`8B`@54Y5{>a!JaI?~oQD;B zHa*6$h*A+Un_7xRXYn{PTqJ%Y|fCtXiZ=4&jNX#T~DwKmr;K7`}X$i!Lo!$fSysyscmoArbD zFk=$ONvKs%O-yp>e5|LSfG@)5#`C=QEGu?bo1Nfs%)al3y>=F;OcR{ct;(jNoCZ~@ z%t}U_12U4l;He%nZ~V?JrKOsEXgPvPaM9aEYgDrfBcB{TIH2~Kfcb6Ko7FR~cvI+@Qh?w+w{yFN1UL}&wHTCaes5CJIj=CV;Z*Z$WQ z&H9UNWZtV;x|LC{EAl5uho&OsEF$5}s+^e%u39C{!9yCH`l}*N z=nHx$DAX7bbWSoG<|}Jg^Qz80tJ+^E-Kp|(xFulTQNE-QEV2Z>rnujMH0-M+3!GeQ zXR75zDL;VtP{eO-O@#1Ctf7!06ug?Tq42`VgtdIc-CB(eF-#?9G|qk0F=uD7oO^Y@ zwR?m5*7H-1VwhOpb}efrf-}W~7Fj~O%e71d&S>fnvZw@zlLgQ9uun{2p`1?9iwbhhk!W$WOxY}EMA7eXv z(h3NPMjqN=O^X90{Wh&rhK}prJy$JZYypy-jx48wbM6&0mH7t+3g*!-DK=r^SgXD) z>~+kVqR4t%Hv^6M+ev7jo_o%W+DxyCcy7gF`fH67j@?ck*9=W|=k`B_!jE2P=6VJ3 z4Wtt(9)Fozxj87~6Ne4n-`hdiKzCPm?>$%?|1iEj+r^ilkjX8Jh`vJcit5N+oRqS3 z$X%vA8i}uekQ;od@!23sR)vhoaaXEVj6U+CQ$Gb$)xto#Rs0h9+Ju;#$2>8mQ&HM? z_r>}!SO95UiA)4GRokt$Qjn4x2c-e}@<5^Bp2nbI-}Wg`z#ey5yP!r90B%jtWF!|7 zVb&dnU1q)6=IMHB{n zDowrIuH83&^qED53TTUh>xOvf_1fKP>9sB%UB-eD&3%_p&RM$q3JI; z=HZYp(&kT;T7lc&$p;Hl4@D(Vv0W~xkb-Eqp_KbgpouQfk)*Z1ty=$Po@zc28{xDZ z2avO;evk{Fw>702%nbmI;ycWS(w)*bA1k(-Z1iY^R1MjNYig_YS7mFrZk^1le-;vP z+^AEycm!TJr_i&%?ml!=I=(w69lPcF@u{n0e|V2vs09@4xP-MPi=<~Y!(|Q=47e@n z91ZyVhh_`i@RDR@me*+u77n;Q3`#dWRXv*j3e7%WiBvXmdbOK^r7Xz1pc) zlLhXwM8AjK2w(~pdb_oj#_h=lcV3{L9aC4B$Sq&=xAoo`;^*9!4^HEf9&@YH@Ny6=#w#2Goby2!bbuZ4W3_BpF=rZ%w+06JnT#I*1tku@~Iph@4bys zFXeYEP8%_Nri!VjRftAZsbSiR=*cx`&;>q|x*LRa6tEP9w2l<%kW!FkE;)(ZU8=V( z897I#=lUq#b92CMp{P#^>ow-SR9QOif7PItL@?ViwsbN~&i`w?KQZk=bsZlyWk6da zcL#^Bf9I`E$EI6i;>rf_8C^xr_hX33(NiKz?IJGL>`^X-P`B>2`l6IX&o@R&Nuy~# z@n}MqQM(;<*Eq_r2|k`W{`O9QfsAH!oa)kteYhP;VxO9DzCgYwGevxaFcSSJl?I44qGtG+NoAOF^*y-TjpD_FH5*D+!8iEQziL@~^KkdacEc zMI>1??(VK3^;fqG_FpZUcBaafMbCDo$?>T2InVbCVP{fO>?Rt@=9KM%_thQxNRrrV6l0EX4Rv!_a z95)+vWkp?Adaw1BFs+_Re@mM{#|jTeK*P91F)ioa##&dxaW2YMU6ui>SEidazw~J6 z2UT!!vC)1&CAypBMnUqs({>a#f))mg0>BWsjbjL7Paz8sx(nO*(Wy4OP@@3joVn;LHuHiyt6h--0RneJ) zM*fLx`y-J!q)?uH$oTW`YOxPeE7{P`naAu)RsO9vw_4P-t>|;KidoAhcefc3InJ7IsS0bQp=K>FRXQ5$=e}}?#3rzBk@P$ zG`^KMQVCV3Vwlz|$V}?{)_178A|vztrbF_G;BFGr2ET1af4e;SKslVfZoFIPidqKO zc7lhZ(Dd>+G6L2`Oy@=)LP$JfCl%gHEnaw~qME%%IoVe4IoG?7;ZvlqC%|>Br8RYHAymA>IJmTc z3a-0=wrW@GW9K?@v`aFlybjtPsbR-gW$e3CWlrCUxn=0dRLNEX)Gh~oB_@5V1C;do zgHS*D&&(suU?M1Kto!+o&*xjl?=BdQBdL-YXec1aZYK_{Le}S^n?@#3qQQs|ao_h! z8$7E6sAze8uc@A!n6Lr4>DgP`Sk)n@-{`DHqw8|$qbqBxjaR&@n3YZA2BiS=nwazR z;Loj^|Kz$FDl#5zx?A0EG(loHH0?@vOj+ZNWnQH~0k6{wSvna~@vSeP%1fQ6w?HwF z2QUAaAd58|SC-UM(4kP6atV|e4TC|4mnskKm);>JmG z=2ZQdP{nYF3bl~Ex>iiMNpa)Ntw9>27n*o9&p%V2R~UjBX0{B?C1t2Px!B zbB|oU%9z!~bfk0IjkpZyy^^ak=;OQ}+AB?vBQBcuiQR`$AFdR5d-p>T^H3GS*ue%{ zZn&rvMJ`4{LX-{O$0*wM;m(@S_^YGi%g>HCSi6icpmsOMU-P->Sx4JdJgvD!CPop? ztk6W8gTB@UaDNLFG}L&?)ELWS*ig6pwbrmt*M$?-cU_jwzL(w67z-)^xu_l%Gd|bl zFAqu|KWg0X&C!-l689VrznPJOCmqvm3EK9%RXd9T3&qXHTkf9QGhOXB9B?U?i{`>7 z!-}c;HV!D^V2N##My^JV^0nCl(!t@!wIpR2Xx$m<+sH&Qhmf9<{zCIEp_MxF2~f*5 zTPfT~(%(aCbY!ZT3+A?bGUiBa?=7{P7*C7V^9LEIY>N*dq1jNeHOSqJ0;8@I1~nFQ zIdZt22hq*xE~35_nIY>o#g=`!Zm?eDtXHSfMkt&w&E-Rt;r{M+=sss4gM>JmoK8IR@sc5YrxJq z`MZpIRzE;@=X*MGb!Ud4>8zFaX73}Tk69OwxHTKN1a$MW1O?L#);Ej@uzKZUz4547 zApy1MDQp;{HoBi@jQ>gZJx_r zrFIKA2kidNlKzK0bZw&h;)SfdDz}vk{c0~efNAPt`k9m;{Z4Vy!Y3ViuA_UyOcsU z`t&8dmY*@yv1P=E4UMoZU7j6l;VcS3uY9|NhJJgX$3LM?9A>zIHqwa%|~ZjHkeoIlT+ z@CglFNS#bI4(}F5bv#m{^zPMhXzhnR4mpZlIJ-xj;0P(q8$N6X)UiN0u3a@oD+h~# z3ksIxcqMDtsZTe?7?yQs;~GMIXI^E#F0@yJp=8v}Qpd65&i$lCPMDk=w4K>08M;`8 z^4B%bOp;h~&}(NN(eIH-YJMi5B))CL^ZK5)UqrVi3-_1%D(xmIK?0d@pt(`J+gfy~ zrV&{zHI%Ka3V&4lobr}6te_pm!|qfdy!GXoVYq^TW^PG4OeJG$BhQ;oB}0+(xux=n ztl}jzO`D6Arn7ETI*)HKJ`t*J%Wwli%s4_~-!8SinNmaNOwTQ|NX6A&ZChi~G@SRB zHG0^suET`1_fQYp0Lk=!R0=Acg|#ZRzJs-3zYw#(AEa6@6Fv8Rx!(sKamV14*9SjH zPjkQ~S{S7hROhFa*^I&k(%P=U=9;qy3iwd(a+cd)eT}&ya_%OFT8gOI+Ij&}gHCI8 zC(VxBU{l&5s-??Md}u?9cgz?OpWMn+8%3M9%a%7bh)^qXk-bNqyEVHubKt6(A+f!>k-5wxkM0e+9PbCdqC$)4v z6-EN<)rRG-1DHaOk!J2{TIk{DtH}!6RTPQPt*?H~%`w~UZ*K7wbsML3ie=QZafEp_ zAy|BKRsHDQ%tSZ3Ri^yV{7N6gkynkvZRXSCY?>;oV?Rli(V!pT$;f%U`sFcoRexLl zmHy*cJZI7cgx#6WwC1p!IO}3ftM?y|%T22>0PVLbGlbGRW07Hs zX~Z^8z`ChfZW<=n2+-(*k=|bIkZmv#q>&j+x-6~2!0o+xk>Bd)gAGnQ?2~WP#x^>4g zJ6~$Cl1r!bnx6YY(XgTa0jr>QAwXF6EX=<0t%F7)b1^Tj^>uUu!hJ~z7JYL_AZM;f zoOAzSLyN1)dcc((z*lJEtO{>{p3{eA_u4Q+P^-g@^!V{5(5U-Rj=!J4V(|^f`Sx53 z%@volYx0e6(_W{VZjXi_{qwo2!v-py6cNcSmwc}rNs$Wjr_y63QA&HJ59T+;5D_fb ztLBL>XF$89BsUfi_5JfWA42*EymJH2+1mhEmnzZGw0rkPWptr7K+bms@!|h9kK*=Sf?z$yhQIp?bqsJ1LbP*J!&cw31W^T6H zgRRpe7-nf~BhA#|c!3;k%36pBW+6dyUz5PP(^vWN*To(BHk|^s=5sNzH;sKNYy`|V z@E~HRl9np~Bp%IrF(~2jQ|Di?Rf7<|ud;QS;L$3iZPM3b^%D=9>MJUaOn4~1vQefA zSq*jBU*)$RDh|@NDZ8R9m>erbWDn9P?ghD`5Tn3=QMdt1Vz(Hp6T#g_ew1SD1lG!* zE!61n*p07C%1V;pBtY1ASOG&y&u5y0Saen6j%m0t zAC#Flt0Zq$+v_H3IBN25W0pFlM4tD8h-(LCH%ZQcpz}ySt#M#xa$i_M=fm? zjks<*BfwR!WXR*5_=XSF+=usJhZU_fAs!gSog}}su zct~|j)Vwpb^y_n)agniY#r2sECWsSS^%NwnU6E+YV>Cq>B=T`hN@=tKkX&||F}>9* zLAG@%A>z~tA}(!WiT<;65PV??z>Mqo<0h(f8$~vuBHo}7aqK%+Boq_z$*Fp)p4C7edEE!{V=7=xBx?*E4_dbRF`78ib zmXe&fH+D8-WqyWA&cYl=IuxBa@lpDDWcD@(vk1jvrHB0MEh%UtsD>6w#^@QmUVF0O zAp-$aPR&Oew~2J-OUArnCT2(QA{{SS5Cy@J!v5B@T~~!0aX@Lw^MK|P%MuYrgsA6e z-2t7Z=4QZlnDeyT07Qk-a5TklN%(fJusAi$4iuQCUE%L#QA*S~1)+7DdDD@rTQ0O* zbJXzjD@OiB%|ya#vm0@Mpl~X)q^{!Y%dJ|5{d=f;s&1$d;px|_T@)yoVO!Jn<7D)- zAlrkO%@wB@VyYF{-b7ws=*|&z$q)r zZv88vF?!0^N1y(*hR*KXFe#n+LX?<506>&T+vb+$^1(v04pBF&V%bJ`>{9{ruU#op z(b;2JIGc_NO>^l4e1Gr*vu)TBh=v|^NN7IU2k#Yt%CYy7_S@$5yGRxXG=6y#qA@%n z39E_J(9_h~Le7^?1UG|4O}{2Px;3YdqfYWzl^uOEtc8ZCh(9MoI_qU>g;RwAeZ@1A z)YJ<_Cx=23GkWZK3|(=UuUb21FdRY=>{Ll@_uGgU*65rr3KmJn448IZpc!HFkW44=n1{y6UjyOQpA^ zQx(_ZdlhUI%;+$a#LfWHehymSU4#bJ1yUsSfCfq*H&7XN$F&^)77*>%jF{@Y;=Ie_xbCOlS)_6a^n~jPBivd0bhD)^U+5HU+uk-`nfxL$K0da8 ziB!V%p%uJQs*FxeIXW`Ixj(mb@sk6xCEfvDIBPeN<6?{^()8)m_ZBOWYrN)8pTW16Tu?*C^&rdxDjb3=$fv4BxEo`=T&ZM;YC{&BypE2XOl?O zr>oEe%S12i>}v^cub$p3)zQG~Adn#`MdWaK4q$awzwBkF`{X60%P zs&t!=LFOj?Mpv!Sj-Mz?S$(TktL8R(wYe3Ary|_OG||iUtBowEMH+~snT_WiinXT# zBjqk3&&b-AUZ~H~D+zu5W2QgfFs&ASP|i~zIjbMr3yt&rKA?t5_lwWX=xDr7*eWXYaZbq&gdKIM> zS{Y+N(o*+;E{XX|nAhTEcq}2GKN8$;l2n1o+-=0>f55VT|E z^QsvDRgHVW!D5^JkPf^DAsB*wx3#zAouuhKU>x1EO@>v;h*}M;Y6jB!rOh#KT-Yt> zh!xy%_NT~1>ylxM_{-0Il69`H=;76gScW)3d+k<109hf zy`o#64WUE4MJ1zNEGk*-sgepi&fmJjZ+9AK8sKyys=G`p6iwT+++O4%r#vex%E$Om zT+X8?WMg1kR!d5*0h~s|%YWPhfc;9-)x1gitK6Us2M>kMM1&w1kY3SHpjrm=_aGw^ z+43wE;fU4HzHKA(@_~q?a*M>p3}9neDM;Gmp!eGPx&^cgL!cbnZ4Q`9S9|UG>psrx zRmUdmi`WA|l-BDDyX%ft0UsVC?&;>KSfHFuC*kF>=xGILK-mVILS>8HHuXt!)3tQ@ zm@s!5e4fwgQSjUFLQph^f5JYUp7? zgl686PwX|S1nji!x7PDG4SM62J$L_jX}7hKQ5ONj<*31HMlj;>?yLmYo{NiL!aRW5 zff6n%+JDV)k0r@V0DNPm&7IyqfUA;sx+Q1WC&NQ&d$*@=^hHY5_TCmM0Tao#IeWB+2hd1(%%5U!v zg4E?X8Vh8}XvZ?(D^T(uF>XRuS3DD#Lg_oS@(1*qCPGc}n-z%)@QO$%ggDLSQlu0% z*9#=(b0QLIS_Oq06kbgVIz15sDZ!jD{K>wX{(B&miB8hk)x9CC`%37|FEI1LYq1Jw zgA$AGGaaS-=|hIfUmZ4h_MTm^n|JY|kid=#PL!b#4UyjEY|0ri@IX_k>hq?%=%=8y z%E{!^FJt(Xh1js4oQX-dfNP>bdoeJIGgdmfZB8mh3fFc4nIs`$Q#mmz!}tUqESFcx zg}1f!o7ODmBWy(OBrOyN12)i8>iO}LFOR|G%%`HomwxmY)Jri+7CK80VKtxyucq}* z;3`?Es)%Y{2p}$iuhJ;Qc8@+{Be3Rz&%6y=3jz9`aw#*x{m%2^9Opj?Soxmkme^q1IAj%Z8k0c z{c>A$NH_n?=8$d3Gg8RA-FDvAt4@U%1Z{?S6I||CC2BL)m2ljM>$c7UM2W|4ye>>y zOY^A!WH7>mllfo?Bl|LNMP6;B`YQ0<5z)kP&1JM=Ypw{#y6=c?7Z*VH@@o}aoe3fm z6m#gEf4zl`lY{rEx&@yk*AF50ek_$%%in8TwV)sB73G}zxEVA&Ow3E7=XcE7h7F`+ zGjp#m3>Lp!q_I7p04WYJ@%?fmoY|79e6%HY<9-E*t@9cu*iZIFobH8&eLCbaY$u)2 z$Gz|g-*E=KlmhRA%EWDwx%}hU8WwWck`p$#q8RI~pt(I^|tn%EE%2Ma|`_P%* z-I!vEOkC-d_V1xNV@-PAsM2&T{RT zb)_pT%4QzXDI=V_X9Zj$CTi%(Lf$~l0+XrHhR#v_G*am@s{5A@2=(A`7jZ<_ntnt_ zRn3k{x)hdYpYxhEmN3*SaEcoU_=0u7l2Ng%6z|Xg!oNcCMjWukQr+U58gWc?L&K<_ z3GB=lD7C4r$-%M|^xD%cHr_v~%@hYxL*Gf$#*Y>Z;J6tjclEA)s^X<^7A3BI#jlCL zjaELGnTC6v$frr~)O|lDJoQWSDm_Tt&g*l1-1LCdx4={u3Qi1)g80YFU{rb0pLoib z^kyCxA?Wi#JNMiz`RMsvaJJ9c@DKO9h@kgA~K) zByb5nta;J`r+6sKMDRcl^s`!4u*a-HyUd|2QB33^reA~BBm&|(Ji#uZy4PjJ$)-JSirVorJ*xEx0J<6`|gs__B+dV6Z5J( zV5*4H&mFG-(r+1J)NL+j*v+~=ZA4=TN_Q|ako*W(y{>034R!sAx9TT-K;<9+xMo6G zUof4>xo1bgmJCSSjscD|$Hie`hf&p1(B8G5o2su!ZUu&rfad3GO(Rk`$WuL_nODhpds)=580h8^&Ed)=ez!t%#C>-9zbBl=l6){XtzWP!;7-Hs(k73@h>sGIwv4QR1dag8f_(_5^$IAp{Y924_*~qH&T}@u>mD%% zsKn+PM)fw+vOQgV#5^-mtWwE|E)skVPu?2lRWe9Z-=I4K%hb zIowDCUYW6>ReIfW=ODac%V7{W{OXmwv0d_>nnd_+bxVSXpo2d}pjL0NzzE!_IbM(w zBZb8>ET=B0fw9N17!%bw){Dy=$gEV zHc?$Rs4Qc!tE{y4pBc+CWS2T#oMEyD9Zw-plH!Yahmy3pjJ7+?yaGd31;ZCRfkZ~m zXWFKdsiN;P;#9WNS=1yw>Jko->@np45-%RgAhxn2uZ#N)0$Q*@z<+mMr+0Dda{P)pq<-2r`-<>2X8@duWX2` zdUti$4Qf~OS;?u}gukXi9BsA5+bMr=am%Vn|t*goqt+<8yuYWDbXcEY3O#;%8V5 z?+UW16tAb)9|X-vUhPg7hmQnQM(85ShG4q5As8!x1xWkVEt^0u^AxE|eWgH@-D7&W zZ#DGk9pEHhYHH?hTLN9_;U^kFakK|bGkB*pssGs@p!*Pd!fM$1nb3O8-b8lN{>A6mHym{L9g*v#oK0+Vs)8H{&NjecR+2Jk`;f zj;>>ge|)nC5jJMn5cm@ASpS)L5Z_jdN&Z%MgMwJEksr<5I23(TfSg5q@ab25g+a>uNkV)jG{%tNsNyw7JObTp^?eunr2N&*MPn>Pxs z_?E^B+9twW=KFb6K;uFyVP7mYh^^bP;ex4A+kNdfo$f23@y3&`l%zMbIlkh!fOj4$ zT5?`G5HLNFv<6J7=%ldX50m9PzZ!_I4da*)_Py(u;OhFl5`8Mv{!+-qyV~P-#uiFm zDhLj+LY%A^=A7qGj|j}19kMPkrrj;dtJ?;>RM)NCxfJ7od4}q~iBA0&X|QJvUp_wL zLx#aUX+fzPgY7&=D!N=_Ht@lCakH7LoTEgqvJ@!Iw=)zIGNUg!iLo&NG0zqXYg>am zX2P0dSBVn=aq0jYb=BT(KSN@V&3V`kA(J4B7Qrh)1{ukiQFrbFe%~N`;Vth8Jx2<7 zQ$Oe_I4H$H=2KDBK%!V&xm!bi`ygmqt; z)*i#ECzRLYaoG;2zNT&AM0l^ejVEYlx8)?cj6%zN5?1R0!g?j#67IpICoAXaRc1!} zCjkOSml1D&7qr4JI%HQYd*d+Pp-0q?AAlv);7pekzf4gt;e5P}sbp{8JP~%9G4fr) zV2M^1g_^cpj<;5t7AL1xjzuPoTF-cffAXe9(PqNE{H06BLZvRhs0+J&4hNN5TBzhR zT?_-z?Xc#hm$wruj1)!*BcVxrf+=E2JD`;$DGd5|O>fLj{Xkqv#fK%j#UbVUPR6^- zTec1DYR5~OQpb2b4JTtQ3oVj@OYJf)6 z-h)Z|f^;6T)~MD&D`e7tc%O4+hfBWQ1h81U^$zLi_+Fp^tx;;>N0csqBA&=88D%fC z)^gdNibmkIE%P0`$;!qZ5A#6e;O&bnSc`XPW4mzaF6E=*0h74hGF_)0H6Gj1iZDMf zU}LyM5Qb+?vtFz{%B+@tbk3|r@SeTK8N8rA?Sp|Ie4Pu#oV1~L6vR? z4h)#s6aWHK54z~#Wj4UJ8{()>Rg7<#;8mKIi<*PZfJ4}QX7uAw<&T3KrX|bw=HnUm zF8@_0{j|s0nF0|W42)dje6A74(V#sC&`Sg~Tj#Dawt|{;6F7NGR~l&I5>&92;kj~|U-$r%-SvzQ zj$`i&q!Hwb-9f%|j0YDX0NNbg^Z8BrHy|0RBPO7~q(BUV(h-ru@-DCDw+28GGD9**?KSu zjCri}KYT`VNsSuR7k;Y>zIA z%q8OKm9)mTsE=IQHy)wTxLA}9=zR5{ojX!sTXS)H4!fHvfl$^j&tx{-nUj!I; z5?nzKCg8ay2&xINv^Ko7yrBH{*h)4-;hgcNN;_Z!j?@}?yAS3=h#~p&ppaT98)d`i z!K(M%1oxGbQ_7NWe)Y=H9JMNFU40bjNOE<6-edVAzSLd4kx?wPs8NmW@%Wt5y)^k8 zVP)OUybyO&elD-ttC8pi3Bq=EhvJk7sL0}mMb%ojJEN<*Ck0w_ei17IMXv?&xbYbV$=)e%!^}2YrdX&r%`410=Ru>{R_iD>y7O0q6}< zbm1tO=(U1s+5{M{EFRbWAWIc%ygM|`CTd?`+SOf(B0ZJ5Gkxg|W)`|~Wc?+!W2Il7 z60fRRD-%T87pju561e69?49Y$(-(fO^Nt6P`FJZ6z74IQPH!>$rPhxuMAeCHgeq+@ zCMvimY(ZVqI8r7Oif=tLU%krD-;2iteEp!Ula}s)YQy`3Iq{-<`tw$u5@1uQuO*Y9 zrLiu&KaGuYOy9Y3VF}3XoC6hJaTIRYHkT@LV1~$CT6_Ly#r8L6Q2z6uh_3=6_Pzb) zcRv%I>P0oJfu&crQ&|P6D)S@d8niC!kL++ceGM=PQLg8w^va$kLXDNO`jo{|ysN7= z2tDUtnxeqXxGyGgj>lpp8BzOXW_4D(oFho!u<_ z=2^Da`R}Yj$hKxrhaWjf1MDtuN%gC7pwgqox9tH_qO$|Tq==de(>KsPSCt9kfGrS` z=)J$qD$SqNOIzJt+&EiDt`rDP{aj(VH~?H(cdcUw#sJmzh>VW2fwSqke)a7KNuIC7 z(i*ke%suv27XS)*w2r+j-k}5?8?B7XyB0O=0i=dHfXfMF_tM<+`8gN7>nSzr@KqD2 zpA-rhlNfJ3uQSg`h^qDmr+w~g%;$^c_C3XXOkwi5RfaT-!m>GR}!1Gr)k{}(KdGCR@NU&+o_AG-nws9Hqa2% zAp7xI`J(4FE^1FT(bcW4pk7T@&R0j|e|+n zY5Ud|vrzsbT{tt0w_|H%Vhv+BveG4-@kKRLC-oqS>a^M253Yey)#FJ z306#i)C*`^oz)+3=<7FWR#=TZrzkQpf8KLy!)}*H8XULwO&A3wlxHDn>-Q)}~w z?6(S<=Sgn<1Bm@gq~K@2haQllw6<7(s{RnPXDB6|Pkg)Cdt5%s`kU-$3SlCCp_aL4 zQWV7)r94bF;JIOWY`1wgJ6I;#+!1vn7~p6h^T?VkE-HSjU1F2Ja@-PeF3yHx$fij1 zeo@kM6rcNM{8sA{_Y1k)Qh_ngmQX@O{+Q5Z-2U4R4FtEByG?CtGZv`9+408@W)TIJ zL~8Qydm%{oGm)Z3d-~IU(mUVo_?%jDcXZ|5m`zMrv+*zd&U%!Ufrtx(Vl6C{1mIWM}5pYt1WT5$i! zgsfx*<4U@qZyAOoOcKWJ9!Wabop2kRe;e1vEhTTE#oY^89hFP;N9IJ96p@6s^xo(J z*GI$6E8}w9i1IGe?i`zvJ}zAdg8kO<`sGKr3>S)e12=jvT!4is5e*di!`(OorIU3d4(?5M7{eJ)F?%-EolL*{H z^Xk#4pp=j;xA{s0)mzIxE~gRV4amZRi@~QX@`;|lvCn(*O=?eLXl)f^sKF+>O7#h9 z`=+5~5C+mX&*SYWgS5!w4R?=5heWFDFh0-a73w`-Y>^EyTE3Ztm?LMYAMnP??XE?M zFwMzr<#}z^Zgu90G>|EZG3`4~NPOktD6#7x8?go_=7W9G7OFZgC$t#8AJEF}a=jN4TEE z?sCf3a!Sbfv*9_=Xb#$5L!rDo50^X5QR|jZdf9(WS{y0AlO$eg7?Tzq3|d6D$I>MB zW}mva(N;|_)?-PcKhvJLCvA46s7ibTK|UsZQA|&@Azm@ zeh-u!y^i9fl4OM;8j&O45-e*ReyjDI1>xP1=I|zJZ*x>^b7$2i-#*tsUfP=Y9LEcH z`Yjh7=c%#reL{r#lsVC$>Xb1L+d+}=-786$DK~*NyW?St($HpY;?rCwG zYuf+L4gOs?6y|^b@WJy{&;6(hVP6AGzxh+%Z+)x4a&E*u*I-pE8!$##j|Yg@GSK8= z2EO5Oj~dRaNxN&jS7Zs8EUN|S-B)AYMRNB)6;SiGjJbH=&wqpee9I}}8i7b}P$FN_DyzvGYoz z8#+Y_`FGaN6q=t25Bm2#{&#C@@-w0cw@u~t^k;g@yzx=V3Kve3eD|HPU%7{F*2^KV zrglqn&~gZRv{Dw-8?e!*d$m{7vh{rFrzg+jR44bO3ry-uqxD`&(|bd}Im$-Y>zG)q zMdiuCZY<^X1Cq59ryo%GC?oZV208pK5TgL74fXX+zu^R(JRT;rNC%B{-|p{4y*!ho zDfXO%E^J5h%JW=^kUDkg%~KC@z43h_%jk0(Y25Woir(Dm75tpc3SN8-K}oNO`{Z9x zA*#=Q1M!A;MM1}`Ef)M^xDUEU5ulbVh<++CrMmdQ@Z_Ll_S~!$es+_e5rY-#>i~~# z<1z$dr9sVyy%cYp@!O?NPtcbd?Z|M+o9P7}=Go3Gn87R4+z(C{pjuuI6xd6Y^=THE zA_6Zgp+51eOyt095yQ~6yCh?bI|SB{Nn=bSp5VtxE8_5vBjsvk33iA4$k`wMjoPApZ3-lMR4?Oqt?*@t_#+7f|xC zICr`bHl1Z?^Vgqx(5y*G4u+pEI(i^p`O z<4XbueSU4?GBrUbI5sc1>=$>eJQ!}!P5RxT{j-;FuNA~j+#D6vZ5kp6?G~`B?^&sR%X=n(O7sU!xC&eqi0)--$5) z?B{;l9+EwH>N9eMhw<0eZ4>+&PjfOS#6i{Fzh2}!2-q~4<(HX%jr+9IgLPYYv-tYg zHjNq!AiPe|b$|R^p!~Tle+T>TVE<{H{~heVgZ)ncIWX)<{?6?GmuB{4xt`X~|B+uf z-qzS+9@HJ4|I?fKZxZsi-cFyhM-XH8418^l9E1Gv#9x4JoELKP*E02A+#r8V!~bv* z_%}PA0GXQ9?n1(`pB{?e?lo`0Z-e2;Oy2u7iUjUGS;4O~Q1KUkKhS*wI0yRB=3h=Y z_@F6-_MfBUqcsn}yDV;eDRJ-q#L*gh$j6@eotcWw{fPq%`wP6fB3peGRii@)Zi z1PuR~9^_xB(Y*- zd(xQC{MR2KFZzM^+p!b> zUy1tPi~f7j{|-_A2Mz;xcZ4-+#(jTo@^^Y+&E9U^_(E^bL1OPxlos<_%Mc}RxML7F zUtzF6`~u1#-4c6Yr6ceK*=W#fVgB*(VaUNd8r_*7E9U44ul+lz-edNmc&BOJ`ogD{ zDTa9l5G(kH>Lu|U_IjTepFUf8wXKZaS83Y{+x{dlhA|G1C8$&x;s;CaU8 z3@*~&pXG%g&~9@?7k=lIo`}KB^D|kw3>~JD(DY7WjRj@`r%t44@vdV_h&`pPp6B)P zDL*D=(WtEFe0ib>UZMlcR(`3R7y{ zBky?Ze+GLuHmQy!>2}42eO)TbUIHmyv8`Muy~JOw593sRVN#}cNnMN2poiqr@f^y~ zn-ZFw*5z$&XDqGG+3h4_6k8Ji9e+II)BX zDxxBa0t%wiRhrTjr56Q;Dj>c0COv3W5Co)47Z`AcCS|C?SSW(h8G4b_CLE(_G#XSCtdAh?f%K!J}>^uAcM?3 zXIoy=l{@y#^Ct_fUSFQa1!k)TmCX+XmKUAQ+gc@G-OIMVYjvvy9o$X)|M1x%TkVLc zsQVGyTA%E}L^Lg2lyN0$`h;_gvGJ1KYsM&FCTva|&(D97Y+)aEk~|ow;gt1eO^?{| zMtK8G-L3uO@Bd$SnBB!z^!yW{pI74T*jpVY0>xFD5BG|BThuW5KZ}#h&kZ%GcFIx> z-L&E5F0PlSyU??e+2Ip{ZH%zYdI44cINzBg?F_9HBrv=z$H@+1M&8 zy?}K~Y^$N~s?Mu>Mf&6~K@#!x9@5eUTo5$89Ke)`_)yTn(uVw4JOO}Xy9CQ^ z)xtvE=_bz<-}NAH94Wq=@|bc!qoaz9*Fg=7rc^E)97`cAdkG2lAtZkw@Y)nNz&b7q zcrfJU7>O1Gh(WBHJnvBd){~;>vxw_9xJxs<-@G~T)ZX6?YFpxt>k?tlYc~t_84F+= zs1D@*ENn6%fv_^gTLSBILffTe*a~Z==)qC|Lmh0kwx+pgJ2$W+eCp@ws^WqO|MSFr zhhsXZ(rXd)$nYBMVIdH^cu5LL#o^yl!p_%HS&T`gRzGf6ZQK3sVj^k73bk1j$3stS zXPS+N>goJN#f|%H+{7u~gZDQANAz|adMo>m$GCCRRcv(VPlC@!Dr_-pqnEprbUI3( zY>FG`r#@MyRx<0oL_W;DQ?>btEiB4xuIq5bq;rqaQ$gz941bDx zYvze+nv4~mV%w(Wx!xi+RH!HH(jgGmB>>tWTSAP8o6%fJzkM6*sri&W7$|efMe~&V zQt!)pM^xa-J&s9JQUn*EcgLg3VV3~(y4}rTOLIjnF=8rR&k!Cb!tExZh#pom9sl+{ zy6%Jc8|p}(wD+&~>76m#x0gIFuOgd*RX2J?*_bUW-`-sMwLdj0udpek^cj`vNSXmT zczdlgRLbj{Q1&3~dt8D2gB(=wfCsF?){i$t2G_y*nA4Nw`@Z)Ckrn|R2TcL{S9_tbXWiE{ugTd<6f}IPG*1V zyw3B*hWZ$s@rEtV>)rQUl(`kIT|=!Zm}IpI^UYsLHUyu#qUEU|2NqfI)Idr4XrYaU5Z5T8!K*|C$_KjtD! zM+kYOmbO&W*dX*qDjUt_fZKTX>_DINSJ=7_fyJiWwpX;U;Ee1E&TRWIY(}v@HjN~vmq+3e zL8uY6(wkOhsA~5+0$gq1TdFe;n}45Y3^J+_fXyM{fja`vh4DeF ztvND(NKL>a=CqiXV=_GZm{YCH7@QZ@E>?nB%H*T7YfR8u5xV9TYxo;^$+j5M~-#p zD%Ec_sQRgu#`*ig!sRHe23vJn1pF@#|F45Cm3zPygFBG$BUuTky?dWH!PYg1-u$xo znSL(rI<5@g<;{%0g5<-}!nQsa`p+;fHTFPJA-tffsPBF2;61i9N^0Ox`3DZno;yWI2x_%gKXa>hrVt7`)yfm(*jj(xKhV$gElq@d&-^7vV2suQEuhEpx8cn?VUV_K zT6e~tu%54!ig&^GT=iO=UM*>e*&|D=l%+lc3-8`ri$VybLkvJB>>JzfY5k61+Ersv zBPxhz1)u-cXXPg@@Ip0hB7kV14f(qgBgm5E7Jz!F5%9=1Fk+lR&wK%&`0%PPX*CG( zA93;h*bMt{VrmbZKKyx4cNaeoL902X8=(PqPelLQH?DlZl!CVtbfdoTQ-VH5W4ki} zx%cUmDZTt#Vs46K)uF|%{pEB|$;6Idlm|WGGNw7>dv3Iia)OgMAUFzncu0?s@dRD1 zjN7)LPtuZR&C13tF(>t!oO{2>W+%Rbdxbv1wora&dziv2GL5*+WhHxA-=%zT&!Cbk z()BtikPQx;oYfTaqOdM*XSw{(1ew%2_^Ji{epOD9il)h+cE;!`eC&cXXTTF4V{|9r z^CuVgtVMD^i2T5XaL{i!d_Lh%o;9oohEr7jW+bZ09>60@a2kaW|0Q!Ov68PlA-8>eHnJ@==hl8y@#)zZ5LxKf!L5|TATQ!-&6Ic z*#6h+{nt56Wki&-OW3$$fBz=nw>=zpA~;J0Y$KC{|HL!y=Nistuqym3GPIIyKH zIJf*CE6)GD){ts~va|CG`s&>uVITFiNc4EhR?lqkwuo`d+c35|)8ity?LTG zS-#LBPoa58GN_Cc6^Ln~v@O(9;h#4Ppkly}a#u~j%j>={8Mkr#nNE*8kXmZs=@=Am z!&zqJ%DMB+$odV+D|{8;A*zp(1MLSZq6aRL=_%mQQq;C?wNtEWjX2w6G>VMDR%r1& zf<-6h_hvo4v%L<70Sto3)!>VQ@i*LR45p#B+Go_48cumQuwE~l8L;==s#JBswjsQZzm6nH?qbM|e{UYEpXM`i@@F+O#l zeOb`6YI!aC>c1edYykduwq}m2XDS7ORfNopBJCTXwJmQwokJGkwIOMYXUrU(MXC(M z(+2jsxweL15jUox8ab1lQ>Y*z@M2+VRn!&|Ui;YcDo6m9z-z1?s*7-nJU*YavB(1D z$tVA2g#7YYD7R!d9ic882Ctry>t;h8lgEd3EJnMEBSZ@K^20g|64^HuF_-N|b_tvM zsg9u&1}b<}g#1zuMzPPH@E+tA9QX>K*|JQVviry0!vKDg>Ez>UOwh2qjACU3vTEC9 zj%gRb^-bXM$8&94mtMB`TtF(D2Y~sU_3l{20||oY^kAoaw)6T3vT?ln=D zACjj#V|%h4bba=;3@6QQXO!X7*SX_ZmO6Rp5?I20pA?x-Vu!|)C4JVL1Gij?N1Xj`KDn{%m*HwdBB{t%;YVK!s|W;24vr>P1r`Rhf9Cpb-w*M@sN0CF}ogw z<>2#R9B#GelHf3LNNa-Stt!(nWp`uj-Co*|RfeGiYb0CGNO>}k5Q-9A+vN{cE}PKX z$L<>Mg8OQ>Out~MBYaKun5^VJ%OVI8B17K!W-L!u&(8DtEd}p*q8)FzQx;^KLC zF&}~6y|{T5gBu@Gi9Q$#*LPa^Jpgkd-jeidr5R&@P&dEl-fMOn%EE@(NzJlCp2c+J zc4yDFA~dC=Qz|RwPgjS6;}F6$-h{M*S!bmDN&oIwD#=ezd)mbjw+R{QS2!(2{1`9r z3Cd=$*~3&9;`<@d#~&Zqi9BJA<6jiiRjA;f<-2-5A#yj831KAV`43WaJgx9J~)?~YSs zT&sFHI;}b<)Ov?ET(HG?BN{6aS-sZ`C(G=4z7RW@@y>Vz->nzYL-RpJml@3%a)Pr*AZ|$xJKpA+_zI~ZW8)YBmE-|2ggcf)y}#m z@%*@3`;KaxRgG?i`oAvAPu~!8vvCi+fXXl5j8lDd4SiGSxvlfBXs2?EQNAtr8ZML5 zxea`)GYm_$V^C2>8GZ#v!KO0;v+sAl9O4)0kS1XY<%|?jzreGJ{jebOS%)CTXm{sL zIL;S)Eu6m4s>}v^r0pIg3F}Q&d^ui`C8{g0O%-1yk9>SO#Zv7c55E~uJ3BHO%-1Z* zy$k58f)OnCL5f>aM@@U8aGzzmC9i2@Np9sNhEdKajw`ptTBqKwi5$(zNxK6Q!o_FJi6PS4h@@D2^zlBh!M{2#!bbWLT+Q3 z&(t{1#NPBS9f(kzE_s9cxY&jm0~*d>+CLUg-P@Vejx_#`!W_y54p*PmYjYsEcilA|M$_Kunjm#dH0hSk9Fsz+r67@N*=_akir`6QHC@ z$UloJ^X+ohY~@7#f|w~633dP50&=P~l1Qz$$DRD^VZR&YZOyf)`2%&D>n+8-rc>+m z2G3!|BJ*2fTHm;ddVI3?T&x!Y1_mm+O0Jhr1yTHDmg1}uZ=^ie&LS$w*w9*R9}GZn zaYfGn#5B-4N>xqsRQX&&&eK|2;DjLClp~X7hPx0vbTk?+%$@~Tm81GhsZ9X8L;$JR zzW%Y7Rs3u9B_1+*2fi2)C`79+ebg`=*4SbdKOeKU4cU4$Y{Lau>xY4KBE> znJ`D2f$n!qc<6!27`M|&P^zpZioLN?l3T_+cZpDL>RG_(C*;>a^TpAnii0HWk5$ImHJVlwVq z87bbl^>4#1DIO5zcD56)YW+wD74FxLls6vVKiqRsyi}V`K&023_t^tdNgy#2+U~;8 zyp;Kp&|w*=$>URacC^cd)xh`dgHoPq#x`HfsGs=6F>SxCi51$L454ukuX5NHUFMlJ z8q?UH(P{X_FwR5(*U|#kUYVNR`M~-k&kT1jCur1;mGnEaG+xkMR`o~Yfz+vNyM{+0 zh7_Zbz-}>=rLR_`rLkx#00X)L1jPlxylp%OiO5sg`vuDH)-`qw7$UsMldp(*IW6+o zy2yvObM15jFv;THGF{S}(G_7aI_59Cl4TlhljPpF&}ymQ{675SEKzyJ}XTxIR6k};6(6OlLKn+Y=BYqa<;E<1qzv<Ek=i7RMJ%ZwaVH~XX8CIcJZwNHP+&) zEB_*zpYGYSKWyG@F4E2YM~t?Xzu$YVwusykTZWoLj0yQ|&WBQ;4yX>Mu&&=$< zvvg9}{+?2jh+s23!ZaI04+A{-VUKQ2rR3|~o9BkU6PNGHqo)1(jXoU2$NI{= zS=JnIyKA)xAzkx~Eg{?Jw_zp2e%k=wM$A)B@|!Dt?7;Zrp%qm}%t~Pf>!RlxYZp+= z^1K*lc}-MGu?h8)44d$Uq!L@C>+}{{tS_I+1(YF%hD(s#)ByH+C1r49*k4lZaT-h% z%obdLTQ|W)GR?ESZGk-!?YD>?X3(*NYpbbc9{8tCEj)H9oR4-U`22%%OZqr%Vts}Y zxF#~UP|R~^q33XY@j;5%XMxj*zKF6`+)(Kg+W(?`%f7fxMkhgd<}>wPp}zZc422S7 z2)MXmI|K8P=kW0UnP!TtB&4{t;E_tVhBVmj*8i z{CCS=i$30or`e>R&-gcDyp$+33X9pQrGK>6EfwzfzOS_z_NyvWZAm+j@veE$pO@KW zFo~@~s2Lij85S@0sR;&xms^2l2xM331loiwYDOK}6Oi+d+#b_PV-vr;3*mH}<#$yA zr&{V+aiv7&--n_8GeHo1VC{F6!Vec|8V4G`Y*<>o;08vHxBGEgNM;zn<@f+QeHC28 z0uNA|%2%F0DgFD~Vv>Ueo-Nxh;a~M{M_u!3L-)v2Q=az3|@Q_~vnh3TD0#F&T;d zBcmKW{K`rNGpa%we7TT)oFq4dX;(H}c*o z3;oKeXCXP|YiVJ2f41*I_^^@!_sVX2oh1QXnS0LOc?%h{=%#R<&7i7*9BJ&ZE*Byvj-($280??LS<|%&mg5vwj5> zId>;$!`J`u>nVH=#d{C&{mLrCjygL0gFB2NWV=4jJnpCGEuA2{K|lBeGcU`1#gUgW zCCDtyvct8i6p)cJWSkER8LVTz99&0B$zgMFkjV*)bbol9@3)q{1j*=a$}X8kYl15- z3VThx*ojM2?HBv^5ASi5J}iMiIi6jO*kA3p*)5IZw9ja9?(oCjaWHv|rc(q&t&~AB5W@ly;MlfI$z)yMS z?ZU74Yk-6AtlrB6eShCNzT_`FlJmB++gzyP2I|9TYHl7Y$PG-zAW6EN;0LJyA1SeW z#y9FFJ4fr?9u5{D&en>eW)eqV89fsKnZHndr1p@f zt;ym%O&qe$L%WDUsdH7>rfG5R!>{dAXHmPHwq(*;Fi>&1_`|iz>~vMY&j2uSIVg6n zBWCvZ0-BE(dQ-@wd~U?*YuD0A>RnOoWc~+^GFu;Wo`3F%-Sb4p&ghYlRgN`J2Jq1I<&pT~*W~fi9TuY5^FZ+{fJ@gj_nGdYzKqC*3Kq3@j)1&; zIfebVJwGWNvRTzne}(0*B<|Ne6nbr}gUK`6EMbEZ4TFGKme9@VsydUyXPDcHzKRG8 zeP~akK6qM)yJV=M%(WGnv+Qgx@i0nc$1C?;*)PdC_f3e9~o|6A6)bkM(hHLJ+Z%Z#&>mXXo3IUN;CuY z)GG93WU1Q(x*;RiFP5if2k4ejHeq`jrU^|s=19BbHp#auejPz&@?UyEKW^1jrqiFv zsiBjS3pifkqUBp%CovAeJSBkuKRc1@2ey6BNVGE>&0PZlYn*if-}|(^#aR34X)i1N}8qjHW4K0hrAugkBaz5BKA9X8W^Op?&9UWT6Xix z2*I7AMZTz#7?*!@3E1|xu$-NJ;Wyy@vOY-6-xXfF@9b@Z{`v{&tzfNIf$*;8_UOYp zrMHsynrNf5(~jy*&R36*?)g(?`p+S{a7C&m*0Z;7X_N)N)~ZQ)_;4tgJahYncX_vp zELo9`?^2b{rB}in=c10BjXI)xbH;zD$iC3Uym_H_aBksxT$Kq0)~JV^uJ*^|QaF(3pYSQIHZRnvjqb#-noe31;O)jBq|bNCw=cFpKrUC` zb}e<$Arxo;6s@OVP{h@r#CwPK7S_iDuIdtRvKl?6P*W3?mt$yHXU)zOJ1FUUU1jRu z)Gl`vrP7pnPC5N}F?}yxzO z1)sMip7aILb^wqwU1Z=Q!B*`tVvSaPIcE2aT+p7=_GLzMpwe(tb%BcZdlDMvx0;UF zA1G`n%AbDTCj@ikxXVU2v!0ehP>EV_f#!5nUG}3YH-Gfgbhs`1XFBSk$JS@RrxVKU zBbXU!x9sS$juOM70a@Y@1XN0&`*idK*oa4IdUCjOAF#!tJcTS2?&~D-pjLBEXd?Cc^vRnCv}^=#|L9*(xm3bU3C zYjN&xA57>Pu5)P@yvgm`vIu8buz4jBuzGn7#_p)C&kJ@NawsOq5kp@`r-qY~At2a! zV7TE@Z+8Nd2!>H{CT%+$!T6rw0owrsvBW_ji#TC0cNnQ(5^?z2?Yp2HuhGYY64g!Qd0tRKsJNKDy*BPe^0{PV zh6-;aMb~zL4OgLK#=ck?OS5j)=Qbc6(PtcjJaY(5uBcGgNvnYYem~(O&p<|Qq)jLuy(joqp&Lv_Y)Zs0 zs3s%EiuTi2Jj@*Rm4A61-Fe3$P1#|{Q1*<|twd0bT!BW=nY&(+G3A=M^@Er?D}l3=B)TI;m?T*Njv}Gsb6b)HoYB8gpVO|7X+@Kb!Ya~_Ps1ywD4m7 zs^caiSc^6Ava&yk7}c_$;}w@1DnZKhB`_u}IfRM{gF5PF4tFc}M%$>8ABT(OX}!cL z1p;5A1lQ?vZJBe`@`nfIi%*F?aLg!2Y0+3m-Ad36`b}Rsj%fW*rGGn@|Fc<;5Dpvb zI$4HsNcUqv;L@W|^AYDiQjdn2$1fDg#9n|&3{kr{rl9W{;@hg zo%GbZ`_!&B{RtysQGR1nlyTE1v(si#WbZQ$)oO{uyevW2#%Jm3$qqFK@F6`@MZMDR z^iFICxvGAROxZCV`Gpwp1({GEQ4LsWk;ET?O0dbK->#IW#+$9Rw~?vpN@lWHJ+!+{ zArrX_>YIDn8!mWu=@C-C;r4mxFc}#=#M;IzSivFNRwD^iX%I-;QsrE z_Dn8L^E=@G9m9;x9?M3pWvreLJ{KoJh1FAFy>~CS7f-{@`_wfNLe21)D|; zcuD8@7|PGur?tVDn?`p2i+AotNm(2AYfWI6c6rik4*^v;)0-vg+Zd7FDA8Zx1)ZD| z4e0SNpe^vd3;s9|kcQ3emUuG9Ctc?7v)LG+NK{hp9lw0Ynwu$CCRqE82nX(k-!DDeN`-T1!58@d%^8QtHjIPEcCMRCm>+Bk0 z#WOE@M62B}ebILIi*!3C{ymKQhwUSppr`lUZsEYO3pHR7egaXtOyHVDW^2B_4=((@ z!?4Mr1R2V@S$)FnxuG*VZ++a%phD$RJe^yry?SOG{jCHE)Wi2M;N( zx#5?$5|Ve$Fp0X`8rgER5?W&N7PLeHMII9QvqfHT_+H@7o2-;FScX#LeiS<)rM$}(%+bGki&0~HKHvew@?Wj%Q8IY~5sA&4mVQ}^Vrv;N<}bNT+h z6XJtc?`PVk{YYU*2KT1}12WzcX{*meM$`|mQP_K)RAihd7##1LPax*JqX#}OkN-i8ZI_erbEN7V>H zr_mQ@)9>g0`7-p0`mE8WF72R)>)WB8-GVS*ZgBdD5=D7YaK4fV_q%-F$_!*Xp-9*` z;&9p$c^YbRxf{~`Tk8|c(Du>6l&Fh8SvcRvows3`+cF0~Wo+o`+>UQP-?utGWtqFN z1MjJxZ_tcx{#vhEceDPqM$DzVT$nVPr}=ZEmG4-~X??!#4c6@A9t5knwxkWm1Zkdo zO7cw{<>fhO1?eO!@H2$`kiVV~`~N@A{~_gYK(3g`V>R_d;Qfs@pkRzGbjzqllS<~G zL7I>v_WsIr6P=bt!!=2=Y0Qq3-h6dQ=ZTY1ZhbIvnjtU-mQaYNsIB9IM#tl&%B@_gFb0ffz704-$( z5el^Q^iEbH$u4Lv^vZ@R90#0q*86_3!8psg%{J~Gg^b8}%}AkJJ^Cr=2=ZO~K}U8B z@en-Y-eXj-+O8P8jyYTnG6}+~Mz3D!Wi-?F*&f2vKAZW{KI`nY_uMn0W>~3WFsP;% zDZS8_VTygq;#c;D4Bf*A=emSib2i!#PqfW%BX(J8I@NH6(-g?iR;>tgVxFCpY7nSEyE3y+^=pPMe$p8C&p*58gx3j=%0=o?)#UT!dr;FCr4M^{^-7 zj`E3iG*)M!$)6Wen$Kt%{wSkh{50uOY97308?X@s$Te44unx_E3kH_#TW`-9?F| zplf3x{LX{yz_?0f0ehm=f+ zQQ<3_3SMIV*VyM-t>wyJVN~XlfV&+WoUL1z#>QKXj=C3dG!m*7!&xPSqHojzeutyJ zi{6IkhU5ZP{oYQ*=s8O(G}t>-Z<$+}VKmm*QJ1ar1!sMu^17iYK26w|2m2i;Op*iP zPQh1M#oAXAGZPSbY|!f2ZLlFeWs{53oWOy?=XP#Qc>7+rBZw0KB1SJaKrT=8awo*= zm|%}$Xlv_b-$y?sBGwj-yh*taUbriu-l(;!tVwS{jphcWD_e}ddoKiw9zUpPjvI4? zH>0{5B}%=PU0gvyAFM3YdmgbN9&pUV?~TaoeUeilZjofg)0%FXp|T#@gL-J(+1=I2^E zya>l=?Zs!_&l{cbXSDE)ME?11{I1(Xwa8MlGo^)7KKHTi6@+sIFcZ^owX4AZh2q^J$a7W)RA`^YNP%QiYa zx78VD+A@*Zcms$14JY3Im7P_n4`-IbhCf~4w|-_hRfH0~+LcX*-%?PVcvVub^jU9? zp`cxtaCdf%ItMc40x%prUSSA9&IvSE44f<(_*BH5;{-`q@&5Ry7mr_oEWYRn7flX` z-5xuVxR%#6ugTF8GpWe4c0{9r!jg6cyGEI4x7W|mja0<^Z{60<6D=d_cA&_}P$Oh^ zZDx;AKxJ#dgw0_AMHYHVhMKp0JYoqX-DQ_EptoLh=N!8mcB-o9_l>(+!yfP`bh>Qi z6@z5W}EJR_U)e3v6@g_XU+$)mwV&Nor>i14kzq#o){ z3qkg)8l}4QlGyFsO8YHk3RD}Ft41p`Wc*6fVrNoRbk*IGbf0KiQ z9W{ozSk8y476GNF3CKVnzjB*0P=Q8LgmC*-DD1*jaM{Dm8xM2Qvb4)3$1VAsFvvrG zptgKdXMbwxkXLrZpW3R0BZyBlM?+d^KRD{$(Y=w!{cCom$!WRa{UU`TV9I3z?MJTp z7>TeBw{mE~D3*3pXSTeGT8)m7{j95Cx?mfP?i$Nj+)uEBO`)9sqmF!o)RF7$C;!$V zN%%bR0U;v#<`Jcl(TwSItHKk9I{5kFb5F$dNxh zs$Np7$(_2rL#(IkNH#dhtFL{5>q|j@0o_H@22t-F#hPi9VkOVP=9lzN^ZvI@{k0{! z+fR!2370;KPJBlt@h#wWUPJ`5lmx7=xRBc$5u^A(LG{$R0E&iS8aL*(mjOucOo@A2 zz$`UoR6T{H(R3>uS(yR7*OCfov!+z&f786@R6An?mO5f|$b!N-117mCGBf~>4^#X! zy|78^P^Fg?;jRdgk*ykJt9uNZ<&&Dx_4mp10K3(ug zQ&lj*H4r%oE7hX&#W@G{Hr8cS(wQXiij%08cm%PS>&5>Q&T zh%gHA5bAfdzs_Eb9^Pwqzz8!2Z5SQhXw2GK$P4?thN3Rlr?uo4Kg$=d4uCFNNdGJ1_Z3?r!vR8G+)1{wydawI9g6r%M&cx z7qeDHUu$~9#Ag&<3u9Yw%W(p&1!3j{Wkr&rzLkUReO31a8ne{`#BZsO4r2?RUjCog z!cRq7K;5x$%Z>-#HGzL+m-|RB-VI%(kCaloS?5M!TKbA3Tc%ZAj@B?TpQSB1-+g8o z7wA^Pap5wKNygdF%eZD@IB>Hzi0)W^$b<3BK$@bd5dTPaqL`aS%o%?CJoDDXE4IR? zE*oK+58QLr)LIyiE%*25Rc$_~8FsKa9Td0bUZY?$VbV3jAV+K9znac6@A%YdtgaR^ zt$riC%)*=HMjfk6Y{}Wm0QHH$DBCDzOBLEe#KbUfh8~ef5qy4MhvAe?2#8dns?I5c zERU1kw0$oQvF<~r)J~wVrVrIpJ&Rg}P#}h^`&d1GT+i&CvwX*aQ8oA3F}pCGm_J(G zz0Z~iWkKs@5_D6BjCi<@TqNSC$R|!yU?8UOh9WCm!0T=Sz zfui{}tIFK`#q@=@i-@r+vN_YIVlm>Za6vIepJnGO)pw^-DDuT$9KF#l?hDyuRBpYs4hfjtZ?%)BGf^84r3q_dOgsB)Ibxv zDnXhY=dvoEpS;3~NP=s>z8~CH4dFOo2|K2_5=)46>}&D|_90808MgwU8op8u z-m;n{=*GKdJgDC)poU^2t6&JEQ5S*dW{|#z`ftT@rV1n-+*e*GB`{IPp^( z@PQk}V;0i+e2I!Lj_M=A6@?GBSd9*Yi3~(%Ab9MyP4W)QX={`)XQhLPNX-0CHO)U- z!6b#$9o4UE1k1!9MXr?OQ8{{LwX1S&m1Ctm2UrMBvlDwvxY~o6q{gvuWD~4L!*O$d@!*?T{g?vfP_=Z9ThYjYaqL*7H6DX3F zKC?4Z?cvbw89Sys70hr8+GLof&BS1TM^v_ik&3R*oD-cmlcXfI54YBO z)Y@e#@(~5INSK;oX~436s>Jg^Q-4rCY4}y|l4b=x6zT2NuIhTZmH3Xcu>@(jO-mBhV^KlTP%#r9PCWL)c-D%ux@->o>w&_Hvr zdH4J~86D%M7sJmtE!V#+nR~k>nyxHo1lqI&Z4xiC*^B49M=1C6H$C7OjWN8nGk%Ot z*h12VeX@9=Xf&Q~+vmclVPUl>3;h*q*V&jr*Ik#epiQzzq4jl-TXKaurX2({Qr;np z7x9%@R6&wk4Ra5LJ-4&`Nm=d`5#QNWX5ZDeuG)c?sITFiwyrpIMqJd9%cgR^{=sbG z-2Hd2N_kz95Wlty_hF|}A$atmIHTPW-QI^*KFDZq=DgU0QIOH<0}%lea)p?HJYc$U z!M8%S!eAa1HuHK^dF|^qNn&PUn-}FQPy1#O`bh-!*>*3HW(XQR^Np98lEhHIm&12H z2I?$-S$)xg{7UDw&wZyC^vT7)!jGMhhaKIvBD4;(Q8ASQnX0#sc**yRwH*7 zS)y>gsFOV>ai=L$+K=h)OXidg{J7UHZzFRpJM%xzhC^P0N_R$CsUq{i;KiI4TL`45^mhJ3Z z&gJ?l9dvw(KbHNjc_W)y)rs1edl!tK(#oEpbOe%j1&zOm@bsJGD_@79YuQ>2Se3o* z_(3ez6}vd|F+GFI3@Vwq!z^$7p?(9m*&&V)0o22?(PvzvFsS9WoxSu1uADmf#i@DJ z#wAf1uOk~E`OD$D@!E?bFoZN|nPF_u_;J@P+6IPp_dGY>dJW5H`wwpqX`O*Xavz8_9;@v&dWMawss3>JL_+^ z#Bg{n!YJ!Gt>3ptZnXJ)60&+!r7&vLiYP(cH@oiWORBThG+azMgS3=qXYggBOzpmt`0vdg(>@u*T+SPD%9mdkr)v`?wnpt>A?;T8%b9 z>;C%4Pjl&i7OkzH_ULc>=bZMGsr%t}k^1XCp~0eSfwG0?!-?v_PA>ulFWfrgYF*F_*aIm&>`8sOIhkdk#!7SRc(D;J?&fS{eu+m}tLaxryPIV8NoylxE2J;|^u%R%ZluyRn7{jdAcH`IXC|mU|uq9{4P=5gd=TQib-cM;?XFYXRPebMyOdP$L zT=OCP&960bKyuZ+61%AWI7mZ(6uO_mFcFi~)U`r4T75oh*Zu_Aaudv1DC>567@>lR zmo5}tZIu?y*%yU9gcM0mNTL93N`+8OLrbUTqU?GF+OGUE;}|*}0)qTF%!GB;rWq7tkJ?s>u9EK%OD}eEJ%q%o)e^P z3tf7{``g{*7Mo@?7pwHD3{~^9&gUWv+0iX2QI3_6l)27C5tCKvU$le!^xz3uG%ylo zw66H??hIUOU#wu%QBV!vOPFuF+N5>U1tIc*w zV&i@dx%-wUIoL6%+36TXwXCy?~h8u94yYyU;y(5Dv3eJ>WNpEIE)SbmE zr(YQ=WR!y<##vfE+Dffm$wsjY^GrJ1&FiZ#f)!XAtCuY_@EF7{o9Bv>bdF4a-nMjl zyQq6{6;|G~hCU+gPGsc}6fhy$Mvv)@lia!*s@kQ=&)Z?QTm94u(xV_ItK_dbgdp8i zwZ|N&7P&Fipxaf0eW5&_nFZ*cGN&=lXfd_X``E_lh{Go=6sP2){dI@?#i0grpCj@M zptwAj8!jSiTe_R4k|z@*INH~yXJaBb)Y8n|jGH*J5|2u5zNaO5J=nXxLtL2zse2eW zpKJJ)@Mdi|ROGjBpZ8_yf%={kA6uzjmC1O0@E9TqpAfSv^&LAs90;A|D!WfVBX)j1 zCzhN6x-I8CFQj95O`0sui+T6n>n;$M%7GMeb(f?rKP`g z4X}>3`hQNbYh>d=sV%n!l*dG%+{NCak18pY5MNhq*w?TLs)Z8Q0l(Cs`b7ek6~{9DrH6bhsjWRv@6`OtI+w8==}eN&_g_TX0M-b zF%?)f<2u+}6ubXuz~OzrdAu1k|7nsS!tsV=UdxpHHvQ!3z!x`q@lp~yO*uEe?9wr@ z_r6_Ls#&8PTf(!1m2FMY4aygudda?_)N|3e|54G*^=uDizoEn&1?8A)F7KzdW7Ga}CRjLtQ!I8&ap|SCL?G;494^?zcj3LU?OB-!W$z%~l}Q<~Xm<8N z59Jz~Fn2>s!XYpq=QDnk#Hw~XzSEtoeXD|bLq92LHjleirBKQ2X#_=nJFD9{yZC&E zZK3RZ&8zo{x8`<(Vz6QyIgNa3rBFZ_M0wQB9*%8iy>8R!MrSW4KTPTaYV(251N z7Og=-RbKD|3op+UuXO1rw{45{GzBjzzByH-vSnbS6eyQ}icfZcQlF#Nbcn8Kh|UV#*jCt$2LEZr$|Bka|p-66@i3}2pv>XsR57uvA+^3f$Vosa~?yigT^E1YTEZX%h%*$m`|n5giYQAglottKK@C0{rLNLYoAZy7@~6jT zdEwU}p(a;c$ln}~)RFx%&qL)JgzWnJ^Ktq`_jtlNdt3#fx0YY2Uvthd3qbTYvIuqZ$R6q6YPgjnel&df z4jepvSFG(zDab4r4un9WTU5m=G%RfVGP=SeXQoPPSb()k4HZwddvfXP8k{5Sg4y3f z-LvqQg}9p~DLdZ*JPQNm^ikmYuE9At0F&o%Qo%bAGLFs_6)CL=*@3@uNWRYmmmTYg zAJ6`u-?2c76k)i}zWTt)D}Q&Q0%VSA8*4iWte7*Hu<9SvHhUCERtdfKpJ7wIywGBE zV4SPg(mg(L`YU4-#&7M;vwwTL7#HI*ztS6c#in%7`oErjKu|{Ahv9uFLKSkuEw6y9 zcL*YwfK!0q*9`N?I6<4P5Ax`YY-An%$zi67%jW+I$Kj_22jUQ|rntX96Qkz+I}M+H zlXu{|i;)yKuV~O`S(@Y31nEJ(`mi6L1fA2cAf4*Yb>o2xbhGxc!;8ICth+vUPYeqg zf8NX5H6Vtsn%5PfWKuepMu*i^8vp1bTUVL3?_96Km}X zYK-;l>+uKwJ}3Y9;oUp>a7%v2{Hm9KmlLahysLCLPAg(vZmg8y8xXa*{9;k|;OSmJ zeDT_IhNAI!$=hN+(ly?Tt^@d-`dM{W`_19N{zA#dBy6{BxqppwcGQ|}5Kq<38eUlo z-;I#6>8QMv()Cle=cH2U_95$cGAEy0fe({vwGSzNH({mh6hdwIa3#M`LDUd?0wSmF zcb#$$48o(0!oZpQu=r~0$*VP#!B*Suwg-P7rGGxL#{D~zh7-I$iDD|wU-kws+?=bf zn`wiwjS*Lin-ADlJ8a7f(G*H1lUK!g2sX*(`7ZVL`5ssmmqnJsZp!VPBDWYv7paM>mC3`ICwlB@4f$g&-dMbc!r7h z-FvOISHJ5=3<2g7RTb_2k$g{Upk(nzO63u;-9q$osoUi^H{}-US*|iEUof6*ni*u3 ziXk@dXhEF7YR10HdQx(xY)DSfUpavE&U6e)AC>db13_SMp0Xps^)>MsBv(O0`7d+$D{ncaNKZut;DKPThmJD7;0vLPwG#D(xyu4X+ zdci>(s6mirD6M?Hm&*RTGDFcy2Nr4fvQOlQu^4fcpsl9#4i(?3Ka3yvH~-!u&mk6R zPUdw~w2!@frV*6mcF}9zcn@Cz4mnt4?Ip$7PRTKit5n~dp`Q^DiCYj(w5$D3QCl*< z)BN@YM4Ie|FM)m8Qkc8@S=4UaoM3> zqVI1$L?bU}9xXm(lrIn=3039LTneQ0*%hhYcr8GG$J!;HfpBD%)A4tuYZ?#quv*B| zeD7hs2|*_><{f=IgS+d zNMe1&BM1))ZGUHc!Z$Y?1lZ(%$alpsdG<^+u8K2-CREODnjic72)=Kw(a)~;$AzC> z2Qq%25-D-LmR<=Ww@r}apq?*~aG zb9c}^#o5eueYZY>;`i5j!nF$PCdPLwjPUFvK}-EWD*m^N|Kr8}swa<$+duJwSPfyO zG_H(&i_#Gy`WWqDzd@MTV~XFT$}}#}tvnxRW0AhUCggh8ZD%aK@y(Ge{lg1oK-fId zEhJHg_@1Q?)8MWdxl*H;EA;9dUGt-%C{6JrGxLv|Lp(mGrFK64$OcoiW}#1(Dnt!^ z^{-Kk7X)KY&9tdP88;$%atV(@`hU{auC*6Hd0(;Tlm2&7uNk>2nc*jMTJ&kA_fd&4 zhQ?GyDdAe`O=)$1|I)879J>rm3EL1mGv#;Y@5_%2a(c+B7;bB(KcI5Mu;R`Esg;K< zGYdU;hNRAa{~{9Qe{z>;d%z$^XDqMp6svT>4ddjDyWOYT7wp*)!Wb*@S`$^Tb!+YX0OryiRi}$|>HZp0MjgonT9m(iD;vbEmLdpok#5Bx9m1d6 zuDpGt;;W()Pew+r33GR(f7N};?l3>Tv4QlJ<~)(@-iEo!o{s*smjC*0Hy36`*J^!Q z>XIaUfTPY^(6ECG%Z&0}pX|S_B6LoJ#kux|FMnfXq;E#?W3Zkw)nG5#`76KemU>eF zMTwjF91$n|i*p`vLeDJjKwspikiJX6PmUu#2GFU1---TpzaSHmC2c$>4`w`LvS#+N?1v zIlpPsn^0a(E~(dOSx8=$RWl=FrS2^!&FC_GHQPLrU~2heJnjv1VI;Nk4|l!90Cje`6&tLpE1nDpC@CjEZhOcYYqify6P{NYk6;0zgH!#F9o^UDUvmIP0Jy+sj z`YZwefTIpC$MxNwuAMs*S_UTVYBgb)N3!@2FW8b0;YKN=puiDXVl~c+7nj^BTfPJ4 zIfC?=3&dF-GV_ga|WjTd)4YOjN}VT2C6NSV@76V+2a=5y+$oU;xQ5b z4wpf+-%-?4`}r7`IgrlsyUj-eD~$HqB7j#P;=ft(vun4@%Vo6@6vlD#`>xVcii5@%j-xCAr%BR zc~?*Cq@jAsIxSYYzc#&I%juv|Jw&4e<>2|674cY1&|%ukJ$nwn#eNqZ*Q_kUH>*gu zT3KaMYjsK>sEK(P_S?QITL9!dcR;sr2P*-R5+#-!X;Y!nEqi-eO;nMnLW?(~TShLj zCz`326V5t1(n0mgm)3O7P(j^5F<>r0>9k) z5e>b>}1^qU49sT_(0uFl> zR5C9k7xS)sqAK8{AC2b&^`-Sue|6hyqf&a8#?nlJs820Odr6h%{5w{S07yk|Pu=wQ z)dQ8Z?KkQV)Ws;)(H;9yt{)%nmtC!D_ zq#%ksH!TIL%ML^30=U@tU_o0fGmGv$$>U>8eE7?eS%1jMgZNc=yRv9|-)=(4c<7}V zcVRhw3@q9W6_Zbhv?yVTdi6>geqo_^!kFrEMtX!KNB3+&hd(Y|X1H&2%%$b2v#ZR% ztciZ769`#IfuGD)XT>6l#7X&)=3#--bwek+`>%yaw`$Uh8$UR3XGqxJ9vwZr#5~b9 zTF@<=%9h(Nh>K|R-Y(B*6X2^exsbhVN=DPiZDUexCdDL`qhthgU%*y++Sr{4nvHE1 zw!7K+zH7;!94=%D3r9E=9bGK)Nb8b*)ST`f=_DW3D{3S#fB2GKUB>?!^(4?bh0&Lm zhe~Q3OGv^2n^(;ERS)@q7jwxsB(*nzKX%rT%dGsua;TWc{_o2;7h(lJP)2zq1wa9m zXWyy;+HT%TlYmL2;0-#W-EpfXS=p)CuB6CWk1FMYglHz$QZ8=b(v4wzaOhq;@Mvzm z-`fCYA(M-ak{a9Kx4nfZl=~5uy@C=)>edC~j90XrjGLBzIs4=6cDO`u33bXu#AU(8 zn8@LfZr$=enZ9ds0YD2>--h$2=j(tphKD1J@&;6Qr408*-_%PXm>s=GM$X;ps$?NA zRl5i2Rx>S^^mh5WizjLRLH!>w?XL-C2qG`x$TaFT*lfkqoFAGK31T<@R;{sg42+fUPvBa7NbIr zlRcOH$4TUQdcS%w^wJpRZ<9?GI9U;Mc0@=MIh`18j!n?_O_Jcg*2(%JHko|e+M$|R zNiGu3=x+11-yMB*6`s~JWJgU|Rty)+B3?ciqwF3^-4m7?#5doEPQdwpTX>;p7@R#% zyhD&rKI2!=V>TR3zPw0M6Q0z-W*?2SoSh5uvV_dV_p-6S>m;6l;72R^8n0;**|qty_bpMI$``aI zn|*|{9=^Lq-F}V?m)RoR{jM9qdWPQ2as~gu-m3evq@E5Hq|rm)Fa9%X>2mwC9q<%x?n^9An7iyplPt?n7v#v(x}uiphc%$4EcfiDH7jt|(Wi`7JJ*!PQm-^_Q3 z`q@csq6dC=cvf`wQ8@$$_}wYRO)*R!MY|sEO&cD)D=zLj1otmUFnruz%^8orL$$bn zKjhJ>Vut$Yueb1>%Ahg~o>fgwGeE)(!EmXxU*Z=p&6&t=z`&hbBFt_sz>Qb%CS-eW ze`2YOgn8nNJI#`NSdd(6_`3C`kDl3g5&89f^%)VQvnumKK297cOuXd&>Ok)^Yo-9# zN+`WlQhr8P9A-3wPx;E{v-&5hSK3(*6LlBuaV>Lt8ab(kqC(2l-`F^cT1U}Ps>7UW zpL5WB_{Ag2$K@PV6cX3uQapf+*l>6zVV1RJ0KPI?k;}&VyW5!-ajoL9eNy+W*mtB- zfA2*rJwmfhh!Xv_sy=pIi0>ItczB?G>Q^HQj&B{AJNg6&URWf0{c14R-^*yM5bzt< zu4lP@m(TA~_4jxE_8m4)L=_V%^KYaTkha^pE4IJbdx+Hf+iO>hWAI|3AQXhoXF$hC9m1bmmq_VhNsY9DGl)tC+fARBweKd}S zG1dLcKDA?7`uOq)V}Z59n10D=@}KFgQeZGjU;lpL8+kjfCxObg^SOHwpXy)y4yK)JDF|0zjtu|5rr#-^Tw!f&ZQN|0%lTI^Y+^0r8RR|1|t>`BKN@ zg#Y(V+uq^);Hj{Sas`#ktp42NL>A4om>2jh{1QA*R;6Q73O4du$#uJD63VMtR-&U_ zM5m$@#kqU&Bq~aPrO&6z#>y8x$<`$^nVCKv21$pTyOR=K87hT~`*Pk{_9>R-0yF{^1p@r$e;gv9JL z5EIQgr<=t8@zx+GT)|^k`gqhfjGq6+$;44Xsn2F76?FUMHKYU3&SaIAUX^$a{i&Y7 zv2uM;FB`{;fq@`tkoHNI{-E&^*uXy#^H*HmBcO=)9)8HifBZ|*2u`7*eLD*{_^uU) zG*q-b6LEhlSpWI}hY!KI82cu1-2YIV5I-x$#L*u^e|`U-?sgK$_t*yCV268w$rOqn*U&!G}(0tl&Q}qSs8&7_{?w@`N z*#l(7LZ~-onVqf_w z|9_88)xHpmJ@MdQ%g8(Y_Yo1aa-xZ%FUK#|Gtmdd+tTQmNoHzKOuXEuTozX_Fa2ABTIF^817V<8m4lTiAc4Q z@t*sy8Q>4z{Q8zE2tIf3KVn1XGme03PGYKXSDv5@M}9y;Qc&o}j}G-b;nZ~&8?b{$ zEDOpdn~OqqiO8yqLK(#h781v<5>HEyAj6sfgRHyNJuwZ)mF&s5W);oN!TAER6(>?`u;h8JW!WDK6Q z){SO>=+3yhx{v&qlsR|Lco z!8ksNtRU-x*hoH(CO;(@d2oE6y~h9(8S>GGJVkGyp@FHqz1^ULHCuu;Ugx+wv9L~} zz0;i$U~o2lIl1$OtYD^bFGP^tfZm(#;ghI#dIpKf^#ukk=fnHaJC?y0Z~J_3{k5=4 zfb$WT(vpwN8VX7jkvAzUBk8Xv<_UVlH1Ea1+0T;>(vw&-_?hg6z;im%LmS8J$N7ht zMLy&+1k0$?2B*<=(Q)`=%)Cu7Z!(q1e9A6#xnCnv@P2~8;K9mzPTlxa{?Z+v>|?8` z5u+FkG0~M@if+#o#Se8o)P||9I@37?quZml@a7JNEKG*WrRnU=vRl~h?-UqwWF%%X zjCqG7RP)<@3>i#HWSDFEdO1{B{mK^(#;^0p#QV#pAAoG}wKLPI7m($Hl13Wpzypn| zE0IZ?C1Sk96COha>yZl9=#~h1d&>D4*JPS#la5lK`)?`hHCxog4*Nn|j3x7>t^D zU<#k-=DNjP%UC`SZx>KRh(vP2yiDN6RU9VT;+~T}(QIQ9FN3s+R`$=M!EZh6{iPQW zhj2fh4nS#<4K_a{R(GO9+h#aLrd+&u%HngSDQ>z} zS4MOYAN$gEaui~1OUJ`-#=9J^a|#+rG-8-y7@?f+DM(fuH%ZkQmK^VhCmlXX8;|Cm zyrr6~tOC#16Q1ex@VU)_dSrgSJ8vc2)bYQXCWl-Ydi>0{1 zERZ?9?ep+@;9^mGj7oXXW<|+83rXGEv-irf`7Fyyndi9s?6;VNde%Gce6}UK{A@n= z*a6O__IpsA$8B`hI6HK#z$J8biotIX7c(bY!*cmxpT(lSWkXFwLNtK$wiV97$-28A zF_2gA<9Wq-aPr{owYUM*V}kOLp*3s4O{T<eDGZJK#G3#Yo|tL)J9AJ7Yj8=i(tQwSPb^W4{>tJkg(DbUi>2Z0g2N;y)b zK9#|0Oxa_VW-AL>W2C|Ou7KR0hY3?x`P~RuK%>Bi(K5y?(th zl&gYwq39_%%m%}2v~|44bs>-I0lSfKuuLK;s*U9!Mx8YqXU^)XPJ2?5&y}_M&wfvn z&2MA>ll|oYtNAD>R)@S!oExqzDZvT0Z!O6}cdf>r)^nG`vM*-YGNEzO~W!OCy4VSpj04FPxKS zjx9ykHN@(au!T(O7%i;Zd8F58qjm*Lmh}Gn2it5ZA>F;%EyvC@zfi2+PRdB|(&l3D z!1L$R=c-3jVc6tBs8Fa66_1IM$#vwb|J8%?#{*{CqFePevcP=2+FGQ`Dbyll9By2& zs50B@yHR^NlFyRp`KqEC_J?Ds4qRMeNnt+%{0`EdoySYOb=LI87yB`?ZHArdq$RTy z+p?REt@kei4B0}*%sXAdtbj}`*PCZMrIyBvKGv%7-73&}JoYtv!D3`uw@x~$ZuY(Q zF||Q?t@VQgmxu^BI8;U~tW?$}&P?OnNs|W2&!6w{#904&|5azBc0vJ{PW`3}y6rjB^?~NzC z@hXxJdL4?QBP#bae4uTf2eFSa?xfBji-537F^lXc8ic4vb_C*ZCP+loBHTvOsT}4+ zKOa{2@D(Idv53LzB(ex0A9is6QGSpVxCLz!$NT;z*8o~++Qd>=r(_iOBx3nc+e|GM zUoL{$&xAkx{MY~TW9EIiflORiO$NUpzfqQh=g$KXo6#bd)r^}9(|YXn%SHa>E|9B4 zXuqN)g0N36eQsfMt6I z1=H~om2!1gz>MdRt?iKU)5<)n%0j0rPB;twsLsAAoOk%b=S-gcC3gUsKQnFEnJ5;D zy#p|qSOP*quF0jz2Nzq-iNXs^bShm=T7Xf%^#J+xijXh4_h5abU=rPS1Oou4(Kf{2 z8C)DJDN)-51J9RjuBhq2xtmP~i*1ctTzm1{yK@QbFSHT)XA-ML9l$S=QD^>{D}=0} zt*oqQ1I#@OfKyrzuu|hWaWdzx#SULyDjLH!=*fIbublUJ;TAr~5URLTPz?*_Aj_~?6Z(5+>BrctCz;BJguQ;dGOQBa~cY0GJ4Ys zi(jV`lZD&Yq_+8+PtyK*i5K@M`1mx)?dO^Ma`k)>u;f4s;CPtMPzk&G^6m%&BsQv& zXG_>QrzG#60K#B{@fV2&66uk9g2=>Ubx>>mhlMdyR~mLQTiqc%hhk1wnc8MFj zdm4xrm_FzaP*ziVz2Basa)B&geAG2PYCBBG{>R>z@$~z064&N>nBKecf!W0?T?!iY z04bLtH%Z^Rcq-an5`hvKyR*5O0EW1WE|zVohfWd^5i#!mBL2nkMWm$0)byHv-~l5F zwH3Qzs7OdGnS3APUCzLiqa$oidsDxaBK*#?%(dArv5on@v802A$pABhjV}7pu#=7j)6|eOtBf#jo z1}v?q=C?WeZImi+Mh|*zuu!LMfswFL03AK^z29Fs3}-kPHZJ8_-Z2TDf=wo zFih*A-KAFif)?&o@z9tEb|X8!H}Oa`xrpZqfVRbn*$uV1`tyx?l)GhrmF)Y1PZ2L+ z<2XZhw1Yov8-*mAqW5h{Q??GIS_j1o6cG`T_GGEceMRQ+Dp>&V_gUHj4LO!Ja zK|vR9Xq1;e%v4nZd!zx-83ni>%nHp*Vr6T<5Gfr1LhchWFrZpj;7CPBCkCL!4TssC z6jC3Gw70jb&T=o1-mw-3qvG#S$+iKFr?WIv7H1`w`Vdzw?=EU4#yLU?AmYoN0{nCA ztws|K!HCn;_u;YIve)Fqgh*GaT%vNmVO$FY;CCllPBr^XwZxoEU5MtfSB(f^Q0boT zNNlh38M53rXFPrSv`nF?+El7b;X1kVTANUg-MZn}()}2$GQJ&$Sxa`CuaDYx$%O&r zn9PJ~dq+p&)0uW3+I{=C>_#DbV4`fTRel*`@4JPk*>5t{N<_iVy!8gmWpFv~?TZVJ zF1>e`oqYPE(EK4*djwziE97?v@v)Gcl0T%|-Rz{A_m001dA5Uyq=w9FcZP}sDziQE zRi5CzSICN1c`L6^@d`QsbQ!`l6+dKBFYU#o1*i;Oh_RoHb!;E*!@!hrIt1V>H-N+t zba~Oe4<<#2f@y(*oMeewbv`R#wjS4phTRM`bj;@t>F$QNFW-S8BY^4JHHB0lV3@+$ z3#EJ=3B=Q2ND7D@sG)twcKKgzhS#ec@%A&!v)Brpk%Dpw>CfMqqyjs4uB1Xhv z9G3h^una?E+Sd{>AJn`2?OY>#t~(>}HMyNI@BW%>_L&iLQ(#>;Nn9xb?0pOvG1iYs zZox~wXo6K9!EKvUdayGmSoxZ-r-LH=%KcY_!!IM*3`SQkI$}5Z?5No_1l{0mu`>Od z<-9Le>q9oDN{vq^9|UkaOFFkpa&1?20X~z8*P}~VH&-9B#m<$kHnSdBgY!6<5-wJD zuwS+{>d9z@a0Hz8cSNkM3z*OEmvqN6O9`~}OeyV0+l-#3+NzUP(OCatckR>mvvDIy zQlUT2-Vc8$I)UbUp&WGZg8~_qr)ceZKW0un47rT$EZ?_L*wWZ2K9+bx&D$0h!cf}+ zh6E?vb;F2bdckfw(5tvmVl~%&U`@1Q{Y9Bw`4lm%g(OYzR7C(+n&9ib7C&rUNNm{Y zAW89{4Y@SonG-BVd71MOZ(>#KtoqFS%P1o*W=Qm1D2CVCeBOZ84Ck!c6r|@kZoIpA z{^Wj?p&Xl~J5*68w2huz{w_!J)a;ZxmJIak$FpQr^zx2eG4b$-jOtYVSn->#91-}s z!0wu=S+#j0$Dpj&Q`S>8!=+&{JtQl;qr%pKmz(c zGmbA=t(Ok~5b|0Z_US|bqHqwcoL~)nFP0}G5GoaE3bL802kTwCPr=A#!jlh%nmP5* z+Y5Hi3FYdKv{?11>1h+LuwyrIvszAyZv%*5uidmNqw?CN88Zo1X*Kg2{2bjTVvSIC zpSjgNfXDy?P+(q=vX$FVki}~yun1r=J8XzV6h3aq0Wf&#VwU{m&@+y2FHbKErxRyrdDKjK%f)BJ zgh1q3^t$wo?i=DlD0tBVjG1(qW}P!Z{x4A&FS?pUFuY&v-?NNGkn-(GlGS%Eo9nEFx^xI zE~*EZiAW2O8LV9Nq75^ZgzPrvZ^$M~23G(Wh-B;+kJDmfE1!h(IXktM8R66cC1ApR zDFQdSD9Eg0zZ;XWefg9Oo6W*<-DOS|`Z56M$LnU&=y(W*_X@sBp%U^5JHI`^XSenq zmyPq;qH0A&Awi*DI}Hlf4~O8-e=&1G-2WIO>6i-psu8QSz}ud=oEQ-Guwf~XHmLrI zfxUUCvxvHrkCi1L)I+5OCit-@6hxp$Ds&wdO=IDkVR2#{8Uz}QO%TQEy9K@h8_;<0^+^qx;= zYTNB@Mf)K|_WoVGiy6UWZh9@K??R0b|Hi1E;UgFfv!M9EKxt{?Lgj))`1Ko`@lQJMALg+!L zGJwZ6jk(JaA;OR9&IWT&UeatP^CjVw%q*UzEsS-CpuURQWivCXtaUkws@)bRFnOPG z_f3J9D)H7BL+icV8r7$50xb3$#xotszOe0g18w4L9m!Igy@|JtUL~^VG!VK{&n~3s zx4v--ZI2n1;YRNZ0@cj5FbqRm+MT!Al5cOXfRXk#hMG#wAh=NK-c?B%re<#yVx8Nf z^|!lr|5w^=0HNJf!VZv)R3(#ZdkX$UL-Z2*MQyDv^A2U6j8v`EOr-_&lfKDbO?v$w zNl?zOAXH# z>N;%GiFt-?44MLc<#>SFdq!PKN7^2=f+FubTjh#RbJ=jkQ>J%*8oD?bMs6mYqrp?GzCv5 zpsd_y;DuTAYQ+z8a&x_9F|bLeLu~b0WADClvy8zaW_vQkUcgS5oJ>K2^{{O$LP;1k z<*769GFQNOco=Ykt^wGYXccGT@pqdL3E)c%`drE%&8j#E0I_IQMr1<5Rm9xb2{2MK zFt_`VHvR(F<$S=1^p?jFIp&Dpom`)^5=1GN6@eqc8g#KUB{0gm-#{i)mFtsI%#=Y#5_Erm#)?g={S_8T z0s!SvXCg__V+nE=Qm3iDi|l0_`P!6VQiKGWAM~h)1`*|M5eU<%F(iPN5T?^C&rmP5QN0 zQlp>*j9&KcDz?I(k|vP%Zq6M)HeY5K%*>79823=BsZ=>#%KM$+`{T+7}4)Oq&ad=Roe?kgqx4~xL2@l}E ze+IT>c11k2P)DkRYu0z@lRuSE@n8(XQRh3{mKrl-3frF9cLwg=u+QG#35j$3+ z*gG?S>uaR;6uFPa33wwbZDG(EoqH9^CaUqTY*)T0d*5#Sw9)IBC%>|Oi-PYwHyC}eSY5Z73WL%CTHP5;hAau-Vg8A z=KDGl%P^W-qIuwnlF!yy<8|Y+&*U(3b~~|4^K0yIGF^*RGWjUS_E|)&5hQdNS)30X z+9>eN1W*;&I=nHg!Y-kO@j4bS^9Z>y-BUW)Ta_wYWGnha`?+>N`qHh|N6c6#ESIpZ z(n-2VU%2_?bpWrxxLRmT^JY* zV9XMR*WMTVdQPmn^J6x#72C_W`~b5DQ|UzdPisum;+V(*#L(;ZB6F?KPsR6^!I0mp zQ*WO|FSGOk_e<4ht{H$y5w$}|(n8Oz-v%zy8A_1o=@p$!C*B{PdUg0`t0CknI-8;( zDvbkv(;5I2#2(Yz-B`#m9~0aL%;m=D)py=uIRp|omu3_?7J)C#r`7Lftcv~Wkq~Qt zLUJ-}sLWo?4*3588m=4wX*CVuL`|p;LP5%?CW>nXEWtl2inOpGqU(Nc#g@w29dC^5 z4gjHnF?k+d*rLPt@QzVWW-vg0AIK=l(SbF*IF09k(bp^0X+Af4A|kjBIzBZ;GHmq} z*F`$y?VV@ER-pj_qw-TJ_fRd^RFW;_NqC$=92_nA25N`pVz)gJx_@SLw)LHx|N0sT zuq?ytKv+8gAiWT2#j3<1xDSSe!8H=+1~A7wQNWV`;kSlP?hNB&EwUVv8N`q7h!>0d zk^NNJ#$6q8>`SA@wjXSAPlfplz)FBtI*BJI?ov1L2*kmFlP0*gMT;AKXKQE=QLqLJ$ z5IBa3hFz(q3-fg0C1kPRvapo2AM7_xXS&itTVf9OcRh98+FDY~N|#^xi?q$IraFEN zrj1WMdjTtMSq{LEO?UI7qO!Hts-&{Jr#H`7LS93?9V;|zJPt5ggZ7rkGO95mX;A4O0ttjQ1kPguNJhQMyVV0y zmB@^B=Q_D-*jY@OUwBzfNl78Y5ug{3gL&p`&yCh}NY!eT6fPCeR)O?kmsG;+bEWzo zZjN2i^2wbiOM1Gx4W+iL1B~&O#C%Sr)3n3o9+?~&bVMq_^?@`ha;M}j0j9Cv{0y!B zl-kz3+O_Z~I{%TpH-|<~xnUkuee-^qVcs_JMsQ=(`uxAzMIg(US}!eXIIhdpfBuYV z!{WHRfwdI{ktzbvT=Y_HOZSI7oSe2t+|Ca~=*I>)aj=GhIHPh)y})Wter$DUwkys1 z<%tM315MLe%VAnYfx0n<-g>=ca^h)Cba{bXJq+cw5>MR$woqVKUpqW-16ikVCMqZt z8b@>&pxrr(sjElB%`IPI-1R1A7iIHPUrLd~@z{=1?CZ%s04Uy=`nPuI)d9Mg>D2Ud zJQ5D$Cuy4xnIBc2ka|r&7s+X6s&CcTI^FeEVHSf|am$io%$Ea(e;{DkobCgIql zWEXtXZr3NdfjY}!_2)hzs(JytT$i^n452&+FKAmo@THtOP{lf5M0ssZ#?>Fl(Mx#87f*Vwd zcoHy-19WQh%#Gpg8v- zGRh0EUVfEhbEdsLoehCXI!($p7N<+?AwStJ-P|((OgI`|b)u`Le9iE#Z1K|>m-6J< zd|*%084b31if-}!iab|^w(L}~kI5)-v5Ro7HyC!dq0lw};WK912zDUhG$qZRaoCwj zHti7=7WM;rySQsN)dsvFfNHdsNVne>x=SmUIzGo%;X4Pjo}9n4Ar~LxxS>SEW0yD0 zI-W6|+E$a#zp8Y0BDD>q=`2gozbLZr0BCqisE;G{>LdA*XEW~Kw4i&jixXohNQw*a z!R3In`hK}HQw=_LcI&Ry^u$%NsrE!MHD&#RTBzleN3x4IzzgMLT(A;C#Xuyh3U?s1 zY(;uNN5>I~vZuxFZvrhpUg?VJ`c!Vb0N9#9L}q9`_t}#ASZ*2oBp)rej$oTO-#dB$ zL;hyq*|6iQM7fIB*kmj$7YyVn_noYOOXA^_v^ZQ*fqNn`oZZv1?HqSi5Gd3rM<=x; z@FfCAj<;epd>0XQLmPSv&ydnJwo%|L|X49B2__o34zJNfIYYQOu6RRgJ5H zM-U}}(_h;HU{I+e{FAOHf>fRW7f-AuQ^`CF6x@NDhNfE~!Wtfm9E#-O|)mpBe^TrccrwAh)`y~EC1-k`q)w`q_Z z8>lVKI7_glQtD0B9V6mAC4A=_HIFISk2gSYa?5IlPxownjqiExVi%}z7wEcVs$oeYdlbDd~11((Zot`>+2U&D|vidTU!>#ou_T-zOYcH zLcO|ArY5F0$TeaaL`HnOxePWK?D%ziGha4KWftag^=WkV>_QYp#G0%TF^0TX$>5x!M=l<)Br)}NNgr2+)$TXX_H(8u)x z0}fr<10g)FPFIeD@<$gvxGr71_!-#c!D5dt2nn#~Bi31aDc5IV##Nr&ee28jB< z2@D%LO4B*n&TJn-X3!ud$lBwu(WfVvL_Bps1MG9Dk+G5WC*Zo*Wellin-1Qd0SCn& zTI)dHy}>?mRi=ja$&HIW-6v9;-`;@%EIBi@K~RXr=*%DnfUfFm(MGM3z_CWX&8O@w z70pf5naD0JSV0Gzuv1p$6^A7J(r@9Cw5MCNKUhw2|CHco~M@! zQIkvp(VI1Lj0;{ldM)JJ0Nwr?C{zSvlil938vOY2UPV6_=WX-R7ptbN@G3jI9qd%4 z7|nM`U2p3E>^CqyUR4{E&Me^D?&$|U-TTK8ulcGn} z(%Ui^UZ7h?#HR1pBhC?VB?q{xh>)FY%!@Svl)r1G;sw3=>-3latbC#)YkCEb<5DX{ z45&WRruSeAP1&6XKA_2-c0bA~_Fi3pFJIdN%1VyvEOd0RThF#vCV1h7Zl$H%2%?>l zt0hQleBa!&oL8m;BY@q{zMwDL9xWnfOpBbtI?^DR@rc}Hb)pfnlwDUx$xn^C!Z3&J z*WcAIy4~KD_~8Qt^Aee6Uq=ezvtk)z~url$14I+&IItdpKWuexbCv*Hu?dWDxwZV8XlepLIIk5 zL)!y*8(y@-iilFS=1VwKxvkXJa;z8?ds2m7>x*p;G72n4-Spc#b6EmzX%?223__V;aAwI;f>aD|NZngHw|Ys- zt*?)#7@rSeTg7@O>s^^XiD4U;Y##JNk45+bqC}5O#6Pn~6cnzqVz<$s5_=ybziR+h zD@AMt8%1SF2l!&@xi!=9RLWBD_m!x}elLY5Kfhqr%Biddi^EU#^W_EL(bXCfp0%toBcp|NY=2UP-T@ zeb$#Huk_vo@J%0 zm2@wSY|BzzM6?&^Kd~}^JKN9pWHAws#PKck=i_0;VG2Aj!opC_)%8wSFYDjRsFDO3 zyN$G65aGb$eR*jS)kFk9@&akvql;Ev@GCm#3>2F-cDn297W?ujT-8S)f*NbU- z++18rAP0C^nDeobifT;#2iI2SAHBRkaxy0oI+}v83Hd0*j$^8JZrg(PPtnlR_!q}v z1^ciG>23lMQE`7m1BnFP;0{ugfI!iDYBgh~;)H~HU!x)G&Rkc>O_cO;60e9U%h`T) z{XtOu7DH8g%oT=6HhX4k?-6}-DIJDy$$R#5k^ zyX>r*EOuLNo|XO) z*W_&XGGBTgbDlKlO(cg{U8jHC{OQ{>nQC_?aw&S z^==jKO5$BoHosjMQ$^5uzNZ>d0B1MzE7A2_5LVhNFjfH9cVSgE6wmk$$fN~>3`|6t zwAzHT2lVLLzWkdb;cS6k0hILL^ zHHI+{MLe?;((U!_mA3PRpF5Y#{1nQk8Co3MA2`9+-oUmn z@}0$rd*&Bq>abB<&nT8Xx_A~8CU5&HD%BSP*TD3CPw<<=t+Dfkb{hBquF6|~G6dvv z2$`g3JQYB*i5Dr4U1v`UukT!H8&H9WlEPinqAwUTLuDl({N&sczMa<*0XJa1> zGfR_;&%aC0V+H~?HH^hN$#ia`=vRgs?EMY{iEm{T^`30|3KR7b^~(Z1>lD zCP2ps!9w73gv!C;ay`jzBsv_CoI^(6Um|7Km(vmEW*jAyaFX+_UWDG7Al4py`K|M2MN<4;lFlR_MF*!Z7 z_>l_~G$4kh@w2Kksus0o45i+?MAAx;AWg9E^)@hY>{%%2c*r-l2kCB=ZlN@m{ub?< z&O&WDqs8A+rpNSZ7)asQn~a?<(_^`XR4jOf>pO_**y#=Cb%JD%bbO zerN!YjJThJyb1u2n)w}}+H@uxuJU%K&rw~84NQ;-1xu^Rhrzqm9( z6?_B-)&AsQM(t7xV@Nc+lvbym8hd~0wCH5jMaMVN8jVr6tx|F46P3I{t?D{R`UDRT zg6#Rf9+BogGcXhvKGtgvKfCwIN%1NdI=atoDUuQsCR2_4X`#9=ouD9PMf*z{Q}Eq3`nNsm_8E>n6Puv(EKwEHZ5>gd?lSHxXcV|a zv<1v#V;A}6u+112Osgs4?T%S;+1;^P?}bRliWs}u8_QFca{!rk54*t}>Js`E)aUH6 z8ZCI`>I{OjSr{0avL3Nam47TFThL<(tB8LR*~<4*eS84)@mSWyg>Shdg#Qv-jro*s zpF>1~E8k;{#&gNfyTmaos`%-kvvyU3GZ$%UB6|QU$xBmeC80XwYVQ*uvfPk2`YIZ* zFd=8z))khazQJ0UyEJ!J2V{P7K;x8=yuWmiK1hs@`Q#&d2ORk%s?xQaQ`^eb3=nC1 zG+OB^TuOF#bROAQf;OfZs@#{W>;#K&8cP$Ujrob^#a8o?dxEjOXZ7Xl2^f^OqF#gO zBQFqZc@*f{7IA@p2sWW_3AD5Bd(|DeT_i0 zLISD_^(#eXG8KhU_KVQCaIPkSia8rtyO!xvi&M@*h1skQW5lu^sL`ss1AYFVIY^-s2gN3OWU*{!9#GMlo`kSjOS4uKwUr^I838A;15hq zGZE!0@+@Znb}jPq4F3FJP2-Y2Z(!8{S=*{r9rBW$VhbylpFZn1p<_}&pNrlZheV_|hDQlcunw`m{`m>d= zlCibi5FeD;H(0db*1Ji=6>nRB7h@;Q&fc|TY2Xe?Kdb-MtuP=UK+~aiqq}xHO!vzN zT2Ngm^(V5Z@xV8Iy`DS4vpGNoQX;{i9jl0pQ$Z0u=T>3%85t&edbY_2Wp-9GpnSk) z*eMKfxT&W)yc*qz(;v&RNsoiRmk>m62ODexSJ0$sABrX%j$MyVISnl&d{hY$b@}p^Mt?LZQ|Q@txaOAhB%Q z0o_j#X^A3%*933+!%wQb)ZOc}f4^x5;6MdqTYxt}AJLT!ikxwGdA`siayJMwxK`M# z;bt1bs7A|F`t`X!Mi*#XQdTclE3roO6eyB=S|{p$^6F+Knje0U*Hpy&({l!9xnQ-N zMEIoCk=&|TQgXx zop%Uizogi1)eOh=>8Izc&1~;L)!m32g6U`&R0@JX4cpV{z@RHN7=gH((-LyGAtuh1 zVaNlc-G+8|a|tv;sVj27C8szp6@T;ENr2WV3=@q$=WgMKDi%J~hL z;wiGpKFk{HZA;;Z>{O{BNXSmOo#*xIB*cyd3{(oLp!&NY**z8n$+*>%GRS5U$I;c$ zz*`j~+hkZK)X~|xU}3kWjh^d<9C%cB>`&%_SPh5au;1`zBiXZo$9-F%(V0_S*M9ol zYkm!a4tx(*R#u(*0BRPH2{dSnd$~Lsy*&=nyd-JtG}m4&It#v81C2V#ijJUB=XM@l zcrK`BFoiiHl=L*pc9J;Oq@#1@BVL+{N}gRezWr7VSH+915dV{?7&fF4SzerzcqA>0*dGvF~sFse{bCzvO=Z76P->xkU4?A3c z@3?n9sJY6((vd~a~4Eaz{NZ&(~2~bn; z;f=PxJ`zp_ya@|QLkp!)M{68Reu%=#KIj;ym&(o>H?nO_kx^I~EVD0^mC)x{pxfSo ztE8uo?>4fw{2%t-Gb*ZVYZq38#t0%JC{a+5BqCX&L?vfXBuh?`Gi7NLB&y^fAW=$k zPDP>QSmX>vh9W}&1r$(sbGku1@9BQK`~LX8G4A=}s3AM7z19rRoby?8H4+N%>t#N) zqN@0%PhfXCbk;lvQ|@L5q{gAe7d8`t$XJ1y&w}RtA+EAV)~zhhx&@T_iv%tkv=k5< zgttesY8em8>R#?i5b+mgj>Z6FL=CAnFtNk1*HARpg-dmGKFxTTgh z#|%_a@*FRzeL{P~fMg=?#XvH4(IXmY$!Cj>y2QtCM;1KQ0DkB5?Uhjr+*%V86O8$a z-HU?77p^nm4*^6<7b*{=KE*lq`62;}*_0#^kOG7O?Y+UvfS0@VOvk!%U6S$My;nW4 zJV#vNm(M#{*xFNpVvSD&u$^HB&<`0wl+z$C^N>x!%{aJOCgL>$qf?n9}{qHBmal_hXBh znJlo19u{$8dfE5D_KO`)c}{Z4sc4o3gc2vT^e8ksSsBap@s+i*3Q;>d)(A=+8)&}V$rY;Lc!JapE1%A>u{uwlCT9r0Q8w+o#_ z9kN&V-joA;&kr0W?|QuMHC(gQol5{!seV;&vuf7Rc2w(lCIwXW^*aN(j?#0$CLSO< z%I>JfPSp6e00Hm};BI){SQZBTGNegz#eZ8JsN&r{f{&Za!y23XKIuu{xYZ@zK0RW| z9`UY;#xn;M_8Ipo1p%j!4{&dfK)!fEiFlH!Qxw2X86sP?DjB7p9lxz$*wHHd7N0PJ zt!n4{`TH9rFAZ1IRWp>6qP=I~32Z=!zZtET1~_q_2EY*9Rej9;C}Lx#g&h3ssOmqD zzOMVs?sjw)gAfTzEdpoAyA~XYx;0`@+!{+|R9Cr;$C4G48fWb|hVclXRV3Q6RgcsarS; z;z94~dMbTnIQJDcr$R)bd!Ci!q6ZN2G7S<9%p4VHYfqYXB+@f>;Nd-3?Q+}U%t$@$RF|B^Y(Jm z^Y&DzzrbM2TX+vVqnCl0j!RwWaH#+eq`bNp-#hdgJNCLFn_DOD17Z2m-Yi#uximfM zj0iU@R$K8Tp&SMnGR!<9uik!0t=Dj$o61|OB#AVU8{PLDiwpWxviw!j!s(9o?R_AB z^-;UR1E!b79E|`<&Pi~e>~^XroodO;-wgH;p~O`A^z)Y>0G7F&Vli|?GqGh}>xwC| zbLz($FMct1&o~@yH)-kc7Jl-X@Pl1(;Em7Hn4_Ci}2plc^9C)%u$a6L3rtCsU38az)n4s`Q_jq z;r^|rGArt^4I>EukhyNyB;8euuS&5qlK^xC60=e1%Z|d=zgjN(*8mmB>)Okj8lQE5 zM0wux4S-k_)cZP?%fc9!ybz#(XnuHhj*eEF7GO@avnd~O@Udt!gWmZkST$Qgz_Qa6 z;!qF0Azl?65FJv_FmMn^(b10XD+&nI+z5T?+GwdVe1i=06m8vA&!}g&G252kb$yd^ z=tCFzfAkl}K14(bNHs7*Xy#5AZ$zHp0%@c>2Rq$Oz`pe-b2sQxRi#~%cgN)wTGmIz z^4*46a?+iJm(}^wXYNVGdP?;*HMb=^0(N23s2*7@rlXmM;6W9j}*;A3lAfntF^zc zG8toQTikT)nInx03-K!L@` z;ItHkS%SSW+f9Q7bB)vYKc&jeG<(Tyqn7z!_9zIq#K%#IBt0RERaaH9SPW!Zj%6IN;|FSYrSv#ly5$)q3)Y;>eJ4E zuiamp`#{&F-)9N*KR9=@J1M%b2yeu6yvn|b`QCe1_w7b|pw-fncEu;cyg%>kd36dH zSMAOf1D9j@K61lXb->=BL#@8mI5tmUmf9@Pj_!}!y|ya%U+e-c2zIyoO{Pt^soc3> zKPfx`p8Sm)&6rs3o5Ebukr9Y?@_Wc)#B=(=1)IHH(x&E?0I{2CfH6A#s-J<`br4`k z{IP;Be>rtc*m*Fnt@hbRA47*6=M|!P(M&)Wn<~z%QJK9GcX8>|FbnC#^FQ@q`1!+5VCV67i8PVWbfis>X&L`{&$2&% z%+=RGw0Bmo^Z%xuUE(y5T2rxGW#u?6V}B&b|E_$;*PRyuHqoESHT}P7dZ=i3WLnG6 z5z(iS-=E3L|CmYpRei9e+_#9Xaumc*U0!-a{lgo9L>?$^LOw&BL0_NgY@9V$bA;0kD-A> zTT%tGQiFd!gZF^LS%$8sSJY|#WCUn&Wcua99%h);7jds1u+#QW)1Dr=q6c2pAhcqK zApXN?Q}{nWs`RK8=l5?vnPD25hu9EOy`N|Ke_0_vF>oz!9EZwjRX!Hlzx<$TIiMXU z&$U0>dHlZ$)ua-jAug4RtvCPn>wi4^|3?F%8O-vz_-Bq8*aUghN-=+#AzsEH4lW$O zDro;7_htU}dEkztj<=6w+)fw9|81&(uDBkxZPL zMkxKh`mVO_hfvqSyQY$0g;de#z-oob%criG6i-adeIRdqYlL(CLVHlbpUM`F)z3{1 zXz1~Pd>Uowl!4-DiN8vYL!O`i5}=(cS6B`XkSPWR8GMU}vUAh={M4-G^gTy50N4%+ z_`(KHgRoP733CAh4X*CY)haQ5dj7c<&J}fGMW~P|s+$-8$5er@F~2|B!3jH*Y|qh_ zk!H9XKH&NbN8YD~f|*dO;WvEY_J8(a;8Ie+Zmm$CJ#*?Rzbjy3*M{j)KCu+Xw*hzf zGE^-uGf7H*aP=tJFP&W`yLqMNls3^g;R5{>TVfY^YTI9vUHB7^50J6*fY+rBAVld; zSw4{_q5<1+o=)nEe|qo#FdLm$p9I!Rl+pkDU0C>-XZ17nKId~-g@nOR%R%`plt89j zVnBlElAqr@!5e{$^*nW7*p<%BlM}1Rwqok%$?HDeivSMQ75#vRhsW5(&%$zP>HGFW z{sYhWva!+VLHG2f_N9^NU7-Yc6BHdc7l#r+OfgWIz*qPG>WN*6UAVYbOw0acz*3(a zTJzU`R7agZKNNVOBJ`h~Po^64I#DiFn`r9qoR9OPGd~&e*~hW$`p(M#WawwW(!^H_ zGYXjv1pfN>o<2*=ke0@jgMLZ=FQ3!+(`yvXaNcl-J4poko_^*}mx#Rn<3H)i0_#@) z>*&+Jy3jvAi%CwTBdsgjZ~ez){x9c7{3ITM?_MXiMdk7{{`9|p^;sgR7tRl<4w0}^ z{j+srC%RgAlh}#j?w?K2&)<9M$cHbSfY3-+(AJCn;U#}I6%Xivbu;|FlJb|A>ZjL) z)69YjctSujU%=g-;XxJd7^Zif zODFkvI4h~EH`*{8a`-e3d!wm8hSiG4M4UR&trlLjND25o~+A13FV?%P#-+)VbD)g(3~*?Oo)V zr;xRt@|$Y2c1KZ5#azz+eiXQY?;&rSsW4^Z*%3`685fDIo$Q2!J7_$M)o?0w+w zCP!%7sT1h`#@iDEf!OvY+1FEm_HO`v`bZ$cnl2wRmicGaMiPkcE(iAhjQ{`Yqe5kX zD8o+Mrr?wu{MCDbH{PQIVw_*<&Hpm^KJDtjO?QE?x-7e7@Mj_Zt1}-41c!|047vX5 z^*;$f_4Ku?h0!nihb{lvsx<@IkT7sw%nwET8^h4E1GHB*d(o=+pRJk^kP&FE);tvm z{f%KfC`{1D_ zF73bN(k|c6oo7P_f5~3x&a=?c5ZF?HZ$F#EKYng??UA?8?C-Yx>lPDCbX9YW-#!^q zY}1iuXqcYZc7EUy?(a`b{D=o6<98Rxw5Y*A*MzP8`(8Rg?=8<_QV`3t{FEIopk6Rk zV5vKC>39f#!@`Rk1CjBY-A%FEQ494xwVa-+6|gdi;|Nm>b}^ zHovbqF5%fdq4za(^EHw*SKWp8^b<{-%CvgX73Dy4V z5$u$Kp??pZk@*6Ea%wF}uJAT#4cpNtWVp`0*4EDc5{=@ z1m?GwR)yJ<_#23aMno_FBH+CHn00TX+9x6m##2Y$+kHthTL?5YkMHa@%6%`lIyGG_ z*D`xW@aywp%O?mK{8t-fxYlkhyYjEAHP2hh>c@nmr36rlwe||)0x$uC;aP3+r`eX> zo$8v;xl?o7yJtc|&+(uL?y+E4f(Pc-{CqNIFvFt9qkLeCXTI2dpjXZiR{^>m_i6Q# zeO>K#gdYWtZmj6Ig7DQmwtV-5;lygH+;R-Nrv=Hz3)5>s+T(15c90L1J;5E?%;q~;ADYq(m9 z%$ndoi<8WnYouK}RU*X#qrOq5D|_=iL&xY zWqNs}1V8%TfRyibP`<&==KSKBOUFZBYXVOteX|(u?{oIN$M_1&PRwiYv^D@i!ET>3 zaYeuVyI*7_*QB?NUnyq6FZRAnFPX|+iJ%h=uXZ8%GKk(W<(>KdMR+|+Nzh2W$!z-a zqdwl_UH~0(qZ1}*7HzG5iD4_ew0rAZRdq!q=S~{X!v%yL) z%pEOmoB7?b{M5BFPqDo&PRIJ~1i3cv)fuL#>tZ~0lzSRwjK5fCSFDt4mOGf`#VPPmw*I!-^%F>S$BAbM}EpZPFBNFfZL?E~!*cpGNhWE8ycV z(i^~Ov!~TLNYC(}V6Pb~f)f;F?6s}u1Z(bp^s^8mUGI?d$^ST zv5%1cN`7;+9B79^vPD0xz8leB;E-9#p;oqQP&j(HH9r<}NR#*ipy9=d-Emga_H=2oHScn)f~T`@pk$(y9w z4ocHyN1{yTFQQ=rXn@2>_}I!P;fe~Me2p1&6Y9B_yZ$Z`Bu-JrIT;lx)yki^(O~`S zi8$hcJwpOrmVLVen9@Sxo(T0>2wk@wCLwC63JZ>f+%Z475SK|gkx4C;Z)rveWDe1> z-`rK=!m%N4zWr(F(jiw`96F@a2|m;5gi7r^RNR|d6W^_QC86`=?T;!=E(WKdJ%%a> zpYt+Cq<5>A9bJ^ltbc>Bc&6&c<5*gsqm@1im8yBK1I0IAQY(QgWiJ}(eRbS?wcOwt zWZ6jKDCDRe(r zbTBXV=M4K{afyOD7%A(k&lbHF&|e(cmqa2NPmWGn7%^2D^W zWDVnL;6n5zsc}DkYFb~XTRLk#@u?OEDxGdEk;z*cy2068AuA(;w~qDnSSEgZ<(xyFJ;Lxv$%rrB)ZZL5bABMwHPiS74WtAOdJ~v=FD#SGn8OnXb51X22-dhKMScnYc5 z51AmjlM9~|?T!AXGXR~<5XGzM4Uw?aA@2-_aB$1Z_3EL6G+i9T37+*|UL#GVYkz`H z)S}DYeSs%8rg#Ep=+i|;!@dY_Z*{(h^!HFz-hn_MKFb~JOVCa)1Yz<@qlVP7j?@)b zEXAzZBTRDV&PIrMLvp{A1;nn~so$A)sJks+@+@{Yl0r$(lnDjxqo7&ahHWf@5m7IX`@WYB^u z;ok186*>2zqtB0T2RtI9V!?b*{42Q{!23e#ku^eU8ZADim@OXn@9dux#zqQ2Em)6x z{ta26Z{*335HATo&%9C?y)EM&vC@x4m_nz>J%jmw6`MbC|EE(ZXK~y$fdmfWTZPT; z8AX}wm))>s_qDvv9)SY*!Z#f5x>s$l-f(%!zxSH<48R;gvk#FY(%#l?zGiM3rHo#y zP(e5cw&n@J@bwUcy&l&04EQNs$EUG{Pt>>ecl&9dbFWMms+=)OsG%be_?+7+>|!a( z*gY#bJ@a1W63WyjNYmC?+^gdu8+knC;lADYtiOT;3-6uDRG8NJt5>l1wom*u86&s= zLC)@|j!d4xz`kNxClAS`ZB}8$chzJnk@*h79&)u7*rZqRewf0cr*S!<$7H)-PzEIF zhfwJi;z45Oq-vhRh_9r-AmehUl=D=Wtw=31{H*T3kF;Jj(McA*GEFR>2m*|rg)y6E zp-Q9ia)CF~!_+g99F@wKhX4n8aE=FB!&&!Qj>_PXi1%*rK;seYarkMjlxqbj!hSk~p5J$Q@irVCk0lK}!E*bnABVQml z4~0FQvbBh;V0+RE^QjhAdxrCh&o53Cj&3Ii%4{v2bN?>5#Q>u-H(urmgSzicKj;WU z9kK&3tHKnv3UY&t6bi2;YqRkPO>-%*n>)j_W2(aIr&2>?Vw>D^}IL zs69)2eE`3k{0Y7(B{@I-fI0E;LWrbZx{S?f3m2lBBIf`r-;RCJlm^n;o!9pK&Q!My z_}I>Ee~voG zn`fV$3;vFG&xoiYj)dLwa1Bk}A~;J;_93zx#4wqG>56U1@pqX|^9wHi9I^o3blQ}% zVWgPC%aIOu|K*Usw}UYAL{O>|aoD_6koPH<8F5if+Ls2eheWMj$k})J{JgzN>U#gm zPOBR69Cg_D;gDs`Ir8JrIs+ah`4SJ~_0}2-XBwy!gru)>E!8+W7fKEbB0`E|*@Cux zm601SzI%{r5zH0t?-+J&ga#z7hQb7>MO!8k_YB)tpOte9#WIa} zaCv)GUDy6fP4<1P{KWlTrOD;TA-5S4*jX9ncSf$v2RmxmjJUq#IzbS`lGTRU#Iwr5 z%i?yLMnH?7VSIM?Z-<_uOs-KB4w!Dg+K&*o7S$CAtSCe z@}Cn$9b+l)-rK0e_y)RBH#pim!T~#77$55Vrd|sjOeE3jE{G@{YP9cdxu*;D zHWS(nnt>(YNXd-xRbJ#;9;Wr$qt5s)x1m{(gasJ%#}RSmB)N*VG9l2uMl*}MX zttw1I-r=ODL5l{0Y?<)zWr--aXMMu=N4qY&rGgC#b4_#P@-3e~3*-PX7+e7H1l4!q z4S)Kf2fx^}GT6;GEPlQ5arhXCzTHeDg(Py+|90%y;szRMbC7KS`8Mr3-JyW(kR`yM z8CP88n~~;$iiz=AhN9sClCOdM!9awLj$PXvE!F<++N@*aB|7;s8iUmupAv)%a&&;g zwriJ&A;p)T`U!W52ZOgsJjKv_g6o4xVFa~pJwI)*FoRkNQcK^}6u&dz1QI>Lk-E=1 zx(pbLm2${tvG%j!kD}bd*c`tCtmzz-&{L_l7a9Ku%K3usc#3HrSb~SnDTMgExI0^l z2!{A%)QrI_T82z34i-DzP^8Hy6F8fT=1gQ&LU<%;hGX0Oc4vzauL=x%fsWidbEnM*BLE6d;*>UR*w*qgalLFe2Z zRz6?gyYfSq^w0MYBm zEO7H#c2|fh*zQ9CpdQbx(i>~Q{OJ7fbqSAaWLO-9QS$W~Q1HO!e#e|$$5SFU`EZLH z6r7u$_4e?E7(cp5aSB_v+pkaoHsYD?ZfiFki_>#wNNK5HtdrrOYwV7*7 z_?!X@6yAo_b~{+fgrd`tIy-GdZ3pp`nHGTqtMlKXh!qM%)rlI0N+p`_33a~O;7^(e zbCzhUe0cX3{`maLf`71Y4)Q{J;i#vp_}oBhm3^tnBKlCn5;}SADBczP{CP+W?hjd5 zIBT41s6s%>6}QnIpNcB;P2P%NlUU5Dx;9GgyXHGU>AU`8K}4Q{V{USFIy@13ek&O{ z?qfPoB6RCUpOoiw^Ym1F9LX}rbUk^@!nUb)=Z)d6u07Q~k3z0up+eSTRt5CBC~vX{ z9!31I+$F{V^)9}fi})mskHZW~QwI1nyqZX?{IgUWXMx^8key~WKHMH*@vs_hxi*es zI2*h`b1;n;vGk$lk!vRqBO!3gL|fpnh_U=Gu0mH9Uf#)8M9=`*@AFoIDHPHLyFhI# zSv!#~G2-c18>AazI>@`j5{V#M?-dSmY4fGMLB;0+5TFh+8svnB|D%z87>3omu&+(GKC3W40>` zo>CPB;0o;=vUHWURSolRdwULf9kj)#y3Kkif$VMzsBp|B-X>)54Ni+gHJQ5gG9(>< z6H>}_ZY`rFeGKW3S7;;XNciPQL+$ArXQQwcHi&uB=4C&wz+#gsqZzBSsW)~luj z)3~^uVl>p`3GeOgBN?W$31UST*3R;m)JGIrdcM*s$1V@U*?xHM=q<+I;w0z zW;H^L8_HZ&m}1UWC;gz#YwGq(6$*>IhjObAI*)>s3;ow?#CJL16=;C~{n$xck83nQ z1$yW?t=DF>pOhD0p{>Hx!S6?2@JpnmYARD>D0Bvd5n2f+3Q+Nmja7Dx<vGH?s=AJ9#obFdrsdsL$WM3nrGP*lJqHu);!F$jB4XN%q$8#7GD7 zfFY(HgTBeOO_=2JGI3>(_eh6y;f3PSErejN#Um=H(AEmo%aA-ooS4XP_M!OmLuVlV zNJ(#&JII5PsBOuK-FiWAyO(-*0SMkusJ!Jpg@$4ato4gl&nLt^?~a91PaGGLuG+Av zl3u?_%8h1`3n1^dzcMxV&1Ye6AL+!$2zhp08SiS5jMR}6`qfZf8UW$p@%D>6Jn2BURD4cE74}aHVuIyqu zi|lrb5XdR+UCvusxRSTsKyJ{TQ~bq=}flVyWiL4a@p{M!?_j z7Sh933LMX)D^t-F9#&7N*e zKvE#Jux^*iWExjD{?ztKS&ZDjv{{UyEMEre>4v5zM4)#5l~$1Ea;*eV#M~giUKpi6 zs-47YL+Hqce(?ZHS-&gYpr(5?^b7SOk%@Ta5+UuaW`RQ99U^+&5WsXPPRFVTAK zApN+Qf8o}&Rj4&$G)3(N&^AN8J;&(=PU!6K@gU9nTISB^cr>8Cg2LBKPN*VZIKhzF z&v;KaN-KuBrO**vokdpHyQfIbgv~|HMbDA5b0$pis#jk>mF&aCH8<`_dEFGJxmL`l z#8YC88(cbdb@bEdhquhj@FFS9La?b!!YA@a$@VfD4%Q2S!G#W1%l<3v4hdtOl%vaL zPZK^|oL5axR3N~p_L4-z%*K3)R;Lt9K)P!~%2gt99y+4T>F|v<_CA<8+M65ZIJYl8 z;~vZBQ}^83)pYJ%(STKAmqV5}(cAH5!L^B$Z;x$6qQOzsWxGptrTQ0$akucxP!rox z$9}bymp<(IFTxq{P5oH`gB@d%Vq^@5P?Vbu=6`1RHB{pz!{gYb2nC#Q=2zG&M8bQK zo4yIz;0Dd%tLqzRNs6+U<6gxPq){Nf+TlaS1N3)Nx|O}ByI!s>L+P|t>l#EhJ1%ah z_OWy5qVSWU6pCocAh+bYWpb$B70Go=Q>Qvw{0we`McU%t8Z`5Ph~;wj#0!OYLQUnu zt%g?RW(xUz*KVXv#F?_}_4P=ND$PlVL0+mj?=UAp9tnQ_aw2C}@7-49fYNWfuI@)+ z)A*D)jL<9O!~IURz)??0GoP*UtXwTD-IG|KYor(%l{ZjL^Z8#B8%|a0Rr#81tK`YK zg1CAG(=XNiIEdZI){v8G9$i zKY4qg&5@LQ9&GQ-WALT+GzyTyiSMrEH=&xtT{k@11yHTa-7hK@ng-B3k7FzC02r6| zP_2Toc&QhWS=t6fU50G0`qhXuu98@+~IliCaaED%@hi?j5;D)h=Ns3w`bd^wqmz0;|hz4V~j zyE!ea?j-2wCj_&idbH;^f3+0i-;q7ar^cbBIAtj-bEw2fkAh?rfnVu3B9p%)n|P5jwE7`6o6FRFx1zBotq#Vt$}&xIgnAbnH~>tAhD` z4P%hW{!@5Y-emFh(lX8=YZyzpRu?rXbDkHg_6m0b2hhIITWU4S3s+NDOm z#hNK`Qu7m~ zHzIDCqI3^9!H40`V$#~@3#NwD6gGE9VW5PdsU0aSlVBMHFw$R#Hm#vGPoe!7pq4jq zVFYww!!&sL;jdFVH*F7fFAQG(Uf2>#N?)6v}1kJW0e+(Aa|73WATe>Ndeo;5-bye03tVo#+&r2*gR;`JrZZ=xE!i}_Ju z3zgDq-{qK^U!~@relOQTH$0gEa^+rmgaMb%jrbbWA%uy^L3yq(ye*rxN4M3M*Y`m= z0aAxMO{G)b=sGbN)k8qW>vK<4J}_5(@JHLG=GqLyWRVvinej_ zvIoA9t9EN;LbYD68NCcwEUgSESzRzz`e@QU!OxU@f7Rd|b))+4_N@BOHJ~Ed6{_u`T1#XE zfrpJ5ju%}~p_2!>BZc^uR;aQIgMMJpx93wto?@VgkhaLGVuqLbTlm!e?P_Skd=*3+ zR{>h#ab$o&y%cqT8R(T-Vi`}*q747h5649 zT$WPQJs!*s=>Udsw&A<*phfjNhhm4i0$s2BD;~&m>jS>(wX?$|1OuQX>!qPClCNx9 z*0f<%30eJIwf!Q{S$f+b;NU>~{4wj_TTD7BDT21ZaOS=&~ke ziP$r^w_->p;R^AR)T(O)#JtDJ18KE#L9_##X6O#haYOK_kwQN zwzjlv<$4w3nw!(LABfa`kii$Kv2UUCT0qJUFSm5F4hRkbN=QA`bH@ zK&-F!stAfcD?~j#&hh4oRclWYTtfVEb)NEiG*nNjF|FtR!B=S50tZpwR)Pr@auofS zD5yxpE?=*@N=6Ls+f4en>Lrk5G<7Cj0oxZX#!a`YzIwLZSmgp3z^fXEw&lObNLwxy zneS2(2_J;$FngTPQpps@O|Z}0?6uwAIcKx*x+A)Vee<~yH8cM2@hNo6ovWPP>D3~7 zPF(u=z!Z@NVwhhR!c8Hw!Zc@Kf6G}Clgx8@ajjR5BYC}0IPm5wR!tULt=;*mK0&g# zr>y3YWS;#P+iF5cXh>v8Y>04NL_@;dhq=(X@VWF8R3obcjxp=C9Y+9LbUO|`+yz`F z4A-FEO+vq zdV~GBp2y%v{0@Q{p}Hm&uN};8{%}2#vWcD+g`<1nK>lOp zcIT_+ilm7YXYsAp&*@DTXg+##ICd_|ZY4eGV2oOPku_2hb58i(JXK<*lbT!)tCz$h zgtwA&k3|xs*lR##;W_N#^X>sHn_XoGL2P3#y5!t(RIb zQ_+%a81%YL@sPNqD2qQrx9}nNXz^Ww{o#Y8a_c$&P}JB1{&?tS*+6ln$5!m;I17c% zXmtHx-nbQiWF%-71+R<2A~8!t@nj+P$Ht#NUj)g&@lL?dp1fFu{fY93?Y0g-)6gbi z5(jpS!d?n6;ZVKX>Q~ z5#4;}$FRx-TCotOX2-r39Z&OM1FBxX*OAgvN$nL9bjLpHo7dt|2b2m!arYw;{+bxo z-6~fZE3w)<6RFCzD@1bL&1mSv*SGj%Evr^P$X?)y3)8vMEri0?ScUf%zwqxbneuY^ z>a~;Gou~ITS_pCXgm)E9AWaX{*l|&7+hA3=VBytSK0a?(9* zS%O_*jFg%hB3Dk$QLWXzJ5F=m8NLMmur$VKcgCW5LXMv@#Yx?*L-ZuSOr`{2exjMU zDEtcGK*AD*Opr^85z1$Icq0<%&t3{&eRr4)@{TF`8XxExYhsRcI4nYQb32U#lt117)6i0}GB)-$NK-WHUc}q!9c-V;_v}1$&=QQ~W?J8qq9@^|L)1G;aAhtd`JRNG;`k1^WuXRw-F-gsZihbIZI$z~+%mc$%rbRlAKS zD{pye38cY?zmz=QX8Ogdc?&s;0E#w}@`*-cydEM-L-e=W=m`nP=|gHRi`p#t;IgSIhA;J*i#QHw|V=6f*C2d8R2k5 zpSz6L8ONcK?+-n_nD{(JCiHuD@vj`JZ;Ukzsvy$SNt>pdxem9l;~^ z$wm$ttD@lF%zjiO4xeV|>Nx`5s;l`;`co6dw*Hft`0rzX zkcYP+*!)4}((U0FMaG5CtsrkgSH(8$hO}ty>S8ewsWatWXys(CU~RsY3>eA!$C7Xa zhla@hObJk^cvkAmgs`928tO*9ZMh#*x(NBantW1FJ_BYadNL7N%zuCJ8N_6n8Yr}L zsFk~#^t1};Mf!G^Ik`e!pk_=ly^+Zl+HUS2f6R;CuXqb+d7IuIC*4H)Bx~zE{MXmA zn5?=_{0~4n!nN|hCM0uliJ~yN45|z8QHNm)vux+oz8ocC_r92_gsnZ*+r%x-W)m3a z>A1NO3!PiyQ4A3*U=<$US*jr-OjlI&lG%$dqBglCZM0iZJGJmd*18dl)OLiqCFGvQ!fq!_T)@Hb zGhB%+i1)ymHm#ir1{cvPujmqdUJk09UP!!+SCI;q3A|tkfYxV!AOn zJU|USk5pXEORJkEi$Aq(cxBJ};=qd-$UsVouv!E)`xk}l%JxpOzBGzDiTvJ1*~`z0y-bXO;BD4a;2f>(#VwsSh2Fh-rwHW+quYW)XIFAR5KuD|YV+bv3r zp3;g)`x8+w7ZG1n*8l~((QG!Ndm58uFRXYT2gqHbyo?i=rKo&IG=f z`_kI|qrycw_;@*1Ujvn$8&!nGy0-3Pb0xy@q6i*I78!I(Z2ygtz{9y#D4ht+8E{DVutBTzEX;l>MIixueLnW=p!?K4LnMBSeJ>AnDAz4}B(0 zuBtctta~a^;eOyybojxS>CA%khC^yOtRlO}S2KB=dZy0pgKnt7DmtaaX3c-V zMa7Ld`ozjUxC3ska;NCJ?f}6B-<5HixbQ`qtdt!9ANsgQWKPF(m4$clMeUv#Dil%V zmdy=`RvUMtl0kh_aK_4TXz}eNrh^GqSQfOjuq3UdG#y`-C-tbPF!Ib2wwJTJ79LD_cCrAGy;(gwM zP$)QBCcS}OgX)HY*Fv-=>Oi$io0(COr-XYOGd{+Sc0>{$P9>`Gs7oE_i0w4^U9->l z6v4DLZS-1w^uZHU*ck=6Hm*dKmRv7gMgkNT+AW16hBWm-F$VLtv=7_sFZ z^{qYZEe{_{Xk@(^kuU7dWYl%s=daeP-MP7?D)->D1VVQw8L%dsIQM7#S}#ihE-!PmT@z;U$FuoFtl(*^W?89}`f;*13#f!$8WZB# z_Ci;FF{9%3P#$SGg(nVil6S}~u`0WQowz_9%SW-PU4yFv@WM;az*;cU4`08AS;!zr zln|=ci;Y?EZ!tjdx;~%dv>c_D@qJatSCV4wO(BKuj*j3(5US}0UukHh!Q#q&Tx<0a z%JrAeH-<-iwRY*zFu?CRYm?Z{R&>WA6qu+yr-f0&GpL&E-H9P(R^7KiMYqw$wf{Hi z0XN@h{5IL|anE48>TL)r!=27+ciE4@OV9=JVd=xUCg;O1xl0Kvy*fL?M3+Kt?OZM^ zZ>u~vxgGyq}i zra$882t8(>VLg>+>*Cdc^4pW!%q@g35pziYhc13Zk2djR`y6P@x zIANc?IEQYoKKY!+SsYy4B?VhwB!W5GBCU=oZsE7z*VN4&NI;q&HXev(>)DTz(y5Q} zY)`e{PN)P9b)dLU_2s)90U>mYnl^id;scp&$Xtc3l>)kk)ySsm>TP*i?zC%9TurR zooyiE8+q}R6+!B`{FbNz`f&2DO^|8Sb2o>wnDIrS8$f^~G2*O^6cT%;^(js#x-ws@ ztgni75}$DZwPQ8oruoC)=)o_k%E^HmWwP8`?A;Hi+Xv{zZ|xA`9P~W1T9$gw5zswa&3Rx9KW2s*5 zWBgvInS8NIs6$?v&I#e2PkCaad~-qPEm|vH^e*44p7@CUtLEBb;#SW$=E9qCY~Fu8JXZ1A^+@UO!!BF2ZO9lcr(aYz97&0d9D2vg)C*k|0Wo?=4}+!LOlEkYtz4NoP?1n(+x8R~OZ zj$cu7ZrxRKuQuzn>uoR`R*PK9=;l`t2K#i6k;|E29UWL;>_e+n0?$DQS@UCSsxTd| zW4_IK)%@xh=Ds>&YTcXoFY;|#UDgY4Unv5Tw@U{Vj1Hj@0B1Q58PS%9EN0Ey-OkF} z&Awh~woKJ!TVJknpySx-F&P%+^t~s_$=qI+FVl8FtQiH`EBHDY%_c-D1wwaRFTA;Z zThi0FNcaWyBB9QbK0PF4-D_`(yESf!1$*_*rrV-}Zx4rzgkXu1AO5bDAYAIgvtPqCf6JSv4J0zl8>!v( zjhea=bqrSHmcK~wsLl2Ec_ehOW^!lqtIG*RW}7i2PN#Wr#zgS(}tGs78&)g@y4M9Y3A zL^q$CS@Fu1{@e2?bQ6yZMq>Bvb=GskasAc%>i}9`R6%P+_Md!4Ovy_X8zN3sPCeBU z)m>9?V`sY3!`s!=8kvXjSCwU*eb=q|dwG+iwYfqBXqG{=f#bH$8X+bDcelHYDh)IB z{PpX%$3=lTPn)wQUY77ySc_ffL7kS1rq0QUaNWn2^pD=+PG-|-_aU8l|LId$;(yO0 zj!!QAsAJNq=U}R%5G+#4;N;Aqu2zkn(R~Hp{3~yu@!k9ok!pYu1oT| zS9l>p5?Q+=wk2VX&NS-J1D9=oB)zWfdu8Z(H3@DP5al|3o?lcAbswQ3xrHeKUzB-v zX4TMgd5=-zyu7kL{x2Dd=K&HK6C71<(RmW6Q(SokmTI3poq5o?NQ0HoWvSPzAC*}a zjW4YPKPL)HUNi3ES4()#dhHLj*wt?RrenE`w=KFjZ{1_P*z`2x5xu%RUyP&%#Q+C0 zlrm4nT1YN?T3GYJ8ZQCa!FH_7FLO(yO|;RiQ&+h_#}aktcd2$;=pPr`j4v3JhMu=g z8rBob4slaMhp4TN#)toE!1}S(ybim2e-)|@?BuD8yMNlfKLLsBXsJ$O>Gi#h@l&5~ z*n*JTSF#wb&tRNWt&z~wum%2nth?HonZZv^R7}%Xx?5Pl*UEb*h3adcX zn~WG}3+ShvCBE8>#wHTXi}Y|-#5d}n`>eEe>_2s`jgzCg*@$Y1?0UGCBsb8kIgkYR zPOm2n<9-!rs=0n@cCk3tA-@(3J-@L-vT9~_m;g`Z@~jhK$chxCXzii@LCWN$r6)Un z;Jp3Vp>fw!rD!4I8ZJ`YUw*W!sM#}I|JwbwTSvU{DdU}3%Mrr1Y;lG(PPI&Y{xQfcN{3jCvu7ZH|WktW|)JivoGmgA*QCx>! zALI(3C4nb?k-+Wp&jv8%ZpVA?9z#<)6i{-S3ye*5o&sm855`A5om>NfPx`h06?h*; zq4qt?-<+{s&Sb|uZ}GD7!&rSukdFF9(#>ECk+a+ClVXV1Aa?z1d@Rtqo?CqNY^ih{ zL8)GDSch90+;(9!?uLRuk^Z9-6zX0%B8~hVv-#vy{#`TnJ516y2gDNpr4MSqi8wi{HrQAv625*{_7tzcA|ApJ=iDr(r`7F+;FjD(5iCQXwo>puy(SyLFA+-dI7WNS zAnK?iWYE)}vBVpyqlQds(L z%7ksk3>9U&)PLR{ybO|hP-La?PC{d$Ezs2w_-{bg2X=fvxZYqO$?LBY7y6s@+w`$p zPZo(x&kHNZTRy#QlPx`&2?0oY|NChd)5SY>=T~w1yuU{@3v-ZqI3{zv4t(KnnwJSLFlS+vUmXrAC@^{O>++6f9&=XRB)= z%!3VaUfC{-l4c8Zhc=}1+juK8VswNu8fhwzEwWNq3B%g(jS(&@+GMKqvkodPvpU^} znWA*Y5RqscIv{PMh!kjshqn;vvK!e2h6S_NYPy?d-QV0#aei=h8|+a2vudDTtP!@_ zTp2E-+0BG6-Z{q*_48!Hu_hs;8E^dezotUMY(9}2=W`N>x?h01CG7ab4=5{s$9FZ; zg2b2P`{h0NspJkMHUI7E?+0`gsH?o5H|qn>Kbp+tBs*LtL<-G%YI_SR`AK(_yTnAJFBhp-1-7W{n{V`axSO#qUF?7_3|a$!P6hJ-2fngi5)BeXUPuD#`>TeDqMSE|bt8`kM5%@rwY0C7$PEcZO5l!7WoHBQ9$$>vOzrVFSC za}Ytv)ir|G|5;Ur$Vx8~=q$clzlsy;`BRcJ8KIyC2HJafTmc9J+`XlydA2Huo6ooq zBu`a3BMe_H`X-Ex{wk_IHg!nt*RxpdnBHKPr8F7^V~ z|3a7e-UVtReD*QjUzI=f zbN#MID>8A3%<4x@4RPm$EPM@4PA`5SeC#wHhWzjC!4GTE5I?w1T{km$j=KVJ&7cT8 zBr!rIsR#+I!Ixj5wtx7*_jzST(|~?RqAFQz|-W^Fs;#7U8A{IP5#Zs=Ix#vyk1rU0IvmUqx zsUt~D>C_H0y+-Tp$>*QOziza||6d2d$o+t%H7xwA_BjQ0WtRUwRXIqL!bdfwi$bo? zJThUIWc=+m#JqBKw@c2IG5Uqo=<%*4oOWZ24ur*&54c`<5q{vgK~cB3Z`KcV+7eO- zKTaQ2yI#28@wh&n8`thn!#bc6iuro`CD+G3l&BPTv4^{k{FD?t(Nn7k^iA^iD?CsN zeY<_GntokD?PER+`_ie(B+^QT{IgXxD>H_f9Nr3*`TkFY`@JosUjR_58?vPuoKm~Hm_xZvj>Q8_Vm>za{dM+cvD6Ij>X)#L28o?DIOsR^#!?{ z=J}8*&w2g2O8gIR#>>5J?(@%eIF8nD=z|`YmX?@woj5<#sC%U432jB8@ik~PX##4P zNxGVgRTPJrpt^@qkCIHPFw>*sM~ogNTEG5^LNx{CRcF3}>v{8UY!W5aRknH^@|b?x z(qtuoEICzYz~X;Cr~_@hut8GPg_u-Oz65X;H&y<+YkUlq;CPcNkM<|@{=Y4Ye)lFP zir;=D&O28Q=qDYh^Wd$IeT0f=f@P|LLTAiI@Pp6ak0u6geiS!cg=j_;{JY_H*?*=$k9e2yle8$xQg6qLO6J2CDMGX8^G zMe|2Zv^Z+7an!1cl;;C5Ux=Sd6Fsqe1wqW?_rDsICVt^wX8d#{FWp^k zz4L-(e1iz05RorLu=qaB-=fsAd3|fQHv>IUsPOft$HV^4zk3IX2`>zSR;Eh)YP;?! z?Dg{*zq6K$wTVy|R;6(+wXU1H9Y~gV$JlBoRmnKa#_>O1AOSMU$7y8%_-br%Qb5PWV7v<|zON zW{^Qic!sg{`(Z_$s_8=%cJ=bP8>8G&9{1q4##u@jp5Q+YIzgYg@OKd&4`nGKEK0z+ zd=8CxOQmL)1<4))xDr%B&@%$KO`Xj3!6obGT*i_!E0RT3wZVsrMNjGv zipp>(FgDVxy&<2^eZZc>3r`RI14yJvbMSa>1lEQ2qpS^f^}8MXkF?H=FN3(TXyUOy zWhv8xVm-5Q0*+9N1vOt9X;`Zyf|~8G@N*q$UBXP2Cj{N0gyh%8=?>JC|sT9 z$r8idR3%z07yt6v1aXU_`oFCQheSL|sB$i$V8A;nQgsV^thQjLdW=*9m+**QDl$S0 z?BAH@Gy1pUtF~ElcQM{OmxTxjgzw^M?;o|Nzm&814noTC@>D)$jMf)0)+(HRyh`}7 z49BEOqLX56xFNk9(}S!0wMV3TeKTtfwz z3oI7xIBy|V3fV)5ajim;=s)^7=U=8jR_!xP&ku+OQCbD3D- zEi7=nzDDV1M>aGq^%N)X3;%^({~zG+l)-2{i0(*Fw-Zp!#C@Ehhe|ptvo^J0B}F%Zhgw>5=S;w zZv`1cFFzAm_g9^YR|;naPg)8bXA^DdF|M=!fqY=sj0P6pX-TqO;LqlBi~PDWo{(s~ zrH6^m;%$JdeCY0pRBWgeXrdWQLfw-2f?OTE*e9t?g2u z7vM(M9^s^Dd*>{)VAKPKd`U0Sp#O`0)L{4hJFdy2SF_Idb@EUYV4)AFJX~hMYvWO( z!Pg%SV%Y;d&eg>H36-`bI3$(Gf{vU-9-tbL+%r(^X{jP2{3j^@dEj5$GwD{{UQgs< zdU@WcdU>(Ae*bpDQa<<$DRh^pfa3AL@5~EjDxrhaQ>iZtx8r)RUHN$A?5y!|&PHPl zJ#3$GTC2DvzR!dF8ZG$6E0D?n1U~QiE_PyrqRLQPZfDpmO1B9f($=OUP+ywaC@C;~ z(BwntIIBm+9LJ&oFl@mel{Sp54n^HK6|YxgcRq- zX1yWSY7=`Mo5=*bm5eA^{azwL!T#c9*ytqt9el^+>*uY%5QoAM$v;A9l`Ic2aQS?X zXw561@4bw@2OhzZN8U>ukrVt`*ng0tH!GxB!l`jW%t!qe8|DkJOaE62iAH)0CVaCg zyrH(f7?sffowrCMM#al(u-zFs!V9@zD6vL9PN$BF&H49Igny^P3?yy=hB-G4awi5` z;gB9z|4w1>!L62;UW^`#-P;>65H9+``#Z97P|@e!hM|N#&E(#?ziyCS{{uQ-DZ$vh zb*qJjuzt>4*$OZ(ZCi;&9Pvmk=w{tWRv!PeQ;J@P@POoyyibuL9?zH&f@*-Xd1%Sb zp7;L8nb{KDlovdYTa(#ui~CcwQlLu%#&DJ(q@{dTqxe!=2n16FzNkqU+hU9yK}+zl z4c|uVtk^#HdQ4o7g+A`>yab2f=MTpd6~XM&GZjTU1>|pD8iN`I@Vz~Qb~Ii}B)lv| zMX+UkuDI}&828<&meXQ1%R54Ut+i9GWoHkUUfzF_POiG~lKia9Io}ioH7EnI3bXOF z2GYa~VvZm(5-Iavy8uaIp=0=jdpwobnat&Su-%A?GJOg%7mlW-G8%w7aC?37xD1`6 zg(j0AT-htWWm!=$z(vPD{9YAO*crgHA_MH?dl}q7c;vcO{c+*N2Pvm#;}KwV_xraQbjnhuO{;ECcaxa zYB=tuFKK*-_XeFN@pF>lhvrL-TUU4@N(H4=y$i-qtIlZ#{X5@!nW33(@U7QEy$>>0 zhpEZY)U0W(N146X-gg}P8vnIzU@5@yUh?Ab5PdB3!QJvhhMygiPebaTkd-!e} zY5MM#eD%bh>(;@{CaWz%VP!i9ngDlo-OLg?q}ig~hT;0h0!cH~b@+n(i?xP_gA^L~ z{YG~0_X;X+T~Q_{f^VsD=z>D!KbHbOi2eYVRSIoMYTqQq36Bf8v&K=U`CEi$0)?UMJT=CzEb>cxHTId~o z?fhl${!hqFsQ3GTDQ3t&DY^zw2{rv)3htAkng ze0C>ZP&UCj?aTqNjc1+DH8K&HHaSLH`Tof5+h`>Chk!JI7-k(I(ps0>%~%m$&fPgV z!A_nH&SS#+-9u{KZexxgT#;yip;~;&LHK9oa{iA#NzbsT0@M#46%v14;DmBydRn3_ zm>D}&-%KtqH0ODw?r_=XNs?!t#^q*@w*7vv?6~o8mN;D40iRjhI7Tp-(gyn1sm9(zDo3) z5ig(LsW#}t^fM8wKGhXJpDe%3t!*sIb38%(-2USoq1C&EP;MyVP-ESGvRd#Z({3DX z!3*<)gKib7C>#Opa^tA2MV(yYR0VpP7UG;2l>8vpZ_mfB=pjCB&(ngrA#nfxMO{%K zfZI691{RfP1>%GCx_qtyTUgoka0>`lE23<(0wi*Thd#pgRC%w8tqf7uy)1CYjhdNb z>$P%02#HY%S1x`T^mI$#I^P1RT`M2$2I3}x6>`JKUB=uQc&g82g4#;rvFES;8-YRA z=qo)gkTe=H+Qocs&`H=!`OTbrZDXyk$3w*WpO(3D-)qO7pfiaZb&uvA`gs^#`_4Xc ztU=C#tKWZ&2w0A_!VW$M1@e^0Yw9UJ8`5B~&)d-N`ZSxm;_FKUkO82n^rucBqxS7A1T^n^2v$tGI@EE0hQHwQ~ zTO}0;8kj6aXlK>n}{0ha7CeNm`|9iN#JTgz<@fa-!Dj7R`Euc@5wrc=S}l$jG4j8rLl%`iyA8 zgDbtBJuY8i1OqVRyy49^T9*6!rDUDSp^{AE{Ky6h(-sQBbPmMXFBuwV?`qgczWRTm z1SvceSuOAR0DIZ<)BU%vglXp4tQ_o+{x$pm6lQksruoKm^wXKp$*{q^S$ zg00fR(0g1cf+gLDt@|y2l=@dDR&18c@wD>F8L!;}Yy_MB^Hd6STBrveD`xd+rk^3) zrBQX;v{kZ|#1jHLuIF;!)FE&r2+EtE+1Q32Q5fp_ZrRkBu9-PV?EJ?;j>Z zS6sI%;1%@OL|h&B(L(k1`yM%V)KM9r-U6RXlTlIzZDqVi5~fVNL9FQ#%)_C$?l0qX zoy>%))<`;NxksFJyG@tFG&?Z(`&&$baSqtGy({+gos$GTbBlO?O7d&uWn>yO{Yn*G zjzL3~hz!a!_0<72&KHC^oC<$V%_r7oM0mo=2^bc-RAbck*IeWN)kwGCD*T-Ira_Wt zvpMX(V|qhqZ~l&1hdcB?P$@~80l1MNQD{66Kn9$Jl4yuVdM%7tw6nZ&eESk6l7RqT zNJL~PTqHPk?NYt8pZBAS|s+OMW8%plTbV*4z0-!F)^#+0Pb`FC9%)07(`@(xV;MvOl_@d$&9Tj$3#-c*- z#W=CI#RBANYCp{t&8g%k7bkNio94_edYi=fh9d2CSW)W4V2k!QVfXF5mG`+hleqyx ze+}A?2V~%x9m?|w3>2Vnd|_^>b4e6@N-t6FPv_TOLz&4}~(w;FN)xWTfdw)P)Lj{q({}BvYHvCu*XMLUHZl8QlSMod1;h6Pq!q@`8b-&CfLfY zX!6H6!f>}mY^~|o>jz=mb?}~g33Gz0mC^Ig=eSA9;S8@K$q>Jir z;aWBVil)S3-H!bNe&Zvi>5S#!j|sYPYV^%S2+=o`wA0v6^rzgcR&Hcfy>u zXSZIz>b%bdO|Qc(WEa!-I!JR|`mcqAQ-<}DY~zR99o`@d{(3h02xF##QSMcVeAOpG zIORLPJ6AfTJKahw=PVl$4qLd5LP{)1!Ys;<+##;ebmijtp{rstHHb zZEvH2C!2hH$$;h-c;s36O~k^CB*fBq|n^nL)zgvPgt zl8NY@c|%DNuyu4F9?b1s!!hU76dA;o|EDq!!i1Dslt6ILKrKKr5M{|sWRg3@DfWvK z3y9M$slix<&s6lWj2sF)-_gJn$iQ-f3S)(C!cVu;3hU3(lvh`)-4uyu9wJSmwINFTv*x1}eb6xwmf{T&T0F zYOxyP+b;weAB6D-j$+vc1XCMPy=JwPEx|82fH$_T%z;|p#yfw$X77FqcNX?QojEoD zf>DX4!jJy^%%h)Eu2xnD$GEtO4{+%BO54cqNi7lV?Fo%}Z#pg?j#>9`s~YC5d)LfL zxGu)ugY9?47C&p0up4j@dQR+i!1~Fyk8+MoBsw~}V~6%ie%JkpjwhSJn{!(DX9g!Z z$!u)Px8i9_k?RP!$zQLWM4@fD&4K&OXm1nx4QRr<}XetzU< z@!J}MH@24muo=&*7fNbc3y#Ux;o?Nbp0+C-r8;v8jrZ(FuQ&eV6`09DMd9&lFQYXl zf4k6L@uAP^CXcEOIz&WoF#X!cHg?Cy!|beMRyzflLS37Q-P0-c6-MK4O`Nm)PG0l< z&1~L)40-QVYKc^r_R!owJ@+myEh0wGcQ_c!lB}5J@H9&Uj7v zF=NK)bu5z>UoZ2ayKMQsGZN_HuK3D`vNX@fyopgkj0;m=ODmbG@-!s&o`U5Q6bcGT z?P)jR>B={>FZ1-pwPXfu!N2l6_c@*{p-mx0u{)C4hou>yKy1W$%URHKSn>iGr76*; z?^g!FBrrbgqh_@$Nj>M1`YtI!iP+h z_+U!;A4JS^p$Mw)?j`n2Ra-DDl>#H>7nWOcZ0;e<)?`e`z0Q9VYNnhV3Y1e9* zDv?zq8nU!+ao~0pdJxVcz7xqJcH}j`UH9eu?x$I(6bce~rDNyB*^&93>}V?aq}S8Q z%xl;5o5h3s^446L7DB|BQibmO!6{K78K69CyDdQpHV~6eebTdbu*#UAU6{vp zn~v!2a3p>)b^bVg9@1*0*$Me_l!CdHF5al5k+5G-zaa(#H%7A8So$jX7cUTc4~@)%}NnH~-#g@RoM zAagifp&r=!{u>)J#9KA3&m&VG0LG~vjtj=MtXS2klwX1gE_m>J83NZEmArR-C79qV zjQ1?)$+@#HEGR0$EaD6P1WY5@T-q$L0PFLgzg_hViB0_+?$DEGJ$NgMTQ^-IdJTt` zd7tbS&0`q)xxt!O?Bm$uk;jgwyuZ6q()WpPObU9bkB72PBu z1i~uc=g|lZs(I^N$1Y~SOT6&kYaBlxxly$1-0uCK9=i{fE>S&#W?1V9Jh+M%rEQ-2 zSW~3asn{@BBZbu@6Yqu%CecO#yq+lHJ0qQ(>Mk13b9i)#Atk0?(*_H`t-7}J$N}Et zmS-V*jPPR@e_NS!*^EzpGeIJ3RF5}3!rfW#BToW#9-tN%sq(%wW*;MyRw@M2j7gG` zf`He4nugLD{}RcqCK%{#gJ5nT@bPLMZCLR7(oINJnQwPu}(dgj6<*tic1yPoMP*PQK9_TlRXc z%d}1M^_IGBt(+kTQO}Uih|!DxF;QW_cUWN5p3Z!{14o^KjbV9%XvtAFIQ^9{Q$2uG zynMlLM?AowZB&d+{BY3yj+ZR|lxgjnQ%hGVQzx?HEd?mV#e zK2ge3#O~-$F|nod4Y&fpB>9*$%2H=(`?$f^e;Kt;(7ORHyhM($UUU{Z`9aPe*)@i< zEVo{CESEJ{VSGzGgoceeiPnR{R&TkCTKI_chv?x|V{(@0 z-JYj~ch%jV!5MHY?vn8l+@`trH@mnZ!yMZ#xvvEmpzvrQtp>-{y@HbN)aM7|#`7V5 z8U}`oeV(w9?ss*$B+PuUSf$|O_}obH#900`RMFW1`2_{1o3T1;S&?#zcKt!|E->sE zNVqCUuu2P6r?uqVhL?=#>8H0#=t#-`;cXirP-y5L{8Ob4`ziy$-)>>q#iolVO7@Uq?f3x@Hl1Fy2iy2Bd_Nyj`y6&WQZ+vqU=hvR=g?A|~kF3_Y6C zCi+Yd3H*HRPBEwvF z$asvB5v9{`^R%@t3Y`&&F^V^~h5uEJu z8^+>huEtZFqb=!1SX6t*z-TSa+b*t_9GC#hX67&Esrs`Dod!nxm}PYt zOz{HKuZ6UJ_9e=Gys~*X?J={na^*dG$C6swpF4IMdp_E*hi{N_Zl-1@H8`J7fMJ$( z;O3*UP*k;}b?S6ccmwxo@)^Ndn}=Ska;#>{uxRH|!?qt>_u*Er?Un||!$&#E38IUN)<`Ln_(*8anefhB zUFAO%8~4}=zgyljZd&}^PWv~-gT9ll+{-+Z6owSk7SgIjY4gE$Ez@=$ZC|Cy`CHac zIrS(be@-mKq}?P+{5B>X5M~$F;!SD39%ujY;qaZo;2=xk;_bX^Z3C=VY}Iifyj|Di?%p&kw>T?->UvnZuwfB>#?PWC=)a;o{WK0B6A7{Th# z^({u{U&fKSTnRl=%3p!d!HY}k4v>&7+Nq`WtvfzqC9W7RGdV@`-oc5Qx z9>})xXFr5w4b@aVp1Y-PDcq8H0*T=ppjr(khI}cPCpLZ z2KOtFG+=Q>Z@Y^9G?Ns$8aIWHqh!=7q(Ao&K%2QX_xoi^1>BL!-!h_Jh81g*eVNs! zSP#^=?ISM`&YOf4$iO^4^vT@2+!-==^9{BS@2u=?9O^k$&ToH!61zQ zr@Rx2Ib}@tbmC}ZmPKn1(H}$k-3HqEEkLSojI`vy$U~+q9!>Ylr4nRU^*779d4^1{ zLF!Qv6^IzkE@*<$BFfM8AdkG=XO(m$EEC09WXTL3)dK49AVkH)taTGwb%MiR$i>A< zGX*k*4?IN%{C4B4>H{YHMWP2OhU$a(K>Y8P3IswYA0)=4By6H6`piyYgN*0;`{7Yd zYeHnmiXWA+EdckESY1~ElaiME`;OJ{=HNn8-|*O%+y*0*{}rqD zh`q97VzH{F=&(e~+dBj&Qo|>)Qo!w3*-j$xXbAUFu@O(SNsiT{=Fa?0asOR8=MJrC zRyyXdT0(BI+u)-r-PA-mMA#Q~gx7YBL7u~<#1f}r9WPsHn#e7`i~od2RW z1&an??K0l8hxtpmotnyrc#ZO_U*1vuU7IG4Sz1^N99|G4${|xQ_*=F3_gUo6 zaj!R0;{tesx{2e0J<#mf<&N`TzZhjl)m4IlWwA{%P51S!8SN1ev@h?ZnJ)<&_SX z%=yF*#aJk)G%*$_GFE)v5oXfM>+rw_5%J@2FWO__Flt~|wu+N*kF5DMCA-pFzHf~K zhH9vd4IJbdabEnhQ(?dxgdHd_VJyj&C|X{uvTjly81#5SfW@*tshGnUXW_1h*T`v> zuCnQ)@zc%P*pS^jNiVI+v(zg~f|f3QvlBYVEl*wlAm_!O*8>3?J%ey99m(ouEdI0{POf`vF6-EgTGc5?%v#0djg!2U4cJ(?y-;H zD0D$p22`)<%z{1EFiPcx=r#&DmloY7q_0z+AMh8Yi51Cm8JCn_#>84`^yA?RLCz*M zr&SzmuN?ICV%i^qJ!%uH9_b8@NVaIhQvo*()mLek9bCU9$oJdHJ4L}HtFm`d9}NbF zMTbE7xpA*y(!H)`>e307YmR}NTARIb_zP>LO9F#efi0STNg~QdGSKtqa!3iw?6+^k zs&G%0221u?o_h2jhvaB&blc_o%Qk%uJss@-;zn@KHwCyOpA?>oCE=$JC4yjnA;Z~$ zG3{)e94^Bl5^vBwDodg&%r%D-B{#Bgr}CX!*5PrDaQTX?`n_md@Su^1g+&pVHL|=Q z3t2tdUn5Fc9%la-li7CMN1fW4lj@nj2uJ>yT3*h!;C?=M(}w2hU0J!JihfEwoxg7*-Y~VDBYdIgYVgKa)Dg+~=~Q zdeIk_l#tM3rhxSt=wu+b)C5E4Zj0p%jbU^dKyuf!`%vliomG#*;DPN-02Q1^^U{Z3j+tyrS;WraTW9t) z?dp%TV1)Fozz8NOzt+iWPt|vynsQ$yZ@oxNNtZblE|Ko)^!#%P4|+^xcn+4s;ZjhF z*P|TPtTP{BWB^O*ZseXVyV^f+oCn;sc8v`D$+3IsWg$8a4!;fMfUa%a?@{rT9(r_H zQJ-d76jiJ&nCDcT(#<@$`KBH6#!xUWbg{8=!3?2fq>G%a$kqUd?Sz;#h)84C9%&t(hvHF}Omq zwtpM!Rp1#qAw9aSPf-sxGuij={qZsHBEPo=yrLIpsHA0PCPAOc$|i6Z!zKG=f61R7 zKGHo4%`?fL0#vtp_c~w@D+uV6=mNCWfhiAU+IzMU{y;d@#ROsuB^*9vxNKt?jB73D zTYqj5TK$d{B%c-wz)S)(W3a5h zGEEO2Fg;ZCN)Nu-PJ%D=Bs7_!lOX5ro3k6K>wYZMGCBx#IF4i0*YgNSB0->d4H|fz ziv3APqW76tVpVY)@A>nf87t!SSCKo6orBjdbmoZW52XZrqEVww8*i1LaIa{QqII|Q zvIcl@V7OGrSM;LbfWLvEL(sHmo1%_pxp%;Sb)&nXutzvjI-3SVQ zMCuZh*U<6VP9H&M6_;S>IzzHvZSmA z^TO4{_NvzzCCz9}`4^M?qthdB#sy$yIQK$wdVx(Lz6xbrS(}21FBpl~V9$mt?g78J zAS(91mMoAIld2Oj)J1DF(J1{K5N0x+*`VE#qr-0cLm8qrgkd~FkQvRMO|VWOWInSC*4BT0%3PDu#Rod!pGG$7fxeE>&ttzT7{uINWqcRm--%C zdD=orgtf6|J~_@B!uz(0r+zaaHr)haE&1 zFCh!K2(pZsM}RM0Iai4;8uNN9R67ysSD;NIz!mx*rT_l}C%WvP&WI_eoaO0>o*SWP zE96A_J(s`hZ}s8j@rVx9gbD-cmntHiW>ckS)>`4GltY`t zkxCkSh(?>qp{EM<)XD=Vs{vCFr}?>P=O0x_=BG6SC(y!W-D>U7M-`Xnrbimi@Gpv8 zD640XxoJ`){`NS801>{Zxu>5Gg89Q)0L>{@|VA>qY!v1s&z;I-Q+3)M??+koh7B_CvQ7gqL>dB_@B z6B|-Cslrx_z$aqz-0fuAfJaAs_+C|0gW^b8UZ=~7iNRRbZQ{5eyDf`I1)NHM4+q4? zTX|L&rpcuT^QIbq#3flmg8XpCyH&3tlNbU;XL>y8aE__S+z zjceM=uA%Z~WNF6@Hq-+Fp1SX9&CJaa>Pz^ppJu8C;GqKdu8XVr+h%@N4q2GXQ_AYF zm?&2cZJAsj#q!d9Xp1YFpZFH>`snV99!*9vlr!@KjP2e8rHtnJlqp`dpVvz*G^Sn?smvOri_z%@RXr)Q^W%p{N6Q28akIgh$2H=MBRsx9nGeaZ zCLdi?d2Laz)SLG9uOc8N*(Sb!Y4FquT_7(9mylj95x2&3$8=>!8I0CWzQX+Sxpszb ze@hKXSg1YISaGOy40K3;18dfDAX)SW_GxD%6C7skLX_=8c7o;kZN~c1YcW9Pv0KgM z67Fg+He;l$QE~bX*h<9jrhC$6x)T|$*M9(M-X$VnQLRjAT6Iyze!|261rNyx9kH{^ zN|uGHGd}jorEQvF{KW80(j#a7qX0%HfYj2pJFJ=}6Bc$+PI5>DA=o|6Di6R?Xd*JQ zK&~1XR3!#AhMzKeAky;gcJ#Vsujvrn-uL`Bnb}qw;0qwUKr3~0-TXaq(vy;%C z^*%{3|B(`baojf`n^zDnO0%_N0Ww|57qRY&ka*Odi}lqwd+dYA5O2<&6-bT&tO^>N zKt>0$54lp9aSaZ*Nt!}nL4)Cr<}=p<%6=s27az$#?jAM(mL>?_>`5D8)6SF3{0Qr+hX@QMijAoL13K#my!&4C*MkE_`HT-JFh|alQqM{(DOjUPynyMe}bb9spw1 z@neMgwTk10JNNKKwNk|$aMt^Yi*nvIU*n}8xm~X|F+WNoyS_GBBgBBcG+vs8^_L&u z9+xF;3oeal?syf-1^I-A&K zZK5ZX>zVcJmp2lLV!V|$Kr|{7=Lyv$ghRJQ$y;OyT5)VJvH3C4vn<#JY3eWT1{%Ph z=r{IS6XmO7cw9){o=j^fnXMYkP!p$r=ay*KcA+Wk8duK7`vy0b&L=nK8afZ-^ytb{ zAf(csfcCp0SqT0@33$P3Qb2;fdt{^Omq!eh)RP*5S<26Ym1J(7+5IsQ{sSKD92g;j z)Sf9#T3VL&?xT5~oXIBlSwt48PVI}kA$Q5zw(l|enYeW(D>M+2=7b47^Y5BrskyYY zg5%|7zIIuj1~MP#n#umIK#5=LS`7sR~lEi z%OQ7Sbdw2cT{UvTIFJL@<&!(xXioI&cL7!u;_Rcr2DPWvx-i`JX%cz{j)YcU7eWoe zt-3jx1djLM3~WCt=I7HYzKsputXeIrE=B}osuhLfiK_|Zt6hmRO%D~2XD8#o_79Nv zh9cBgnQ!^Opl{Y;2W;ARyU2<~pRAA|;{(9N}=z%aKXF^ZOU>MpT18A~T`;9}d zLpOT8i_B3EHqUkGmrK0(9l01XHsoy2FC03m_K|qZR9clQ%Do!wI7g=AHw^HE{Y5NJo|IpR%D8X8b+|G#7N3e1QuDr$BS4YTYs1(3eU)!y^ zv$l9`a^Qya*+7SF>?WaRg-Vcqn%Ps!dwo&vZsh)qxTD63I1*Th&Vo57lOllsTlUM; zc=B%MaP&DRGi@PBP9)le$SfkUHATz2aKO^QWp5D|x0{1ZqL!K9{#s^LtLo!D;P(2-kIUdCcyVl>$9pU*tE|DCERB{^g3|nbf%kMkK;orzb2ac zUgDmsfXset39l||qClGEF@Fh)b`jE5;cg_f?9pQ}fALTAPesw7KDEM9@V!zN100O& z!4?DdGXay$a~gKPlwp%b@8PX=Lq5-))-GDtOaR%QYxlTYe^y77bx)Q;9tqAzwR=Rh zFd!=>9sFSg!S?PW0@lNJq~qKqr5rYeja`WUTJn+FiTsUp#Sq8n6vGv_yqj84C7NaD z=guda`Kk>IwlB~DyhqwKn7*~E3+tjfkxCX?*7-#T*Hf425(sAX1#VHj*=XT76P2`Y z0)uwVj)>2(S${6mzv~*LyKL~U@>~eX=XZ>o@Hr}emWZr}&BMEYWc8uO)%lQXNIPd6 zsgXQoIP+cZZ_XnHVPN__O^=Z$vB-xKL-uu(L1E0gCK{Asga?M51?$!?=-!Yj#D7+Go z8>i~XpLr5);7C_mrFHSy#!U_{0myTi-yK^J7k%uDm7`jv0ViI%4W5swAj7`o|57DD(PX4&}>8CIO!vE2Al~GZJ zTN{w>5RgVtQb0hu1?iHMM!JUXMi3MPq+=+hq`On4Vd(De5QiB0JKU?n{qe2EV$F}4 zIcN5}_p|fa2O#5|eYe{l&3k}A28M8NkHkh^pfmf|D_pBaAziv^!e^^q?QF`}A{^`V zt>g}Nq+nV97vs;-04L0G{@Re>lA_G)W7(i2M|$Ihm+_GEuO@mkIU&wZubnd)E2GZ5 zuQ>+aV5PXnIdo8D^5LxQ*rLo|vy?7ne$g&ZyR%S9Md~f#4l=%S*sj<|l_w)%@q4D$ z{4^WVD)gK)<2U`<=UsNQalNrXmjoMNNIkKNy)~cb-9D2g zDf%rT1QgDMF{s%*ze#1MgCuye(E4`cfs+!YFOf{Qd!-p#=`LDE!P9dGdx^i05wJ?D z{Q7l3r0~~zp0i?a{||A`J4Q4LgvE;qJ^t+&Y;O$qDA zUA$5udVg=?wk;5ayQnEn`z67DBlMRzalq!1Om#fa&$*P~j&9E}gKmo<;PXjwv^D|* z)X5C54rrsQe@Juqe)!xq0k8*_mq9d&_`W}eW`Zh?UfqiLIWYB_NHB$(SvJxqGgio6 zVyxhZuZ$u0)iu*&H(;M0TJcA^pXCu5%F(W@?JKTIoBa@q*2olY-gB z8{JHZ3kfOrtT5Qj6PfwGN(a*zQsu+%!~mNBgg*fSiff9b95&MI({*Hb<1ag5iq2$9gGMCa3pMkY86-!T)^<=B@TT^ zYohfI8m21*cYzRUax1ajgNyWH2`=FUuJwlxDv00=nuwh>(H4~5QHc!*zL(m6;vyL8 zYq_2`2pzS4_d7}S^(#M2PmQ#B)(jBOV6C2Ms+tk(oQd!~{W#5%_x&HT9OjQSzD%-h zYJfAVptEef{Whhj$}n1%Jqg{dN%o*WWcPWrspg#&aRU*(=Sw;lF$p|npAr)pT`CyA zRd`)sn)GHP*cN#74#v5w6e}>MIG9F>!>#}NefLcX0uue|xrTLTwKH>$pjtq^2g&3$ zRL|ZGiq!O&;a+e=Ee-U85z&~2z(~yHQO~&NU*e^Pq1r^he)hFepI&{eT=he6oa6X4!@s^R zH3y=EVc8ae;r8R}D=KfwQdg42i1`D>>zEICkqS-Wc$AXW$4;UWEM+zgW9NAPODn&f z@Q>dulNN$`NeiuBloG00{RHC8uNx~;gB6!D8M$04;+={ud3@4BivrR@&Um|P7nV>* zpvSne5czc@M&$cQHM8q_PtsjJ0@mSqAL9?0VWotQm7B{-tMgLRu#SHVWJMw%p zcbMh=WRV#^>d`Ih4)^^gJIP0zCti??gBBb;`>!<$)kSS=MzjV5V&V2sZoHWfaGf&} zHZi-HO&<2?h<&KB2gVu?Z1imPJCj#waW{P*Q7sC~3afld{9|H2lon&mKV9@uVUW95 zJLr{rY%pX0_}N9*|G{L$50)=prYl)AVeAm8E@?rCVf2<+V7#8(zU2mOHUdzYKQJCE&c~M&S{A& zqX@nhxC(++&ZnsO5VuR(8S_UAutr|$)If{J@&!Jk8u{J@2#8)aF) zb4VBOH$zba;1(K#;ec)9p|#=z-@bOz(}0f(1+SE6#%=WX61pV;%0xV}0>jFo`z0a| zO*NkHJe?8Q(k{r6f{0ajb8i{QF#K@>K3-h#He#Eu*^#252C!Bon(om#5yfq>nuf9#~lZzd#!L~uZfqLTx0cBITj z89O~_izllQFYjr4H+F5w!+mMUoWi0wvh}8r=u?vo=6WML#Tos2a^+cz82Ap$m<$q)&71R;foQ)y*m?a#4nv(O!QzXZ$72@y+0ZJ zDdr%UrG;kIV%OB^v&Vi(l-q`)iTVp#}_{_5hQsezHSHH!}>>_=?vv`0-XCF!uI5QPdSr z`J1mbsE~3uf%fdP)6dRUU;2xQp%`7naX$;ngSH3vsI*UTg%P61%*M#Jr*rqdJeSVCwJkuakIS~?P z-e0HKJX?*_cHptYnR&GP;ja(B)l+mtd7`*aKf2IFBsvP6Kk2PiJ=R!T~Ha>g*SJkzpzWmXWLf zH){dFNe}=cPnLYBwN#ziLnxa~$`1*rKEQtJn9%;f3$<}J61Q{FpJ#c$k)z&=>@e2O zJ-@el-sN&T9|SdvH_B=^K0g=rY7_) zdR9pW8nVb<5*2D1{cgdFgexuE=BuC{M<;jb4XOOHK3Y|XRBv&L^z9PI5 zJk*Gv+s5obHgyq+fTb?Ub=6$H)ry1zSC_pG`o|alFRYeHw?@DIkWz3HzT2xW(Nm~8 zh5{PT$lbDZ?A&zfR69fVPIzHiT0FmpJjQ7(q^llAQgxX@yXo|E zS~;8Vh`m_gQCOiC43aC&F|B(&`@TgNrH=C65Hm2LCGCuG;!TD= z(DgIcK*Mmpv*LCNl6p$_UD)VZv@pFiAzQT^w-t??>`XpAQ*XF3SC4tIo z2UU`j3q!gb5pFyn-lB2wmX&XB>%I#jS}pKVuR$jk{n5rD;jPLvWF*oO)bn&ScmV2> z3BzZ~i#DgcvZ4J-ZwG}4uIhFA;7e;DykCK5G&^Y*0H!|Z9|W+?b3{6xZj$u|gl%nN9ghHP@4H;lh)c5jmA(>~ypaIEaGivY ztwgfA{*P$;Ux0iOaHP8bzG=BNV`J0d_>0?^$k2HM!Jy;8L+2JR5kXLuJ;1$~VCMOH zR_tKmcL_}E{3@;<)GDRO?Ylx&!O?qY11+tNaWK6!R3NgCfla6L8idvCtdT9wH@&`< zdf2Zmy)(=p%~HAvv0{|_PR<_@KfwR#7y{mCmXge?eLO9Ox>{6%1G12*5`~|Qe#{P# zKtcvyKAh^KMd8TZ;{ER(%mt-ODC(PYgqKdPg=Nle^{;&f6bsKf=qgz>nZF{vB?2SW zg_s)upjb=1*vH(hu|cN0X+i&Vwe)Ben5z4fWT`z)W?e5^)AmVD4A+$49|}l3HY|^~ z`Wn>9+lYoKWm4gOXf*4wkvczT@0W-uVMF_@shyLinlW9_Jfrj7ubeGOq`uHQ-Jj)w#R%H36Fh?mIWJ zye1sfQ)>XB1CpADNH;KtRGZRVb?Enu#O8@`MWH98sbn0e-ZEDRFbS*95P`!d)H{Yg~CMY&)j^3ac*(6UN`b@c9&jzA93-O?cf}L^ZJUH zCafgiMiL?8>^=3qir7ZOC{q`hM-4stm?!22R!M&MLpA#w)l+YIBIM2a*}&}!x36n~ zuIbv8cW@|bgomnFp8AHJ-t+~{FWjMETkVtBl2;V7o4Qq(3{a)SU{ z)tXyrarw6JqhIZ+pKquog7U9E0iuD&|Gd!)>CPL zbu$w-Pa%t_aAz}ztfUi??oj0p!lBQ=#Jo&OP7Vx}K3wxN4OvkMZgI%gWa0mCLq^S$w5??F`{!&Wk z0qO`w_!c0zaUToHncWr0-CB?*xE??e&A-OaSU5s(#z)+=N(S=6jzEbEKcvn0q%WVy z`zILZ0hW5lYabZ#V(J3CZGuCSiJjmz`r@yHM-%sXg@C>v%C-t$!{QWDy83t0E;w!$hiMc z(h?mgI*;JQ?#Y4M1q`_78A~-AX>QcB+SHi}Xi!!WHBegmH;kmhU}_)2*|=B22quiL zz7|=Wm4e#XbyN!(cp2T=u1X)=2^1j5bhEfbt}zpI)SZO_)h{~CZ9NG}1((40lnBdA7yg$)&8(9F?!Gk0wkB!&FWCOZsbNww;?)$l- zVEmzu0@FzN{<;SY`OhO41L^&b;U#`JuIKYS43S){+=1^lGBycGL0NssIMiPPdBrEW zF?4Ul;TB#LTceZTSBm>(5Sl||-wZpxWlnjtGlIQy`HUMyWj(EcP;*7YyoQqJjjt4l?B*ZM;ho+LWTg*$64`(i72l_?t>* z7LR7LP?$gS`>tx~VG2Y#n9rC~Y|f8!E^DE;gzEH^E}(F-16+Vqv(u5lS62xFtjD%%AE4Prshl^2k%w4%ZNg8E~@SA#yKm{}d3Y<54TGx9y$TE}qU( zD7*#7TPtz#FT4RLM!LAw!n9LSeX8rsQ0xRWr6nfszg&<1td9C9)f#2j+1H{Zd45#c zhGF~RgP;#(VS_WqN#g{%c?E&3iy(eXAGc{(XdKK0xu=9RfQuGhBvb8c5&Ock)>$|6 z+j_S&qsu2m5f6y4bKDUz^J1^S1rla6y%jU02*I-y^Xf7#P_qjhc1 zQC%sRZdh?4KX%!e1L;cH8R2d!V`LS&j|s+aNx@CMT0g$$pePXRZZu3SUk})aq?ij| z1N~ZHCELL@<>d8ykA|UQ5)m@qlMvCR+E&i9fr?fXKeXA7!s@ze0~@F69$QY=WQPLw zxZAjUAa7%#W3K~rSH8S;Fad8KFXrn7_7fM2Z7}oDn(p)bhlfH(LGt@Zkd^*?y!kK3 z1ul~8A$ekh2a2cW<%2o9g$Dp{<(#BXkdR1cQ)J-;bS7#%*dUwj>E`+~x*8|~ z@``?EymRY7RZWySdon;vNkQzmNnq%gJS=GEvHaW7sj8AO}=@kX?%Qvd;2>L%P=3MsRf8r~F6QIm*2M83HM^pm>Qz+&}KZ;Dd5|b!Z z9sw)W^uV5j&5aLIck0J{c|6^YzW^&+)8?Z-f?p=1lHD^wOkC6}1rVluvg)H`f7Zo8 z9imvw{!cVC;GFuVmt+8CEG;v=7i5BldYUblfNhe$rSg@O(UXpBN)|6Y(WElUDQi%g zdJ2tKMZG$DByMtD#u$IBARwPmbWL!@({m-gwev=~g$&FR{Z+%9Z*vwF8HM*JH4y!Z z|Jl4&@z}io$3cP3`|Sk~Ex}*I%$dkoLxZ$!y zyNqZ+G#P(3tFHxhyzhtqi1TgnGe#u;H~sB$VjD7O+;(Jeb5)6DJFxk9G_WPN#}p`| zBB#_hWa8Zp-rGLqaGc<5@)CV>Z|!FQBCVn7lqTK005(u_vU&&JFA_o{dTYPro+6r# z?=QXeW{l518X)ok`%ylh-b^(Rz`o@-+^j6@Uc7vRfYy*f!w{P4KTTpjjYWI^Q z8MEjCk0#rVd8dA%)7jH(_oTX(3jrogqz(o?k-8$5$xtjq(u)Q>Qg7{maow8N#|E9b zmX5yBlKMJXV)QtuuKDoClnGL6(ELj14U^iTVqCIo{eyGm05}9xYJcG0kyOC1mo*oe z@+s*RKyBNL2}xY4N`Q8Onr!CR$&6i%wRxsFk}bgIcSU(NQ{OySZ5K>7v*_nD<6`z8 zz?bg%nt+O=?XMW$3;6DzZgAfNmTOICv@N$<0@GX5*4yI(r|F$A=97pJaYf=n`nj~>MB)QrcB9h z@oS!kj4p3vZ+N$!_YbQs6#lL$s662TSFV0$t6E;JV&Z{+!mT4G^>jl=EBR>H9jl?M zaf+!+?gu|deWEp*Yd%V>CqJ?OM*P@ELGXF*IlE%B5MD%usiY9;+O zQy1xVr!qG_ZL=6iX9~}|`}W+8JzKj|snUh+Nq^G?*h7LPceBPDzFzOh#mZ>_L%uK? zbSU91tkkmY^O%OZFzHjRNQm8Pz<T4z+VT^2oY%_Jh&JQk z-*s`?hbvs#o_&sS!d2pF!PGdU-W8fgR$nD``Q!;G$;gP|8)R#8$MAuzc36`l_hL@fOy^<2Xx&dp&DHSce4{ACNicR z1sUbduOKx&qQ=yC7y)dX!t!c(5t`;6+r6$q-kADV)jzNV^r&p*S!cJixm-5t8bw!5 zIB$IdXJg2>c2`zpKQ`_=lQ@Ssnh6RNQ!G$+QVvi~P>QIPO+8%T89)?vs8TEAQXAN> z^7++xG@bs$EfdO%W_BHtPEXwUv|10dkYw9Y!_3%$E!CdP!` zfi}C`V%!>!T|=?F%i&)XW!vm{5?&xqJbV~2N|(M!My9q#mNHULm5zD@Y&?Gf#a+VD zrhMVd@208HtJ9)X-;ozr?@sWoAa=f41XidzoGm_pHm`{B2e8_5{IQhFNOt0{G?Nbr z^6YCOHj)G+l07|pRWzT1E@u%}eCa?s#@AO3GUcaOOYxs(<3;Db)76@-&a;p>aqyqb zOjTD6`^k5JS$cm8S)HDEahF(lt`^6@crd%k8{e{YZ zzxS{C&LEKOPkx;Ztcc?&T45{Zq&Kk`wF~9?J@G1EUpKSdPc#1qqSmP2oLf0f&OJwbcyoh<1-l~Hvp34 zzO9&o5s{6GePn?rdtqE6x8qVt0@@u;?(XoN&gL3Xu+|`Z2Qu2>=K#;+O+xK0yRE-d zS?M09RXRq!xL%x3qLKsyep9R2@{ozL4x7+ z&2JbVq$m)`qn|CO6EitQIu|uNHVGbo;aq~rGg}q3ClKbt%-7{Eaoa~GZ4iR0t)L5X zkVx9c{KG;2lx>k=(c5ivGOov+fEujOs8<$$HtnBx2HmJJt$tjf;H@uZHU~vm_rjuZ z2{?kOuTP3KkCfUGvrUf(%JWh4LuZcSjzYACNCb$a<{Aq(2He_TZWVZZ=lUHYbK%G1 zF2M3vi|G;8efJ3nBtV?iyQdVEp<4C$sK%!x)m}&abzc;T!KjU8qq*!N}etJChLt(9>rVZ8tPiT}h5 z>;a&G_`F>RI-%Z+H{$&ySy`V3r{ulq<27RQA1{z?>e=`hYsFXz7pU)*dycX4^lG{| z7TGCRpbc(TMVt8IJc`TtXmJFQ|Pv%#|cmG!9FxIh#$+PdWcdrib(hSnD<@3INUV>X^| z{kl4LKTUK35w&tFSx0_>?l!0iR9%N}4~uyb*O$ zo;@s$Bj6cZGA2)F4dSRIvqe28-AVImjAnNB4R?~G(W>eAn3*DX1w>{-n)cK|m<(LE zaX~k^eg@VlAD-0b#@+e=&0a?9zu+C4wh^U0wbjDD38;i+#~ad;`HSCo(zZy$j*S6a z+^uvTu!o%^rD8l=A-b!2$=trXShZyVJdW?9_=g=NnC>4|qkqG25mrrtMQ`8?*U_aI zsiR~-G?f45Q3fP5#!sTy%`){>MXnZ>4yk%e{~A_(S&}np4OiZm%C(BTMwxx4$k{Qv z!M2fl%}43$B;jp+5>GdtFiw&4m=5yvE}BfiWmMwj$+B>#w=>GhV~MzbJMKd2Tyx~dfyN89%x{o$XBY8<|G>G;$ON7zzQ zPWd8-Z6^86{j+36jFu!HjBYY(;f(uiHf$8EW%FF|_tq&Bv`t`D`?s20JQ#~AxQ=J; zeqh%uIubz#YRr@X12db5A20_ORWVE+h}Em&;}gi2hGDt08?;j4dp>as*GW4!i-GSn zCd!)vjf3U6Q?d}BCi2DwJ%lEuWIQ1-G!C@E{|b{F{ZzKqGs)RBL!#^2$EXR}aG9P% ztjvm3bV8J-O3Fb~+RriF@ZH0bbliQo)YDcdvFEU0u||%2x$sOu-S!qmnbr?!{86Et zr8(@3Dh?NIzU=e{}Y2is3M@S}?3_T3j*E(TqgUHlxFse+LH zy_7>M z#7*~RJ^sxX8)=N|HQx^|f7BHfRGo=uA6#j8p0X1>JbtMu^;YDc&cP#kN>j6FT3)2@ zVU^0T&e!OmRDI{$QuW&ftj=dRdd=)`g|0VTrcCkP*=AHA&?#nDw5v`Of|TMs5Ov@m;{HsUMuTEExrSkS*tS!p)B<*;K>sFYmhE9nlipEk7CDV0w52{QhC=0f=0Gsr;1LJj8QRgmi=UMI9MtuMGhh@msDPt^lVTx3G+ zLEnsrga0_lCT7Em8t+4m-mi$3gVK2xN|s%ZDs1;FkRMjfb_NN^d9|okzn(4=o37WM zZY(qvn!PeEO2=|9`_3(;N9{ttSjV|x8fhGu4#GWZL=mW<_qh*ZBmr4bD2!K&7;*In zBy?U1zd}aq`N_yCW4xyqV$bGg#(s5=Su-0!4!S;lVH{Q z+ei0&P#fTbK0Y!%z*+@EI{LpFZWhzm^vX`7OieyxjD_Ld9tr|zd1IPmWD|q@P-HlG z;GGD$B~=#iWUsAHI!`Yo5A5aMoy~6zR%G8?vdjvlT&!V6(+xP=hGlCXoTbrTU6jm$ z<9t>w19F{xF)u#v?D%0fEnL%AHMR>ovuXd4VuljN3%MDHh~M6_PBg?vzZ&hl^!v{f zlKLl57U{2AvvfOhF>+QfS)x7q3$M4IKuwM4 z!*X-v!%vWd;cs>JJe1oN*NHOAz2)Q-ifm_)us<$ypS8|7%{~+1`f);3bAD?rH0sTpCG75T0Y+5Zp zOgx7B!wMj?w#g&lNmm zdY4D%skSxz7=)Zsoy)asa(*ahA6aiTnP;mXfOTeZTa>2#$;fsEw>B529I=JP%U7n# z?#J6O3=?v%rfuR`+JTd}YlXRKMN$XdNd&{U1UCMU~;3JkXHCC8^ zYSk#WbC!iEqj4MdO`8s2W=G1ZPk(sv)YNquK6Ly$&C%2>u(MeqJYPq>q(07!oy5~h zzM8b57kcy`Pj3L8Pxt5nrnN_>9 zC1bOLA5o+)=@)B+&V!BYBxzccVNA#>@Nz&{%F)7E}DTg zWn*;l&gHG^m-1=nx4f=m83t&RJfMN+E%eQJG_;{UzkU_@NlO`w@+HsVMC}e6^uPik zV3odM)$C?%&+8f%yF?t_*;>;7Cj zgVL)7sqD!0#FOW~51w(h%uHcMrZ=jUx~XV_f8O1G;fgV)S|MJHLv?~Y>0ZrZ zClZfVZ3%-p97OZF;~X3gWAhG})R9a!8zk!FU8J!#ya2c!UV;fvC;d@d(1xmg1q(phjL<*K}L zW{^b5tm+)xDw8Du31JAf?%pMQNSy(AOOXLS|-$QJ04VDK@BSwm2pK46I$D7vssw6DG_GX zXMFbvp#Fy1@y-lMucv<=4Qq&}9{a$wN0P|^<8S)mPuS-RNq)W+7hX4*2 zGH^>n{X-|mHU`;!2lK^<7f4RTVOZF*!h3c-f``~#&pfn`59a7k>ra1>Ldbp@zq4+H z7nus=pQRr?-n2Krt0kcxkp<8ZT&jQ)o&r0Pny5e0K|S)(YGo8`&g2!JlZ=4JW=)8p zw)D`gJkC6euVexvv=ceIRp?JmLBokU!2*;ei?!Z_ECmzmUa}N3Ka2WO@dWV85558!B5r74IlNrTSm z20Kp5!uFKJ-~#jzq^_l>ZLei#kJgI$Z>mnyV^oH-0~MimZyV^5NcDy>c;rrscE0qy zrDL$_i&Yk~5dUkAxE6%Gmx7GnFDJJQk|B2BlG&jupuk;bL-*3_=HzN7ODt2{+RbO* zCFtn7Vz?jDu>I!lvzsCa3d|c!bruKMO1wjeA5F+TvfV6oxfZ}&9hSL4CQ!*eaX(v* z8r?_ZwTi}w1r^^pw73`71X^MstSj0k2>RT9_=7@u77Ot<+;m}zFFkEVy)>C^N|mR@ zHoOvYAn8f+BB$MHC8{!D$9R?8l%iON_234Ac72?Cp~WYR7oD)n%Uttj^OI4q%mmnm z>l)-^KVw!cL-{!iuf-lah_Sg)c}&h)y{^^UWBz@#cI?-=Ym4&rC&@LD{ITUc%#|me zF|KLv{uMcJUEo7HpMCX}$Hsjc@a{|Iv?MF@6rst8Mz`!NIt*EMYL}~s#Af*6%XEH-#%Dm0HcpJ+5npJJ?=Q83PFxN*ZZB&b^3$1p%pj zxXUMnYu;xTamsslc06gi!;`?qDa@o|1x8G^SaI|5y2^(3zbW=D=n)5K#~f!b74Y!8 z)N{K(+3`B%+mA^Ukk`tcr8uM}TL_$5Ogge8WTlPMfAy=A4?wS-$ zihaB;7N;1GSkYVCAjxRz4{eSM%da{QJ@%myP^P!sjQA_NqfkJ5n|@Fx1@@;2HGneS z{m>KR2E_?8Q<%0KZuMAUqQlI;G0s?B4;?9Vcl9UeX@?!8hmG?Cr4`Yht|&$JmdDcr z%BJ55h6N&nw#9T_Ant+()0^f25m9;`y}pp;^u_-lIW{1k2%AmRA52GJ4TrG7#+~h& z%GI=wDxr_O$eE@V-R^0M$U}>78pk3Ls%z;uQ9FSlqqB>+sT5C%lpxpyt5DAxNhL}T z|MGrV2=c7j@>S)`9HXnStGXTX`nw)FjC+%ri4ZsMvkJ%3}vGps#`xZc=UDfmDXYsaAh(Wc%HW zW%0O%>`PgjAm&%gDcxu@X_0s~{%{!n*b<8$^YS#4@bA@b@jLO#t>~h-=_bWvE48yG z=VB*4+5FKCxv!@DKz!)w_BHI&KUJf~Z9!1jA@_9A$NV?8F5+e_=&GQfrl# zPj%JIr%|@Ov9RS%uCzwvvCTw2Q?Fy$S+ycSC_p8^CLkg(U_rQJo!T_tF?X(dFLM{A zE=MRR(PblpTT%O+v-a&*qnM&Xgv->0dHyE7IQh)13uV#e8GjwK$A@;j53>K#Ia#0~ zC4t60{qr0};0O8+1RSa6dQ&yltp4sg_a1 z@}Wt;lJZs0MNt8mu437$y)g~Rh0f5R;~FW^GS4Jgx51vGW8`C!hDa7}xndBD)2l0=YfM*MU~9 zW6osXRhtxC>=wTKzNrbxzjnx{?c|QSg}H zh9@PYrl*>p6*YKmfHoH9j3|n7U8D4t(F8s+gGuN;LtZ0ZRl5X0g^;S*xww3&~Y-S@a4m zp+(JAg;KJHYhJ^uz&cXbU`hwkDChb!Yltv|>>Z$>8W?^<<8WglYx!)WEdL_3Da4iO zfrm&C0fx)J$e@MDzQoUfOX)^h02B{Aq#-{iT+Eg(kb#Sbr@&!NC*OBfK5l@rxIUpI z+I%LIx``s6%zEtCl6Zdo4zBv8uieWCUraL#`{t)LE0c#N9auH))g?#$ zGyMx`AwpDM`l*cLkaG`;@LZSd`wbJ(0n|~Jl8O2$FgZ?qY}B_Q9zucYGYz6E=MNkm zITspLMG3-n;sW~nvn{IAu4Z?+S%wY*g`m-FQP~t<=&kfP%70H&qbAHz{P@loccG z^Sod23PD+tjUuNQchVPQSpmuql>Y=J^013y*?V|qoPR>H5; z6pUJ?HEs7uHyP4vmTU^|FT*)0*+G>yodi&|xE@mkZQX+_@wB}H@(btcVZGmVRtB|d zRV9}yKttlR|FLObWya4J#ah%8UoS>~ZB@{f(jiz5&0$%=RxN>m*&<~a`@C!zThQPm zUq8<yNpsPXdthp}F;B!!3VtQgDqbiOjyV(UOmeS6IokgwGr- zPnDYgmY9Fxw1J!3;tHgL(2<4k52Z595xXo#IQ#L0WWR}q)mza_(uPtP2U0k+;ej}R zw~QmbZ_vjf-yV>jfh(l;_m@0iPW8-;O~xbrsZJ~8=OkzUp_8JXt>_Dq%}MfxEhbx6 zj(y6J&`R2?&k7c5e~SQc0n`YVN&Q$9rVpLxnH#4KjdM-k*N8OT;naDJKNe}8&&iMY z-Dd;3Svgohzz3m>BuxOG&yJHi9}PSJqfLUTD<`!UE!h&biKjm2^KED8R-)sKl5>!UX)zNNNQl^MF1zRfn_}5F>||F@WOvdK{K;m6esC|HU?v@ia=su1AB^Gm z9bVdHPb-&&LWaEtq<4hlB5n*A{VX;eEU_NGISx2FXvnV5Z{@y8j=GSh*QZ7D;vH=f znfa@Za0meiXaOw{4}mGnz#*pZ9g2(UY(q5Wx_?1C!w$VRU%n&xqEYVUxM8=6w`H;2 z4cVJYrN+81EhI z@caUnX!KkzvRClYaQpC^>8#@#+wsYTaMVYSi+I&<^I{f1J3o*`{9NO{#dMAThw4ZsmO3HuWQ7qwvH-8qJLjdi9}k>#YahF zr~R4DfWk|aM4lRCl0Ph&h5W)xm$EL_;DxiKQR%N_XiV@7f*l?AZ{IkT~ z_op?`ZsNZ54O`*82mD7Vq8AM{X#%WL+rh1uXV96G6P)621yje|Y&RL7s#D*5w1!{U z+4gGMlR3Ng_;uxkKSAHOinsYVVD|B_R!fYe!amGD{CL=JKPv6IO07C?<@&0wv*$F+ z?^^eKS7eD%UO*?=BhQ16mhbe(gG}PTXoUL`Xcsvdf49FC1`#5fe#tcD$03pj|7`uA zBL8;+X9l6lfVV}A@#dSZ>2B0~jZ!m8fAOXf)c%8b-c?Vn)S_v@cLbAYrx-O@pcqK1 zU+9Sr--T%v=%U!>dPl>Kf5|$`X(ioPb zbI&s~zu?YgvG)7zGCVqxs-1T)4GI;VlH6#Lly@wSlmL~Mp(#fOu^QiZGxx0BfcV>W zr3QEAM?V>9`N3KNDJJ%q&Z|q%k2zKVBLkIK?01`?MNFON{Tk!Xibf(PT!mUT8g2%m zD2(j1-*wb4IXC>%&s|vKgh^Iew3`FV{)OJuK-#k3n5ozYkNcsp71%*JXe+v4NVd?* zyx?ExDo_dxS3O3;kIDM!N1Y0jV|@B4;d?FQROdj1UI?bT1+800qQAP#ra7j=_}z$- z9ipI-%oQfCQp1H!`ZU!k;R7UU~MPMK{87Q(?0Oe>nY zjB^sI`m54^-~I1%!U*e0fgmLT6m65;_+p`JK1mrq!QUISMB`T1pLD~onw(@^l>((^ zZq$j!d6%50VIlZa>{oJ*`sK(F(u_W|tsXw=nU>^lnxMbC0Hzw6mLl-EP&%~uPO|^S z*P?&|%(_TT@GNIupeUJ`9Q0VIYLpkx9p)&d&)b5-o7omGHom77-J~Zpv$c}Y;PM3= zqR5HVs*+ZFxf@RxvH)!?Arl1oc(&*8Jb2QKTF;b}R_Ve$4BSl(qFS2_dcF^AfCw@E1->S64qyJ$(ST znB{W)<53r^&RaLg5B~F$jb5D!Fco(z3Te+d{##?zRr>%K5W8ot@r+!DO zbb8*GhZJ>RXRw#KBRP;F@e_S3z`mw?aMM~CA(e@OfC|HSlFXK!<704s4I0jPeO>gu zrUv}PxMaZ+L76pL*jp^W2y>o?QfK$7<+r%_D|v5c1c!RG&=BWx>Dd_hRvY)TL?vd+$H|`U8*V0p*%K>c4-v zZb+(v6Vtv$O%PcQ%QY|`{7T8VIyV+qv5gKk;8XKzv9iHNvt226wO&)2=ustpggc^F zb6%pC?>=!R78(@Pnvvc?p}^$D0^>BCOU1dkD=Rqb1DQcTxV@e7OL`Q14U?+ckdLS3h7#PiU>4#Bu&?uztJcRo+2ifn%u-?v4XxMnZZ8ozN z;!GL`&Zi))>Z<~INO%+u3=R6r`3~FdaW~sCe_(s5j;$a-HwNqk%p_fXXX^DHFMg$v zYMCqbW8Kd0z1TZ*T1J&nZAG4x7iwC2{NwBGxXBv$jdC1tg=Oai{~D;PGIz{(Ze=v%(~_03E?Oh_rwAFjh|TVD$%41Q zw1|fiVS&crcc@{xlizxx%ylAcx1P;%TBUep^Laq$l&?xTNxeL~YtS=A#ZIE{yQ^>M{%_vrpoC5qZBhh)s~e|LZ@ zk+ITHOD&*6ae=@y?{2)S6iwnPV>sXF@pf;6ERk>=+xaD2Kq=zy5LtRX=As+<-ql}kSRLgX`#D%0++n2ufg@HCq6WSeHt}3;$ACe!V5;;S#V#hkYAnZ= zL^hT8muR;e*HZn_JBy+o25^2M7mp0>F)0CZd7X0-61L6UEi24 zm%6_FoxRsSXaD-Hb6u=!O<_(L@B2REdG7mu?lHzG9NAHL_eDtQYq!#E;XQ=*^lst- zo-fCXwc*X1+=(x!<9mZwbhq!d*K2Y`E4?zL0S92K5V=n7hn3nz*%kH=T2-uDCo*rG z_0RTA5q`Y*rG-2omDF|5nmPBe{1n!WhhuWsVjA~w!=ctrVD3E~|45p~%ORbmD1p5* zBm43y1v=0yWgf#53ltM_8-(ajOq2aCb9@kVgAdW=0$uQ0pA5qsRpN7*{G-hXJ)vc? zW-O%5^wKO|`Ej>pnkN*`9@^7BeN6E)ce+(#6yixx&*Th$i+N9TRTz7FIW90V5f~xs zI=;=|I+Rq%*2<)L+vL=)b@`FIQ}~OBXcn8Jx5-aqutS-a6Qp~qT8XC0h)m8u@6U&hIf^)@`Q;XFA}KkxCWgS*{EC*$KD@tU(x5MNgL=(RC4pc(&ByH4j%A zip`43z1$YfLtf3I4WlkEr#;ks8KXw=x>?be={f`{jvkHhZjlt;&0mlFDO|^lNqeI0 zAVL$8DC8*gaC(?tjV>nQCBqc?*qQV%>GK*~9aXQYT>savCT~Ss`bH=(GBvUd7FDZ6 z!(+U9)Nj=#w5x|yAJL`(WqUp#9BmRg;~i7N+mXP-xaq0Xn!USuX2jpOuNF) zqNfOP6fW+&I*l%%bJk#A)k?-A1{j79XBnFL8S)g!Y<%~--89OL{}vh_>M>wqBQv#C^f1ReZu@G$+-6Nl~u7U=W3T^~*kc#|Q4Edf5H7G`zbpd>fRGG}>F9CV^rh zG`KzS?7y6>`>fZG!qW^@OZcd?(yeS)r)gPhdL+G-xa87yWsNN-DXbcpLU}GkLh8uB z!~_u>mhKhqCH)#aNw3;WRrds9_xYF%{-s>~DdE+`K+)QBB##Y@|}I zqFDXF2)}bq`hp_@v;zk#%Y^+V@P~}m!MfGp(74Rdr&x_|!uO@JM2O?knM<^NSrW)( zKHt_whfv_ZlDU*mgG^V+S#@+p%+<+8t94}qu2F>)UAl9-S$90^WU`h&>=zrpV*w{+ zoBCj>yJ$vKe{$jTSyz>Laub4adJ5?MnIgfJxO4Wo^D!f|hz6|}e?Gr`Hs%7nUxw|} zSY2A>{!=0R5Rd1=4lXs1Dk-NHxcjQ~z zMr-Kb8R`3L5UzX=;j@X^r0`~{#DKvl)G9cEVb(JvW&P1oIe5VHP+^b!9@UEvpygq4pX(4v>YHp1N!($HD# zM>_C5+jB1G-NrRJQ{$JP#7&%x->;5*X~9p*=Dkg%FHBU(^sk5Mz4^Dtm^F9@4Kw zb`N8;_^JIjOoLUt{?M%#R0e7Zqh39!6`K*|1#74G)_>h*SH4pCXrm6zZF)S1bfeynH<-6M z?Z`XC48Po7?z&`qtVE^zvAKWUKz`9-Xjk{tuI_34eF;&qlEa+p#69F8TuX}kzlx;& zGZM&_v%|vR{2s|bhJ=DqcyM*J_c0f;?vxhXVGk-0P3<*E+O-YJo2aY}9?v9zg&)c~ z;Z_MR@}s8{G=!Mihz%L{*BShH74N@sb`k&3?W4mHjrf~w8UwfR`s@}DHJ!8Y_z|1I zT+mm&N&{vFxYDDtgj#x&Q^rqNT5LaWAGkb{R~~ArR~IEV!bIF+2IRBkR=X=AFS*Q_l#R^|Msuh%I%?Xgn$qrau1CLfwckNP5$S zB2z2^!HfzE+pZq{_N`?(6LJi_tkS0wBG8l;2hDYoboh1CatOY!8W;IRffLx(;Zgtd zy|=GFDg}5Nvqqgr@4y>;0d7SmK`1e<%sWxUUlrgJoYfLHkx#s#5~81B6?$m`WR`<& z0A86w*l($#-f$0d6RgEq(xE#l5F;P;`hC`Mp^TE;s~N0+8ztRfmCyQ(+%EFuX{k?| zLC5m+Y_wMZFgu;9H4Ipqv048@!+ePoaB{@MZS>VTJ|KltZxs?O5=5rOQYn#7_}QuG z$Kpt6l^8Z;$_%x#WUDHgxEp5=tsDCLl)N=Dyv5Pu)zviNzWMCN&pXZ+a1$(lA?pm{ zY=h|);e9Rs%H?5vF>Nb{bwO`xcUtOgq+>DQoL-RhaTV&{P+ouSgH}s*F%CbI8(Llv zRvx8ub{hWvzKH{~H(E9xm;H!zsb0s8us$|it>09{`bO(L77w-GJwN+M*YUCE?T_AU z1#_*=hSRd1IRh)m6O3iT&?PTr7RO!Dmxs|-J{;e~n0^ix6j6%V@!rIK3TxZDoIZoe z*g7$;F}XmJhz(5gP_6zye zG*lB@59bu_mt*SB3w5Mx+_R-^sC3rroP8hmJh}~DBy8a~A;@EhYY(HYsvYj`aVr+LUyBRU z3Rk6?a@4*1!p>8A^Uj_@`2PCge4*!0i2hT~`Ch5OsylKlTCIrjy9^4em&>KvRaD~? zuE_?#%d^hnL(DX0Bx?WScT{0U{;DK1)P!DPjHZS>UNtav|A_&B1?i8}CA~RE1ev{7S!%Jsh&w7ZV~LB|KJ*g)+_ew+6u$(;%~ zWMt{?#_%+jJ->nW^KDb{vOiax{o^%TK5su-j*YS^~)#P(lo6G$7#5zS}Mfi(@&4W9GM|TZYF{Lp>BV%VTL?0(~ zk-tf;%Bs?N(!@v<(Y_?DbGO3AAe;F*gtJrSS=Y;FXEH^%#hYceRJR5relGL7<`$0w zl7(I!nLRVU@$ZKBA5y??`3>Y=w>H$##AszWqX+06AAZ#zGm6=)oi@3FJ2rd%VaTAz zLg^%{T(iPFHcN(O`^!0Z=YyDA+oGj!*PfRAuMhvdS9}FGjjK#!qNlnx{OcB{r9&<= z)Nt^BefG&iKF}Ahz9;&tS@!?Df}ct3&!3+9^DQPDI$3oaqOlt#Vh&)H?fIc>*rwHP z#ggd#OkMl@FlY6w;9}^n3iP*LkwD+h7d-8Xt_kTQ2 z+<0y#7lp`)eisjX3`G2VZ;u z3EnYJi=+U^p%)3>xX`_05k>JnKK}gDdN{pW_UGH2q7iD=N|T*YAFU-^ji$MIf7x69 zZcdpK1{K$~TDkMPgD7zXo|=Zn>SQs(2pUSIT=~mKOxLt2l`)L z0m&U2xb`AOjHN#o`}5_ZaGkA}RPXn{l#`am%#qPn$H1M97P=Su_3w`M&-b~pVUVPV z#i~-KeZDk@m2RP)OZ zhQn4@4f8Y_>a7OOq7o7cCMPGYt(qW)hK9^Go2qn*g?x`5J))+g3(KRSq?FXuOlt8b z%!y*sGu&NhZ}PgSWJ*_VJl3Dz)0-p^79G8sr&6r_k;wU2lTM>vwS4OsYy+VA2|mtx z+<=;z+Hj(PVrt^{{T7kb3;Vg~_h!nLzx+@CRZ#ukQSeO%U>f@qxVN^jROPk}pI^O7 zJq5PJ+u&$8S&HFUiqw)-P{_c4Q^}9cbDU_sKH8Tbu;n$yOGhWR9Pg0-rv60Nl+VZ1 zVeK@hpgw!cY0Dum#y_El=PY-9P6c*=)Wxbo!)_jmqDGZ@T7JzYM^_Y+koa}3dQMe~ zE|&XGUcbw)KQ&YX$DN1>3-6fRuDS%r)PGs~I$`kjlV>!CRW^OyzVyW+gUgP|F5<-~ z%9^p0Zclt3IDL4_TB52VMl#S(|3q*v8i^ez``F<>KYp){*YpA~z0hIb+>Onu1zsEDG^KrXH>VP4JG|bvq67 z_D9nfJm=e=hgWa&#?@kCViI^5J0cnB>-XM3=bE)DI}o2AJ&m{CGT?Ra{{;pAF6MK) zgb6%XHA}HiVEI=MzW#U)mC$Y>NV(itDWfMVJ6ohgx2r!{(1)YWRL>?eKY!S!;Y{sf zC%{EkOG``7=IF2@N)^_FPIFSRv0n^RfMXmhEkAL_#m2T}LO2;d$v-M}czB`ie4;ZW zqxs*!ly265NS4mO`tGzKiHFaxoI{b5m9?~k9vmE;ZkW2@7hbtuzX7*et*psZ)EUbz zV_LiOyp0qS3o9%l;%>2oiHS+uq5pl;s>N{sYTJn(u07GT^mN1xd^($q8_&nL7D6P3 zC#x)O+{S4)B6`e*^9%X^-B)I0fds5fI>{IqZCzb*0s;axMdYH9iQweq(ww#K7O*9E z0hvGBgI6C=8EPfL8Ds%emDVumxQ^wL2`9y%&`8a8Hb+y*2mCz;@q=5194d_lQae+~ORl3^L zx4x7KlLThHR``7C8(K5a^k8Gzy2h%Tefb+0%1|Jw!1!&vcB5$sCC%TxFTdVr z28*&uwc<^&(M59v`0-<;Y0Isf(iRpa>t^RZ12;A=okn4v)oSX;M#HqQOmUyZP_~BD zc-sdp`4|LSu8ah?oQ{sp#`wmJlFQk|%>H}c^CY#4iu!}RaufVgEe{RHmmu@q=3IX~ zlkIxoiF$Vx?5l&GS%G6cgG6M@H{TjyI-)Ks`_O^jnjIWWXVrvow-n*LbZxW?4WH6- z!lc6PhGTA%UV_sSnwKibDz~||8w-U3N^7>hs2$H5g? zUR@j+U7nw41`wJY>7RlfjVzRFtW8FjMTGtibo@&;ce^BoC5X!I*hk+J1cGtP{g`(0 zSo71B45J?Iqg&sq&E}uCx<>AC>u(JCt5bzNujKkWe5TL;t%;>*xD`C-2=+sOb!sO*abc zn~CT*RULPl<52FiuNQuX>#j~p;x8*JyAE6{g?KWt#bc9}17i1C->7DIl`pfIFSLno zVCC-VM5qDF2L+y{OdIJ0N6^299CR5cc zg9blW;r^OP|LRq54}9?1*ok@d_csEak(*o1VWUhTqnnbIb)?AU;SCdG@)$5X5DE0! z0!i<4S{w5@vEj(1iy~*JwDElW_>tpVqQ}!i^=7^On^n-n;l%{MM(xK|!~8u#HOkpIDpk z9fG&FcWCTn)m7-?!U9|Orwwb)VVgAbiE*2T&ST%zvd`)=Ja6gqT65WkN5`iJX68Za^tPvLpjk1?&Fw8O*xsvuO=9HOrkea zu`R(EBO{qZexJr}A5ga$JU)allEC-?p9HeyBmIX|R8*@2G&D4*_P%GEH4OSHrT8c) zC=bj(d>=!194Fc9PbB~98T})#a1tOXGL1#l`_3SGi4lrRO0;%MwODM)q}?EW)?302 z@m%tvmzp}T!1_ns@1K5e17<$=AcQd1E@n8BA1+Cz^Nu{R~wP%TP0w{!Xj3AeRuioSRKKY}EmbEv2}uOH9OjFeqbn zaWG;uS!t%ZF+XFl2o0;=tX^Z*>n5mDrN3ITo)}TJ@O$oiFA0E6We{jV($do7Wk?gp z?Gnz(NW_kXYJ1=?Hx{c^SvC8Ww9^ia%l`Z>#Pd<}AvuMWNsFE#u(+VENpORs2t2?i z6oElO7?$EwXeh?|`ZqbOH4HwaCp1VYD@VKF{AM@)yHD~$k)((?fir{10}cS5=qFlU z-JDysg&^Gq5*{ZStL=0$G;hQ08bJE9#EaqT91LVZOb*CO9zVB+HNI8e+hudIOCJ<2%t5RjYRC#?kYgU<-T zXd_)Ou5x5Z6}yEW72a;(!}_m%h`%R+-;xmE!p{L0jyGGP)Vz5K7;AhZfKQ>};kb{B0(dXk68*jTuAjq+{kAIf z_ssLNy!~ace_X{kJQ%ZTiAu2~DRewBzgUrQLHQOI8k)N0a&-oym8$d+cLAdMuH{dQrLk48Mqoh~-LJ z#HqZM;l=TMzz9H6=}@T17%jUs5$|bVfaUSm_iK$e(ANhQEuUX=`-Wo66(5LH=n}ye zMw4IpDXaQ3$C*vP4@3Q^WD1|0_g%fB)1NYl-8W^5WB=XL|>RNi4E!C{j{=Pye`f{H3PtvErqR*R=LOhOie9rOSiEatQsXh4|Ht(qT9wZECJWuILD z85wTXU2fEs;3^kleFY>F`1Rt~%_!fK#6eV46uA8N+9iwcWI$2MUCXbbPt2Lv7*?~H z!jUA-egJd@NREWLxq0TBQc~ComC**`^9~qh$Qd`8pp|VZE{2^>zN&vU+$3M1o(GF^ ztCAVV!*>Z?_rk-%7WK!&j5gWsg#Gq7{^nyddvr(r8NX^AW{97V+xq&ttHFdZGpLuS znKs#N9UTJzou_~VD*+P75QsM_2sDC?w1GR_aMuZb4fqq?z2cud6 z?Bx~m;|(_&E;dYaQd3jQvNfEZ4=_+s3G-f^^my1?A4DS&2L9^v|FaDA`y+I#yaTqw zqoc7QbGp%-};Ktr8vV7 zP;uGh)&TRi&PA6qVCsu~`w98FntYyeTAoS;;viB^PkeHmf*RQbWG;pPjkp?1F+L#GzX7 zFpHzAVf+`3z>*-5SoZnAmLBg})KLRY)4dw|E)PE;ZWzY23D)Ud{)OW?LB*}s2PqNrd;g@FhP9tu4V zB@PvF&JAWYr-PyKLQRkPd`_FqK`aTbuWCSrD&49-v-fxd(<}+i+em@TW;WT=@B^|R z704SH81&|1U5~q<2J>k{0h~kQd|}^ee+2~^+v3vFsX_^86+C(PcE3-EhKx)Aa?Bum zvfIIMBYI$9fCZ?UW3&FOGmcD&ao)XfL5C$*Q?}rpIvxZ9VVkOZlJox!YIJ7;=14d^ z_;|b?92^YSlAD)@mboS_=;Ty4zbW4OW+O5-Hn)}7MHNya1~eR_viS_Og_EoGIOKD* zp{uJI;pAjbTB?UHrIVj2r}i4I(Fpq-3Z^=x$bRsCmP7e2HT1#Dn9>)dp`ppNQstBe z1CXn|XqUZ{t~hp!txm_yxTv#}+U|KXVw)wWVY_%GkZZS&96*#Vna(!46$9B5il-M# zsuypUeiG2Ut**H?oTo0u`1;Gup327TXWJrbOkOY$5JHVJM4;TWc@o*d1% zaI3%})M&U|$bmw56v|vFA(p_S22d_N9;5b)=bmw)omU%tq+6f@g*jiGt|a@E(#D*_ zijxL3%5!7y!4xSM+h4YQ{{7sDfBBm76MTP+1;ZyKbyakeg1SRE?9r~c>y&9$*&3kLmj}F)1SV|l1}5ASYGTxfqGq>9o@BU zS{*CNuxr?*{etV}pqIeoqPV%)fexZwdf=@@y01n@Kh%7av?Y>3%Yv?AZ|+$w0vwsj|3( zK)(E&e0ZA$4VNf#=KxpSqfTIw0mU34zUb3C8F6;O?axk|Fa$@ZQXWb42IyV9S@L<& zji^u{iAR^~KX$btI0rp6!|)Q#&xm6{`}h{K!HZMl2PHhljW)L;FM-5h-_oqWk8cU8N^u-((O zf)2o|ND69qy)Cz<)xashT91U!&;zjAOwrX_UCuTtVx}!-`6*Nygoy0EsIyf3Pwwl_ zi@+2IHyC*<(U{dV!RZhzuL21(kIT3BWna4E$*!h1(_Sczg7|oaDFcijIvxxu6a!Jo z?tG^;O|8Z{xZ9$0uGvQi9FL1|U{A=~|K!(cQ{NAD`tSV{+Z0Z=luGwP1H}IZhRb#n zlCquT*TanoohEmLeB(zVp@Gl+?pG~nBCr?^2ELi9ZV#oB(cTy@>(7uN9y7>@D{XcH z2peJ78;8aa#{!p5SvJrM|JR`je}6*$!#kTp_}b^}Mw^c^Rmu$0xQ{_^3`*>BP73zq zA8t9rsRs;Gm%V!*?LKp0-Qjo#737HZ%_OCyC9ERpj1}uFUCp>$(K*+xuh(qVn*-Ie zE#6_13M>Ih$?+e`QMlU%^3x+BLaWfuD5eZPFFz3G?YoN|Y2tAlROY;#rVSV6U|VrA z@*1GzqlUU}bIyGrgZJjX^&h#o6Mhg3Cw&r1MmnFp(9%Ev6zg<^hcbS}(FKJi{ga5u zGgm^&R<8YCfpG$g*thQTx4!~4{SoLTzo&6-4}JuPK-loLxPyLxdfa%ToG$Idd;srs zn!X1->*QMxAU)GP%1elwu5;)RB6eC3;jrJ=ulknkqiT-wGammZFM@>=pE1TX%P)HK zeZ+jU@C8d^5cdkOtTrILB>L@i**v-5jp^~ zXh{AHfQ2?;inxblLjHp-4#-!hYYbHYcc+=o)Q>;h78xivQ86KSC;2H0qzjr$(Cdo; z-QcPPb$5ycM`?UHFf?qt5OOhibrZ|$tvev$ttNw|KlLZi>1(&2Mi98eIu0;iYeL}p z9~nP5fkZGy`|zc>3PM^0Xfn#Ev?jP*QYomKc>)aDDO)*K?^FYc)4aC}j2=*@qbUl| zIZ5OK&Bt-eJ3OFiQVh_iLkm#&q%V&euBztx!a*T}f>qdRX5vi%vTK8Y6E9k?Ud!)K z7sHP@2NlVtoy0X54cnt7fVjY~;vL)JaGpws7aBgTR1>d%nNR=`!rA1%gcpD34Q=Rf zkM>fcjCIP9VRMZUfa(*VWt0iJ0O06OjQ#v@#>FK|xh#9d3Q^tE`E-RssoXf~q@c?f zE8b?>E`D0exLp+eamsVQ;D)Qq3HopVaK)n`Ce#3eN5DF>hC|tpz+`6~;HT1E=}&`+ zL=rl&pe!q9%Vq^jlUu{UatT-5-B^=}@^*x~swCjqGIH-Q8xFo$9Vsv++5#zIF)JfJ z7#WMajrZz&p8Br)=2Xo~zxynuX4tDlwFW!rL;6o3KJ#EmNP7n5`cLp`qT_ey{3&xhXOKuTz$nsns zYbjN}O@ed*kp-cFBndFoUC`4(X#ez|nNG;0k`G8XUNOBUxt10PT3C@puZz_#z|5r# zp^yllvYDB(=~K{fDw~b)lgyHSG@#W3l$>QHRdDmWm@{I{z4f9=FevqatSg-i&yYhh z85#a>*7^SzCp9Y9#32e${O^pVUc5TSHV_gDIBY)pZsBAUK1er&!7jf%HOR4nbFuhAcn zeDOa3n?Gw?pd%=^!p_8twVsO|5fKp@&Psr3(cM726=;93ijZ9*nwD-GUaR8}B-#DEeqU905Z*l%-3fK`5_!@m3R5&Z#@&)G(rXzk|1pe~iK9V+?8NIH4YHfeW zZldM8SFOMJFJ`fJz_n%ll2%3;Vb%AcA0?f?SZwGx@5=-$D=`ZDX{rPZT!S(lvp!4y z`sZE%&4ePMl%!>bLyRtj9JaZUUHoL|-20ME0dD_+NPm%de1}rX@phPy$X~AOe^P6v z;lK5@#Gq;YEkuy0h;_W2;Gzv&2{0{htkNvScpSv^@mC}&rQ%fCT*abU1<<%=2l+hh z8S?lE%`n9+^!R^v>E73_cU#_d6JH?xOAh5TBYAB3O_EBjx^zt;T@+6Vupl$Oz!ELv z>DnqEqmg_y?zI{is96E}ylu~ZGyA8}Mq#w`)#8nPK zZFRhhv=|NUmO410NL40i38;EFwH2@&v9zv0pzX5~l~4k4GW zGS{iv{)DR2pDJAB=eg~ijbF0(6axBkGon$CuWlYYW%M+VY5Dx%B_srH#sOuY%iOD8 zB=;NBiy{Gx_oR_wM}rqOt^p-N%&&JnC<{>pSMcictY9s+`QqV}U3~MZ zlI#n(Z^X+^E`T_YzI>U`wMJkzyj6D9!O+kKpu@siK|^?!Oa>Gt8UQ#L2E**Cv8NYD zGa06Q?yo&~urLQLA)Y^mC<-^`Z1e6t?$o_mpgquF@8B`%>URjLG3j+<`$~NB8Y|H= z>Y$g)4lQ_)Ar?dap3piHG(Onj(&B&?c?y0143;s9v|6EKdI@x(vsuZP#J-w{-}CMC zF+L;Z!zb8caQxFNKIGSlaDJSkSc$Cdkh_uZhKWh(3~#H3)4;Qg@$<~E1@!CG;|mfR zMQMMTXOhOqjWmtm`EJ^s7p9_m;v-_dfO7-4PYGskV+Vv`0Wkd+PeVo#VJD~FJO|Ws zX>JgtdMPUAbe>mbfBd#)A3pkNLJ5wQhjd>)`5sglkG-~U7{JYa_kqFJy+|BcA5^kn zptIV^89A@=zN z<_Gsi5TB`l2QnIuK2Fk^r~FWI8xx>7#oUoR6;`{sj}*HpO~#LY+|varH`Q8BKv`wB zExfGOhTB1*ihZqd2H>*p^8l7@Lo9OR$x5mE(^VRUVGtxD&E7a_<}a_Ax-ZAs#QWZ7 zfnw@xT!9AHD-TMybxZI5^Zc<|t(SxxEd9F7i+I{__# zCw>OXwap2DM%o~}c456Yz!aJv-%{XFG<&ZX15k^es_!aP^yi7ve9CZDjyCU-yFOr$ zsUGx1F}2D<%mh<0Uiof=XwMMdxk>>J8WNRq;~)T~^+b&%wl{0G#%)l`2dKtDCRg&h zO{g3=TxAA&giyMQ$p?g-*82pXU#T(!&WZ>8QjS26>3-1ZWZS{M9BYvZ!f5U?$rICB^UV~6Xb%te*L6A{in9uTqBj!Q)yrXdSWb1Ynga&Gn z25{dZ=24Az+!e0*Fu_g&D=t;QDJvtA4`3XW$HpClWZ+e8WHfy81DIs4S9+Om)B$MZ zgQ*&uh$@Ta>STp{RVo;62AV_F9Oci8xG6yrvE@$@Z=1YcIv`FjIR2Q(Br$ZY6?F+r zaU=UrYyD|2Nhmo2Ad+*uphd~mVFxrAu|-WiINPkK$C~c3PKRUNlp~iQ3sEbmS%s+r zLuz_|cV5Nxs>qG&*k*ImrR=w$r=8 zbQkAaV`O~kV_NOOFG!H#??a3!!K90Zb)M2ISoC7zZRe1w$JvtJCj5B9DEuTNTmCrI zvXARB=#@(;)51VkISj__fcO*jK%&Cqi91uQWxsH-)tbCpaXvT9d+JU(o_MRY9q%!@ z@N&E0avqXSV}~E{BYX#^Or&Yk*`XyMSe6JyO#oPqYny5^UYbSY5BJ+mb6db@J5c1b z6Y9hb;@d>tu7+}J4gbXad~jnV-~@Qj!dpK+a?K4U`Miv17M%Dd!kUg9h3d?czzMo-mVF)SD#@;pF|u^a{S$=WNtpQ9e^pq zz|c5OdjWrP1!Ptp>YE+-XGN7+`3CCghiv8H@90L*yAcp1 zGGLqWU5k9RVgtfCsHB_YrAP$*hBq;fW97@|f2OG~{MST|KODX3UDQ5%A)rSzlt zhcp86NdePyK#PQd{rWYU06OK;JBl2+Ad85vw&^AT${!rh?EnQ8vRH|>;{j|2y%xHr z-UVctWsXgt3l4>b!L;KtBMJtfLWx8JjT9QoZn01~@BcFBYzl^E7r}oL!s8j3(R@U*w6B9kO3GghPmC{7@3{fx(KUSI_(G0&S=6a949ghXsSZ4+zKRCnXZ{V{1i&#iHAoG8=BqZG;n zqi^W8dojR~Qq_jPl?ZYkqYhX{6mW8>TB0k~G)mRUO?*x*33DI#N@ZhkFwX}L4=4R7-fL9f} zH%w^C;~ev0t@=|X;mAksSwid?J`Z?R*5k1oODARNLPhV+K zA`mIm?p@~MCPw$Lu~4nnoK~(1-T;BJ%8^d5R&85;0nArcX{~zN^<@;O zxN17=cCW91u+AL1xJ)7!X%H6d(+AWk0lK*zxd1uV7J8WHF)1{=e>jWh69V-J_0_b) zmKYT)zNnc=X2ARUi4UZj90mcyq9>P+7g1bRj_{x@2)aVHTB9b}#E?MKaWeaIaDXdhz9>%Cf~yVJ6_ z0#E|vEkl`xfcnI$K*dfQS-?G!s3GbH^Sto`-Mibg^4=lO1Bkd)&E%Dh2vV`rnT9dQ z-QIMf;0f%*YoEgl9Qo8g$}OtI`mj5NvGr*9qWe?ZF^GnD+|(1SdYHlq zu#x2Dr?c$uE_!{*q9*A@t!gzlN?$qaZaL=IN(f9xx+l=jekbbkpy`zYxM=;}d*RHO zgyts*cDKEY)TV7PzJJXo@wluokaH>t~)sGSmW%M-zzEeEthY%xQO~1Y! zjpS#@7L!@G2*-TrDQ{Q|-0PUwW2-3g`s#)M=J8`9WGr)be}0E;H0aop@g|MwR6RPU zH@oSSUC_QM7Kf{ungZy-o5wK#Krf>}A5$_Ms;Wr?6>) z?F3hSqSSV;Sc0zt5t-5J{J|`XJhUL?l~Kw=5-ItX>OV9AZ(O%}r?YDHFB={hI%S_4 zJ5B*TVG`$|GV1m!erGf*kW+VS*}5EC-h2$J8og@Fup;DrSwhFW=Geo)0Qh5f{MwP= z@>dw%VT!2+Q_Hzm0N11v5a6~`zI>T)*_K0FosoJ_lOiMQn%o7JyZABcKr2^^$J5VR z-^T(YRgc1u*^o~Qf|@LvAo=pnsa&ZP5uNBFik@@BnPOlXE&bVR4zS$q2K1qG$8g%` z_ob~w4xJ_S#&l4sTQao64M6xrTa+RnETTqr@+uDAu=DM{IaTEypadH9jGT z<+(|;4>)t$SDop@DBYQvSL=(%ahuCt4K1F#0C5#fN0_nK&TSvo_e(l^6%pVKsa|`k zbZ(t2QbVjmjOau@ich4&DP@YeDI~=+^0rg4%@2V{F*n!YjZScrtLKbo9v}+VLrGj< zIZ$!Y2)gGt)px0WDi&tGC(`7+b4xEJa5k);Uu@o7)I6)}9zS$2%>#XZnya=TGE@!& zAnE7Z)`pw|4Ekw67@+;Kmko)R^XETM8hI;W7#Hjp2eYV@&`wBGsgO0pKD^; z@TMEd8v=8lUDtXr%r@D>TTj{*!&;DN>uY8;ziX*OWjfgc?9-^w?UJB1vs>eV@Ze7^ z*IF$L_BV*J^@On%uyhpGeu*he=V8q8|GVa^hmSUPoB zz340I))7OF{3i{61()D_nzg?+(!-luLy~iGKJK1lWZu--QG=Ohq|}+<7E3T&gEg$8F&>FmRSU89+cRZ>sWy||GE>XG1!&zk?Zd4YBd7;>M{&9S!Xux&o( zr*p(iYkUYD;E!C_jRy`I)le%_sp0E4B8r^O!2V)M9+~K|ZhK2IUTmk-n?_$jn+{SS zsB^&~sX)q|ubK9Nm{J21t0$V}rGwh6Q@g~68uW`&41?goZptkoDejS6XGz@K2wNl2 zr?r^~vEgjJSD@Dp55Sf?a%hi;@A7s^0FU8@{pD6k505#(>JBYT?l7=fEJ(6yBeWPL zFk!if^PHvvHG)ose8%}KPfh!c)}$7~S^1;Sob4*6bvod~G&(mGVi_+<)J@7UX|@vF z6PV6{GM8MN@o{&2$rq)xAT%=#XcTU{*kNCU@yKwNPGAlXNiF;RB;{VidJ1YSJhvKV zs&#h=7xH{rqKU5k53;lU;Ld^KL=Is%f!1a?oeC5HAG)9d7oF{a*px=zVZ2#<&o`>^ z`GtV{bbvcUf4mezwXnuUK47*oHy^oYT}}qA;?tYbJPff`^JMojUZCpa6v6D~e0e{fxcO5Ix1->v52{o<`_Yk(c)Ez+ww(Ih&hYarhMJP=H zwvOGiv+MFJ70`nb4dO~w-9I=}8v`82BRm~31pp1WM%*Y1H0kl+$)5YVB1xF2N+uP* z&89;&F&xYcqFl>0@F8H<51a)3ErWq?59YHKM#4WqL#?RT0VVJBgseb6J$+0$n~oa! ztN~alOP$;uVdeu$bn+GNJBxNbxvg971;Ep5xHbV+J`4MSJYL#4#juEs zQn9AFIvDN;j3pKlr;xgvPXZMwQ?Pu_&O@6jGuN%i_X+FEkb;ytYB#;4dhj#53TB+g zv1W%(l%lI}(=77&s#!ize7w+6*t%L12eYnYWV6GhghM4*aAkf^V~uz|alr8`D@D{u zyFTv1B@~7rY!dtE902cyPNp8_nF+e68JETOCWU?=uTspHv?}n6eisVyZa%x%gc-Y0 zu!Ulq0yIgcxX%LxZe!>K)g)GeE|3T?aiJdOq50-9dVyam*j`|_5 zFy;ZPHlnr%-6=JrI|4C5Peb^mTV7};%&={R4sH8tomy_iNbY)?c_xxlTaP(rNI-4r zD2>u#`T^{V0ZuBQtZrPheG8DB-g&7`H32EaJyH%bQ+dLb%P=7uH>qAx(rl2s+)QPw zZUMXad%YbquvI)h_K<2~$#mhFa83RvA|cH^PbVQ^sNMT{bcb6~(_|!t8L)pQ&B|l?%9ZC;d_|f=a3M3iYLfZG9Y%uLexy*2-xDD72 zw3YX5o`2$;20G*lcFY+N$1r@g>Q9#N$BMMxE1~lgf(2@Fxb&)&lDLP;B=Bnk-z@Z8 zt@M4x3Nz7ofOepcKW=Ee3z!J1V=UUUzmm(7%H(niS{e&xLnQ&IX-gkAz8o0XF2 zm>BESL(n=s@IAtp0-c#ABzoUv$*pX;oCP57GlwnK@?2_uB|S~g^sGFkUNvf(Ha%8E zYo?=oy8_2W3G;!#nUcKl3D9C=4d7U%RNKW?D#xajLFwAP?Qa0OflJAQKxnKHX)T)o zLP*3U)rS)FI1}NDgnjF!RcGuWi>}u*01HcO<+HV1UYvCRi4sA6@GB0=$lY2IJF18C zr(B?LcJ27c35{L>V~w}P`TYLVd*#MUWH9b*2|s6R^DcO;m4&hKrw^5;# za(~Zsd_ZpvkeY!XQ4*KpMoZ0|mbU<(zs zfIuFo*{#(arIK{fIF6xna`&wV&fixp_!9G~!wl0^L^pKi@jW6G<|~(K`|?Fe6)fDM zRu8Ze&_}`&=G)|=MYkx0dA4ZDqx?x%9o`MmU;gZKV7t32C;n85>XCCb8m1+E$i5Oa z9)QJX@ku<{C-fZ>Pj%#4VPSFvgyoq$s;Qz$D2P1PFjK-GAX0Fr>ysO4e_ zJdgq*p>ifBQzGoGBH=?Wi(g-;%mDQ|c*x$;vw29tOdS>YdmF-8yQ^w8t2-opSgbN{ z9VB&1is+Bm4wq%(+8FNP%73%+F9n-CNXEx=xd0m&6A;FEQX~?1TENmUFogGBr#Cn3 zZUOm#H5Bt*!BWf6d;SDuvofqZ^VP(HC#s*#vYRL3kJe$pcA2$f=>}0{!;9MZm|%H#Bd#f>An&JL7Tscg&vVnxb=!z2#he zD`vRr-A<^&2Oq-m6i%D-&W%`YcMW>jjnizkC>cV> zi+ovdr4TD_Eox4c+$t~?Z%cTy$=Pk@+uXgy+hU?_^dz)6IO$f39WKsDtWEmfgO4-h z>v!hs^WD48#wXs)3?DS?7Me%|7sutP-h`1DSK!HZY)fVuYk7YHDXJ{sMq||^3MiO>% zZ_BD=GQ<&f
!d3&F{GAs1w)`qErRgGI9v+t-a0T_icMNT_c=HGg%Kt$+RaUHox zaSCd5kz(R3P=1DWkgrnFJw(2U)@T}{x>Be(#sN8ND2A+xyyUmOxsAZe)|yJI_{A#e z?3#4FBRE4_d(r`j0Cz{6q?HJnLam1Q`1-{L=at+%XQSXY1E4Q`a=0t?w62HJf01Jt z$Fwx(&Xm51Eo<5HcrmR_Qr_H(Oz$OVWL?PUGpv8%KJ2gp#_4D3XqE(_14&!MS$OaWOsuoY0Uu|EbMAg+IN6DLMqtG5y8UV%028%zotEQ zB9{1$Ll~CxVPB1`ZZPXZ%wcv;K4w{)5Wd1aP0(0N1J-paK}w(Fx2F9wm`O8JN`f>aVwG2=X8nRhEHS`m|_kHj#jG!xwbW;f}X zgB>vs$O6N0(^L*q<3TYuT6vu+9p_&18yy|R!DLE3*``a-ihL$^&s+H&?b{H);-TaW zciUyJ=(ZC3+Hi(mhTGO+!|ql>djlw+ySY+rEbd2?-@61p$?AL6I&+Qd&Yn zkS>vKaD#x7iXb4;sUQssZdw{iC8ecAx<%xj8}&KAa}JN^Jm>xNzpm$tauN4l_qyjj z*IHwaG3F8=Z0l{Q!OD-Ba_zD3DU#%G(6yTQz_WRil4Dmsc+cUiwek}gy(vUgp(919 z%=9_LS@|(IsF0b=jXHU@ya{5)GvX{`P{zxf3gK!&Nfj;YaUwvY_2)PUUqV@s>DM7aW$oP`ExM#tqc7+3WQ`7!tdm)TvgLc+N# zRpcbwnHNNJDNBwiQe6V3<4fWAd??4IuY?rh()j}KOosAV7*fr4hls4T9M}qZBu*9EiV71_s_$-f|)Fl^Kqwy}ql)uA|dP_d#%@Q+dBS}p);d%%scKj(IeItu zW3cz2Ml}V8iyWLCr68+(wB*8EEW+>oau2JPlN~Bnq1>Y!7`)w{cp6eNks$Q_-nYI&ql6 zg^qaW%l1o`42Y(njyx~-9ZEKMqAzxFT3!?~6CBM=13u6Tc~czw;Y4K(RWhlUpK-t6 z1S-J-_OvgC1z-NLca%vacf)&748rFa32;{8AH$bjRhwFxey|bvLjqjLM5q2sATWOD?_g+2e(-^Kf$Gjk*$#$)S&YEq<@Q z;q|KtO0%1;A?L4jCLw3a3TMOWqL|Uq8ZgU`r0X!_VB>6?2N0mOqe`MRF=u6Fq5hR5 z)z^}mlPy%7kZbEcyCX;N4-kY7aaM}1|BLA(K}Q<=AEBy@u0LXJ;MHZ7!fJlHd|kO15kbI6 z%j4!;Fca8Ffi7v5-HCReC+JKa*tSkq0C&(X0CbCAuvOMKmj^;Ltf)I$4_ z)(;ZoNy+%kE^{O?C?kbx4XJpW2~ix9i|DWW<`-#EMr_om@)E(;dXG{x;A7?8<0G2@ z^Su5ffw9c$0F)fe=3DM({je{ZZ9}2cYt#xd@W6EKmwB?;djg!rdwG>6EMQ>2<)dJf2oCy1@q;X`X&i#;;yNb>4Ux)?yFo(|NT(2_@ldbWxcuMVno2)`4Q~M@$QUCr{H~`V*+y-Y7+I315V;fp>g6pW07xj){ zJ#b8@s$(5YI__#J{)jdQv<#N+jQ6nL<)Z~1<2DA)dse>Gr|XsUVUHYVa!#NK^* zUl`xMBqXQWA+)^gfiDwBuyw5X@gKZdx+q}EtNx-#(H%#NSH*~U1#Hf1x!WmY$FFXw zbdH>5Uk8gkr0x7t{-@buMkHWQL&5Cpe2lo}DC9{oE7vTqrYt8Be1v{>+Q-S1R=N&x8D7$y%df52*jg$V`R&XqTwlg+DR@!^i-j z=v)u>u$@{wu63tbFbyNo8tV23#*QS@CWoJ-I27JIGhY$Ad*!3p_)+u=KDrwjHtN+f zu2=1_n6J38X!G|BZW&@y_Dq zfmiNP&Z(Dctd*9jR$G5oFkYHZY+?D-$+mc*J|$<~N%jer0X3 zLJJCoC+84||-8bsa;Xo6OW=AVQ zR_}Cfg`>DIoNvAqHsMo}ZuS>NiQyQf(RJ9mvPs_*xC}OS&(7Z5MKPiB9LulB8f02U z>rFciHwx$%y$T=t0nE`8Mv4o7^cMqpR=RJv8ET7$B1vX9b8BGvIhnhZKa3Qx^`LSPAve!s`{Eptm!03J-tQ?fq7vacGQRCc z?e|!dc!{W;&;A#|NM>yRB(p5x&rcqUt_DgYd}`s5_7Q&e2rt0j7gBr|KplJRBX->l zJW)#>xzqVU1XgEbX2tb~&njtU+_OI>%B_Q@!3wlEWo{NHAWM~rUaf6K&k-NI46>3h zZ!m{YguLP#x(}NQ(8xRTIUj_NwBN<7(Q-Y(=&VG5(yZOZB)c+rl*HzC`5fb$rjk7% zS;UT@>k{qbjCk+bMSx7cx>ij1Z2wWRs~`{} zPz5%~8~%mTc05&pAEw|tN^#+j=#@Vnt9B<_tZL7P2=QR;;P1IbD`&loHI1(oQVa$r zK;sSLZRzs{gx4$Gfw9|7O5!PiHiC~Ww*Unnig_scaVfqgIG9&2chjyCyec%7h3ni5 z_b#KMJcr6&@Ucy$yeuEPnA@4|)RKQpiTs%nhTbW8tZ>2YPD=Vn4jqj+;oByRHmQ=w z9uI16UT)qjNqRG)G75Yo+q~W_zJ||sfnX>pwOF<9J^Jo0<{jo+V|zy?HMwjbp-_}4 z7tXRz#G@wj#HMcuoScj=lbHxPc!_n#&y>06+5qDar6bZLPdcut@0KpVD7_4rrTJrl zQLo|$k%V$4`au!;Zp;TXHEZH(UIv_{uoyMJtq;Jd$)KhY*5RL#a{|yX{NkqXGG~ZD zBZS;Q{SB^sL9R>wE2fWClWnkVdW-}>3mVpK zgY9E$=_=U5*e}b*YTv&svZl#ELeW_wVRX6uC7$7^K*h)yS4y3f7PBT21IsF<#Ab^f~^0hRE1#QnyC6l<_IYMhv1-sO` zNrnR;o0;wi7h8F_bv``-9+NB{7$HXY2Frlp>JuE($hETVuoTXYW8+l;-=^Z3Q?GU* zn2(w9xPiu3mBi-Z5e>$d%1~vmkv8?XTTd;Pn`8LWwKGX#GY501DZF$ZJyLDi?_x7> z#F652jdH=2^B@HWT5cCH4su7_(EROvB1|4@5NI~GCEiZqd7Me7MT)qkQI0vmYua|F zEInZAM7-5Z*6zt(=`oIE5V5jYk4cOHVfZ27>4H*=C4T-=r;kn|r->Ma{V%lR+QPc8_)N?e#obM(=I|9tzx`_Obf< zSWcZ?SMOWne2W0#)cz}WB?(R@fQN2p~zy&mZoZtHzHMyjuz zAl`evHPBJ^OSbM!JpHZGd|X~bQpX8lF#`#rCl^=hVpd|!63#cyxF*^M00h~n{=LJP zr8|ME&&xb7n|sLaVC~OJw3=J2Yu|cZyH37ZyL>P4t`x_Ceut0=L0=&xNpv;S+-Syc z>qNZ7Q-vTt=A#zRg7{oBYea@to&C-SwC`$jlGuD{^tWLbyf-8H4GL2ydX@>pNJk`4 zRSN`qA?KI~twUbS(YMsPku|p+Sz6p*mQS2Ihw0`$Ux}8q2a#AeT@<6eZ&y(CdFv}` z(a(Mv`HKt9h%S4|YJTvPX?vr#BHuLCN~nm;eGlrRCayW>I$7Ap-c)~Tew+?u@yZh{ z4;)4e+k=^_uF>z6uYOn&kRkaIgbyJI9gj^`N~c*-P5y)t?qXcYGOsK8i7Akyc^cHE zoHfe=-kBQ7?sqstur9Yu;GPc-zVz? z+11@KwHoZO*p=^;kA-E6CFA#0`S@u10K`7>D&-y6ro;!Da~fY2L#eRSh^s~V*s9Oo z;X}`%8HHLNf;~ZdBSVe4xO?{dxGX+iR=kE+1zD<4>-}tfGojkWN$s>XMPmPy;|Zg# zn-YlYnfz3nF%#`uu>Z7(Q;w;Z*ZLSBYUeH>^U9!U;MmOC5amtkt;gM{LZ4vp{n_1o z+Wb1!S^6o@I_a(8$jlNHo+jwB_{EY;_)0hY*|?1%uoe8I6#c!6@e-uQli$F> zU*!_->emQv)RBBswHT4U%#F76l!API8p#_Kjo}Q5ca|V53 zZXmn>)u0^DFfOGMW%EoJ)D^{#6dSVPeR&F=R>Q*@n z;SzcdpuD!J$~~@1{k)*jIaQ@HksU`(6Kb zFb}vBM1dwJ&uozBmg#JAg+0V-wMhUEHqAZ zS)rj2uVruW1JP5t(|SCe3ndBJKXWBnD3i!c2>y|-t(XLBldb_~p; zNH=v$R>|x4>DRBn@2iD+Va`Ge-AqKqUD%oQyR10_wA1mVM^Wh7khklQ9C^xOouiE` zd32id^r|<>h650$ZRYaLF1FA6l@t*p6M0Z2c5z*dh|R@*U<>vn1;t~JY$ScV<=?08 z@otcP+ZIUC)$*Ce~MCKkI~!YytJ}? zcs`WVN4=0f)aZ8Ao^!|2t^0nDlIYIhIE=J!PTO;KYHN1xdA`o|rBN&G#x6^E>^g$D z{Lm=hLB3n0c7*fxAMr4Y)0rBYfcI0+a{^sIh|iD|3jmArJzrD2y5eu^FkSAU6GIV0 zV2kWftlmc8a$g68i=Mz0!c1^QZ802t#<@E+m~BeKo1&WeK9t=j_vhln>&Xc;pdE)4G>1#0%dXj9sMo)*!W~%chnQV%CG3 zZ7|2q|0SkQ`^44(8W@cVB{)=TBUFQX@Ytr?m-P`zYQ;6XL8C|V_-=ZxNXgmnK7(l} zX+NnbhgKR7Bweks3aSL0aW~R^<>fgr7~r_ReT|xJqzlc4H^t2Sy@fGMGUv?h_KtZKY6V&N7H0U({s?^`qH8ghWeN0lM$M&km@H zyi4E*#A{n-c~2Hh0q1A5Q!i(s(9kouz85Z~YWB=7KzQZtNftL$eRD0fZ1^ORmVk)t z*iq5QY>>zAM}F(?a!Z-}kR84LWq@}ol_m1oa*gg5nltE`bL|U`)QoVlNj%$oAlm?L z(^tXhmpofwx{6jR4&-qepK28SaY@^}?WB~&(d(ayM`~EFeA7m{762H)Oz4z3kuur_ z46F}~8}sRBa@|WpPn=o5;kcAuO_dT9$*w$cZzkVSjxRsM1Dr$T;n4djzwQJt$CWxc zM-U09B`lPiU6(UCzu>C9c%#DIX_lEQwP+AE3c!G#y6 zG;}}4A6(+zmmZmPK;HZU2UM07yA4CRbDm#5$qRW=2j$VLi1i^q`<}b}swsAX3gzG=K`2F)b{hOm|17nOeHOO*kMGUw?&b+6RO}v?x>Jx`vtb(j#%73 zRIGG2kI~!Z#B+VgafaaGHEO`08>x8np*Yfqg1XM-3-_c~UcuQar8GLu{^r1W);4$A zctnk_Uwh3}6@jG)$M7bJO9e7NQ9b5DjG&P(PLCE?X(&)g+gtf+t1fDGPI>|Hag1OK zKMbt}twQ4m)qc z+h{zpBx_#SK14FstZoCV;#zh(3(@|9LB!kV$a~D}?ESD#I%+eYL)?-#0AMrM1KU7+ zi+c_I2%%5%$(5I2W}rY!O$t@(Qb7 z78t?p{m3w4^=yelIRX)Vx=O-qeHsLj#BE-4Av4piCGyn2+DTM}9F zG)1d6Oj*TbzM)}L)3uwaYGIyb7N`~E6&9;L`VN6jWBz@a`icm+QFZYhcVkq1#;oNy zeQ9hU2T#zSM6X=8`A%E8G6mFyk;>a9pr^~N^u;WH4a=9U9uzohr}0Lu%35(uT=eeV zdZpIP*e?3Mq)Yw@*TTA`kCvNy$HkAA@6ZMmpk)SXduEv(fd3O$>7FlzoE@@eXiho3_T0%AvA0ir& zf+~_OR_@-`Y58JXn}2m@b*kv*oi>K)U5aLT6+D{Gx_cmr+G&3h4$-qVT%qv8d*Y!1 zy6kByCW_c>3t7s>u_3|`>%mc_oQ8?GesH0`cG=|#`>cc?y zDeu5B^PH3}N&B0$kLS)V@N4|qQc2wdG&M*@dX*cMMd|u5kR&#Iw?D?rzbMi`Nx!%N zedCFesQk7n4=xSYvmW^6Tx`Grei9k6!duCRK2mKo$u3P;G?z&1;p0|6p?aW;ap_fn{HjtY>T z^WNLgtZ^Ew@NgNeuX%HVF|2~@kq0S8I*r-gK=O||-|oHsywSr~Ws%f2r(TRm;S5`V zC2CD4B=&?{(vw@Pk+(SHyOt?R?Wg3rLgn-CpC%j3R~C?o;WZ26bNfhRV{rXcaMv@r znr(5=E%6P2RI6k`k%?N!IfqYBhb*VWpZutyt{3S{$q^I2ka=*lSc{}-s8!Z|BM~{Q ze5AociotbQ%@OyZ-KHVo$WC`VUE?Pv8;GxBOd~8;kvj=u+)YP}h@3vZU+MW2dBHW) z0~nPGt?Bukj@b7gw$MU-dw} zifDbsQ_X|H-cJiWOkq&%DJ9&f|hCMujT=i5H?kTYIyT30uKU#rlUCpDU!cDdI}I6r#+V*q-1-!^00 z_L;aA0cCwq!WqS1p57Kx@6~y;jPJ#miM(ews4T#lyt}oY=NL8KLX?H z((s#C2KWJ6#vwLih;>jEKL*V$25aDhgYCE+x~z{&@pQu%1#UBpN%VF?jjjgm6T*XS zahEz+o+JULWERjzZC1TK1)6v}%G^5{YeiyitHy|~b7sdtd*)O@v ziP!aNTCDcNt=fl10zCT_KRc!GYLLCp7LK$|Ql>Rwh7kI=b)R`R_<(VRI*zKG181z1 z-c(^4R17tpLF3Bf+txaDp?XyqiP+x5+&K&L&Zt(Uiya`6N*IAmTlHC|3NKWXLzBK{BQSME87 z(~8mfu%Pi|ZsBX;2*R7L)@>JvAtP=K>iQe_1IwmHq@Li-a03LQK$kuKg=HLG$oDtU z7S!ya=qe5>{eKY#f8%C&fH_XK=cxs11M`tQ&9deFOii%(+iPCxt7Ef3meQz0jzoqy9*Jf zT3)8NT~#c8n`t*j{0 za)Z=`XS{v?^Cz6}lg>)g<^Gt?QdE(Fm~ER!FgabR<;W)%JHUut+_8}lYX8vI?xyNf zQBb}{dVQ&ubUZM^0Jxg}oN114KyeAG3-9fe@IAL1s%N=DXSq78LjI#=HzNYG7_@=of%rq z4KgKm(H=}@*RONDY_@s&6~>@y>&>0NnVD~?R16+j11|4uxa6A*A$_yni-Q^ncp1?wOgUh`7AI#N8~Nek61ZMO z*9SwZ;-)uVNTupiuN7qpv5R2qBo87;-9}Ou+VWGM&NM|kyI&A1=6^Bs^g}g}nD0kN zty|?)^!B92MU8%Kyk*VB6{lrzoU8Nz{eE}_eP?-53knM$Mz+Tl9Tqw!>=}66J4b0( zHZ^-cBknda#e*(?C_$@-iGDSInUcX-p@(H_!QEK|hQ@FDKL*r3>T_t0;_twKtc8)z z5g(}btdAlZ37E2l2PREB42>1Qn`?3Hl(87jh9h$V`VO1)2hhb`j8%Ve(U6igf0JjE zF<>pJlSKFuFJ8#yM9#MywnoliqxKP?Y4C zl8MRl`lc(AVK`{a3e`rq>`sDpQsjD{NbJCgL*cOmN=5#041~Q-DLM(IU0$Dmw7$D6 zpY2Fa@M@$)*?QVz#R#YgTK0^2L(QnK8P%^RbO}%!jE#I>--#ER9)xG^DQ9*019tSZ zLr2)Jq813#wya*WInyY^m@t893SPE$DlH@D0MG)o0>5#Zz!~i82QYgb zx;Tq$=gFq32iM`iZ>6M>Wy9PnIVVq^p%~8!AN~X-#v-?ANkaNNtOMP&D+7#B9-+)J z24ANz>b`M)DWFl~nw~ERy}F2qPc1|ydj7@|4@JHi$pnjY%sRrKqQC!x87lgI+8ED?p-r(3!!w2_6@OF?RQ*lI5{f|vqsu+Pe6 z=D1NYSAn@|E`NIUW7Pl$rp52YgQ>!t6fGX%*?X2MrBQE{AIs;uQWvRuv&z(kn*UUL zUnrR|#(yf^zzCN3I;V;;?+oD@sDA70Bu{*TWF^s5zdC`z>Sf^TuWfC-F z3DO;rdDUP){PYkb=6bBlZs)lpc?u9SrK;R~k&Q$ho-L_}WHRH-;&)}KLYf~W1q{K;PDN7qYjrf7>Mt*JbiP>y=T|86`oyozZ=A&{@V8E)Ux&G4Y zC$xZ~UuG%ym@fEwtk05Dl4Rz-6aKbsZ%%A7($S4Z?wJ?Gr&vNWAvCV`T@{j!i@P`x zi%)9>((#!nz?JnvY|zn? z?<%pAL7k#;L>mK_4W9A-AEtFXx`wo!jV`%WrD z;?(n;GOO0wT86x&-G_0qU06XBf|yZ3q-x}N0@!Z7m6|%fEm1S1eJi(CF&;~{V>W4x zTfl$gG(RnfrNFLD9T`opi7Y%}!{s|fL^OtX z`%b3{r`FqBKJ(vA_BEfVzQgRR(Mc2tEZod}c@meP9aFUYfxCxLo%N*mE7z5Y;^U#9 z8)9uru}mX)LEOFAT;!hN3*;UJ;8dH}6R+E5_!Nt&b;f6_7ZVu)AhB|V-03F6_>F1` zn!Xzu4xHvl2hT4!A_i9?0gHAXDz;D?Bx@K5lt{p_D?NE+5=kqyqFack0`*x=l zquy8OKlY|UVpFha1#LiIzqB-!`ju(+JE;acA)ZuYs4 zdqw#~uRs4lvWVg6+@nijE2lmmP+Cz8E^gGmy1n6<5?_Oq1c^-wO(XEiE-_7BnCWk~ ziog8cVT8Y<$WA}$nJ&v9RPSpGlwx_(J7+={->8!W@tONjgWbTphCTYv9vFk~l!cGo z3F9mGo)%1-)tV_}oY86=>@bOE7plUERA$2YWfQc`n3OYa+4DlGB_$^%=C)A@&RODI z-7;0cpJrcNW4V0)=>@`)&H><2CPiK@?vh)%!bZS$FI#7$;A4~?NA*dQ&<2LBbIN43 zQrh=PULUDkC>=81ULHq(RmI%H#?01~%Um+6{9e9_xiyx>?sMI1W|KG)N@tKtPDQX} zGx69AUWnG!24av!Bf~2U*?FbcSDXV-OteT%8k8d`xRbu81|67uDHG23|XT>*xl2V zA)kqAWNGwh16Ixy7#5LF#Wqmt&3dJeu|Q*?7kOLhlA2@=Xi^p->)>S&yt+yp#GH#a zMJgSqc_}aCo?Q`Jn~+GO)nIPM!ykx1GRCS!PQ3EHT+@1yFuRM)jlNkk@DlNBvxw5> zvbB}5T_#Kp*Q6|Z3?*+la6Z2rtr8Qm<2ge53bxQ+W8Ho_FVV?jY%^Sxt*9wIs8!Pt zWTWD*5Nh+t5awm1SZ+nvXMFWS1D3M*N8cxA9JJ>zD;qV zcNWMq_L!%cTOSX8L7Ay*B*Rk<^ zo@+@}%aS-7PmR~c1R_kGzy#uu20Z;EWo;_`1p+MucuF~=1yy6`6u*j;{X}O%}xG;EKbZ=cv?TpMT zt>Z1){N%`56qXJYxz^WrC_DI>t;qOL`x^C6l5grbp9DxkMJG57YLxyqC)P605IUib zbVvMGSB+S)Q0AHzO|Mh)^Vh)DFB&kz*XP!heWkLMPuwFGixgs0&l;O&j_3^ZKJ^qp zbO&~co-2^(Ug6+c_hc%OBj% zD~psCnTc;TVzGwCn|k9y{SY12r>u^&Y|a%5Ln@rAIZK4gzTZaJ3e0d3l*Va6auJ`n)(3fMebu>#$ksxOKvj4 zx^vW#O5e0@H8{+lokBpl$z&DG1MXkE-N`bT6b5Cz{ugq)1bCgw*7cG?T$o(O>#EEp zxErk`!5Lk*nUB@TIl`a3JS)6k0GOCVM-;fb#u;IG#xN@^4{3OuhUPD8*aKmOxsD4# z<#`j8WYy?$AEBYcGj=$WQ3sl;9;?$L?&|;>y*8`!tgWv8BGPwsXGc->xMI_AyG4{* z9nQm1K$~cVgU%;#%)92|ZaxX&YOcj7DhoNW^s~5`pr{^=JXyWNyBB!-+Y}=}_*&b; z4a&}+m}N5PLiMG=z~V`Ih&%t-P|{G#|9Q9@lud%T5T2ec>#D^yT5o{p=D*kmWn_!d z#3W>d&1EjIlR7`@Gm0vVD5FQ3_}&Aox6bntA{hg@Yx49czG`V=arq4CH0CmOC=b0! zNZKS(8X@*+fm|>bMfE(sW<>A$>TQe{vcd+y*1!F~Ss!vjQHZHI2)s2+u zTEiQ#ARM5uH?9!A$L;1g)o-%nsAq^T22MNB%-JOkdN)vpzOFfTX8PnxC`k+7z%l;? zzt^&t(A3>^8=!LvicRsS98`D!+ z@73*i^;}&6J)VZC`_+Cl?Gd-}Gm4(1_A(Upj~H#pk#0E;$FyP1VWRI!%Q*5biDF-I+ZZ(il056=-IJzB#brV@6zoi8O_WHJ3nQD{AqM5MTXRXts-0%EVENriE3Js6 z_fd;ks~bqRu&w)!drhzJVDL**h3UlT>IRYo+*n<873uk6#r3$)vXog7khKSoMdwit zNC;u3Wsp|JkR9(ijYXnk@PU?WK3Qwru~wTI z!4Fclk91%~p9I~g!!c!-wNlm;Zz&xMUWrlf#2l8i!0!g@Q!`fVxmB$~fU|H(oE*`} z?stjmh5R{-A5V_GzPJ^#*IOO_+FSPgK`HMOIU2jF-!0*g`y{>MS6w`!=OG&&Xtoz3 z$H#00T`X=eP!%6daCS5Vm$eLHT=r?9I~dZC1%)?lE?zGE^} z)aO#t0i>~*lm~l$U^rfjYX}N?Blgm{e?K`SibWTC62?aS?&Ie0J8_QCpOI8u9&Wa1;~Z!z1y%w)RP595GyF!3Q(&h=?nuua2k;* z3U0tYnMw|%k&A1fL7C=j=NlmOA`9bXyE35Qr3!2}8 z(aT3tpLAi$i4$cwRZ03FhiB&xznlXq${(z_A799xS%y++3sfQAjRM2j2JC?W+4sC; z3pi^EuU1rZ)8i%Fm>-9Mf1B_hjBtCIyEHcT$D*ZB^i6TQGk4m~H#R{fniagF+Xl`| zPErZKQ%DdNco}j0)RAD<*ho2mz%Ly%f&y+uf*c>p3&&F&`V>5$e+}sEScEn@b22bC z8U{DM?Sp@Mu^p&8p1_U9K0zt_AJV+oUph3{E$7jxtYZ#+C3e2)$b9dSgK zZkMN-ecxg6f;i(=`^VUiLJl1jiEF}*u>vz9OKzhbT;WPFZ7$w^cq1-;N6^qQjuFy{ z-~GQ|L@{$4*514JpO{HLIR(ZG!J^)K+=$zyBe8CyO32 z;WJShp<%;;`nj?l`kZayZdbTBN!4~e*F-Aqo_Vt*7WQdJ<&RE%dS#2OA~^?r7qc`%EzS{%g(1 z+xiSYzL7z&VJ0%F@0h8iD6;WhQFCNx6<$xb8N5WIf0>eld!;*v?q8X=yOHN30&bYo z=C-y=_DmM9HXXw}hpnN0a0&z_v#V~GaQ<~d4`u=f-Ip&)8Pf``EKZ7(Ru#G!DE7^e zT`Qjswrzv`P+xX0esh5kdTa*1h04bhymDax3f=rT>lK~`D0GKiv@p-e&CMN>207em z3-Jl?WC)D|E!RT3z>Y89obj9(1({$w|76Ja6qirzE_OX^h)7S7S@dUgKEm<_50~y3 zA(z{zL)jzeewJyO%Yx*(cO;-%&qdB>X=%wiU2v^|He>TK*|^;5%972(EIgAfT_r=3PM)SYY$?}!Jx zp_aX)Bf!Iu58!cI{iJI?4KPH9|LyKhIrohH&P%S#W4bYnUce$*qJ@H>7wJ>^vO=HI%qqv^ zzIwXbf&;zJE;aPzbm?*S*avfqp!F{ck9zrrZCS#<=a|iS<>LZn0z2rmz2V9<$E7M)MX+>Ol-?C5!@#g9RA#WEhe&I{ zEd6NTD$@bL&zn)_!ZU5aJq;1PSqHF_JtEG&l7GQfOD8^WZ+u4|W^DgLS|twm&^$TQ>E? z74p|4u*BFt3-}#6Wy-SX$D@iVtj_$L7xnULVAD@5eP3KkdHK>NHC-{5hhdALiArxB z6Ae9<Bj68bQMb+e9$Awl6L%ZP3uMA%*U% zZSg%B*Mf^5haR5cwaEyJo9#Dp;(t5`=Im-P?lgkstIQ>B-#{2zLFqP412cH!Q^n11 z6XdCt`bE{(40Qix5C^lK#EQ{<8wrM0R*N}7#|JPDeSEmbjt!FBwTu1naalG95ajbh zQ|H$dP;5l4!ri0oG0sKJF4hJ0WOkr#oq98M>d-44I=2w#0TA;%>g@7A!|to1!DW}H zV7>kpHXK7!!Bso&Y_F=RsYM%ogty}VE_R28&L20L<%#&(ax;bW*ZhCgH;A(-W%-O$F3=J!+6ZoxlC@b*1*bSBI^Ae>&sqv3HZMC8~H3{dm?7 zFCw7tc?0;hJ`*Y`b)G*ohy2+M%$A9JbpH*{>Sl_7?7JmcxIIP9A+j`$kU5uWa@Ek^Q>rAIXk68s5e-<9G7^ zUDW6YpeHn<~`$-`+oaoMVHL^1aBz zAI`r`)E_hUD5OK9ja0tbPP+4>iy9V z)^j$`4oPQ-Q-qye8CXHqhoe7#|H>E2mT*6+!B4{vdCLEJC4%FyFJCNsoYb$Q z!JpsQVbdCUL%cKNeaiH?zm$7^{c=+p>{A$9O}h@e^x^yS|9g|^aQI~@$=dmAL;iJL z9u_+D$IXS>7yk1k9r8HDpTqG_j>A&)f7_=h;2!(?k^c|x@86I7|GohK^=tF@TmJW3 z{@1eP---S2#QvA^^WSUvzir<#joPYyc>(-abNTmH?yn`OzqfLK@818{-TNsyk>vky za)3%7^x0Ga^>~)C{MR-!(Vhieppu3{bBg>SJFH*P_s=maZUPXbx`s$j!0&cy2x7bo z7cbUBs~4R@?cmsXC}MLB>?&M2D1l!T2A9QIHypPg0_*IR1=8B21bbBFyR6!5>m9UJGFYA75& z`X9SgaRSV*FS0{#^NFyBj32sj&EkfGEH2yqsl&(pb2^pX5tW}UQ{%49S(#lubVAnC z;Z%9k(u4fBp|QuPyqL>ZKCrH1Q4w?Kqhf$U5({PegMWU$|MII@#t3_tlCF0d5!tpj zhu#*mA{>$VnNoj$8FYlb6Y4U!-|zGvUO6X5lc4g!|NT`ce_qA(`>_G$!*2gNCxG)) zn580z&fKqw=Obfw(xe);=G)vLJ?ttNh3s&4p8BjUbm&iijZx(1W!!bq34UGr*Ut{7 zD(M!ghFW@o?CNhLrwl{x!-uPv;_RK1qU~mpG;tUaJ zdhY7Y!ylF<ck6sBc8dE!?L96G9t^qqPK zk9?NE@8zM7ya*=eqK-QiieUApmr5!UPew(c8dhYp$b8jPl!^_Ix*N0Ti+bCB1q z1dxXT->{mp(wX;Ue$@Yc(jmj(bA;D{5${9c;mb^ApI_9}e>k%Y%go%& ziNo(b>o`Q;U{;adVNdbrvy0R=7#XMKTBA}J?L()vv}vxe9~rhB>f7{MskB)tOXt#` zJbl=d7%RZE8(|jd9{$m&$A@SkG1n;HFR zM+Dd_{HI05_`1Q^=Fr=*=RO6^t8p`Jp&MKv)p9zVA1|KdjyhgsK5_ot@ggZ-+{^2V zj?Vb*B9f!ivAVLLULdm)nyV^}Ag2Sg7|n|ib<&3}b?WKjtHX}izgg_i(64iFCy6$A zO|lhCi9NgiVW?Q(&`S~0<(EOl-a0pF=6CsBy-@sA;ZA1W+x#lQv4!iL->0i8_R5t0 zY{f>nU^o`LH6E}A{&X|&LY_{k$@DFb^qjSt-t|(d!^g**4Eq(F^Vg()lYEnIVXWS> z=F7R(Z|Zk1{7+)YzzFtip(39DcAU(o!?P5dZ6|f};M`x4yMptjk(> z&pzio``ORlXWx4dao?Gnc%Py6B53g5En1=;mg)J$9GgmtXDd~)^*2q3PsYzTi$MY|dk)5n9s{VM+7*T+#& zXb5Aavr}?-ZVF^!``}Z4=eqbDZN{s7*@G4w)_>a?h|4-th|BCZp0=f!MBe29K3O@e zZ`Y4aI!yEVU8o@GLKOMR(x7-dR61!pC$(o|FG=mFH>==qb|$8la@XxaF_X07?q9Nz zzX@HS**S zfTltg1{v^HSD%ZjF+~1onv1J^&EDCsEzk8g2UR=xC$b^iSDsEHHR(KF%N^n(Ydvs}Li!(|XXR1Elw-W^!`b*HtWw=daQ8 zD^YZC>F(qcJ2X5fFUoP&&OYp{FW65QHfw<$v`F7!{l|Z|qwK+_N;|B&_I4- zqL-*g!3T281%DCC-WjPbFS_pxPQ95dXs@600E+!Ozw_Khia+7!9S1JZQ|zoOdj>&e3y5ab=cKpQ>BJsOX?;WUt(?neUS}Y_k|I5sw7tKz64p|@wa02 zB0hb48)oqEQ)XA{sT@^m!cOU2mK7_n)wT4*Bruq4eGg7O%9T3sWs zD1J5YOtN@WT`Qjc-E|0-Hbg9nz|dZwoP2 zFNhZ$HttqOX4nPVT^&hDOxU^(Yh~S`_yNNooA}k^GJ)brTH7Tv-d{swf(lk|E~`9( zY`rCrN`+~J@0F)86>Rj5es8h2&tvK)%XmyPF{|;Ig+5bajO40-_dJ7uNTnj_`q`>67f>X%2%y`M39Zsp%MrN zt6Y8m${x%eBrWSG-@@Lss5EYllKVIq{nBbqq-w{hx%~FUPg`3OXE{+|igh$E)l~s* z{rR)5JTKOd*L{Fd!AB4JfY*{p(+wHgQwH9Mm?kGTHI5#rMZ0H9J-=g4?o2g0v~{n1 zydE`oBhJgE*LDC=WK+6C`dVcA(6#B~3uIv0+4OmyPcyE$nUhgxK>o^9$W#FORq_HaxezHs-MOP98Y`GqZosYW1rxeV;O=IUoSkvm&=om&&X! zSFJy6u&xQU^N2b?rjomdIAo6OJ`4EL+Op2?QY?QiT`#`1(k_P0=&Q(?Dt{fqc9D=t z200!|jeYB2A53-lrQKUt-jDc*h~Ihi_#p^SGs4do;99tNxqO18>1)A`S=0f7_Z;2V zpA5}bgMIzZ!iWiyyQ4|!1GyO&7nl6v3ZJZpsO@G=G-OU3s>)5x7 z_DYXpc|!^LS)EE_4L;vm^V1V2C&ktbU^crWi(Vt}=LC~6KwRV*cT1tkfP@g`AA&wW zyt0U%-{;mrZ|y$hsD8hF<=4Ic9)p>H7~C^kz;()@DC6t)=Da5mH`jN%Lo50BNh)sD zQ;*w9G^|p159=?v6{)V4uwN;jSSOo@ZUS+GS08CjJ(znN(rJ2oVU9&~+1;+elOm9q zD`m&n|G0$rPRA2DH|KP)d4LDYxWRr`46Q0nny!Hpw&vQ-s`>I(*fRkue-fdIS=oK zBV3G&^E4+K@%U>8+*^#S#9NGZ+v4O`FP@s+H>sdh2E>pf z2$r!O7e}x^flqbZy_W$HmnEoPI3IVVmSI_*zp-tpM%0H>5qY=1Z?R z8YAW7Z`KD0FcNCJDKi)M&7KtPMD>ma_WI2 zGnIrV+6`wp#rW3S<8UmhHG9v@y#&dG9L;08a;Rek$O#LtaTia!Ewp-zTL(JrW=s)A zdxcrm-q!D?roPHUvtY$mRyP0USbY4q<@W1)M7>=cL?Y8${2Nxq_FfM%WBy zCT`v^eI33U5Y9>1+^Y!*!L(TQMV3hVwbS$We)-tDwlB_Dxl1QGIp3|Gn%Vz$`a-LQv|e3i(q@8_woz3m)}t7>kCYk6p9?=&9Z9uJMQ4 zb*LA%x^>#lS=r>=B8U4Gif12)745LWX3x}U>AKb6Ei6D%a8T3epV#zA zbB%PJbHdx{Q-Svcgj2uu`KsgYAOlV*gnKHl>&@`Wm(}JQ4}J`%fWVktwqV<6n6AJc zDb7*9Azka}%7{J;q}G-OQ!Igi`A*85!bXSIv;XF38K-i69}?={`RinwnA zZ)M$RxYqn3Z=2EN@qcr9zWPV9R?x;kp!D)`4@R+%=lAUbcqV^v8waID^b}P~NK{DD z-;a~ey&FAxb)>4Y%5?blw!{nZ40%8h8C9T11Bz(Y9gl-SKdjEHi^CjpWca`vr+}8wj~LGNY{~2)3}c>T>Q7{M4c4 z7~g+qBG};{DR);Je6m9InnJoh(o-(d%7Q7zU0SJ z$-H*ZMHB&eH@i&Cbq1>=< z0B>gLK5`VNgNEB{vv95GYd}mSNc?FyT&GNJ4GcH@~VQ@q=rAs?rF-fHGsDGE3H}W(Z}vATLgcgR_XH^pGap zY~DLcRYWFwaGT4~l{UyFEf+7{;Xq3xzF4mNNOfp>?D&7bgPhTWS`4bS&_eBt%>J}3 zdpf{O*E*|DYv~=ZCs0k<*{u~RF142}>;u!rsxte0&fSz6Dk{^IptL_2Zp7gwQ!o)} z-Y%9CJW>(S;5^O_ge)&#fE#8VCfgUbs=UuWm4JWScL>4t;ssR*%c&lK5{55rY&e1k zMyOZ|BtP@iXBKhxE1B9^HN(z}u3HgQifg$6#YM6jrMn)>W^Y}O_osxC(jwHKK0Ve# z%ma|gewJ};oPZv5?t!^I`I}Bo2nSZ%EMpWY_3Kv9i%fRz;yAidCq2;~y38{=ew3&YKpBKbqIq8dro2o9ODB=nD!C7A)8oBTA`nz{jqgFT_}A$ zu5Ao!cz%rJ|1N~=FK26zu1`x-MXTCZcMHo0I;}NVkWX7VV&;3mQpLQH5?mBNGPX($A zTd{SawE<3Zhq)7+2h=!dkK!fPYe%|$=oL$xYh#fwo#w>cCfRV#p10;{3LC$;?D$YT zVWEeD2qKWPq{1t@y#D@!!Pt*iu3UeI?TM`i1&VSM{^*q`$G)Gkp$Rb2k{3r)5F)K9 zAr=4wk{@9=&DDwi9)gG9OWig}HO{Pt-pS?#Mk$Jou$EZr~V%{tv#M<1v z>ag5T|AR7-6>b?$;hm1TKX>AA01q(!AwRwi6&l^1Ib5^jKj=D7i+C)z=pqBuj-KQZ zk+aRe_vV}zciS8H3pO@>#yed;M%BV@aKDKsAFk;Yg|0)h%NZ-$3FVF8J`dWL` zx$fVGYVmt?M-R#_!?tynP5(3c=-#Vu8>!0tjW!8cPj90mSkX z>*}%8=nwc$FOj<^O{VqbcZP#`D<=jOj({km`bw>JmolBjum*H;6B(+UJ`PV_Rw`hj`G%d>fjAsd* zX|%b=7JR>;!QYYXT`+8Y{sHgmjZnLU-Phh;p0Ap>wz@_Ma7w}W>%(OH?!7w?F-+Y9 zWEa^j{2o$Mh1U?SLyuHDT26Uy?D{oX}5Xj^JY<+H@n!Mylog#Gsy2LT;6Ss2^(UQNTBf;Xm* z78qEO&%4F6r-PDUimZB2Pi)q`Z25+iH86qf8ocsd3Ccl%R3XZ)kAQVhsz=hC#AaPWBe1GNDFXiqF zN&e+z?j5>f9Zn|g;5u#}9t#uIF z#E!>ED5S}6B$5mCdP=r}{hGp7O{Qjdk(hm(#dlQ1!M9Hj%yXInjfbPptoLsIZ#MuOvUs)3$w( z43y27=gF%299S1zRhw>rtJntxxGUQW4xDX=AHAj}^Xrm)E^*^%bKUzI1$ox0$L&GB zeZhlrzO_HLnFH?+v)GUA6>u+!IL>^(d*}dt{$#l~orkiMqiix&zz+HYs{N_)imx}E z#W#|bO@B|kZQW}$dh=|&&(63pwF*;f?OOV(uT%FeoY1t{+BN#)*vWyp_!`@vsay7N zBVtYBA??y3AIn5+)zJ7=xR&z+cDe5OXDm;KjatSln_kXnZ_D~S4;6iy+8ZJ~^gyoi z3gk{LA00YEU2KCbEv6rGmOU%L#(c5RNGv1!?E1qCp1eYrW+UoiA5xY-_6*ts-3r1; zq}d|9P;HQJ%1r#mHNr4!NSog{zF+W7S?Fs}>!bLO`n5^>KsorPI(F)mO(`{(B$ zGtZxG(tLE8n`>ddx>DX;zFI;vw_1`6 z3PW0Nw7Ob9@DxLQ(VmqZT?tj=sWw4R8d%nDTP?lamwWiA@s+Xq(gmttr*=Hkk=sH^ zvK*`Q<`0kU{kBGwuP~%zSRBXqgVC7C7^W4TzG_JR{nYx@A_#q$zxQ~3AyF!CEz^Ki zz<4;}Dn?~T5R#{%8nSuGbe(N=yZ?BA3n`^Sy8Faou>wOpt%FY(iVs*&YD-C2u5vJ+ za0|BOw#&)(PjXP$IUnCabAwCES~RSm+oSk%ON`x=x3BTjyo!0VPj;tk8#|CMr=%-` zr3A${H5yv_Q4&_Zj^4ngSRADdBY;~~i|4efYNRV1jyP|uRfU!WQ2xA=C)Q8~Sz;Vo zXkK4B*`M#2@a(@B`B-14s?&Y{Iqrh@<*_BlVxtD;UhX03K(4_1YhtUGOY{p!hE(S+ zgZ<(f%Okho{@#zA;ogqq^9%}J0l`=KgrmzmsKg}P;$QQk%iDJEZG^j^)#f0>o4Tzr zTp}kUwlI1oPH=(AJ$5|k9AKs9S+>vpp1+V+SdfIVrg!0YjdEV0?H^4`BO-d)XmC*p za&#j%{mV-YjpFSJaMt=AIiihIXxQtDUyWm?6w~wWk=Ar$gkvp$RJn9Qq zx!v}SCb$jTDwAv$t{a09Qhg4lpOURg8cy!ttDNxfAUgrYy>_1JQC+W$D9$j!)oQ>9+bnl!!{B@R+>rnmRE`B$+5EfgS#{X~x&{s!Tp*26*rejC2?CgDh zevIy}TNV4P2{7?NC-+{xd1+gg(0%7%*Q@ptc}HwEP{aNj8`XPak{!fGU%{mQtHKv1cj zS2}xp{VI%ECs%f&N-mLbepp_bWN*NBhKaebKSiMUAiR=bOvgOd8}6=WDRcdIV*Ahj z7KJmomiO$YBRNhx!~*S?LE#YY#KxSPt8Q}LpgK^IOf)r_^P?@CQcLe~+8!peK^m8r z4clu^4?o!LL?F=CPitCS6Az>d5G+aOj>n^Xg3}`*G!=iR|!KYnn^A1Qza&8JQmI;^wHDTeI}&Wj=H5%omAX zVwUJ>vO&|CHP%O>ugOeusJ(xo5H zIvcCejUao>1_ZxYnZfApE3l+U=!vE@P7$Lo>%ZGduY#c`rn~G z#neGo7=G~qZqc3Zjp-blfOFZgoL+<4w>+a%fh*h6=Z6KwiFY5G)ni^gbW{5r`iy&E z?%>F6Bb?|YnwiooaG8T=sgEivhng$X%H=9hqb;_JBt;1#Jln3lpZQ&>5Z$|?iaO89-NoB-9g}0a z4OV&D-DT$lTDL-7$5h3!e?T~h41)k%Xq;HeteI#uZy0IEBx-xLST1LMM0KFXrMiS! z{e8eTw0|c)BB!39vI9QK)%rdyg7BUFuGG>y;VxbTDcxUj_2SuPY!3c!DnUs13kF5) z9m|Os$ibQP@}b5`qxRXeGbr%eX!Gd-&An~g zXPeHI1lGgz%9SG-wyO~cD$w+B9?16?*Fjf2_p2RMKV3mzWPl&-bsNg)eKf#dt_<8B z^=ghQXbL6EcAR@;vz(|`KPL~xCzMWqHi8NkJX9He+tDiS+|?>>DJ^&@>ojhTVPseV zaJu2%)q5VNC#A^vW%cnY9&vSqt;U;839*d4kku-B7zoO5ENy(y5oZ|srrc0?;1k;e zy=|pq#`mWUQ58-@#ibHtmcg#uTpky>`?(((jfW{x3fgFzooC5EazmM`GKI(};$s~% z1!XlR-zzM7fxYWXDS)`j>mM=Ak$#dJW z5DPcqc04u{J{Rm)#fatF)VEwHzw~F|Y)1B%zj*S=AoW-h#jRhk4flSm*pDqwQPf>$ z>zZGAh$MM?CCnk#G*4Qz81RA>Qq#FR8N~dhO=FhfN<3pVMz*z8N5$0vw|@Ztnb0Dp zOz+DfN!SATdC7LB$NtFSr(%~iCMH-HomvrsR9^XRSJA|M7JTr)71lr5hi_ zkc0#kw8pRQ(;lPZgzNshG7JLfl%!Z)hTz!#?{sR1r?yvxenU$^dLm6xP zf*qo9PrMUR(9!xJG|&!wR7iwadUp~!CH#dJB*it)TRBZ}XH?f~L@+;qn{pUg#jdO@ z+-uBrF6(Tbz9#5T7fU-nGMJl5ym9l#y8yhJZIOZtu1^cgZI0& z?=+YOvTdWn#G|J`qbb58wlKTF?v#z-g}czPs27sOA+{95zU9`i+`@tD!Y9J#6`)ep z2xOp!WEF?+>2jVvFQ-vB`uKPdi%15p>A7x@ZU0y5mLULO`q(kR`LqiL>3d$&afq)Q zc26n90oLvvYkKC*JyFyD&`CmlPt4l0P|9?^wVK);?D0i$0#)^sL9s&XkIrkJx7OYZ z{x4&oj?~1kq;SgyG<3Efv%m+)k=hMBk>d&c%DMN1o{2!O41>~6ub>dmCAXbSbT-mP zE?Dx(o!h~3m15D(QuM~}hl5vNTm#piKVDHvZA{;5{B=A8rH^H@{Vy6-KZ74Aur~w8 zdi)nI|9N1~?5|5of z=^gVXf=R(b^c1t>^>JO2JOC4#vh`MD-*3gcO&{9CgLrqYY+cqAb=EZ?h9 zcLJO722Gbjt`TI96B5z|Rbsr)BrRb&xP7H=Oi;AQ_*LV@Q*L+sYZN^YJJVKgZi=1S zQ6P2(7x2kk zp4lg)&4WvuF3!P(rY|GWNuRIdTH2tybhl6Q(KiN&_$sJM;=a!legLH23Bi-2D-kdGyR|ZJh0#m~P^qjVXU7*gn*}@f)*Jc46FKN)2~$O>Y!V zX}gH5a1x{I4DNUla)?2Dt8I+PAO2x}w3l)qJJf6Crj9t~j|~>0T*q*(lz&^AKxvT> zAgkFA)3;ZP`3LZ*T*c-&`d#s>YcD=AF)EC&;`JlnH@i<&osiin*Lw6UkD#qV+o0>T z6O3Y(#Mt*{2KAO9Ys67&L~1&a)F69T5o56F0_yRUkx2K6&0-0yC3A(j9V$U?*@-4& z95320SiC1y7yqc}N#V&YzF!5|c;;k{rC-03_~C%wEQCp+NT*^Gu4rz6YJqb|WK9HL ztrdzEU^y%zF*w>c8WIX#P2cH$Nq(Y)T`rf=h!t0v%cp#HXUelxO_&9=AR*o8%qsu; zwv#{m2@EY9XXJ`oVPsGEPg?_0NMHjg=M`L=e0tahWNg&|CN38l%hvip&~Y|bWOr|p zxU2Zo=I9vF++lv$Vu|8yldM}_$4n6m^qBRd|dMIX~_NC1(!v5MCYQQ)A1J5wyS=L1}mFvs6M1Dk|*h8zCL&@ z(6XYE&B0U(?x>G)Ui?^RI6ZYGv{62(0@lyluN{WN{-R9&@w6lOlD^asN%Wg}De*#` zE+}qgxqtKgj621xC9WOr^pTqnN;1R@_Yg_DQXoxZR97+HUq$geHVCnl8CiR|I`6b^ zzIv^+FGwb-|0C-<@hgFoozf?`@W%GuEK{nxaGcAo|I6bL5gzpf`0-kzEmIjAf-Jts{2tr6AH^J;WG^LXvg?nC72kdl% z>MWkOW1(z{NOT3$S?GL#|(5=8;Q=IQwJp`V)UNp=C8r zpExiP8cIo8|B@ABjs5SPl^dldeNTom-5W_G2s190=8fx;aort z8YkQP!@0Zw{-0q;N6pO{GB0s1 zwQnry@?XrkE(>TIlZXAM)z-5*It+iffHMh_iiB?TCH5ljy9s)PeM#{Qcf`4u=Rwy4 z4WWfns9V$s)m7C;FMe1=nNN*z82m{v!QKILprB`0k0(}2hcebEw4yvEO1RmpbMcCo z2i|iJr5*P$9(J+Q@%aZF&(R4bbxw|zT{=aco-z0)xsG6mN9C^C^kzJxDb3a)an+)} zv!EEDFC?^Stj7>4ffBdXrj@*_`XhovcY zKEmqJRJy%;px60#IRUBzbF=-~8B8u7-BccWv%lMAoUx(E#~tyBNPy8&`%Wi1TuEuJ z*ZW@?4BC;Vw+C{cA>=^+=_GToNR`$0{NoPY-}@3cYF_?AzrCZTj7LcKBch##x}h&1K%xpC zcl;*m@h?X{*3-DL5_-GXL#}(A3#+GOO}Z4!+*zwZT5f)cHb_#~C8pJ(Lf%O{#PU+C z2%Tn;t@YJEtu*^cKoTxF;PxbJZ?1+jmB!C)s(8iLfGw& zW^sAw<0?O*S%iKNBI)fso^9~=5lj?`(&P7ZIlJtFdWWGaWZNx#O z_(YIRSd7!#ZBjf7h-Kn)O>?cKj27lI;8_I%axR4ZBb|9jLD&?v0QFJiBN%-NP`yM3 z4ypaU?z%t)=$eXU%*|g_)^#DuPAn>#hfaNyELWaTr%$x&4zbaBuFz>(m^e z4nGm%y9}NqD}TY5cfXZmGxv>0p+C#Rhbk!|xs3Bh&Oeq#=pm->)#zNkiT#add(1Hc z>T{n|I3UyK&1id?{OOja09n}Yz2;$1w?uz5=94?5G-2mwCRzM+JMk~^y;qnLTi{$M z`Sp(9|9}dJ+=zxHKR3%lvu4?_uJQ*iU+8)X>4Iq$)zLL}=-J-=qcE}64byfkl=Rxs zd>?8ZGB6c_X($KZZKqi$?;HoO7`awCvg5RJ1mhMyj4|nh#t;3N$}wmC$%le~4-Z-@ zVs_`B{%gZ%p%laDE``19rWgy`Ir&sN4>~5-TN_o2St*sVBG4iaK+jJgU>Pcz>J+;b zA_Hk=TBX}pKqF}%xk*g&gvVSK1H`4$eC#|#SHm=Za1=m%xVI;_+d|{hyHx1d1m23( z?tuPnwe$arkuw#5dzVAb=RS~DGoq_d~}08X>RuceRi22qd5vWX9A}>24+_ zjj$0!-c=!wmydm)FshpK7$`?89erjq1DA7{4|RX|Njm%tJx?tnAcY-T`)BYtW_?d* zgx+8rUhugdjC)&uS>RTuQAfmvUxj?B54#ZXG-OGClp%B^J_0yDLVSq1+TTk_@V2bf z$1ce~uvW3W{-_>JXG zY!nnvdbXU~ZA3`Q25XdXr=Kq;@QBmIKFNnY-(M(Z-c^8GS9ZH(aHpp31gY!U11D=h zF;7%)Jx-{3ualppXmv!;B}EKj=f4rtXOTn@`tmWykqLneLK<4*oWsM>FsJC&U~Jgr zqvST58k`xbVT^>Ykl(|*!}qV??3w_pg`7W2RW5R1seX!9cUAh*-w1B?tL#8uWfeR< z!(NfP7%tq~L8DBqxJ=uo_gZ!O)c*BAU1W?+)Oi4x4rHG;)Wl+?)(x>ZboRH^kbTR~ z;T2Z{-XlBrdGNI$*!OJ&dR)qCUAXZvt$ zqxcikA|_;-X;|q_8~=SDDQP`#Q+Rl1TqFH0;}Z(FfFC|WWF}X9(P4Nggv`pFz5+} zmE^5)n+S@XB8!8A2)5-TZT3kJG)_RqCZJq^$glJRq_zwJE;nh2{xjMr*{}c=$A8t^YwfF_1&%Hg|{ zbeFhF=-vCcGb^@|F~s{43m#9#t?-m=_Vse{RxGSl^V3vn5@$CsF$Nvx_D11rs$b6$ zw?{~~!r*Lk!rMqRgC?2U@A=NR(ntK)(no1}_JtEr{CDN~@*=)+nWHv1Y*Yl=WZAo- zD#e6@%j04sXqCy{ZE7z4<;xyuQ$o!rC`doVGUO58qb{xh#}I$@P|fGz84UECM~WwI z8$xqEd&G*YZ7GCH&oYMQeJ@^MNb`-uvo^-JQ!G6ygi9Rx-gV6pI$yf11VOrCmw#E# zN6xwQ$#1h9#n8|fFx4}$X4TIg`sS!={05otoSQ*(;VA3r;(WuElVN}0O%|);&Rwg< z7~0Ub-bFW48%9YEbUY~5!JogCHf&Qqq5v=0&|r}8P7iIbdl)lw$MLyZ3$5oQj3-JY zHSps98Op zm_IZdFQ{H~Yr$hC+1lilfx>l;qsc*1I))6k|G!k!`|b4tOJQF+B0VQt{kHwA6r4&C z6A|SIA*v7yndbXT2+u#{CuB>UuW3dj4}p&?y}K_i2U_Ry5ha&KI{hnM!lMb#uA;SC ztezG_WpDyhprRRN7ueR1H@C2slH;PH#@EdOb z%daT=FoC0#Vlso8lbe6L0%~rb)moQ|r|Ybi;aPS=H6+Y*)7y%V0bKw^X0~9v;*lZ2{#_~yaGj1g{t2p|VyrMM zi(ft0RJmUlUzU+lJU_=dUJxL-d;_dFvS1rap#psTHKVJ@*?I~#H5iy<$*`Gaw3e7rYv>itAS*ii@aNc1ypt*B_u19L*g6W}h zueWwmNs0iWCz)&^t3f3CLynT%zgf2ej{P`D!V?DQ{>pBk-g7@L=Y0h_USZ@;vlml0 z-UXAL(%Q^hL>>>wZj`pwK2CK@rO{h)!AOhOqTda5C}l2n-{vuoq5PXHki=khqQ<9r7C2f}tbfc>!Q2fR0-6$7^+Wv2$G1Wm z8aZvs_NhO3uwK5;p6QMa)GFKD>v(=M=qq|#i~wC;=boMUYMlH-5C=|t!9zsdpc}S=7852E z-SI5Sa>YY9qCd(a*CncimR#GjU(Cq2=U9CHh~%-{+q-WD=FB&|(KoJToZFqMcy|Ee zQCwqQ8*kIg%d0vDKSD@}2qA6=Rvh-C%e z3k+~*rSMkGEANwUl83xGVn~?kIvdVIJEVxwbbuRR<>&DEP{gj)2(do z5RZU5Eq2GTM*;q4f1Wk9|L4l?E}RTDh9 zhY~;1UrioFMWC+z6i$z~^1mqFB5}rAtSegbH^LB-!lD)1u^5haOoh!g$XNs35!0NK zjvnGJb4D38JO$HFG}jDJ;d5Y`u)swf^#?xe=$i|l{bt=-?m@CFt)Jo+jz3+qo;qB$ zKiQNEARS7jp@gqhc01Gf zkFQ8ci=IUN))n-fMs2j7;aS@3pVQqvS;lWySHyIOyA(}RLnjOG?=J>$m^NaV_9lL^ zU-!;-m){$@mZFefS!(Z>O4BV#r*%tI>L1_c;gSC4+#=BCUCBqD&v$5tx45Fvbz|3H ziac7R0$nP?S5CM)3PYBqCU>8o)(czR?(-Qlr{$4+F3&N-+X4-{G#?bBb=>N4X^~Xve0<0efqj@mrO7ztA;w;?`a@ zKTezhK?{S7Oo%^;V6VGwh}+KyA~JD#A4mDfZW0m_zqTxWa5c5(3I>EA8vQ|$RI<3> z-SyLLq2IvZ`M-|5`Hd^(bq5}1l#hSy7@fn1c2ZPoA?{S$LASniry>a>I9`U*e(a^p zacg%klRyQcm4Djs2F(Qf*4K;gMhORVfZXd9Te?@{#hF~8PaUQkgxpbk2U6n7{-fcL zewH@P(?Rx!(zV6fA*8RLF!tt_DAi3{@Dj;fUoABEw-Q!)$f#)AhFp*mW+{(nERR|d-3G6?Ru z(+W(;7mJVFH1I`gsg?j8ay4`vNa^ic2h3C8d2i*)9!7KV4`!JV$)71Y0@S^c!79Z` zLM`NSft?=}eZME|bN-7NCMK14HLU!!(VvREXZs@*Y+cB^7nm3xt;d|r;r+NXmNm%r z;BRaC7^^CZ=jm^@{ezJ~6lwDoebX%F@smL&hdg;Z*{n_VIyB^VHN-keJn85VV=0^~ z{StSpoYfPXm*}Py(y0^I^T9K5*=Dj=vb=nw4jP{xGJW;3A6^T;XUO!m2s)PQurC3b zr1xuKxBrLKHvD=JID;@)J-O?*s}wcBp?g19r(m})<2i4hF+3hb zN?h~IXs)0e%~k`Bts}ewBv-T|YNulIfq%9e1B#7u8L`r^z#7XJTRk^cvtsm*+~Uw! zKe-G@G~qBY9jH3&x~^n??IZ&l5JK+-+L3_D%BAKW1aHu-WdO{hac7a@Fz~+IUmHaY z&sfvS$Cdw1?2A}PJ~etq$N1*wXv9*8`r~S`iUTRr*$;*R(XIyeE2Xv}K{-G#uxl6W zmzJ6mA@t(5nX_?*Jt+a059qmzyaBZBT@hSp$*!7RX*2^*8;(ByTd-ur1A=8c$J^QO z>vz1IK^A8`;)*A

+ZNsVyfy>rmv8=CQcQ=lJ&m9mqPhoGzLgSF{owiVTtPoMqQ4 z{1(S7niD1nGV`oB4?L=x`1#8Vd}6^t4e`5`SQvPYDm{P~_+`7+L2Cb3Uya1qzM4_S zw3GI|@6=LpNyZlUw#*0r96PTR)iu~a1E)$sD0??|K@$a2a6Px>Y$`nEwFh%aX@ld{ z@^LtWqhw-&_WLmkw3tLoAz1V$p&x~T9VnO{kTaks?7~N09&3g>7%8N3F|zMX$03S^ zOfz%f%No(%Yvoi183lfrWN4sGe7)lQrmC{}*wVCe(Y(dN za=hd$buy}KpJ0JvLaNJ@x5qeimnm~dN;=*V+&n{_nq-4=F+16+UZI3!;gTb#I-X#_ zRYN@tQ%eGL9WL#ND`(COa}PESj6-T?##l~Lt>Z}eU;LoFfwezUc6;#mfY(aIHEFj{ zot~oWx-&ed1T{WljD4!@q+LZFhL_R}X5n{vQM|X(Qmx9{D(L72m+X2fSDHagP|j2m zj0K#k-9uY2)I77RBY~0rc9yij#ypG>cv$Ls{g@0gkPoo6FT+tr=|TJ!rLVDE3Q>r zgThFkY-iQI&)BA=>c~AOvCGn_eKjoAPL;)zH7)#{Ly~!8cRH&XZFtQPSSpO(G5zc- zT&-giCu`@qMfBOi>JfrJ(4+;+*h>~R^O9Q06-8}^))iILE<77o^=!j|EPh$f)~Kqg z+CjN>tUhNcrxLAa4=es(4ex*L)|JIHilwhcr}U5O$A7f#%AlK0m-KXVb>~Ya&$Ihn zuDI~;LX@EBs&n6K_a%y*g8tEdPQpCL9PIVQJN$d5jsjp~xuT~Go*47&(7rJi-pq280QMPf_0^>cM6rzGXO>fl4){4Wn zrBlQAoVsaw(XQLf84jW7Q6p}kwpx>LLNy-?;c4`1J_f)cXb zHKZyL-p{zXQ;UlFqPK#**L#5j&qKpF%Ev&}Td8b9K*e{(;~@QE$$p_>#C@pXrEl253|(5_3jOgFziXEDGCQK{H8%c!Au3G9>i9`_>rgaH){ zA9uUUH;%`OdjDpZf6eKns?!4U9OWffXij4qymJk`x4SVz_bF1!cnhd4-mk4`;R)2b z7!4e?8{*49sPTeKyDcdI4GZs(0T*ijQOl$Hi@g^N;{Z~LDmCsP{&g$9rZr#Ar_?XU zw=YIJ8cVqB(`FVZVV#+ubCE}yIslFUfL7k(TAQrC{OG)lSlwqK?8R#{6x4Y=TUnSF=XdzrHiho zZl{A~#TI%4pP)@MGA7jS97laa@zwjKnME1gX$_x^B70pk~OKX{A8o4j(?h;GKjbqsTNq)Bv+V_<%}*$ z(fRSALDL|^hGceLNe-YWKcFhQW(hq0w4aq~CuKF#edrAP>?iraFU(rf=x9tTL5Qb! z#N#KWId@qJd_?D8vrV+&6gy4nN)Xtb+_vT+ywtTH&7-O5IsjTtmE^hD6zLRFrk(=s z<_GF9Mo-eoC+@%Zq=h?O+NebKEt?Nlko zyG?HTP1hBs)ywJ0=0I#alNqXZ@6LC~s)rbr^7NYGT#+Ye(yZ$}nc z2e;kos!4y0`#7as@%8aw*VPm3*KG#I*Aq$}=`PFB3!*{hWbbD#Y<;bF_JH75YWJq% zN?G|M;@t}|48+vogFwvFh;aK~kE|qrZN#6>Eu=lIvU^2zqc@+lF%U{*5suIShll)I zj~BAzB@g*rp-!UwT|@pI-14J>UfpLPpTsiQ@biKZXjWT#a;n{XGc4?6mR%5T*MTX} z{qnGNG>@ckSItkds!&`Pe&h)CHR@Ixe_7y8sO&l~Jh}?fQ&6N&{;qgnmknE*xeDEHs8O6o*T|j8b)fG- zdk?yKm#%BLEj+9@v^H!`$12NTK09A28pUKf_I7x0nw_w+FSIrk=4O${_GsDy318+t zp+rhoOrRWJ0zC6(x)tw18#t6T3DdCLea|wm-=;ZI)N(~ja@s>j@&DNS?s%&E_y0Rl zX{m&4l@XH2-W6pla_muLkL-C!OG3u6clMUOsmw#j-c*!LHplv1r_X&iRG;ttef<9Y z{*}|=ocH_ny2kT*UeD|GUL2@W(8@G#$bd~);k}kmVFLiIKrr;e=#{j zxCm^P@lW@00iS0$T=KiB-T;5_1({yR?9nRw2*tG3-DZHRLREaJLV zMJDlV!|9rMR2&!gtQMEq`rHzd4|9%p3U}+mj&{vBC!Y5ee#dM$toD8@i7r>z?^*Bg z;L)cY5BR=Wq?Txq=DRroUGCZE(E2zB%;IoJzG40Qoh?wqH2e14ReyBU!IT*(JaLMuHpR>|qI? z0h$bT1M`vjo{{o6NB|Svk{i(-{0&pD4}>7?M=`TVi_)R#v9cY8(5-}T>Er;YMxg`! zghzra(LRED)LjdiEnYCu>ak<>#^3a#u%hEH8lt~5YnvuqTi)=QU&bFqRt}sDluB}u zYhbq4Qb@k)IG(hkOYRz_i@C>q*4D4N_$C?2r%{T+DGyhsmqs^Ng+jLOG3!ywt(%Ps zT9gL;AXi^Gh>c?^bZ9QY6CO_Vz4R6ZOMh6ZVmc7$n9Xpfedl!l;~_MkaH{I07&M61 zaRZ)nO}J4@QCAQP4I;;$)Jf~MQB1sz7QY*~;uxEK=+x@QjvV{OdxSugnXx~aOVbk`e^sw#zsMAdXo$Dr=G5ng!^psnQhO>9&X)4XthK{If&*u)# z`pM?7m4|JGznpuuG4{QE<2Ft7G(cAeF<4^qm`ih#!h-bhUDhjP>0Y|w96h*+Kikx| zttVx9-!k5N$>Ez*{R5fmmEDlfefz=y8rf=HNm^VlWpIHJYCj<>Jv)9Y|ArT1lKYXe zMwuu{cM1Ayy%ugtb3vNLmmG!NwP<97*d6&*zkSDn(dQ!45?sN~N-s*D3|yA@AnD|9 zdTnq`kf=FFzdkt9(YgC@8bF4V%>gg|6i1c_-|L*4C}ep1OW!-Y}2Y`cNkA zo3;I!gdAwDs;r8h{HX8i`p<&=ZAm0pIA5co-?Tf5#QVKUZ>L3-9nSzJ4hDcz%#8Db zItWBx*^_nCwOp$-TH$Tm)9iBddue)X{5TCd@%kA-upfyQX~H?;qbLKA1fmoU?Km%c}`zgHj$FR=ynd@F3!W1;)mXUB;l zYVnpG#e)T79KA6l<^x{Cm6?8FQ)ldSRz^akAaeg$89CyL=S=w3d+Ga|vg<^LeBX(m zVqd(wNPtgfd>w5l-nXs#=NCqwyn-TMp@JFjU~JZE)Bbo@XQ@v(@rzd1w1Uh4vr=`(^`j{d+fC0r2vsogYBvp*P@^a`s9B3%Cqz&0|Bes- za-(vyXXriI97ezHEI7C*aB5Gbmd0~7b*UVg!{Qvfm-uhyIsz;28Z+PX*AFK1^OV0pS+}VWCqqI zc01kQK9O?^qW}3p<)Fv^?9SglFOqoZq>^~_)(eiU>K=rAt|q3Nvu&?%P=Tq}Oqhvz z{-DK0s@eoS4U@D;p{)LLdvTK)!|$KrOO7)yn=>C2Xi#mVR6nxJ<1)jOX-UhLG;b2EX)-5XCs zh+8H!@r6~2!9}XUX9k4r^G}w#vm|!bAKuc6#830up&&PkSl+pb@f^_>xWic6%|q?t zraSN>NLxBkjqQ7>tq*233R~K@99vl1BD4I^OSZVGRqM>&$UrjIzx4VsD^#sK%`mc9K2i>SwRMCDFYs@f~m)#`T zak_l*k#*yac+0j*YCl=OP3TZ+MT5#5OItLnW!FxTF2x;29ZIDU2}8bqN^QFuh)5X)JJP%w7OypyBS5eQ2u8L5b!sB zsp)L~rs?PZFm6awhquXF;S%&K`A2%@#-wxaGHJJjx#0QoO#&#xG1U)e+TL7`7xR&D zY6{YeIPcvWo{5vs>z;jx;8E&D2N6D@eJEmcQGRXkKnJ()fLdxqGuBx%4B;NU zQz}HMmS1Sg&{eh(pEv)|t>xapEoeL@JiEEKGKl%Rf#hh#d}P))tbeRudLhrI_n>Ln zXz9UD&Y}W~wB(9;JIhq%QebFxwwX-x{pEWd3sw$G5cePs~t^agMjfG@+r_S4Ww(a6+S2#?{O)j&f4%z zh5T)m=`GrlyH@2^mOhJ*JD7+4g_nQr^5H1gApaSAdv?r?)?Mf ziZA$j(S}p$pias!#|L85 zoS&=t%a%&NqV;~eUB=P5eqy?Nhp~Jo@8rRwCVun|cPFd{2^`}6N+osZk(hH->@T-% z<84N`46E1;2TvGo$pdScRM`A_b=*cMy0GPVn_F~X1JnLt0;O+meLxq^w@_+s^F7pJ zt6?yeL)2%Fwj)X<*Ig-;YWZv(ZlkZ6n$tekK#N&xkkU}Kb(c9I30=ZcDoVxvjxXcw zsjh3nMq1@UA8jU-Nuh}%k;y9wcJJ$IKV4~$Ydn=dBWIU9J5={E%HX6^j&~hz?`OM- z`i6+_&i2z!Zj>aZfnalo744JQECTCrgkN60V(Dp}U z!%FR*KQk)Ua0OO@fVA)ww(kx0cX6Fo+YbA%w8_4p4a zi8%!41?x7*a!L@c_$Q-GOyWXE{U*uH5i^25Jm^bFDNB#ej^gtO>(IHm5_xcIW?nz359#+- z+CT8@1dF!6^yi3fWNhO{{rJ_WNg+=9p^>oo(9G)4QRl8E8%$Lsp{vS$*DUV83kMOM+2j+avEfLWrxnd zZPwoLSCJf}8d|;>{D>^PV`1C!>l{qyR79O)ewGS#x5DkRgqnk1)M>AZS`YHz3*&7} zXTpq)Z=wAc;TZR@Fhy*?YO8MVK}2VD5oV3^Y%je_(9$13SSYrr_&iN?X?KDCm)qq7 zA@PJ(C7uo@>O+zDayJ93qnIu|H9R_b!YZs8a1I>m;5}q@L*w4@AA-IH4*h(*YmQ7R zoULT;A#ow4cmjb<_<@lw4K9x|rkGei=CGKcd#ZrxMMxY9or zfw~vrj`myt-( z!))V1K(&9hQn?b9;v1@; z1Pamv_^$GIxe8>h*e4t(Ou%nX@Mx~0J?Ma(r*NzIAxf;>ia|E*GcEeU^f*F6qm2&z zxxLq>l3n85=MSLyKwG%m&{dqA=2oF{{k#=3(A)YVNX)Zy?Jcv>+Ug>saCu^-&D<&+ zx7GFjSAEgf>(|Z2>f_5w(~tbJFR=$h;se=GCDggXtofXF3`6N!lLD?ZrW$mdW}baA z17s%&{FoSc@Hw4qThO#!qeQhCPJBOzifB?r>iWEI_Qzj+cmo+XxxH@CU8SZT|K{PU z(){V%TWg`D(6f!NI+o1@^_RDOTXE=9?r!GIUT?V)HWl$GytA!fS$^j8j!=QPOh27McWYNWJ0@3Hj_Ew= z8B_ei@n#*}Rh{}%46pT^?KGA&4Sq7gay;oA$q^K*t>EY)lWU7cps)=qk+cO>bFOQ^ zVwK%9Nod9yIoO4&4yh#~#)_9863Jime%?wEa|q3~7dMXgn@#>?*SZm~?4*TvrGHI} z{w&%jbZTWLTzYD`Jh+;c2l2UI+m2nbqLi<9u#c=PTYGz!CKNXuXG|)8?|K2%(;rzh zkpbKY+Mq5vYFoj{S;wL@wc#%>8iw@=@M?W-!j$zVZ|cG2Y4S{qZfD7YTnz5b=E4k@@h@QzYqT_l*orS>OE3QyQ}_q{{r$!l ztvx6TLe=bRGtF^!6Vu}_>H9d!7lMq;OSA0SBV2&#kTnciw1)rMgB@;zyl3(2R>sDD}6=&*$4qdwyXFplt*9cH8@hZrq9i>ZXWb&;2ob~tN z>F?i+{fQRKTvwA{!uh>H{}2p)mvPEbrs6qh%#5DfZ?{A@LwM*) z?n@NhG+wgJ`_mt`-Gtk=9w7SshYbDw{ul`jRMslqK78=&68~p$e4TKH2GrP@cM~fA zAen!z@psq#?f+=h;d<^7p85X0|NEbKu?K@5HRF@||GAO_Sh8*4(SiTb9DX*VAME75 z$Wg3r?qPVd{}0jPPaE;a)p-L1Gd}m}KQ8;9zyI4t`98#!YVQ+sb$^Lz|Ne5^?tv#` zPte^f{fxTzoK8QIJdxoause{I{&olhXx0J;y6tB@TJ~&4c zgM;J$P!!+a>f&E}#hX9$D;T#Rlm;g`1luoF%?Y)bC`FQ|PG-zf*%mfa6ypDg-2b>F ze|Wf&TsT|MgEr zu=5t-$9~TS|EudbR&)?PqxhgXU+}NE?O$I9&3jP)*P34Wej?F-yZ7I(+j}NBB=R#; z*@Qa#|A$B2SGzAt{(naD;|l(tk?anD|7RpW+Q-*~^m`)_|AbSywGyt|6xO+nVph7K zQt5*1$h;sVG-PvF&@5UA8Effv`Qbj&?v@~yaFf9j&U7913g_OUAT%T6o#n~SLsQPA z6zcCA0+}s8R(rhPOZrn`@n6Eru^f?F-|OtV<=k$!&cxs!7;BESip;1jv7KR(3ce8N zMM}7%=`XrXkS$a5(ozIhXZ? zPdT@%_O&c-PUp6aPWR?UZCS_5xQ*2LH0HJlF?XgZ1=o0zBsF=Crv5$@?hc-ArvN4p zUUfdY3(FoOcPkunlyX`B6x>50P#t%aT1eo1{n_i!>y@;SME4Fy8cJzzuFcD5s`IXY zsUo0LRYbJ~9aH)f!2J=Ke8;;vyYQ|E6Csc5cA51=o7e@-vXC<^n@bbz>}CT+F=Jf1 z^}aDW@(uUZi!BoZ6eRM;*zUa->8*5iO%-&NrTBLVN&E;7sX~>6<@4QpBC4hhCbh8A zZ{BE}RZcvUKv+Ih?LqiyZGPl(w@QIY=(x>*b-T>vxWxf&Dozpc!1)vLZh>g*(}hj;N~Cb#P=e4CG5s{ct+x{{XOP z67T^dw#^b$VnFQ^6?_CN!x$qq(RcoM3>d^Mqq zRnM*~sP|=+Tc8d&`+IWf>vf3S!fU&3!%6)8(1ic291YRIvaOZ=SbXkmv)~IF{w+cq zZ*9oD$+-)dW(TZV1pPUU5lXJG8~>}i;|)nntjwC;+g-aOo`ADD{D~3T3>-FvzF^t{&2|hRCi;nm}k7p z7RF^h&2$X5W1)&bxW2%&KYdbIb&t4Cx4M9p2Hmp_fij zQ_o#j%rm%&j^NGJI^WYA#G>61TURdg|mFQqfLrJ z((_ws2$uL|xo9C4_oI}OJb9X)xsd`6@+-50QzXsd+*#vJbODJ(etIoYES@B+L0cQE zjjtc>7t>i^91A`p_DnoQK0$QY72?~GyS&C;nw3$(<&Ujo`Q(K62eWDwu%7PCxr@5; z_~3dC&dhjzgrHNG`O~38hS&Q$R}2z;Mbhh6Pt6d9Id zcSX@%@#pWCB5OE1PC2xj#k;pcghmnnR;Id2>aCPB4OJIN0FiG<+M zQ2i)Bh-PXYQo`G7al>CeH3my%sOE3pNu-n!pBS#J97nd(25L7cWt@`=I^UL}z~BI} zH$gg-J*quXHj*iff;icmT3Bz zry3Hi04hO8T-J)F?A%@jsmTpqNN0u}$$nGs21{&E*x>W=1ungGh<15!gbt^n9ATru?g;wZ z1wK|Gg87nk@!N?Qe;d482lE%#omE%)xNAp7@URY+s1;@gKKhWp zk1(|}Sj&a+Q$rx3j1m5)q7|Ebc5nK~09Gwcq3tytCnbM#W4x0xT&?j$8D6@n{yKaf z$c+`Wf}G&pruGIoO%|t>X@vaqT-VQULz{iaDiA#uh}_oK0u8u%vlu!BHh5(7#${iP{`o1o! z=Xp#|jI(c@cxQAz%-(uwy!B;^JvfkMziA|e5$S!0gD z*G$As+)rgsquqHrYx(KFs!U(GLjCw5@+XvZfaYH3SJ%{Z-Le_6F=l_IW?p`GTB;$2 zQQ{iv!O{x{{i&{u@JqTg1eAQ>!o_!{rHo%sv?nzV+6}XWojaZ!dLq?%gwt>o@_WUg zuVy}(7h~~jAztth`52Ks=t%xT!Rg{b02U+2#$eXyv50&893IkX#hU9)Bb|Qmv2MZs!rMM+e_DHPuX7lgt7HAfC)Rg7}~L|4yz^1w99-A zNwd^}5@FkEWoDH|-j~MRna#)k9XLGp1W4iA+HAY}b2Kvt%GN%5%IE6IjNp|oHuL8g zbuxh$;VNaSGr}TRu?(gvGBe7@KV{a;P~}Wf%}-^nuo`RjMUkqb6mE*3jPp)-As(^i z1B7SlZ2o{4cHMTm=QicyyBAk2 zr+e6VEk~a&YdTJ*BzY+YSZ9O%crdcX8@4Cr+^IRJ@>1Jv8Flvh(e7-uLbJ$sbL8C+ zFT0DBG#$i;~bflLF8x1`byFwte7DFLm|1Mt- zBBiKc1WSNuIEz|=@@f-rccHL;GsSS?SXvaSgcmMxX7dUfDZKn1l5@~hW@+=Bfc164 zm?c3%*-MI77BFT9^fhY#3j+8CNABf==*}v?a&OVk=dHbGB6?@U1^_tVyh=_HZXU)R z@fZtM(^wgC5{Ec`ekjU{J`ClbR&(?-U#r2?5gDRGLWwcX0n)YwNr zbv~Tiyr4j)ZhJh=NBTB1X*$$JvBE^m2y5?F(eqlBbDegB6|W&{9Ot~m85xJq5cV_< zpFPYvE<-u{POJwbW~jr6xuOW^jm^L9a>AwrD*coFi8AC$&aJUxmY?5}Dh*H_K(L6T z&@0ouI?*5dqPR@Mu+2@RFn}|2h! z^S^<+A2J0l_E{Y?1iMdxF;t0>Pmqiy=nwCM)b^=~dziyUj5E<=zp80X@4=Jjw51VW zyi1|p+B(7KJP){|p#r(#TxvMG{N+Pc8`e{8yh$(BrZUB$4<{zh16I6BFB@SndGr*& z&168f>Wvpy9;X{|BpO|6#)DNdq{}q$56(4I439U0&;~KWvL@fT+;JHTc;pkMNtL1n zzr5N@P%kIEMT?2DF2Ex zaGCVH@70eucI{qwrbcbNn`9u9gf|)IgUooM^9M;TOp_%Me2|M0=p~Yy*^_ZjClwKk zPx+NxSzuDiJWt7Qd)T2F62GCMT5qXcR)i2zmCLk`7O?zLeibnS14%?{d?sW`cW0p& zM?0)II5Q>*&DwQ26o?XL`U@M~_U>12ObN|39Voi#vbC(F-_yrE*bfj*gfTw$Yh(cJXs`T*HA=WY)?qTQLdHMZ^PthZykX4cf685$IuH#^4T=l;D?DHmnfYn=sy#xrzl)9UrU}~Hdu1H zr8|`!l6oKnXEb07??sMY`Y;)vVqNr!ZvU_d#nfAjN&*2Qu)5w=E|>`hC3TdgwBkc) zd`>u9H+0LVk1nU#A^1<-`QFnF8w&umv2=wy+?*da&{vWvS_O=xqg3%P1<>_ ziUCsDp6+MDiL@mEzqHr^30{1D-)sX3RSmz?vG!6wa5f zJ1!$B!RKziIYmGWxl;G#>D#MQ$iYJMXhjRLt^9>&6`88}l0Ya?tT=jv9;2paz3xM0 z!(#E}{pE?)ICo|$N$tAll(n~2C+d0+5;4(+;eJX_jq~6l5Z-(_{6%J_|VI9B|tcvEu4^w35ogg96mwq!(9`ejKHqwC5@WJy)lMinmvpcPr zw2JyRg>yGzvDfDM;>u~Zejxx>W7$wxPxg{XxYIX;gdyTB==;W6;v7VRU?`tUF>j7|onm`q_3RScYb$NvqZuLXSz5wqU>bb=QsVlV zTN44U9M^bd)2+b}mi$6O;zJ$;nr8@N(u>;n6+fMeC`R*kF|X4xHou-y2GAWyqUGE= z=d0R#J*|7dd9exKBExdT1n_766)Z#JZ^^-1*L{?dj~1do3TQdZl{=Do_z7V$=jW0T zu@i%(c5gVxpCBmYeY!H#HflK8^2=ytoZ1G_&F!j;f*V!YKNKw1+`Dy|96eS6-WJv=C*dRO_?TE2&H`&R3ZB zb1|wFq+0{0CC1P@o=?GVdpECIBLUi-V_}C5RUIXSEG53Lp zY3eK3aYwwK&xbv203OJ>6hG_r3DY}BVQR-VrP4+DvWyKy-1)JyMFWe)=g}VA2S38i_EMby`)E5U0^;u%buZGUNQ>4bK5Jc zMCQtSVe%DGat%4=_MZOX?G^5nn{iJBM++lQ%<2O-Qe$ljc+3yQAcu*ZgTOXhn8gpZ zh5wt!hf4pg^;^1m`N`d-|Cz4+3&&9DeeqZn3If74zyOma^{!h}T9(}!b`rpHsUu(D zK7nW0HoQ#s!g@x!X1S_a$wXpuI!UA0!dQ#Bz$Rc?FIX9%oA#0WzjOUqjc+(ulFxja z_Vz1RuDp_ZZ|_4Jx$Y$Xu=gkk z6-w%R87Ht&QznAQCGUzaqI^LyO$9i2ptx&nSX6I&{>!L|rF2W8(s%u~?=@UV{WOqe z@=n}pjuM=*Qv{}u82M^YGqB2B(aE<%)Y`+2Uqvq|7 z8CsPU2Avd6bmwG(T5$tZ^Nr9@0dLh#JIovy`)MDhCj)3yL_C%T2Pn5U9PO<~C z8R;QrQB_v-;j4YVBT$pu<3Yh zMe^Hm)mGtSO%?LpSePXQO#D@K4bS-d_vxQQ+Uv8SC#0A5g*adO(GABaHqhmYA-~;h z08n{FPd?ZCUFFzw1;zKq(36;j{iu(v7`e=wcSfwuwtz!=0b^aFXsbZHFdVKZ4;*bx zQ)2b-^h8m+tX;Nl62VeFnX{pn^c$WWAy@afZZp+IBqL-|kSG(*cNG!ag!QOr!!8>$ z{)`IrSdW@_nbhy@T@vIo?mFL_ZycPiRXNl<6RJG+Z(-~k>=XUYU)Z;+`cXHEKsrB|I(%Ia{Yl}!%K3%!9U3wNXJh(X4LO$a5;I+RM z8Ha&(#5S}(NJm~j$SPZSHojp$P-L+%TRJD%5+#@b6(qZ9U*3HMpe$xFhYjB}CPlkU zhUrTtw_Z+M^QV*2g{EO9C%}QRXX`kyE=E^w)jT6YCWU-S?Sd6EeN$l`2V?-28Xmro z^;=WfO*J1A1HDV^Q?&f9-!@cuUrTNt0CANb^O56rT}SNArrJWY)!9L0xJ#DmaUDQj zF4-MLi#<9%q-iV8E4}(TKnMF?kU&KOZaLMaOd0PXkcddWaay70lI{FQF$ZA51UDYi z_31VSHF2&&-y}0c@O|JtcALpt%(rWWxOxf@F)Ah2DaIj)r3olrn9T?bmZO2r>bcrg zKrg@>ZW!^rwc6i#ePR6wwv#vAlU>CcL?=aT*qf7}^|k^fKby1_VcmbL^KEvu=H7G-o^ zl{N(qDN2GTah|nuGY4Ckblj~0NHf!$L@a7~h!T zx0CkZY7AmQvFX(ExMOB2m)fLUHY(s~U_cDdoPjZ}@SV2-T!qC%!6`?(;(bIE9j6Zs zS=3S18i}s30q)P~%B!314-+L!cTk+4Z<1nMZMPGu=*BkJ(hwQWrBPX`8A%4Mv7i&! z?Kiu4ga5n~`3QPni3sZ4U8=#%Gj5ij8YF-^s;c?DB#GH=6Jy^4=kv8Pn)hPWD4|v5{TybT=?AQ=EaaKo-TRH6J4G zXt$k;AWV-0T3Z)pG?iM|)-@Y1z;KnAuj#Nb{ zs9WeB?k89wPehXoIxcgG-of4zSmW zFSXL4z<1f0{&y>B4c!ZmOop`GogE7|{b(d&vNMgOOR+ih(skRpp_#C_PW{>9F)Ag2 z>^(Ai?z<39auY|VIS;tg)xhzvIG`t#eFDJaG2Kw9U{d=V%CYK+^{Ql_t={#B-O z-JE|atCluc295OEVxZ=1YB&w)mF3Z}K6k;9a=;&38hFEA#d;{^8+Y4M>OcgB7#<^W zP7^J(VgWUL-kfT`qYQM)f&eQOVb0)>^MyUqk(4}`7gaG<-k0C4X-voDu)Oin&EEo> z#>k1kaKhcU`W19)(~ch}|2sz%>7Rrvp=wC_Bx(%dph%;sAgRgogfO>rU70 z^(3frxofk(BA>Y99q!A(Ih&|6UAWMEO3w5($Y#*jsgb&Lz6J@X8)40@l00CpL^1_z zoLQnzpdl;{s;VoJwicP;r?2jF7=PiOJ~Cw6Z`xMoU^R9ujjRdCPYnyL82kB;3m@F6 z_sN)j<@|v1;%5243FR9$%{hDuR60|#PeYurN)x%P2r*dV^oIg$O#;Q4cRLxknTZ$w zL-1dlCnr{}%H*};XIDhyGtBgi0|k3_p>hxij%{;ymY>7$&!F#{fry`gbmspkP;6H) zy2BWQ{wuM8TI|_Lk3K`e#kZH_K|MC&2-Seh(<~^hpt67yN&3&-O1{yN>bcgHS4j+z zyv+Y7@dfpBSZM(PfiZvB^V^g?Ixp!B4Cq4f4iP^c3g)w!tY7ZdGFRNL4`GYjoH2Jr zmDo%*K!=eIx>SCruRaln7J(S^yAV}i>11v*CrZ%6zynH;!;nE4+blG&tOg7?3Q{b> z^0_{U?qpg}I#t*gz`opqcj&`RJ_d>>pg4PLJ2*ZhfuJBqr|zf&u=HZg(~sIXB*wtL zP+;0>=xdNX3GRkjcqu7{iv$`?ADZAnApt5Sz&5YExLl}%6qaF7PLL!Tu`wWug1RI$ z@!tu5+|C`0FI|Wxu31+8=b3B%H(o7?yr6onH74=2xh+Nhz1Gazq^%b8XP%pWN7D+MIv!onH)4Jmah82|^4S($_HryT^nhCvPpb zG@`J)<3-;-F86TXk%&gx#tOucA%LD(AH@`Ty4L8l@*0c_W|KiKYFaV}9l(f!9jf7e z^zET^-^_Uzd-Cb=jUMekO5qDxy5YrDcUqlVF9c2sz2Br96TLFQydD_!5Y;^~#+MVTIs4v%$Vo3{OSm z4@L0VNK!dXv$fK)JC$x@rZO62R!;SQMavRrFB-g~!J;+ed2A@fDt@5g&8!e{ixPBt zmLlH^L^~^_8T*)&JsU%gQ!MkTAY@PyxgU>S5q!|m}n0PoAo5MsB)!C`HSncfS(X2qO(ynf7tS4FGL!) z7qyRTo^1aG6VsR;Ah;0;e6>~!<8PaOm&%gu*f1VT{WNSeRiD74dP$U(fOKp+|sbqS83ZUe|?V|fB%$n zT_nv3s-|w6H(}}TK)H}|E5(1ACSB-NiPNeXL};J$nq@th##yZD0Lu*xl{;xHUebGe zF7BH5i7n4%4qShEk)1cLerLpJf!ve_NQSMlZl%bJ1)W#<$YG ze6sNE3ZwQ!ZN8Y(lF55%<4%?N+C8t{6&a)M~x&O{(xgVv%h1>j3$6j#^ zypXW`K->HH3L7YGZ#-e!{T%CmlJnD4k=o?U+B>^yOKe&=ap*9WfU;S|y55MEarb_B zUhp*O3TYW;GEE++-Irr*d))5fwI%J$4VUvmA@$DPZy35HXz;5dcWnWz^@`x)fXa}7 zM~a%FTk;4LruaO~L!iH7Y>fuE(^s_s+@C7?RhS5cSvZIw=Z8gBZ1PfNXm>Js@4df| zB_}Ha@-;x_!l+*Kk~z~2ItQxgW{G*4P3Xy((s3gJIr#(Z8JUlxls4`rG^OrZBt9kV zQYNsq)Lz>VI+WX{*#ep;EIGdb(D?eyNB>w!*$&y~kAHEUuK}H=>EPz-POn^UaNREt zZND#~N(kNZCyGdVG6Hp@wukh+OS6Og8Eh7UjJMvGOl2OLc#EaIeFPT7#dS!(PQSr} z-rJMpq|SMqx%%WV{)UKVp!S&zqeT#K;tIOos0|@zQ_O9(0O#XAQg{b=P{$kmGGr`J zq;nW`h+{QiQ%P7^NG0LJEvKQe<4gaX1uzSOy1>evt+}W=AKUAyrBMbOFQW=yy>i=| zg`p*neol`TOWWF9YyoK8Wx!I$_v`L{^#zf72)~b{Yeas{n~XTHLqXVf*JO7V^*kdH zqr51f^3zDn(s8Xozo#TRXK+p*d?a5UBOA%b4%(q(O1h`M?)e=&&}p2j^Pwgvc?-Eh z7b=*`b-nxT>H5yA=G6)rTrm5nK6U>kDY}k=Gsj8k3$@+^4tX33s8^ zNBh^11{D?YD4oCYzM$U>izSMmh|0I>K`Z#Q;@cwU^_;g6yzMq`wf889g+oHIr{^L7 z-^(NO&7G($PKv}+?TEzR|`dBh)I8e%n))_V@w`@0|Y>FJ+i6Z5Dg?gRhJyV zB`g9(k8~IZW6#T&tuXcEVY=60&*OGgtluC)D{=j)89bHWh}*?w-5^^$-HrhDFVwS< zUvhy^EViETSGQ{7luuV?n@R%GD>l%?;6Sy!Hn0dedQD_g`mkH_kPI1Ba^g9RyQHyD zt5IR32R7oBBEw7MhAo?-Wh?ISj3OWvIfMyix+tL)INBW9&pMm00MtEJGBpZqoE7pM zmn}zL+vyOy=TL1Hqetw@uE^`+7z=ifz{MHoqJz^fWx^h3n0o$0=$X5 zZR|S!?nP}8qWEUzy)dc~5YL|6TI~nGJ{p$Vc`q;a2CTdWh)Lq}r#ylVP0<|lcm-nt z2@tgXq-8>|jVhI4eEdB=M-TbOGgAx4~|3TyMT73=xE<;6_ab19y8+Yl25%Qjj z>wh%1*+i!}jRJVmP8)p6c3htHpufsTXbO%*2XuH4LzMlQQNr$nj?JRv8GLaBeuXBz z?4veNc&M^nM|nrWzpdA@m^=2r%a@F4zbuyyhFH6Z<*Tr=x=uT&-|JCwLKDy2$<}~e zOPAycy9NDy8HqpxR99x5VVw|;1Y?ZH$L6`c8Sj##({S((iaL*5jMRz=1bh7HPVeBg zG1%_;{0mO|F}tS7h%gT$fpN`j?_y#DEa>kvTYMdiVsg^Q)6=R32alt*wgVJ`CI`uN zAV37uNd*;Qpn1ps7DOf3K#@7Gxko{fn$lQRZ3IZSb`m8ilM^W=PIPRhJuhF|lo{Xw zL=bI!Y;){@*sEKwC!x4ycUTy`kw{)QzM6}u$u2xh%B~zJJ;PS8tGfIr-n+%00G+-( zI_Cm5Sp9hQKfH`rb_1FLjcrWv32Oz00-lkA%lQQ9YK1%(j8Y}fz^@}qYZxpxuG1n% z7kvhdev$lyEU2X1vEDbl37#Q=6*y8GK*TBqkxgHgE7&VmWDo3AGsvCQH9*`R45JvO zAIa80E95l~s(8|o54hzgQ2y+#^!XY-2t?cJqY8Jx=jMupt;*Y*>j~n1XXGJ+rm4yU za;kbkz=t5LSVHDQ#fe2O%T}N!#tIRkRibKE^kLtWpaOIXVvN`Kjc@c#X#G75z$r>t z%W>KaXv!}A7*L~kv2h&FghqYEU7QN~$H6W`&|wd_r#?2O#-G>M0r-cocKjN)O0HDH z$1Az;q9Kh2v9HpbQ=h>@?}KpL3yDhktsTxXao^x6=QjX<1mB0 z&;fmVGz;yD87kn;c%R_XYJ#Z<<2H|4-sS^EgyQ2d=yf4-5)jgzb1GX@8Gnx(J7!;|4!lI2jCS4l;6K9u)P?tL3l}of2{`nqR9BC7*!-mR#o6Ya`gC&)a$pr9Ih|!3-kY z&J=u85Y%*4Ew1eMB;=zc$K21!ow$lt{czcpjMIn~`g)7xu~wQ6pNJ|$46maYuuap+ zg;c$`z00TXDO}3XAtO1LNT50Oa3jnhhRBSgSj3eh^lXZ%Q85)#yc`64*rG(~V^Djd zQkG^cTAsCHEf#d(RXNtr@olt*)2_N74FuV$&29G@Ff7GTjxoRPU>(m!1%Nr6MlFCjQ2gE;v}lkE z)c*f%?&vR^Y{GYvC!z6`F@>9V!d>viRc3qxJbeA|i?<(4vCi<<^{mP$s^*<}f|xpx z5PHINX~4OuV#af#3WM!A&p1{XDV{{u5BK5#V_kDnVPm0@_3lJlLSp92JJ94ii4;*w zOEAbMlqp$<4&58ovk|Wuw;c1>YlU~#<}xgBQNxpw*W4 zSp==IsswA;VM0l06emmE4O8y|0_#3O_mr~Wb$zJrBiYckLbAi;VdrjR4%aj^y10BW ziG~rK)bUne_x zyg%jEbEy0x0uK`b)j~6ITn4cC4l&&{!o<;8WcQlS7jh?nlV= z=vED4Ws6vNvwB_3R2gMlqbHp%oixtST!ap#$}pwsV4cd5h6>x5nbGad@L8)nl~p(z z)W{#g_qVu?W`Hrg1r;mWU-0dB)<%2}jwJB?D^eBCOKt2pb4 zFTy6Qg7U^B?rk_U57>q7naE{kn{OamM@jWL|I&)yvVpL?qG7C-hHoF4d-R-YUh?ut zL^1)-)ZSGOnF2ISOku%Iv9te7(&!Yg!$N%EOYAU)Cq0d5TVBpXgy2C26$xrK$gcqPs5QM+|iuD`dT3w%Y!B+W{NvO{mn>4+JiCDl45LE=x+%u$(* zDRvr*v=e1Eu1+;vkjyvgRCn*LetEASI_uI7MJyer{Fq_8F8x+i$D9??oFQ?- zZi-M&;5HraIg7Mt|A~za1;1D5XiFx~?V%kxj@Te?$Hha!3 z<1IO%_4sVHof212eW#E5f~1^`FwBck=ah6xcO3pn(4?MhcY4*F;BgZmL$9As6ImIN_vD}Cei8&n`XbrtEiUoZ!k|~g(yy8Sgeq}Kd2(_eS zv#|Z%qv6TjfK)Z}t^_HyuO=co+geKLxABakofkX;2TmGD%dbGEr8U0{!OaI@ika%% zMY91OB|A`dt7n63?6?u2)jdhc`4!PuWfrD}D_xc6j0KAjCap#qeq1t9Sh>rUFsd}; zu3>(dEGQf=-eFUMuAeS5C+nW(`10*_1>S-LeGE_T>hKsF|utP8~8w3g;?XAZy`daZGT!{y{ z5|v*rwvQfKzE=QN$bU5xnGyA2S)>Fp0j!d19i^Q($n!<1{kumKA?6o#Niezv*b8E{ z1@`6Fp(><@g%1RonJ2>HUBhwJ6dmXYehj2Y4CJA5{&Jbu{)@KA3c!v=Q0RN>EJam9 z>j%M^h@FTAGfCh7v2y)0Iip5No<%dLa>bYzXcM7AlEOmG!biC{ik6OsH4HLm+C(|G z(0*s#hl?jleI;w&LIZXt0010nZOuL{HIV+oI0Z7x zk&ZF>ayra?S#rs^yj#7NER$scG=fW2X8|-qT(a-kc4cZXhdt6Y`g?$;4r3;7j1)FL zQXh8t{gkjzGRh-=GHv~<|c|D)kxoH@ms4^Cg##N8)Rj6%0Y?}au zNNQV)Z7vA2qM(TSz;!xa+1zpYtw2)#R`&_|U8Pwcz7@oNMRUXjklsqg33ZO6F1(h{GU|Q`yoeD6xGyt;tEZhzNRTAC6F)xJKLGCfK zFW*Flf#&qB*P0*F6(C`rpYIFry|Y{6b?mNrKPli37%IMRdadOe7#q}YpWFVBO9qXw z%0$}57Hq198fI$}(%U$I1`gjXkn|;1B_+B)w<;VO6s#d$rspVU?U(YD>{wzE<~eWO zm}345MC)udST`Q0{es%9?D1jFh1?eb9@3>e3pS0qA<9_buBeQO^(9T)G1mcAo=b_v zABcF809&3@FXSEtr^L(Zh-k^52Phy7v}%iVC6XFX(FMoG%G-`|18Ff1Q`KV8X5z<} z;*F9k@|UNNRv%z-APqQp;q27SJC2UroyC__q&Z_8V9LNoA96VFV~1qIZtx`RimXr_ zIghEI<*yp5FS`_UIgIQHuEY_}8-Rp$XZ?1d(L z%_|dY0D%gnYr<<-BZ8&4n=-KZgN97wO`fGV+=8>yK^cELE|b*C(;N);K1~`BupyZ`)EP!m(d%TA*h#~<< z@5YLrM7?vWt?!z!%;?CGx)_DxG96VzskrJnzoJbEn#sBnLk=bjVYMPp#e>ie)q@Iv zMdtQRLEA$DS_Db$D$^x`2hol8b6>O&1@O`(iZt#U(wy52lLKQ67lH6emf%P&Ar%w8 zVwU%oIrIAGztWX&_Ub@_^So2JWV254D*oU%?_%;D-n4LKvigOXdP)7ZOqu$9_M4}l z4FfpXnjZYc7L=g#Q?+uGGn-8eScuy-$J2ebKQegXwA9{&^%H~IB2){>PU;fXTc}AN z8R*15wg6cvjlZYb_7%{@2?bSM0B9StZ(}!fd&m-opDFGH0?a`qyX$wIPcmZfwB=&& zg}%52xq+e&D3NUh<3~f}Q;igXhn)_y)@F|>CRB^C`R57}U?k{4HE<)Lm!zM6Ie%q# zB}B_ulQE4nbs%ZVK}+(wSt2>-(LNiu>=kIpWJd>5EU39I6C0d;Fli^%=N`1!mwH{h z3y2P8iY%GX5(>CPajg{yzn-i|n}gAhiJ}T0J3Mf(gJ_zlD>~u?ZL4@<`I#h_wCR+( zej$&e6}vzSPqL-8k>dz}i^Kx5+g|m-R`laaU1+~63X|=KFJ)lpr-MW)p z{Z-a(PZFO-TJA~OqL}OXx8idaWtne> z!pX?eGvp2eggUz`S~%>q4NUCVhgOUMtN~Fq#EZBi%w(?9D%uMgCl%i-Tq4}eeP#8OHX#K_yTaLrX==x3?0WgXU>-bLm?!N!b?75E-fV}A7NVba zcg2ODML(J?Q~N9xQXhbS_)|0$CIOj2lv!tC;te30xC7U+39_9a9+N?0(`Ky113LaL z&#_OL3gGZRdj|U%+Pg|S1m$SQs--~Ds1xNb4)xpILL+>4-r!Z#@Cq<)z$SYu!`p8f zY2^>Ttwp%>Ahvfy@$RM6wn1qqKEO7g%aFmmy>#CYH#73Q-fg&iD#9K#Xgv@|(n+@) z;y|1A5X#ij*n$_-J_zyisgRSSxP_JPKuQ-kKUzbhkJ9MVBkxEeGh{T3kKn?=NCH8b zJvIgMe|Lkmng0m1|89tRIZKH13JZwK+f^D^_g(oJdivOheY*&Tc7x2zt122)i2%# z?Jj>)>VVQ1+a@z{f<@2GJRvAU%P44rjwx713c?&x!)#kpcQtVVRO}uaU0wME&4)P7 z1l}*v=#*D*tUJy)O&8a2MpBX-`(x;geZt^GkH4I%hXd*9FV54;H(5ouDD!+)w;cm^@FbX5(I5#-{Y)ey%G4F+Sk{FPY@XtZIr=69203slHLIeVg+I@_DZ3gN8ToJ(4(VpBh61J#?FUx?fk7((zFe(HDi^nz1 z(SJyL(f5Lga$ypnjmxBWjaldujvfC~FGZTrLH=sMwGNq40l@Sd`!OTHLX5srw&OzouEA*vDn-gh0%*ryG|_9 z4sv(*@6b_Y3Tn&&&0Ouicn+!J2TW&V7D%H0yCu)m*mUr2$$ql76~EoV7Co=N?f^b~ zTKL^2WY`FwKe6R;2YD4nYq@K+y1vj|(xG@@VIt#poTd3=$-w45XoMxf6eD2v35b{Q zQJO%!-@j0mhiNVc*!jMqC1};UbDV+he3`Uk=-eCtv}qhnKog9*haiNAj3Y#QWXNHm zL}*!yh2}t`>ufRQ4FdlzTf`;um91EVh;1Q1^x(AtyTZn)XE^XO^VXCaIu8x}fhy?M zy{+Y5fYR$p;wVkZBgkwEmJ)t{>5$3kQ+fdOH^>1uhz00p=D3k`De!{{jb?G8{Ea>{ zd90;;{_|XKWGVLp+r38si0IvFNsuX4QhTAV0J|HV9PY?_y)8!t%BWt+DUXJv;UTvm zVZHDdM2^)45;o=4vRFXCMZ}+kTohXAw0FN_`HbYBnl_}{d(T67A&@S>^``>_N)H@^ ziC>lb4+AA2_8{e8T;o~Q<9)Dd8m&Y(;Ao^l5i^JC$u+2E<|HZ-tWZiQW;kgQ?01#R zqj0$@8*Ru3YV~$Y^?c~BI3`85A>}B{S1OL>!CLgm+CZ}e6=!Ks6oKeWrrBAHmJHN< zQ1dJo*eDBiaYw>D(h9(9mo!=R>=Sh2jWk3Y5qsTG)E~HTeD179nv^8R{Q0bVEr zZ^Vv_n~D8MAZ008=VIaymSfl=wNT!ZrH6qQR0pL*?HGMR7ganKLk*}p%D(bIk zKLVY;FQ6QT68rK501U6kQZE2?J4XK5?Kr#9PnkqXP>!%&!|?z+;j?eU?0uh^IM(g< zpnjWxi69=0Z~K9F;4`D;e=S!WBSv}9555J+L7-D!gY=<$@CLuvSD1N{^(z@BhLvsZ z*x%kqQWwjGC_O#I6ZZO3r~=g^5}b6R!VPpw%|=k5n6cQ1 zW(So+R&XdB8h52oOb!cRdWhZpPE#aUNK_c7IXw~SUQBIPI9UJwKXLK3!L6jNc)Cu) zHH5m-L046%f3jv|_i_us;q`*!FEwYrapOh}FkPKX05E%EaM250m6Q(gvg~mBC+$1n zcp;^HO-h=PplCAn#=$Oyt@)5zMpfHYlVFa{jIB#-ug!ZUo3MudNMOWL+{rUCuSDjp z>}9Z)#wgGOGIFNz6QE@o+8#S1u|uHc4DMsOS`pHea@239-9>kF_wiIfN)-5t-f8zz zn>YhFsu~c=rG-q)LHF)n`k;|vwy)>hK;H#Uk#e9y8`Z~BPvk`Ih5HwKin2>U?o^vfjt}O#mkWbdlJd8O{5|Y`wOc*#P}m%O z=35b;vr;YA5ID*AS?vvK-vuBOa=3*;L}=+x0ii6P+p-*@@;%l|eE#;9S6&Uxf?9a` zOAfjjILSUDajI_-6q#j|kJ1=Gg8jRXYEUIulO;T^Ni2!G?Jd}`0&`@j8NXhP$|q2;y}H4G%9gv_M)=B`tv*`rxf zK#aaIbaKcGcr~Sx2W*FvO5&>k^H*yZL->VY8o1~KgNpf+Fp+`&Sn2tEx$8OO=MfQt zm0AK}v=FofC*op({#z#!DrGM7poqH3=7^iiE(qIhCSK@vRjZ5?iDQJPJgKQE}{;|{s`jJ7Z$_$ZXM}{|R zGomMP)B%l>)<`7`q&u2;YJtpxkD3D+ae+)^0Dc8)d{kc!$W^L61%NuOe^!l`>%#ds zVANN%U^&Q_aEaz%;*w z8Rz8dw{n`F8ILFV%dW{D7a&rO?&&k5aLhae2^mU#(4qa!sc|<(VCI`A`Z-~pQDfp^ z;3!PdfH~=&AofI) z0^s*#XpaZcyBf~pz!v*N!6GRR9da0T!2W!;7nstM@yye}zYsOQ_o}iQH+l^i{{CPg zDxJ{oYi>G>An=^KB!uHMp-WK4r^tEhuzJ>|@5GPqpB~hudnEk^YDlH$pP@S5pEUuP z?H#T$qlHCxf@E*;Ug5zajd%JYtHdSNn5LR{$uXX`xl0Z8fB4|Hl%P z6DJ@ob(TVAcR^8~JMgv{A$o$a|6FG$Pc5Ac7SIn5;~0o#+1eT|fQHd#BSU~-sK~LI zJG7U)z}IC)s{^!Be1NL4;MgYi5nF7mcZ}^r^h9;+nTJ@|DRD@XL@7UTHL-v;Aoj#_ z?2*F-3ij%HWRvWXDb1;A67?S zYycW{$8Il6gyr+RqT(^kui#XX;Iz3@3(5*zx-dVE=68cZ+?@!c{Rm@%2GywD1t)i- zs~PgDMu4Q4n|R~Ht^bve7Euvq>{$i{k$N1+_s+yBVMaaOX+b{y2-tFe@X1ip+)jmV zX4YK;^FrXXc0skSr{+qx5n25kf*%uW3nj4C#tokQ710fHsOd){FS6bONW33Zjn)ij z0rnm8Wa06pz?59NFOHc6*|%4}xhAyYIg_*?2}LJ+p+ymbuXHd^xhV=G;sd^R;r{lk z`jA*BY5|qy5ir~{x;%EgE93lVvrV#K56`tggruAWYRQEdMMKHBs`$(4M?M0p2{?lH z+Ve~i(nDT(V4l$luYqg>WZ;~{o(iZoc(O*J`4Rg5GEVi)`%7TubC?KLuO*0k#rwcv z@fPcld-rmuo3u1ol>#d73k>p1P{Rgc2c$QVa0x~^E^iJ!iMJyfa}IFfx*OqqQh3h5 zSBFD*?h2wlt*(Bh*L^tyVnLovej^N`yi8hw+d_XTS|k`qiJ26N@Vp1Wv08lCnP(jI zQiA7{_3)QqH7LKU3GT^Xesg*-tveY#fg% zFk*4efz5D!65MDM!j+``(-EEhU<1KDD7NQ{xX1SciNf)CYqcApLYKdBhvr6ya3mM6 zPf)b-dyaId4@dW;0FM39ea-~hmMy03={k~vBwh#8MsYM+)}Yy3Z-OJkbE(p&paT3Qs9b! z>b8PVHDCox0zYYmT-k1PhdSZdWC^3w$LA}pb-FKBD%(N}J}TBbZ4h$ZOtEV>$*x%C zU80_DBA1DI>Y^Gh4Q}$FaIJaHx;2hmn(&MY$@BZSpFhl?(x%!%vUiqV^uDO~!@b(i zMPmw-H>WXk5N~~w=HxgwR+q;+o11AN0IU|9@L*}ZQS(t$e&tv$`+M9>h*g6Mp=`WmGAOpJ@82^kL%hNR)R;}>dtz$qR^9YaLRz$m(DJyC zLj72Cta0~8D4hZwXHvqaPldv(PE)AHDUYUj{9?><7E#hJEU9a? z9Sh_;`&+|+bN}+~&QtNTW;2fQ+T(y7M4K<}&Yvr?gpol?VP3A}3ouI0rhT%T4TOID z%iWLi8)7E#ujF93L!!)exNyV7GtU;G1oX!&CiBV@@jt#w#=F`8!Ux_mnmz z@}sZDskX8^V)FY%j}GQ&*g2I5!N(aQ`j>4)ZR=jP8>wG$+A@+m+ct3LsJ&L@E8A?Cj(F8}{=H_~Y*+uec=^d< z-n`@Vw*Air2IQP<1;F*3VpJ0X-ukJ1FCdk&t|%ftm{cZ`e;9q%rlqB=VQdOZXL=b$ zF3pDBI4oNWz|}>q$YSyYs%>alsU| z9am@#Ka3f-fw8})izVvq-6%55h%2ceU#M9j5qsfzC3UO%#L1*s`T8>X&b^#=?*`9y z(sV}8IZ$xE6mjM_)V(;Qxw1f2+27iAE2pm+o4ZhtVc-j$Q=f`e$~EfX=4aDM^^YBK zWn8=h92LbZm>SC#lGpv<)WvvnYEG;@ELWIW-mI{xS>&vJEiOf6@`4zBK-+ZUO~uD_ zacV__!sE^M&9z~V!xnqkZZ50cJ5~qzrEx-_qD{9LX~hgKzdeVJ?VD5ipG^*I+4RD~ zZb47(FLU_kFLU7qq>f))xp;VH@;9$6u`fSfdOF8+lYmtF&O^d|Q`bR=VkH1Wk#Ji{ zx=iO7u|>qElLSOZcQIbk0E%T6%n{=-y-_2<7Nu;$tna0GL2x#+(rVL5a_ksioR!Dp2gl!Ks6NGYFpjAPs?k4n@e%pe#BT)YMeXZ@Fr5mg(~;0 zJ2Mw2-k*B&@|N}3t~WuDv`sTGWH81lp2js*GTbV+3<)`m3A7_HTrhEh{k&*jG!r^z z&lYM?!5jaYA8%E4 zW}9MY^9!A%z2&4%b8pMY#M}bAI6qUr@loC~GMm5R(3|SYO5T|k67XhgtA$)expn!t zej8vettwH`n)ID?EfI?CvBf(VEUxghuP9nrdH?fR311oAKDA=};j^O&$G86SyZ7Cd zj%epNfw@)0S<}rhn?X~3FMvHZP5DAkbnx|9fqMR3jH7}J{V#A~PNh;BHM451l&*ps z1pC!OabmaF1z$15HF$e_*U_AaGG?Zln8rAviY$UYHlyX@2`0gX2qgect6JuRQ-gfl z|L$V|;lihK#~hB@rM_roqmAoB0$4UKN#SW*lP6^H=Wqx^#m#u{8yHJ8G&F3`di1JUP z;Z2l3TC^4Fx%ZmOetA<-M-^?Mr3c>1k`A$=U}osa78x&)yP%fzur zTiMf{L~`OlV3F}uGzpsw>6;2EZ$Wk4+b^&&jMg;g#(8w+9XsK0n8XxK$d7p`%68=@fe%qqKhdeo=Z(obAs`^oxv0CX>+J;MlWN5TCmxm_32m56 z>9zW(tu z$>8Ly-K$Nj{`B8C(Q&~A`s*kZw2vqc?F0?I;bm&w!g5B`mq<1gd#H7@q2kLLsLT97 z6LZ1l$j+JV&2)})owXCs=KH`41aQvNSyr7vq^1si-1U^ej*&=jwZ5DM*hejYUx+{R zp_2h4&YO3NkDpm2)PEPtSeq17c`2;j&LnuygA|wFhZ>UrvsEhLK{viiDRQr9pRc$X zos^U$TXhA#dn4}TwMK4o1}`%4sqPOaE933yN3!Pfh2E91Ku6JV0nS3GEJT^M+SD0H zyHHJf?>W)d3k~Uc^)_;|+uKCd$Tsb9W8`dohs&=(PshjV_F?7|;kCRZhF6(hTf9{VTg_Z@%ZLpM+zYoZ?vw4YXRwgTtZ2`9`*b zvv60olg!Hjr0-O5a(~qf^j(rBsaMn|fV3+MykF@O2D@v0P2*=~(@bRSP*YXs=;L7a zb_69h7}~>qRt%i&(rFxG1e4HsAEmNbuE#hAXcs*~CcuX(rgUvy91rtg5WA-p+ZmHK zeU;~P3W%a*`&n-rk5j*S*)QQ{SUCHRQcfB)cCse+^nJGFsX;g9jUe0@evae$eTS7zyTWr1y~sa#;Z8)k^s6kkKTk~HzKv&sX>MD! zbP+6WAFaDQxYltCQaphBUP9_`0fBhOOhJE0v!-GnVig;6xo9%J$p4W-|GpMifoF8%usFlkV$U?oSIKF4%x&9UfsVciD0UVbdHemZw?dv)pdxe z5a@d^Ev;1h(&)`vnCBL>ywI308&d{8_P7bOItv4#Cnv}E`Rl5D^NB7`kvc*`eU^3g z9en@FmhFhaQO4pbotFI*Gd~9rmEh<;vdvyAvC%nCq;g}elfAUcdu2wHT-RI{&C%RdL|Jdl7&l{UZb zCLRZRpOCPbt8jQ9o_qM-q)xj48W{;K4cUX&0QEA2j^RK?_X8>5gUCUy{ z6O$dh+z}g>D2cdffDi)Z`ymmifgF>KE_}EEQYb%J_08kRztggiheF)|~+6rXFf#ml`q{uUp$XA^UvcMf1SFRfI)S>*pztQi{ z9kQBKtY2>L&S65v?is?=xPeCsvN4M4@wZc8u#n~39lViHhOi+rpa#C(_%6imQvEb5 z3HSB%e`f~YZQNV7*B}U{(ggaRJRGH#=~UQiEbz1}VdhCRv;%ME!5ol4Z5CSEue<#B zy}P7=|Pwk9b+r=XugTp$^if;m3c9u!KWWb1GhNZL6jVcb*!k_Urh+db`M&p7$n4f z>){IIiPff_+MH8Kf4;iz#qY1L@NJ1VI2q!g#Jx6G=L3$C^q%_Kd~_#NH8d4@aeo)q zzq5!DVvtR2dv|0_H(p={&_9WOyQ0hwcjsq;y=wol<`mO!Y9*I_RLbdkEoA5f-G99n zRfn&L245$&TU&5F#{nQ!c+_=L`2DKwvYs;Olh(juN7du||%Q77AmiF%=!w$^6UR&;b zED{o$bIrG|{t)}cd(E%wZwU#krQOH1<<5I9LMpb;Bq#abdX?|bR2HmS7HW8Hxid)& zVBWqw8cjcaydQ?FR#>%Gh8g_M@B7SwaDKuI~;HC zorbM{pRhe=T{z`v3!eu_|N9TB+x7anj0wl?UjqvGjOx)Ls1(g_)}R0P7yQQj@4M@14`1bb$-(b~@GD{yWK!DV;wJ=Hh2_^m7d#s{-(_a3&lKSA7c3Z#{Ct!3w*cF4fp!yZ#Yqw{#<5j&@X{L{L9=6b?c)>1?shV4PAhG zbR%fa;{WVltdD#c#6}yG;u>q_yYS!ZkNtZtbA7khV5#dy{(DA-9Q*aN{R`)ZFE|LV zyEJ^u@>j^i`^&mZTX$*SWLG~ucI%#e-IMob>?q6$iqjCVi-ex^+ugC56xc#%(vYxK|)Pdj+$Ls0J&rIqErFbuq_hThL&p(f2 z!51RXevoKZbNpVX?pXOIH1?^UeEQn(_rPH2Hd&;Y>aDFe30J?(Q%f>vy#|wk49-FU zx>eU_%H!A8dWcqme-Ap-x>_dpZ_=PE*MUr1ZW#O@8o?e}7hnbN)bEV_z4fnhcBVGj zD?CH^`(XvF!es`UoY;IZJ@J2Y$E)507mtwH{0GA?>7jT%ew8D1`(|eUAX(e$?H2!QzRDDk8L7sD!-ip|fwSmoq1a3SVlZn=5Bn}&&l`s3Kt*u%iBP2B0 zq)Yiz8~&l?<6yy-7&F&~Gc%EqH52^7`dgXLUvHk-;>Lp$GGAj~Vf{e=J2XIhx@luHeu)gQMCS{r(2tU{Qvr2w+@)y?K`n# U@PMae1N=yc%8DeOy>k2i0in*30{{R3 literal 0 HcmV?d00001 diff --git a/scripts/aws/img/langflow-signin.png b/scripts/aws/img/langflow-signin.png new file mode 100644 index 0000000000000000000000000000000000000000..3a8691a18f1b35bf3fe00f8dc474f299d24d24f2 GIT binary patch literal 169654 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 G;NrEVj2$9!~kqv$*!rGYuC0~ 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

dHs@ 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 literal 0 HcmV?d00001 From 1118958f3529556fb4528f4916d96d977f2a1d50 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Sat, 2 Dec 2023 01:13:24 +0000 Subject: [PATCH 050/203] add archi --- scripts/aws/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/aws/README.md b/scripts/aws/README.md index 3912d5792..d135b1aa4 100644 --- a/scripts/aws/README.md +++ b/scripts/aws/README.md @@ -4,8 +4,9 @@ In this tutorial, you will learn how to deploy langflow on AWS using CDK. This tutorial assumes you have an AWS account and basic knowledge of AWS. -The architecture of the application to be created: [Application Load Balancer](https://aws.amazon.com/elasticloadbalancing/application-load-balancer/?nc1=h_ls), [AWS Fargate](https://aws.amazon.com/fargate/?nc2=type_a) and [Amazon Aurora](https://aws.amazon.com/rds/aurora/?nc2=type_a) are created by [AWS CDK](https://aws.amazon.com/cdk/?nc2=type_a). +The architecture of the application to be created: ![langflow-archi](./img/langflow-archi.png) +[Application Load Balancer](https://aws.amazon.com/elasticloadbalancing/application-load-balancer/?nc1=h_ls), [AWS Fargate](https://aws.amazon.com/fargate/?nc2=type_a) and [Amazon Aurora](https://aws.amazon.com/rds/aurora/?nc2=type_a) are created by [AWS CDK](https://aws.amazon.com/cdk/?nc2=type_a). The aurora's secrets are managed by [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/?nc2=type_a). The Fargate task is divided into a frontend and a backend, which communicate through service discovery. If you just want to deploy resources, you do not need in-depth knowledge of each of the above services. From 4a70fe425df42324bbb8b2c2cb5edde5681a4420 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Sat, 2 Dec 2023 01:14:13 +0000 Subject: [PATCH 051/203] add archi --- scripts/aws/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/aws/README.md b/scripts/aws/README.md index d135b1aa4..48fcb33de 100644 --- a/scripts/aws/README.md +++ b/scripts/aws/README.md @@ -6,6 +6,7 @@ This tutorial assumes you have an AWS account and basic knowledge of AWS. The architecture of the application to be created: ![langflow-archi](./img/langflow-archi.png) + [Application Load Balancer](https://aws.amazon.com/elasticloadbalancing/application-load-balancer/?nc1=h_ls), [AWS Fargate](https://aws.amazon.com/fargate/?nc2=type_a) and [Amazon Aurora](https://aws.amazon.com/rds/aurora/?nc2=type_a) are created by [AWS CDK](https://aws.amazon.com/cdk/?nc2=type_a). The aurora's secrets are managed by [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/?nc2=type_a). The Fargate task is divided into a frontend and a backend, which communicate through service discovery. From 7836f7168f7c46ae2d2f71602823b8e64261082a Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Sat, 2 Dec 2023 01:16:18 +0000 Subject: [PATCH 052/203] add archi --- scripts/aws/README.ja.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/aws/README.ja.md b/scripts/aws/README.ja.md index d7fa5b0a4..da43950c1 100644 --- a/scripts/aws/README.ja.md +++ b/scripts/aws/README.ja.md @@ -6,7 +6,7 @@ Langflow on AWS では、 Langflow を AWS 上にデプロイする方法を学 作成するアプリケーションのアーキテクチャです。 ![langflow-archi](./img/langflow-archi.png) -[AWS CDK](https://aws.amazon.com/cdk/?nc2=type_a) によって [Application Load Balancer](https://aws.amazon.com/elasticloadbalancing/application-load-balancer/?nc1=h_ls), [AWS Fargate](https://aws.amazon.com/fargate/?nc2=type_a) and [Amazon Aurora](https://aws.amazon.com/rds/aurora/?nc2=type_a) を作成します。 +[AWS CDK](https://aws.amazon.com/cdk/?nc2=type_a) によって [Application Load Balancer](https://aws.amazon.com/elasticloadbalancing/application-load-balancer/?nc1=h_ls)、[AWS Fargate](https://aws.amazon.com/fargate/?nc2=type_a)、[Amazon Aurora](https://aws.amazon.com/rds/aurora/?nc2=type_a) を作成します。 Auroraのシークレットは [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/?nc2=type_a) によって管理されます。 Fargate のタスクはフロントエンドとバックエンドに分かれており、サービス検出によって通信します。 リソースをデプロイするだけであれば、上記の各サービスについて深い知識は必要ありません。 From d18535afe7302cee16d908c3387a5ad47d888ee1 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Sat, 2 Dec 2023 01:17:44 +0000 Subject: [PATCH 053/203] add archi --- scripts/aws/README.ja.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/aws/README.ja.md b/scripts/aws/README.ja.md index da43950c1..01fb1ae42 100644 --- a/scripts/aws/README.ja.md +++ b/scripts/aws/README.ja.md @@ -1,7 +1,6 @@ # Langflow on AWS Langflow on AWS では、 Langflow を AWS 上にデプロイする方法を学べます。 - このチュートリアルは、AWS アカウントと AWS に関する基本的な知識を有していることを前提としています。 作成するアプリケーションのアーキテクチャです。 @@ -32,7 +31,7 @@ Fargate のタスクはフロントエンドとバックエンドに分かれて npm ci cdk bootstrap cdk deploy -``` + ``` 1. 表示される URL にアクセスします。 ```shell Outputs: From 54021d3963e0edb2f5fdab446bf985235c450c13 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Tue, 5 Dec 2023 03:34:28 +0000 Subject: [PATCH 054/203] update readme --- scripts/aws/README.ja.md | 14 ++++++++------ scripts/aws/README.md | 13 +++++++------ .../{delete-ecr.sh => delete-resources.sh} | 4 ++-- scripts/aws/img/langflow-archi.png | Bin 279821 -> 297554 bytes scripts/aws/lib/construct/db.ts | 3 ++- 5 files changed, 19 insertions(+), 15 deletions(-) rename scripts/aws/{delete-ecr.sh => delete-resources.sh} (51%) diff --git a/scripts/aws/README.ja.md b/scripts/aws/README.ja.md index 01fb1ae42..f7f093394 100644 --- a/scripts/aws/README.ja.md +++ b/scripts/aws/README.ja.md @@ -1,6 +1,9 @@ # Langflow on AWS -Langflow on AWS では、 Langflow を AWS 上にデプロイする方法を学べます。 +**想定時間**: 30 分 + +## 説明 +Langflow on AWS では、 AWS Cloud Development Kit (CDK) を用いて Langflow を AWS 上にデプロイする方法を学べます。 このチュートリアルは、AWS アカウントと AWS に関する基本的な知識を有していることを前提としています。 作成するアプリケーションのアーキテクチャです。 @@ -11,7 +14,7 @@ Fargate のタスクはフロントエンドとバックエンドに分かれて リソースをデプロイするだけであれば、上記の各サービスについて深い知識は必要ありません。 # 環境構築とデプロイ方法 -1. [CloudShell](https://us-east-1.console.aws.amazon.com/cloudshell/home?region=us-east-1)を開きます。 +1. [AWS CloudShell](https://us-east-1.console.aws.amazon.com/cloudshell/home?region=us-east-1)を開きます。 1. 以下のコマンドを実行します。 ```shell @@ -20,7 +23,7 @@ Fargate のタスクはフロントエンドとバックエンドに分かれて ./bin/bootstrap ``` -1. `Done!` と表示されたら [Cloud9](https://us-east-1.console.aws.amazon.com/cloud9control/home?region=us-east-1#/) から `cloud9-for-prototyping` を開きます。 +1. `Done!` と表示されたら [AWS Cloud9](https://us-east-1.console.aws.amazon.com/cloud9control/home?region=us-east-1#/) から `cloud9-for-prototyping` を開きます。 ![make-cloud9](./img/langflow-cloud9.png) 1. 以下のコマンドを実行します。 @@ -43,10 +46,9 @@ Fargate のタスクはフロントエンドとバックエンドに分かれて # 環境の削除 1. `Cloud9` で以下のコマンドを実行します。 ```shell - cdk destroy - bash delete-ecr.sh + bash delete-resources.sh ``` -1. [CloudFormation](https://us-east-1.console.aws.amazon.com/cloudformation/home?region=us-east-1#/getting-started)を開き、`aws-cloud9-cloud9-for-prototyping-XXXX` を選択して削除します。 +1. [AWS CloudFormation](https://us-east-1.console.aws.amazon.com/cloudformation/home?region=us-east-1#/getting-started)を開き、`aws-cloud9-cloud9-for-prototyping-XXXX` を選択して削除します。 ![delete-cfn](./img/langflow-cfn.png) \ No newline at end of file diff --git a/scripts/aws/README.md b/scripts/aws/README.md index 48fcb33de..384b755fe 100644 --- a/scripts/aws/README.md +++ b/scripts/aws/README.md @@ -1,7 +1,9 @@ # Deploy Langflow on AWS -In this tutorial, you will learn how to deploy langflow on AWS using CDK. +**Duraration**: 30 minutes +## Introduction +In this tutorial, you will learn how to deploy langflow on AWS using AWS Cloud Development Kit (CDK). This tutorial assumes you have an AWS account and basic knowledge of AWS. The architecture of the application to be created: @@ -13,14 +15,14 @@ The Fargate task is divided into a frontend and a backend, which communicate thr If you just want to deploy resources, you do not need in-depth knowledge of each of the above services. # How to set up your environment and deploy langflow -1. Open [CloudShell](https://us-east-1.console.aws.amazon.com/cloudshell/home?region=us-east-1). +1. Open [AWS CloudShell](https://us-east-1.console.aws.amazon.com/cloudshell/home?region=us-east-1). 1. Run the following commands in Cloudshell: ```shell git clone https://github.com/aws-samples/cloud9-setup-for-prototyping cd cloud9-setup-for-prototyping ./bin/bootstrap ``` -1. When you see `Done!` in Cloudshell, open `cloud9-for-prototyping` from [Cloud9](https://us-east-1.console.aws.amazon.com/cloud9control/home?region=us-east-1#/). +1. When you see `Done!` in Cloudshell, open `cloud9-for-prototyping` from [AWS Cloud9](https://us-east-1.console.aws.amazon.com/cloud9control/home?region=us-east-1#/). ![make-cloud9](./img/langflow-cloud9-en.png) 1. Run the following command in the Cloud9 terminal. ```shell @@ -42,8 +44,7 @@ If you just want to deploy resources, you do not need in-depth knowledge of each # Cleanup 1. Run the following command in the Cloud9 terminal. ```shell - cdk destroy - bash delete-ecr.sh + bash delete-resources.sh ``` -1. Open [CloudFormation](https://us-east-1.console.aws.amazon.com/cloudformation/home?region=us-east-1#/getting-started), select `aws-cloud9-cloud9-for-prototyping-XXXX` and delete it. +1. Open [AWS CloudFormation](https://us-east-1.console.aws.amazon.com/cloudformation/home?region=us-east-1#/getting-started), select `aws-cloud9-cloud9-for-prototyping-XXXX` and delete it. ![delete-cfn](./img/langflow-cfn.png) \ No newline at end of file diff --git a/scripts/aws/delete-ecr.sh b/scripts/aws/delete-resources.sh similarity index 51% rename from scripts/aws/delete-ecr.sh rename to scripts/aws/delete-resources.sh index 8e3b6a261..e299165bf 100644 --- a/scripts/aws/delete-ecr.sh +++ b/scripts/aws/delete-resources.sh @@ -1,4 +1,4 @@ -# aws cloudformation delete-stack --stack-name LangflowAppStack +aws cloudformation delete-stack --stack-name LangflowAppStack aws ecr delete-repository --repository-name langflow-backend-repository --force aws ecr delete-repository --repository-name langflow-frontend-repository --force -aws ecr describe-repositories --output json | jq -re ".repositories[].repositoryName" \ No newline at end of file +# aws ecr describe-repositories --output json | jq -re ".repositories[].repositoryName" \ No newline at end of file diff --git a/scripts/aws/img/langflow-archi.png b/scripts/aws/img/langflow-archi.png index c46ae811dae5b9033fadf2e28bfe33a3852e5cda..3064a562ecd9924caa8493accdd66f81be5d081f 100644 GIT binary patch delta 193372 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/}^U zb=y8i?%10voU!C4ktij?qJf@1c!x-W}#5r8*Gbsv`&h&{8<+;AP}TKRF} z%8;u}B~~GJY*iIfP)UfV?pHcd+ca_^+ViIEyThkmpL|R16ZV#}UIaA)WquPQ#4gA; zvb6JKDI`tJw2OB3tEXhg%FWDQ1Q)j|8QZ>lXAiyp(ULnR>u#iGUp{BINWa0bx011c zeSin`hY1-l`sr4~ON16B&|u7_fw2AUy6pQLBPzOZ$YLH5!t>K+$p6V={*xAAWkl`Z5d9b*j9-ei;ns<2IIQ1e%p#&*OOv{BXQRT4n?^glcycgB z-u&DCMWznn4?{uayv9M+{~W|4DsQsr5Lk7n%l?yzQZ@&|$x{VpmpQ|JSEC3m`~i-~ z3%p*2G7@`n#Cf0TdFJv^b@Zij1p&O&JDh`gZP2%czO=VrBM+h#ll8#NLY`k3ShtzG zV4zRomnmi!saZsqtv$eNh_i8P-nxUqPs*-#tD0DD@5D`Z%ro)AEdF5hMe12)sFfZM zHSWBJ<@L{(Ea1~~UK&SM5ug8-+x#;r+X_#pfP3{gs42C9M06)z2wn5ED&wX4v11y1 z7H6rRDOLK0kZpA6iJXWl3decCBUh^261VlG7k7Z;2-eKDP^qSxppX9Aw@CZ~k&27^ z06Y%@emr}VnSc)znq)^g;v&uq&)1?i<6+`6TLX%%5U4RN=>c1 z#`QkmCYGgDWd5v{v@E|1K0y#V%QX}Ad4Dgi9<;H*D!<5T-$dogZ%dHDDK=q&k;ot4 zAKyfL>owF+`2>p@KHbxU7Y!xVU=0Ol?&3%j`nZWrHBRWZe`M>$8AR9Bp%k-}?k;Mslb0KnW&cFK;%KOp=VfE2NpEmRS>m`rMZ(IPOK$aJmTUmsos{Pi!?(RJM17~oM|VrYeisIr<^Vod z%EYoh@t$uRiYRXtV0Tu@-r^#Wk&)_1IPv33tOPyOoT_*=`GNF%t)Vr{iw^AfFj%Ds zXfiJp8sc3Pg|Ou{VOBM+a>MaFG;_M23A?Uc9%&G0LZtylmb^>zb~sSQ zJhX^b=(FK@K(7iJoRQ^AcqzeV-9&ScE-bRT_YDND7lJmwMZEv95KtLQxgMd;!Q@cW zYCs6%)@JDRSGlUt`VgB594oREw8u77F&9nttxgvdxaY;w?*lGb28{7R#-nFIdJ57N^0B0P_ocLq4tGNK znpf{+TloWfu)Y;MQQ$?8mDdGqYMneP-Z_qumwoM7<}>+iYGd0IYLd6nK|F4d9^$y-}lZcFHL9??5FUaUMVWaAO7tTb>D1-acvM5!rs z=~Sue^aqvCDcEy}=FZB6D+Oy+l4ziS9SiAjqqqmM(azl+tXp4`9Pj~X^e2E&oA0%_ zgLWG49}B7kVRyN{+0s|Z&ygU8XN|opq{u`A?C({qY;q*~v#GY=`AffhzVZe8X_WPa zxUQ>9e5F)CCZjMiHguoL`Av>%8Kdj6m8ZnW0!&xKsT#W$F=f(q%|JZ0UpG8{5Tc<)p&ruhaAo& zEDWs7x-~GHs^pMYU}A=xPrO)j-7{rlV)V8(wY>2q+@yCjsz;Z6v`Qf+^U0Ol7DmGy z0Md8$C8Slpyq24877`dV!M4$7@ExJvOB-%IF%1i~u+ER+$dQO*%983xER((o$=omy zkj*BtT0mD0quDtlkS()(-CS@7X=d(Ixx%_9W9iPE8N&nr%<6uxhe~lP?O;s`Z{=ed z5JydWq0-vMT{Rjx8-91bxE+W))S>=$T(^d{f*Wo?K2c9BRO4A#voa0GHhL!|rg;uy zp4AZ=2A?^->PFI8{kdd8goy4NHjM8grxW0Rb4l^CVt7MjUsLSy1;5gqY|RSt9Up(U z-MkJIC}lUsv@fl@33|{wn=HhK#dnyL8%qspg0`Q^-Ml( zFH9Zigjd> zHbhnlNo`*FDe8J88Tis8Z2+S%(|Ud6^PNgFlyLRYtg_y;^uDahhw%?B9ur;i5sbrI zti6ozwZ@ZvjZ>k9KJF}`i@$KsL5jHA^@0?o zj$_u`B1J)>)Ouv=YbBo}dH%U$z}S16#f-W?>!l=hix&W*Km*h;Ljf{Hnb?2J%e-Gj zvW5KOb_Eked5Od&4NlD@Q)Vm?QAuB|Nj4f1N6v(_PN7N(q=IbLZ)xnmXN#gF|ximpS&*rG+TuyRyIwY5rR0=`hmAM6+q!a#11Z0`)TPjoI*2_ zh4xT)!apl?8PmqQy{nLZzM6FRy z$%we%I*@W5_x|-3R%|KIMo~4`*GLW*eTJB~a16YcPng1`As(IQBfsk)2S(YxsMt?+ zPKL6rJ;Kc?;AZf-td_a|0CYs()N5-zxFRwCS|@YPniW?lKWgUqzH|5NK><^d zpDWIUZ7nuOv9w67nh5vF9kyw$d&aJ5+rEw-qwQQB*)O7)SR@oDPZNCn^&rkug@t7T zo(p8dY4tWL$TA2SVUz`M;O+&)6?oWNmCi9mk)}DCfb~m|DA`E9HWf8{TXaCsK3k)D zuj2%BB+1VxE#>xwgeC3Cr!g3WM{w9W$BP^EZZWO-{q+A6^dbE<->hg&`F{lG>wT2q zn4Z;;>-73lFcFp&AnY8j#xbBA4}>rH1b8U5S-cUp^$(4*3-BveqmZPcVYeD+61hY# znsDCp#@rF7vzKhSS#*IxIx`THp!e+%8gj*cCwptk8nT!%CBF!-13X>%*D$NFocHtc zlg41FL|e6!Z+`IsTMKjopYT#BKRwr=fv50T7Xs59s@e5B#PWZ_`{50Qy~3HLuIW{} zy&=py>Q?J&cs4F?Y~MCfC!V;9tXkIY!LE5e4G$~bX3}-FFm4#pZdPUZ#{vC^xN(AF zAQPwGB7V8>zpoO|P$>*ke+l1I(^sRO(%LUou?~OA)k1B;Dt%l4%&gO~yub zh2R*ZXp?%non_KTZRwvM3$q~L-JRDF6LbpVj>rD*l=Nrfb!5eaz3X*tMP;it5MWC0 zBmDny_tsHSZtoxHp;SOn2@w!b=@6tl6ctfYN*d`JknS14KtMpsp;H=$?if%cr9@(= zLAtwP;O_CL=X}q)zrXKV_Yc?7K?Y{O`+1&E?e}#Hj@lbKGZ6on?-Q}e*|z=eB8Hxv zl{xdVyx_+rmjbPNyu!GUeEfJ5(w)~yum7jWCT|->Xz(Eqx-n0kqo#DPXB||qa-@dr zmQ0u|>B0`Vvowo*0vtaSKJDhoi?XSoM^s2f*WU5(u)Ny;+BDwSAIAHSk2L8kV~|-Q z?e$Dly6z*$x=;*lTIZ$JYJ8KFae9VUP+suNno^?9UqLCexlIs9@Jlx?Y!Qk-rD4lC z;}2SY@t}>Mim1T)16tCaTEf_8YUuR+H1!_@bwi~A?2f2HX}3Q}9J@DuTFHJyH;l+k z;>tufN^}wOW$oP}?_a1{ViJ0eJYo|DIXjNJpOkrgdCbzp(sZP=4j~zCBbrv$b z1nof=J%Ckn4rad?N_tu&JEI_5qBtW#toe^TDS)Fja@DLs^1diqD(fS(hi&gw=}Wtt z9EWVomkz?nYR1y?WB1w5;EQ)#8N!w1%CO1~^F>K^IsaX}SC?Xn=@F3> z`p61n>wzfwn!v|7nc3FuKu%B!%qrWZO|G}BE}`O%bb@6jP#>E`*bup{Yy8;L=hJY> zeaeW+Y>USaZk$zyMOQ4TVaHKm zJ$*45+U9(sa0N>HalKRO78LpfRk{XuGVDWkp07W+BSse}80~)g=u0xR9;8R^T7dgh zcj(?}%5B`{sV;Fnf9-#CL{lRCGg?DaM6AY5IPV3VTd@1SzN{z~uOHuh^8#%q6hdDe z{IBcefMen3IFHe?Vhq#T(@LM^Xd@w-dLcrA-h8aV(4Z6O^YHN|JGlOK7Gvx~RqN44 z%y_RKm#`0)C{Xvfsm^%~g_}B6ZT#~b;iz=r?a#jLDfnB3hihr$(!xNF;xZSCWqxSj zXLfBC|IDmC$gc5U77eLkV{~NZ3fOLt?|~iqTXt=Pbj84~w5YNkLuzhXj2VTvy{gL; z!ArBgUJ#`_mphU&RPb2b#ou75qg`e0T`kssA`$`*i^n<`zsoY5M00GkxZZ1E5B-@CGB>t>;}&>g(M$wa)yBQ4<@c6q zL#g6sJIfRU74aY2>6Ssti_c*l?hU1TNN6mPTOrR6PyN(FCsEn3VrtbYrvg5Mr2>q- z9tWt-_$#menKm4`G71m$MV8^b-FUR{8^kylp1-R zu~up_`_F~J{tX^>0f)>)Mzz9wTzSXJW6X>+vN5xZ~5yo;%v(%HXM zC8K39=$FfnBX@nNEzULXsr{KjXjQZ9-9ko-5lyqMDz(g-f9_)}ld?s8U*q(4i7fm% z5e|=9HWzMpqD>j>(_b0L7ZpT8XDgMrEd~u%lbyp8#5Iq0Q3ODl)Hs5jW%?H&DHdI4 z%{Y(ai%0gq2Qr~3!hhiZZhF~cxaws&V?FTkpT&6lsR}y*(V$QIPH`4n=Amd1WI`?U z6$Pc;v4)2@!BxZYgyHWm;1CdLJOjc!$H@jt z41U)TN0j*gZ*SuOn&riZ3VVp(=Xv4033xOY{=Zu)i+@)95Aec*I~8q$3R_g#t5^6) zt;dgppqSmEr=xq_iQ<^G=WE9Y(_!!q$t0gW?a@PWa`JNXt~lfI&x_6@-DdOZSBtsz zYbb2$FOuG#bgYgF55MAhgArbQ5r+-->FQfTFDATytkb`{PWBC47Mz>H!bA4uEJCJj zmoeb|g91fQU}WcOl%GFOMb|$ebKf1%g6uz^qmhQzwS>~?=3A{Q1PL}hzu4W`DgG|6 z`n#6V;nr-;;avPcorjZR%$=sn_T zdR%I2Z&y7##nj8LO*c2+?~395%tO!Bi_ot%8sGWZj@UH+PhvZJb7Lk_xrSW+)@?%5 zPp=4}*M-NOBNZfsg)1MS4>qTFzdhlh3?vX+9LUp3;U2BZ$u}8NFjjV$FNqJh1_!0Y z4hv@i9qOaxmBHWlZ2HyFUo_)yZEp*Ly>wfzN~O5CSZ<}E$*#vDEd2axk*vytw=2h<&d~f12b^ppzCV-?ow4tr`&~f#*cp)W9X~C1fW5pr z=6{~D!GVxb|DrF(`3DmIy>n#1kbM|>ojvk}+C)K7kxC)*vwrsB+r;LdALW zW>X>T7~#=}$CM*3^LF+2UrYp*`s zN|f6$-CIG8)OnPm>Ad#WRzou~Gjk1*P|x-H{h)V;yF-S8_7f6`9&@n|rZiTWgoU+| zefDCZXBaoPT?RFrwq_au%an&9Fq*{#r*73SdPxd$r-jj*C=_a>+R5Td?$PctCpS0Z z5!d(jrGdQNE@5+&WjgG!t8^{mRn%tD}{dY)6!rXG9ey!^dg?W0DJ^R7g@t{%`r^G|2NoTS8EEQwpw59KaXZ=iF29A!7L0_LI zy+-L~YhLZ?A9L#baGQ_NWunU)5|gXJY(+poFjC`^ht6neckjdYMrK&b0d4@a^yB|H zfWK%q<>M5^cp>Z2iUNA?jk`z}9^DEBWvRoD^j<5x$OcAAchFO8?Pul7coVe@eaa2f zLIT5Rg%KSrBQdY8mY#vO(w)d?>h&=^kY7+PlQm~RiJeM_2o>cu4 z0Q|)YgE%(|VVEa$;;v=mjcwtK<)-aqqYWjbaWnp5Qb%p;LM*)5R{fdhr@?|DtcMUj z8)HsJ&>s_(e8E|Td`Q^wYNZ`Rqy)KANic5>IL!DR>_a!QH}--tFA650$B=T%zI!Y= z%&>%G&mJ3&{+N%EkxF9nJPikFZd$Pn@kDGasAi^un2txT8jdShi>>-u#$87tYs(6= zSu(fT+1nGNrbo}dP#GS)!A*)M5^or={W?j>sks13l*m2Nt@T^R6HJ7y0@CeU-2MUM zri3ChV=V_i=+Kcl`RWmSEwuIr`sTT)bIz+H13XG_9AX?6*e7zpk|kIl{u|7KU8N4P zL^0PC6GT)U92}tHeDW7Ew;mc8BpDiNpU+f?HTE(rrC+~FOPhE1;=Upwiwjgic)Z@bHj1?z8$QUJY%j(}QW>q5X9QL*O z(?XW*10aWAO;EE%cY^lJSi<*g)z3UQvyY^DK(*UUHu^!AA1fTjY>g4uY z?BFcCsN=%c>;31zIu2Y%8}~YF(igBrZ{~k@cI+C6`Uycs7Q*G|i^nVF&$&+pvf3VZ z@L9r{Od|Zh@^l?nq{;>yy&0S5L7tT8al;{oX2j5=#jKizv|v**W`DujR~$X=kpdCn z;Xg!4mdDj!7C*7uXc+$SA{*@D$BK%(q~|5*1+AkjR-N*+OU)Z?f<~W5v?&O}d!&xJ z7BW;-Rrv^SHtA?;eh`1&te#YCgE`tQC0^d{k**9mKKGJ&1ivP0{km(Q(0nqi!4S72 z+&jrU#P4*a0f3wa-3uP4gSz(Bk>%d!NvZjog_}jO{hAp@fz7rU8}a^g!>FIzKV|E} z7^o((*(fzz;hpbl%2u0GUn+deuIQCnhJWBOToc~)m`}{|++8~SGFoY0=(;*`_~i@$ zv7$)o6K;eIPNbd*M^jAD9oGV_LIcnJaW~L8AI{FrS%cr&6O_h4sfBXwkLR$~54UwQ z;Rc@VuHG-tk?eqXuonK4Cr?JxGv8zC*m2DA)Uh1dMf)AybnZeylc-p9mbvnG2#C8pwz%JDSe zz>l?-?9WoZ6m!jZrLbm6g=2NN__KYtnzE!u%je41k(Q;NyVm^v&j_cLXbU8ITNO^Fld2a>BOVMvXk>L zl>sb+Su(`=&y#4f({M9&zBUJvQ!+5Dvl`{XVsbA7cm@TlTa;&Rvc~VeG3i@LtWIqL z&>2o)4i{azT$n3s&%s)&dW6S9YJh3(xSr=?hV@ugvDYI|&@KQi)<#k*Ff;Nan7Z_A z;A2i(?X0j)^;X_}yTN?z@Lcvx4#facx}B5l9-Dz&jWv^6FXYB2V%O(xe8buniOk#9 z1G&-YYmskf7x(MD_ExD+K=im=>m0j~UD(R10@W{T}{tK0(jsR<`r zbc22+8d~et=40!9ytlecl`L$ZR8m@snVRrZks9z<;6uG3p{?WD6h8&fZN^zFxVbCY zNv*H7HoA3Nfb!+asownj{Br&N#I}J!uZfz6&EmHVsL9IQ9_{^~4GA9l5$_x3%!B&fS8WP)#rv~{_2|i$_kaiQlU2n?W2V`Oro1mIN zqgG7nf4tw|wQm%4hS(yEWO*Y(_7#gru(@VknO7I|LPn! z>PqNhn22g~*#J<9<|WP|xh`_Yk}Pukdgiwvd5TTQkiJ`D?NP8jOrqDL)^+uJfvzxe zEm7R<=*wfqBJ(a9pOej2s2Vdfv(>kc@e;TE4t3JHxn&S0D%7s9JXo+za-0}1J21%Hf1ofh_c&Io>}pU_Pz>*B>`VqQKrL%uUtxSW+=55Yb?_om;p=tt zeEB&mP_nBCnmS2s-z)uLNKit2B$&-3JadHJpaDXiVl0Nh zfa|%u@8u!gBLj0?C9@3T8WTGNQ>`2_DugaNKGT5S{Wp<-`&_`GfvMPnMF>)CA^62! zehZ7yiYXd-nw~p-a*)b$<1azJJ{43Hj8#yK=jcbj!2;bplh)9i7JQUkOM?Z=!rdoi zr|+owPo^j(jW{}nH8^<*>GW%y*$4MV%B<2mxof#rY>xKV*AW#ZpmUp+0 zl0O(URr(}f<}n>2e1gc+udP_cFWsbl^fz3&2P_}*h_`S9H__ zC>M({0e>(OUjZ9yBRKx!_1fIKu7rYfQ>apl>5nX<4YZnLESSj7`gYn1Du+G@KbJ&mO`=vN|Z`#SJlKruVe(qdc|jj z3em)zR4h;_laGduyT8o~@? zqXTvFxHVk+zf{yu2JoxhVUsYc;iBiz+QZdK^iCUN*g{TL($+Gk{A4E&GD_dkUw*0j zU@G_tpINw#f?(w4bn7U~4+`pMeoBwU`!YWgicOfJefAUQzQ!^}UMR61;3zOe8h|-I zA=|O)-jgH=!&%3GQa-=JDIXvoRcw=aE5tr6Y@6Xwo-zr1K>rX)YF@5iR7tVT8Usk9ED6VK1)Xss=dRhX40OoXR48 zT6(%5s0C&wri0Zk^|3q1Ysrz3(?ePbzBvMX;FC}3JxwcSIc!pI&E~qz$(g5KY0UA) zT}y+|VhasB)9;EG9-`FJyV55wWX=O{=?~i+^%i_jq1!rTFT4&XnuUwa_f{UE9=wT> z4#oY*1zX)I$tOC20VQ@Fx*cV35(YyyfaY;xWD6t_ zXeOPQvkHJxq@kPYm7>>*NbATUU%fN=LfpiU7SacbP2|>9!lxg(Cxy@oe;A*@viwyv z64~a7cApNpH9t2~x81DDkndT2>KCQ~uqb~@Fc zR@m;M;EWOM;lnpaJB!os%Z@L6U5s*r69AI~S_!NGJNCd-sxh2fZmxCg22-hyhqH7V z^x~0jN$-OfA=gE}RTOgh13cFcZV(@=06Epm$ja(ux_PKs%8Ta{sr>a2d4^fP<@6PZ zhKYJ6V^}Wwu_qx0pCRD$4=Q25N1jPQjEJ^>&7gL(O}&0gJx?33Da}HI)k-RSwdcWa zu!1WyEQ1rMl#8Bxe;#@C_kfpSzVbFSbP(`{aY7DJQPBskv(92>(5CTP4!LlgyGqd0 zLyOz`HQ(*;*L&{nfF4F6-?l+Z!30$GF`IF$u$B$PtHoKk;a;#-nGEK zNF6D+u^B?>pSQQk?THBzz&m%bcgPUtb7xHyEKk6EF9r&(REK)kCIa6q!b}0T1N7Hi zWob-Vo4b?o9O-uu?u>JZTapBI!dWr~YMMczj8|Tmq@e)p>Y7P^V(-rhj99~%3D)?W z=sw-tuHHXMl3#0*L3w9DUIF*DKK}qSz30NsT0{zOWSz+nqH2n0AV*DZ4nF^6i!bmZ z%V8^`es@rJZRw_~4<-9xjvDLe>?r^z6`Lwe(VSXuXr|VL-Vt$MyDk6z!g zo%uO4Dn{OQ&3w#C94`NXqf4{WPT$QjXgz@iwfsmZvdkQQ*_dqLYZ4N0>|34kj~=PO zx%GpZL7T)Fn>QwiI*pxTha%qu69ULA<&VBPky-WhuMC|W?n7EyBWLzO!5z8Q76t|f zZwHgZd5v&c0MG|M*TzZJpJ$u=E#`yM@ne8;^HGYfjLfu0u71KXnS;+|0rh1R2F#Ap zmSFPhV$RvuNdwT#v9YlnYdRQ~Kwn?^>!JXuVl??&meer-mqIsIjFt7T-%a?w_ zG+8X{AiJUPRL%kDudr>~0J!S|+Q?VWbL$T(fc$0I6(`v6qo`YvGR_b0d`+YT;B=Xw z!7P{dNJYl-KU*FuOg7x7GW1Rb^3wq`J-|!aEQigNiJ-YR+;mIp`WnlRnZl|P#wI3! zl3xz&=|4g3Lgs9of#j=$gw_MUNDIB@8|VVXBZT7+f*O!1#s~h$RjQZ&Av?KoK<(ju z{t187@Z^%|m2AFtfMLtr)(w!IIu*7#q;z5jUxH~Z2lHcVT$atfV&&gvU+m(3&L}Ny z2;_9O!M!BFf8Mv>Od=Gv8(R?N+M1~MavKfeeQ@qD;RL`$tjwys(+INy>J~)e*&TJq zZorStybkr<#?5FiQF>4Moi}X=MSINCVQFB^VrIPagvb0Ma0UoHtqKk5Pfjn!zJhBR zczjtGt9?bo-^P6ksPr=UvmbBL=!*m8RlY%%oF)Gj%eXB9&!ad zeNG+XxNt}8u8&FsLR7}vcJ==PeYMGEa^>&fXL=0B^An1@76{~`+~+XI=(9EOk?c5( zy@BBJz?gD#2B>^x1tZ%>%Y`;z|2>DaGl_>#^Rwg^o4=QzDYkK0`d&E}iN8eHFn~!+Hy$RT?!Y&rW zxC70P4X~KrD)l~xmbUYKq zWT|nt>~ojsSEzoLISVX<5!?Ah_=x{adVrnIOjWhrEk01~G*7nf`1uV<9KS^FWl*_O|FDubC z4(z*WI#N&D+<@V7kL@`Eg-^w_urnBD-{!}s*RJ|&&onhP8>RZg0iPXW$QBE>Fal&^ zj62C`eP4X7N;Va-|4z7_%P&G)!4WS1k#Jxo_sXGxNrWq|hIL?2&^JI5R=onz)j8g3 z1v-MrD%Q*FJ^iKhJ;xea`WZk;?a4XzneR@78un*)e4u{vJ8BOXO~a#y{U34SlnBBY z!!2P-tCifKSEU+i4qq0Xk4V5p&7%>vTcP5yYRtC>G@$~n9519eN43xC=>^1ANb={s z)zNVcwTB@z%uXxguIm#8*wO`CeF*r7YvYt#!xG7$lOKoZmYRov%7%gOCHa_<(at0T zT&|JIyfzQu=!H9>$!qV&V@GU96nlegaKa@9sk*l6`DP|m8Dvz`zTq&F)%3Ulz~J2# zRDaL+i$d}YO}RVn%I-}BRKuF!Y*s&z4)zl!c-KuL?~~^eq<^FM|BLeHzLyEUdV2@xN>{yFx#3U9S(VD_*8sJu2w_m# z0JNgKUV?|GCy~o^RNK$LmCh{zD-(@UQeC~;p&n}0o8lKIV3h`T=n_B`Zmb<+&i#rV z-Q5-S-0HpRZ;EXIS=LCF@`05B*&n$EM#NH**IIbaCw_pJkx;a+z2kd(qR8tYU?lJG=PVx6Z)ok<$hH$=m~Lzf4g>g9f3%dRQ|Dd`?4B`sK{WKZ z08u?h6H9albkKdhr!$xjx^}8Ss0wbzO%$*lR>?|me9Vzz=T;{dMt}EMmKpdnRSiDJ z=Mq0VKm4=}qAII%%aCD1}H)-?Yldk6WtmD~#= zXr;*fAEOF_aWVt%q%b>bE(^VP+uPg47C%Os!pKS#c4GmKT8gzuBCHL1FK{8a4};R@|m z-su<3t_GgF!pzNllbvq|v%Y_d-maftsoxVlPFRoiDrlXS=tkKT*6&U9@UN}A`3%mt z(CX*iTBhiYM3@qlsrEjN7lPcX9X5}Le5HI(F_v;Ysb`YcN?RL7Awa32sqZrI%@!j142NsSb|TCa(wo(#Q)}B*s=XV2Z!MKnAduJ_+2XQYvpdyK6|KEO&u%d zpEJ_{t zlh;S8mqR((*!5waU2@UogF2m;)Pr=Avz4jdm4bc99G6kg6ENTJ;tME2C1a?_r}BT?F2(HHzx;$;gg>7D-;e2+p^yS_Emk3aW`UUwlO6$RG68~har1lR zGR`dvTlO}h22$?6OxTUqtp3W^ISi>BpF97atzSMN4H89YG1VNHX+*0PNMtGkPzm;` z2UD()t$;(nA4(a+B)*~7mBd#~VYO>DHbsHSA#)+Z6BhBD!PnD!j$GyLMg7f_C26FEVLqcZK^9Y;cfy9r~;=_Ft$XNUq%DL z?xN-ZcPmL*-?#ApJ6XyY^99&&=_F zrfyf7KWR${t;LfMT=I5F1JmAO=H=6GTZnp9SYnG!TH})71(g#cfSXKPoMvkkCcyx+ z?5G%b)vZ0*>V$yTT|sLb23oFdhs-nw;99O4$1X&Csx34GU2K-DYT9Pe8VXHU)UuSy zkJpjtow~d#T!^|f^u&Gq!3UEt$w2^!Jk*Nh)o(-#X%>a#u}#hc^R@`|uraXa0%~s( zMIPK01K_T>D?zmXl8_*vhpGu(36Qjsk&m6~kz?T_)hpsIOQyi#v~%o#7xo0>T|@dJ zQc=huDWGJ-dGXtqazdBC>G^v(KQrsPh}P4E-w*R8Vw*hESk$BsxNg?rVcCx+n$i7-td6;GCX9IZiQ_ zW-CIJse0!rs0m2t?aFrpTA4o8gIJ3&^P&h4Ah+?C3C}V|)egkaeo@@4`_BVp{{(V4G$sLaF9M$4 z*O5y5WQ{w4%ifgN$+>Luiyy8uUL)vV07`A8k?;d;&ACK_dd~q5Lt02#_+mvF{Hb&@ z;aNDN+#7#eFd^-Ij&|e)eqbN03!fpyxpjevt;iPVIMW7x^BFF=NFi>=QXgPBHb71T zYVzPE0qQ$OGK0ql0EsH%kTiV*o6Cr@^8$s&WW(_q@v1#&^+E)Gs=v|&8@Q%r>~*|e ze}3=Z8k(O3HuckN-kq?BHh>wVz@}RBa>3NtvzJZHFd@yy#94-2;|CY99@=2Xe(W-Xj?0{oGN{ z3#n5)653p9fQkYhS6 z0HSRLXgTWA7c73CMKNQRNm106q`Usl9mRhs#}_`5TlS?rfLZP)!%nSUp1*_@s94Lo zH8#P{LjlcXS;q_rpaG>xkMW6a7Xgh{8~{y)yQb|KU_e6WGH1l-f1dcDcsQ9EZ&w0P zE6?}pbB+oLB7Hy@zN`aBOabUFpp{vIl|_}n$aId+)OQ1IR#*KY68I*=Z%FClV6Ml` zoWMzXjt!ICQ#?mPV+uYC$-sF|ig#N8u8ab^(hOJ%CE)+u9B!^2%h%=~1^F-tm}({9 z0;4arI0$h$nw2LihaY}e8Xx%neHbi{F>oq!XacbEq3iJTfUnLjDF8iGubWuM8r7^ny(dH&oK~E*7vZu!a-2SDkFLYTwJ$;j$AuzO9v?Ps1lf~ z)-c$s8vzJ+Rm5KhB(OJ}T{}nF(!eu5~K$T`W^-$@( z@RK~4e3^*@S?mB2Fh!rL5|nLG(>ZJnImefh`qf>qe0X-h@2?3^bi=OWE?Ph=8X_Ag z-?vC~(M0uZ7lZX1{+;d|f=__x%LeYGfJ;TZ5puE0_Jq2p8{A+ob~AEQDml}GjUNtieZTL( z&haee@{kGT*QQiP6&Kv2GewYQ#3=BDN$x#M1DIAX6Mo#- zYN+@cTjl3z_g_5}WaM!nC5>tSK@gw?MHx&23J~}ewvp-=3pBX2vrF+nvmFsz&NsoL z2|ACN@J#BF^o|Eq`li6J4bf4Q#PuM5=88Hyo38@o?BHcM6}R3s)IO*#2oPt30CvNI zHNO+WF{d6$EAjruOv+ObAH{1DQZh306kIzKKtN!`kQ$VE zJc`C9|4Odb7i=$-yYBF694v76u1k(LuoyAaM!}+%nP3UIPi^B9eb0Fo04x6VV#^or zE_1i2*Y=oJ2G}r&O>Nht+e&+F*Eos&qPc!)7bvDY^V!aKgS_I6^hPi;AaH%xVqiyq zbL@IGJrZ~X`(_c~57|N$+89<3F4~`g0EgosOu54aW*hLUQy)@+Cj*^j?)>iQ|F9hb ziiNT2(qtcV&}#Cw4JdX}Zo~t9ps3rY4+qx)e-P-!B3=0)m2xUgXd;;T6W+-r;scy! z>cGb`!$)kT4r7VYD;+rjdP=uD!eOLJ%)zWwwH8P~0|R4)wKEY<_(s?*oq?WMx;9=r z3N*YmG*)gpQu?~%wFaPH#dN4Rx8vENfhuG^(w^Zc_-fT!&9VYs8=E;%M5or_C(2vR*t(wH4*MdN~gk1zFRN4gKUNGb8Z1CN_Y16h-bzy=XDvA~XVY?7LRDWZ52M!VqFGTHP} zwrltJ!Ch7q1xfccL2LCEMc~Xz#tYjUv^23bg@S7VD>sTpUZ=F=2Z6m>&?gf{v!6Eg z%_lg8(z#Fih2sbYQ}I+BuhsS-YL+IZ#Q7@;wwd;^9>~T?|_pTb-=cU0P#-9Y3}Qc{&%Scpd>>wqBToE zv?2{WS>`-8B-kFwYEc?^=0=5~lcf%3Rg5zgdjmYLZd9v15@T+W?Bm+v%Q)Yn{>z+_ zktY~Ksyz0DJzDwaI3Sore>aIXt`zOQ))3lxw1CL=Ybt}bs&I3feqXJwH<_qD&1cVF zzZ>oS%g>uAzizAJ^r8>(Rjvyzd9iy~6r*a*Kz!AR_Tq4U{ts9RV zsRbwI- z->a_z4fUGO1i&uXYH!h~Z~ZpGyVF&B7%_tAHUJh|uAc~5hx_ChR?n}38MFp7FJ!kQOrF}5Y zXtPXUGY)1cGt};l*c8CdPP^xbngMR}vCS)}a76UDW$>*oWWJLW3*+yR=)Y7^4H#4+ z494jJ#1KW;5DExD+dgbNzdH;8#f{!f-zw*S?(z7y=kOQqYbpTJ;}`dU$8x|QXQjzM zE)YMA1++GZ>dbOm)HkHn8v(PD)Eg>~{R$h7I1GDz@uPMR7XX#M^ zEe%(|)3y9El#GBUHPId<0F7IvSK8_7C&ty?TVtw%5OMYI!y@%7U+$PYIE^K zX;_0GWJDlCYWx${aOzzGT=pQAai=~)kHR;f`uX%#v*cc0f=)1ZECD{bpn2ShP>|F~ zTPGQqnu{ugM8+bXXE{D0<72EA_V$6;A!Hs|(YR=2V zS5A0x^7U(M@v_H+|30S~&91Tls!9Dv_LXdJkhXJgqz4(Q`M`W&QfG3-9C^75J-`vh z;xmTkv=kbxK738pW0&$Ci$oRO8GhN<%d7-O~qEw2y#F7Q073|GaiLhCbD1S zy9ORJ^y3~autpNSx7v#@>7jP~{e(Ki((lfI1<+lALG{2tW73VLjZ#ARM%X%K$8Z)p z$QC+?iUFk+3j-+#4=g=-JqRi75_0We&w8~qtvLovOd&v`rL$S8Lb`KQ{DiL%`&D*C+3M5N??xmS9bRMb>qRF*@C zM5|jNWmyVa3NE1ELW_dT zesv5sCqJ{!lLHY6csMnXDb{g2yxjnN3^>yGaIGuKv-j?KZNO_~m(P>XP~<+*N|mA2 z!iH+}2D)oN`$kQ8Z+G>I?XD8N!IEmw#&3cfPJD_Ukb~&^s`#E^%_SknnKqGl@zI5CYi(_Zh)&1O+w&HDiim06Ut)rQ3? z+CIAj5KxFEbgsiqQFl3hL?Mv(3e`0GloG|XHzad=y0dZ2V?*VeV4e_GDzl9UL#bc` zEzr?&&yJ1&>N(+(*q-m%e|bBa7p9S1dUSmpaCU5!bav?Wpa3tAbgb$)jlABNGlZN_ z>v*vT1n5@#!gm(dm2+`6M`(UP2l(ioG(5i9Bf4~L_f$nwh(K^@H$Q&KIn+~f*$D>D zC{=jwo(env0KB9e*gu)hu_vhaCAYfn-JCdUujOp9c(!%w4n{oef_fx&Yx$ca)-5q_ z1_gD~*d9%S?94taa&bR_g|B!0vOZ(EReuYq#D>gSrF~lcvH_BP$LkR?d}mY}bqb

VT` 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 DNH9Go delta 170622 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

|#fh7UgY5X%J(XzH?kf1%T8) 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 diff --git a/scripts/aws/lib/construct/db.ts b/scripts/aws/lib/construct/db.ts index 8be1f5212..34cb8a482 100644 --- a/scripts/aws/lib/construct/db.ts +++ b/scripts/aws/lib/construct/db.ts @@ -1,6 +1,7 @@ import { Construct } from 'constructs'; import * as ec2 from 'aws-cdk-lib/aws-ec2' import * as rds from "aws-cdk-lib/aws-rds"; +import * as cdk from 'aws-cdk-lib'; interface RdsProps { vpc: ec2.Vpc @@ -20,7 +21,7 @@ export class Rds extends Construct{ const rdsCredentials = rds.Credentials.fromGeneratedSecret('db_user',{ secretName: 'langflow-DbSecret', }) - + // DB クラスターのパラメータグループ作成 const clusterParameterGroup = new rds.ParameterGroup(scope, 'ClusterParameterGroup',{ engine: rds.DatabaseClusterEngine.auroraMysql({ From dc6ca0082f69fdb375d8720cfa4d0bf8bec78f18 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Tue, 5 Dec 2023 03:37:03 +0000 Subject: [PATCH 055/203] update readme --- scripts/aws/README.ja.md | 4 ++-- scripts/aws/README.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/aws/README.ja.md b/scripts/aws/README.ja.md index f7f093394..e8c7c6a81 100644 --- a/scripts/aws/README.ja.md +++ b/scripts/aws/README.ja.md @@ -3,12 +3,12 @@ **想定時間**: 30 分 ## 説明 -Langflow on AWS では、 AWS Cloud Development Kit (CDK) を用いて Langflow を AWS 上にデプロイする方法を学べます。 +Langflow on AWS では、 [AWS Cloud Development Kit](https://aws.amazon.com/cdk/?nc2=type_a) (CDK) を用いて Langflow を AWS 上にデプロイする方法を学べます。 このチュートリアルは、AWS アカウントと AWS に関する基本的な知識を有していることを前提としています。 作成するアプリケーションのアーキテクチャです。 ![langflow-archi](./img/langflow-archi.png) -[AWS CDK](https://aws.amazon.com/cdk/?nc2=type_a) によって [Application Load Balancer](https://aws.amazon.com/elasticloadbalancing/application-load-balancer/?nc1=h_ls)、[AWS Fargate](https://aws.amazon.com/fargate/?nc2=type_a)、[Amazon Aurora](https://aws.amazon.com/rds/aurora/?nc2=type_a) を作成します。 +AWS CDK によって [Application Load Balancer](https://aws.amazon.com/elasticloadbalancing/application-load-balancer/?nc1=h_ls)、[AWS Fargate](https://aws.amazon.com/fargate/?nc2=type_a)、[Amazon Aurora](https://aws.amazon.com/rds/aurora/?nc2=type_a) を作成します。 Auroraのシークレットは [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/?nc2=type_a) によって管理されます。 Fargate のタスクはフロントエンドとバックエンドに分かれており、サービス検出によって通信します。 リソースをデプロイするだけであれば、上記の各サービスについて深い知識は必要ありません。 diff --git a/scripts/aws/README.md b/scripts/aws/README.md index 384b755fe..06c475ae8 100644 --- a/scripts/aws/README.md +++ b/scripts/aws/README.md @@ -3,13 +3,13 @@ **Duraration**: 30 minutes ## Introduction -In this tutorial, you will learn how to deploy langflow on AWS using AWS Cloud Development Kit (CDK). +In this tutorial, you will learn how to deploy langflow on AWS using [AWS Cloud Development Kit](https://aws.amazon.com/cdk/?nc2=type_a) (CDK). This tutorial assumes you have an AWS account and basic knowledge of AWS. The architecture of the application to be created: ![langflow-archi](./img/langflow-archi.png) -[Application Load Balancer](https://aws.amazon.com/elasticloadbalancing/application-load-balancer/?nc1=h_ls), [AWS Fargate](https://aws.amazon.com/fargate/?nc2=type_a) and [Amazon Aurora](https://aws.amazon.com/rds/aurora/?nc2=type_a) are created by [AWS CDK](https://aws.amazon.com/cdk/?nc2=type_a). +[Application Load Balancer](https://aws.amazon.com/elasticloadbalancing/application-load-balancer/?nc1=h_ls), [AWS Fargate](https://aws.amazon.com/fargate/?nc2=type_a) and [Amazon Aurora](https://aws.amazon.com/rds/aurora/?nc2=type_a) are created by AWS CDK. The aurora's secrets are managed by [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/?nc2=type_a). The Fargate task is divided into a frontend and a backend, which communicate through service discovery. If you just want to deploy resources, you do not need in-depth knowledge of each of the above services. From 4e06c867ad89095f4225430bbf6c766d70511171 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Mon, 20 Nov 2023 17:44:07 +0900 Subject: [PATCH 056/203] add cdk scripts --- deploy/scripts/cdk/.gitignore | 9 + deploy/scripts/cdk/.npmignore | 6 + deploy/scripts/cdk/README.md | 14 + deploy/scripts/cdk/bin/cdk.ts | 21 + deploy/scripts/cdk/cdk.json | 55 + deploy/scripts/cdk/delete-ecr.sh | 4 + deploy/scripts/cdk/jest.config.js | 8 + deploy/scripts/cdk/lib/cdk-stack.ts | 55 + deploy/scripts/cdk/lib/construct/backend.ts | 110 + deploy/scripts/cdk/lib/construct/db.ts | 64 + deploy/scripts/cdk/lib/construct/ecr.ts | 76 + deploy/scripts/cdk/lib/construct/frontend.ts | 109 + deploy/scripts/cdk/lib/construct/index.ts | 5 + deploy/scripts/cdk/lib/construct/network.ts | 180 + deploy/scripts/cdk/package-lock.json | 4601 ++++++++++++++++++ deploy/scripts/cdk/package.json | 28 + deploy/scripts/cdk/test/cdk.test.ts | 17 + 17 files changed, 5362 insertions(+) create mode 100644 deploy/scripts/cdk/.gitignore create mode 100644 deploy/scripts/cdk/.npmignore create mode 100644 deploy/scripts/cdk/README.md create mode 100644 deploy/scripts/cdk/bin/cdk.ts create mode 100644 deploy/scripts/cdk/cdk.json create mode 100644 deploy/scripts/cdk/delete-ecr.sh create mode 100644 deploy/scripts/cdk/jest.config.js create mode 100644 deploy/scripts/cdk/lib/cdk-stack.ts create mode 100644 deploy/scripts/cdk/lib/construct/backend.ts create mode 100644 deploy/scripts/cdk/lib/construct/db.ts create mode 100644 deploy/scripts/cdk/lib/construct/ecr.ts create mode 100644 deploy/scripts/cdk/lib/construct/frontend.ts create mode 100644 deploy/scripts/cdk/lib/construct/index.ts create mode 100644 deploy/scripts/cdk/lib/construct/network.ts create mode 100644 deploy/scripts/cdk/package-lock.json create mode 100644 deploy/scripts/cdk/package.json create mode 100644 deploy/scripts/cdk/test/cdk.test.ts diff --git a/deploy/scripts/cdk/.gitignore b/deploy/scripts/cdk/.gitignore new file mode 100644 index 000000000..1a7a1528b --- /dev/null +++ b/deploy/scripts/cdk/.gitignore @@ -0,0 +1,9 @@ +*.js +!jest.config.js +*.d.ts +node_modules + +# CDK asset staging directory +.cdk.staging +cdk.out +!/lib diff --git a/deploy/scripts/cdk/.npmignore b/deploy/scripts/cdk/.npmignore new file mode 100644 index 000000000..c1d6d45dc --- /dev/null +++ b/deploy/scripts/cdk/.npmignore @@ -0,0 +1,6 @@ +*.ts +!*.d.ts + +# CDK asset staging directory +.cdk.staging +cdk.out diff --git a/deploy/scripts/cdk/README.md b/deploy/scripts/cdk/README.md new file mode 100644 index 000000000..320efc02a --- /dev/null +++ b/deploy/scripts/cdk/README.md @@ -0,0 +1,14 @@ +# Welcome to your CDK TypeScript project + +This is a blank project for CDK development with TypeScript. + +The `cdk.json` file tells the CDK Toolkit how to execute your app. + +## Useful commands + +* `npm run build` compile typescript to js +* `npm run watch` watch for changes and compile +* `npm run test` perform the jest unit tests +* `cdk deploy` deploy this stack to your default AWS account/region +* `cdk diff` compare deployed stack with current state +* `cdk synth` emits the synthesized CloudFormation template diff --git a/deploy/scripts/cdk/bin/cdk.ts b/deploy/scripts/cdk/bin/cdk.ts new file mode 100644 index 000000000..c680f3e98 --- /dev/null +++ b/deploy/scripts/cdk/bin/cdk.ts @@ -0,0 +1,21 @@ +#!/usr/bin/env node +import 'source-map-support/register'; +import * as cdk from 'aws-cdk-lib'; +import { LangflowAppStack } from '../lib/cdk-stack'; + +const app = new cdk.App(); +new LangflowAppStack(app, 'LangflowAppStack', { + /* If you don't specify 'env', this stack will be environment-agnostic. + * Account/Region-dependent features and context lookups will not work, + * but a single synthesized template can be deployed anywhere. */ + + /* Uncomment the next line to specialize this stack for the AWS Account + * and Region that are implied by the current CLI configuration. */ + // env: { account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEFAULT_REGION }, + + /* Uncomment the next line if you know exactly what Account and Region you + * want to deploy the stack to. */ + // env: { account: '123456789012', region: 'us-east-1' }, + + /* For more information, see https://docs.aws.amazon.com/cdk/latest/guide/environments.html */ +}); \ No newline at end of file diff --git a/deploy/scripts/cdk/cdk.json b/deploy/scripts/cdk/cdk.json new file mode 100644 index 000000000..dc8ab711a --- /dev/null +++ b/deploy/scripts/cdk/cdk.json @@ -0,0 +1,55 @@ +{ + "app": "npx ts-node --prefer-ts-exts bin/cdk.ts", + "watch": { + "include": [ + "**" + ], + "exclude": [ + "README.md", + "cdk*.json", + "**/*.d.ts", + "**/*.js", + "tsconfig.json", + "package*.json", + "yarn.lock", + "node_modules", + "test" + ] + }, + "context": { + "@aws-cdk/aws-lambda:recognizeLayerVersion": true, + "@aws-cdk/core:checkSecretUsage": true, + "@aws-cdk/core:target-partitions": [ + "aws", + "aws-cn" + ], + "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true, + "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true, + "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": true, + "@aws-cdk/aws-iam:minimizePolicies": true, + "@aws-cdk/core:validateSnapshotRemovalPolicy": true, + "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": true, + "@aws-cdk/aws-s3:createDefaultLoggingPolicy": true, + "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": true, + "@aws-cdk/aws-apigateway:disableCloudWatchRole": true, + "@aws-cdk/core:enablePartitionLiterals": true, + "@aws-cdk/aws-events:eventsTargetQueueSameAccount": true, + "@aws-cdk/aws-iam:standardizedServicePrincipals": true, + "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true, + "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": true, + "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": true, + "@aws-cdk/aws-route53-patters:useCertificate": true, + "@aws-cdk/customresources:installLatestAwsSdkDefault": false, + "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": true, + "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": true, + "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": true, + "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": true, + "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": true, + "@aws-cdk/aws-redshift:columnId": true, + "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": true, + "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": true, + "@aws-cdk/aws-apigateway:requestValidatorUniqueId": true, + "@aws-cdk/aws-kms:aliasNameRef": true, + "@aws-cdk/core:includePrefixInUniqueNameGeneration": true + } +} diff --git a/deploy/scripts/cdk/delete-ecr.sh b/deploy/scripts/cdk/delete-ecr.sh new file mode 100644 index 000000000..be7a5dab9 --- /dev/null +++ b/deploy/scripts/cdk/delete-ecr.sh @@ -0,0 +1,4 @@ +aws cloudformation delete-stack --stack-name LangflowAppStack +aws ecr delete-repository --repository-name langflow-backend-repository --force +aws ecr delete-repository --repository-name langflow-frontend-repository --force +aws ecr describe-repositories --output json | jq -re ".repositories[].repositoryName" \ No newline at end of file diff --git a/deploy/scripts/cdk/jest.config.js b/deploy/scripts/cdk/jest.config.js new file mode 100644 index 000000000..08263b895 --- /dev/null +++ b/deploy/scripts/cdk/jest.config.js @@ -0,0 +1,8 @@ +module.exports = { + testEnvironment: 'node', + roots: ['/test'], + testMatch: ['**/*.test.ts'], + transform: { + '^.+\\.tsx?$': 'ts-jest' + } +}; diff --git a/deploy/scripts/cdk/lib/cdk-stack.ts b/deploy/scripts/cdk/lib/cdk-stack.ts new file mode 100644 index 000000000..f83fcb0f5 --- /dev/null +++ b/deploy/scripts/cdk/lib/cdk-stack.ts @@ -0,0 +1,55 @@ +import * as cdk from 'aws-cdk-lib'; +import { Construct } from 'constructs'; +import * as ecs from 'aws-cdk-lib/aws-ecs' + +import { Network, EcrRepository, FrontEndCluster, BackEndCluster, Rds } from './construct'; +// import * as sqs from 'aws-cdk-lib/aws-sqs'; + +export class LangflowAppStack extends cdk.Stack { + constructor(scope: Construct, id: string, props?: cdk.StackProps) { + super(scope, id, props); + // Arch + const arch = ecs.CpuArchitecture.X86_64 + + // VPC + const { vpc, cluster, alb, targetGroup, cloudmapNamespace, ecsFrontSG, ecsBackSG, dbSG, albSG, backendTaskRole, TaskExecutionRole, frontendTaskRole, backendLogGroup, frontendLogGroup} = new Network(this, 'Network') + // ECR + const { ecrFrontEndRepository,ecrBackEndRepository} = new EcrRepository(this, 'Ecr', { + cloudmapNamespace:cloudmapNamespace, + arch:arch + }) + + // RDS + // VPCとSGのリソース情報をPropsとして引き渡す + const { rdsCluster } = new Rds(this, 'Rds', { vpc, dbSG }) + + const backendService = new BackEndCluster(this, 'backend', { + cluster:cluster, + ecsBackSG:ecsBackSG, + ecrBackEndRepository:ecrBackEndRepository, + backendTaskRole:backendTaskRole, + backendTaskExecutionRole:TaskExecutionRole, + backendLogGroup:backendLogGroup, + cloudmapNamespace:cloudmapNamespace, + rdsCluster:rdsCluster, + alb:alb, + arch:arch + }) + + new FrontEndCluster(this, 'frontend',{ + cluster:cluster, + ecsFrontSG:ecsFrontSG, + ecrFrontEndRepository:ecrFrontEndRepository, + targetGroup: targetGroup, + backendServiceName: backendService.backendServiceName, + frontendTaskRole: frontendTaskRole, + frontendTaskExecutionRole: TaskExecutionRole, + frontendLogGroup: frontendLogGroup, + cloudmapNamespace: cloudmapNamespace, + arch:arch + }) + + // S3+CloudFront + // new Web(this,'Cloudfront-S3') + } +} diff --git a/deploy/scripts/cdk/lib/construct/backend.ts b/deploy/scripts/cdk/lib/construct/backend.ts new file mode 100644 index 000000000..3d05fe616 --- /dev/null +++ b/deploy/scripts/cdk/lib/construct/backend.ts @@ -0,0 +1,110 @@ +import { Duration } from 'aws-cdk-lib' +import { Construct } from 'constructs'; +import { + aws_ec2 as ec2, + aws_ecs as ecs, + aws_ecr as ecr, + aws_rds as rds, + aws_servicediscovery as servicediscovery, + aws_iam as iam, + aws_logs as logs, + aws_elasticloadbalancingv2 as elb, +} from 'aws-cdk-lib'; + +interface BackEndProps { + cluster: ecs.Cluster + ecsBackSG:ec2.SecurityGroup + ecrBackEndRepository:ecr.Repository + backendTaskRole: iam.Role; + backendTaskExecutionRole: iam.Role; + backendLogGroup: logs.LogGroup; + cloudmapNamespace: servicediscovery.PrivateDnsNamespace; + rdsCluster:rds.DatabaseCluster + alb:elb.IApplicationLoadBalancer + arch:ecs.CpuArchitecture +} + +export class BackEndCluster extends Construct { + readonly backendServiceName: string + + constructor(scope: Construct, id: string, props:BackEndProps) { + super(scope, id) + const containerPort = 7860 + // Secrets ManagerからDB認証情報を取ってくる + const secretsDB = props.rdsCluster.secret!; + + // Create Backend Fargate Service + const backendTaskDefinition = new ecs.FargateTaskDefinition( + this, + 'BackEndTaskDef', + { + memoryLimitMiB: 512, + cpu: 256, + executionRole: props.backendTaskExecutionRole, + runtimePlatform:{ + operatingSystemFamily: ecs.OperatingSystemFamily.LINUX, + cpuArchitecture: props.arch, + }, + taskRole: props.backendTaskRole, + } + ); + backendTaskDefinition.addContainer('backendContainer', { + image: ecs.ContainerImage.fromEcrRepository(props.ecrBackEndRepository, "latest"), + containerName:'langflow-back-container', + logging: ecs.LogDriver.awsLogs({ + streamPrefix: 'my-stream', + logGroup: props.backendLogGroup, + }), + environment:{ + // user:pass@endpoint:port/dbname + "LANGFLOW_DATABASE_URL" : `mysql+pymysql://${ecs.Secret.fromSecretsManager(secretsDB, 'username')}:${ecs.Secret.fromSecretsManager(secretsDB, 'password')}@${ecs.Secret.fromSecretsManager(secretsDB, 'host')}:3306/${ecs.Secret.fromSecretsManager(secretsDB, 'dbname')}`, + "LANGFLOW_AUTO_LOGIN" : "false", + "LANGFLOW_SUPERUSER" : "admin", + "LANGFLOW_SUPERUSER_PASSWORD" : "1234567" + }, + portMappings: [ + { + containerPort: containerPort, + protocol: ecs.Protocol.TCP, + }, + ], + // Secretの設定 + secrets: { + "dbname": ecs.Secret.fromSecretsManager(secretsDB, 'dbname'), + "username": ecs.Secret.fromSecretsManager(secretsDB, 'username'), + "host": ecs.Secret.fromSecretsManager(secretsDB, 'host'), + "password": ecs.Secret.fromSecretsManager(secretsDB, 'password'), + }, + }); + this.backendServiceName = 'langflow-backend-service' + const backendService = new ecs.FargateService(this, 'BackEndService', { + cluster: props.cluster, + serviceName: this.backendServiceName, + taskDefinition: backendTaskDefinition, + enableExecuteCommand: true, + securityGroups: [props.ecsBackSG], + cloudMapOptions: { + cloudMapNamespace: props.cloudmapNamespace, + containerPort: containerPort, + dnsRecordType: servicediscovery.DnsRecordType.A, + dnsTtl: Duration.seconds(10), + name: this.backendServiceName + }, + vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS }, + }); + + const ecsBackEndExecutionRole = iam.Role.fromRoleArn( + this, + "ecsBackEndExecutionRole", + backendService.taskDefinition.executionRole!.roleArn, + {} + ); + ecsBackEndExecutionRole.attachInlinePolicy(new iam.Policy(this, 'SMGetPolicy', { + statements: [new iam.PolicyStatement({ + actions: ['secretsmanager:GetSecretValue'], + resources: [secretsDB.secretArn], + })], + })); + + } +} \ No newline at end of file diff --git a/deploy/scripts/cdk/lib/construct/db.ts b/deploy/scripts/cdk/lib/construct/db.ts new file mode 100644 index 000000000..8be1f5212 --- /dev/null +++ b/deploy/scripts/cdk/lib/construct/db.ts @@ -0,0 +1,64 @@ +import { Construct } from 'constructs'; +import * as ec2 from 'aws-cdk-lib/aws-ec2' +import * as rds from "aws-cdk-lib/aws-rds"; + +interface RdsProps { + vpc: ec2.Vpc + dbSG:ec2.SecurityGroup +} + +export class Rds extends Construct{ + readonly rdsCluster: rds.DatabaseCluster + + constructor(scope: Construct, id:string, props: RdsProps){ + super(scope, id); + + const {vpc, dbSG} = props + const instanceType = ec2.InstanceType.of(ec2.InstanceClass.BURSTABLE4_GRAVITON, ec2.InstanceSize.MEDIUM) + + // RDSのパスワードを自動生成してSecrets Managerに格納 + const rdsCredentials = rds.Credentials.fromGeneratedSecret('db_user',{ + secretName: 'langflow-DbSecret', + }) + + // DB クラスターのパラメータグループ作成 + const clusterParameterGroup = new rds.ParameterGroup(scope, 'ClusterParameterGroup',{ + engine: rds.DatabaseClusterEngine.auroraMysql({ + version: rds.AuroraMysqlEngineVersion.VER_3_02_0 + }), + description: 'for-langflow', + }) + clusterParameterGroup.bindToCluster({}) + + // DB インスタンスのパラメタグループ作成 + const instanceParameterGroup = new rds.ParameterGroup(scope, 'InstanceParameterGroup',{ + engine: rds.DatabaseClusterEngine.auroraMysql({ + version: rds.AuroraMysqlEngineVersion.VER_3_02_0, + }), + description: 'for-langflow', + }) + instanceParameterGroup.bindToInstance({}) + + this.rdsCluster = new rds.DatabaseCluster(scope, 'LangflowDbCluster', { + engine: rds.DatabaseClusterEngine.auroraMysql({ + version: rds.AuroraMysqlEngineVersion.VER_3_02_0, + }), + storageEncrypted: true, + credentials: rdsCredentials, + instanceIdentifierBase: 'langflow-instance', + vpc:vpc, + vpcSubnets:vpc.selectSubnets({ + subnetGroupName: 'langflow-Isolated', + }), + securityGroups:[dbSG], + writer: rds.ClusterInstance.provisioned("WriterInstance", { + instanceType: instanceType, + enablePerformanceInsights: true, + parameterGroup:instanceParameterGroup, + }), + // 2台目以降はreaders:で設定 + parameterGroup: clusterParameterGroup, + defaultDatabaseName: 'langflow', + }) + } +} diff --git a/deploy/scripts/cdk/lib/construct/ecr.ts b/deploy/scripts/cdk/lib/construct/ecr.ts new file mode 100644 index 000000000..6e6db707b --- /dev/null +++ b/deploy/scripts/cdk/lib/construct/ecr.ts @@ -0,0 +1,76 @@ +import { RemovalPolicy } from 'aws-cdk-lib' +import * as ecr from 'aws-cdk-lib/aws-ecr' +import * as ecrdeploy from 'cdk-ecr-deployment' +import * as ecs from 'aws-cdk-lib/aws-ecs' +import * as servicediscovery from 'aws-cdk-lib/aws-servicediscovery' +import { DockerImageAsset, Platform } from 'aws-cdk-lib/aws-ecr-assets' +import * as path from "path"; +import { Construct } from 'constructs' + + +interface ECRProps { + cloudmapNamespace: servicediscovery.PrivateDnsNamespace; + arch:ecs.CpuArchitecture; +} + +export class EcrRepository extends Construct { + readonly ecrFrontEndRepository: ecr.Repository + readonly ecrBackEndRepository: ecr.Repository + + constructor(scope: Construct, id: string, props: ECRProps) { + super(scope, id) + + const imagePlatform = props.arch == ecs.CpuArchitecture.ARM64 ? Platform.LINUX_ARM64 : Platform.LINUX_AMD64 + const backendPath = path.join(__dirname, "../../../../../../", "langflow") + const frontendPath = path.join(__dirname, "../../../../../src/", "frontend") + const excludeDir = ['node_modules','.git', 'cdk.out'] + const LifecycleRule = { + tagStatus: ecr.TagStatus.ANY, + description: 'Delete more than 30 image', + maxImageCount: 30, + } + + // リポジトリ作成 + this.ecrFrontEndRepository = new ecr.Repository(scope, 'LangflowFrontEndRepository', { + repositoryName: 'langflow-frontend-repository', + removalPolicy: RemovalPolicy.RETAIN, + imageScanOnPush: true, + }) + this.ecrBackEndRepository = new ecr.Repository(scope, 'LangflowBackEndRepository', { + repositoryName: 'langflow-backend-repository', + removalPolicy: RemovalPolicy.RETAIN, + imageScanOnPush: true, + }) + // LifecycleRule作成 + this.ecrFrontEndRepository.addLifecycleRule(LifecycleRule) + this.ecrBackEndRepository.addLifecycleRule(LifecycleRule) + + // Create Docker Image Asset + const dockerFrontEndImageAsset = new DockerImageAsset(this, "DockerFrontEndImageAsset", { + directory: frontendPath, + buildArgs:{ + "BACKEND_URL":`http://${props.cloudmapNamespace.namespaceName}:7860` + }, + exclude: excludeDir, + platform: imagePlatform, + }); + const dockerBackEndImageAsset = new DockerImageAsset(this, "DockerBackEndImageAsset", { + directory: backendPath, + exclude: excludeDir, + platform: imagePlatform, + }); + + // Deploy Docker Image to ECR Repository + new ecrdeploy.ECRDeployment(this, "DeployFrontEndImage", { + src: new ecrdeploy.DockerImageName(dockerFrontEndImageAsset.imageUri), + dest: new ecrdeploy.DockerImageName(this.ecrFrontEndRepository.repositoryUri) + }); + + // Deploy Docker Image to ECR Repository + new ecrdeploy.ECRDeployment(this, "DeployBackEndImage", { + src: new ecrdeploy.DockerImageName(dockerBackEndImageAsset.imageUri), + dest: new ecrdeploy.DockerImageName(this.ecrBackEndRepository.repositoryUri) + }); + + } +} diff --git a/deploy/scripts/cdk/lib/construct/frontend.ts b/deploy/scripts/cdk/lib/construct/frontend.ts new file mode 100644 index 000000000..e4463000d --- /dev/null +++ b/deploy/scripts/cdk/lib/construct/frontend.ts @@ -0,0 +1,109 @@ +import { Duration } from 'aws-cdk-lib' +import { Construct } from 'constructs' +import { + aws_ec2 as ec2, + aws_ecs as ecs, + aws_ecr as ecr, + aws_servicediscovery as servicediscovery, + aws_iam as iam, + aws_logs as logs, + aws_elasticloadbalancingv2 as elb, +} from 'aws-cdk-lib'; +import { CpuArchitecture } from 'aws-cdk-lib/aws-ecs'; + +interface FrontEndProps { + cluster:ecs.Cluster + ecsFrontSG:ec2.SecurityGroup + ecrFrontEndRepository:ecr.Repository + targetGroup: elb.ApplicationTargetGroup; + backendServiceName: string; + frontendTaskRole: iam.Role; + frontendTaskExecutionRole: iam.Role; + frontendLogGroup: logs.LogGroup; + cloudmapNamespace: servicediscovery.PrivateDnsNamespace; + arch:ecs.CpuArchitecture; +} + +export class FrontEndCluster extends Construct { + constructor(scope: Construct, id: string, props:FrontEndProps) { + super(scope, id) + + const containerPort = 3000 + const frontendTaskDefinition = new ecs.FargateTaskDefinition( + this, + 'FrontendTaskDef', + { + memoryLimitMiB: 512, + cpu: 256, + executionRole: props.frontendTaskExecutionRole, + runtimePlatform:{ + operatingSystemFamily: ecs.OperatingSystemFamily.LINUX, + cpuArchitecture: props.arch, + }, + taskRole: props.frontendTaskRole, + } + ); + + frontendTaskDefinition.addContainer('frontendContainer', { + image: ecs.ContainerImage.fromEcrRepository(props.ecrFrontEndRepository, "latest"), + containerName:'langflow-front-container', + environment: { + BACKEND_SERVICE_NAME: props.backendServiceName, + BACKEND_URL: `http://${props.backendServiceName}.${props.cloudmapNamespace.namespaceName}:7860/`, + VITE_PROXY_TARGET: `http://${props.backendServiceName}.${props.cloudmapNamespace.namespaceName}:7860/`, + }, + logging: ecs.LogDriver.awsLogs({ + streamPrefix: 'my-stream', + logGroup: props.frontendLogGroup, + }), + portMappings: [ + { + containerPort: containerPort, + protocol: ecs.Protocol.TCP, + }, + ], + }); + + const frontendService = new ecs.FargateService( + this, + 'FrontendService', + { + serviceName: 'langflow-frontend-service', + cluster: props.cluster, + desiredCount: 1, + assignPublicIp: false, + taskDefinition: frontendTaskDefinition, + enableExecuteCommand: true, + securityGroups: [props.ecsFrontSG], + // healthCheckGracePeriod: Duration.seconds(300), + } + ); + + // props.targetGroup.addTarget(frontendService); + + // // Create ALB and ECS Fargate Service + // const frontService = new ecs_patterns.ApplicationLoadBalancedFargateService( + // this, + // "FrontEndService", + // { + // cluster: cluster, + // serviceName: 'langflow-frontend-service', + // cpu: 256, + // memoryLimitMiB: 512, + // listenerPort: 80, + // assignPublicIp: true, // Public facing - ALB + // taskSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS }, + // securityGroups:[ecsFrontSG], + // taskImageOptions: { + // family: 'langflow-taskdef', + // containerName: 'langflow-front-container', + // image: ecs.ContainerImage.fromEcrRepository(ecrFrontEndRepository, "latest"), + // containerPort: 3000, // L2なので、TargetGroupのportが3000で設定されるはず + // }, + // loadBalancer:alb, + // openListener:false, + // } + // ); + + } +} \ No newline at end of file diff --git a/deploy/scripts/cdk/lib/construct/index.ts b/deploy/scripts/cdk/lib/construct/index.ts new file mode 100644 index 000000000..8ca22911a --- /dev/null +++ b/deploy/scripts/cdk/lib/construct/index.ts @@ -0,0 +1,5 @@ +export * from './db'; +export * from './ecr'; +export * from './frontend'; +export * from './backend'; +export * from './network'; \ No newline at end of file diff --git a/deploy/scripts/cdk/lib/construct/network.ts b/deploy/scripts/cdk/lib/construct/network.ts new file mode 100644 index 000000000..035a051bc --- /dev/null +++ b/deploy/scripts/cdk/lib/construct/network.ts @@ -0,0 +1,180 @@ +import { RemovalPolicy, Duration } from 'aws-cdk-lib' +import { Construct } from 'constructs' +import { + aws_ec2 as ec2, + aws_ecs as ecs, + aws_dynamodb as dynamodb, + aws_iam as iam, + aws_logs as logs, + aws_servicediscovery as servicediscovery, + aws_elasticloadbalancingv2 as elb, +} from 'aws-cdk-lib'; + +export class Network extends Construct { + readonly vpc: ec2.Vpc; + readonly cluster: ecs.Cluster; + readonly alb: elb.IApplicationLoadBalancer; + readonly targetGroup: elb.ApplicationTargetGroup; + readonly cloudmapNamespace: servicediscovery.PrivateDnsNamespace; + readonly ecsFrontSG: ec2.SecurityGroup; + readonly ecsBackSG: ec2.SecurityGroup; + readonly dbSG: ec2.SecurityGroup; + readonly albSG: ec2.SecurityGroup; + readonly backendTaskRole: iam.Role; + readonly TaskExecutionRole: iam.Role; + readonly frontendTaskRole: iam.Role; + readonly backendLogGroup: logs.LogGroup; + readonly frontendLogGroup: logs.LogGroup; + + constructor(scope: Construct, id: string) { + super(scope, id) + + // VPC等リソースの作成 + this.vpc = new ec2.Vpc(scope, 'VPC', { + vpcName: 'langflow-vpc', + ipAddresses: ec2.IpAddresses.cidr('10.0.0.0/16'), + maxAzs: 3, + subnetConfiguration: [ + { + cidrMask: 24, + name: 'langflow-Isolated', + subnetType: ec2.SubnetType.PRIVATE_ISOLATED, + }, + { + cidrMask: 24, + name: 'langflow-Public', + subnetType: ec2.SubnetType.PUBLIC, + }, + { + cidrMask: 24, + name: 'langflow-Private', + subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS + }, + ], + natGateways: 1, + }) + + this.cluster = new ecs.Cluster(this, 'EcsCluster', { + clusterName: 'langflow-cluster', + vpc: this.vpc, + }); + + // Private DNS + this.cloudmapNamespace = new servicediscovery.PrivateDnsNamespace( + this, + 'Namespace', + { + name: 'ecs-deploy.com', + vpc: this.vpc, + } + ); + + // ALBに設定するセキュリティグループ + this.albSG = new ec2.SecurityGroup(scope, 'ALBSecurityGroup', { + securityGroupName: 'alb-sg', + description: 'for alb', + vpc: this.vpc, + }) + this.albSG.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(80)) + + this.alb = new elb.ApplicationLoadBalancer(this,'alb',{ + internetFacing: true, //インターネットからのアクセスを許可するかどうか指定 + loadBalancerName: 'alb', + securityGroup: this.albSG, //作成したセキュリティグループを割り当てる + vpc:this.vpc, + }) + + const listener = this.alb.addListener('Listener', { port: 80 }); + + this.targetGroup = listener.addTargets('targetGroup', { + port: 3000, + protocol: elb.ApplicationProtocol.HTTP, + healthCheck: { + enabled: true, + path: '/health', + healthyThresholdCount: 2, + unhealthyThresholdCount: 4, + interval: Duration.seconds(100), + timeout: Duration.seconds(30), + healthyHttpCodes: '200', + }, + }); + + // ECS FrontEndに設定するセキュリティグループ + this.ecsFrontSG = new ec2.SecurityGroup(scope, 'ECSFrontEndSecurityGroup', { + securityGroupName: 'langflow-ecs-front-sg', + description: 'for langflow-front-ecs', + vpc: this.vpc, + }) + this.ecsFrontSG.addIngressRule(this.albSG, ec2.Port.allTcp()) + + // ECS BackEndに設定するセキュリティグループ + this.ecsBackSG = new ec2.SecurityGroup(scope, 'ECSBackEndSecurityGroup', { + securityGroupName: 'langflow-ecs-back-sg', + description: 'for langflow-back-ecs', + vpc: this.vpc, + }) + this.ecsBackSG.addIngressRule(this.ecsFrontSG, ec2.Port.tcp(7860)) + + // RDSに設定するセキュリティグループ + this.dbSG = new ec2.SecurityGroup(scope, 'DBSecurityGroup', { + allowAllOutbound: true, + securityGroupName: 'langflow-db', + description: 'for langflow-db', + vpc: this.vpc, + }) + // AppRunnerSecurityGroupからのポート3306:mysql(5432:postgres)のインバウンドを許可 + this.dbSG.addIngressRule(this.ecsBackSG, ec2.Port.tcp(3306)) + + // ECS Policy State + const ECSExecPolicyStatement = new iam.PolicyStatement({ + sid: 'allowECSExec', + resources: ['*'], + actions: [ + 'ecr:GetAuthorizationToken', + 'ecr:BatchCheckLayerAvailability', + 'ecr:GetDownloadUrlForLayer', + 'ecr:BatchGetImage', + 'ssmmessages:CreateControlChannel', + 'ssmmessages:CreateDataChannel', + 'ssmmessages:OpenControlChannel', + 'ssmmessages:OpenDataChannel', + 'logs:CreateLogStream', + 'logs:DescribeLogGroups', + 'logs:DescribeLogStreams', + 'logs:PutLogEvents', + ], + }); + + this.backendTaskRole = new iam.Role(this, 'BackendTaskRole', { + assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), + }); + this.backendTaskRole.addToPolicy(ECSExecPolicyStatement); + + this.frontendTaskRole = new iam.Role(this, 'FrontendTaskRole', { + assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), + }); + this.frontendTaskRole.addToPolicy(ECSExecPolicyStatement); + + this.TaskExecutionRole = new iam.Role(this, 'TaskExecutionRole', { + assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), + managedPolicies: [ + { + managedPolicyArn: + 'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy', + }, + ], + }); + + // Create CloudWatch Log Group + this.backendLogGroup = new logs.LogGroup(this, 'backendLogGroup', { + logGroupName: 'myapp-backend', + removalPolicy: RemovalPolicy.DESTROY, + }); + + this.frontendLogGroup = new logs.LogGroup(this, 'frontendLogGroup', { + logGroupName: 'myapp-frontend', + removalPolicy: RemovalPolicy.DESTROY, + }); + } +} \ No newline at end of file diff --git a/deploy/scripts/cdk/package-lock.json b/deploy/scripts/cdk/package-lock.json new file mode 100644 index 000000000..3c19966e2 --- /dev/null +++ b/deploy/scripts/cdk/package-lock.json @@ -0,0 +1,4601 @@ +{ + "name": "cdk", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "cdk", + "version": "0.1.0", + "dependencies": { + "aws-cdk-lib": "2.86.0", + "cdk-ecr-deployment": "^2.5.30", + "constructs": "^10.0.0", + "source-map-support": "^0.5.21" + }, + "bin": { + "cdk": "bin/cdk.js" + }, + "devDependencies": { + "@types/jest": "^29.5.1", + "@types/node": "20.1.7", + "aws-cdk": "2.86.0", + "jest": "^29.5.0", + "ts-jest": "^29.1.0", + "ts-node": "^10.9.1", + "typescript": "~5.1.3" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@aws-cdk/asset-awscli-v1": { + "version": "2.2.201", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.201.tgz", + "integrity": "sha512-INZqcwDinNaIdb5CtW3ez5s943nX5stGBQS6VOP2JDlOFP81hM3fds/9NDknipqfUkZM43dx+HgVvkXYXXARCQ==" + }, + "node_modules/@aws-cdk/asset-kubectl-v20": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-kubectl-v20/-/asset-kubectl-v20-2.1.2.tgz", + "integrity": "sha512-3M2tELJOxQv0apCIiuKQ4pAbncz9GuLwnKFqxifWfe77wuMxyTRPmxssYHs42ePqzap1LT6GDcPygGs+hHstLg==" + }, + "node_modules/@aws-cdk/asset-node-proxy-agent-v5": { + "version": "2.0.166", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v5/-/asset-node-proxy-agent-v5-2.0.166.tgz", + "integrity": "sha512-j0xnccpUQHXJKPgCwQcGGNu4lRiC1PptYfdxBIH1L4dRK91iBxtSQHESRQX+yB47oGLaF/WfNN/aF3WXwlhikg==" + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", + "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", + "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", + "dev": true, + "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", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", + "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.3", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, + "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" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", + "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz", + "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.3", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.3", + "@babel/types": "^7.23.3", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", + "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.4.tgz", + "integrity": "sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.7", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", + "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", + "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.8", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.8.tgz", + "integrity": "sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/node": { + "version": "20.1.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.7.tgz", + "integrity": "sha512-WCuw/o4GSwDGMoonES8rcvwsig77dGCMbZDrZr2x4ZZiNW4P/gcoZXe/0twgtobcTkmg9TuKflxYL/DuwDyJzg==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "17.0.31", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", + "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", + "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aws-cdk": { + "version": "2.86.0", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.86.0.tgz", + "integrity": "sha512-GRcdU6p00Zu3fIZYPG+EbpDYppYMtzebuf0jrmCfKhCytRGaPWDHHfu3hrv0de4d0zbUD/+AmiODPMu3J6nXbQ==", + "dev": true, + "bin": { + "cdk": "bin/cdk" + }, + "engines": { + "node": ">= 14.15.0" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/aws-cdk-lib": { + "version": "2.86.0", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.86.0.tgz", + "integrity": "sha512-76yZ2MawAGXLD3ox4FjhUIPmAMXteGKkeo3tPMthemusDCCkD2X6DBssXBHjB7r9GnrOMMf8JH5BGq2lOZ539g==", + "bundleDependencies": [ + "@balena/dockerignore", + "case", + "fs-extra", + "ignore", + "jsonschema", + "minimatch", + "punycode", + "semver", + "table", + "yaml" + ], + "dependencies": { + "@aws-cdk/asset-awscli-v1": "^2.2.177", + "@aws-cdk/asset-kubectl-v20": "^2.1.1", + "@aws-cdk/asset-node-proxy-agent-v5": "^2.0.148", + "@balena/dockerignore": "^1.0.2", + "case": "1.6.3", + "fs-extra": "^11.1.1", + "ignore": "^5.2.4", + "jsonschema": "^1.4.1", + "minimatch": "^3.1.2", + "punycode": "^2.3.0", + "semver": "^7.5.1", + "table": "^6.8.1", + "yaml": "1.10.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "constructs": "^10.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/@balena/dockerignore": { + "version": "1.0.2", + "inBundle": true, + "license": "Apache-2.0" + }, + "node_modules/aws-cdk-lib/node_modules/ajv": { + "version": "8.12.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/aws-cdk-lib/node_modules/ansi-regex": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/ansi-styles": { + "version": "4.3.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/aws-cdk-lib/node_modules/astral-regex": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/balanced-match": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/brace-expansion": { + "version": "1.1.11", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/aws-cdk-lib/node_modules/case": { + "version": "1.6.3", + "inBundle": true, + "license": "(MIT OR GPL-3.0-or-later)", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/color-convert": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/color-name": { + "version": "1.1.4", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/concat-map": { + "version": "0.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/emoji-regex": { + "version": "8.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/fast-deep-equal": { + "version": "3.1.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/fs-extra": { + "version": "11.1.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/aws-cdk-lib/node_modules/graceful-fs": { + "version": "4.2.11", + "inBundle": true, + "license": "ISC" + }, + "node_modules/aws-cdk-lib/node_modules/ignore": { + "version": "5.2.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/aws-cdk-lib/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/json-schema-traverse": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/jsonfile": { + "version": "6.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/aws-cdk-lib/node_modules/jsonschema": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/aws-cdk-lib/node_modules/lodash.truncate": { + "version": "4.4.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aws-cdk-lib/node_modules/minimatch": { + "version": "3.1.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/aws-cdk-lib/node_modules/punycode": { + "version": "2.3.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/aws-cdk-lib/node_modules/require-from-string": { + "version": "2.0.2", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/semver": { + "version": "7.5.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aws-cdk-lib/node_modules/slice-ansi": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/aws-cdk-lib/node_modules/string-width": { + "version": "4.2.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/strip-ansi": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/table": { + "version": "6.8.1", + "inBundle": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/universalify": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/uri-js": { + "version": "4.4.1", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/aws-cdk-lib/node_modules/yaml": { + "version": "1.10.2", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001561", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz", + "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/cdk-ecr-deployment": { + "version": "2.5.30", + "resolved": "https://registry.npmjs.org/cdk-ecr-deployment/-/cdk-ecr-deployment-2.5.30.tgz", + "integrity": "sha512-IFS/DD6OmNcXv24YKjjaz1sb04xxsoUb7vPYwx7kTBAOxOnT0CuAadF8/HVfM/YVoqoOPXCJe3ikAXy1iI0nKw==", + "bundleDependencies": [ + "got", + "hpagent" + ], + "dependencies": { + "aws-cdk-lib": "^2.0.0", + "constructs": "^10.0.5", + "got": "^11.8.6", + "hpagent": "^0.1.2" + }, + "peerDependencies": { + "aws-cdk-lib": "^2.0.0", + "constructs": "^10.0.5" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/@sindresorhus/is": { + "version": "4.6.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "inBundle": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/@types/cacheable-request": { + "version": "6.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/@types/cacheable-request/node_modules/@types/node": { + "version": "20.3.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdk-ecr-deployment/node_modules/@types/http-cache-semantics": { + "version": "4.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdk-ecr-deployment/node_modules/@types/keyv": { + "version": "3.1.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/@types/keyv/node_modules/@types/node": { + "version": "20.3.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdk-ecr-deployment/node_modules/@types/responselike": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/@types/responselike/node_modules/@types/node": { + "version": "20.3.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdk-ecr-deployment/node_modules/cacheable-lookup": { + "version": "5.0.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/cacheable-request": { + "version": "7.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/clone-response": { + "version": "1.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/clone-response/node_modules/mimic-response": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/decompress-response": { + "version": "6.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/defer-to-connect": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/end-of-stream": { + "version": "1.4.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/got": { + "version": "11.8.6", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/hpagent": { + "version": "0.1.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdk-ecr-deployment/node_modules/http-cache-semantics": { + "version": "4.1.1", + "inBundle": true, + "license": "BSD-2-Clause" + }, + "node_modules/cdk-ecr-deployment/node_modules/http2-wrapper": { + "version": "1.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/json-buffer": { + "version": "3.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdk-ecr-deployment/node_modules/keyv": { + "version": "4.5.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/lowercase-keys": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/mimic-response": { + "version": "3.1.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/normalize-url": { + "version": "6.1.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/once": { + "version": "1.4.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/p-cancelable": { + "version": "2.1.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/pump": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/quick-lru": { + "version": "5.1.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/resolve-alpn": { + "version": "1.2.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdk-ecr-deployment/node_modules/responselike": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/wrappy": { + "version": "1.0.2", + "inBundle": true, + "license": "ISC" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/constructs": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.3.0.tgz", + "integrity": "sha512-vbK8i3rIb/xwZxSpTjz3SagHn1qq9BChLEfy5Hf6fB3/2eFbrwt2n9kHwQcS0CPTRBesreeAcsJfMq2229FnbQ==", + "engines": { + "node": ">= 16.14.0" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.580", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.580.tgz", + "integrity": "sha512-T5q3pjQon853xxxHUq3ZP68ZpvJHuSMY2+BZaW3QzjS4HvNuvsMmZ/+lU+nCrftre1jFZ+OSlExynXWBihnXzw==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", + "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "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" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pure-rand": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", + "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-jest": { + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", + "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "^7.5.3", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz", + "integrity": "sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/deploy/scripts/cdk/package.json b/deploy/scripts/cdk/package.json new file mode 100644 index 000000000..c6643368b --- /dev/null +++ b/deploy/scripts/cdk/package.json @@ -0,0 +1,28 @@ +{ + "name": "cdk", + "version": "0.1.0", + "bin": { + "cdk": "bin/cdk.js" + }, + "scripts": { + "build": "tsc", + "watch": "tsc -w", + "test": "jest", + "cdk": "cdk" + }, + "devDependencies": { + "@types/jest": "^29.5.1", + "@types/node": "20.1.7", + "aws-cdk": "2.86.0", + "jest": "^29.5.0", + "ts-jest": "^29.1.0", + "ts-node": "^10.9.1", + "typescript": "~5.1.3" + }, + "dependencies": { + "aws-cdk-lib": "2.86.0", + "cdk-ecr-deployment": "^2.5.30", + "constructs": "^10.0.0", + "source-map-support": "^0.5.21" + } +} diff --git a/deploy/scripts/cdk/test/cdk.test.ts b/deploy/scripts/cdk/test/cdk.test.ts new file mode 100644 index 000000000..1e6b29c85 --- /dev/null +++ b/deploy/scripts/cdk/test/cdk.test.ts @@ -0,0 +1,17 @@ +// import * as cdk from 'aws-cdk-lib'; +// import { Template } from 'aws-cdk-lib/assertions'; +// import * as Cdk from '../lib/cdk-stack'; + +// example test. To run these tests, uncomment this file along with the +// example resource in lib/cdk-stack.ts +test('SQS Queue Created', () => { +// const app = new cdk.App(); +// // WHEN +// const stack = new Cdk.CdkStack(app, 'MyTestStack'); +// // THEN +// const template = Template.fromStack(stack); + +// template.hasResourceProperties('AWS::SQS::Queue', { +// VisibilityTimeout: 300 +// }); +}); From b44c6d0cd73b9c87b31f4fd00ad4724675620c95 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Mon, 20 Nov 2023 17:45:20 +0900 Subject: [PATCH 057/203] modified: dockerignore for cdk --- .dockerignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.dockerignore b/.dockerignore index 0cafc1cde..4e7226768 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1 +1,2 @@ -.venv/ \ No newline at end of file +.venv/ +**/cdk \ No newline at end of file From 83244bcc325f052749d98eb9da157145015c9593 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Mon, 20 Nov 2023 19:21:27 +0900 Subject: [PATCH 058/203] modified: conflicts --- poetry.lock | 162 +++++++++++++++++++++++++++++++++++++++++++++++++ pyproject.toml | 5 ++ 2 files changed, 167 insertions(+) diff --git a/poetry.lock b/poetry.lock index 68e6c22bc..da925ca48 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2456,6 +2456,7 @@ description = "Lightweight in-process concurrent programming" optional = false python-versions = ">=3.7" files = [ +<<<<<<< HEAD {file = "greenlet-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f89e21afe925fcfa655965ca8ea10f24773a1791400989ff32f467badfe4a064"}, {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28e89e232c7593d33cac35425b58950789962011cc274aa43ef8865f2e11f46d"}, {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8ba29306c5de7717b5761b9ea74f9c72b9e2b834e24aa984da99cbfc70157fd"}, @@ -2513,6 +2514,70 @@ files = [ {file = "greenlet-3.0.1-cp39-cp39-win32.whl", hash = "sha256:cf868e08690cb89360eebc73ba4be7fb461cfbc6168dd88e2fbbe6f31812cd57"}, {file = "greenlet-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:ac4a39d1abae48184d420aa8e5e63efd1b75c8444dd95daa3e03f6c6310e9619"}, {file = "greenlet-3.0.1.tar.gz", hash = "sha256:816bd9488a94cba78d93e1abb58000e8266fa9cc2aa9ccdd6eb0696acb24005b"}, +======= + {file = "greenlet-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e09dea87cc91aea5500262993cbd484b41edf8af74f976719dd83fe724644cd6"}, + {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f47932c434a3c8d3c86d865443fadc1fbf574e9b11d6650b656e602b1797908a"}, + {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bdfaeecf8cc705d35d8e6de324bf58427d7eafb55f67050d8f28053a3d57118c"}, + {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a68d670c8f89ff65c82b936275369e532772eebc027c3be68c6b87ad05ca695"}, + {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ad562a104cd41e9d4644f46ea37167b93190c6d5e4048fcc4b80d34ecb278f"}, + {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02a807b2a58d5cdebb07050efe3d7deaf915468d112dfcf5e426d0564aa3aa4a"}, + {file = "greenlet-3.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b1660a15a446206c8545edc292ab5c48b91ff732f91b3d3b30d9a915d5ec4779"}, + {file = "greenlet-3.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:813720bd57e193391dfe26f4871186cf460848b83df7e23e6bef698a7624b4c9"}, + {file = "greenlet-3.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:aa15a2ec737cb609ed48902b45c5e4ff6044feb5dcdfcf6fa8482379190330d7"}, + {file = "greenlet-3.0.0-cp310-universal2-macosx_11_0_x86_64.whl", hash = "sha256:7709fd7bb02b31908dc8fd35bfd0a29fc24681d5cc9ac1d64ad07f8d2b7db62f"}, + {file = "greenlet-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:211ef8d174601b80e01436f4e6905aca341b15a566f35a10dd8d1e93f5dbb3b7"}, + {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6512592cc49b2c6d9b19fbaa0312124cd4c4c8a90d28473f86f92685cc5fef8e"}, + {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:871b0a8835f9e9d461b7fdaa1b57e3492dd45398e87324c047469ce2fc9f516c"}, + {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b505fcfc26f4148551826a96f7317e02c400665fa0883fe505d4fcaab1dabfdd"}, + {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:123910c58234a8d40eaab595bc56a5ae49bdd90122dde5bdc012c20595a94c14"}, + {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:96d9ea57292f636ec851a9bb961a5cc0f9976900e16e5d5647f19aa36ba6366b"}, + {file = "greenlet-3.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0b72b802496cccbd9b31acea72b6f87e7771ccfd7f7927437d592e5c92ed703c"}, + {file = "greenlet-3.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:527cd90ba3d8d7ae7dceb06fda619895768a46a1b4e423bdb24c1969823b8362"}, + {file = "greenlet-3.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:37f60b3a42d8b5499be910d1267b24355c495064f271cfe74bf28b17b099133c"}, + {file = "greenlet-3.0.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1482fba7fbed96ea7842b5a7fc11d61727e8be75a077e603e8ab49d24e234383"}, + {file = "greenlet-3.0.0-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:be557119bf467d37a8099d91fbf11b2de5eb1fd5fc5b91598407574848dc910f"}, + {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73b2f1922a39d5d59cc0e597987300df3396b148a9bd10b76a058a2f2772fc04"}, + {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1e22c22f7826096ad503e9bb681b05b8c1f5a8138469b255eb91f26a76634f2"}, + {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1d363666acc21d2c204dd8705c0e0457d7b2ee7a76cb16ffc099d6799744ac99"}, + {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:334ef6ed8337bd0b58bb0ae4f7f2dcc84c9f116e474bb4ec250a8bb9bd797a66"}, + {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6672fdde0fd1a60b44fb1751a7779c6db487e42b0cc65e7caa6aa686874e79fb"}, + {file = "greenlet-3.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:952256c2bc5b4ee8df8dfc54fc4de330970bf5d79253c863fb5e6761f00dda35"}, + {file = "greenlet-3.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:269d06fa0f9624455ce08ae0179430eea61085e3cf6457f05982b37fd2cefe17"}, + {file = "greenlet-3.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:9adbd8ecf097e34ada8efde9b6fec4dd2a903b1e98037adf72d12993a1c80b51"}, + {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6b5ce7f40f0e2f8b88c28e6691ca6806814157ff05e794cdd161be928550f4c"}, + {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecf94aa539e97a8411b5ea52fc6ccd8371be9550c4041011a091eb8b3ca1d810"}, + {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80dcd3c938cbcac986c5c92779db8e8ce51a89a849c135172c88ecbdc8c056b7"}, + {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e52a712c38e5fb4fd68e00dc3caf00b60cb65634d50e32281a9d6431b33b4af1"}, + {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5539f6da3418c3dc002739cb2bb8d169056aa66e0c83f6bacae0cd3ac26b423"}, + {file = "greenlet-3.0.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:343675e0da2f3c69d3fb1e894ba0a1acf58f481f3b9372ce1eb465ef93cf6fed"}, + {file = "greenlet-3.0.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:abe1ef3d780de56defd0c77c5ba95e152f4e4c4e12d7e11dd8447d338b85a625"}, + {file = "greenlet-3.0.0-cp37-cp37m-win32.whl", hash = "sha256:e693e759e172fa1c2c90d35dea4acbdd1d609b6936115d3739148d5e4cd11947"}, + {file = "greenlet-3.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bdd696947cd695924aecb3870660b7545a19851f93b9d327ef8236bfc49be705"}, + {file = "greenlet-3.0.0-cp37-universal2-macosx_11_0_x86_64.whl", hash = "sha256:cc3e2679ea13b4de79bdc44b25a0c4fcd5e94e21b8f290791744ac42d34a0353"}, + {file = "greenlet-3.0.0-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:63acdc34c9cde42a6534518e32ce55c30f932b473c62c235a466469a710bfbf9"}, + {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a1a6244ff96343e9994e37e5b4839f09a0207d35ef6134dce5c20d260d0302c"}, + {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b822fab253ac0f330ee807e7485769e3ac85d5eef827ca224feaaefa462dc0d0"}, + {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8060b32d8586e912a7b7dac2d15b28dbbd63a174ab32f5bc6d107a1c4143f40b"}, + {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:621fcb346141ae08cb95424ebfc5b014361621b8132c48e538e34c3c93ac7365"}, + {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6bb36985f606a7c49916eff74ab99399cdfd09241c375d5a820bb855dfb4af9f"}, + {file = "greenlet-3.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:10b5582744abd9858947d163843d323d0b67be9432db50f8bf83031032bc218d"}, + {file = "greenlet-3.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f351479a6914fd81a55c8e68963609f792d9b067fb8a60a042c585a621e0de4f"}, + {file = "greenlet-3.0.0-cp38-cp38-win32.whl", hash = "sha256:9de687479faec7db5b198cc365bc34addd256b0028956501f4d4d5e9ca2e240a"}, + {file = "greenlet-3.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:3fd2b18432e7298fcbec3d39e1a0aa91ae9ea1c93356ec089421fabc3651572b"}, + {file = "greenlet-3.0.0-cp38-universal2-macosx_11_0_x86_64.whl", hash = "sha256:3c0d36f5adc6e6100aedbc976d7428a9f7194ea79911aa4bf471f44ee13a9464"}, + {file = "greenlet-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4cd83fb8d8e17633ad534d9ac93719ef8937568d730ef07ac3a98cb520fd93e4"}, + {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a5b2d4cdaf1c71057ff823a19d850ed5c6c2d3686cb71f73ae4d6382aaa7a06"}, + {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e7dcdfad252f2ca83c685b0fa9fba00e4d8f243b73839229d56ee3d9d219314"}, + {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c94e4e924d09b5a3e37b853fe5924a95eac058cb6f6fb437ebb588b7eda79870"}, + {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad6fb737e46b8bd63156b8f59ba6cdef46fe2b7db0c5804388a2d0519b8ddb99"}, + {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d55db1db455c59b46f794346efce896e754b8942817f46a1bada2d29446e305a"}, + {file = "greenlet-3.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:56867a3b3cf26dc8a0beecdb4459c59f4c47cdd5424618c08515f682e1d46692"}, + {file = "greenlet-3.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9a812224a5fb17a538207e8cf8e86f517df2080c8ee0f8c1ed2bdaccd18f38f4"}, + {file = "greenlet-3.0.0-cp39-cp39-win32.whl", hash = "sha256:0d3f83ffb18dc57243e0151331e3c383b05e5b6c5029ac29f754745c800f8ed9"}, + {file = "greenlet-3.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:831d6f35037cf18ca5e80a737a27d822d87cd922521d18ed3dbc8a6967be50ce"}, + {file = "greenlet-3.0.0-cp39-universal2-macosx_11_0_x86_64.whl", hash = "sha256:a048293392d4e058298710a54dfaefcefdf49d287cd33fb1f7d63d55426e4355"}, + {file = "greenlet-3.0.0.tar.gz", hash = "sha256:19834e3f91f485442adc1ee440171ec5d9a4840a1f7bd5ed97833544719ce10b"}, +>>>>>>> ddce84dd (modify: poetory install pymysql) ] [package.extras] @@ -3736,10 +3801,13 @@ files = [ {file = "lxml-4.9.3-cp27-cp27m-macosx_11_0_x86_64.whl", hash = "sha256:b0a545b46b526d418eb91754565ba5b63b1c0b12f9bd2f808c852d9b4b2f9b5c"}, {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:075b731ddd9e7f68ad24c635374211376aa05a281673ede86cbe1d1b3455279d"}, {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1e224d5755dba2f4a9498e150c43792392ac9b5380aa1b845f98a1618c94eeef"}, + {file = "lxml-4.9.3-cp27-cp27m-win32.whl", hash = "sha256:2c74524e179f2ad6d2a4f7caf70e2d96639c0954c943ad601a9e146c76408ed7"}, + {file = "lxml-4.9.3-cp27-cp27m-win_amd64.whl", hash = "sha256:4f1026bc732b6a7f96369f7bfe1a4f2290fb34dce00d8644bc3036fb351a4ca1"}, {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0781a98ff5e6586926293e59480b64ddd46282953203c76ae15dbbbf302e8bb"}, {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cef2502e7e8a96fe5ad686d60b49e1ab03e438bd9123987994528febd569868e"}, {file = "lxml-4.9.3-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b86164d2cff4d3aaa1f04a14685cbc072efd0b4f99ca5708b2ad1b9b5988a991"}, {file = "lxml-4.9.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:42871176e7896d5d45138f6d28751053c711ed4d48d8e30b498da155af39aebd"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:ae8b9c6deb1e634ba4f1930eb67ef6e6bf6a44b6eb5ad605642b2d6d5ed9ce3c"}, {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:411007c0d88188d9f621b11d252cce90c4a2d1a49db6c068e3c16422f306eab8"}, {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:cd47b4a0d41d2afa3e58e5bf1f62069255aa2fd6ff5ee41604418ca925911d76"}, {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e2cb47860da1f7e9a5256254b74ae331687b9672dfa780eed355c4c9c3dbd23"}, @@ -3748,6 +3816,7 @@ files = [ {file = "lxml-4.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:97047f0d25cd4bcae81f9ec9dc290ca3e15927c192df17331b53bebe0e3ff96d"}, {file = "lxml-4.9.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:1f447ea5429b54f9582d4b955f5f1985f278ce5cf169f72eea8afd9502973dd5"}, {file = "lxml-4.9.3-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:57d6ba0ca2b0c462f339640d22882acc711de224d769edf29962b09f77129cbf"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:9767e79108424fb6c3edf8f81e6730666a50feb01a328f4a016464a5893f835a"}, {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:71c52db65e4b56b8ddc5bb89fb2e66c558ed9d1a74a45ceb7dcb20c191c3df2f"}, {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d73d8ecf8ecf10a3bd007f2192725a34bd62898e8da27eb9d32a58084f93962b"}, {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0a3d3487f07c1d7f150894c238299934a2a074ef590b583103a45002035be120"}, @@ -3767,6 +3836,7 @@ files = [ {file = "lxml-4.9.3-cp36-cp36m-macosx_11_0_x86_64.whl", hash = "sha256:64f479d719dc9f4c813ad9bb6b28f8390360660b73b2e4beb4cb0ae7104f1c12"}, {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:dd708cf4ee4408cf46a48b108fb9427bfa00b9b85812a9262b5c668af2533ea5"}, {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c31c7462abdf8f2ac0577d9f05279727e698f97ecbb02f17939ea99ae8daa98"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e3cd95e10c2610c360154afdc2f1480aea394f4a4f1ea0a5eacce49640c9b190"}, {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:4930be26af26ac545c3dffb662521d4e6268352866956672231887d18f0eaab2"}, {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4aec80cde9197340bc353d2768e2a75f5f60bacda2bab72ab1dc499589b3878c"}, {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:14e019fd83b831b2e61baed40cab76222139926b1fb5ed0e79225bc0cae14584"}, @@ -3776,6 +3846,7 @@ files = [ {file = "lxml-4.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bef4e656f7d98aaa3486d2627e7d2df1157d7e88e7efd43a65aa5dd4714916cf"}, {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:46f409a2d60f634fe550f7133ed30ad5321ae2e6630f13657fb9479506b00601"}, {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:4c28a9144688aef80d6ea666c809b4b0e50010a2aca784c97f5e6bf143d9f129"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:141f1d1a9b663c679dc524af3ea1773e618907e96075262726c7612c02b149a4"}, {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:53ace1c1fd5a74ef662f844a0413446c0629d151055340e9893da958a374f70d"}, {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17a753023436a18e27dd7769e798ce302963c236bc4114ceee5b25c18c52c693"}, {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7d298a1bd60c067ea75d9f684f5f3992c9d6766fadbc0bcedd39750bf344c2f4"}, @@ -3785,6 +3856,7 @@ files = [ {file = "lxml-4.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:120fa9349a24c7043854c53cae8cec227e1f79195a7493e09e0c12e29f918e52"}, {file = "lxml-4.9.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4d2d1edbca80b510443f51afd8496be95529db04a509bc8faee49c7b0fb6d2cc"}, {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8d7e43bd40f65f7d97ad8ef5c9b1778943d02f04febef12def25f7583d19baac"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:71d66ee82e7417828af6ecd7db817913cb0cf9d4e61aa0ac1fde0583d84358db"}, {file = "lxml-4.9.3-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:6fc3c450eaa0b56f815c7b62f2b7fba7266c4779adcf1cece9e6deb1de7305ce"}, {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65299ea57d82fb91c7f019300d24050c4ddeb7c5a190e076b5f48a2b43d19c42"}, {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:eadfbbbfb41b44034a4c757fd5d70baccd43296fb894dba0295606a7cf3124aa"}, @@ -3794,6 +3866,7 @@ files = [ {file = "lxml-4.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:92af161ecbdb2883c4593d5ed4815ea71b31fafd7fd05789b23100d081ecac96"}, {file = "lxml-4.9.3-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:9bb6ad405121241e99a86efff22d3ef469024ce22875a7ae045896ad23ba2340"}, {file = "lxml-4.9.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8ed74706b26ad100433da4b9d807eae371efaa266ffc3e9191ea436087a9d6a7"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fbf521479bcac1e25a663df882c46a641a9bff6b56dc8b0fafaebd2f66fb231b"}, {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:303bf1edce6ced16bf67a18a1cf8339d0db79577eec5d9a6d4a80f0fb10aa2da"}, {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:5515edd2a6d1a5a70bfcdee23b42ec33425e405c5b351478ab7dc9347228f96e"}, {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:690dafd0b187ed38583a648076865d8c229661ed20e48f2335d68e2cf7dc829d"}, @@ -3804,13 +3877,16 @@ files = [ {file = "lxml-4.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:4dd9a263e845a72eacb60d12401e37c616438ea2e5442885f65082c276dfb2b2"}, {file = "lxml-4.9.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6689a3d7fd13dc687e9102a27e98ef33730ac4fe37795d5036d18b4d527abd35"}, {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:f6bdac493b949141b733c5345b6ba8f87a226029cbabc7e9e121a413e49441e0"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:05186a0f1346ae12553d66df1cfce6f251589fea3ad3da4f3ef4e34b2d58c6a3"}, {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c2006f5c8d28dee289f7020f721354362fa304acbaaf9745751ac4006650254b"}, {file = "lxml-4.9.3-pp38-pypy38_pp73-macosx_11_0_x86_64.whl", hash = "sha256:5c245b783db29c4e4fbbbfc9c5a78be496c9fea25517f90606aa1f6b2b3d5f7b"}, {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4fb960a632a49f2f089d522f70496640fdf1218f1243889da3822e0a9f5f3ba7"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:50670615eaf97227d5dc60de2dc99fb134a7130d310d783314e7724bf163f75d"}, {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9719fe17307a9e814580af1f5c6e05ca593b12fb7e44fe62450a5384dbf61b4b"}, {file = "lxml-4.9.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3331bece23c9ee066e0fb3f96c61322b9e0f54d775fccefff4c38ca488de283a"}, {file = "lxml-4.9.3-pp39-pypy39_pp73-macosx_11_0_x86_64.whl", hash = "sha256:ed667f49b11360951e201453fc3967344d0d0263aa415e1619e85ae7fd17b4e0"}, {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8b77946fd508cbf0fccd8e400a7f71d4ac0e1595812e66025bac475a8e811694"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e4da8ca0c0c0aea88fd46be8e44bd49716772358d648cce45fe387f7b92374a7"}, {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fe4bda6bd4340caa6e5cf95e73f8fea5c4bfc55763dd42f1b50a94c1b4a2fbd4"}, {file = "lxml-4.9.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f3df3db1d336b9356dd3112eae5f5c2b8b377f3bc826848567f10bfddfee77e9"}, {file = "lxml-4.9.3.tar.gz", hash = "sha256:48628bd53a426c9eb9bc066a923acaa0878d1e86129fd5359aee99285f4eed9c"}, @@ -3892,6 +3968,16 @@ files = [ {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, @@ -5363,6 +5449,17 @@ files = [ {file = "psycopg_binary-3.1.12-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:000838cb5ab7851116b462e58893a96b0f1e35864135a6283f3242a730ec45d3"}, {file = "psycopg_binary-3.1.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7949e1aefe339f04dbecac6aa036c9cd137a58f966c4b96ab933823c340ee12"}, {file = "psycopg_binary-3.1.12-cp311-cp311-win_amd64.whl", hash = "sha256:b32922872460575083487de41e17e8cf308c3550da02c704efe42960bc6c19de"}, + {file = "psycopg_binary-3.1.12-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:70054ada2f890d004dc3d5ff908e34aecb085fd599d40db2975c09a39c50dfc3"}, + {file = "psycopg_binary-3.1.12-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7544d6d74f5b5f9daafe8a4ed7d266787d62a2bf16f5120c45d42d1f4a856bc8"}, + {file = "psycopg_binary-3.1.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43197161099cb4e36a9ca44c10657908b619d7263ffcff30932ad4627430dc3c"}, + {file = "psycopg_binary-3.1.12-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68398cdf3aedd4042b1126b9aba34615f1ab592831483282f19f0159fce5ca75"}, + {file = "psycopg_binary-3.1.12-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77ae6cda3ffee2425aca9ea7af57296d0c701e2ac5897b48b95dfee050234592"}, + {file = "psycopg_binary-3.1.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:278e8888e90fb6ebd7eae8ccb85199eafd712b734e641e0d40f2a903e946102d"}, + {file = "psycopg_binary-3.1.12-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:047c4ba8d3089465b0a69c4c669128df43403867858d78da6b40b33788bfa89f"}, + {file = "psycopg_binary-3.1.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8248b11ac490bb74de80457ab0e9cef31c08164ff7b867031927a17e5c9e19ed"}, + {file = "psycopg_binary-3.1.12-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6979c02acb9783c6134ee516751b8f891a2d4db7f73ebecc9e92750283d6fb99"}, + {file = "psycopg_binary-3.1.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:eaf2375b724ad61ee82a5c2a849e57b12b3cb510ec8845084132bbb907cb3335"}, + {file = "psycopg_binary-3.1.12-cp312-cp312-win_amd64.whl", hash = "sha256:6177cfa6f872a9cc84dbfc7dc163af6ef01639c50acc9a441673f29c2305c37a"}, {file = "psycopg_binary-3.1.12-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b81427fd5a97c9b4ac12f3b8d985870b0c3866b5fc2e72e51cacd3630ffd6466"}, {file = "psycopg_binary-3.1.12-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f17a2c393879aa54f840540009d0e70a30d22ffa0038d81e258ac2c99b15d74"}, {file = "psycopg_binary-3.1.12-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c6a5d125a61101ef5ab7384206e43952fe2a5fca997b96d28a28a752512f900"}, @@ -5430,6 +5527,7 @@ files = [ {file = "psycopg2_binary-2.9.9-cp311-cp311-win32.whl", hash = "sha256:dc4926288b2a3e9fd7b50dc6a1909a13bbdadfc67d93f3374d984e56f885579d"}, {file = "psycopg2_binary-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:b76bedd166805480ab069612119ea636f5ab8f8771e640ae103e05a4aae3e417"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8532fd6e6e2dc57bcb3bc90b079c60de896d2128c5d9d6f24a63875a95a088cf"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0605eaed3eb239e87df0d5e3c6489daae3f7388d455d0c0b4df899519c6a38d"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f8544b092a29a6ddd72f3556a9fcf249ec412e10ad28be6a0c0d948924f2212"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d423c8d8a3c82d08fe8af900ad5b613ce3632a1249fd6a223941d0735fce493"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e5afae772c00980525f6d6ecf7cbca55676296b580c0e6abb407f15f3706996"}, @@ -5438,6 +5536,8 @@ files = [ {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cb16c65dcb648d0a43a2521f2f0a2300f40639f6f8c1ecbc662141e4e3e1ee07"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:911dda9c487075abd54e644ccdf5e5c16773470a6a5d3826fda76699410066fb"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:57fede879f08d23c85140a360c6a77709113efd1c993923c59fde17aa27599fe"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-win32.whl", hash = "sha256:64cf30263844fa208851ebb13b0732ce674d8ec6a0c86a4e160495d299ba3c93"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:81ff62668af011f9a48787564ab7eded4e9fb17a4a6a74af5ffa6a457400d2ab"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2293b001e319ab0d869d660a704942c9e2cce19745262a8aba2115ef41a0a42a"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ef7df18daf2c4c07e2695e8cfd5ee7f748a1d54d802330985a78d2a5a6dca9"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a602ea5aff39bb9fac6308e9c9d82b9a35c2bf288e184a816002c9fae930b77"}, @@ -5952,6 +6052,21 @@ snappy = ["python-snappy"] test = ["pytest (>=7)"] zstd = ["zstandard"] +[[package]] +name = "pymysql" +version = "1.0.2" +description = "Pure Python MySQL Driver" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyMySQL-1.0.2-py3-none-any.whl", hash = "sha256:41fc3a0c5013d5f039639442321185532e3e2c8924687abe6537de157d403641"}, + {file = "PyMySQL-1.0.2.tar.gz", hash = "sha256:816927a350f38d56072aeca5dfb10221fe1dc653745853d30a216637f5d7ad36"}, +] + +[package.extras] +ed25519 = ["PyNaCl (>=1.4.0)"] +rsa = ["cryptography"] + [[package]] name = "pyparsing" version = "2.4.7" @@ -6248,6 +6363,7 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -6255,8 +6371,15 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -6273,6 +6396,7 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -6280,6 +6404,7 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -7045,6 +7170,7 @@ description = "A set of python modules for machine learning and data mining" optional = true python-versions = ">=3.8" files = [ +<<<<<<< HEAD {file = "scikit-learn-1.3.2.tar.gz", hash = "sha256:a2f54c76accc15a34bfb9066e6c7a56c1e7235dda5762b990792330b52ccfb05"}, {file = "scikit_learn-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e326c0eb5cf4d6ba40f93776a20e9a7a69524c4db0757e7ce24ba222471ee8a1"}, {file = "scikit_learn-1.3.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:535805c2a01ccb40ca4ab7d081d771aea67e535153e35a1fd99418fcedd1648a"}, @@ -7071,6 +7197,34 @@ files = [ {file = "scikit_learn-1.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d08ada33e955c54355d909b9c06a4789a729977f165b8bae6f225ff0a60ec4a"}, {file = "scikit_learn-1.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:763f0ae4b79b0ff9cca0bf3716bcc9915bdacff3cebea15ec79652d1cc4fa5c9"}, {file = "scikit_learn-1.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:ed932ea780517b00dae7431e031faae6b49b20eb6950918eb83bd043237950e0"}, +======= + {file = "scikit-learn-1.3.1.tar.gz", hash = "sha256:1a231cced3ee3fa04756b4a7ab532dc9417acd581a330adff5f2c01ac2831fcf"}, + {file = "scikit_learn-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3153612ff8d36fa4e35ef8b897167119213698ea78f3fd130b4068e6f8d2da5a"}, + {file = "scikit_learn-1.3.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:6bb9490fdb8e7e00f1354621689187bef3cab289c9b869688f805bf724434755"}, + {file = "scikit_learn-1.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7135a03af71138669f19bc96e7d0cc8081aed4b3565cc3b131135d65fc642ba"}, + {file = "scikit_learn-1.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d8dee8c1f40eeba49a85fe378bdf70a07bb64aba1a08fda1e0f48d27edfc3e6"}, + {file = "scikit_learn-1.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:4d379f2b34096105a96bd857b88601dffe7389bd55750f6f29aaa37bc6272eb5"}, + {file = "scikit_learn-1.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14e8775eba072ab10866a7e0596bc9906873e22c4c370a651223372eb62de180"}, + {file = "scikit_learn-1.3.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:58b0c2490eff8355dc26e884487bf8edaccf2ba48d09b194fb2f3a026dd64f9d"}, + {file = "scikit_learn-1.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f66eddfda9d45dd6cadcd706b65669ce1df84b8549875691b1f403730bdef217"}, + {file = "scikit_learn-1.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c6448c37741145b241eeac617028ba6ec2119e1339b1385c9720dae31367f2be"}, + {file = "scikit_learn-1.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:c413c2c850241998168bbb3bd1bb59ff03b1195a53864f0b80ab092071af6028"}, + {file = "scikit_learn-1.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ef540e09873e31569bc8b02c8a9f745ee04d8e1263255a15c9969f6f5caa627f"}, + {file = "scikit_learn-1.3.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:9147a3a4df4d401e618713880be023e36109c85d8569b3bf5377e6cd3fecdeac"}, + {file = "scikit_learn-1.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2cd3634695ad192bf71645702b3df498bd1e246fc2d529effdb45a06ab028b4"}, + {file = "scikit_learn-1.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c275a06c5190c5ce00af0acbb61c06374087949f643ef32d355ece12c4db043"}, + {file = "scikit_learn-1.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:0e1aa8f206d0de814b81b41d60c1ce31f7f2c7354597af38fae46d9c47c45122"}, + {file = "scikit_learn-1.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:52b77cc08bd555969ec5150788ed50276f5ef83abb72e6f469c5b91a0009bbca"}, + {file = "scikit_learn-1.3.1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a683394bc3f80b7c312c27f9b14ebea7766b1f0a34faf1a2e9158d80e860ec26"}, + {file = "scikit_learn-1.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15d964d9eb181c79c190d3dbc2fff7338786bf017e9039571418a1d53dab236"}, + {file = "scikit_learn-1.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ce9233cdf0cdcf0858a5849d306490bf6de71fa7603a3835124e386e62f2311"}, + {file = "scikit_learn-1.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:1ec668ce003a5b3d12d020d2cde0abd64b262ac5f098b5c84cf9657deb9996a8"}, + {file = "scikit_learn-1.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ccbbedae99325628c1d1cbe3916b7ef58a1ce949672d8d39c8b190e10219fd32"}, + {file = "scikit_learn-1.3.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:845f81c7ceb4ea6bac64ab1c9f2ce8bef0a84d0f21f3bece2126adcc213dfecd"}, + {file = "scikit_learn-1.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8454d57a22d856f1fbf3091bd86f9ebd4bff89088819886dc0c72f47a6c30652"}, + {file = "scikit_learn-1.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d993fb70a1d78c9798b8f2f28705bfbfcd546b661f9e2e67aa85f81052b9c53"}, + {file = "scikit_learn-1.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:66f7bb1fec37d65f4ef85953e1df5d3c98a0f0141d394dcdaead5a6de9170347"}, +>>>>>>> ddce84dd (modify: poetory install pymysql) ] [package.dependencies] @@ -7360,8 +7514,12 @@ files = [ ] [package.dependencies] +<<<<<<< HEAD greenlet = {version = "!=0.4.17", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} typing-extensions = ">=4.2.0" +======= +greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} +>>>>>>> ddce84dd (modify: poetory install pymysql) [package.extras] aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] @@ -8927,4 +9085,8 @@ local = ["ctransformers", "llama-cpp-python", "sentence-transformers"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.11" +<<<<<<< HEAD content-hash = "27f6f86ca62ee5cfdae333daae4f043a745ed2fff0d958a201b514fac36068d4" +======= +content-hash = "e2580ab8f9412219c2e647fda0c424e28519e9d0febd885c72e27aeebc0dba8e" +>>>>>>> ddce84dd (modify: poetory install pymysql) diff --git a/pyproject.toml b/pyproject.toml index 3481d3ef9..5c1b11272 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -101,7 +101,12 @@ jq = "^1.6.0" boto3 = "^1.28.63" numexpr = "^2.8.6" qianfan = "0.0.5" +<<<<<<< HEAD pgvector = "^0.2.3" +======= +pymysql = "1.0.2" + +>>>>>>> ddce84dd (modify: poetory install pymysql) [tool.poetry.group.dev.dependencies] types-redis = "^4.6.0.5" From 8d08260ae885cc3bc152b9f5797645a926ca74a1 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Mon, 20 Nov 2023 17:56:57 +0900 Subject: [PATCH 059/203] modified: Dockerfile for cdk --- Dockerfile | 22 +++++++++++++--------- dev.Dockerfile | 18 ------------------ prod.Dockerfile | 15 +++++++++++++++ src/frontend/Dockerfile | 36 +++++++++++++++++++++++------------- src/frontend/dev.Dockerfile | 26 -------------------------- src/frontend/prod.Dockerfile | 16 ++++++++++++++++ 6 files changed, 67 insertions(+), 66 deletions(-) delete mode 100644 dev.Dockerfile create mode 100644 prod.Dockerfile delete mode 100644 src/frontend/dev.Dockerfile create mode 100644 src/frontend/prod.Dockerfile diff --git a/Dockerfile b/Dockerfile index 346348c0a..762c27f90 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,15 +1,19 @@ -FROM python:3.10-slim +FROM --platform=linux/amd64 python:3.10-slim -RUN apt-get update && apt-get install gcc g++ git make -y && apt-get clean \ - && rm -rf /var/lib/apt/lists/* -RUN useradd -m -u 1000 user -USER user -ENV HOME=/home/user \ - PATH=/home/user/.local/bin:$PATH +WORKDIR /app -WORKDIR $HOME/app +# Install Poetry +RUN apt-get update && apt-get install gcc g++ curl build-essential postgresql-server-dev-all -y +RUN curl -sSL https://install.python-poetry.org | python3 - +# # Add Poetry to PATH +ENV PATH="${PATH}:/root/.local/bin" +# # Copy the pyproject.toml and poetry.lock files +COPY poetry.lock pyproject.toml ./ +# Copy the rest of the application codes +COPY ./ ./ -COPY --chown=user . $HOME/app +# Install dependencies +RUN poetry config virtualenvs.create false && poetry install --no-interaction --no-ansi RUN pip install langflow>==0.5.0 -U --user CMD ["python", "-m", "langflow", "run", "--host", "0.0.0.0", "--port", "7860"] diff --git a/dev.Dockerfile b/dev.Dockerfile deleted file mode 100644 index ed3631516..000000000 --- a/dev.Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -FROM python:3.10-slim - -WORKDIR /app - -# Install Poetry -RUN apt-get update && apt-get install gcc g++ curl build-essential postgresql-server-dev-all -y -RUN curl -sSL https://install.python-poetry.org | python3 - -# # Add Poetry to PATH -ENV PATH="${PATH}:/root/.local/bin" -# # Copy the pyproject.toml and poetry.lock files -COPY poetry.lock pyproject.toml ./ -# Copy the rest of the application codes -COPY ./ ./ - -# Install dependencies -RUN poetry config virtualenvs.create false && poetry install --no-interaction --no-ansi - -CMD ["uvicorn", "--factory", "src.backend.langflow.main:create_app", "--host", "0.0.0.0", "--port", "7860", "--reload", "--log-level", "debug"] diff --git a/prod.Dockerfile b/prod.Dockerfile new file mode 100644 index 000000000..520c407de --- /dev/null +++ b/prod.Dockerfile @@ -0,0 +1,15 @@ +FROM python:3.10-slim + +RUN apt-get update && apt-get install gcc g++ git make -y && apt-get clean \ + && rm -rf /var/lib/apt/lists/* +RUN useradd -m -u 1000 user +USER user +ENV HOME=/home/user \ + PATH=/home/user/.local/bin:$PATH + +WORKDIR $HOME/app + +COPY --chown=user . $HOME/app + +RUN pip install langflow>==0.0.86 -U --user +CMD ["python", "-m", "langflow", "run", "--host", "0.0.0.0", "--port", "7860"] diff --git a/src/frontend/Dockerfile b/src/frontend/Dockerfile index 024eab562..612af5314 100644 --- a/src/frontend/Dockerfile +++ b/src/frontend/Dockerfile @@ -1,16 +1,26 @@ -FROM node:20-alpine as frontend_build +#baseline +FROM --platform=linux/amd64 node:19-bullseye-slim AS base +RUN mkdir -p /home/node/app +RUN chown -R node:node /home/node && chmod -R 770 /home/node +RUN apt-get update && apt-get install -y jq +WORKDIR /home/node/app + +# client build +FROM base AS builder-client ARG BACKEND_URL -WORKDIR /app +ENV BACKEND_URL $BACKEND_URL +RUN echo "BACKEND_URL: $BACKEND_URL" -COPY ./package.json ./package-lock.json ./tsconfig.json ./vite.config.ts ./index.html ./tailwind.config.js ./postcss.config.js ./prettier.config.js /app/ -RUN npm install -COPY ./src /app/src -RUN npm run build +WORKDIR /home/node/app +COPY --chown=node:node . ./ -FROM nginx -COPY --from=frontend_build /app/build/ /usr/share/nginx/html -COPY /nginx.conf /etc/nginx/conf.d/default.conf -COPY start-nginx.sh /start-nginx.sh -RUN chmod +x /start-nginx.sh -ENV BACKEND_URL=$BACKEND_URL -CMD ["/start-nginx.sh"] \ No newline at end of file +COPY ./set_proxy.sh . +RUN chmod +x set_proxy.sh && \ + cat set_proxy.sh | tr -d '\r' > set_proxy_unix.sh && \ + chmod +x set_proxy_unix.sh && \ + ./set_proxy_unix.sh + +USER node + +RUN npm install --loglevel warn +CMD ["npm", "run", "dev:docker"] \ No newline at end of file diff --git a/src/frontend/dev.Dockerfile b/src/frontend/dev.Dockerfile deleted file mode 100644 index 8678b02dd..000000000 --- a/src/frontend/dev.Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -#baseline -FROM node:19-bullseye-slim AS base -RUN mkdir -p /home/node/app -RUN chown -R node:node /home/node && chmod -R 770 /home/node -RUN apt-get update && apt-get install -y jq -WORKDIR /home/node/app - -# client build -FROM base AS builder-client -ARG BACKEND_URL -ENV BACKEND_URL $BACKEND_URL -RUN echo "BACKEND_URL: $BACKEND_URL" - -WORKDIR /home/node/app -COPY --chown=node:node . ./ - -COPY ./set_proxy.sh . -RUN chmod +x set_proxy.sh && \ - cat set_proxy.sh | tr -d '\r' > set_proxy_unix.sh && \ - chmod +x set_proxy_unix.sh && \ - ./set_proxy_unix.sh - -USER node - -RUN npm install --loglevel warn -CMD ["npm", "run", "dev:docker"] \ No newline at end of file diff --git a/src/frontend/prod.Dockerfile b/src/frontend/prod.Dockerfile new file mode 100644 index 000000000..024eab562 --- /dev/null +++ b/src/frontend/prod.Dockerfile @@ -0,0 +1,16 @@ +FROM node:20-alpine as frontend_build +ARG BACKEND_URL +WORKDIR /app + +COPY ./package.json ./package-lock.json ./tsconfig.json ./vite.config.ts ./index.html ./tailwind.config.js ./postcss.config.js ./prettier.config.js /app/ +RUN npm install +COPY ./src /app/src +RUN npm run build + +FROM nginx +COPY --from=frontend_build /app/build/ /usr/share/nginx/html +COPY /nginx.conf /etc/nginx/conf.d/default.conf +COPY start-nginx.sh /start-nginx.sh +RUN chmod +x /start-nginx.sh +ENV BACKEND_URL=$BACKEND_URL +CMD ["/start-nginx.sh"] \ No newline at end of file From 1492c44df01062bf370110e77d4cdebf6d418224 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Mon, 20 Nov 2023 19:18:34 +0900 Subject: [PATCH 060/203] add curl --- docker-compose.yml | 13 ++++++++++--- src/frontend/Dockerfile | 2 +- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 13d39e1f3..21d1ad8d5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,20 +1,25 @@ version: "3" +networks: + langflow: services: backend: build: context: ./ - dockerfile: ./dev.Dockerfile + dockerfile: ./Dockerfile + env_file: + - .env ports: - "7860:7860" volumes: - ./:/app command: bash -c "uvicorn --factory src.backend.langflow.main:create_app --host 0.0.0.0 --port 7860 --reload" - + networks: + - langflow frontend: build: context: ./src/frontend - dockerfile: ./dev.Dockerfile + dockerfile: ./Dockerfile args: - BACKEND_URL=http://backend:7860 environment: @@ -26,3 +31,5 @@ services: - ./src/frontend/src:/home/node/app/src - ./src/frontend/package.json:/home/node/app/package.json restart: on-failure + networks: + - langflow diff --git a/src/frontend/Dockerfile b/src/frontend/Dockerfile index 612af5314..0b33e09b8 100644 --- a/src/frontend/Dockerfile +++ b/src/frontend/Dockerfile @@ -2,7 +2,7 @@ FROM --platform=linux/amd64 node:19-bullseye-slim AS base RUN mkdir -p /home/node/app RUN chown -R node:node /home/node && chmod -R 770 /home/node -RUN apt-get update && apt-get install -y jq +RUN apt-get update && apt-get install -y jq curl WORKDIR /home/node/app # client build From 7db5f9f680f187ff4df902fe2ea6a599ea80f665 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Mon, 20 Nov 2023 19:30:43 +0900 Subject: [PATCH 061/203] modified: backend dockerfile --- Dockerfile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 762c27f90..ce5715e1f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,5 +15,4 @@ COPY ./ ./ # Install dependencies RUN poetry config virtualenvs.create false && poetry install --no-interaction --no-ansi -RUN pip install langflow>==0.5.0 -U --user -CMD ["python", "-m", "langflow", "run", "--host", "0.0.0.0", "--port", "7860"] +CMD ["uvicorn", "--factory", "src.backend.langflow.main:create_app", "--host", "0.0.0.0", "--port", "7860", "--reload", "--log-level", "debug"] From 8353df79ac25708f82987c92071d26622261e224 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Mon, 20 Nov 2023 19:48:53 +0900 Subject: [PATCH 062/203] modify: poetry lock file --- poetry.lock | 106 ++----------------------------------------------- pyproject.toml | 6 +-- 2 files changed, 4 insertions(+), 108 deletions(-) diff --git a/poetry.lock b/poetry.lock index da925ca48..7d3a7ec01 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2456,7 +2456,6 @@ description = "Lightweight in-process concurrent programming" optional = false python-versions = ">=3.7" files = [ -<<<<<<< HEAD {file = "greenlet-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f89e21afe925fcfa655965ca8ea10f24773a1791400989ff32f467badfe4a064"}, {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28e89e232c7593d33cac35425b58950789962011cc274aa43ef8865f2e11f46d"}, {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8ba29306c5de7717b5761b9ea74f9c72b9e2b834e24aa984da99cbfc70157fd"}, @@ -2514,70 +2513,6 @@ files = [ {file = "greenlet-3.0.1-cp39-cp39-win32.whl", hash = "sha256:cf868e08690cb89360eebc73ba4be7fb461cfbc6168dd88e2fbbe6f31812cd57"}, {file = "greenlet-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:ac4a39d1abae48184d420aa8e5e63efd1b75c8444dd95daa3e03f6c6310e9619"}, {file = "greenlet-3.0.1.tar.gz", hash = "sha256:816bd9488a94cba78d93e1abb58000e8266fa9cc2aa9ccdd6eb0696acb24005b"}, -======= - {file = "greenlet-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e09dea87cc91aea5500262993cbd484b41edf8af74f976719dd83fe724644cd6"}, - {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f47932c434a3c8d3c86d865443fadc1fbf574e9b11d6650b656e602b1797908a"}, - {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bdfaeecf8cc705d35d8e6de324bf58427d7eafb55f67050d8f28053a3d57118c"}, - {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a68d670c8f89ff65c82b936275369e532772eebc027c3be68c6b87ad05ca695"}, - {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ad562a104cd41e9d4644f46ea37167b93190c6d5e4048fcc4b80d34ecb278f"}, - {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02a807b2a58d5cdebb07050efe3d7deaf915468d112dfcf5e426d0564aa3aa4a"}, - {file = "greenlet-3.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b1660a15a446206c8545edc292ab5c48b91ff732f91b3d3b30d9a915d5ec4779"}, - {file = "greenlet-3.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:813720bd57e193391dfe26f4871186cf460848b83df7e23e6bef698a7624b4c9"}, - {file = "greenlet-3.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:aa15a2ec737cb609ed48902b45c5e4ff6044feb5dcdfcf6fa8482379190330d7"}, - {file = "greenlet-3.0.0-cp310-universal2-macosx_11_0_x86_64.whl", hash = "sha256:7709fd7bb02b31908dc8fd35bfd0a29fc24681d5cc9ac1d64ad07f8d2b7db62f"}, - {file = "greenlet-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:211ef8d174601b80e01436f4e6905aca341b15a566f35a10dd8d1e93f5dbb3b7"}, - {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6512592cc49b2c6d9b19fbaa0312124cd4c4c8a90d28473f86f92685cc5fef8e"}, - {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:871b0a8835f9e9d461b7fdaa1b57e3492dd45398e87324c047469ce2fc9f516c"}, - {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b505fcfc26f4148551826a96f7317e02c400665fa0883fe505d4fcaab1dabfdd"}, - {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:123910c58234a8d40eaab595bc56a5ae49bdd90122dde5bdc012c20595a94c14"}, - {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:96d9ea57292f636ec851a9bb961a5cc0f9976900e16e5d5647f19aa36ba6366b"}, - {file = "greenlet-3.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0b72b802496cccbd9b31acea72b6f87e7771ccfd7f7927437d592e5c92ed703c"}, - {file = "greenlet-3.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:527cd90ba3d8d7ae7dceb06fda619895768a46a1b4e423bdb24c1969823b8362"}, - {file = "greenlet-3.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:37f60b3a42d8b5499be910d1267b24355c495064f271cfe74bf28b17b099133c"}, - {file = "greenlet-3.0.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1482fba7fbed96ea7842b5a7fc11d61727e8be75a077e603e8ab49d24e234383"}, - {file = "greenlet-3.0.0-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:be557119bf467d37a8099d91fbf11b2de5eb1fd5fc5b91598407574848dc910f"}, - {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73b2f1922a39d5d59cc0e597987300df3396b148a9bd10b76a058a2f2772fc04"}, - {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1e22c22f7826096ad503e9bb681b05b8c1f5a8138469b255eb91f26a76634f2"}, - {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1d363666acc21d2c204dd8705c0e0457d7b2ee7a76cb16ffc099d6799744ac99"}, - {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:334ef6ed8337bd0b58bb0ae4f7f2dcc84c9f116e474bb4ec250a8bb9bd797a66"}, - {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6672fdde0fd1a60b44fb1751a7779c6db487e42b0cc65e7caa6aa686874e79fb"}, - {file = "greenlet-3.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:952256c2bc5b4ee8df8dfc54fc4de330970bf5d79253c863fb5e6761f00dda35"}, - {file = "greenlet-3.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:269d06fa0f9624455ce08ae0179430eea61085e3cf6457f05982b37fd2cefe17"}, - {file = "greenlet-3.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:9adbd8ecf097e34ada8efde9b6fec4dd2a903b1e98037adf72d12993a1c80b51"}, - {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6b5ce7f40f0e2f8b88c28e6691ca6806814157ff05e794cdd161be928550f4c"}, - {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecf94aa539e97a8411b5ea52fc6ccd8371be9550c4041011a091eb8b3ca1d810"}, - {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80dcd3c938cbcac986c5c92779db8e8ce51a89a849c135172c88ecbdc8c056b7"}, - {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e52a712c38e5fb4fd68e00dc3caf00b60cb65634d50e32281a9d6431b33b4af1"}, - {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5539f6da3418c3dc002739cb2bb8d169056aa66e0c83f6bacae0cd3ac26b423"}, - {file = "greenlet-3.0.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:343675e0da2f3c69d3fb1e894ba0a1acf58f481f3b9372ce1eb465ef93cf6fed"}, - {file = "greenlet-3.0.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:abe1ef3d780de56defd0c77c5ba95e152f4e4c4e12d7e11dd8447d338b85a625"}, - {file = "greenlet-3.0.0-cp37-cp37m-win32.whl", hash = "sha256:e693e759e172fa1c2c90d35dea4acbdd1d609b6936115d3739148d5e4cd11947"}, - {file = "greenlet-3.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bdd696947cd695924aecb3870660b7545a19851f93b9d327ef8236bfc49be705"}, - {file = "greenlet-3.0.0-cp37-universal2-macosx_11_0_x86_64.whl", hash = "sha256:cc3e2679ea13b4de79bdc44b25a0c4fcd5e94e21b8f290791744ac42d34a0353"}, - {file = "greenlet-3.0.0-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:63acdc34c9cde42a6534518e32ce55c30f932b473c62c235a466469a710bfbf9"}, - {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a1a6244ff96343e9994e37e5b4839f09a0207d35ef6134dce5c20d260d0302c"}, - {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b822fab253ac0f330ee807e7485769e3ac85d5eef827ca224feaaefa462dc0d0"}, - {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8060b32d8586e912a7b7dac2d15b28dbbd63a174ab32f5bc6d107a1c4143f40b"}, - {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:621fcb346141ae08cb95424ebfc5b014361621b8132c48e538e34c3c93ac7365"}, - {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6bb36985f606a7c49916eff74ab99399cdfd09241c375d5a820bb855dfb4af9f"}, - {file = "greenlet-3.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:10b5582744abd9858947d163843d323d0b67be9432db50f8bf83031032bc218d"}, - {file = "greenlet-3.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f351479a6914fd81a55c8e68963609f792d9b067fb8a60a042c585a621e0de4f"}, - {file = "greenlet-3.0.0-cp38-cp38-win32.whl", hash = "sha256:9de687479faec7db5b198cc365bc34addd256b0028956501f4d4d5e9ca2e240a"}, - {file = "greenlet-3.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:3fd2b18432e7298fcbec3d39e1a0aa91ae9ea1c93356ec089421fabc3651572b"}, - {file = "greenlet-3.0.0-cp38-universal2-macosx_11_0_x86_64.whl", hash = "sha256:3c0d36f5adc6e6100aedbc976d7428a9f7194ea79911aa4bf471f44ee13a9464"}, - {file = "greenlet-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4cd83fb8d8e17633ad534d9ac93719ef8937568d730ef07ac3a98cb520fd93e4"}, - {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a5b2d4cdaf1c71057ff823a19d850ed5c6c2d3686cb71f73ae4d6382aaa7a06"}, - {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e7dcdfad252f2ca83c685b0fa9fba00e4d8f243b73839229d56ee3d9d219314"}, - {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c94e4e924d09b5a3e37b853fe5924a95eac058cb6f6fb437ebb588b7eda79870"}, - {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad6fb737e46b8bd63156b8f59ba6cdef46fe2b7db0c5804388a2d0519b8ddb99"}, - {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d55db1db455c59b46f794346efce896e754b8942817f46a1bada2d29446e305a"}, - {file = "greenlet-3.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:56867a3b3cf26dc8a0beecdb4459c59f4c47cdd5424618c08515f682e1d46692"}, - {file = "greenlet-3.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9a812224a5fb17a538207e8cf8e86f517df2080c8ee0f8c1ed2bdaccd18f38f4"}, - {file = "greenlet-3.0.0-cp39-cp39-win32.whl", hash = "sha256:0d3f83ffb18dc57243e0151331e3c383b05e5b6c5029ac29f754745c800f8ed9"}, - {file = "greenlet-3.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:831d6f35037cf18ca5e80a737a27d822d87cd922521d18ed3dbc8a6967be50ce"}, - {file = "greenlet-3.0.0-cp39-universal2-macosx_11_0_x86_64.whl", hash = "sha256:a048293392d4e058298710a54dfaefcefdf49d287cd33fb1f7d63d55426e4355"}, - {file = "greenlet-3.0.0.tar.gz", hash = "sha256:19834e3f91f485442adc1ee440171ec5d9a4840a1f7bd5ed97833544719ce10b"}, ->>>>>>> ddce84dd (modify: poetory install pymysql) ] [package.extras] @@ -4713,6 +4648,7 @@ optional = false python-versions = ">=3.7" files = [ {file = "opentelemetry_instrumentation-0.42b0-py3-none-any.whl", hash = "sha256:65ae54ddb90ca2d05d2d16bf6863173e7141eba1bbbf41fc9bbb02446adbe369"}, + {file = "opentelemetry_instrumentation-0.42b0.tar.gz", hash = "sha256:6a653a1fed0f76eea32885321d77c750483e987eeefa4cbf219fc83559543198"}, ] [package.dependencies] @@ -4728,6 +4664,7 @@ optional = false python-versions = ">=3.7" files = [ {file = "opentelemetry_instrumentation_aiohttp_client-0.42b0-py3-none-any.whl", hash = "sha256:130a58fe4a702a5c828e87190c1bba8321fd2ecdad0834daeb90b494e51369c7"}, + {file = "opentelemetry_instrumentation_aiohttp_client-0.42b0.tar.gz", hash = "sha256:6ac5b2181b02232e169a5c1540fe1d104592cd5d5993ffb3581e7ac659f673be"}, ] [package.dependencies] @@ -7170,7 +7107,6 @@ description = "A set of python modules for machine learning and data mining" optional = true python-versions = ">=3.8" files = [ -<<<<<<< HEAD {file = "scikit-learn-1.3.2.tar.gz", hash = "sha256:a2f54c76accc15a34bfb9066e6c7a56c1e7235dda5762b990792330b52ccfb05"}, {file = "scikit_learn-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e326c0eb5cf4d6ba40f93776a20e9a7a69524c4db0757e7ce24ba222471ee8a1"}, {file = "scikit_learn-1.3.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:535805c2a01ccb40ca4ab7d081d771aea67e535153e35a1fd99418fcedd1648a"}, @@ -7197,34 +7133,6 @@ files = [ {file = "scikit_learn-1.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d08ada33e955c54355d909b9c06a4789a729977f165b8bae6f225ff0a60ec4a"}, {file = "scikit_learn-1.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:763f0ae4b79b0ff9cca0bf3716bcc9915bdacff3cebea15ec79652d1cc4fa5c9"}, {file = "scikit_learn-1.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:ed932ea780517b00dae7431e031faae6b49b20eb6950918eb83bd043237950e0"}, -======= - {file = "scikit-learn-1.3.1.tar.gz", hash = "sha256:1a231cced3ee3fa04756b4a7ab532dc9417acd581a330adff5f2c01ac2831fcf"}, - {file = "scikit_learn-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3153612ff8d36fa4e35ef8b897167119213698ea78f3fd130b4068e6f8d2da5a"}, - {file = "scikit_learn-1.3.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:6bb9490fdb8e7e00f1354621689187bef3cab289c9b869688f805bf724434755"}, - {file = "scikit_learn-1.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7135a03af71138669f19bc96e7d0cc8081aed4b3565cc3b131135d65fc642ba"}, - {file = "scikit_learn-1.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d8dee8c1f40eeba49a85fe378bdf70a07bb64aba1a08fda1e0f48d27edfc3e6"}, - {file = "scikit_learn-1.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:4d379f2b34096105a96bd857b88601dffe7389bd55750f6f29aaa37bc6272eb5"}, - {file = "scikit_learn-1.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14e8775eba072ab10866a7e0596bc9906873e22c4c370a651223372eb62de180"}, - {file = "scikit_learn-1.3.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:58b0c2490eff8355dc26e884487bf8edaccf2ba48d09b194fb2f3a026dd64f9d"}, - {file = "scikit_learn-1.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f66eddfda9d45dd6cadcd706b65669ce1df84b8549875691b1f403730bdef217"}, - {file = "scikit_learn-1.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c6448c37741145b241eeac617028ba6ec2119e1339b1385c9720dae31367f2be"}, - {file = "scikit_learn-1.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:c413c2c850241998168bbb3bd1bb59ff03b1195a53864f0b80ab092071af6028"}, - {file = "scikit_learn-1.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ef540e09873e31569bc8b02c8a9f745ee04d8e1263255a15c9969f6f5caa627f"}, - {file = "scikit_learn-1.3.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:9147a3a4df4d401e618713880be023e36109c85d8569b3bf5377e6cd3fecdeac"}, - {file = "scikit_learn-1.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2cd3634695ad192bf71645702b3df498bd1e246fc2d529effdb45a06ab028b4"}, - {file = "scikit_learn-1.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c275a06c5190c5ce00af0acbb61c06374087949f643ef32d355ece12c4db043"}, - {file = "scikit_learn-1.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:0e1aa8f206d0de814b81b41d60c1ce31f7f2c7354597af38fae46d9c47c45122"}, - {file = "scikit_learn-1.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:52b77cc08bd555969ec5150788ed50276f5ef83abb72e6f469c5b91a0009bbca"}, - {file = "scikit_learn-1.3.1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a683394bc3f80b7c312c27f9b14ebea7766b1f0a34faf1a2e9158d80e860ec26"}, - {file = "scikit_learn-1.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15d964d9eb181c79c190d3dbc2fff7338786bf017e9039571418a1d53dab236"}, - {file = "scikit_learn-1.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ce9233cdf0cdcf0858a5849d306490bf6de71fa7603a3835124e386e62f2311"}, - {file = "scikit_learn-1.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:1ec668ce003a5b3d12d020d2cde0abd64b262ac5f098b5c84cf9657deb9996a8"}, - {file = "scikit_learn-1.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ccbbedae99325628c1d1cbe3916b7ef58a1ce949672d8d39c8b190e10219fd32"}, - {file = "scikit_learn-1.3.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:845f81c7ceb4ea6bac64ab1c9f2ce8bef0a84d0f21f3bece2126adcc213dfecd"}, - {file = "scikit_learn-1.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8454d57a22d856f1fbf3091bd86f9ebd4bff89088819886dc0c72f47a6c30652"}, - {file = "scikit_learn-1.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d993fb70a1d78c9798b8f2f28705bfbfcd546b661f9e2e67aa85f81052b9c53"}, - {file = "scikit_learn-1.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:66f7bb1fec37d65f4ef85953e1df5d3c98a0f0141d394dcdaead5a6de9170347"}, ->>>>>>> ddce84dd (modify: poetory install pymysql) ] [package.dependencies] @@ -7514,12 +7422,8 @@ files = [ ] [package.dependencies] -<<<<<<< HEAD greenlet = {version = "!=0.4.17", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} typing-extensions = ">=4.2.0" -======= -greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} ->>>>>>> ddce84dd (modify: poetory install pymysql) [package.extras] aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] @@ -9085,8 +8989,4 @@ local = ["ctransformers", "llama-cpp-python", "sentence-transformers"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.11" -<<<<<<< HEAD -content-hash = "27f6f86ca62ee5cfdae333daae4f043a745ed2fff0d958a201b514fac36068d4" -======= -content-hash = "e2580ab8f9412219c2e647fda0c424e28519e9d0febd885c72e27aeebc0dba8e" ->>>>>>> ddce84dd (modify: poetory install pymysql) +content-hash = "15e903d9e6bdb90cc93c3f9ccf14207f55f4a4674cb939020d480d5f7fabf2cf" diff --git a/pyproject.toml b/pyproject.toml index 5c1b11272..b3aeebe31 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -101,13 +101,9 @@ jq = "^1.6.0" boto3 = "^1.28.63" numexpr = "^2.8.6" qianfan = "0.0.5" -<<<<<<< HEAD pgvector = "^0.2.3" -======= pymysql = "1.0.2" ->>>>>>> ddce84dd (modify: poetory install pymysql) - [tool.poetry.group.dev.dependencies] types-redis = "^4.6.0.5" black = "^23.10.0" @@ -153,4 +149,4 @@ line-length = 120 [build-system] requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" +build-backend = "poetry.core.masonry.api" \ No newline at end of file From b49fa15a867133d89b7fa6b9867066d613771436 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Tue, 21 Nov 2023 09:56:46 +0900 Subject: [PATCH 063/203] modified: frontend cloudMap --- deploy/scripts/cdk/lib/construct/frontend.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/deploy/scripts/cdk/lib/construct/frontend.ts b/deploy/scripts/cdk/lib/construct/frontend.ts index e4463000d..e61bd9a75 100644 --- a/deploy/scripts/cdk/lib/construct/frontend.ts +++ b/deploy/scripts/cdk/lib/construct/frontend.ts @@ -63,7 +63,7 @@ export class FrontEndCluster extends Construct { }, ], }); - + const frontendServiceName = 'langflow-frontend-service' const frontendService = new ecs.FargateService( this, 'FrontendService', @@ -75,11 +75,18 @@ export class FrontEndCluster extends Construct { taskDefinition: frontendTaskDefinition, enableExecuteCommand: true, securityGroups: [props.ecsFrontSG], - // healthCheckGracePeriod: Duration.seconds(300), + cloudMapOptions: { + cloudMapNamespace: props.cloudmapNamespace, + containerPort: containerPort, + dnsRecordType: servicediscovery.DnsRecordType.A, + dnsTtl: Duration.seconds(10), + name: frontendServiceName + }, + healthCheckGracePeriod: Duration.seconds(1000), } ); - // props.targetGroup.addTarget(frontendService); + props.targetGroup.addTarget(frontendService); // // Create ALB and ECS Fargate Service // const frontService = new ecs_patterns.ApplicationLoadBalancedFargateService( From b920f50c5a2930b40d11b956eadc18758009611a Mon Sep 17 00:00:00 2001 From: nsxshota Date: Tue, 21 Nov 2023 13:14:26 +0900 Subject: [PATCH 064/203] modified port --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 21d1ad8d5..50fe44441 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -25,7 +25,7 @@ services: environment: - VITE_PROXY_TARGET=http://backend:7860 ports: - - "3000:3000" + - "8080:3000" volumes: - ./src/frontend/public:/home/node/app/public - ./src/frontend/src:/home/node/app/src From 1770aa8d885929d6b8dd43f657c50f0ae11d38b2 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Tue, 21 Nov 2023 13:15:29 +0900 Subject: [PATCH 065/203] set env to backend --- deploy/scripts/cdk/lib/construct/backend.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/deploy/scripts/cdk/lib/construct/backend.ts b/deploy/scripts/cdk/lib/construct/backend.ts index 3d05fe616..8d99a610e 100644 --- a/deploy/scripts/cdk/lib/construct/backend.ts +++ b/deploy/scripts/cdk/lib/construct/backend.ts @@ -57,7 +57,9 @@ export class BackEndCluster extends Construct { }), environment:{ // user:pass@endpoint:port/dbname - "LANGFLOW_DATABASE_URL" : `mysql+pymysql://${ecs.Secret.fromSecretsManager(secretsDB, 'username')}:${ecs.Secret.fromSecretsManager(secretsDB, 'password')}@${ecs.Secret.fromSecretsManager(secretsDB, 'host')}:3306/${ecs.Secret.fromSecretsManager(secretsDB, 'dbname')}`, + // "LANGFLOW_DATABASE_URL" : `mysql+pymysql://${ecs.Secret.fromSecretsManager(secretsDB, 'username')}:${ecs.Secret.fromSecretsManager(secretsDB, 'password')}@${ecs.Secret.fromSecretsManager(secretsDB, 'host')}:3306/${ecs.Secret.fromSecretsManager(secretsDB, 'dbname')}`, + "LANGFLOW_DATABASE_URL" : "sqlite:///./langflow.db", + "LANGFLOW_LANGCHAIN_CACHE" : "SQLiteCache", "LANGFLOW_AUTO_LOGIN" : "false", "LANGFLOW_SUPERUSER" : "admin", "LANGFLOW_SUPERUSER_PASSWORD" : "1234567" From 078951fc9d16544234d2442e82463daa3b6b5bde Mon Sep 17 00:00:00 2001 From: nsxshota Date: Tue, 21 Nov 2023 15:24:03 +0900 Subject: [PATCH 066/203] update cdk code --- deploy/scripts/cdk/lib/construct/backend.ts | 2 +- deploy/scripts/cdk/lib/construct/frontend.ts | 5 +++-- deploy/scripts/cdk/lib/construct/network.ts | 14 ++++++++++---- src/frontend/Dockerfile | 1 + 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/deploy/scripts/cdk/lib/construct/backend.ts b/deploy/scripts/cdk/lib/construct/backend.ts index 8d99a610e..62f56762a 100644 --- a/deploy/scripts/cdk/lib/construct/backend.ts +++ b/deploy/scripts/cdk/lib/construct/backend.ts @@ -78,7 +78,7 @@ export class BackEndCluster extends Construct { "password": ecs.Secret.fromSecretsManager(secretsDB, 'password'), }, }); - this.backendServiceName = 'langflow-backend-service' + this.backendServiceName = 'backend' const backendService = new ecs.FargateService(this, 'BackEndService', { cluster: props.cluster, serviceName: this.backendServiceName, diff --git a/deploy/scripts/cdk/lib/construct/frontend.ts b/deploy/scripts/cdk/lib/construct/frontend.ts index e61bd9a75..451438cc5 100644 --- a/deploy/scripts/cdk/lib/construct/frontend.ts +++ b/deploy/scripts/cdk/lib/construct/frontend.ts @@ -60,15 +60,16 @@ export class FrontEndCluster extends Construct { { containerPort: containerPort, protocol: ecs.Protocol.TCP, + appProtocol:ecs.AppProtocol.http, }, ], }); - const frontendServiceName = 'langflow-frontend-service' + const frontendServiceName = 'frontend' const frontendService = new ecs.FargateService( this, 'FrontendService', { - serviceName: 'langflow-frontend-service', + serviceName: frontendServiceName, cluster: props.cluster, desiredCount: 1, assignPublicIp: false, diff --git a/deploy/scripts/cdk/lib/construct/network.ts b/deploy/scripts/cdk/lib/construct/network.ts index 035a051bc..22f12d4ec 100644 --- a/deploy/scripts/cdk/lib/construct/network.ts +++ b/deploy/scripts/cdk/lib/construct/network.ts @@ -28,6 +28,9 @@ export class Network extends Construct { constructor(scope: Construct, id: string) { super(scope, id) + const alb_listen_port=80 + const front_service_port=3000 + const back_service_port=7860 // VPC等リソースの作成 this.vpc = new ec2.Vpc(scope, 'VPC', { @@ -75,7 +78,7 @@ export class Network extends Construct { description: 'for alb', vpc: this.vpc, }) - this.albSG.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(80)) + this.albSG.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(alb_listen_port)) this.alb = new elb.ApplicationLoadBalancer(this,'alb',{ internetFacing: true, //インターネットからのアクセスを許可するかどうか指定 @@ -84,10 +87,10 @@ export class Network extends Construct { vpc:this.vpc, }) - const listener = this.alb.addListener('Listener', { port: 80 }); + const listener = this.alb.addListener('Listener', { port: alb_listen_port }); this.targetGroup = listener.addTargets('targetGroup', { - port: 3000, + port: front_service_port, protocol: elb.ApplicationProtocol.HTTP, healthCheck: { enabled: true, @@ -114,7 +117,7 @@ export class Network extends Construct { description: 'for langflow-back-ecs', vpc: this.vpc, }) - this.ecsBackSG.addIngressRule(this.ecsFrontSG, ec2.Port.tcp(7860)) + this.ecsBackSG.addIngressRule(this.ecsFrontSG, ec2.Port.tcp(back_service_port)) // RDSに設定するセキュリティグループ this.dbSG = new ec2.SecurityGroup(scope, 'DBSecurityGroup', { @@ -150,6 +153,9 @@ export class Network extends Construct { assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), }); this.backendTaskRole.addToPolicy(ECSExecPolicyStatement); + // KendraとBedrockのアクセス権付与 + // this.backendTaskRole.addToPolicy(); + this.frontendTaskRole = new iam.Role(this, 'FrontendTaskRole', { assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), diff --git a/src/frontend/Dockerfile b/src/frontend/Dockerfile index 0b33e09b8..6479c5580 100644 --- a/src/frontend/Dockerfile +++ b/src/frontend/Dockerfile @@ -23,4 +23,5 @@ RUN chmod +x set_proxy.sh && \ USER node RUN npm install --loglevel warn +RUN npm update CMD ["npm", "run", "dev:docker"] \ No newline at end of file From 5474505531e33c13a8dbaa41b386b71636f47566 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Tue, 21 Nov 2023 15:34:51 +0900 Subject: [PATCH 067/203] add: delete docker images sh --- deploy/scripts/cdk/delete-docker-images.sh | 3 +++ deploy/scripts/cdk/delete-ecr.sh | 8 ++++---- 2 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 deploy/scripts/cdk/delete-docker-images.sh diff --git a/deploy/scripts/cdk/delete-docker-images.sh b/deploy/scripts/cdk/delete-docker-images.sh new file mode 100644 index 000000000..1e1595008 --- /dev/null +++ b/deploy/scripts/cdk/delete-docker-images.sh @@ -0,0 +1,3 @@ +docker stop $(docker ps -aq) +docker rm $(docker ps -aq) +docker rmi -f $(docker images -aq) \ No newline at end of file diff --git a/deploy/scripts/cdk/delete-ecr.sh b/deploy/scripts/cdk/delete-ecr.sh index be7a5dab9..ebe837a8a 100644 --- a/deploy/scripts/cdk/delete-ecr.sh +++ b/deploy/scripts/cdk/delete-ecr.sh @@ -1,4 +1,4 @@ -aws cloudformation delete-stack --stack-name LangflowAppStack -aws ecr delete-repository --repository-name langflow-backend-repository --force -aws ecr delete-repository --repository-name langflow-frontend-repository --force -aws ecr describe-repositories --output json | jq -re ".repositories[].repositoryName" \ No newline at end of file +# aws cloudformation delete-stack --stack-name LangflowAppStack +# aws ecr delete-repository --repository-name langflow-backend-repository --force +# aws ecr delete-repository --repository-name langflow-frontend-repository --force +# aws ecr describe-repositories --output json | jq -re ".repositories[].repositoryName" \ No newline at end of file From 342c92063741b50530a1ca2de95ec64f75df8763 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Tue, 21 Nov 2023 16:26:19 +0900 Subject: [PATCH 068/203] add: Bedrock Kendra policy statement --- deploy/scripts/cdk/lib/construct/network.ts | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/deploy/scripts/cdk/lib/construct/network.ts b/deploy/scripts/cdk/lib/construct/network.ts index 22f12d4ec..275fab545 100644 --- a/deploy/scripts/cdk/lib/construct/network.ts +++ b/deploy/scripts/cdk/lib/construct/network.ts @@ -148,13 +148,32 @@ export class Network extends Construct { 'logs:PutLogEvents', ], }); + // Bedrock roll + const BedrockPolicyStatement = new iam.PolicyStatement({ + sid: 'allowBedrockAccess', + resources: ['*'], + actions: [ + 'bedrock:*', + ], + }); + // Kendra roll + const KendraPolicyStatement = new iam.PolicyStatement({ + sid: 'allowKendraAccess', + resources: ['*'], + actions: [ + 'kendra:*' + ], + }); this.backendTaskRole = new iam.Role(this, 'BackendTaskRole', { assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), }); + // ECS Exec Policyの付与 this.backendTaskRole.addToPolicy(ECSExecPolicyStatement); // KendraとBedrockのアクセス権付与 - // this.backendTaskRole.addToPolicy(); + this.backendTaskRole.addToPolicy(KendraPolicyStatement); + this.backendTaskRole.addToPolicy(BedrockPolicyStatement); + this.frontendTaskRole = new iam.Role(this, 'FrontendTaskRole', { From 2f9cf685d43bfccaf99658293615112712ddfc9b Mon Sep 17 00:00:00 2001 From: nsxshota Date: Tue, 21 Nov 2023 16:34:41 +0900 Subject: [PATCH 069/203] add portMapping name option --- deploy/scripts/cdk/lib/construct/frontend.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deploy/scripts/cdk/lib/construct/frontend.ts b/deploy/scripts/cdk/lib/construct/frontend.ts index 451438cc5..e5aec96b6 100644 --- a/deploy/scripts/cdk/lib/construct/frontend.ts +++ b/deploy/scripts/cdk/lib/construct/frontend.ts @@ -43,7 +43,7 @@ export class FrontEndCluster extends Construct { taskRole: props.frontendTaskRole, } ); - + const frontendServiceName = 'frontend' frontendTaskDefinition.addContainer('frontendContainer', { image: ecs.ContainerImage.fromEcrRepository(props.ecrFrontEndRepository, "latest"), containerName:'langflow-front-container', @@ -58,13 +58,13 @@ export class FrontEndCluster extends Construct { }), portMappings: [ { + name:frontendServiceName, containerPort: containerPort, protocol: ecs.Protocol.TCP, appProtocol:ecs.AppProtocol.http, }, ], }); - const frontendServiceName = 'frontend' const frontendService = new ecs.FargateService( this, 'FrontendService', From 8b0598e07b30e595c09b6a20d030052a5686cdd0 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Tue, 21 Nov 2023 16:51:06 +0900 Subject: [PATCH 070/203] add portMapping hostport --- deploy/scripts/cdk/lib/construct/frontend.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/deploy/scripts/cdk/lib/construct/frontend.ts b/deploy/scripts/cdk/lib/construct/frontend.ts index e5aec96b6..cb9e7085c 100644 --- a/deploy/scripts/cdk/lib/construct/frontend.ts +++ b/deploy/scripts/cdk/lib/construct/frontend.ts @@ -59,6 +59,7 @@ export class FrontEndCluster extends Construct { portMappings: [ { name:frontendServiceName, + hostPort:80, containerPort: containerPort, protocol: ecs.Protocol.TCP, appProtocol:ecs.AppProtocol.http, From 826507b202ac6819557235d500b1b892f9ac523f Mon Sep 17 00:00:00 2001 From: nsxshota Date: Tue, 21 Nov 2023 16:54:04 +0900 Subject: [PATCH 071/203] modified: hostport setting --- deploy/scripts/cdk/lib/construct/frontend.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/deploy/scripts/cdk/lib/construct/frontend.ts b/deploy/scripts/cdk/lib/construct/frontend.ts index cb9e7085c..e5aec96b6 100644 --- a/deploy/scripts/cdk/lib/construct/frontend.ts +++ b/deploy/scripts/cdk/lib/construct/frontend.ts @@ -59,7 +59,6 @@ export class FrontEndCluster extends Construct { portMappings: [ { name:frontendServiceName, - hostPort:80, containerPort: containerPort, protocol: ecs.Protocol.TCP, appProtocol:ecs.AppProtocol.http, From 94eecd1f5d1fb6854d9c62015b9c2d2dc6703f53 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 23 Nov 2023 09:52:29 +0900 Subject: [PATCH 072/203] remove npm update --- src/frontend/Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/src/frontend/Dockerfile b/src/frontend/Dockerfile index 6479c5580..0b33e09b8 100644 --- a/src/frontend/Dockerfile +++ b/src/frontend/Dockerfile @@ -23,5 +23,4 @@ RUN chmod +x set_proxy.sh && \ USER node RUN npm install --loglevel warn -RUN npm update CMD ["npm", "run", "dev:docker"] \ No newline at end of file From 8b295542f80783c453cc9d8a2aaa080b8086f162 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 23 Nov 2023 09:54:41 +0900 Subject: [PATCH 073/203] set window.host and alembic.ini --- src/backend/langflow/alembic.ini | 2 +- src/frontend/src/modals/formModal/index.tsx | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/backend/langflow/alembic.ini b/src/backend/langflow/alembic.ini index 379661422..cba482993 100644 --- a/src/backend/langflow/alembic.ini +++ b/src/backend/langflow/alembic.ini @@ -63,7 +63,7 @@ version_path_separator = os # Use os.pathsep. Default configuration used for ne # This is the path to the db in the root of the project. # When the user runs the Langflow the database url will # be set dinamically. -sqlalchemy.url = sqlite:///../../../langflow.db +# sqlalchemy.url = sqlite:///../../../langflow.db [post_write_hooks] diff --git a/src/frontend/src/modals/formModal/index.tsx b/src/frontend/src/modals/formModal/index.tsx index f6f7c214f..6c8a733ef 100644 --- a/src/frontend/src/modals/formModal/index.tsx +++ b/src/frontend/src/modals/formModal/index.tsx @@ -197,7 +197,8 @@ export default function FormModal({ const isSecureProtocol = window.location.protocol === "https:" || window.location.port === "443"; const webSocketProtocol = isSecureProtocol ? "wss" : "ws"; - const host = isDevelopment ? "localhost:7860" : window.location.host; + // const host = isDevelopment ? "localhost:7860" : window.location.host; + const host = window.location.host; const chatEndpoint = `/api/v1/chat/${chatId}`; return `${ From fb6645d34737ee02435d0e3cacca1784edc8cb48 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 23 Nov 2023 10:00:47 +0900 Subject: [PATCH 074/203] modify BACKEND_URL --- deploy/scripts/cdk/lib/construct/ecr.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/scripts/cdk/lib/construct/ecr.ts b/deploy/scripts/cdk/lib/construct/ecr.ts index 6e6db707b..96424b053 100644 --- a/deploy/scripts/cdk/lib/construct/ecr.ts +++ b/deploy/scripts/cdk/lib/construct/ecr.ts @@ -49,7 +49,7 @@ export class EcrRepository extends Construct { const dockerFrontEndImageAsset = new DockerImageAsset(this, "DockerFrontEndImageAsset", { directory: frontendPath, buildArgs:{ - "BACKEND_URL":`http://${props.cloudmapNamespace.namespaceName}:7860` + "BACKEND_URL":`http://backend.${props.cloudmapNamespace.namespaceName}:7860` }, exclude: excludeDir, platform: imagePlatform, From f1d7318de9cf14db878b11fdc723bca62d162e0f Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 23 Nov 2023 10:21:28 +0900 Subject: [PATCH 075/203] modify task memory and cpu --- deploy/scripts/cdk/lib/construct/backend.ts | 4 ++-- deploy/scripts/cdk/lib/construct/frontend.ts | 4 ++-- deploy/scripts/cdk/lib/construct/network.ts | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/deploy/scripts/cdk/lib/construct/backend.ts b/deploy/scripts/cdk/lib/construct/backend.ts index 62f56762a..f64a0f8fd 100644 --- a/deploy/scripts/cdk/lib/construct/backend.ts +++ b/deploy/scripts/cdk/lib/construct/backend.ts @@ -38,8 +38,8 @@ export class BackEndCluster extends Construct { this, 'BackEndTaskDef', { - memoryLimitMiB: 512, - cpu: 256, + memoryLimitMiB: 3072, + cpu: 512, executionRole: props.backendTaskExecutionRole, runtimePlatform:{ operatingSystemFamily: ecs.OperatingSystemFamily.LINUX, diff --git a/deploy/scripts/cdk/lib/construct/frontend.ts b/deploy/scripts/cdk/lib/construct/frontend.ts index e5aec96b6..6ac90e5f2 100644 --- a/deploy/scripts/cdk/lib/construct/frontend.ts +++ b/deploy/scripts/cdk/lib/construct/frontend.ts @@ -33,8 +33,8 @@ export class FrontEndCluster extends Construct { this, 'FrontendTaskDef', { - memoryLimitMiB: 512, - cpu: 256, + memoryLimitMiB: 3072, + cpu: 512, executionRole: props.frontendTaskExecutionRole, runtimePlatform:{ operatingSystemFamily: ecs.OperatingSystemFamily.LINUX, diff --git a/deploy/scripts/cdk/lib/construct/network.ts b/deploy/scripts/cdk/lib/construct/network.ts index 275fab545..9ce50adb3 100644 --- a/deploy/scripts/cdk/lib/construct/network.ts +++ b/deploy/scripts/cdk/lib/construct/network.ts @@ -56,10 +56,11 @@ export class Network extends Construct { ], natGateways: 1, }) - + // Cluster this.cluster = new ecs.Cluster(this, 'EcsCluster', { clusterName: 'langflow-cluster', vpc: this.vpc, + enableFargateCapacityProviders: true, }); // Private DNS From d4a356a47aa772bcca9265df0191a569f71d4c12 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 23 Nov 2023 10:34:55 +0900 Subject: [PATCH 076/203] modify cpu --- deploy/scripts/cdk/lib/construct/backend.ts | 2 +- deploy/scripts/cdk/lib/construct/frontend.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deploy/scripts/cdk/lib/construct/backend.ts b/deploy/scripts/cdk/lib/construct/backend.ts index f64a0f8fd..b22ba62a8 100644 --- a/deploy/scripts/cdk/lib/construct/backend.ts +++ b/deploy/scripts/cdk/lib/construct/backend.ts @@ -39,7 +39,7 @@ export class BackEndCluster extends Construct { 'BackEndTaskDef', { memoryLimitMiB: 3072, - cpu: 512, + cpu: 1024, executionRole: props.backendTaskExecutionRole, runtimePlatform:{ operatingSystemFamily: ecs.OperatingSystemFamily.LINUX, diff --git a/deploy/scripts/cdk/lib/construct/frontend.ts b/deploy/scripts/cdk/lib/construct/frontend.ts index 6ac90e5f2..8238ed135 100644 --- a/deploy/scripts/cdk/lib/construct/frontend.ts +++ b/deploy/scripts/cdk/lib/construct/frontend.ts @@ -34,7 +34,7 @@ export class FrontEndCluster extends Construct { 'FrontendTaskDef', { memoryLimitMiB: 3072, - cpu: 512, + cpu: 1024, executionRole: props.frontendTaskExecutionRole, runtimePlatform:{ operatingSystemFamily: ecs.OperatingSystemFamily.LINUX, From 70d613dbd91656b1ed55451e7047526139028535 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 23 Nov 2023 11:24:56 +0900 Subject: [PATCH 077/203] modify LANGFLOW_DATABASE_URL --- deploy/scripts/cdk/lib/construct/backend.ts | 6 +++--- src/backend/langflow/__main__.py | 11 ++++++----- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/deploy/scripts/cdk/lib/construct/backend.ts b/deploy/scripts/cdk/lib/construct/backend.ts index b22ba62a8..26100d711 100644 --- a/deploy/scripts/cdk/lib/construct/backend.ts +++ b/deploy/scripts/cdk/lib/construct/backend.ts @@ -57,9 +57,9 @@ export class BackEndCluster extends Construct { }), environment:{ // user:pass@endpoint:port/dbname - // "LANGFLOW_DATABASE_URL" : `mysql+pymysql://${ecs.Secret.fromSecretsManager(secretsDB, 'username')}:${ecs.Secret.fromSecretsManager(secretsDB, 'password')}@${ecs.Secret.fromSecretsManager(secretsDB, 'host')}:3306/${ecs.Secret.fromSecretsManager(secretsDB, 'dbname')}`, - "LANGFLOW_DATABASE_URL" : "sqlite:///./langflow.db", - "LANGFLOW_LANGCHAIN_CACHE" : "SQLiteCache", + // "LANGFLOW_DATABASE_URL" : `mysql+pymysql://${username}:${password}@${host}:3306/${dbname}`, + // "LANGFLOW_DATABASE_URL" : "sqlite:///./langflow.db", + // "LANGFLOW_LANGCHAIN_CACHE" : "SQLiteCache", "LANGFLOW_AUTO_LOGIN" : "false", "LANGFLOW_SUPERUSER" : "admin", "LANGFLOW_SUPERUSER_PASSWORD" : "1234567" diff --git a/src/backend/langflow/__main__.py b/src/backend/langflow/__main__.py index 1bdcf97f2..5665eb409 100644 --- a/src/backend/langflow/__main__.py +++ b/src/backend/langflow/__main__.py @@ -1,6 +1,7 @@ import platform import socket import sys +import os import time import webbrowser from pathlib import Path @@ -128,11 +129,11 @@ def run( dev: bool = typer.Option(False, help="Run in development mode (may contain bugs)"), # This variable does not work but is set by the .env file # and works with Pydantic - # database_url: str = typer.Option( - # None, - # help="Database URL to connect to. If not provided, a local SQLite database will be used.", - # envvar="LANGFLOW_DATABASE_URL", - # ), + database_url: str = typer.Option( + "mysql+pymysql://{}:{}@{}:3306/{}".format(os.environ["username"],os.environ["password"],os.environ["host"],os.environ["dbname"]), + help="Database URL to connect to. If not provided, a local SQLite database will be used.", + envvar="LANGFLOW_DATABASE_URL", + ), path: str = typer.Option( None, help="Path to the frontend directory containing build files. This is for development purposes only.", From 34eac25963ca22a1e8ce92f8feadc70b446f2508 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 23 Nov 2023 12:34:34 +0900 Subject: [PATCH 078/203] add: iam construct --- deploy/scripts/cdk/lib/cdk-stack.ts | 8 ++- deploy/scripts/cdk/lib/construct/backend.ts | 1 + deploy/scripts/cdk/lib/construct/iam.ts | 74 +++++++++++++++++++++ deploy/scripts/cdk/lib/construct/index.ts | 1 + deploy/scripts/cdk/lib/construct/network.ts | 67 ------------------- 5 files changed, 82 insertions(+), 69 deletions(-) create mode 100644 deploy/scripts/cdk/lib/construct/iam.ts diff --git a/deploy/scripts/cdk/lib/cdk-stack.ts b/deploy/scripts/cdk/lib/cdk-stack.ts index f83fcb0f5..b991827f8 100644 --- a/deploy/scripts/cdk/lib/cdk-stack.ts +++ b/deploy/scripts/cdk/lib/cdk-stack.ts @@ -2,7 +2,7 @@ import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; import * as ecs from 'aws-cdk-lib/aws-ecs' -import { Network, EcrRepository, FrontEndCluster, BackEndCluster, Rds } from './construct'; +import { Network, EcrRepository, FrontEndCluster, BackEndCluster, Rds, EcsIAM } from './construct'; // import * as sqs from 'aws-cdk-lib/aws-sqs'; export class LangflowAppStack extends cdk.Stack { @@ -12,7 +12,11 @@ export class LangflowAppStack extends cdk.Stack { const arch = ecs.CpuArchitecture.X86_64 // VPC - const { vpc, cluster, alb, targetGroup, cloudmapNamespace, ecsFrontSG, ecsBackSG, dbSG, albSG, backendTaskRole, TaskExecutionRole, frontendTaskRole, backendLogGroup, frontendLogGroup} = new Network(this, 'Network') + const { vpc, cluster, alb, targetGroup, cloudmapNamespace, ecsFrontSG, ecsBackSG, dbSG, albSG, backendLogGroup, frontendLogGroup} = new Network(this, 'Network') + + // IAM + const { backendTaskRole, TaskExecutionRole, frontendTaskRole } = new EcsIAM(this, 'EcsIAM') + // ECR const { ecrFrontEndRepository,ecrBackEndRepository} = new EcrRepository(this, 'Ecr', { cloudmapNamespace:cloudmapNamespace, diff --git a/deploy/scripts/cdk/lib/construct/backend.ts b/deploy/scripts/cdk/lib/construct/backend.ts index 26100d711..e39d1e210 100644 --- a/deploy/scripts/cdk/lib/construct/backend.ts +++ b/deploy/scripts/cdk/lib/construct/backend.ts @@ -95,6 +95,7 @@ export class BackEndCluster extends Construct { vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS }, }); + // Secrets ManagerからのSecret取得ロール const ecsBackEndExecutionRole = iam.Role.fromRoleArn( this, "ecsBackEndExecutionRole", diff --git a/deploy/scripts/cdk/lib/construct/iam.ts b/deploy/scripts/cdk/lib/construct/iam.ts new file mode 100644 index 000000000..001ed11ec --- /dev/null +++ b/deploy/scripts/cdk/lib/construct/iam.ts @@ -0,0 +1,74 @@ +import { RemovalPolicy, Duration } from 'aws-cdk-lib' +import { Construct } from 'constructs' +import { + aws_ec2 as ec2, + aws_ecs as ecs, + aws_iam as iam, + aws_logs as logs, +} from 'aws-cdk-lib'; + +export class EcsIAM extends Construct { + readonly backendTaskRole: iam.Role; + readonly TaskExecutionRole: iam.Role; + readonly frontendTaskRole: iam.Role; + + constructor(scope: Construct, id: string) { + super(scope, id) + + // Policy Statements + // ECS Policy State + const ECSExecPolicyStatement = new iam.PolicyStatement({ + sid: 'allowECSExec', + resources: ['*'], + actions: [ + 'ecr:GetAuthorizationToken', + 'ecr:BatchCheckLayerAvailability', + 'ecr:GetDownloadUrlForLayer', + 'ecr:BatchGetImage', + ], + }); + // Bedrock Policy State + const BedrockPolicyStatement = new iam.PolicyStatement({ + sid: 'allowBedrockAccess', + resources: ['*'], + actions: [ + 'bedrock:*', + ], + }); + // Kendra Policy State + const KendraPolicyStatement = new iam.PolicyStatement({ + sid: 'allowKendraAccess', + resources: ['*'], + actions: [ + 'kendra:*' + ], + }); + + // FrontEnd Task Role + this.frontendTaskRole = new iam.Role(this, 'FrontendTaskRole', { + assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), + }); + this.frontendTaskRole.addToPolicy(ECSExecPolicyStatement); + + // BackEnd Task Role + this.backendTaskRole = new iam.Role(this, 'BackendTaskRole', { + assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), + }); + // ECS Exec Policyの付与 + this.backendTaskRole.addToPolicy(ECSExecPolicyStatement); + // KendraとBedrockのアクセス権付与 + this.backendTaskRole.addToPolicy(KendraPolicyStatement); + this.backendTaskRole.addToPolicy(BedrockPolicyStatement); + + // Task ExecutionRole -> ここは共通 + this.TaskExecutionRole = new iam.Role(this, 'TaskExecutionRole', { + assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), + managedPolicies: [ + { + managedPolicyArn: + 'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy', + }, + ], + }); + } +} \ No newline at end of file diff --git a/deploy/scripts/cdk/lib/construct/index.ts b/deploy/scripts/cdk/lib/construct/index.ts index 8ca22911a..8c2efcb1b 100644 --- a/deploy/scripts/cdk/lib/construct/index.ts +++ b/deploy/scripts/cdk/lib/construct/index.ts @@ -1,5 +1,6 @@ export * from './db'; export * from './ecr'; +export * from './iam'; export * from './frontend'; export * from './backend'; export * from './network'; \ No newline at end of file diff --git a/deploy/scripts/cdk/lib/construct/network.ts b/deploy/scripts/cdk/lib/construct/network.ts index 9ce50adb3..aa9e48dc5 100644 --- a/deploy/scripts/cdk/lib/construct/network.ts +++ b/deploy/scripts/cdk/lib/construct/network.ts @@ -3,8 +3,6 @@ import { Construct } from 'constructs' import { aws_ec2 as ec2, aws_ecs as ecs, - aws_dynamodb as dynamodb, - aws_iam as iam, aws_logs as logs, aws_servicediscovery as servicediscovery, aws_elasticloadbalancingv2 as elb, @@ -20,9 +18,6 @@ export class Network extends Construct { readonly ecsBackSG: ec2.SecurityGroup; readonly dbSG: ec2.SecurityGroup; readonly albSG: ec2.SecurityGroup; - readonly backendTaskRole: iam.Role; - readonly TaskExecutionRole: iam.Role; - readonly frontendTaskRole: iam.Role; readonly backendLogGroup: logs.LogGroup; readonly frontendLogGroup: logs.LogGroup; @@ -129,68 +124,6 @@ export class Network extends Construct { }) // AppRunnerSecurityGroupからのポート3306:mysql(5432:postgres)のインバウンドを許可 this.dbSG.addIngressRule(this.ecsBackSG, ec2.Port.tcp(3306)) - - // ECS Policy State - const ECSExecPolicyStatement = new iam.PolicyStatement({ - sid: 'allowECSExec', - resources: ['*'], - actions: [ - 'ecr:GetAuthorizationToken', - 'ecr:BatchCheckLayerAvailability', - 'ecr:GetDownloadUrlForLayer', - 'ecr:BatchGetImage', - 'ssmmessages:CreateControlChannel', - 'ssmmessages:CreateDataChannel', - 'ssmmessages:OpenControlChannel', - 'ssmmessages:OpenDataChannel', - 'logs:CreateLogStream', - 'logs:DescribeLogGroups', - 'logs:DescribeLogStreams', - 'logs:PutLogEvents', - ], - }); - // Bedrock roll - const BedrockPolicyStatement = new iam.PolicyStatement({ - sid: 'allowBedrockAccess', - resources: ['*'], - actions: [ - 'bedrock:*', - ], - }); - // Kendra roll - const KendraPolicyStatement = new iam.PolicyStatement({ - sid: 'allowKendraAccess', - resources: ['*'], - actions: [ - 'kendra:*' - ], - }); - - this.backendTaskRole = new iam.Role(this, 'BackendTaskRole', { - assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), - }); - // ECS Exec Policyの付与 - this.backendTaskRole.addToPolicy(ECSExecPolicyStatement); - // KendraとBedrockのアクセス権付与 - this.backendTaskRole.addToPolicy(KendraPolicyStatement); - this.backendTaskRole.addToPolicy(BedrockPolicyStatement); - - - - this.frontendTaskRole = new iam.Role(this, 'FrontendTaskRole', { - assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), - }); - this.frontendTaskRole.addToPolicy(ECSExecPolicyStatement); - - this.TaskExecutionRole = new iam.Role(this, 'TaskExecutionRole', { - assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), - managedPolicies: [ - { - managedPolicyArn: - 'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy', - }, - ], - }); // Create CloudWatch Log Group this.backendLogGroup = new logs.LogGroup(this, 'backendLogGroup', { From c97f861ea4536fbb05f5eb2e9aedc35cf32727e0 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 23 Nov 2023 12:45:45 +0900 Subject: [PATCH 079/203] add: iam construct --- deploy/scripts/cdk/lib/cdk-stack.ts | 12 +++--- deploy/scripts/cdk/lib/construct/backend.ts | 14 ------- deploy/scripts/cdk/lib/construct/iam.ts | 45 ++++++++++++++++----- 3 files changed, 42 insertions(+), 29 deletions(-) diff --git a/deploy/scripts/cdk/lib/cdk-stack.ts b/deploy/scripts/cdk/lib/cdk-stack.ts index b991827f8..3ef9abd23 100644 --- a/deploy/scripts/cdk/lib/cdk-stack.ts +++ b/deploy/scripts/cdk/lib/cdk-stack.ts @@ -13,9 +13,6 @@ export class LangflowAppStack extends cdk.Stack { // VPC const { vpc, cluster, alb, targetGroup, cloudmapNamespace, ecsFrontSG, ecsBackSG, dbSG, albSG, backendLogGroup, frontendLogGroup} = new Network(this, 'Network') - - // IAM - const { backendTaskRole, TaskExecutionRole, frontendTaskRole } = new EcsIAM(this, 'EcsIAM') // ECR const { ecrFrontEndRepository,ecrBackEndRepository} = new EcrRepository(this, 'Ecr', { @@ -27,12 +24,17 @@ export class LangflowAppStack extends cdk.Stack { // VPCとSGのリソース情報をPropsとして引き渡す const { rdsCluster } = new Rds(this, 'Rds', { vpc, dbSG }) + // IAM + const { frontendTaskRole, frontendTaskExecutionRole, backendTaskRole, backendTaskExecutionRole } = new EcsIAM(this, 'EcsIAM',{ + rdsCluster:rdsCluster + }) + const backendService = new BackEndCluster(this, 'backend', { cluster:cluster, ecsBackSG:ecsBackSG, ecrBackEndRepository:ecrBackEndRepository, backendTaskRole:backendTaskRole, - backendTaskExecutionRole:TaskExecutionRole, + backendTaskExecutionRole:backendTaskExecutionRole, backendLogGroup:backendLogGroup, cloudmapNamespace:cloudmapNamespace, rdsCluster:rdsCluster, @@ -47,7 +49,7 @@ export class LangflowAppStack extends cdk.Stack { targetGroup: targetGroup, backendServiceName: backendService.backendServiceName, frontendTaskRole: frontendTaskRole, - frontendTaskExecutionRole: TaskExecutionRole, + frontendTaskExecutionRole: frontendTaskExecutionRole, frontendLogGroup: frontendLogGroup, cloudmapNamespace: cloudmapNamespace, arch:arch diff --git a/deploy/scripts/cdk/lib/construct/backend.ts b/deploy/scripts/cdk/lib/construct/backend.ts index e39d1e210..7863f0d3d 100644 --- a/deploy/scripts/cdk/lib/construct/backend.ts +++ b/deploy/scripts/cdk/lib/construct/backend.ts @@ -95,19 +95,5 @@ export class BackEndCluster extends Construct { vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS }, }); - // Secrets ManagerからのSecret取得ロール - const ecsBackEndExecutionRole = iam.Role.fromRoleArn( - this, - "ecsBackEndExecutionRole", - backendService.taskDefinition.executionRole!.roleArn, - {} - ); - ecsBackEndExecutionRole.attachInlinePolicy(new iam.Policy(this, 'SMGetPolicy', { - statements: [new iam.PolicyStatement({ - actions: ['secretsmanager:GetSecretValue'], - resources: [secretsDB.secretArn], - })], - })); - } } \ No newline at end of file diff --git a/deploy/scripts/cdk/lib/construct/iam.ts b/deploy/scripts/cdk/lib/construct/iam.ts index 001ed11ec..6ee20051b 100644 --- a/deploy/scripts/cdk/lib/construct/iam.ts +++ b/deploy/scripts/cdk/lib/construct/iam.ts @@ -1,18 +1,22 @@ import { RemovalPolicy, Duration } from 'aws-cdk-lib' import { Construct } from 'constructs' +import { Props } from '../../cdk.out/asset.a565eb91ccb4c3ed87fd8f7d890173b077c2d2aa3a9837e3e4ecc8349b6a3483/src/frontend/src/types/components/index'; import { - aws_ec2 as ec2, - aws_ecs as ecs, + aws_rds as rds, aws_iam as iam, - aws_logs as logs, } from 'aws-cdk-lib'; -export class EcsIAM extends Construct { - readonly backendTaskRole: iam.Role; - readonly TaskExecutionRole: iam.Role; - readonly frontendTaskRole: iam.Role; +interface IAMProps { + rdsCluster:rds.DatabaseCluster +} - constructor(scope: Construct, id: string) { +export class EcsIAM extends Construct { + readonly frontendTaskRole: iam.Role; + readonly frontendTaskExecutionRole: iam.Role; + readonly backendTaskRole: iam.Role; + readonly backendTaskExecutionRole: iam.Role; + + constructor(scope: Construct, id: string, props:IAMProps) { super(scope, id) // Policy Statements @@ -60,8 +64,8 @@ export class EcsIAM extends Construct { this.backendTaskRole.addToPolicy(KendraPolicyStatement); this.backendTaskRole.addToPolicy(BedrockPolicyStatement); - // Task ExecutionRole -> ここは共通 - this.TaskExecutionRole = new iam.Role(this, 'TaskExecutionRole', { + // FrontEnd Task ExecutionRole + this.frontendTaskExecutionRole = new iam.Role(this, 'TaskExecutionRole', { assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), managedPolicies: [ { @@ -70,5 +74,26 @@ export class EcsIAM extends Construct { }, ], }); + + // Secrets ManagerからDB認証情報を取ってくる + const secretsDB = props.rdsCluster.secret!; + + // BackEnd Task ExecutionRole + this.backendTaskExecutionRole = new iam.Role(this, 'TaskExecutionRole', { + assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), + managedPolicies: [ + { + managedPolicyArn: + 'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy', + }, + ], + }); + + this.backendTaskExecutionRole.attachInlinePolicy(new iam.Policy(this, 'SMGetPolicy', { + statements: [new iam.PolicyStatement({ + actions: ['secretsmanager:GetSecretValue'], + resources: [secretsDB.secretArn], + })], + })); } } \ No newline at end of file From 33627c0354b1294ddf8cdf72355e682283309ae0 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 23 Nov 2023 12:49:08 +0900 Subject: [PATCH 080/203] add: iam construct --- deploy/scripts/cdk/lib/construct/iam.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/deploy/scripts/cdk/lib/construct/iam.ts b/deploy/scripts/cdk/lib/construct/iam.ts index 6ee20051b..8c90341ea 100644 --- a/deploy/scripts/cdk/lib/construct/iam.ts +++ b/deploy/scripts/cdk/lib/construct/iam.ts @@ -1,6 +1,5 @@ import { RemovalPolicy, Duration } from 'aws-cdk-lib' import { Construct } from 'constructs' -import { Props } from '../../cdk.out/asset.a565eb91ccb4c3ed87fd8f7d890173b077c2d2aa3a9837e3e4ecc8349b6a3483/src/frontend/src/types/components/index'; import { aws_rds as rds, aws_iam as iam, From 167ff52228229c3dbd486cb2bf97f381c8d277ee Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 23 Nov 2023 12:53:26 +0900 Subject: [PATCH 081/203] add: iam construct --- deploy/scripts/cdk/lib/construct/iam.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deploy/scripts/cdk/lib/construct/iam.ts b/deploy/scripts/cdk/lib/construct/iam.ts index 8c90341ea..07d046232 100644 --- a/deploy/scripts/cdk/lib/construct/iam.ts +++ b/deploy/scripts/cdk/lib/construct/iam.ts @@ -64,7 +64,7 @@ export class EcsIAM extends Construct { this.backendTaskRole.addToPolicy(BedrockPolicyStatement); // FrontEnd Task ExecutionRole - this.frontendTaskExecutionRole = new iam.Role(this, 'TaskExecutionRole', { + this.frontendTaskExecutionRole = new iam.Role(this, 'frontendTaskExecutionRole', { assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), managedPolicies: [ { @@ -78,7 +78,7 @@ export class EcsIAM extends Construct { const secretsDB = props.rdsCluster.secret!; // BackEnd Task ExecutionRole - this.backendTaskExecutionRole = new iam.Role(this, 'TaskExecutionRole', { + this.backendTaskExecutionRole = new iam.Role(this, 'backendTaskExecutionRole', { assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), managedPolicies: [ { From 7bf37cf4474eb2dbe528287d88c8ee53f1e74384 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Fri, 24 Nov 2023 19:14:37 +0900 Subject: [PATCH 082/203] add RAG policy to TaskExeRole --- deploy/scripts/cdk/lib/construct/iam.ts | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/deploy/scripts/cdk/lib/construct/iam.ts b/deploy/scripts/cdk/lib/construct/iam.ts index 07d046232..0a40cf340 100644 --- a/deploy/scripts/cdk/lib/construct/iam.ts +++ b/deploy/scripts/cdk/lib/construct/iam.ts @@ -46,6 +46,17 @@ export class EcsIAM extends Construct { 'kendra:*' ], }); + // Create Rag Policy + const RagAccessPolicy = new iam.Policy(this, 'RAGFullAccess', { + statements: [KendraPolicyStatement,BedrockPolicyStatement], + }) + // Secrets ManagerからDB認証情報を取ってくるためのPolicy + const SecretsManagerPolicy = new iam.Policy(this, 'SMGetPolicy', { + statements: [new iam.PolicyStatement({ + actions: ['secretsmanager:GetSecretValue'], + resources: [props.rdsCluster.secret!.secretArn], + })], + }) // FrontEnd Task Role this.frontendTaskRole = new iam.Role(this, 'FrontendTaskRole', { @@ -60,8 +71,7 @@ export class EcsIAM extends Construct { // ECS Exec Policyの付与 this.backendTaskRole.addToPolicy(ECSExecPolicyStatement); // KendraとBedrockのアクセス権付与 - this.backendTaskRole.addToPolicy(KendraPolicyStatement); - this.backendTaskRole.addToPolicy(BedrockPolicyStatement); + this.backendTaskRole.attachInlinePolicy(RagAccessPolicy); // FrontEnd Task ExecutionRole this.frontendTaskExecutionRole = new iam.Role(this, 'frontendTaskExecutionRole', { @@ -74,9 +84,6 @@ export class EcsIAM extends Construct { ], }); - // Secrets ManagerからDB認証情報を取ってくる - const secretsDB = props.rdsCluster.secret!; - // BackEnd Task ExecutionRole this.backendTaskExecutionRole = new iam.Role(this, 'backendTaskExecutionRole', { assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), @@ -88,11 +95,7 @@ export class EcsIAM extends Construct { ], }); - this.backendTaskExecutionRole.attachInlinePolicy(new iam.Policy(this, 'SMGetPolicy', { - statements: [new iam.PolicyStatement({ - actions: ['secretsmanager:GetSecretValue'], - resources: [secretsDB.secretArn], - })], - })); + this.backendTaskExecutionRole.attachInlinePolicy(SecretsManagerPolicy); + this.backendTaskExecutionRole.attachInlinePolicy(RagAccessPolicy); } } \ No newline at end of file From 64ecaf6368b187c3408d63d7f4804f09e82c9d66 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Mon, 27 Nov 2023 00:06:26 +0900 Subject: [PATCH 083/203] modify: set_database_url --- src/backend/langflow/__main__.py | 14 +++---- .../langflow/services/settings/base.py | 38 ++++++++++--------- src/backend/langflow/settings.py | 6 ++- 3 files changed, 31 insertions(+), 27 deletions(-) diff --git a/src/backend/langflow/__main__.py b/src/backend/langflow/__main__.py index 5665eb409..87052677e 100644 --- a/src/backend/langflow/__main__.py +++ b/src/backend/langflow/__main__.py @@ -127,13 +127,13 @@ def run( default=None, ), dev: bool = typer.Option(False, help="Run in development mode (may contain bugs)"), - # This variable does not work but is set by the .env file - # and works with Pydantic - database_url: str = typer.Option( - "mysql+pymysql://{}:{}@{}:3306/{}".format(os.environ["username"],os.environ["password"],os.environ["host"],os.environ["dbname"]), - help="Database URL to connect to. If not provided, a local SQLite database will be used.", - envvar="LANGFLOW_DATABASE_URL", - ), + # # This variable does not work but is set by the .env file + # # and works with Pydantic + # database_url: str = typer.Option( + # "mysql+pymysql://{}:{}@{}:3306/{}".format(os.environ["username"],os.environ["password"],os.environ["host"],os.environ["dbname"]), + # help="Database URL to connect to. If not provided, a local SQLite database will be used.", + # envvar="LANGFLOW_DATABASE_URL", + # ), path: str = typer.Option( None, help="Path to the frontend directory containing build files. This is for development purposes only.", diff --git a/src/backend/langflow/services/settings/base.py b/src/backend/langflow/services/settings/base.py index 053c45afd..1f30aa3e0 100644 --- a/src/backend/langflow/services/settings/base.py +++ b/src/backend/langflow/services/settings/base.py @@ -86,29 +86,31 @@ class Settings(BaseSettings): value = langflow_database_url logger.debug("Using LANGFLOW_DATABASE_URL env variable.") else: - logger.debug("No DATABASE_URL env variable, using sqlite database") + # logger.debug("No DATABASE_URL env variable, using sqlite database") + logger.debug("No DATABASE_URL env variable, using custom database from secrets of {}".format(os.environ["host"])) # Originally, we used sqlite:///./langflow.db # so we need to migrate to the new format # if there is a database in that location - if not values["CONFIG_DIR"]: - raise ValueError( - "CONFIG_DIR not set, please set it or provide a DATABASE_URL" - ) + # if not values["CONFIG_DIR"]: + # raise ValueError( + # "CONFIG_DIR not set, please set it or provide a DATABASE_URL" + # ) - new_path = f"{values['CONFIG_DIR']}/langflow.db" - if Path("./langflow.db").exists(): - if Path(new_path).exists(): - logger.debug(f"Database already exists at {new_path}, using it") - else: - try: - logger.debug("Copying existing database to new location") - copy2("./langflow.db", new_path) - logger.debug(f"Copied existing database to {new_path}") - except Exception: - logger.error("Failed to copy database, using default path") - new_path = "./langflow.db" + # new_path = f"{values['CONFIG_DIR']}/langflow.db" + # if Path("./langflow.db").exists(): + # if Path(new_path).exists(): + # logger.debug(f"Database already exists at {new_path}, using it") + # else: + # try: + # logger.debug("Copying existing database to new location") + # copy2("./langflow.db", new_path) + # logger.debug(f"Copied existing database to {new_path}") + # except Exception: + # logger.error("Failed to copy database, using default path") + # new_path = "./langflow.db" - value = f"sqlite:///{new_path}" + # value = f"sqlite:///{new_path}" + value = "mysql+pymysql://{}:{}@{}:3306/{}".format(os.environ["username"],os.environ["password"],os.environ["host"],os.environ["dbname"]) return value diff --git a/src/backend/langflow/settings.py b/src/backend/langflow/settings.py index 6b6e81baf..ab9217d2c 100644 --- a/src/backend/langflow/settings.py +++ b/src/backend/langflow/settings.py @@ -46,8 +46,10 @@ class Settings(BaseSettings): value = langflow_database_url logger.debug("Using LANGFLOW_DATABASE_URL env variable.") else: - logger.debug("No DATABASE_URL env variable, using sqlite database") - value = "sqlite:///./langflow.db" + # logger.debug("No DATABASE_URL env variable, using sqlite database") + logger.debug("No DATABASE_URL env variable, using custom database from secrets of {}".format(os.environ["host"])) + # value = "sqlite:///./langflow.db" + value = "mysql+pymysql://{}:{}@{}:3306/{}".format(os.environ["username"],os.environ["password"],os.environ["host"],os.environ["dbname"]) return value From 40111093936917624f987001b62f7f7ef6e1fc70 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Mon, 27 Nov 2023 19:48:41 +0900 Subject: [PATCH 084/203] modified: add Dependency --- deploy/scripts/cdk/lib/cdk-stack.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/deploy/scripts/cdk/lib/cdk-stack.ts b/deploy/scripts/cdk/lib/cdk-stack.ts index 3ef9abd23..8b637cfcf 100644 --- a/deploy/scripts/cdk/lib/cdk-stack.ts +++ b/deploy/scripts/cdk/lib/cdk-stack.ts @@ -41,8 +41,9 @@ export class LangflowAppStack extends cdk.Stack { alb:alb, arch:arch }) + backendService.node.addDependency(rdsCluster); - new FrontEndCluster(this, 'frontend',{ + const frontendService = new FrontEndCluster(this, 'frontend',{ cluster:cluster, ecsFrontSG:ecsFrontSG, ecrFrontEndRepository:ecrFrontEndRepository, @@ -54,6 +55,8 @@ export class LangflowAppStack extends cdk.Stack { cloudmapNamespace: cloudmapNamespace, arch:arch }) + frontendService.node.addDependency(backendService); + // S3+CloudFront // new Web(this,'Cloudfront-S3') From 57c7f679873b5f22e9fa4ffc40f0c794c9e68733 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Wed, 29 Nov 2023 02:16:46 +0000 Subject: [PATCH 085/203] use env file --- deploy/scripts/cdk/.env.example | 3 +++ deploy/scripts/cdk/lib/construct/backend.ts | 16 +++++++++++++--- deploy/scripts/cdk/package-lock.json | 2 +- deploy/scripts/cdk/package.json | 2 +- 4 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 deploy/scripts/cdk/.env.example diff --git a/deploy/scripts/cdk/.env.example b/deploy/scripts/cdk/.env.example new file mode 100644 index 000000000..6ff0702f4 --- /dev/null +++ b/deploy/scripts/cdk/.env.example @@ -0,0 +1,3 @@ +LANGFLOW_AUTO_LOGIN=false +LANGFLOW_SUPERUSER=langflow +LANGFLOW_SUPERUSER_PASSWORD=654321 \ No newline at end of file diff --git a/deploy/scripts/cdk/lib/construct/backend.ts b/deploy/scripts/cdk/lib/construct/backend.ts index 7863f0d3d..4ddff1e00 100644 --- a/deploy/scripts/cdk/lib/construct/backend.ts +++ b/deploy/scripts/cdk/lib/construct/backend.ts @@ -10,6 +10,13 @@ import { aws_logs as logs, aws_elasticloadbalancingv2 as elb, } from 'aws-cdk-lib'; +import * as dotenv from 'dotenv'; +const path = require('path'); +dotenv.config({path: path.join(__dirname, "../../.env")}); + +console.log(process.env.LANGFLOW_AUTO_LOGIN); +console.log(process.env.LANGFLOW_SUPERUSER); +console.log(process.env.LANGFLOW_SUPERUSER_PASSWORD); interface BackEndProps { cluster: ecs.Cluster @@ -60,9 +67,12 @@ export class BackEndCluster extends Construct { // "LANGFLOW_DATABASE_URL" : `mysql+pymysql://${username}:${password}@${host}:3306/${dbname}`, // "LANGFLOW_DATABASE_URL" : "sqlite:///./langflow.db", // "LANGFLOW_LANGCHAIN_CACHE" : "SQLiteCache", - "LANGFLOW_AUTO_LOGIN" : "false", - "LANGFLOW_SUPERUSER" : "admin", - "LANGFLOW_SUPERUSER_PASSWORD" : "1234567" + // "LANGFLOW_AUTO_LOGIN" : "false", + // "LANGFLOW_SUPERUSER" : "admin", + // "LANGFLOW_SUPERUSER_PASSWORD" : "1234567" + "LANGFLOW_AUTO_LOGIN" : process.env.LANGFLOW_AUTO_LOGIN ?? 'false', + "LANGFLOW_SUPERUSER" : process.env.LANGFLOW_SUPERUSER ?? "admin", + "LANGFLOW_SUPERUSER_PASSWORD" : process.env.LANGFLOW_SUPERUSER_PASSWORD ?? "123456" }, portMappings: [ { diff --git a/deploy/scripts/cdk/package-lock.json b/deploy/scripts/cdk/package-lock.json index 3c19966e2..e5b70161b 100644 --- a/deploy/scripts/cdk/package-lock.json +++ b/deploy/scripts/cdk/package-lock.json @@ -8,7 +8,7 @@ "name": "cdk", "version": "0.1.0", "dependencies": { - "aws-cdk-lib": "2.86.0", + "aws-cdk-lib": "^2.86.0", "cdk-ecr-deployment": "^2.5.30", "constructs": "^10.0.0", "source-map-support": "^0.5.21" diff --git a/deploy/scripts/cdk/package.json b/deploy/scripts/cdk/package.json index c6643368b..05ef554d9 100644 --- a/deploy/scripts/cdk/package.json +++ b/deploy/scripts/cdk/package.json @@ -20,7 +20,7 @@ "typescript": "~5.1.3" }, "dependencies": { - "aws-cdk-lib": "2.86.0", + "aws-cdk-lib": "^2.86.0", "cdk-ecr-deployment": "^2.5.30", "constructs": "^10.0.0", "source-map-support": "^0.5.21" From ce19ee5bcd2b5b6a7597852a2dde70825d68ccdc Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 30 Nov 2023 16:31:13 +0900 Subject: [PATCH 086/203] move cdk folder to scripts/cdk --- deploy/scripts/cdk/.env.example | 3 - deploy/scripts/cdk/.gitignore | 9 - deploy/scripts/cdk/.npmignore | 6 - deploy/scripts/cdk/README.md | 14 - deploy/scripts/cdk/bin/cdk.ts | 21 - deploy/scripts/cdk/cdk.json | 55 - deploy/scripts/cdk/delete-docker-images.sh | 3 - deploy/scripts/cdk/delete-ecr.sh | 4 - deploy/scripts/cdk/jest.config.js | 8 - deploy/scripts/cdk/lib/cdk-stack.ts | 64 - deploy/scripts/cdk/lib/construct/backend.ts | 109 - deploy/scripts/cdk/lib/construct/db.ts | 64 - deploy/scripts/cdk/lib/construct/ecr.ts | 76 - deploy/scripts/cdk/lib/construct/frontend.ts | 117 - deploy/scripts/cdk/lib/construct/iam.ts | 101 - deploy/scripts/cdk/lib/construct/index.ts | 6 - deploy/scripts/cdk/lib/construct/network.ts | 139 - deploy/scripts/cdk/package-lock.json | 4601 ------------------ deploy/scripts/cdk/package.json | 28 - deploy/scripts/cdk/test/cdk.test.ts | 17 - 20 files changed, 5445 deletions(-) delete mode 100644 deploy/scripts/cdk/.env.example delete mode 100644 deploy/scripts/cdk/.gitignore delete mode 100644 deploy/scripts/cdk/.npmignore delete mode 100644 deploy/scripts/cdk/README.md delete mode 100644 deploy/scripts/cdk/bin/cdk.ts delete mode 100644 deploy/scripts/cdk/cdk.json delete mode 100644 deploy/scripts/cdk/delete-docker-images.sh delete mode 100644 deploy/scripts/cdk/delete-ecr.sh delete mode 100644 deploy/scripts/cdk/jest.config.js delete mode 100644 deploy/scripts/cdk/lib/cdk-stack.ts delete mode 100644 deploy/scripts/cdk/lib/construct/backend.ts delete mode 100644 deploy/scripts/cdk/lib/construct/db.ts delete mode 100644 deploy/scripts/cdk/lib/construct/ecr.ts delete mode 100644 deploy/scripts/cdk/lib/construct/frontend.ts delete mode 100644 deploy/scripts/cdk/lib/construct/iam.ts delete mode 100644 deploy/scripts/cdk/lib/construct/index.ts delete mode 100644 deploy/scripts/cdk/lib/construct/network.ts delete mode 100644 deploy/scripts/cdk/package-lock.json delete mode 100644 deploy/scripts/cdk/package.json delete mode 100644 deploy/scripts/cdk/test/cdk.test.ts diff --git a/deploy/scripts/cdk/.env.example b/deploy/scripts/cdk/.env.example deleted file mode 100644 index 6ff0702f4..000000000 --- a/deploy/scripts/cdk/.env.example +++ /dev/null @@ -1,3 +0,0 @@ -LANGFLOW_AUTO_LOGIN=false -LANGFLOW_SUPERUSER=langflow -LANGFLOW_SUPERUSER_PASSWORD=654321 \ No newline at end of file diff --git a/deploy/scripts/cdk/.gitignore b/deploy/scripts/cdk/.gitignore deleted file mode 100644 index 1a7a1528b..000000000 --- a/deploy/scripts/cdk/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -*.js -!jest.config.js -*.d.ts -node_modules - -# CDK asset staging directory -.cdk.staging -cdk.out -!/lib diff --git a/deploy/scripts/cdk/.npmignore b/deploy/scripts/cdk/.npmignore deleted file mode 100644 index c1d6d45dc..000000000 --- a/deploy/scripts/cdk/.npmignore +++ /dev/null @@ -1,6 +0,0 @@ -*.ts -!*.d.ts - -# CDK asset staging directory -.cdk.staging -cdk.out diff --git a/deploy/scripts/cdk/README.md b/deploy/scripts/cdk/README.md deleted file mode 100644 index 320efc02a..000000000 --- a/deploy/scripts/cdk/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# Welcome to your CDK TypeScript project - -This is a blank project for CDK development with TypeScript. - -The `cdk.json` file tells the CDK Toolkit how to execute your app. - -## Useful commands - -* `npm run build` compile typescript to js -* `npm run watch` watch for changes and compile -* `npm run test` perform the jest unit tests -* `cdk deploy` deploy this stack to your default AWS account/region -* `cdk diff` compare deployed stack with current state -* `cdk synth` emits the synthesized CloudFormation template diff --git a/deploy/scripts/cdk/bin/cdk.ts b/deploy/scripts/cdk/bin/cdk.ts deleted file mode 100644 index c680f3e98..000000000 --- a/deploy/scripts/cdk/bin/cdk.ts +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env node -import 'source-map-support/register'; -import * as cdk from 'aws-cdk-lib'; -import { LangflowAppStack } from '../lib/cdk-stack'; - -const app = new cdk.App(); -new LangflowAppStack(app, 'LangflowAppStack', { - /* If you don't specify 'env', this stack will be environment-agnostic. - * Account/Region-dependent features and context lookups will not work, - * but a single synthesized template can be deployed anywhere. */ - - /* Uncomment the next line to specialize this stack for the AWS Account - * and Region that are implied by the current CLI configuration. */ - // env: { account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEFAULT_REGION }, - - /* Uncomment the next line if you know exactly what Account and Region you - * want to deploy the stack to. */ - // env: { account: '123456789012', region: 'us-east-1' }, - - /* For more information, see https://docs.aws.amazon.com/cdk/latest/guide/environments.html */ -}); \ No newline at end of file diff --git a/deploy/scripts/cdk/cdk.json b/deploy/scripts/cdk/cdk.json deleted file mode 100644 index dc8ab711a..000000000 --- a/deploy/scripts/cdk/cdk.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "app": "npx ts-node --prefer-ts-exts bin/cdk.ts", - "watch": { - "include": [ - "**" - ], - "exclude": [ - "README.md", - "cdk*.json", - "**/*.d.ts", - "**/*.js", - "tsconfig.json", - "package*.json", - "yarn.lock", - "node_modules", - "test" - ] - }, - "context": { - "@aws-cdk/aws-lambda:recognizeLayerVersion": true, - "@aws-cdk/core:checkSecretUsage": true, - "@aws-cdk/core:target-partitions": [ - "aws", - "aws-cn" - ], - "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true, - "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true, - "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": true, - "@aws-cdk/aws-iam:minimizePolicies": true, - "@aws-cdk/core:validateSnapshotRemovalPolicy": true, - "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": true, - "@aws-cdk/aws-s3:createDefaultLoggingPolicy": true, - "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": true, - "@aws-cdk/aws-apigateway:disableCloudWatchRole": true, - "@aws-cdk/core:enablePartitionLiterals": true, - "@aws-cdk/aws-events:eventsTargetQueueSameAccount": true, - "@aws-cdk/aws-iam:standardizedServicePrincipals": true, - "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true, - "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": true, - "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": true, - "@aws-cdk/aws-route53-patters:useCertificate": true, - "@aws-cdk/customresources:installLatestAwsSdkDefault": false, - "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": true, - "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": true, - "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": true, - "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": true, - "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": true, - "@aws-cdk/aws-redshift:columnId": true, - "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": true, - "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": true, - "@aws-cdk/aws-apigateway:requestValidatorUniqueId": true, - "@aws-cdk/aws-kms:aliasNameRef": true, - "@aws-cdk/core:includePrefixInUniqueNameGeneration": true - } -} diff --git a/deploy/scripts/cdk/delete-docker-images.sh b/deploy/scripts/cdk/delete-docker-images.sh deleted file mode 100644 index 1e1595008..000000000 --- a/deploy/scripts/cdk/delete-docker-images.sh +++ /dev/null @@ -1,3 +0,0 @@ -docker stop $(docker ps -aq) -docker rm $(docker ps -aq) -docker rmi -f $(docker images -aq) \ No newline at end of file diff --git a/deploy/scripts/cdk/delete-ecr.sh b/deploy/scripts/cdk/delete-ecr.sh deleted file mode 100644 index ebe837a8a..000000000 --- a/deploy/scripts/cdk/delete-ecr.sh +++ /dev/null @@ -1,4 +0,0 @@ -# aws cloudformation delete-stack --stack-name LangflowAppStack -# aws ecr delete-repository --repository-name langflow-backend-repository --force -# aws ecr delete-repository --repository-name langflow-frontend-repository --force -# aws ecr describe-repositories --output json | jq -re ".repositories[].repositoryName" \ No newline at end of file diff --git a/deploy/scripts/cdk/jest.config.js b/deploy/scripts/cdk/jest.config.js deleted file mode 100644 index 08263b895..000000000 --- a/deploy/scripts/cdk/jest.config.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = { - testEnvironment: 'node', - roots: ['/test'], - testMatch: ['**/*.test.ts'], - transform: { - '^.+\\.tsx?$': 'ts-jest' - } -}; diff --git a/deploy/scripts/cdk/lib/cdk-stack.ts b/deploy/scripts/cdk/lib/cdk-stack.ts deleted file mode 100644 index 8b637cfcf..000000000 --- a/deploy/scripts/cdk/lib/cdk-stack.ts +++ /dev/null @@ -1,64 +0,0 @@ -import * as cdk from 'aws-cdk-lib'; -import { Construct } from 'constructs'; -import * as ecs from 'aws-cdk-lib/aws-ecs' - -import { Network, EcrRepository, FrontEndCluster, BackEndCluster, Rds, EcsIAM } from './construct'; -// import * as sqs from 'aws-cdk-lib/aws-sqs'; - -export class LangflowAppStack extends cdk.Stack { - constructor(scope: Construct, id: string, props?: cdk.StackProps) { - super(scope, id, props); - // Arch - const arch = ecs.CpuArchitecture.X86_64 - - // VPC - const { vpc, cluster, alb, targetGroup, cloudmapNamespace, ecsFrontSG, ecsBackSG, dbSG, albSG, backendLogGroup, frontendLogGroup} = new Network(this, 'Network') - - // ECR - const { ecrFrontEndRepository,ecrBackEndRepository} = new EcrRepository(this, 'Ecr', { - cloudmapNamespace:cloudmapNamespace, - arch:arch - }) - - // RDS - // VPCとSGのリソース情報をPropsとして引き渡す - const { rdsCluster } = new Rds(this, 'Rds', { vpc, dbSG }) - - // IAM - const { frontendTaskRole, frontendTaskExecutionRole, backendTaskRole, backendTaskExecutionRole } = new EcsIAM(this, 'EcsIAM',{ - rdsCluster:rdsCluster - }) - - const backendService = new BackEndCluster(this, 'backend', { - cluster:cluster, - ecsBackSG:ecsBackSG, - ecrBackEndRepository:ecrBackEndRepository, - backendTaskRole:backendTaskRole, - backendTaskExecutionRole:backendTaskExecutionRole, - backendLogGroup:backendLogGroup, - cloudmapNamespace:cloudmapNamespace, - rdsCluster:rdsCluster, - alb:alb, - arch:arch - }) - backendService.node.addDependency(rdsCluster); - - const frontendService = new FrontEndCluster(this, 'frontend',{ - cluster:cluster, - ecsFrontSG:ecsFrontSG, - ecrFrontEndRepository:ecrFrontEndRepository, - targetGroup: targetGroup, - backendServiceName: backendService.backendServiceName, - frontendTaskRole: frontendTaskRole, - frontendTaskExecutionRole: frontendTaskExecutionRole, - frontendLogGroup: frontendLogGroup, - cloudmapNamespace: cloudmapNamespace, - arch:arch - }) - frontendService.node.addDependency(backendService); - - - // S3+CloudFront - // new Web(this,'Cloudfront-S3') - } -} diff --git a/deploy/scripts/cdk/lib/construct/backend.ts b/deploy/scripts/cdk/lib/construct/backend.ts deleted file mode 100644 index 4ddff1e00..000000000 --- a/deploy/scripts/cdk/lib/construct/backend.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { Duration } from 'aws-cdk-lib' -import { Construct } from 'constructs'; -import { - aws_ec2 as ec2, - aws_ecs as ecs, - aws_ecr as ecr, - aws_rds as rds, - aws_servicediscovery as servicediscovery, - aws_iam as iam, - aws_logs as logs, - aws_elasticloadbalancingv2 as elb, -} from 'aws-cdk-lib'; -import * as dotenv from 'dotenv'; -const path = require('path'); -dotenv.config({path: path.join(__dirname, "../../.env")}); - -console.log(process.env.LANGFLOW_AUTO_LOGIN); -console.log(process.env.LANGFLOW_SUPERUSER); -console.log(process.env.LANGFLOW_SUPERUSER_PASSWORD); - -interface BackEndProps { - cluster: ecs.Cluster - ecsBackSG:ec2.SecurityGroup - ecrBackEndRepository:ecr.Repository - backendTaskRole: iam.Role; - backendTaskExecutionRole: iam.Role; - backendLogGroup: logs.LogGroup; - cloudmapNamespace: servicediscovery.PrivateDnsNamespace; - rdsCluster:rds.DatabaseCluster - alb:elb.IApplicationLoadBalancer - arch:ecs.CpuArchitecture -} - -export class BackEndCluster extends Construct { - readonly backendServiceName: string - - constructor(scope: Construct, id: string, props:BackEndProps) { - super(scope, id) - const containerPort = 7860 - // Secrets ManagerからDB認証情報を取ってくる - const secretsDB = props.rdsCluster.secret!; - - // Create Backend Fargate Service - const backendTaskDefinition = new ecs.FargateTaskDefinition( - this, - 'BackEndTaskDef', - { - memoryLimitMiB: 3072, - cpu: 1024, - executionRole: props.backendTaskExecutionRole, - runtimePlatform:{ - operatingSystemFamily: ecs.OperatingSystemFamily.LINUX, - cpuArchitecture: props.arch, - }, - taskRole: props.backendTaskRole, - } - ); - backendTaskDefinition.addContainer('backendContainer', { - image: ecs.ContainerImage.fromEcrRepository(props.ecrBackEndRepository, "latest"), - containerName:'langflow-back-container', - logging: ecs.LogDriver.awsLogs({ - streamPrefix: 'my-stream', - logGroup: props.backendLogGroup, - }), - environment:{ - // user:pass@endpoint:port/dbname - // "LANGFLOW_DATABASE_URL" : `mysql+pymysql://${username}:${password}@${host}:3306/${dbname}`, - // "LANGFLOW_DATABASE_URL" : "sqlite:///./langflow.db", - // "LANGFLOW_LANGCHAIN_CACHE" : "SQLiteCache", - // "LANGFLOW_AUTO_LOGIN" : "false", - // "LANGFLOW_SUPERUSER" : "admin", - // "LANGFLOW_SUPERUSER_PASSWORD" : "1234567" - "LANGFLOW_AUTO_LOGIN" : process.env.LANGFLOW_AUTO_LOGIN ?? 'false', - "LANGFLOW_SUPERUSER" : process.env.LANGFLOW_SUPERUSER ?? "admin", - "LANGFLOW_SUPERUSER_PASSWORD" : process.env.LANGFLOW_SUPERUSER_PASSWORD ?? "123456" - }, - portMappings: [ - { - containerPort: containerPort, - protocol: ecs.Protocol.TCP, - }, - ], - // Secretの設定 - secrets: { - "dbname": ecs.Secret.fromSecretsManager(secretsDB, 'dbname'), - "username": ecs.Secret.fromSecretsManager(secretsDB, 'username'), - "host": ecs.Secret.fromSecretsManager(secretsDB, 'host'), - "password": ecs.Secret.fromSecretsManager(secretsDB, 'password'), - }, - }); - this.backendServiceName = 'backend' - const backendService = new ecs.FargateService(this, 'BackEndService', { - cluster: props.cluster, - serviceName: this.backendServiceName, - taskDefinition: backendTaskDefinition, - enableExecuteCommand: true, - securityGroups: [props.ecsBackSG], - cloudMapOptions: { - cloudMapNamespace: props.cloudmapNamespace, - containerPort: containerPort, - dnsRecordType: servicediscovery.DnsRecordType.A, - dnsTtl: Duration.seconds(10), - name: this.backendServiceName - }, - vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS }, - }); - - } -} \ No newline at end of file diff --git a/deploy/scripts/cdk/lib/construct/db.ts b/deploy/scripts/cdk/lib/construct/db.ts deleted file mode 100644 index 8be1f5212..000000000 --- a/deploy/scripts/cdk/lib/construct/db.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { Construct } from 'constructs'; -import * as ec2 from 'aws-cdk-lib/aws-ec2' -import * as rds from "aws-cdk-lib/aws-rds"; - -interface RdsProps { - vpc: ec2.Vpc - dbSG:ec2.SecurityGroup -} - -export class Rds extends Construct{ - readonly rdsCluster: rds.DatabaseCluster - - constructor(scope: Construct, id:string, props: RdsProps){ - super(scope, id); - - const {vpc, dbSG} = props - const instanceType = ec2.InstanceType.of(ec2.InstanceClass.BURSTABLE4_GRAVITON, ec2.InstanceSize.MEDIUM) - - // RDSのパスワードを自動生成してSecrets Managerに格納 - const rdsCredentials = rds.Credentials.fromGeneratedSecret('db_user',{ - secretName: 'langflow-DbSecret', - }) - - // DB クラスターのパラメータグループ作成 - const clusterParameterGroup = new rds.ParameterGroup(scope, 'ClusterParameterGroup',{ - engine: rds.DatabaseClusterEngine.auroraMysql({ - version: rds.AuroraMysqlEngineVersion.VER_3_02_0 - }), - description: 'for-langflow', - }) - clusterParameterGroup.bindToCluster({}) - - // DB インスタンスのパラメタグループ作成 - const instanceParameterGroup = new rds.ParameterGroup(scope, 'InstanceParameterGroup',{ - engine: rds.DatabaseClusterEngine.auroraMysql({ - version: rds.AuroraMysqlEngineVersion.VER_3_02_0, - }), - description: 'for-langflow', - }) - instanceParameterGroup.bindToInstance({}) - - this.rdsCluster = new rds.DatabaseCluster(scope, 'LangflowDbCluster', { - engine: rds.DatabaseClusterEngine.auroraMysql({ - version: rds.AuroraMysqlEngineVersion.VER_3_02_0, - }), - storageEncrypted: true, - credentials: rdsCredentials, - instanceIdentifierBase: 'langflow-instance', - vpc:vpc, - vpcSubnets:vpc.selectSubnets({ - subnetGroupName: 'langflow-Isolated', - }), - securityGroups:[dbSG], - writer: rds.ClusterInstance.provisioned("WriterInstance", { - instanceType: instanceType, - enablePerformanceInsights: true, - parameterGroup:instanceParameterGroup, - }), - // 2台目以降はreaders:で設定 - parameterGroup: clusterParameterGroup, - defaultDatabaseName: 'langflow', - }) - } -} diff --git a/deploy/scripts/cdk/lib/construct/ecr.ts b/deploy/scripts/cdk/lib/construct/ecr.ts deleted file mode 100644 index 96424b053..000000000 --- a/deploy/scripts/cdk/lib/construct/ecr.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { RemovalPolicy } from 'aws-cdk-lib' -import * as ecr from 'aws-cdk-lib/aws-ecr' -import * as ecrdeploy from 'cdk-ecr-deployment' -import * as ecs from 'aws-cdk-lib/aws-ecs' -import * as servicediscovery from 'aws-cdk-lib/aws-servicediscovery' -import { DockerImageAsset, Platform } from 'aws-cdk-lib/aws-ecr-assets' -import * as path from "path"; -import { Construct } from 'constructs' - - -interface ECRProps { - cloudmapNamespace: servicediscovery.PrivateDnsNamespace; - arch:ecs.CpuArchitecture; -} - -export class EcrRepository extends Construct { - readonly ecrFrontEndRepository: ecr.Repository - readonly ecrBackEndRepository: ecr.Repository - - constructor(scope: Construct, id: string, props: ECRProps) { - super(scope, id) - - const imagePlatform = props.arch == ecs.CpuArchitecture.ARM64 ? Platform.LINUX_ARM64 : Platform.LINUX_AMD64 - const backendPath = path.join(__dirname, "../../../../../../", "langflow") - const frontendPath = path.join(__dirname, "../../../../../src/", "frontend") - const excludeDir = ['node_modules','.git', 'cdk.out'] - const LifecycleRule = { - tagStatus: ecr.TagStatus.ANY, - description: 'Delete more than 30 image', - maxImageCount: 30, - } - - // リポジトリ作成 - this.ecrFrontEndRepository = new ecr.Repository(scope, 'LangflowFrontEndRepository', { - repositoryName: 'langflow-frontend-repository', - removalPolicy: RemovalPolicy.RETAIN, - imageScanOnPush: true, - }) - this.ecrBackEndRepository = new ecr.Repository(scope, 'LangflowBackEndRepository', { - repositoryName: 'langflow-backend-repository', - removalPolicy: RemovalPolicy.RETAIN, - imageScanOnPush: true, - }) - // LifecycleRule作成 - this.ecrFrontEndRepository.addLifecycleRule(LifecycleRule) - this.ecrBackEndRepository.addLifecycleRule(LifecycleRule) - - // Create Docker Image Asset - const dockerFrontEndImageAsset = new DockerImageAsset(this, "DockerFrontEndImageAsset", { - directory: frontendPath, - buildArgs:{ - "BACKEND_URL":`http://backend.${props.cloudmapNamespace.namespaceName}:7860` - }, - exclude: excludeDir, - platform: imagePlatform, - }); - const dockerBackEndImageAsset = new DockerImageAsset(this, "DockerBackEndImageAsset", { - directory: backendPath, - exclude: excludeDir, - platform: imagePlatform, - }); - - // Deploy Docker Image to ECR Repository - new ecrdeploy.ECRDeployment(this, "DeployFrontEndImage", { - src: new ecrdeploy.DockerImageName(dockerFrontEndImageAsset.imageUri), - dest: new ecrdeploy.DockerImageName(this.ecrFrontEndRepository.repositoryUri) - }); - - // Deploy Docker Image to ECR Repository - new ecrdeploy.ECRDeployment(this, "DeployBackEndImage", { - src: new ecrdeploy.DockerImageName(dockerBackEndImageAsset.imageUri), - dest: new ecrdeploy.DockerImageName(this.ecrBackEndRepository.repositoryUri) - }); - - } -} diff --git a/deploy/scripts/cdk/lib/construct/frontend.ts b/deploy/scripts/cdk/lib/construct/frontend.ts deleted file mode 100644 index 8238ed135..000000000 --- a/deploy/scripts/cdk/lib/construct/frontend.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { Duration } from 'aws-cdk-lib' -import { Construct } from 'constructs' -import { - aws_ec2 as ec2, - aws_ecs as ecs, - aws_ecr as ecr, - aws_servicediscovery as servicediscovery, - aws_iam as iam, - aws_logs as logs, - aws_elasticloadbalancingv2 as elb, -} from 'aws-cdk-lib'; -import { CpuArchitecture } from 'aws-cdk-lib/aws-ecs'; - -interface FrontEndProps { - cluster:ecs.Cluster - ecsFrontSG:ec2.SecurityGroup - ecrFrontEndRepository:ecr.Repository - targetGroup: elb.ApplicationTargetGroup; - backendServiceName: string; - frontendTaskRole: iam.Role; - frontendTaskExecutionRole: iam.Role; - frontendLogGroup: logs.LogGroup; - cloudmapNamespace: servicediscovery.PrivateDnsNamespace; - arch:ecs.CpuArchitecture; -} - -export class FrontEndCluster extends Construct { - constructor(scope: Construct, id: string, props:FrontEndProps) { - super(scope, id) - - const containerPort = 3000 - const frontendTaskDefinition = new ecs.FargateTaskDefinition( - this, - 'FrontendTaskDef', - { - memoryLimitMiB: 3072, - cpu: 1024, - executionRole: props.frontendTaskExecutionRole, - runtimePlatform:{ - operatingSystemFamily: ecs.OperatingSystemFamily.LINUX, - cpuArchitecture: props.arch, - }, - taskRole: props.frontendTaskRole, - } - ); - const frontendServiceName = 'frontend' - frontendTaskDefinition.addContainer('frontendContainer', { - image: ecs.ContainerImage.fromEcrRepository(props.ecrFrontEndRepository, "latest"), - containerName:'langflow-front-container', - environment: { - BACKEND_SERVICE_NAME: props.backendServiceName, - BACKEND_URL: `http://${props.backendServiceName}.${props.cloudmapNamespace.namespaceName}:7860/`, - VITE_PROXY_TARGET: `http://${props.backendServiceName}.${props.cloudmapNamespace.namespaceName}:7860/`, - }, - logging: ecs.LogDriver.awsLogs({ - streamPrefix: 'my-stream', - logGroup: props.frontendLogGroup, - }), - portMappings: [ - { - name:frontendServiceName, - containerPort: containerPort, - protocol: ecs.Protocol.TCP, - appProtocol:ecs.AppProtocol.http, - }, - ], - }); - const frontendService = new ecs.FargateService( - this, - 'FrontendService', - { - serviceName: frontendServiceName, - cluster: props.cluster, - desiredCount: 1, - assignPublicIp: false, - taskDefinition: frontendTaskDefinition, - enableExecuteCommand: true, - securityGroups: [props.ecsFrontSG], - cloudMapOptions: { - cloudMapNamespace: props.cloudmapNamespace, - containerPort: containerPort, - dnsRecordType: servicediscovery.DnsRecordType.A, - dnsTtl: Duration.seconds(10), - name: frontendServiceName - }, - healthCheckGracePeriod: Duration.seconds(1000), - } - ); - - props.targetGroup.addTarget(frontendService); - - // // Create ALB and ECS Fargate Service - // const frontService = new ecs_patterns.ApplicationLoadBalancedFargateService( - // this, - // "FrontEndService", - // { - // cluster: cluster, - // serviceName: 'langflow-frontend-service', - // cpu: 256, - // memoryLimitMiB: 512, - // listenerPort: 80, - // assignPublicIp: true, // Public facing - ALB - // taskSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS }, - // securityGroups:[ecsFrontSG], - // taskImageOptions: { - // family: 'langflow-taskdef', - // containerName: 'langflow-front-container', - // image: ecs.ContainerImage.fromEcrRepository(ecrFrontEndRepository, "latest"), - // containerPort: 3000, // L2なので、TargetGroupのportが3000で設定されるはず - // }, - // loadBalancer:alb, - // openListener:false, - // } - // ); - - } -} \ No newline at end of file diff --git a/deploy/scripts/cdk/lib/construct/iam.ts b/deploy/scripts/cdk/lib/construct/iam.ts deleted file mode 100644 index 0a40cf340..000000000 --- a/deploy/scripts/cdk/lib/construct/iam.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { RemovalPolicy, Duration } from 'aws-cdk-lib' -import { Construct } from 'constructs' -import { - aws_rds as rds, - aws_iam as iam, -} from 'aws-cdk-lib'; - -interface IAMProps { - rdsCluster:rds.DatabaseCluster -} - -export class EcsIAM extends Construct { - readonly frontendTaskRole: iam.Role; - readonly frontendTaskExecutionRole: iam.Role; - readonly backendTaskRole: iam.Role; - readonly backendTaskExecutionRole: iam.Role; - - constructor(scope: Construct, id: string, props:IAMProps) { - super(scope, id) - - // Policy Statements - // ECS Policy State - const ECSExecPolicyStatement = new iam.PolicyStatement({ - sid: 'allowECSExec', - resources: ['*'], - actions: [ - 'ecr:GetAuthorizationToken', - 'ecr:BatchCheckLayerAvailability', - 'ecr:GetDownloadUrlForLayer', - 'ecr:BatchGetImage', - ], - }); - // Bedrock Policy State - const BedrockPolicyStatement = new iam.PolicyStatement({ - sid: 'allowBedrockAccess', - resources: ['*'], - actions: [ - 'bedrock:*', - ], - }); - // Kendra Policy State - const KendraPolicyStatement = new iam.PolicyStatement({ - sid: 'allowKendraAccess', - resources: ['*'], - actions: [ - 'kendra:*' - ], - }); - // Create Rag Policy - const RagAccessPolicy = new iam.Policy(this, 'RAGFullAccess', { - statements: [KendraPolicyStatement,BedrockPolicyStatement], - }) - // Secrets ManagerからDB認証情報を取ってくるためのPolicy - const SecretsManagerPolicy = new iam.Policy(this, 'SMGetPolicy', { - statements: [new iam.PolicyStatement({ - actions: ['secretsmanager:GetSecretValue'], - resources: [props.rdsCluster.secret!.secretArn], - })], - }) - - // FrontEnd Task Role - this.frontendTaskRole = new iam.Role(this, 'FrontendTaskRole', { - assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), - }); - this.frontendTaskRole.addToPolicy(ECSExecPolicyStatement); - - // BackEnd Task Role - this.backendTaskRole = new iam.Role(this, 'BackendTaskRole', { - assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), - }); - // ECS Exec Policyの付与 - this.backendTaskRole.addToPolicy(ECSExecPolicyStatement); - // KendraとBedrockのアクセス権付与 - this.backendTaskRole.attachInlinePolicy(RagAccessPolicy); - - // FrontEnd Task ExecutionRole - this.frontendTaskExecutionRole = new iam.Role(this, 'frontendTaskExecutionRole', { - assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), - managedPolicies: [ - { - managedPolicyArn: - 'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy', - }, - ], - }); - - // BackEnd Task ExecutionRole - this.backendTaskExecutionRole = new iam.Role(this, 'backendTaskExecutionRole', { - assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), - managedPolicies: [ - { - managedPolicyArn: - 'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy', - }, - ], - }); - - this.backendTaskExecutionRole.attachInlinePolicy(SecretsManagerPolicy); - this.backendTaskExecutionRole.attachInlinePolicy(RagAccessPolicy); - } -} \ No newline at end of file diff --git a/deploy/scripts/cdk/lib/construct/index.ts b/deploy/scripts/cdk/lib/construct/index.ts deleted file mode 100644 index 8c2efcb1b..000000000 --- a/deploy/scripts/cdk/lib/construct/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * from './db'; -export * from './ecr'; -export * from './iam'; -export * from './frontend'; -export * from './backend'; -export * from './network'; \ No newline at end of file diff --git a/deploy/scripts/cdk/lib/construct/network.ts b/deploy/scripts/cdk/lib/construct/network.ts deleted file mode 100644 index aa9e48dc5..000000000 --- a/deploy/scripts/cdk/lib/construct/network.ts +++ /dev/null @@ -1,139 +0,0 @@ -import { RemovalPolicy, Duration } from 'aws-cdk-lib' -import { Construct } from 'constructs' -import { - aws_ec2 as ec2, - aws_ecs as ecs, - aws_logs as logs, - aws_servicediscovery as servicediscovery, - aws_elasticloadbalancingv2 as elb, -} from 'aws-cdk-lib'; - -export class Network extends Construct { - readonly vpc: ec2.Vpc; - readonly cluster: ecs.Cluster; - readonly alb: elb.IApplicationLoadBalancer; - readonly targetGroup: elb.ApplicationTargetGroup; - readonly cloudmapNamespace: servicediscovery.PrivateDnsNamespace; - readonly ecsFrontSG: ec2.SecurityGroup; - readonly ecsBackSG: ec2.SecurityGroup; - readonly dbSG: ec2.SecurityGroup; - readonly albSG: ec2.SecurityGroup; - readonly backendLogGroup: logs.LogGroup; - readonly frontendLogGroup: logs.LogGroup; - - constructor(scope: Construct, id: string) { - super(scope, id) - const alb_listen_port=80 - const front_service_port=3000 - const back_service_port=7860 - - // VPC等リソースの作成 - this.vpc = new ec2.Vpc(scope, 'VPC', { - vpcName: 'langflow-vpc', - ipAddresses: ec2.IpAddresses.cidr('10.0.0.0/16'), - maxAzs: 3, - subnetConfiguration: [ - { - cidrMask: 24, - name: 'langflow-Isolated', - subnetType: ec2.SubnetType.PRIVATE_ISOLATED, - }, - { - cidrMask: 24, - name: 'langflow-Public', - subnetType: ec2.SubnetType.PUBLIC, - }, - { - cidrMask: 24, - name: 'langflow-Private', - subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS - }, - ], - natGateways: 1, - }) - // Cluster - this.cluster = new ecs.Cluster(this, 'EcsCluster', { - clusterName: 'langflow-cluster', - vpc: this.vpc, - enableFargateCapacityProviders: true, - }); - - // Private DNS - this.cloudmapNamespace = new servicediscovery.PrivateDnsNamespace( - this, - 'Namespace', - { - name: 'ecs-deploy.com', - vpc: this.vpc, - } - ); - - // ALBに設定するセキュリティグループ - this.albSG = new ec2.SecurityGroup(scope, 'ALBSecurityGroup', { - securityGroupName: 'alb-sg', - description: 'for alb', - vpc: this.vpc, - }) - this.albSG.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(alb_listen_port)) - - this.alb = new elb.ApplicationLoadBalancer(this,'alb',{ - internetFacing: true, //インターネットからのアクセスを許可するかどうか指定 - loadBalancerName: 'alb', - securityGroup: this.albSG, //作成したセキュリティグループを割り当てる - vpc:this.vpc, - }) - - const listener = this.alb.addListener('Listener', { port: alb_listen_port }); - - this.targetGroup = listener.addTargets('targetGroup', { - port: front_service_port, - protocol: elb.ApplicationProtocol.HTTP, - healthCheck: { - enabled: true, - path: '/health', - healthyThresholdCount: 2, - unhealthyThresholdCount: 4, - interval: Duration.seconds(100), - timeout: Duration.seconds(30), - healthyHttpCodes: '200', - }, - }); - - // ECS FrontEndに設定するセキュリティグループ - this.ecsFrontSG = new ec2.SecurityGroup(scope, 'ECSFrontEndSecurityGroup', { - securityGroupName: 'langflow-ecs-front-sg', - description: 'for langflow-front-ecs', - vpc: this.vpc, - }) - this.ecsFrontSG.addIngressRule(this.albSG, ec2.Port.allTcp()) - - // ECS BackEndに設定するセキュリティグループ - this.ecsBackSG = new ec2.SecurityGroup(scope, 'ECSBackEndSecurityGroup', { - securityGroupName: 'langflow-ecs-back-sg', - description: 'for langflow-back-ecs', - vpc: this.vpc, - }) - this.ecsBackSG.addIngressRule(this.ecsFrontSG, ec2.Port.tcp(back_service_port)) - - // RDSに設定するセキュリティグループ - this.dbSG = new ec2.SecurityGroup(scope, 'DBSecurityGroup', { - allowAllOutbound: true, - securityGroupName: 'langflow-db', - description: 'for langflow-db', - vpc: this.vpc, - }) - // AppRunnerSecurityGroupからのポート3306:mysql(5432:postgres)のインバウンドを許可 - this.dbSG.addIngressRule(this.ecsBackSG, ec2.Port.tcp(3306)) - - // Create CloudWatch Log Group - this.backendLogGroup = new logs.LogGroup(this, 'backendLogGroup', { - logGroupName: 'myapp-backend', - removalPolicy: RemovalPolicy.DESTROY, - }); - - this.frontendLogGroup = new logs.LogGroup(this, 'frontendLogGroup', { - logGroupName: 'myapp-frontend', - removalPolicy: RemovalPolicy.DESTROY, - }); - } -} \ No newline at end of file diff --git a/deploy/scripts/cdk/package-lock.json b/deploy/scripts/cdk/package-lock.json deleted file mode 100644 index e5b70161b..000000000 --- a/deploy/scripts/cdk/package-lock.json +++ /dev/null @@ -1,4601 +0,0 @@ -{ - "name": "cdk", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "cdk", - "version": "0.1.0", - "dependencies": { - "aws-cdk-lib": "^2.86.0", - "cdk-ecr-deployment": "^2.5.30", - "constructs": "^10.0.0", - "source-map-support": "^0.5.21" - }, - "bin": { - "cdk": "bin/cdk.js" - }, - "devDependencies": { - "@types/jest": "^29.5.1", - "@types/node": "20.1.7", - "aws-cdk": "2.86.0", - "jest": "^29.5.0", - "ts-jest": "^29.1.0", - "ts-node": "^10.9.1", - "typescript": "~5.1.3" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@aws-cdk/asset-awscli-v1": { - "version": "2.2.201", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.201.tgz", - "integrity": "sha512-INZqcwDinNaIdb5CtW3ez5s943nX5stGBQS6VOP2JDlOFP81hM3fds/9NDknipqfUkZM43dx+HgVvkXYXXARCQ==" - }, - "node_modules/@aws-cdk/asset-kubectl-v20": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-kubectl-v20/-/asset-kubectl-v20-2.1.2.tgz", - "integrity": "sha512-3M2tELJOxQv0apCIiuKQ4pAbncz9GuLwnKFqxifWfe77wuMxyTRPmxssYHs42ePqzap1LT6GDcPygGs+hHstLg==" - }, - "node_modules/@aws-cdk/asset-node-proxy-agent-v5": { - "version": "2.0.166", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v5/-/asset-node-proxy-agent-v5-2.0.166.tgz", - "integrity": "sha512-j0xnccpUQHXJKPgCwQcGGNu4lRiC1PptYfdxBIH1L4dRK91iBxtSQHESRQX+yB47oGLaF/WfNN/aF3WXwlhikg==" - }, - "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", - "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", - "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", - "dev": true, - "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", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", - "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.3", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dev": true, - "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" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", - "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", - "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz", - "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.3", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.3", - "@babel/types": "^7.23.3", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", - "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-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" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "node_modules/@types/babel__core": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.4.tgz", - "integrity": "sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.7", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", - "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", - "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "29.5.8", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.8.tgz", - "integrity": "sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g==", - "dev": true, - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/node": { - "version": "20.1.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.7.tgz", - "integrity": "sha512-WCuw/o4GSwDGMoonES8rcvwsig77dGCMbZDrZr2x4ZZiNW4P/gcoZXe/0twgtobcTkmg9TuKflxYL/DuwDyJzg==", - "dev": true - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true - }, - "node_modules/@types/yargs": { - "version": "17.0.31", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", - "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", - "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/aws-cdk": { - "version": "2.86.0", - "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.86.0.tgz", - "integrity": "sha512-GRcdU6p00Zu3fIZYPG+EbpDYppYMtzebuf0jrmCfKhCytRGaPWDHHfu3hrv0de4d0zbUD/+AmiODPMu3J6nXbQ==", - "dev": true, - "bin": { - "cdk": "bin/cdk" - }, - "engines": { - "node": ">= 14.15.0" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, - "node_modules/aws-cdk-lib": { - "version": "2.86.0", - "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.86.0.tgz", - "integrity": "sha512-76yZ2MawAGXLD3ox4FjhUIPmAMXteGKkeo3tPMthemusDCCkD2X6DBssXBHjB7r9GnrOMMf8JH5BGq2lOZ539g==", - "bundleDependencies": [ - "@balena/dockerignore", - "case", - "fs-extra", - "ignore", - "jsonschema", - "minimatch", - "punycode", - "semver", - "table", - "yaml" - ], - "dependencies": { - "@aws-cdk/asset-awscli-v1": "^2.2.177", - "@aws-cdk/asset-kubectl-v20": "^2.1.1", - "@aws-cdk/asset-node-proxy-agent-v5": "^2.0.148", - "@balena/dockerignore": "^1.0.2", - "case": "1.6.3", - "fs-extra": "^11.1.1", - "ignore": "^5.2.4", - "jsonschema": "^1.4.1", - "minimatch": "^3.1.2", - "punycode": "^2.3.0", - "semver": "^7.5.1", - "table": "^6.8.1", - "yaml": "1.10.2" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "constructs": "^10.0.0" - } - }, - "node_modules/aws-cdk-lib/node_modules/@balena/dockerignore": { - "version": "1.0.2", - "inBundle": true, - "license": "Apache-2.0" - }, - "node_modules/aws-cdk-lib/node_modules/ajv": { - "version": "8.12.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/aws-cdk-lib/node_modules/ansi-regex": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/aws-cdk-lib/node_modules/ansi-styles": { - "version": "4.3.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/aws-cdk-lib/node_modules/astral-regex": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/aws-cdk-lib/node_modules/balanced-match": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/aws-cdk-lib/node_modules/brace-expansion": { - "version": "1.1.11", - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/aws-cdk-lib/node_modules/case": { - "version": "1.6.3", - "inBundle": true, - "license": "(MIT OR GPL-3.0-or-later)", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/aws-cdk-lib/node_modules/color-convert": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/aws-cdk-lib/node_modules/color-name": { - "version": "1.1.4", - "inBundle": true, - "license": "MIT" - }, - "node_modules/aws-cdk-lib/node_modules/concat-map": { - "version": "0.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/aws-cdk-lib/node_modules/emoji-regex": { - "version": "8.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/aws-cdk-lib/node_modules/fast-deep-equal": { - "version": "3.1.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/aws-cdk-lib/node_modules/fs-extra": { - "version": "11.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/aws-cdk-lib/node_modules/graceful-fs": { - "version": "4.2.11", - "inBundle": true, - "license": "ISC" - }, - "node_modules/aws-cdk-lib/node_modules/ignore": { - "version": "5.2.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/aws-cdk-lib/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/aws-cdk-lib/node_modules/json-schema-traverse": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/aws-cdk-lib/node_modules/jsonfile": { - "version": "6.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/aws-cdk-lib/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/aws-cdk-lib/node_modules/lodash.truncate": { - "version": "4.4.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/aws-cdk-lib/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/aws-cdk-lib/node_modules/minimatch": { - "version": "3.1.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/aws-cdk-lib/node_modules/punycode": { - "version": "2.3.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/aws-cdk-lib/node_modules/require-from-string": { - "version": "2.0.2", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/aws-cdk-lib/node_modules/semver": { - "version": "7.5.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/aws-cdk-lib/node_modules/slice-ansi": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/aws-cdk-lib/node_modules/string-width": { - "version": "4.2.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/aws-cdk-lib/node_modules/strip-ansi": { - "version": "6.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/aws-cdk-lib/node_modules/table": { - "version": "6.8.1", - "inBundle": true, - "license": "BSD-3-Clause", - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/aws-cdk-lib/node_modules/universalify": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/aws-cdk-lib/node_modules/uri-js": { - "version": "4.4.1", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/aws-cdk-lib/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/aws-cdk-lib/node_modules/yaml": { - "version": "1.10.2", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001561", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz", - "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/cdk-ecr-deployment": { - "version": "2.5.30", - "resolved": "https://registry.npmjs.org/cdk-ecr-deployment/-/cdk-ecr-deployment-2.5.30.tgz", - "integrity": "sha512-IFS/DD6OmNcXv24YKjjaz1sb04xxsoUb7vPYwx7kTBAOxOnT0CuAadF8/HVfM/YVoqoOPXCJe3ikAXy1iI0nKw==", - "bundleDependencies": [ - "got", - "hpagent" - ], - "dependencies": { - "aws-cdk-lib": "^2.0.0", - "constructs": "^10.0.5", - "got": "^11.8.6", - "hpagent": "^0.1.2" - }, - "peerDependencies": { - "aws-cdk-lib": "^2.0.0", - "constructs": "^10.0.5" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/@sindresorhus/is": { - "version": "4.6.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "inBundle": true, - "license": "MIT", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/@types/cacheable-request": { - "version": "6.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/@types/cacheable-request/node_modules/@types/node": { - "version": "20.3.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/cdk-ecr-deployment/node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/cdk-ecr-deployment/node_modules/@types/keyv": { - "version": "3.1.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/@types/keyv/node_modules/@types/node": { - "version": "20.3.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/cdk-ecr-deployment/node_modules/@types/responselike": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/@types/responselike/node_modules/@types/node": { - "version": "20.3.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/cdk-ecr-deployment/node_modules/cacheable-lookup": { - "version": "5.0.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/cacheable-request": { - "version": "7.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/clone-response": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/clone-response/node_modules/mimic-response": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/decompress-response": { - "version": "6.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/defer-to-connect": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/end-of-stream": { - "version": "1.4.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/got": { - "version": "11.8.6", - "inBundle": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/hpagent": { - "version": "0.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/cdk-ecr-deployment/node_modules/http-cache-semantics": { - "version": "4.1.1", - "inBundle": true, - "license": "BSD-2-Clause" - }, - "node_modules/cdk-ecr-deployment/node_modules/http2-wrapper": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/json-buffer": { - "version": "3.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/cdk-ecr-deployment/node_modules/keyv": { - "version": "4.5.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/lowercase-keys": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/mimic-response": { - "version": "3.1.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/normalize-url": { - "version": "6.1.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/once": { - "version": "1.4.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/p-cancelable": { - "version": "2.1.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/pump": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/quick-lru": { - "version": "5.1.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/resolve-alpn": { - "version": "1.2.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/cdk-ecr-deployment/node_modules/responselike": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cdk-ecr-deployment/node_modules/wrappy": { - "version": "1.0.2", - "inBundle": true, - "license": "ISC" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/constructs": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.3.0.tgz", - "integrity": "sha512-vbK8i3rIb/xwZxSpTjz3SagHn1qq9BChLEfy5Hf6fB3/2eFbrwt2n9kHwQcS0CPTRBesreeAcsJfMq2229FnbQ==", - "engines": { - "node": ">= 16.14.0" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/dedent": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", - "dev": true, - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.580", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.580.tgz", - "integrity": "sha512-T5q3pjQon853xxxHUq3ZP68ZpvJHuSMY2+BZaW3QzjS4HvNuvsMmZ/+lU+nCrftre1jFZ+OSlExynXWBihnXzw==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", - "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner/node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-snapshot/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "dependencies": { - "@types/node": "*", - "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" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pure-rand": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", - "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ] - }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-jest": { - "version": "29.1.1", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", - "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", - "dev": true, - "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "^7.5.3", - "yargs-parser": "^21.0.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/types": "^29.0.0", - "babel-jest": "^29.0.0", - "jest": "^29.0.0", - "typescript": ">=4.3 <6" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/ts-jest/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ts-jest/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ts-jest/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "node_modules/v8-to-istanbul": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz", - "integrity": "sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/deploy/scripts/cdk/package.json b/deploy/scripts/cdk/package.json deleted file mode 100644 index 05ef554d9..000000000 --- a/deploy/scripts/cdk/package.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "cdk", - "version": "0.1.0", - "bin": { - "cdk": "bin/cdk.js" - }, - "scripts": { - "build": "tsc", - "watch": "tsc -w", - "test": "jest", - "cdk": "cdk" - }, - "devDependencies": { - "@types/jest": "^29.5.1", - "@types/node": "20.1.7", - "aws-cdk": "2.86.0", - "jest": "^29.5.0", - "ts-jest": "^29.1.0", - "ts-node": "^10.9.1", - "typescript": "~5.1.3" - }, - "dependencies": { - "aws-cdk-lib": "^2.86.0", - "cdk-ecr-deployment": "^2.5.30", - "constructs": "^10.0.0", - "source-map-support": "^0.5.21" - } -} diff --git a/deploy/scripts/cdk/test/cdk.test.ts b/deploy/scripts/cdk/test/cdk.test.ts deleted file mode 100644 index 1e6b29c85..000000000 --- a/deploy/scripts/cdk/test/cdk.test.ts +++ /dev/null @@ -1,17 +0,0 @@ -// import * as cdk from 'aws-cdk-lib'; -// import { Template } from 'aws-cdk-lib/assertions'; -// import * as Cdk from '../lib/cdk-stack'; - -// example test. To run these tests, uncomment this file along with the -// example resource in lib/cdk-stack.ts -test('SQS Queue Created', () => { -// const app = new cdk.App(); -// // WHEN -// const stack = new Cdk.CdkStack(app, 'MyTestStack'); -// // THEN -// const template = Template.fromStack(stack); - -// template.hasResourceProperties('AWS::SQS::Queue', { -// VisibilityTimeout: 300 -// }); -}); From 14651ebc4d2a03173fe555e368294c649b84809b Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 30 Nov 2023 16:32:52 +0900 Subject: [PATCH 087/203] move cdk folder to scripts/cdk --- Dockerfile | 25 +- dev.Dockerfile | 18 + prod.Dockerfile | 15 - scripts/cdk/.env.example | 3 + scripts/cdk/.gitignore | 9 + scripts/cdk/.npmignore | 6 + scripts/cdk/README.md | 14 + scripts/cdk/bin/cdk.ts | 21 + scripts/cdk/cdk.json | 55 + scripts/cdk/delete-docker-images.sh | 3 + scripts/cdk/delete-ecr.sh | 4 + scripts/cdk/jest.config.js | 8 + scripts/cdk/lib/cdk-stack.ts | 64 + scripts/cdk/lib/construct/backend.ts | 109 + scripts/cdk/lib/construct/db.ts | 64 + scripts/cdk/lib/construct/ecr.ts | 78 + scripts/cdk/lib/construct/frontend.ts | 117 + scripts/cdk/lib/construct/iam.ts | 101 + scripts/cdk/lib/construct/index.ts | 6 + scripts/cdk/lib/construct/network.ts | 139 + scripts/cdk/package-lock.json | 4601 +++++++++++++++++++++++++ scripts/cdk/package.json | 28 + scripts/cdk/test/cdk.test.ts | 17 + src/frontend/Dockerfile | 36 +- src/frontend/dev.Dockerfile | 26 + src/frontend/prod.Dockerfile | 16 - 26 files changed, 5515 insertions(+), 68 deletions(-) create mode 100644 dev.Dockerfile delete mode 100644 prod.Dockerfile create mode 100644 scripts/cdk/.env.example create mode 100644 scripts/cdk/.gitignore create mode 100644 scripts/cdk/.npmignore create mode 100644 scripts/cdk/README.md create mode 100644 scripts/cdk/bin/cdk.ts create mode 100644 scripts/cdk/cdk.json create mode 100644 scripts/cdk/delete-docker-images.sh create mode 100644 scripts/cdk/delete-ecr.sh create mode 100644 scripts/cdk/jest.config.js create mode 100644 scripts/cdk/lib/cdk-stack.ts create mode 100644 scripts/cdk/lib/construct/backend.ts create mode 100644 scripts/cdk/lib/construct/db.ts create mode 100644 scripts/cdk/lib/construct/ecr.ts create mode 100644 scripts/cdk/lib/construct/frontend.ts create mode 100644 scripts/cdk/lib/construct/iam.ts create mode 100644 scripts/cdk/lib/construct/index.ts create mode 100644 scripts/cdk/lib/construct/network.ts create mode 100644 scripts/cdk/package-lock.json create mode 100644 scripts/cdk/package.json create mode 100644 scripts/cdk/test/cdk.test.ts create mode 100644 src/frontend/dev.Dockerfile delete mode 100644 src/frontend/prod.Dockerfile diff --git a/Dockerfile b/Dockerfile index ce5715e1f..520c407de 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,18 +1,15 @@ -FROM --platform=linux/amd64 python:3.10-slim +FROM python:3.10-slim -WORKDIR /app +RUN apt-get update && apt-get install gcc g++ git make -y && apt-get clean \ + && rm -rf /var/lib/apt/lists/* +RUN useradd -m -u 1000 user +USER user +ENV HOME=/home/user \ + PATH=/home/user/.local/bin:$PATH -# Install Poetry -RUN apt-get update && apt-get install gcc g++ curl build-essential postgresql-server-dev-all -y -RUN curl -sSL https://install.python-poetry.org | python3 - -# # Add Poetry to PATH -ENV PATH="${PATH}:/root/.local/bin" -# # Copy the pyproject.toml and poetry.lock files -COPY poetry.lock pyproject.toml ./ -# Copy the rest of the application codes -COPY ./ ./ +WORKDIR $HOME/app -# Install dependencies -RUN poetry config virtualenvs.create false && poetry install --no-interaction --no-ansi +COPY --chown=user . $HOME/app -CMD ["uvicorn", "--factory", "src.backend.langflow.main:create_app", "--host", "0.0.0.0", "--port", "7860", "--reload", "--log-level", "debug"] +RUN pip install langflow>==0.0.86 -U --user +CMD ["python", "-m", "langflow", "run", "--host", "0.0.0.0", "--port", "7860"] diff --git a/dev.Dockerfile b/dev.Dockerfile new file mode 100644 index 000000000..ce5715e1f --- /dev/null +++ b/dev.Dockerfile @@ -0,0 +1,18 @@ +FROM --platform=linux/amd64 python:3.10-slim + +WORKDIR /app + +# Install Poetry +RUN apt-get update && apt-get install gcc g++ curl build-essential postgresql-server-dev-all -y +RUN curl -sSL https://install.python-poetry.org | python3 - +# # Add Poetry to PATH +ENV PATH="${PATH}:/root/.local/bin" +# # Copy the pyproject.toml and poetry.lock files +COPY poetry.lock pyproject.toml ./ +# Copy the rest of the application codes +COPY ./ ./ + +# Install dependencies +RUN poetry config virtualenvs.create false && poetry install --no-interaction --no-ansi + +CMD ["uvicorn", "--factory", "src.backend.langflow.main:create_app", "--host", "0.0.0.0", "--port", "7860", "--reload", "--log-level", "debug"] diff --git a/prod.Dockerfile b/prod.Dockerfile deleted file mode 100644 index 520c407de..000000000 --- a/prod.Dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -FROM python:3.10-slim - -RUN apt-get update && apt-get install gcc g++ git make -y && apt-get clean \ - && rm -rf /var/lib/apt/lists/* -RUN useradd -m -u 1000 user -USER user -ENV HOME=/home/user \ - PATH=/home/user/.local/bin:$PATH - -WORKDIR $HOME/app - -COPY --chown=user . $HOME/app - -RUN pip install langflow>==0.0.86 -U --user -CMD ["python", "-m", "langflow", "run", "--host", "0.0.0.0", "--port", "7860"] diff --git a/scripts/cdk/.env.example b/scripts/cdk/.env.example new file mode 100644 index 000000000..6ff0702f4 --- /dev/null +++ b/scripts/cdk/.env.example @@ -0,0 +1,3 @@ +LANGFLOW_AUTO_LOGIN=false +LANGFLOW_SUPERUSER=langflow +LANGFLOW_SUPERUSER_PASSWORD=654321 \ No newline at end of file diff --git a/scripts/cdk/.gitignore b/scripts/cdk/.gitignore new file mode 100644 index 000000000..1a7a1528b --- /dev/null +++ b/scripts/cdk/.gitignore @@ -0,0 +1,9 @@ +*.js +!jest.config.js +*.d.ts +node_modules + +# CDK asset staging directory +.cdk.staging +cdk.out +!/lib diff --git a/scripts/cdk/.npmignore b/scripts/cdk/.npmignore new file mode 100644 index 000000000..c1d6d45dc --- /dev/null +++ b/scripts/cdk/.npmignore @@ -0,0 +1,6 @@ +*.ts +!*.d.ts + +# CDK asset staging directory +.cdk.staging +cdk.out diff --git a/scripts/cdk/README.md b/scripts/cdk/README.md new file mode 100644 index 000000000..320efc02a --- /dev/null +++ b/scripts/cdk/README.md @@ -0,0 +1,14 @@ +# Welcome to your CDK TypeScript project + +This is a blank project for CDK development with TypeScript. + +The `cdk.json` file tells the CDK Toolkit how to execute your app. + +## Useful commands + +* `npm run build` compile typescript to js +* `npm run watch` watch for changes and compile +* `npm run test` perform the jest unit tests +* `cdk deploy` deploy this stack to your default AWS account/region +* `cdk diff` compare deployed stack with current state +* `cdk synth` emits the synthesized CloudFormation template diff --git a/scripts/cdk/bin/cdk.ts b/scripts/cdk/bin/cdk.ts new file mode 100644 index 000000000..c680f3e98 --- /dev/null +++ b/scripts/cdk/bin/cdk.ts @@ -0,0 +1,21 @@ +#!/usr/bin/env node +import 'source-map-support/register'; +import * as cdk from 'aws-cdk-lib'; +import { LangflowAppStack } from '../lib/cdk-stack'; + +const app = new cdk.App(); +new LangflowAppStack(app, 'LangflowAppStack', { + /* If you don't specify 'env', this stack will be environment-agnostic. + * Account/Region-dependent features and context lookups will not work, + * but a single synthesized template can be deployed anywhere. */ + + /* Uncomment the next line to specialize this stack for the AWS Account + * and Region that are implied by the current CLI configuration. */ + // env: { account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEFAULT_REGION }, + + /* Uncomment the next line if you know exactly what Account and Region you + * want to deploy the stack to. */ + // env: { account: '123456789012', region: 'us-east-1' }, + + /* For more information, see https://docs.aws.amazon.com/cdk/latest/guide/environments.html */ +}); \ No newline at end of file diff --git a/scripts/cdk/cdk.json b/scripts/cdk/cdk.json new file mode 100644 index 000000000..dc8ab711a --- /dev/null +++ b/scripts/cdk/cdk.json @@ -0,0 +1,55 @@ +{ + "app": "npx ts-node --prefer-ts-exts bin/cdk.ts", + "watch": { + "include": [ + "**" + ], + "exclude": [ + "README.md", + "cdk*.json", + "**/*.d.ts", + "**/*.js", + "tsconfig.json", + "package*.json", + "yarn.lock", + "node_modules", + "test" + ] + }, + "context": { + "@aws-cdk/aws-lambda:recognizeLayerVersion": true, + "@aws-cdk/core:checkSecretUsage": true, + "@aws-cdk/core:target-partitions": [ + "aws", + "aws-cn" + ], + "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true, + "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true, + "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": true, + "@aws-cdk/aws-iam:minimizePolicies": true, + "@aws-cdk/core:validateSnapshotRemovalPolicy": true, + "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": true, + "@aws-cdk/aws-s3:createDefaultLoggingPolicy": true, + "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": true, + "@aws-cdk/aws-apigateway:disableCloudWatchRole": true, + "@aws-cdk/core:enablePartitionLiterals": true, + "@aws-cdk/aws-events:eventsTargetQueueSameAccount": true, + "@aws-cdk/aws-iam:standardizedServicePrincipals": true, + "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true, + "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": true, + "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": true, + "@aws-cdk/aws-route53-patters:useCertificate": true, + "@aws-cdk/customresources:installLatestAwsSdkDefault": false, + "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": true, + "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": true, + "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": true, + "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": true, + "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": true, + "@aws-cdk/aws-redshift:columnId": true, + "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": true, + "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": true, + "@aws-cdk/aws-apigateway:requestValidatorUniqueId": true, + "@aws-cdk/aws-kms:aliasNameRef": true, + "@aws-cdk/core:includePrefixInUniqueNameGeneration": true + } +} diff --git a/scripts/cdk/delete-docker-images.sh b/scripts/cdk/delete-docker-images.sh new file mode 100644 index 000000000..1e1595008 --- /dev/null +++ b/scripts/cdk/delete-docker-images.sh @@ -0,0 +1,3 @@ +docker stop $(docker ps -aq) +docker rm $(docker ps -aq) +docker rmi -f $(docker images -aq) \ No newline at end of file diff --git a/scripts/cdk/delete-ecr.sh b/scripts/cdk/delete-ecr.sh new file mode 100644 index 000000000..ebe837a8a --- /dev/null +++ b/scripts/cdk/delete-ecr.sh @@ -0,0 +1,4 @@ +# aws cloudformation delete-stack --stack-name LangflowAppStack +# aws ecr delete-repository --repository-name langflow-backend-repository --force +# aws ecr delete-repository --repository-name langflow-frontend-repository --force +# aws ecr describe-repositories --output json | jq -re ".repositories[].repositoryName" \ No newline at end of file diff --git a/scripts/cdk/jest.config.js b/scripts/cdk/jest.config.js new file mode 100644 index 000000000..08263b895 --- /dev/null +++ b/scripts/cdk/jest.config.js @@ -0,0 +1,8 @@ +module.exports = { + testEnvironment: 'node', + roots: ['/test'], + testMatch: ['**/*.test.ts'], + transform: { + '^.+\\.tsx?$': 'ts-jest' + } +}; diff --git a/scripts/cdk/lib/cdk-stack.ts b/scripts/cdk/lib/cdk-stack.ts new file mode 100644 index 000000000..8b637cfcf --- /dev/null +++ b/scripts/cdk/lib/cdk-stack.ts @@ -0,0 +1,64 @@ +import * as cdk from 'aws-cdk-lib'; +import { Construct } from 'constructs'; +import * as ecs from 'aws-cdk-lib/aws-ecs' + +import { Network, EcrRepository, FrontEndCluster, BackEndCluster, Rds, EcsIAM } from './construct'; +// import * as sqs from 'aws-cdk-lib/aws-sqs'; + +export class LangflowAppStack extends cdk.Stack { + constructor(scope: Construct, id: string, props?: cdk.StackProps) { + super(scope, id, props); + // Arch + const arch = ecs.CpuArchitecture.X86_64 + + // VPC + const { vpc, cluster, alb, targetGroup, cloudmapNamespace, ecsFrontSG, ecsBackSG, dbSG, albSG, backendLogGroup, frontendLogGroup} = new Network(this, 'Network') + + // ECR + const { ecrFrontEndRepository,ecrBackEndRepository} = new EcrRepository(this, 'Ecr', { + cloudmapNamespace:cloudmapNamespace, + arch:arch + }) + + // RDS + // VPCとSGのリソース情報をPropsとして引き渡す + const { rdsCluster } = new Rds(this, 'Rds', { vpc, dbSG }) + + // IAM + const { frontendTaskRole, frontendTaskExecutionRole, backendTaskRole, backendTaskExecutionRole } = new EcsIAM(this, 'EcsIAM',{ + rdsCluster:rdsCluster + }) + + const backendService = new BackEndCluster(this, 'backend', { + cluster:cluster, + ecsBackSG:ecsBackSG, + ecrBackEndRepository:ecrBackEndRepository, + backendTaskRole:backendTaskRole, + backendTaskExecutionRole:backendTaskExecutionRole, + backendLogGroup:backendLogGroup, + cloudmapNamespace:cloudmapNamespace, + rdsCluster:rdsCluster, + alb:alb, + arch:arch + }) + backendService.node.addDependency(rdsCluster); + + const frontendService = new FrontEndCluster(this, 'frontend',{ + cluster:cluster, + ecsFrontSG:ecsFrontSG, + ecrFrontEndRepository:ecrFrontEndRepository, + targetGroup: targetGroup, + backendServiceName: backendService.backendServiceName, + frontendTaskRole: frontendTaskRole, + frontendTaskExecutionRole: frontendTaskExecutionRole, + frontendLogGroup: frontendLogGroup, + cloudmapNamespace: cloudmapNamespace, + arch:arch + }) + frontendService.node.addDependency(backendService); + + + // S3+CloudFront + // new Web(this,'Cloudfront-S3') + } +} diff --git a/scripts/cdk/lib/construct/backend.ts b/scripts/cdk/lib/construct/backend.ts new file mode 100644 index 000000000..4ddff1e00 --- /dev/null +++ b/scripts/cdk/lib/construct/backend.ts @@ -0,0 +1,109 @@ +import { Duration } from 'aws-cdk-lib' +import { Construct } from 'constructs'; +import { + aws_ec2 as ec2, + aws_ecs as ecs, + aws_ecr as ecr, + aws_rds as rds, + aws_servicediscovery as servicediscovery, + aws_iam as iam, + aws_logs as logs, + aws_elasticloadbalancingv2 as elb, +} from 'aws-cdk-lib'; +import * as dotenv from 'dotenv'; +const path = require('path'); +dotenv.config({path: path.join(__dirname, "../../.env")}); + +console.log(process.env.LANGFLOW_AUTO_LOGIN); +console.log(process.env.LANGFLOW_SUPERUSER); +console.log(process.env.LANGFLOW_SUPERUSER_PASSWORD); + +interface BackEndProps { + cluster: ecs.Cluster + ecsBackSG:ec2.SecurityGroup + ecrBackEndRepository:ecr.Repository + backendTaskRole: iam.Role; + backendTaskExecutionRole: iam.Role; + backendLogGroup: logs.LogGroup; + cloudmapNamespace: servicediscovery.PrivateDnsNamespace; + rdsCluster:rds.DatabaseCluster + alb:elb.IApplicationLoadBalancer + arch:ecs.CpuArchitecture +} + +export class BackEndCluster extends Construct { + readonly backendServiceName: string + + constructor(scope: Construct, id: string, props:BackEndProps) { + super(scope, id) + const containerPort = 7860 + // Secrets ManagerからDB認証情報を取ってくる + const secretsDB = props.rdsCluster.secret!; + + // Create Backend Fargate Service + const backendTaskDefinition = new ecs.FargateTaskDefinition( + this, + 'BackEndTaskDef', + { + memoryLimitMiB: 3072, + cpu: 1024, + executionRole: props.backendTaskExecutionRole, + runtimePlatform:{ + operatingSystemFamily: ecs.OperatingSystemFamily.LINUX, + cpuArchitecture: props.arch, + }, + taskRole: props.backendTaskRole, + } + ); + backendTaskDefinition.addContainer('backendContainer', { + image: ecs.ContainerImage.fromEcrRepository(props.ecrBackEndRepository, "latest"), + containerName:'langflow-back-container', + logging: ecs.LogDriver.awsLogs({ + streamPrefix: 'my-stream', + logGroup: props.backendLogGroup, + }), + environment:{ + // user:pass@endpoint:port/dbname + // "LANGFLOW_DATABASE_URL" : `mysql+pymysql://${username}:${password}@${host}:3306/${dbname}`, + // "LANGFLOW_DATABASE_URL" : "sqlite:///./langflow.db", + // "LANGFLOW_LANGCHAIN_CACHE" : "SQLiteCache", + // "LANGFLOW_AUTO_LOGIN" : "false", + // "LANGFLOW_SUPERUSER" : "admin", + // "LANGFLOW_SUPERUSER_PASSWORD" : "1234567" + "LANGFLOW_AUTO_LOGIN" : process.env.LANGFLOW_AUTO_LOGIN ?? 'false', + "LANGFLOW_SUPERUSER" : process.env.LANGFLOW_SUPERUSER ?? "admin", + "LANGFLOW_SUPERUSER_PASSWORD" : process.env.LANGFLOW_SUPERUSER_PASSWORD ?? "123456" + }, + portMappings: [ + { + containerPort: containerPort, + protocol: ecs.Protocol.TCP, + }, + ], + // Secretの設定 + secrets: { + "dbname": ecs.Secret.fromSecretsManager(secretsDB, 'dbname'), + "username": ecs.Secret.fromSecretsManager(secretsDB, 'username'), + "host": ecs.Secret.fromSecretsManager(secretsDB, 'host'), + "password": ecs.Secret.fromSecretsManager(secretsDB, 'password'), + }, + }); + this.backendServiceName = 'backend' + const backendService = new ecs.FargateService(this, 'BackEndService', { + cluster: props.cluster, + serviceName: this.backendServiceName, + taskDefinition: backendTaskDefinition, + enableExecuteCommand: true, + securityGroups: [props.ecsBackSG], + cloudMapOptions: { + cloudMapNamespace: props.cloudmapNamespace, + containerPort: containerPort, + dnsRecordType: servicediscovery.DnsRecordType.A, + dnsTtl: Duration.seconds(10), + name: this.backendServiceName + }, + vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS }, + }); + + } +} \ No newline at end of file diff --git a/scripts/cdk/lib/construct/db.ts b/scripts/cdk/lib/construct/db.ts new file mode 100644 index 000000000..8be1f5212 --- /dev/null +++ b/scripts/cdk/lib/construct/db.ts @@ -0,0 +1,64 @@ +import { Construct } from 'constructs'; +import * as ec2 from 'aws-cdk-lib/aws-ec2' +import * as rds from "aws-cdk-lib/aws-rds"; + +interface RdsProps { + vpc: ec2.Vpc + dbSG:ec2.SecurityGroup +} + +export class Rds extends Construct{ + readonly rdsCluster: rds.DatabaseCluster + + constructor(scope: Construct, id:string, props: RdsProps){ + super(scope, id); + + const {vpc, dbSG} = props + const instanceType = ec2.InstanceType.of(ec2.InstanceClass.BURSTABLE4_GRAVITON, ec2.InstanceSize.MEDIUM) + + // RDSのパスワードを自動生成してSecrets Managerに格納 + const rdsCredentials = rds.Credentials.fromGeneratedSecret('db_user',{ + secretName: 'langflow-DbSecret', + }) + + // DB クラスターのパラメータグループ作成 + const clusterParameterGroup = new rds.ParameterGroup(scope, 'ClusterParameterGroup',{ + engine: rds.DatabaseClusterEngine.auroraMysql({ + version: rds.AuroraMysqlEngineVersion.VER_3_02_0 + }), + description: 'for-langflow', + }) + clusterParameterGroup.bindToCluster({}) + + // DB インスタンスのパラメタグループ作成 + const instanceParameterGroup = new rds.ParameterGroup(scope, 'InstanceParameterGroup',{ + engine: rds.DatabaseClusterEngine.auroraMysql({ + version: rds.AuroraMysqlEngineVersion.VER_3_02_0, + }), + description: 'for-langflow', + }) + instanceParameterGroup.bindToInstance({}) + + this.rdsCluster = new rds.DatabaseCluster(scope, 'LangflowDbCluster', { + engine: rds.DatabaseClusterEngine.auroraMysql({ + version: rds.AuroraMysqlEngineVersion.VER_3_02_0, + }), + storageEncrypted: true, + credentials: rdsCredentials, + instanceIdentifierBase: 'langflow-instance', + vpc:vpc, + vpcSubnets:vpc.selectSubnets({ + subnetGroupName: 'langflow-Isolated', + }), + securityGroups:[dbSG], + writer: rds.ClusterInstance.provisioned("WriterInstance", { + instanceType: instanceType, + enablePerformanceInsights: true, + parameterGroup:instanceParameterGroup, + }), + // 2台目以降はreaders:で設定 + parameterGroup: clusterParameterGroup, + defaultDatabaseName: 'langflow', + }) + } +} diff --git a/scripts/cdk/lib/construct/ecr.ts b/scripts/cdk/lib/construct/ecr.ts new file mode 100644 index 000000000..2ff25f9e9 --- /dev/null +++ b/scripts/cdk/lib/construct/ecr.ts @@ -0,0 +1,78 @@ +import { RemovalPolicy } from 'aws-cdk-lib' +import * as ecr from 'aws-cdk-lib/aws-ecr' +import * as ecrdeploy from 'cdk-ecr-deployment' +import * as ecs from 'aws-cdk-lib/aws-ecs' +import * as servicediscovery from 'aws-cdk-lib/aws-servicediscovery' +import { DockerImageAsset, Platform } from 'aws-cdk-lib/aws-ecr-assets' +import * as path from "path"; +import { Construct } from 'constructs' + + +interface ECRProps { + cloudmapNamespace: servicediscovery.PrivateDnsNamespace; + arch:ecs.CpuArchitecture; +} + +export class EcrRepository extends Construct { + readonly ecrFrontEndRepository: ecr.Repository + readonly ecrBackEndRepository: ecr.Repository + + constructor(scope: Construct, id: string, props: ECRProps) { + super(scope, id) + + const imagePlatform = props.arch == ecs.CpuArchitecture.ARM64 ? Platform.LINUX_ARM64 : Platform.LINUX_AMD64 + const backendPath = path.join(__dirname, "../../../../../", "langflow") + const frontendPath = path.join(__dirname, "../../../../src/", "frontend") + const excludeDir = ['node_modules','.git', 'cdk.out'] + const LifecycleRule = { + tagStatus: ecr.TagStatus.ANY, + description: 'Delete more than 30 image', + maxImageCount: 30, + } + + // リポジトリ作成 + this.ecrFrontEndRepository = new ecr.Repository(scope, 'LangflowFrontEndRepository', { + repositoryName: 'langflow-frontend-repository', + removalPolicy: RemovalPolicy.RETAIN, + imageScanOnPush: true, + }) + this.ecrBackEndRepository = new ecr.Repository(scope, 'LangflowBackEndRepository', { + repositoryName: 'langflow-backend-repository', + removalPolicy: RemovalPolicy.RETAIN, + imageScanOnPush: true, + }) + // LifecycleRule作成 + this.ecrFrontEndRepository.addLifecycleRule(LifecycleRule) + this.ecrBackEndRepository.addLifecycleRule(LifecycleRule) + + // Create Docker Image Asset + const dockerFrontEndImageAsset = new DockerImageAsset(this, "DockerFrontEndImageAsset", { + directory: frontendPath, + file:"dev.Dockerfile", + buildArgs:{ + "BACKEND_URL":`http://backend.${props.cloudmapNamespace.namespaceName}:7860` + }, + exclude: excludeDir, + platform: imagePlatform, + }); + const dockerBackEndImageAsset = new DockerImageAsset(this, "DockerBackEndImageAsset", { + directory: backendPath, + file:"dev.Dockerfile", + exclude: excludeDir, + platform: imagePlatform, + }); + + // Deploy Docker Image to ECR Repository + new ecrdeploy.ECRDeployment(this, "DeployFrontEndImage", { + src: new ecrdeploy.DockerImageName(dockerFrontEndImageAsset.imageUri), + dest: new ecrdeploy.DockerImageName(this.ecrFrontEndRepository.repositoryUri) + }); + + // Deploy Docker Image to ECR Repository + new ecrdeploy.ECRDeployment(this, "DeployBackEndImage", { + src: new ecrdeploy.DockerImageName(dockerBackEndImageAsset.imageUri), + dest: new ecrdeploy.DockerImageName(this.ecrBackEndRepository.repositoryUri) + }); + + } +} diff --git a/scripts/cdk/lib/construct/frontend.ts b/scripts/cdk/lib/construct/frontend.ts new file mode 100644 index 000000000..8238ed135 --- /dev/null +++ b/scripts/cdk/lib/construct/frontend.ts @@ -0,0 +1,117 @@ +import { Duration } from 'aws-cdk-lib' +import { Construct } from 'constructs' +import { + aws_ec2 as ec2, + aws_ecs as ecs, + aws_ecr as ecr, + aws_servicediscovery as servicediscovery, + aws_iam as iam, + aws_logs as logs, + aws_elasticloadbalancingv2 as elb, +} from 'aws-cdk-lib'; +import { CpuArchitecture } from 'aws-cdk-lib/aws-ecs'; + +interface FrontEndProps { + cluster:ecs.Cluster + ecsFrontSG:ec2.SecurityGroup + ecrFrontEndRepository:ecr.Repository + targetGroup: elb.ApplicationTargetGroup; + backendServiceName: string; + frontendTaskRole: iam.Role; + frontendTaskExecutionRole: iam.Role; + frontendLogGroup: logs.LogGroup; + cloudmapNamespace: servicediscovery.PrivateDnsNamespace; + arch:ecs.CpuArchitecture; +} + +export class FrontEndCluster extends Construct { + constructor(scope: Construct, id: string, props:FrontEndProps) { + super(scope, id) + + const containerPort = 3000 + const frontendTaskDefinition = new ecs.FargateTaskDefinition( + this, + 'FrontendTaskDef', + { + memoryLimitMiB: 3072, + cpu: 1024, + executionRole: props.frontendTaskExecutionRole, + runtimePlatform:{ + operatingSystemFamily: ecs.OperatingSystemFamily.LINUX, + cpuArchitecture: props.arch, + }, + taskRole: props.frontendTaskRole, + } + ); + const frontendServiceName = 'frontend' + frontendTaskDefinition.addContainer('frontendContainer', { + image: ecs.ContainerImage.fromEcrRepository(props.ecrFrontEndRepository, "latest"), + containerName:'langflow-front-container', + environment: { + BACKEND_SERVICE_NAME: props.backendServiceName, + BACKEND_URL: `http://${props.backendServiceName}.${props.cloudmapNamespace.namespaceName}:7860/`, + VITE_PROXY_TARGET: `http://${props.backendServiceName}.${props.cloudmapNamespace.namespaceName}:7860/`, + }, + logging: ecs.LogDriver.awsLogs({ + streamPrefix: 'my-stream', + logGroup: props.frontendLogGroup, + }), + portMappings: [ + { + name:frontendServiceName, + containerPort: containerPort, + protocol: ecs.Protocol.TCP, + appProtocol:ecs.AppProtocol.http, + }, + ], + }); + const frontendService = new ecs.FargateService( + this, + 'FrontendService', + { + serviceName: frontendServiceName, + cluster: props.cluster, + desiredCount: 1, + assignPublicIp: false, + taskDefinition: frontendTaskDefinition, + enableExecuteCommand: true, + securityGroups: [props.ecsFrontSG], + cloudMapOptions: { + cloudMapNamespace: props.cloudmapNamespace, + containerPort: containerPort, + dnsRecordType: servicediscovery.DnsRecordType.A, + dnsTtl: Duration.seconds(10), + name: frontendServiceName + }, + healthCheckGracePeriod: Duration.seconds(1000), + } + ); + + props.targetGroup.addTarget(frontendService); + + // // Create ALB and ECS Fargate Service + // const frontService = new ecs_patterns.ApplicationLoadBalancedFargateService( + // this, + // "FrontEndService", + // { + // cluster: cluster, + // serviceName: 'langflow-frontend-service', + // cpu: 256, + // memoryLimitMiB: 512, + // listenerPort: 80, + // assignPublicIp: true, // Public facing - ALB + // taskSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS }, + // securityGroups:[ecsFrontSG], + // taskImageOptions: { + // family: 'langflow-taskdef', + // containerName: 'langflow-front-container', + // image: ecs.ContainerImage.fromEcrRepository(ecrFrontEndRepository, "latest"), + // containerPort: 3000, // L2なので、TargetGroupのportが3000で設定されるはず + // }, + // loadBalancer:alb, + // openListener:false, + // } + // ); + + } +} \ No newline at end of file diff --git a/scripts/cdk/lib/construct/iam.ts b/scripts/cdk/lib/construct/iam.ts new file mode 100644 index 000000000..0a40cf340 --- /dev/null +++ b/scripts/cdk/lib/construct/iam.ts @@ -0,0 +1,101 @@ +import { RemovalPolicy, Duration } from 'aws-cdk-lib' +import { Construct } from 'constructs' +import { + aws_rds as rds, + aws_iam as iam, +} from 'aws-cdk-lib'; + +interface IAMProps { + rdsCluster:rds.DatabaseCluster +} + +export class EcsIAM extends Construct { + readonly frontendTaskRole: iam.Role; + readonly frontendTaskExecutionRole: iam.Role; + readonly backendTaskRole: iam.Role; + readonly backendTaskExecutionRole: iam.Role; + + constructor(scope: Construct, id: string, props:IAMProps) { + super(scope, id) + + // Policy Statements + // ECS Policy State + const ECSExecPolicyStatement = new iam.PolicyStatement({ + sid: 'allowECSExec', + resources: ['*'], + actions: [ + 'ecr:GetAuthorizationToken', + 'ecr:BatchCheckLayerAvailability', + 'ecr:GetDownloadUrlForLayer', + 'ecr:BatchGetImage', + ], + }); + // Bedrock Policy State + const BedrockPolicyStatement = new iam.PolicyStatement({ + sid: 'allowBedrockAccess', + resources: ['*'], + actions: [ + 'bedrock:*', + ], + }); + // Kendra Policy State + const KendraPolicyStatement = new iam.PolicyStatement({ + sid: 'allowKendraAccess', + resources: ['*'], + actions: [ + 'kendra:*' + ], + }); + // Create Rag Policy + const RagAccessPolicy = new iam.Policy(this, 'RAGFullAccess', { + statements: [KendraPolicyStatement,BedrockPolicyStatement], + }) + // Secrets ManagerからDB認証情報を取ってくるためのPolicy + const SecretsManagerPolicy = new iam.Policy(this, 'SMGetPolicy', { + statements: [new iam.PolicyStatement({ + actions: ['secretsmanager:GetSecretValue'], + resources: [props.rdsCluster.secret!.secretArn], + })], + }) + + // FrontEnd Task Role + this.frontendTaskRole = new iam.Role(this, 'FrontendTaskRole', { + assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), + }); + this.frontendTaskRole.addToPolicy(ECSExecPolicyStatement); + + // BackEnd Task Role + this.backendTaskRole = new iam.Role(this, 'BackendTaskRole', { + assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), + }); + // ECS Exec Policyの付与 + this.backendTaskRole.addToPolicy(ECSExecPolicyStatement); + // KendraとBedrockのアクセス権付与 + this.backendTaskRole.attachInlinePolicy(RagAccessPolicy); + + // FrontEnd Task ExecutionRole + this.frontendTaskExecutionRole = new iam.Role(this, 'frontendTaskExecutionRole', { + assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), + managedPolicies: [ + { + managedPolicyArn: + 'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy', + }, + ], + }); + + // BackEnd Task ExecutionRole + this.backendTaskExecutionRole = new iam.Role(this, 'backendTaskExecutionRole', { + assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'), + managedPolicies: [ + { + managedPolicyArn: + 'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy', + }, + ], + }); + + this.backendTaskExecutionRole.attachInlinePolicy(SecretsManagerPolicy); + this.backendTaskExecutionRole.attachInlinePolicy(RagAccessPolicy); + } +} \ No newline at end of file diff --git a/scripts/cdk/lib/construct/index.ts b/scripts/cdk/lib/construct/index.ts new file mode 100644 index 000000000..8c2efcb1b --- /dev/null +++ b/scripts/cdk/lib/construct/index.ts @@ -0,0 +1,6 @@ +export * from './db'; +export * from './ecr'; +export * from './iam'; +export * from './frontend'; +export * from './backend'; +export * from './network'; \ No newline at end of file diff --git a/scripts/cdk/lib/construct/network.ts b/scripts/cdk/lib/construct/network.ts new file mode 100644 index 000000000..aa9e48dc5 --- /dev/null +++ b/scripts/cdk/lib/construct/network.ts @@ -0,0 +1,139 @@ +import { RemovalPolicy, Duration } from 'aws-cdk-lib' +import { Construct } from 'constructs' +import { + aws_ec2 as ec2, + aws_ecs as ecs, + aws_logs as logs, + aws_servicediscovery as servicediscovery, + aws_elasticloadbalancingv2 as elb, +} from 'aws-cdk-lib'; + +export class Network extends Construct { + readonly vpc: ec2.Vpc; + readonly cluster: ecs.Cluster; + readonly alb: elb.IApplicationLoadBalancer; + readonly targetGroup: elb.ApplicationTargetGroup; + readonly cloudmapNamespace: servicediscovery.PrivateDnsNamespace; + readonly ecsFrontSG: ec2.SecurityGroup; + readonly ecsBackSG: ec2.SecurityGroup; + readonly dbSG: ec2.SecurityGroup; + readonly albSG: ec2.SecurityGroup; + readonly backendLogGroup: logs.LogGroup; + readonly frontendLogGroup: logs.LogGroup; + + constructor(scope: Construct, id: string) { + super(scope, id) + const alb_listen_port=80 + const front_service_port=3000 + const back_service_port=7860 + + // VPC等リソースの作成 + this.vpc = new ec2.Vpc(scope, 'VPC', { + vpcName: 'langflow-vpc', + ipAddresses: ec2.IpAddresses.cidr('10.0.0.0/16'), + maxAzs: 3, + subnetConfiguration: [ + { + cidrMask: 24, + name: 'langflow-Isolated', + subnetType: ec2.SubnetType.PRIVATE_ISOLATED, + }, + { + cidrMask: 24, + name: 'langflow-Public', + subnetType: ec2.SubnetType.PUBLIC, + }, + { + cidrMask: 24, + name: 'langflow-Private', + subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS + }, + ], + natGateways: 1, + }) + // Cluster + this.cluster = new ecs.Cluster(this, 'EcsCluster', { + clusterName: 'langflow-cluster', + vpc: this.vpc, + enableFargateCapacityProviders: true, + }); + + // Private DNS + this.cloudmapNamespace = new servicediscovery.PrivateDnsNamespace( + this, + 'Namespace', + { + name: 'ecs-deploy.com', + vpc: this.vpc, + } + ); + + // ALBに設定するセキュリティグループ + this.albSG = new ec2.SecurityGroup(scope, 'ALBSecurityGroup', { + securityGroupName: 'alb-sg', + description: 'for alb', + vpc: this.vpc, + }) + this.albSG.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(alb_listen_port)) + + this.alb = new elb.ApplicationLoadBalancer(this,'alb',{ + internetFacing: true, //インターネットからのアクセスを許可するかどうか指定 + loadBalancerName: 'alb', + securityGroup: this.albSG, //作成したセキュリティグループを割り当てる + vpc:this.vpc, + }) + + const listener = this.alb.addListener('Listener', { port: alb_listen_port }); + + this.targetGroup = listener.addTargets('targetGroup', { + port: front_service_port, + protocol: elb.ApplicationProtocol.HTTP, + healthCheck: { + enabled: true, + path: '/health', + healthyThresholdCount: 2, + unhealthyThresholdCount: 4, + interval: Duration.seconds(100), + timeout: Duration.seconds(30), + healthyHttpCodes: '200', + }, + }); + + // ECS FrontEndに設定するセキュリティグループ + this.ecsFrontSG = new ec2.SecurityGroup(scope, 'ECSFrontEndSecurityGroup', { + securityGroupName: 'langflow-ecs-front-sg', + description: 'for langflow-front-ecs', + vpc: this.vpc, + }) + this.ecsFrontSG.addIngressRule(this.albSG, ec2.Port.allTcp()) + + // ECS BackEndに設定するセキュリティグループ + this.ecsBackSG = new ec2.SecurityGroup(scope, 'ECSBackEndSecurityGroup', { + securityGroupName: 'langflow-ecs-back-sg', + description: 'for langflow-back-ecs', + vpc: this.vpc, + }) + this.ecsBackSG.addIngressRule(this.ecsFrontSG, ec2.Port.tcp(back_service_port)) + + // RDSに設定するセキュリティグループ + this.dbSG = new ec2.SecurityGroup(scope, 'DBSecurityGroup', { + allowAllOutbound: true, + securityGroupName: 'langflow-db', + description: 'for langflow-db', + vpc: this.vpc, + }) + // AppRunnerSecurityGroupからのポート3306:mysql(5432:postgres)のインバウンドを許可 + this.dbSG.addIngressRule(this.ecsBackSG, ec2.Port.tcp(3306)) + + // Create CloudWatch Log Group + this.backendLogGroup = new logs.LogGroup(this, 'backendLogGroup', { + logGroupName: 'myapp-backend', + removalPolicy: RemovalPolicy.DESTROY, + }); + + this.frontendLogGroup = new logs.LogGroup(this, 'frontendLogGroup', { + logGroupName: 'myapp-frontend', + removalPolicy: RemovalPolicy.DESTROY, + }); + } +} \ No newline at end of file diff --git a/scripts/cdk/package-lock.json b/scripts/cdk/package-lock.json new file mode 100644 index 000000000..e5b70161b --- /dev/null +++ b/scripts/cdk/package-lock.json @@ -0,0 +1,4601 @@ +{ + "name": "cdk", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "cdk", + "version": "0.1.0", + "dependencies": { + "aws-cdk-lib": "^2.86.0", + "cdk-ecr-deployment": "^2.5.30", + "constructs": "^10.0.0", + "source-map-support": "^0.5.21" + }, + "bin": { + "cdk": "bin/cdk.js" + }, + "devDependencies": { + "@types/jest": "^29.5.1", + "@types/node": "20.1.7", + "aws-cdk": "2.86.0", + "jest": "^29.5.0", + "ts-jest": "^29.1.0", + "ts-node": "^10.9.1", + "typescript": "~5.1.3" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@aws-cdk/asset-awscli-v1": { + "version": "2.2.201", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.201.tgz", + "integrity": "sha512-INZqcwDinNaIdb5CtW3ez5s943nX5stGBQS6VOP2JDlOFP81hM3fds/9NDknipqfUkZM43dx+HgVvkXYXXARCQ==" + }, + "node_modules/@aws-cdk/asset-kubectl-v20": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-kubectl-v20/-/asset-kubectl-v20-2.1.2.tgz", + "integrity": "sha512-3M2tELJOxQv0apCIiuKQ4pAbncz9GuLwnKFqxifWfe77wuMxyTRPmxssYHs42ePqzap1LT6GDcPygGs+hHstLg==" + }, + "node_modules/@aws-cdk/asset-node-proxy-agent-v5": { + "version": "2.0.166", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v5/-/asset-node-proxy-agent-v5-2.0.166.tgz", + "integrity": "sha512-j0xnccpUQHXJKPgCwQcGGNu4lRiC1PptYfdxBIH1L4dRK91iBxtSQHESRQX+yB47oGLaF/WfNN/aF3WXwlhikg==" + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", + "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", + "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", + "dev": true, + "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", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", + "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.3", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, + "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" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", + "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz", + "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.3", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.3", + "@babel/types": "^7.23.3", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", + "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.4.tgz", + "integrity": "sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.7", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", + "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", + "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.8", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.8.tgz", + "integrity": "sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/node": { + "version": "20.1.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.7.tgz", + "integrity": "sha512-WCuw/o4GSwDGMoonES8rcvwsig77dGCMbZDrZr2x4ZZiNW4P/gcoZXe/0twgtobcTkmg9TuKflxYL/DuwDyJzg==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "17.0.31", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", + "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", + "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aws-cdk": { + "version": "2.86.0", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.86.0.tgz", + "integrity": "sha512-GRcdU6p00Zu3fIZYPG+EbpDYppYMtzebuf0jrmCfKhCytRGaPWDHHfu3hrv0de4d0zbUD/+AmiODPMu3J6nXbQ==", + "dev": true, + "bin": { + "cdk": "bin/cdk" + }, + "engines": { + "node": ">= 14.15.0" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/aws-cdk-lib": { + "version": "2.86.0", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.86.0.tgz", + "integrity": "sha512-76yZ2MawAGXLD3ox4FjhUIPmAMXteGKkeo3tPMthemusDCCkD2X6DBssXBHjB7r9GnrOMMf8JH5BGq2lOZ539g==", + "bundleDependencies": [ + "@balena/dockerignore", + "case", + "fs-extra", + "ignore", + "jsonschema", + "minimatch", + "punycode", + "semver", + "table", + "yaml" + ], + "dependencies": { + "@aws-cdk/asset-awscli-v1": "^2.2.177", + "@aws-cdk/asset-kubectl-v20": "^2.1.1", + "@aws-cdk/asset-node-proxy-agent-v5": "^2.0.148", + "@balena/dockerignore": "^1.0.2", + "case": "1.6.3", + "fs-extra": "^11.1.1", + "ignore": "^5.2.4", + "jsonschema": "^1.4.1", + "minimatch": "^3.1.2", + "punycode": "^2.3.0", + "semver": "^7.5.1", + "table": "^6.8.1", + "yaml": "1.10.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "constructs": "^10.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/@balena/dockerignore": { + "version": "1.0.2", + "inBundle": true, + "license": "Apache-2.0" + }, + "node_modules/aws-cdk-lib/node_modules/ajv": { + "version": "8.12.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/aws-cdk-lib/node_modules/ansi-regex": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/ansi-styles": { + "version": "4.3.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/aws-cdk-lib/node_modules/astral-regex": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/balanced-match": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/brace-expansion": { + "version": "1.1.11", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/aws-cdk-lib/node_modules/case": { + "version": "1.6.3", + "inBundle": true, + "license": "(MIT OR GPL-3.0-or-later)", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/color-convert": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/color-name": { + "version": "1.1.4", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/concat-map": { + "version": "0.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/emoji-regex": { + "version": "8.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/fast-deep-equal": { + "version": "3.1.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/fs-extra": { + "version": "11.1.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/aws-cdk-lib/node_modules/graceful-fs": { + "version": "4.2.11", + "inBundle": true, + "license": "ISC" + }, + "node_modules/aws-cdk-lib/node_modules/ignore": { + "version": "5.2.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/aws-cdk-lib/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/json-schema-traverse": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/jsonfile": { + "version": "6.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/aws-cdk-lib/node_modules/jsonschema": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/aws-cdk-lib/node_modules/lodash.truncate": { + "version": "4.4.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aws-cdk-lib/node_modules/minimatch": { + "version": "3.1.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/aws-cdk-lib/node_modules/punycode": { + "version": "2.3.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/aws-cdk-lib/node_modules/require-from-string": { + "version": "2.0.2", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/semver": { + "version": "7.5.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aws-cdk-lib/node_modules/slice-ansi": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/aws-cdk-lib/node_modules/string-width": { + "version": "4.2.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/strip-ansi": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/table": { + "version": "6.8.1", + "inBundle": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/universalify": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/uri-js": { + "version": "4.4.1", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/aws-cdk-lib/node_modules/yaml": { + "version": "1.10.2", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001561", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz", + "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/cdk-ecr-deployment": { + "version": "2.5.30", + "resolved": "https://registry.npmjs.org/cdk-ecr-deployment/-/cdk-ecr-deployment-2.5.30.tgz", + "integrity": "sha512-IFS/DD6OmNcXv24YKjjaz1sb04xxsoUb7vPYwx7kTBAOxOnT0CuAadF8/HVfM/YVoqoOPXCJe3ikAXy1iI0nKw==", + "bundleDependencies": [ + "got", + "hpagent" + ], + "dependencies": { + "aws-cdk-lib": "^2.0.0", + "constructs": "^10.0.5", + "got": "^11.8.6", + "hpagent": "^0.1.2" + }, + "peerDependencies": { + "aws-cdk-lib": "^2.0.0", + "constructs": "^10.0.5" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/@sindresorhus/is": { + "version": "4.6.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "inBundle": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/@types/cacheable-request": { + "version": "6.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/@types/cacheable-request/node_modules/@types/node": { + "version": "20.3.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdk-ecr-deployment/node_modules/@types/http-cache-semantics": { + "version": "4.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdk-ecr-deployment/node_modules/@types/keyv": { + "version": "3.1.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/@types/keyv/node_modules/@types/node": { + "version": "20.3.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdk-ecr-deployment/node_modules/@types/responselike": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/@types/responselike/node_modules/@types/node": { + "version": "20.3.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdk-ecr-deployment/node_modules/cacheable-lookup": { + "version": "5.0.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/cacheable-request": { + "version": "7.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/clone-response": { + "version": "1.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/clone-response/node_modules/mimic-response": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/decompress-response": { + "version": "6.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/defer-to-connect": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/end-of-stream": { + "version": "1.4.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/got": { + "version": "11.8.6", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/hpagent": { + "version": "0.1.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdk-ecr-deployment/node_modules/http-cache-semantics": { + "version": "4.1.1", + "inBundle": true, + "license": "BSD-2-Clause" + }, + "node_modules/cdk-ecr-deployment/node_modules/http2-wrapper": { + "version": "1.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/json-buffer": { + "version": "3.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdk-ecr-deployment/node_modules/keyv": { + "version": "4.5.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/lowercase-keys": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/mimic-response": { + "version": "3.1.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/normalize-url": { + "version": "6.1.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/once": { + "version": "1.4.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/p-cancelable": { + "version": "2.1.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/pump": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/quick-lru": { + "version": "5.1.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/resolve-alpn": { + "version": "1.2.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/cdk-ecr-deployment/node_modules/responselike": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cdk-ecr-deployment/node_modules/wrappy": { + "version": "1.0.2", + "inBundle": true, + "license": "ISC" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/constructs": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.3.0.tgz", + "integrity": "sha512-vbK8i3rIb/xwZxSpTjz3SagHn1qq9BChLEfy5Hf6fB3/2eFbrwt2n9kHwQcS0CPTRBesreeAcsJfMq2229FnbQ==", + "engines": { + "node": ">= 16.14.0" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.580", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.580.tgz", + "integrity": "sha512-T5q3pjQon853xxxHUq3ZP68ZpvJHuSMY2+BZaW3QzjS4HvNuvsMmZ/+lU+nCrftre1jFZ+OSlExynXWBihnXzw==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", + "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "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" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pure-rand": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", + "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-jest": { + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", + "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "^7.5.3", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz", + "integrity": "sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/scripts/cdk/package.json b/scripts/cdk/package.json new file mode 100644 index 000000000..05ef554d9 --- /dev/null +++ b/scripts/cdk/package.json @@ -0,0 +1,28 @@ +{ + "name": "cdk", + "version": "0.1.0", + "bin": { + "cdk": "bin/cdk.js" + }, + "scripts": { + "build": "tsc", + "watch": "tsc -w", + "test": "jest", + "cdk": "cdk" + }, + "devDependencies": { + "@types/jest": "^29.5.1", + "@types/node": "20.1.7", + "aws-cdk": "2.86.0", + "jest": "^29.5.0", + "ts-jest": "^29.1.0", + "ts-node": "^10.9.1", + "typescript": "~5.1.3" + }, + "dependencies": { + "aws-cdk-lib": "^2.86.0", + "cdk-ecr-deployment": "^2.5.30", + "constructs": "^10.0.0", + "source-map-support": "^0.5.21" + } +} diff --git a/scripts/cdk/test/cdk.test.ts b/scripts/cdk/test/cdk.test.ts new file mode 100644 index 000000000..1e6b29c85 --- /dev/null +++ b/scripts/cdk/test/cdk.test.ts @@ -0,0 +1,17 @@ +// import * as cdk from 'aws-cdk-lib'; +// import { Template } from 'aws-cdk-lib/assertions'; +// import * as Cdk from '../lib/cdk-stack'; + +// example test. To run these tests, uncomment this file along with the +// example resource in lib/cdk-stack.ts +test('SQS Queue Created', () => { +// const app = new cdk.App(); +// // WHEN +// const stack = new Cdk.CdkStack(app, 'MyTestStack'); +// // THEN +// const template = Template.fromStack(stack); + +// template.hasResourceProperties('AWS::SQS::Queue', { +// VisibilityTimeout: 300 +// }); +}); diff --git a/src/frontend/Dockerfile b/src/frontend/Dockerfile index 0b33e09b8..024eab562 100644 --- a/src/frontend/Dockerfile +++ b/src/frontend/Dockerfile @@ -1,26 +1,16 @@ -#baseline -FROM --platform=linux/amd64 node:19-bullseye-slim AS base -RUN mkdir -p /home/node/app -RUN chown -R node:node /home/node && chmod -R 770 /home/node -RUN apt-get update && apt-get install -y jq curl -WORKDIR /home/node/app - -# client build -FROM base AS builder-client +FROM node:20-alpine as frontend_build ARG BACKEND_URL -ENV BACKEND_URL $BACKEND_URL -RUN echo "BACKEND_URL: $BACKEND_URL" +WORKDIR /app -WORKDIR /home/node/app -COPY --chown=node:node . ./ +COPY ./package.json ./package-lock.json ./tsconfig.json ./vite.config.ts ./index.html ./tailwind.config.js ./postcss.config.js ./prettier.config.js /app/ +RUN npm install +COPY ./src /app/src +RUN npm run build -COPY ./set_proxy.sh . -RUN chmod +x set_proxy.sh && \ - cat set_proxy.sh | tr -d '\r' > set_proxy_unix.sh && \ - chmod +x set_proxy_unix.sh && \ - ./set_proxy_unix.sh - -USER node - -RUN npm install --loglevel warn -CMD ["npm", "run", "dev:docker"] \ No newline at end of file +FROM nginx +COPY --from=frontend_build /app/build/ /usr/share/nginx/html +COPY /nginx.conf /etc/nginx/conf.d/default.conf +COPY start-nginx.sh /start-nginx.sh +RUN chmod +x /start-nginx.sh +ENV BACKEND_URL=$BACKEND_URL +CMD ["/start-nginx.sh"] \ No newline at end of file diff --git a/src/frontend/dev.Dockerfile b/src/frontend/dev.Dockerfile new file mode 100644 index 000000000..0b33e09b8 --- /dev/null +++ b/src/frontend/dev.Dockerfile @@ -0,0 +1,26 @@ +#baseline +FROM --platform=linux/amd64 node:19-bullseye-slim AS base +RUN mkdir -p /home/node/app +RUN chown -R node:node /home/node && chmod -R 770 /home/node +RUN apt-get update && apt-get install -y jq curl +WORKDIR /home/node/app + +# client build +FROM base AS builder-client +ARG BACKEND_URL +ENV BACKEND_URL $BACKEND_URL +RUN echo "BACKEND_URL: $BACKEND_URL" + +WORKDIR /home/node/app +COPY --chown=node:node . ./ + +COPY ./set_proxy.sh . +RUN chmod +x set_proxy.sh && \ + cat set_proxy.sh | tr -d '\r' > set_proxy_unix.sh && \ + chmod +x set_proxy_unix.sh && \ + ./set_proxy_unix.sh + +USER node + +RUN npm install --loglevel warn +CMD ["npm", "run", "dev:docker"] \ No newline at end of file diff --git a/src/frontend/prod.Dockerfile b/src/frontend/prod.Dockerfile deleted file mode 100644 index 024eab562..000000000 --- a/src/frontend/prod.Dockerfile +++ /dev/null @@ -1,16 +0,0 @@ -FROM node:20-alpine as frontend_build -ARG BACKEND_URL -WORKDIR /app - -COPY ./package.json ./package-lock.json ./tsconfig.json ./vite.config.ts ./index.html ./tailwind.config.js ./postcss.config.js ./prettier.config.js /app/ -RUN npm install -COPY ./src /app/src -RUN npm run build - -FROM nginx -COPY --from=frontend_build /app/build/ /usr/share/nginx/html -COPY /nginx.conf /etc/nginx/conf.d/default.conf -COPY start-nginx.sh /start-nginx.sh -RUN chmod +x /start-nginx.sh -ENV BACKEND_URL=$BACKEND_URL -CMD ["/start-nginx.sh"] \ No newline at end of file From 0b3abda03bdc619e92fa483652c5d8a023eb1f06 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 30 Nov 2023 16:36:13 +0900 Subject: [PATCH 088/203] modify docker-compose --- docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 50fe44441..81914ee40 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,7 +6,7 @@ services: backend: build: context: ./ - dockerfile: ./Dockerfile + dockerfile: ./dev.Dockerfile env_file: - .env ports: @@ -19,7 +19,7 @@ services: frontend: build: context: ./src/frontend - dockerfile: ./Dockerfile + dockerfile: ./dev.Dockerfile args: - BACKEND_URL=http://backend:7860 environment: From b2b38c9d8181660699d8afb1cf787386963eb713 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 30 Nov 2023 16:47:30 +0900 Subject: [PATCH 089/203] =?UTF-8?q?=E6=9C=AC=E5=AE=B6=E3=81=AE=E8=B8=8F?= =?UTF-8?q?=E8=A5=B2=E3=81=AE=E3=81=9F=E3=82=81=E3=80=81Dockerfile?= =?UTF-8?q?=E3=82=92=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cdk.Dockerfile | 20 ++++++++++++++ dev.Dockerfile | 2 +- scripts/{cdk => aws}/.env.example | 0 scripts/{cdk => aws}/.gitignore | 0 scripts/{cdk => aws}/.npmignore | 0 scripts/{cdk => aws}/README.md | 0 scripts/{cdk => aws}/bin/cdk.ts | 0 scripts/{cdk => aws}/cdk.json | 0 scripts/{cdk => aws}/delete-docker-images.sh | 0 scripts/{cdk => aws}/delete-ecr.sh | 0 scripts/{cdk => aws}/jest.config.js | 0 scripts/{cdk => aws}/lib/cdk-stack.ts | 0 scripts/{cdk => aws}/lib/construct/backend.ts | 0 scripts/{cdk => aws}/lib/construct/db.ts | 0 scripts/{cdk => aws}/lib/construct/ecr.ts | 0 .../{cdk => aws}/lib/construct/frontend.ts | 0 scripts/{cdk => aws}/lib/construct/iam.ts | 0 scripts/{cdk => aws}/lib/construct/index.ts | 0 scripts/{cdk => aws}/lib/construct/network.ts | 0 scripts/{cdk => aws}/package-lock.json | 0 scripts/{cdk => aws}/package.json | 0 scripts/{cdk => aws}/test/cdk.test.ts | 0 src/frontend/cdk.Dockerfile | 26 +++++++++++++++++++ src/frontend/dev.Dockerfile | 4 +-- 24 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 cdk.Dockerfile rename scripts/{cdk => aws}/.env.example (100%) rename scripts/{cdk => aws}/.gitignore (100%) rename scripts/{cdk => aws}/.npmignore (100%) rename scripts/{cdk => aws}/README.md (100%) rename scripts/{cdk => aws}/bin/cdk.ts (100%) rename scripts/{cdk => aws}/cdk.json (100%) rename scripts/{cdk => aws}/delete-docker-images.sh (100%) rename scripts/{cdk => aws}/delete-ecr.sh (100%) rename scripts/{cdk => aws}/jest.config.js (100%) rename scripts/{cdk => aws}/lib/cdk-stack.ts (100%) rename scripts/{cdk => aws}/lib/construct/backend.ts (100%) rename scripts/{cdk => aws}/lib/construct/db.ts (100%) rename scripts/{cdk => aws}/lib/construct/ecr.ts (100%) rename scripts/{cdk => aws}/lib/construct/frontend.ts (100%) rename scripts/{cdk => aws}/lib/construct/iam.ts (100%) rename scripts/{cdk => aws}/lib/construct/index.ts (100%) rename scripts/{cdk => aws}/lib/construct/network.ts (100%) rename scripts/{cdk => aws}/package-lock.json (100%) rename scripts/{cdk => aws}/package.json (100%) rename scripts/{cdk => aws}/test/cdk.test.ts (100%) create mode 100644 src/frontend/cdk.Dockerfile diff --git a/cdk.Dockerfile b/cdk.Dockerfile new file mode 100644 index 000000000..44ccf0acb --- /dev/null +++ b/cdk.Dockerfile @@ -0,0 +1,20 @@ +FROM --platform=linux/amd64 python:3.10-slim + +WORKDIR /app + +# Install Poetry +RUN apt-get update && apt-get install gcc g++ curl build-essential postgresql-server-dev-all -y +RUN curl -sSL https://install.python-poetry.org | python3 - +# # Add Poetry to PATH +ENV PATH="${PATH}:/root/.local/bin" +# # Copy the pyproject.toml and poetry.lock files +COPY poetry.lock pyproject.toml ./ +# Copy the rest of the application codes +COPY ./ ./ + +# Install dependencies +RUN poetry config virtualenvs.create false && poetry install --no-interaction --no-ansi + +RUN poetry add pymysql==1.0.2 + +CMD ["uvicorn", "--factory", "src.backend.langflow.main:create_app", "--host", "0.0.0.0", "--port", "7860", "--reload", "--log-level", "debug"] diff --git a/dev.Dockerfile b/dev.Dockerfile index ce5715e1f..ed3631516 100644 --- a/dev.Dockerfile +++ b/dev.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 python:3.10-slim +FROM python:3.10-slim WORKDIR /app diff --git a/scripts/cdk/.env.example b/scripts/aws/.env.example similarity index 100% rename from scripts/cdk/.env.example rename to scripts/aws/.env.example diff --git a/scripts/cdk/.gitignore b/scripts/aws/.gitignore similarity index 100% rename from scripts/cdk/.gitignore rename to scripts/aws/.gitignore diff --git a/scripts/cdk/.npmignore b/scripts/aws/.npmignore similarity index 100% rename from scripts/cdk/.npmignore rename to scripts/aws/.npmignore diff --git a/scripts/cdk/README.md b/scripts/aws/README.md similarity index 100% rename from scripts/cdk/README.md rename to scripts/aws/README.md diff --git a/scripts/cdk/bin/cdk.ts b/scripts/aws/bin/cdk.ts similarity index 100% rename from scripts/cdk/bin/cdk.ts rename to scripts/aws/bin/cdk.ts diff --git a/scripts/cdk/cdk.json b/scripts/aws/cdk.json similarity index 100% rename from scripts/cdk/cdk.json rename to scripts/aws/cdk.json diff --git a/scripts/cdk/delete-docker-images.sh b/scripts/aws/delete-docker-images.sh similarity index 100% rename from scripts/cdk/delete-docker-images.sh rename to scripts/aws/delete-docker-images.sh diff --git a/scripts/cdk/delete-ecr.sh b/scripts/aws/delete-ecr.sh similarity index 100% rename from scripts/cdk/delete-ecr.sh rename to scripts/aws/delete-ecr.sh diff --git a/scripts/cdk/jest.config.js b/scripts/aws/jest.config.js similarity index 100% rename from scripts/cdk/jest.config.js rename to scripts/aws/jest.config.js diff --git a/scripts/cdk/lib/cdk-stack.ts b/scripts/aws/lib/cdk-stack.ts similarity index 100% rename from scripts/cdk/lib/cdk-stack.ts rename to scripts/aws/lib/cdk-stack.ts diff --git a/scripts/cdk/lib/construct/backend.ts b/scripts/aws/lib/construct/backend.ts similarity index 100% rename from scripts/cdk/lib/construct/backend.ts rename to scripts/aws/lib/construct/backend.ts diff --git a/scripts/cdk/lib/construct/db.ts b/scripts/aws/lib/construct/db.ts similarity index 100% rename from scripts/cdk/lib/construct/db.ts rename to scripts/aws/lib/construct/db.ts diff --git a/scripts/cdk/lib/construct/ecr.ts b/scripts/aws/lib/construct/ecr.ts similarity index 100% rename from scripts/cdk/lib/construct/ecr.ts rename to scripts/aws/lib/construct/ecr.ts diff --git a/scripts/cdk/lib/construct/frontend.ts b/scripts/aws/lib/construct/frontend.ts similarity index 100% rename from scripts/cdk/lib/construct/frontend.ts rename to scripts/aws/lib/construct/frontend.ts diff --git a/scripts/cdk/lib/construct/iam.ts b/scripts/aws/lib/construct/iam.ts similarity index 100% rename from scripts/cdk/lib/construct/iam.ts rename to scripts/aws/lib/construct/iam.ts diff --git a/scripts/cdk/lib/construct/index.ts b/scripts/aws/lib/construct/index.ts similarity index 100% rename from scripts/cdk/lib/construct/index.ts rename to scripts/aws/lib/construct/index.ts diff --git a/scripts/cdk/lib/construct/network.ts b/scripts/aws/lib/construct/network.ts similarity index 100% rename from scripts/cdk/lib/construct/network.ts rename to scripts/aws/lib/construct/network.ts diff --git a/scripts/cdk/package-lock.json b/scripts/aws/package-lock.json similarity index 100% rename from scripts/cdk/package-lock.json rename to scripts/aws/package-lock.json diff --git a/scripts/cdk/package.json b/scripts/aws/package.json similarity index 100% rename from scripts/cdk/package.json rename to scripts/aws/package.json diff --git a/scripts/cdk/test/cdk.test.ts b/scripts/aws/test/cdk.test.ts similarity index 100% rename from scripts/cdk/test/cdk.test.ts rename to scripts/aws/test/cdk.test.ts diff --git a/src/frontend/cdk.Dockerfile b/src/frontend/cdk.Dockerfile new file mode 100644 index 000000000..0b33e09b8 --- /dev/null +++ b/src/frontend/cdk.Dockerfile @@ -0,0 +1,26 @@ +#baseline +FROM --platform=linux/amd64 node:19-bullseye-slim AS base +RUN mkdir -p /home/node/app +RUN chown -R node:node /home/node && chmod -R 770 /home/node +RUN apt-get update && apt-get install -y jq curl +WORKDIR /home/node/app + +# client build +FROM base AS builder-client +ARG BACKEND_URL +ENV BACKEND_URL $BACKEND_URL +RUN echo "BACKEND_URL: $BACKEND_URL" + +WORKDIR /home/node/app +COPY --chown=node:node . ./ + +COPY ./set_proxy.sh . +RUN chmod +x set_proxy.sh && \ + cat set_proxy.sh | tr -d '\r' > set_proxy_unix.sh && \ + chmod +x set_proxy_unix.sh && \ + ./set_proxy_unix.sh + +USER node + +RUN npm install --loglevel warn +CMD ["npm", "run", "dev:docker"] \ No newline at end of file diff --git a/src/frontend/dev.Dockerfile b/src/frontend/dev.Dockerfile index 0b33e09b8..8678b02dd 100644 --- a/src/frontend/dev.Dockerfile +++ b/src/frontend/dev.Dockerfile @@ -1,8 +1,8 @@ #baseline -FROM --platform=linux/amd64 node:19-bullseye-slim AS base +FROM node:19-bullseye-slim AS base RUN mkdir -p /home/node/app RUN chown -R node:node /home/node && chmod -R 770 /home/node -RUN apt-get update && apt-get install -y jq curl +RUN apt-get update && apt-get install -y jq WORKDIR /home/node/app # client build From 2c362764803284cb11ca9a7f122f492410d46283 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 30 Nov 2023 16:52:54 +0900 Subject: [PATCH 090/203] =?UTF-8?q?Dockerfile=E7=AD=89=E3=82=92v0.5.6?= =?UTF-8?q?=E3=81=AE=E3=82=82=E3=81=AE=E3=81=A8=E4=B8=80=E7=B7=92=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 4 ++-- poetry.lock | 64 +------------------------------------------------- pyproject.toml | 1 - 3 files changed, 3 insertions(+), 66 deletions(-) diff --git a/Dockerfile b/Dockerfile index 520c407de..c44426c64 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,5 +11,5 @@ WORKDIR $HOME/app COPY --chown=user . $HOME/app -RUN pip install langflow>==0.0.86 -U --user -CMD ["python", "-m", "langflow", "run", "--host", "0.0.0.0", "--port", "7860"] +RUN pip install langflow>==0.5.0 -U --user +CMD ["python", "-m", "langflow", "run", "--host", "0.0.0.0", "--port", "7860"] \ No newline at end of file diff --git a/poetry.lock b/poetry.lock index 7d3a7ec01..d5a555874 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3736,13 +3736,10 @@ files = [ {file = "lxml-4.9.3-cp27-cp27m-macosx_11_0_x86_64.whl", hash = "sha256:b0a545b46b526d418eb91754565ba5b63b1c0b12f9bd2f808c852d9b4b2f9b5c"}, {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:075b731ddd9e7f68ad24c635374211376aa05a281673ede86cbe1d1b3455279d"}, {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1e224d5755dba2f4a9498e150c43792392ac9b5380aa1b845f98a1618c94eeef"}, - {file = "lxml-4.9.3-cp27-cp27m-win32.whl", hash = "sha256:2c74524e179f2ad6d2a4f7caf70e2d96639c0954c943ad601a9e146c76408ed7"}, - {file = "lxml-4.9.3-cp27-cp27m-win_amd64.whl", hash = "sha256:4f1026bc732b6a7f96369f7bfe1a4f2290fb34dce00d8644bc3036fb351a4ca1"}, {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0781a98ff5e6586926293e59480b64ddd46282953203c76ae15dbbbf302e8bb"}, {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cef2502e7e8a96fe5ad686d60b49e1ab03e438bd9123987994528febd569868e"}, {file = "lxml-4.9.3-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b86164d2cff4d3aaa1f04a14685cbc072efd0b4f99ca5708b2ad1b9b5988a991"}, {file = "lxml-4.9.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:42871176e7896d5d45138f6d28751053c711ed4d48d8e30b498da155af39aebd"}, - {file = "lxml-4.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:ae8b9c6deb1e634ba4f1930eb67ef6e6bf6a44b6eb5ad605642b2d6d5ed9ce3c"}, {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:411007c0d88188d9f621b11d252cce90c4a2d1a49db6c068e3c16422f306eab8"}, {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:cd47b4a0d41d2afa3e58e5bf1f62069255aa2fd6ff5ee41604418ca925911d76"}, {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e2cb47860da1f7e9a5256254b74ae331687b9672dfa780eed355c4c9c3dbd23"}, @@ -3751,7 +3748,6 @@ files = [ {file = "lxml-4.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:97047f0d25cd4bcae81f9ec9dc290ca3e15927c192df17331b53bebe0e3ff96d"}, {file = "lxml-4.9.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:1f447ea5429b54f9582d4b955f5f1985f278ce5cf169f72eea8afd9502973dd5"}, {file = "lxml-4.9.3-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:57d6ba0ca2b0c462f339640d22882acc711de224d769edf29962b09f77129cbf"}, - {file = "lxml-4.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:9767e79108424fb6c3edf8f81e6730666a50feb01a328f4a016464a5893f835a"}, {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:71c52db65e4b56b8ddc5bb89fb2e66c558ed9d1a74a45ceb7dcb20c191c3df2f"}, {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d73d8ecf8ecf10a3bd007f2192725a34bd62898e8da27eb9d32a58084f93962b"}, {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0a3d3487f07c1d7f150894c238299934a2a074ef590b583103a45002035be120"}, @@ -3771,7 +3767,6 @@ files = [ {file = "lxml-4.9.3-cp36-cp36m-macosx_11_0_x86_64.whl", hash = "sha256:64f479d719dc9f4c813ad9bb6b28f8390360660b73b2e4beb4cb0ae7104f1c12"}, {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:dd708cf4ee4408cf46a48b108fb9427bfa00b9b85812a9262b5c668af2533ea5"}, {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c31c7462abdf8f2ac0577d9f05279727e698f97ecbb02f17939ea99ae8daa98"}, - {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e3cd95e10c2610c360154afdc2f1480aea394f4a4f1ea0a5eacce49640c9b190"}, {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:4930be26af26ac545c3dffb662521d4e6268352866956672231887d18f0eaab2"}, {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4aec80cde9197340bc353d2768e2a75f5f60bacda2bab72ab1dc499589b3878c"}, {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:14e019fd83b831b2e61baed40cab76222139926b1fb5ed0e79225bc0cae14584"}, @@ -3781,7 +3776,6 @@ files = [ {file = "lxml-4.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bef4e656f7d98aaa3486d2627e7d2df1157d7e88e7efd43a65aa5dd4714916cf"}, {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:46f409a2d60f634fe550f7133ed30ad5321ae2e6630f13657fb9479506b00601"}, {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:4c28a9144688aef80d6ea666c809b4b0e50010a2aca784c97f5e6bf143d9f129"}, - {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:141f1d1a9b663c679dc524af3ea1773e618907e96075262726c7612c02b149a4"}, {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:53ace1c1fd5a74ef662f844a0413446c0629d151055340e9893da958a374f70d"}, {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17a753023436a18e27dd7769e798ce302963c236bc4114ceee5b25c18c52c693"}, {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7d298a1bd60c067ea75d9f684f5f3992c9d6766fadbc0bcedd39750bf344c2f4"}, @@ -3791,7 +3785,6 @@ files = [ {file = "lxml-4.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:120fa9349a24c7043854c53cae8cec227e1f79195a7493e09e0c12e29f918e52"}, {file = "lxml-4.9.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4d2d1edbca80b510443f51afd8496be95529db04a509bc8faee49c7b0fb6d2cc"}, {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8d7e43bd40f65f7d97ad8ef5c9b1778943d02f04febef12def25f7583d19baac"}, - {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:71d66ee82e7417828af6ecd7db817913cb0cf9d4e61aa0ac1fde0583d84358db"}, {file = "lxml-4.9.3-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:6fc3c450eaa0b56f815c7b62f2b7fba7266c4779adcf1cece9e6deb1de7305ce"}, {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65299ea57d82fb91c7f019300d24050c4ddeb7c5a190e076b5f48a2b43d19c42"}, {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:eadfbbbfb41b44034a4c757fd5d70baccd43296fb894dba0295606a7cf3124aa"}, @@ -3801,7 +3794,6 @@ files = [ {file = "lxml-4.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:92af161ecbdb2883c4593d5ed4815ea71b31fafd7fd05789b23100d081ecac96"}, {file = "lxml-4.9.3-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:9bb6ad405121241e99a86efff22d3ef469024ce22875a7ae045896ad23ba2340"}, {file = "lxml-4.9.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8ed74706b26ad100433da4b9d807eae371efaa266ffc3e9191ea436087a9d6a7"}, - {file = "lxml-4.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fbf521479bcac1e25a663df882c46a641a9bff6b56dc8b0fafaebd2f66fb231b"}, {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:303bf1edce6ced16bf67a18a1cf8339d0db79577eec5d9a6d4a80f0fb10aa2da"}, {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:5515edd2a6d1a5a70bfcdee23b42ec33425e405c5b351478ab7dc9347228f96e"}, {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:690dafd0b187ed38583a648076865d8c229661ed20e48f2335d68e2cf7dc829d"}, @@ -3812,16 +3804,13 @@ files = [ {file = "lxml-4.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:4dd9a263e845a72eacb60d12401e37c616438ea2e5442885f65082c276dfb2b2"}, {file = "lxml-4.9.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6689a3d7fd13dc687e9102a27e98ef33730ac4fe37795d5036d18b4d527abd35"}, {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:f6bdac493b949141b733c5345b6ba8f87a226029cbabc7e9e121a413e49441e0"}, - {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:05186a0f1346ae12553d66df1cfce6f251589fea3ad3da4f3ef4e34b2d58c6a3"}, {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c2006f5c8d28dee289f7020f721354362fa304acbaaf9745751ac4006650254b"}, {file = "lxml-4.9.3-pp38-pypy38_pp73-macosx_11_0_x86_64.whl", hash = "sha256:5c245b783db29c4e4fbbbfc9c5a78be496c9fea25517f90606aa1f6b2b3d5f7b"}, {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4fb960a632a49f2f089d522f70496640fdf1218f1243889da3822e0a9f5f3ba7"}, - {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:50670615eaf97227d5dc60de2dc99fb134a7130d310d783314e7724bf163f75d"}, {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9719fe17307a9e814580af1f5c6e05ca593b12fb7e44fe62450a5384dbf61b4b"}, {file = "lxml-4.9.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3331bece23c9ee066e0fb3f96c61322b9e0f54d775fccefff4c38ca488de283a"}, {file = "lxml-4.9.3-pp39-pypy39_pp73-macosx_11_0_x86_64.whl", hash = "sha256:ed667f49b11360951e201453fc3967344d0d0263aa415e1619e85ae7fd17b4e0"}, {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8b77946fd508cbf0fccd8e400a7f71d4ac0e1595812e66025bac475a8e811694"}, - {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e4da8ca0c0c0aea88fd46be8e44bd49716772358d648cce45fe387f7b92374a7"}, {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fe4bda6bd4340caa6e5cf95e73f8fea5c4bfc55763dd42f1b50a94c1b4a2fbd4"}, {file = "lxml-4.9.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f3df3db1d336b9356dd3112eae5f5c2b8b377f3bc826848567f10bfddfee77e9"}, {file = "lxml-4.9.3.tar.gz", hash = "sha256:48628bd53a426c9eb9bc066a923acaa0878d1e86129fd5359aee99285f4eed9c"}, @@ -3903,16 +3892,6 @@ files = [ {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, @@ -4648,7 +4627,6 @@ optional = false python-versions = ">=3.7" files = [ {file = "opentelemetry_instrumentation-0.42b0-py3-none-any.whl", hash = "sha256:65ae54ddb90ca2d05d2d16bf6863173e7141eba1bbbf41fc9bbb02446adbe369"}, - {file = "opentelemetry_instrumentation-0.42b0.tar.gz", hash = "sha256:6a653a1fed0f76eea32885321d77c750483e987eeefa4cbf219fc83559543198"}, ] [package.dependencies] @@ -4664,7 +4642,6 @@ optional = false python-versions = ">=3.7" files = [ {file = "opentelemetry_instrumentation_aiohttp_client-0.42b0-py3-none-any.whl", hash = "sha256:130a58fe4a702a5c828e87190c1bba8321fd2ecdad0834daeb90b494e51369c7"}, - {file = "opentelemetry_instrumentation_aiohttp_client-0.42b0.tar.gz", hash = "sha256:6ac5b2181b02232e169a5c1540fe1d104592cd5d5993ffb3581e7ac659f673be"}, ] [package.dependencies] @@ -5386,17 +5363,6 @@ files = [ {file = "psycopg_binary-3.1.12-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:000838cb5ab7851116b462e58893a96b0f1e35864135a6283f3242a730ec45d3"}, {file = "psycopg_binary-3.1.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7949e1aefe339f04dbecac6aa036c9cd137a58f966c4b96ab933823c340ee12"}, {file = "psycopg_binary-3.1.12-cp311-cp311-win_amd64.whl", hash = "sha256:b32922872460575083487de41e17e8cf308c3550da02c704efe42960bc6c19de"}, - {file = "psycopg_binary-3.1.12-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:70054ada2f890d004dc3d5ff908e34aecb085fd599d40db2975c09a39c50dfc3"}, - {file = "psycopg_binary-3.1.12-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7544d6d74f5b5f9daafe8a4ed7d266787d62a2bf16f5120c45d42d1f4a856bc8"}, - {file = "psycopg_binary-3.1.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43197161099cb4e36a9ca44c10657908b619d7263ffcff30932ad4627430dc3c"}, - {file = "psycopg_binary-3.1.12-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68398cdf3aedd4042b1126b9aba34615f1ab592831483282f19f0159fce5ca75"}, - {file = "psycopg_binary-3.1.12-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77ae6cda3ffee2425aca9ea7af57296d0c701e2ac5897b48b95dfee050234592"}, - {file = "psycopg_binary-3.1.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:278e8888e90fb6ebd7eae8ccb85199eafd712b734e641e0d40f2a903e946102d"}, - {file = "psycopg_binary-3.1.12-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:047c4ba8d3089465b0a69c4c669128df43403867858d78da6b40b33788bfa89f"}, - {file = "psycopg_binary-3.1.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8248b11ac490bb74de80457ab0e9cef31c08164ff7b867031927a17e5c9e19ed"}, - {file = "psycopg_binary-3.1.12-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6979c02acb9783c6134ee516751b8f891a2d4db7f73ebecc9e92750283d6fb99"}, - {file = "psycopg_binary-3.1.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:eaf2375b724ad61ee82a5c2a849e57b12b3cb510ec8845084132bbb907cb3335"}, - {file = "psycopg_binary-3.1.12-cp312-cp312-win_amd64.whl", hash = "sha256:6177cfa6f872a9cc84dbfc7dc163af6ef01639c50acc9a441673f29c2305c37a"}, {file = "psycopg_binary-3.1.12-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b81427fd5a97c9b4ac12f3b8d985870b0c3866b5fc2e72e51cacd3630ffd6466"}, {file = "psycopg_binary-3.1.12-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f17a2c393879aa54f840540009d0e70a30d22ffa0038d81e258ac2c99b15d74"}, {file = "psycopg_binary-3.1.12-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c6a5d125a61101ef5ab7384206e43952fe2a5fca997b96d28a28a752512f900"}, @@ -5464,7 +5430,6 @@ files = [ {file = "psycopg2_binary-2.9.9-cp311-cp311-win32.whl", hash = "sha256:dc4926288b2a3e9fd7b50dc6a1909a13bbdadfc67d93f3374d984e56f885579d"}, {file = "psycopg2_binary-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:b76bedd166805480ab069612119ea636f5ab8f8771e640ae103e05a4aae3e417"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8532fd6e6e2dc57bcb3bc90b079c60de896d2128c5d9d6f24a63875a95a088cf"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0605eaed3eb239e87df0d5e3c6489daae3f7388d455d0c0b4df899519c6a38d"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f8544b092a29a6ddd72f3556a9fcf249ec412e10ad28be6a0c0d948924f2212"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d423c8d8a3c82d08fe8af900ad5b613ce3632a1249fd6a223941d0735fce493"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e5afae772c00980525f6d6ecf7cbca55676296b580c0e6abb407f15f3706996"}, @@ -5473,8 +5438,6 @@ files = [ {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cb16c65dcb648d0a43a2521f2f0a2300f40639f6f8c1ecbc662141e4e3e1ee07"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:911dda9c487075abd54e644ccdf5e5c16773470a6a5d3826fda76699410066fb"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:57fede879f08d23c85140a360c6a77709113efd1c993923c59fde17aa27599fe"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-win32.whl", hash = "sha256:64cf30263844fa208851ebb13b0732ce674d8ec6a0c86a4e160495d299ba3c93"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:81ff62668af011f9a48787564ab7eded4e9fb17a4a6a74af5ffa6a457400d2ab"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2293b001e319ab0d869d660a704942c9e2cce19745262a8aba2115ef41a0a42a"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ef7df18daf2c4c07e2695e8cfd5ee7f748a1d54d802330985a78d2a5a6dca9"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a602ea5aff39bb9fac6308e9c9d82b9a35c2bf288e184a816002c9fae930b77"}, @@ -5989,21 +5952,6 @@ snappy = ["python-snappy"] test = ["pytest (>=7)"] zstd = ["zstandard"] -[[package]] -name = "pymysql" -version = "1.0.2" -description = "Pure Python MySQL Driver" -optional = false -python-versions = ">=3.6" -files = [ - {file = "PyMySQL-1.0.2-py3-none-any.whl", hash = "sha256:41fc3a0c5013d5f039639442321185532e3e2c8924687abe6537de157d403641"}, - {file = "PyMySQL-1.0.2.tar.gz", hash = "sha256:816927a350f38d56072aeca5dfb10221fe1dc653745853d30a216637f5d7ad36"}, -] - -[package.extras] -ed25519 = ["PyNaCl (>=1.4.0)"] -rsa = ["cryptography"] - [[package]] name = "pyparsing" version = "2.4.7" @@ -6300,7 +6248,6 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -6308,15 +6255,8 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -6333,7 +6273,6 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -6341,7 +6280,6 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -8989,4 +8927,4 @@ local = ["ctransformers", "llama-cpp-python", "sentence-transformers"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.11" -content-hash = "15e903d9e6bdb90cc93c3f9ccf14207f55f4a4674cb939020d480d5f7fabf2cf" +content-hash = "27f6f86ca62ee5cfdae333daae4f043a745ed2fff0d958a201b514fac36068d4" \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index b3aeebe31..ef7bd9872 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -102,7 +102,6 @@ boto3 = "^1.28.63" numexpr = "^2.8.6" qianfan = "0.0.5" pgvector = "^0.2.3" -pymysql = "1.0.2" [tool.poetry.group.dev.dependencies] types-redis = "^4.6.0.5" From 740d7f5b516a0f11adbe6a3398516df78a6d6fe6 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 30 Nov 2023 16:54:12 +0900 Subject: [PATCH 091/203] =?UTF-8?q?Dockerfile=E7=AD=89=E3=82=92v0.5.6?= =?UTF-8?q?=E3=81=AE=E3=82=82=E3=81=AE=E3=81=A8=E4=B8=80=E7=B7=92=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 2 +- poetry.lock | 2 +- pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index c44426c64..346348c0a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,4 +12,4 @@ WORKDIR $HOME/app COPY --chown=user . $HOME/app RUN pip install langflow>==0.5.0 -U --user -CMD ["python", "-m", "langflow", "run", "--host", "0.0.0.0", "--port", "7860"] \ No newline at end of file +CMD ["python", "-m", "langflow", "run", "--host", "0.0.0.0", "--port", "7860"] diff --git a/poetry.lock b/poetry.lock index d5a555874..68e6c22bc 100644 --- a/poetry.lock +++ b/poetry.lock @@ -8927,4 +8927,4 @@ local = ["ctransformers", "llama-cpp-python", "sentence-transformers"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.11" -content-hash = "27f6f86ca62ee5cfdae333daae4f043a745ed2fff0d958a201b514fac36068d4" \ No newline at end of file +content-hash = "27f6f86ca62ee5cfdae333daae4f043a745ed2fff0d958a201b514fac36068d4" diff --git a/pyproject.toml b/pyproject.toml index ef7bd9872..3481d3ef9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -148,4 +148,4 @@ line-length = 120 [build-system] requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" \ No newline at end of file +build-backend = "poetry.core.masonry.api" From e08dbd5712b845a03b72b97efa31ab62c4081657 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 30 Nov 2023 16:57:00 +0900 Subject: [PATCH 092/203] =?UTF-8?q?=5F=5Fmain=5F=5F=E3=82=92v0.5.6?= =?UTF-8?q?=E3=81=AE=E3=82=82=E3=81=AE=E3=81=A8=E4=B8=80=E7=B7=92=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/__main__.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/backend/langflow/__main__.py b/src/backend/langflow/__main__.py index 87052677e..1bdcf97f2 100644 --- a/src/backend/langflow/__main__.py +++ b/src/backend/langflow/__main__.py @@ -1,7 +1,6 @@ import platform import socket import sys -import os import time import webbrowser from pathlib import Path @@ -127,10 +126,10 @@ def run( default=None, ), dev: bool = typer.Option(False, help="Run in development mode (may contain bugs)"), - # # This variable does not work but is set by the .env file - # # and works with Pydantic + # This variable does not work but is set by the .env file + # and works with Pydantic # database_url: str = typer.Option( - # "mysql+pymysql://{}:{}@{}:3306/{}".format(os.environ["username"],os.environ["password"],os.environ["host"],os.environ["dbname"]), + # None, # help="Database URL to connect to. If not provided, a local SQLite database will be used.", # envvar="LANGFLOW_DATABASE_URL", # ), From 68aea2c6d569cf8120c79b2ce51c3dd21e25ca4f Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 30 Nov 2023 17:14:10 +0900 Subject: [PATCH 093/203] install dotenv --- scripts/aws/package-lock.json | 12 ++++++++++++ scripts/aws/package.json | 1 + 2 files changed, 13 insertions(+) diff --git a/scripts/aws/package-lock.json b/scripts/aws/package-lock.json index e5b70161b..68344e614 100644 --- a/scripts/aws/package-lock.json +++ b/scripts/aws/package-lock.json @@ -11,6 +11,7 @@ "aws-cdk-lib": "^2.86.0", "cdk-ecr-deployment": "^2.5.30", "constructs": "^10.0.0", + "dotenv": "^16.3.1", "source-map-support": "^0.5.21" }, "bin": { @@ -2426,6 +2427,17 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, "node_modules/electron-to-chromium": { "version": "1.4.580", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.580.tgz", diff --git a/scripts/aws/package.json b/scripts/aws/package.json index 05ef554d9..fb7f23e76 100644 --- a/scripts/aws/package.json +++ b/scripts/aws/package.json @@ -23,6 +23,7 @@ "aws-cdk-lib": "^2.86.0", "cdk-ecr-deployment": "^2.5.30", "constructs": "^10.0.0", + "dotenv": "^16.3.1", "source-map-support": "^0.5.21" } } From 6e7c7da55be87f5b1560fc2561aa97a073541e00 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 30 Nov 2023 17:31:07 +0900 Subject: [PATCH 094/203] dockerignore aws --- .dockerignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.dockerignore b/.dockerignore index 4e7226768..295affff3 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,2 +1,2 @@ .venv/ -**/cdk \ No newline at end of file +**/aws \ No newline at end of file From eca7d40c99f6b5ea879d43aa315581dd905268ef Mon Sep 17 00:00:00 2001 From: nsxshota Date: Fri, 1 Dec 2023 10:42:57 +0900 Subject: [PATCH 095/203] modified: cdk Dockerfile --- scripts/aws/lib/construct/ecr.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/aws/lib/construct/ecr.ts b/scripts/aws/lib/construct/ecr.ts index 2ff25f9e9..5162547c3 100644 --- a/scripts/aws/lib/construct/ecr.ts +++ b/scripts/aws/lib/construct/ecr.ts @@ -48,7 +48,7 @@ export class EcrRepository extends Construct { // Create Docker Image Asset const dockerFrontEndImageAsset = new DockerImageAsset(this, "DockerFrontEndImageAsset", { directory: frontendPath, - file:"dev.Dockerfile", + file:"cdk.Dockerfile", buildArgs:{ "BACKEND_URL":`http://backend.${props.cloudmapNamespace.namespaceName}:7860` }, @@ -57,7 +57,7 @@ export class EcrRepository extends Construct { }); const dockerBackEndImageAsset = new DockerImageAsset(this, "DockerBackEndImageAsset", { directory: backendPath, - file:"dev.Dockerfile", + file:"cdk.Dockerfile", exclude: excludeDir, platform: imagePlatform, }); From fbb736689555ec98d04df48db9f846055731441b Mon Sep 17 00:00:00 2001 From: nsxshota Date: Fri, 1 Dec 2023 11:37:39 +0900 Subject: [PATCH 096/203] modiied docker-compose: use cdk.Dockerfile --- docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 81914ee40..8799c90aa 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,7 +6,7 @@ services: backend: build: context: ./ - dockerfile: ./dev.Dockerfile + dockerfile: ./cdk.Dockerfile env_file: - .env ports: @@ -19,7 +19,7 @@ services: frontend: build: context: ./src/frontend - dockerfile: ./dev.Dockerfile + dockerfile: ./cdk.Dockerfile args: - BACKEND_URL=http://backend:7860 environment: From d5e61dddf54d7675a83dd1b3474f5a3d235fcf23 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Fri, 1 Dec 2023 12:09:31 +0900 Subject: [PATCH 097/203] add Cfn Output & Readme --- scripts/aws/README.md | 49 +++++++++++++++++++++------ scripts/aws/img/langflow-cfn.png | Bin 0 -> 11750 bytes scripts/aws/img/langflow-cloud9.png | Bin 0 -> 46825 bytes scripts/aws/lib/construct/backend.ts | 4 --- scripts/aws/lib/construct/network.ts | 14 +++++--- 5 files changed, 48 insertions(+), 19 deletions(-) create mode 100644 scripts/aws/img/langflow-cfn.png create mode 100644 scripts/aws/img/langflow-cloud9.png diff --git a/scripts/aws/README.md b/scripts/aws/README.md index 320efc02a..a7be98720 100644 --- a/scripts/aws/README.md +++ b/scripts/aws/README.md @@ -1,14 +1,43 @@ -# Welcome to your CDK TypeScript project +# Langflow on AWS -This is a blank project for CDK development with TypeScript. +Langflow on AWS は、 Langflow を AWS 上に展開する Project になります。 +この Branch では、AWS CDK を用いて 各種 Dockerfile からコンテナイメージを ECR に展開し、ECS、Aurora MySQL を用いて Langflow を構築します。 -The `cdk.json` file tells the CDK Toolkit how to execute your app. +# デプロイ +[CloudShell](https://us-east-1.console.aws.amazon.com/cloudshell/home?region=us-east-1)を開きます。 -## Useful commands +以下のコマンドを実行します。 +```shell +git clone https://github.com/aws-samples/cloud9-setup-for-prototyping +cd cloud9-setup-for-prototyping +./bin/bootstrap +``` -* `npm run build` compile typescript to js -* `npm run watch` watch for changes and compile -* `npm run test` perform the jest unit tests -* `cdk deploy` deploy this stack to your default AWS account/region -* `cdk diff` compare deployed stack with current state -* `cdk synth` emits the synthesized CloudFormation template +`Done!` と表示されたら [Cloud9](https://us-east-1.console.aws.amazon.com/cloud9control/home?region=us-east-1#/) から `cloud9-for-prototyping` を開きます。 +![make-cloud9](./img/langflow-cloud9.png) + +以下のコマンドを実行します。 + +```shell +git clone -b aws-cdk-dev2 https://github.com/kazuki306/langflow +cd langflow/scripts/aws +cp .env.example .env # この後envの設定が必要ならここで追記 +npm ci +cdk bootstrap +cdk deploy +``` +表示される URL にアクセスします。 +```shell +Outputs: +LangflowAppStack.NetworkURLXXXXXX = http://alb-XXXXXXXXXXX.elb.amazonaws.com +``` + +# 環境の削除 +`Cloud9` で以下のコマンドを実行します。 +```shell +cdk destroy +``` + + +[CloudFormation](https://us-east-1.console.aws.amazon.com/cloudformation/home?region=us-east-1#/getting-started)を開き、`aws-cloud9-cloud9-for-prototyping-XXXX` を選択して削除します。 +![delete-cfn](./img/langflow-cfn.png) \ No newline at end of file diff --git a/scripts/aws/img/langflow-cfn.png b/scripts/aws/img/langflow-cfn.png new file mode 100644 index 0000000000000000000000000000000000000000..fecdeb70cc40e0fd263a9c03e82dc73df90e14d8 GIT binary patch literal 11750 zcmb_?bzGFs_b(|WEg%vi-5{W(lpNvOS)l|@|DOdP>rTcmwsS70X-M+c7B+}EKsX{Q$oEI)zZ?Er5aH4Sx2JS)W;kdNJy*!vacl6-H~@P(9?mPWZn34a}~~RZuvAUL?}ck zaek5sphv3W4_IPtCBz9-P=$y}%OPTa1V-S#pXc^4YC zUZgvj>C+o9NIpR(qWN3g8Bk&k3ZJvZBVon-EpJfNi_U2Nxs4I$CddYm+$Weq`yJtc=Zr54z&I1 zPTBt$@I)5j=KtFy%#(#1oZi7on>$}Hu>-6oV6w5aQh|UFu&h7Yyf})!zJ8_4);Pgq za!3(@bUy`Re1b^>{BEx`np;|4Zk;r9Va14}(TSffP(1(9W;f0HMf5SnhmYFz>r5%4 zR=)mTBEDDj;@T?2nW8>Lm$%)uVnN!^zOHcTwSL%hI2cVqatRcAi`!-w8+E(IpeMG; zWj?gOLWNY27Tl)+lT-0%vWU{UbBbW|Ze%VVpxI$Ox1DFr!lNc{jufhX?ln)Fa&^tl z<}wqd2gozF2}^00Uu5cIZ@I*Wm=9%Yol6LMTpXqB-j3S{2LU)_z(ZaJqo)EstLd=N z)|0bkHQ65!o#-6<-l9sk1&L@INtR;3lAfUR8Q1>tF(efKu}29pDfae^pA78U>4l75 zgYQz__LLWmjLR%ZtH+2mz`Tcvs?mE9_V7@~A5Dfvmk=?_uspVHmy`BSbbv-l4%t+` z3U(bnwbytQGzL-RTrC&4SY8<}-#+4tZgY;94JJiem%J$`=AIU?s)I3O!! zo;pm78=SikV9OgBhb zi+!szD;0t_9CFR-9+Gl?TOl3FVm;m*jZxaskXrq{~)?rFd?nC93L$tAGrwu4@O`K`N69NL4w`!Kj_*L9f*hZGi2qjQRxf$~GcC5+n_|%Q zDv#;e!|PMCgAA%Q4)6UE;Xd<6cY6pL6Jj4IlOg8J9W7MbBs=Jy6W&Oo)~_vh)opgx zBE2eCSU^Uua+iS3l*=}~k9p^w&Y|Nb6Sb|Ct2QxT>3A$eE>sXbTBf76JMUB$!)G@q z+xqajwBsG2UMgQvzOfp$FjeoM-es<5X_w>Tvc<+YG-I~aM`PY@POGh11^IfReyWY< zurC#Nyw7^VwvB8*rD_doei}u@W~Lx`F|jb-65+C1X2Mib{UHQr{Sb$YOUELL$zB3d zsxFXM(xa7$U#r*I;M z@Qx^|z6uK;+?D%FpPi7=b6xsQmnZk*0X1eX10-=B#uJ;)qaLut(JRJjP7K5e2JP~8 z;W=~*xRy+MS~G__7*qe0xFux?ndwP&p>WY|6=~>LJE1DRJwI5DyLW7fmC453@tRwj zNjYOIX|08;r=&qlrr1?)Y~dxy;zS=cz{UE4T?~p};adKV`h2VYXnS0>(!7ryHPn|S zbGD-?!BP4yCI(Er7VivH35@l3WH@J3PLr=IV3%zrqH8Ft6gn#+%NC7J;)^c>5IFmO z$+Pi!p9sqvQk7;A4%qCiSYmS4VWnmeKOcJQopY%0dL)tR=s1$1&Nm+^TIAkIw^zk`GsmeL)jNK> zwVMK&h9&jU;dTc}F1I(R8KRD(0vR_G6>Z1IOgBx_ZS&=$9Bfd_bsuh;P?svhZ zGj5wF>iyY}GWMqNg;dD8Js{VV#Nb#=&9}#YNF2@Y-e@8=-mM#Eio9(h!Tn9P5^**V zj8K#MromT_TJ!)%6L#(TOcfrmJ>O)YlaEc(&%_W;0{ut zQr9)<>!rWHmDH1|%S2tixh5k`uYJsyv^8P3*(^r_U;o%t_C-1hiyb|T_)-h_;dLZy z!Rbtw*etN>!0?mAbubpOrbT)B!vLsBM~v_AUKQa7eQzQ1l_x!4EIT}&yP5DnPR_sH zIDY?1XoGtom!_TMa_q9WOr8PEQ+Ftq>0OjM5}Ykr)d%H$!Gep+L6|pV4i_t(Lh+Au z+YgW>((I}7W=g&EEk~@sF~yFEPre@`XWmH_^Z& z9?<=y3}z!qAG`Ww5vjg`V0bvT2lAFd*%= zy>S?kN#$d4abPx!a{6A95gL6p>xf0%tRkM%A=$vUWDnvh-}y3z)8Kjh*nD8UIw{3& zq%NE1tuV>Z=>eooyBLe2MW-9Qu-JK=7UT!JWRc^<5$gTf;G>iOd1Xt1U?`;RDc!1| zJT$Y8EJ`oFkM1sn1mC|4Aw9=w`wPVaS>Xp;LpUz-L2o1D%34!OhV~_GMzf;~ArIL_ z#riX7(GS+XVdJ7e_Iae)3DL&0@OHH2gu!8tM7*o-Q|&|UKb{@3)FAV`3GvtKNfdLH z={$gD-x@_BSa^BoGQZvC~MZ%Y?M@H#fEe(#U4A8(zMBUJA#_6T?$y*V&SJB2VfhJlU@edIFW z%7n+oKW@DyGJS-eWK7_&W!w_M$|9tQtQU$vvSb~+HXX-KiCW_+k|KARx;Q2=<{2sO z4~kZcftQ4z+M0(l+GsFq^=iFq+MawS3K`QOsLwV82S^5yn3w+)&;H7;S*_r>(vw$0 zSJ=Uh8vW>5_@LWWAPySolM>n>Xtr(&kQJk8XP|fMrD2v!BZ)jT?0kZ@ts9nq zu9Q1l|Gj22=~!q|MB?g;ZE_KR5NdII7xkI1~T~6Zwpe+c9`9ylBMsC zSf8Y6OeJe*m5SxUhCfweHcFLy?6{>~;;aL28z+!!8EL3Y2`Hlu7-J{`wlOKCQ!TpD zs+wpE7d4$#$_scG|NQGuW$E|0xVptP-V7bxAg_85cGUNju=JOqz zujDo<;w}kK17?}y%Vf|Ouz_1z0h^W-$bLT3+*N>wssp9j28=O}cRpkSY@Mm%qr^=y zyTV0NL<6g|1q%;TS*&M5qaL?*5gYItS!5s0$M$1$g{OD8v(|p(cj)!2XEW&>D2lLN&nr6}}LAOR@)Vo2z z)K4t+TnSdpXS>02BqZ3ZK<|4$?>BQoSuKA~HPhP4+an9z3u?QMyX}*};M7F}R6O!7 zqxWLykV|oAiH|yCBsMS|-j-HAl@b9~K7^qzRS11;mHawi+vHU4L>g+c*ruS@A@V75 zP3}AB8S*v^PJ=WD$@WpcuRG?Fh_KtN6IykZo%^Zu&0-CT&d`Xr@PSlQ=EINobz=$G z9owmOi+#12{IUcXaMsYAuQviWafYIp_%m3xHs2w6cd*eiKDA93@XUJFQ4~oj+72Yi zyTb+At(e52n>BQ6xU%iM$jpFu9}jYwJ#AS`15X~`=qP2iG1qzTZsst_Jyhm_%G04Am=c$bvPcqO{A&+Q zKoT86-t*flj~&vfn%jbBamkyZnopuf_aewyv}uw?VW4r{1DU@F4`K)c#gkQw%((P9 zn1WIkeN{xHs=3o5l!*tZnkc=%m6;Ar3BqjWBqMtKP~-MYXQ^Rud1mrHYBF zI`e7!@zz2Uc(T>yx2gJ{O}1-Xx{2y6akBl%Pq#ZuoySb;S-{p6R zB0)#6DMw;l(3*7_U#sF`IrkMR34V*-X}K8DIc+=!^Jr0tt`KrwuD?$ysN`+C@J+8j zizzgMdRn@TZ*RVZ>BU84%*a}^i+*Eu;mXz!hRkQQ{pGF!9UjB83CF7riwulT!{uz{ z4mL&Bl-s2t9+wkZUQ?eE{lb!?-J6^?zRS+R77TD|k<;Rl;Q3MfAfUn;i|sP~R4V1E zU6}QJt-Pf=3s;u2jn#@^=FvL8E*_=mDwjulcSbItA#TxDROqtB?2 z!KPC3^JNO|Rx88fTFb>UQBK6ja*nLstaJH%i*V2mXmse4ZajHJtD->D;Ak4F`qERr zB>CwzW%*+={Hta4M*2rP&|>4Fz0r26nwNRprN^v^|M@Kt+7-c%x`9Qq+7f zSt*V|kv-&KZM<_fvb!SVAGwXh0+n5ti`RT3cpxa0A z;<^MN$JxPeM=4oI8IS7tQb+vW^d7%^wP|0R1c?1isq6k0+ZMlVyaB)Ux8vF4xjB)B zzQc(p`iPAE4);kBFJJ>|u3$*q2O4%JJaa+S;i8AP6tmOUSg8ZX^Uo3w9FC`5e2Q_? zYUSyUKPzYOG`LYW zZy0_yReU*`R2iIer<_RyQ#uX#Z$u~fHsBwL+9KK0c? z-z;$=H6meW%B`$yH}aJu$8%rOnf_SLa{b|3;em4_wS#5RS<{%VK4dDN+v+ZaBJ5xuwGg8DbJK1jXV+@kfb z%9t4*a@Gns7;D+;s;vT}nUu1|hR{mDQGu<>nXTe}hN`-!mmr^3lT%-)q25U62=rKO z)IN5et!AajdCbl2aM@?yF*{4PyY(RT*O;{P25{FYL)JJ$2Z+kWpXg(9Qa69!cf^VK zE;V7d{;&|(@}br=Sx6Q#Q>qi1C`4U6(ar^xiuXM5UGl6v%QsNZz9G@OAF!V>&BqH2 z^mZNt<)Ab$NFC5uDmUy+-;`xVJbtF4qaWyvicgZ)ugg3IvBFQJz+@MBM~)rt{mkKQ zdl9Nz8Wwh)&bFxgt)9hnd2Ows&1ALW1s-{6se!!}ZQe#&FE7+$hFW_+jG800BZ`EL zx$ac+#9+lW#1R)dQ0PdpAw_(9y;htU^-doBTuRo1!>4W`dhK`g$;1k7gkn>889!#V zP9xBi&>EGPE2q(^-5UoHp!t94L=Bk1MIJ>2zsg2TbnG~RoCWMpIIOUum(fGHx`iK* zb=^{iy=3Q7fw|J%}Bm^)!u*yWZu9sTAo;>DHk0YhG)QnaV8KqD+hfNUW)o z_tBtS-8Z5Peuc_utGhupb2aBX34-v(!%ziEUd^VT=@9g8-KnZKrzxtn1nzhe%@dP^ z*WjID@=Dt&1=+Y)4g1!KPe$~w+rDH~+p`S#iu~qxr)H!I)5p6K z%zExAnSyQ-LMK-W=*4R>Al9#QCF1fhcINy+PphrhT}KwjiO9l0Ye-mO;0F@j#gfvw zOT0peLs$*eaxdVc5R6F~W_^*k+eJJos+dwE(@pjy6OLJ%q*-kZ;j>Wb(_S$@pp4dx ztOK#Azr1i!Lq4nEb7M}!l+0?ePf1`0$zT+`{2|r;LbvO63M-&}FZ118AQ6$gO?SEF z!0Ujx8K{j@w+;)me<<#);lUv5W7uSv<;s%>56mTwPVR9p5RV0h?8_lHJD(T1DzcVk zi2xGWOmbd&l#CzAU4I_K&|oaFF!1G-(%HkK7G$)?IoTe5&A<02m1$WJVfvM&VhRPQ zXcYY%;hmJCqVQVnP3c_17Pl_+uOt}7wb3f5#q~E#L#hHIA;5d@@95qj^u^Q17Z6U= zV%a*p(xdZ7HQ`&m@%bnWdFP=oTpqO&eD@J=m}}LTp-bLD!6xgWn-i|Bga6=gK`JY-okk1VDce z(fiuuSR2Y?DIei@G5aUCxV-jI`jr?HIHTmWDw8x`F3|W%)^>>RWqH7;0joT!l{pI)B1U^;BKIP%YRcZ~O6G1ivfdX!HcD2}PI!7?eDJY3&r^ zG^3}5o~REUF@NtucfT}&Hfi!8&l)bvbjVf#=m}xpV1+XV#%u|tFsrCC(E95+C#&0 zxvIPO;`pU(eSFq83ALO}!y=|GB3ogJ(C`x5R`%rGD>MG3tt~d?8z0)IAG+MDFyP-} ze+_N07vh8%XoMXZ!m9QmqB8pjJ4BGgE6bq+gNMa${vgmZQ1BJJ$kui=0@myH_i>;Wtl|1 zL_U2Q#0&Y#ISJFNta$L^;GU`Gio}5utP#1sBaB)jJfDO18h#u%x(^7murutu85S67 zx|#mm*}m`=zDOsJn(M|ouJ8MzK}l&rgo*|qt9OYpDYA3|Ety}UupIj< zrqiSo87hpiDN!01MDz`1NQTUaPf4aMs=+seV8$gErMC*LS0*LRNp-R9nNY+I%#lS*>7W)0UgDF4OfUJ79Fp3M1uFjNUojDc18K=)vM%4AOT z0Y0;%YuKZyL%J0U?~#+ixD&RTaWrT)h3>)ZM5?sd)R!!yVwE~YUjg&u zgguljbm}1xx5ZT!E&HDsrRpgiujMv+A?%?I_wCbb{9vHOZ2x{yZe=zGhmYN{whTgB zmCCn1MUWyQi}%_VJpwL=5rbth73tM%v)Wl0Cw(Jlu=%Du5?1B}r$^22l!Ks!>WxGI z6Qvg^Eq<-ltdp~i3<+`iR+q8^)?*xQ|eq)>Ic-xF#GiD(Gzq;w{9_Vt9D6ffV5VB939h-l8HkMW=XLb?%e5e!gf0Y6CA z@QSZ!-sLzl*iYb2oi%_;w!w;eUM)LhuAA~EWT)$l^8a=DN$ipvrJa;>hXX_=d_w>%6G`TMhE%vh=F=@7=Cu3$TnYwBpkt4hp;?4$bF3 z6HRJowl0(7JG z17fJX7)`H==J{N?OO#*GGpYxQJfL>O+M z3x+LU{fw_jWq+wlzroTbimixuM2SU(WVd&UmASO?Qq%s=JXoTL5|8_t0qPdfx~dj1!a)j~)@Ft57IKjlc>*g9w) za||7p(p-TB8hT0t$0OwjWot+1m6v!=MIDwB)YU2SrdLir3QtR=aDnx`Dn*q^nF^zr zE_FKrpX7kNRxS;f%liI~G6KWkvZz8yl@=}8_3G^SSImtPR8=i0eEWblfRC5X-waR( z?V;Ln_+dcC@RP|<_`8Znf@%eK4~QCmH_wLLW*?R%n}55E1&|th+#fe+)Up;QpwO5F zz?Q}l3miz=#Ag>KkY-?0!M&FglfVC@o-(}eOpFQr-M7?MyTn#C2{O_OYG@<;)P)It zzeXxx=>+?P(|Cx@JFrM)YUaD(pGYe}lnsT)$`F)QaG=zxw_A#$6{nH-M~$sMWM>aB@AZZUeXzT z1Jhs8F!z1A0c;GVSC?3}QnHD;vGg7|Y-1X$Qm!{_Nb~j7T{ffT$fV$E??Zd0GqYks2ti(N&l_ueU4?6Nb z+m)>=tj9AkE8DVv*GMQ@{YOu3MQxdDg@H&6{!Wc+GJSS(ja@y+)@hkAG*!UWxW%dA z#mLB6jGw%XS*n&+&}_rew#`BMAG}&J2!VSW=Gywgy7b~ReKWiC=6=RZn9m`RUtjU# zQC(hEOdmO$ju}PuHvh?H1NZ~)L^5ArS>w9Ob$4Z&J!UOAc&XA@oCU>Niey;E*y9@Yvx3RcqzBtMF)4dE$KY=^p4y9RRN7TQGR-2laIDn V4c2X|-usPX^+ literal 0 HcmV?d00001 diff --git a/scripts/aws/img/langflow-cloud9.png b/scripts/aws/img/langflow-cloud9.png new file mode 100644 index 0000000000000000000000000000000000000000..5fd5023533df94a9e241e3402e8ff2d32861d062 GIT binary patch literal 46825 zcmeFZWmuG5+dm4ZASj|BAV{l#A|Tx@(ji?#NDeTA5<`~=NJw`LIW!0i-QrEd00Rsi z(lK=B9-rrZ|M$HgA3gSm{cZ2zV6HW*&scGu>$k2TRb?4M0!jibEG$Af+1F}VSh${8 zSlIV(<6>f*n9H;DYhgOvm}(oVcFpH~u$_eg9`633VwsIm}bt)ZW}2>|kZ*XpQjD z$HKy~1#0Lx>L@7+n%aTbOw8=wnX|co-v2CuCF~-I34+WWP3T-ewqOTA7ZHYk!l%2gf9WUD}wpR?I1ax$C!uDnsf@-hd{7-SrFA)YSN5}Vq z?Cj3Y&TP(HY>L6D0_?9i**Q5`F*#TrT)~beF05dOC;zVGf9rW|?qF&UeD4Uf z1JnJi*W{g@lcNX&!_S8P&*$I$G}>7q)!&<#nu~G>|EvCgM*ZEnf9F;Ox|rMQz6OFYGQbcb%E`z1 zKZX7?XX1Yr{8z;~e>cg&%lp3_{m-O-6#YrDpo%>Z z)11jqmj5K~m$?7QFUV3541Ik0yx{D2!WnVquA6$-S1)aKYZ3 z#`Dn7oaoqP63G_7{b|O1yD>kVF8H0ZlM|`?w&#cw>xQ18E~$I#%-ffr={^n>9?a;| zJ*CH&qf0#&wzLmSjCdp0`?Pt%l9Q{tuW?o=aqbe~5H@RqeA>*aS7o5b4Pt1Okm!H9 z^*|g8`{w=MeR+tt%;FtI0$%?q(|u+MpMl()bQVv1uyAhE{pPEQPJDIYj%ASNAM298 zPj~Pf`}6p3tHC7ru;0FacJfX49qpew?@N61wx>MSJKo=S={DWm9h^_1P4DBzWPZk60Pu>?zNV9{hoy|39mKYRCWktjbS0{;)raUb+Zwp!$Qn zQ}V>;g1|n9Eb%R+NXzb0E(^JyWu>Kdn-c!#c=6HEPj>Nxh^eSvy1KeXB_}f#juu6? zw0xWOsUU4654ZWeYqW;H~*e*CS1h-*G% zz9?|ljOi3x4owlpCloHj$xGBH>bywJ-)o5oFlVf_(oX6fi(+slw54ms_S!;qbqU$h z;+@eZE~n`R<5}LNX3(!f-!DFL-MCaymfxumf|NEK^#^WghnG-1JCBZtq#uyRsX9>w21565 z{8ndu3!c7zx7KdNe7Kd#zqY&1NzrTub!Qj7aDb*(z1T{3*OPRsx^P&BoSFd}+>=BH zfS!i>Y>AAE0tvB9)t6tTDTV80*M%DgzzfSk$&GRBCr{T@!-QYCCf{{2_1Exz*W~Ex znm@HO%~(IS3Bp@kTNAodVy^~8OmDe;u~p~E0@+zt865rP7UX5`+qh;ba6Wh2gvQQ@92YS~GlWTRKq38z1*{gGARcPUUM?haIfX{MFyQGZhI*YnHJh zee{UV%d4c?T3p;`bBvVbF)t{R@e8HwMqD4-)N^ZPg-H+^@Fx-Oj1R0Fp1PZvW`%4jTE9w+l6g_p(4KlEVZi3qo^nQX6p-l zEM~`~zkO7QPga^uVYt3Djkh9IOP&~6Ty8pC9Ac|Pi#Amnmn!lBDm`6w^{dbPp(W8= zeOG|l`jS*w$H_(SH0LapN_~R0n#h5ybPtvKVHWn-A_ujZF%qMlU+KIDLA~4^5WNt} zEi_Hf4MHz?2w(1x6|*n9SqnRGtI^kzk_1Fu+&km-?5&}vBu@pw;Z>obib&}xJo}wF z`eXW+It{~@{H!7Xuf(HzZqSsfnneosGuN&m;xk{1yIlj`WbHoehTfR8~217&d+ zChhaJSCdNRe`)MKM3whJR+0`8Jf-RrEtWy}`TgfE#kRbyy{wFz0uhm>MjL^Z=V%2G z52;`sG!2dV(zWF&$I)|*-ap*S(!J{5;uva{%bqr}JRPkp7!NF52)oHZ`4Na*hmru9 zvVO?;RpQaOw}&-Xn4-X^Cn5NZ!$I+5A|Iq@AW3Xf>my$x-&&@Dzd^V%Rco;(C31W&5sqv#2mGEh9$GCclC;!*D_J?`i@{q?ucgvh6mReO zt|ck8Jp#4q%Z$4hhYo&yy^WU;v3QpYQ0N7}1Q%E*jogilW8@z?>fK@7I|g&`3a=k^ za|-c>Y2lKN{unYqZb;*j^VSalOA)g+x$I5Fg~EdHvX>2&g~g(7uFAF)5Q^l@8= zPtDaN#o!^3@T)~x%_tg~+&U9Z$PrkmeekY>hv|NGF)q`DGWW@#F*-)#()JikIb&el zj$WI}NYyALvu>kGU7m7Gf?)G42P-@+c;obV?Z@~eD(wEko7Y|h-8FGW2@CE8iHkKZxM z>{_c3*}Zt)zSK`!-MJb*+WjrH#HSGadadnwDPh_olV$iL3n}Qt;2>l(_2koQp*WSv zQP%JKaVb#@W$p{X9!_FP5sLb?ZpA28CZ-N>b0=xyA7+$iT<`TAC2oT=uRgDF>-K9P4SJnnEAN&FBfJEl zaAMqM6TWd5$f_7Ww?FOzB2CRWufmRJC=Kt)0gL5!|>og!-f{%>$@@>s7;T z;*<#}a&CJvA|YL@J#`TM;KWK3@$Fg9W`bzfb3C)wA365hXujaE?fpY%v09@hKyn=H zjLFcEq7l*E9R{(#>{%a$J zWLyzFkfWTXwo~_XbX9jI0J!%ZPF>FWT%B!WeZp&FqGWEBi^O2bm7X1C<(Qr|n z=gA!V0VtT8Q*DidD=c_NZP^Uw!sjCMk4y|WnbZ@Pge&+x>BU+~R9=!Q^NqnKUvIg_1(ojl7Y@CJrA*QwI(OW#yb zUF-FAJ^mIc={yz&(6S0skZ~5v#q>@2x}vHIMf0ctZp@zWFVW_)Pp{oll#%k#V|LqT zlxG*1wTZV=pu#D}R=)Q=S>zIoV71x1rXayF6MVjFQu4mLaezaZU)MLh$*hp94`hX` za$*s>hfr9Usd696lklwF{4u!qt;bG&n+A~c=F2+gVYQg8INWQ2toC$*WhwF;9M8-p z0yb*s)vwVZyRMal{IwN%1kzXNW7Z}`iK@#TOwu}-_0OgwJ|0*8O3QE8;1KP2c!$@;U$cBOr5(ZnREn98>VF( zZk8w&`aoc2@_wCjk}U5XQ_|}mND$L(7Cd}WL*xcKf|<)Tel{KiFB9-i$D@}YVb(e) z=O^0l6NiMw5`9%#Q9a$=an7PA8n}nsPXI#B5jXOIkfO9LfKZn?`Ik5m_v5bY=gs5d zE8hk!YqgE4?7w&%jW}1?R7+gC_ax>*tqc8Tu21gh(=Wc{Kiiz={Ay&k^8EPs%aH~J z#_E0HP@v$Po?HzkC-j6XR6Z`P&2(f*ZBeVObu9;VC}!m{#anFqZ>nt{H>i{kcO3^G9t9{jAr+zK}I1J7*j)a=XWjyOkc(S zdazTH=dhG@;o zCg&dv#Tc!YTuJB+l>-*^hq6Celys^&H&Vc&dFh@sP5q=Jh44~=R( z|H*KtIsu*ElXO3?2;;GcJ?ynN_`T$QcIvig!SLF$@ozbgnIFmt?w@Ila`k+m|BcJ$ zC%FdRG&xnY_7#|F%aZ->q{H*-=Gb^P90f>9z3Ip3CqRjXrPyU8--Wdh!xD#gNS zdLn)dZgMCYQ~$%r5l@%Jj4uXY!tXbun1)ZnFmAl<6qcihe;Cg9nbk15EK6zehnebM zy;@xmS_u~U!_dLL8T=6A@r(+f_!EUb+dn;?{k88@{xF`gd>L-t_6*K8!TrM=LpLY% z)8qO7605}1w>Mw72mhBrpN@k!H1w2SK-b>E0lSO*_U+pd6K~(Di7;g9kZcAo1#bZ?sXjAqjFngZGfprFX3QyrcdL1Gv?Fx z*ZD@xX>i-YsQ^*8qvifI`Zk%+s8zkez1_g=uIIUg$S%w{^?GZ%F?Jl z7(QKc$qg(AT#jEi8MAo7*H`?>J0^gS`M^=y9gS}{ms90a$cq`h#a_SgBU`sEU`zV=dqE{?G=6yss-^LQXAdl9l4#K^>_eQ;;cWSQS8R$YA7 z29LY+!(YQ=m8>`dI*jGr(Yu2~f zbJyK7IQqdQGnQ*~&H0x@`FR=FtVnAh&8Ff#I27f(Y`S7x1>Ka#k3q}%63?xyvv%*R zI?9`Mnh2Ce7djW7z_Csd2h0MM(gC6UP*{)U(n;56=k>1VtXzvh^Kxm)%m=&d8{f=! zOYT#QZ>1mD#^|ncrjb-X#qB1Ajzr=qE0mq@ox~)SuZX7$bJ;f!2X!7Az`u7mD;8l) z*UP0e`mVj1Z|i%jYjVVztfk)%3%=oK3LZRPzbOQ$zdS)Awxm<&WLZ9XrSeWIi^W{e z$Hm0F+{MR_vbb6WB0DClK=JWLu6?28j*CPmWAR3@Z@y4=H@M!}v_He!OFeE60bBNt zXv@dlai8-nSomoB|%i(VYo(5?KC zh03tvH|>j3H=7(p~K~J-6RD-z|bn$A~ z`!{Nb_nY5cx{aH$tqLg_Ww~a(VcfAXW?JJZFcNVq{Se3EV$^fjJbgQ(d*&c1h2&tZ zZ2eTf+~SMKCJp0D!v1a2yq8p3pfP6PGSxBRa&5b?iRj?Y`q2!P z3PiceHN~{8v#!!+TxosVexlWH3pHR~sm%cJ&Z=cBFwNOGR}+&u5Xs(d{vip~*!MqQ z+h3V9Cra2Tyi`Icc1#f5@d$Hz+*Eau)ja%=5Rd}P=piO)8NP>z{d9nJ?D<+YE!+G| z0m_)THNb@YBm}*rp#NgCm@x26oFAx!~Is`wqPw+9kD~ z)<+WheG9j3Mmz9&nuf8?>uA}7BB&W}p09WFAKPdy;e8Ul)qe%v504SDYyK;=O}%)) zPKiHcBhW4Fln%K>&U&T}u3rFK#x;mtJxS#A&Ztl3w`{jVdOOohxTCeUvcknG!Vw}X zFH2q1RA7Ax=Fp?{8EJ+-u}3MqHd{DB8~_C2`m79OD=hXe1#SL{hAjl8sD`2IzUPMm z&lLHmrT#9zZbvos#MxE(K&rE!_{uU{eX81A13}{HC}O=NyA7MKS>)!aAKP zbXCd})&8?-1K@1Ae?C@lrAU`8H+lCVj>~1jqg}*ykhE0BEIAu|!_gM02kT2_8sxDa z!(whR;4cMKz`k!yT5e@68oz-N+NVU&k7`Kw8Z~`G=aElU3QSh0^oDCGCAs*E0`Z8( zTly1AkNfM~=#A{s`nX;Z5E7Q1my(}^2zuAThL{8k0#+Dbj4b$Bcx;{a#D(B`x)rV8 zrzB>`J>IrNZ1;6kpkLx`8d;Il2;lnnGYk^tj$7>*c?TPfgb4iSduY0~>P5Ri_MA9sMcPNe{A{;)MAC?zh@9{< z+jNZsrieL^!Xa~ zgCuD|BwqY#v1Uvz7gpm9`JRx@i?{L|IZnib|AIZM4h)YeM zZ9#>!^*!c^F-CeuSN&j{Tjz9pYmkg9I&tQ-VJ#Ji#5>?4ed%D1j$$nLA?YORgKf;% zF5Igi7Pf1zNFJ^VPEbR631J7{JV{8-q_v%I@lGf~S#As4bMOt@8r7#47ASpzA&lnk z$-*1Y^qsVGz@-|Oy_Nc}8IGX5wQp|~*ou+2QB6y{J=_xg4YZQ=L)HQKWqd?y|ZytSVl^{C1Yr3C>`(ji2TGpA?#j%S}#PrF4o9G&U!wd-%!RT~Za z?QSIY3D;4xl<`Ee56pO8=K^0GeiYr+!6$@{pZG6 z0RI6LzWxtDJkeS)-Ax0^`0)1^nTAY8@e zaUsLEZ*E9vp7MgKIASQyxasbuWz!p4yLRrOU;_O}6Z<#=2Tk>Q2jqt+xD5}QjRj)V zP#iHh2jeads||4K2j)(wTJ=K}q}h9IT43ax8%bMD!ITa%)x`k6oa7gwAC(XlGbyl@ zGT;sE)ruL%x7DqV(>W{fY}ksH)P2IL7wXBCEAj0_8wXkbd-|Xvy9q( zU3pW=x2~hxDCp$aY{ZC2G55=wNfjEGe?iS9Q@;@s92!HvGO zKOAk5Ne)ZSSrA;?J8K$fDf>Dg6OXo=VSivU&r5Zez#hOjiW;*n_zVXg>cv-qqzk(t zXpy?fm&KI(;F9CUE3b{KwfN}}>mF2bH9%(F1u_ zg0+w3)d$)v0iJQjydWNIL_F-{O0$J9Er=aaKrdGO!Krrn<@sFp6I8l4FDb7ZvYVRF zQ*gL1YP%$?f>heFQC~&b#z{6!l&eb%*NGE5QtPfjUju93ivLDpfGlFU*&=yj+~RJU ztZo_8SSULB<#uuhT2cEwNr~W@$g-`%ws+%)aCCWpBIKB;(w5xG!EP2*pDAR8Q$$u- z0PznuRp)J%>mOw~X$;HXKglBMSu}!mGwf%0E`Of4M-rmC-l;Dij|y#%ORNP8e)3zx zTS8a2%LN|!Yp<@-idzapO91tq7z{-C#PAB#`0hE{TDYfl?ur^>M2Hl*`oT&zns%}X{D{)|Cc8r8$9HE2%bWP5}%^htAdlCI||b_ z-Y+5dtz=?;Dz1~0Q>viX>0$hWrpHSH&%rY# z^)1x_Ii_b;PGQeW9uSf#mK(EgG3C;H?a7Aa$_1>=6dS8+qpcN_wRC`_!MudG0uni# zsy3(03tfgM@(0E(ahTDDDpC|HR2%ks!0d%%D{cD;ZrOpYx*x>EplU-w!!L&4t2g+y z?fdM{a;!o9yJJii(?d;`n|q==Qf=IgKpRx1bbdV;X-$TP^a0m%Vl@Q~N9WQ+&}Ns^ zZ|znn(;;QK;gxza$^9s-4j^To8?OkHUQSkPCL|wLY~iG>B31_g7~W|3SZqw15Fp}) zL?3dYxSUeuV0ZYb16leF+6<~7sgC!Oie6I&Y&g+0x=b?qBN;684j!ERc_++X{Z z@B*gs(0Z=nm*f^NKr~P_^?vT@qG@OO;MFR7C1#DUYfQ}n0@tgq*->v<{K09elWc-* zj)T1K4S3FVSbSz0`6axjb(9!O2%`Hf8okrfUdrKJE)gR=laZuTy{sdP=OZSWu`=+xCSOh z(LzeA(W>iCI`@BdR>g^5<=o|34sEXAV0W1R7H~f&azNgn;tpAN!I#GXfPZ2c;6M@{ zKr)e&5J2RHU0-8EpW~VuT&4I4-&v0jv@Xil_%ir$!l)OXc9>vQ-j5FeJ zvTFR!A|X4zHxA^Pxv4eM2U?b0;tF+;F)P31Trb`ZFW3ak!Hi-qBp{)@@ z1i9erFgR-(B?1fSCC?E`?QAe z9E6&#_{TjGCxC8Xg-NYN?Pj31d)wJDSM%d!#YffZM@cg-!{x@6swR^o1+*YHnm{5d zIzfxDu#N>?be5?!nv+yu!t;kR=1||g1(>Ki?jIo9@3G>Xa1VgI07hHpxJQT@*Yel(;Tv$;~VCPPshxKR5is zY3|tJ$17gjWLID?!lFs@N>h;jR(sQ+X%}y6*Nt52ud#w>4NYq=l%$|Ej4o@oFI+6Z z__6Ov@~r3<$J^P1W9EF?w!kB5eUC)7J>SZ}>-j(`VX{#YeO!xav^HH+pp2n;|2JDB zsh0!0uJ_E&y1tGEF7lDw2F8D|Ilk3pv%*wUT{zw3**L`$*T_~V5sl<52cX78>iz0n zTd?)1vwMny?!+PD-i+-Ao^jLfyp4WAea0+q(zoVU5hhnS>7I@1FYk#jg=d6APt#co zin((l^a!(yA;o$_l{PC`WKQ3*vMgK_J3Cdjc#6d$VY52}T06;DOyx?WzqqS?yPrpV z73=ae?spw2=TWbKpc@ETn5`+*(F@yrlLZ zsUK(G-4dm1?V3D$;~nG!4(v&lFO=d+Prn#ez=ib5YD}O zmnN=6*CrlGkbyiqD)SvQP$!Hs4R|^Ln{KQG&h$d)Eek(yYDA_{3+Z@Ivls6S65In( zcIITmp4v@%I_6@2Jp@RRZ8)PTDm`Ki%La~ zsF0KSRxEuSRNbWm*0xOsCG?45`PmuayduyEB_lZ{LkvneP0 z3V^p9j2n>Fre!s!r-rl%s4EE&=u=Ez;V!<9d{L!btmmrjka%l7!6xl&=G=3h;rt3{ z7p5ddM@XliG-ns?%1%B?nQX!apA;y5e`kk?IU4b?+hBenVO>XXGTI;m@eHP4ZJ>^m z)!LJH4==~P?McRL$)fn+&YOBKmJ(n@Ru8Fd(zy^CeHxj$ux+Jnx4`}-UI`|-!l-^& zK|jNT8=>|1%UbFS!I_A#$t+ferz)bg!ZV-bU3m}k&D*a}4+BJqlf;bT2j}wgwx+qQ zhRBY;LncK4$7O`*6N%}^HDSA9L6sP|(}Ln>4UO37X>rmsiPeP<<+;kKj7DCkUtX_x zk6HVN%>-NPE)%^sLD!NS5;p?8rymK`yM0-Q6s3Rcfi1;bS=XArRbp|31MN$fpoTf+ z(#0B`2cIrWyfsFGKE%$Dmfw#4FZd6Zfi6dZWsQZR@rLo~;@JL|TY>>v99GUMlseys zi-7enksk!%Y7)(ZrLlB}y_I2Zj1Th^S)cNEI{J?EeiA5Y9prHt47qeyB4S%lh@HJP z5hfyN7zS;uDFIjj`7;6DBb=mfDbJo#(l+LmZUiRzq)VjM@g59r9bNQ|iKk_#(2~@w zR@K8nrYv^DI#8i`r9zmJ?crMqOKKTe7KsA`f$2bCY?RjS#m=N-Jz|17l^QXzseWTW z$0`?yRr8nQbxv`GZj-SM=H$9^!Ic*IjQ7?huF9V0!9q_&kMhrA2vXp&tA##PUri7x~X8TSJ$go{+(^T z0b;U2ngTm7Tp2&bsl(Nj)?Bc%%EC@B$!Z;jGJYP0El8rnCY?2mR~xjp`%^*WpEjyi z`QJ|Vy0f+3%xnZPFTZriJWlTO0xlUiexa|S^{<_lMl6hhHvGYCUNUVKM?PTK>^8F;|q?R0r zONqgN0H6s#!REak$@oMOWqV8i8b(n*6gt1ajcAd{1s;PDeea#NA)OjWDd2*S7?g5V zS18_aiv}YQxwQtD*6fL{vY?_%Ezy(|Q5r#>TF_dt`C?`@D(=~DI`5jW%X&4otda$6 z!WyrCR1htRsff^vDJ8x9X{DsX#29*Mr-?e6pCE+K8!l=c6BREH`6z^~e2R>kB^a-E zqCE~rZXTDPwd49j#*WECB8t(3F?XwLJr z6#T`8))4hI-!PaC7Lb9NNE)Vv?Y2lNU*Q2C-C-Ba>GM59I0o` z>^vG$CetO}Chv5uxwY!E8``MTHr_6wZ}sKgwi~rE|AJgk+Ue2dWfr?VU>)^wgTIHo z0rf!xKJ=!UdDHQlXZR*7ewSRi$Fy4o(Jj<_&-@b^E}ur^vy?OvfYCOO>cFlZ{F_Yu z9CBwZ6#KIA#T$#{4_^-{HAC?;xW`z=1e2_zm0&;Q+C+*yhF;~Da~}@QiL=O#f~Ku+ z)LW5^0+BwwDT<|1eSNfKk~hc!GKEtUNn8Cth{H9SU2x^<%5h=-JQ!<#2btVdO>j=_ z*z~gGJbU3etHFHTO#Vh33}_y=RR|Ht1#sWn90b4>>V70$d7)lyJD}y2<43xAiZ$-= zO_N(|Mp-()zg3N_ReG%doV%kT_dul76fgDNN2nf5a?1>U55_5{ufS!Y+S;;WX4}kQ zyMV{V)_;=(ZsopvOquE1dm#krX%mwP39HOfDzpW!L#$1;xiFMSLTIlzUbuS(;*$%kZGCDoq}U>2jdf&=k*8Y3_u<7MaOo(;u%o{9T;<$dLDT?}x%ZmaCy^%LU(7!8PkbBUB0F(_OxfYK@6%TN6KQku9UXF(EgT^N;hE z33uj8cAj+_7|+IvRRx9ZX0bNtCFCc_Rvb}KKHOA+BT1AZqT|FueNyLkrKBF^0<}Rr zh1&5~)Ad0Cl9=hn@Dr+lme87e3aDCLA_CQ;&jz>wb0X7b5B00%Qu1pCJO{U05320j z-mF=%rP)-DzS!5PE+wVAtaoxU9NI9Xh6}wyZz*&<3BG%WPZQ8_e9NMgP&*t!YT# zF9n^`L})IH){r?B_+K{2E4w+AoIgTM^|}Jdyg*<=-6|oS{*4%L`~HVpy_l09);rFh zYFLaV`%XkDZv%by$0)jvR!7@!brm#9WG?(LFnQsiH_{)cNKz8&R+^TbAfJS>;G=0^ zcPiag%|qR}wpl~rfWLrwIUTSCk{t8Xt_}qT+mS&Z3u$uQ8a}lk zTFg;xZXw2D4;k%zz}rG$jH`Zb-d)OReIQ-V>pfR~zFn_x=<=Zmu$A)GvMXHd(w5fw z)vU++ZmP*@I~K}E)9){N>|0$|g2 ziou@SmqcBj$1~=BbV3y^;TY(o?J7wQYwy~32d$y}NOWQVLBF(}<$04=^ZO-v{h*AFjE=&vG^HCjgl|&1Z!itx6Mk@V z*FfHVkiLNq3#piH1l~?p>Ja;&*NQ_k9cL(vy0cx#3w9*iuPZgLn?Mf8=!-dsDBj2$ zXLRZ5bi9Q(F`YaEKSaM)bkYkVs&CAjg9Oj&qJ@^woE;<>AToFfx>&v1HQpj3OXRwhUEHjBF8nTkx z_I6ctV;f#|7g;$UGwxt}D?-$HX8Wwh7)g*-p-l14?=8Tnqd7RZ2rRYyv1e~ee{PNI zSfNJ`M%>}(1lg5wGCvws)gRxVdA3{b==?b}S$!IpzdD&twk@NnlsiHjp%BC34(lqu zK{UqU47XqQBuQV@5fx-Z*pO4@zfLy!_Lx-%$>DLvyL;~~JZic93U9I4b!4gCj(`Xv zG}^aE;JFtv`(m(t^!UU|HT(Q=JSAP* zYzaFed262g=1_M|!A!&To(9Jk3?!oa$E}K-w9~8{G)#Z%E1+)8ln`j>x%6z!>MYqw z5~^+FC6|Nyqrrtn!Kx9VNra+4=fiFcH5f` zPrl*?ELqlFvNxT*fh0*xdU3>xO{^z>Z_4AX@ix+Jg!o;Ex;LeGtJJSc;9+zV-oXWs&nklkb=ye^ zX(LK)x#lw-aKxBBy-%%z+?s!Lm(mJR9LAADYIzH@A>vsbDOotUL^j*-xi{3Mh@y7v z^=*rIhK`lx099)%Z9Bd^Siv3MQICw+4#}@yL{Z8K+E=;+T$3rpnE;h z{;(kos=ZaQ4ifHB#w`gKeACgC|Je0u=lQr}B5Xb)K!(<+N+lq9*9E?Tk;QcGno{)# z!`vtH&87#7pP$x_XnwHJEk(i{(p?PnMBW=~Z-&9tmXhq;^mI2N0b zqoir%-SV#LmSOVP8D!d9HN8GEn8H=8uuzVE6b&OENpsusCbm1fYFJBR3Co|5xyBMZ zD76G}UJr;=%llpU6y~8!{>y&d1N*YwTh|fbIH0j=mN<~^mQ7*G-`t(fP3eYyQ;5T@ zI55ywv6jQsh-F9v>Vqjg3wxqY264NX$k8HPfMtYf+47TL9M)7$7Tc2CUAy@9^59!t z*lE$$dTx)k*!#3tNw*9@^@afYwW1T0WrC+=hzeok6sAyNr)f^%xo!11XSz1E7s3D~ zE$rKFQm4?K@LV@;PaoR4qXLgz7NOvt(d={1EY+MibWY%K{eirZ?a=rVNu7Sacm1}I z_SJMPT7e5-m-H&fxToLA6AUf7FI^q)GH|o6HL$ULYCPut(+NVr6E0;H6V?um$7?#0 z-cCI<4vtuE4Cipi5lY~Ak!^Xx6OMzRO_OK3)#f3~<(r68;`LqMoXf)XMZ9>F&(Xnxs^j)l~8IM8di z`DNmK`X(9H{ie9XFgLD{Qa-#7bGWvmH%(viVdQY_E$i@2X*Y)?%caj;N^R*MeUrGh zUA965jXEk=NAvY?{<>^}e*PZhp=IUbz=@MWGJYKl2S+CfWL8J%9S#T&>YJd={6+e! zoZR(d)xVOG@w>9AKfs|yT<-c~ZV=t-kFuQ0s#r&rGO38}>iFgusNA{Z;i#MyKp0{m zBi1mHY_HHrt*|ju8ErdN-sdsN*h4KEYjGLctGG7O7;=}I^DB2q#ob?s`y0r1l81qj zhNtiohOjlxrI^l4(%(1>p0WDRbFjY)(5cqmdLeG-68ktIOKSTo73Pf>|9%(1uUMMD zT_@dA7#ON>j4RZQ68ip#SX`pVK)7kT8~z9$Rc*(B7R~SWF8>Nc z^^In|fB!yRASai~k%gz5`+5f3GoDR(;)0re4AS#>N@GL>gY;DU$WZX&?GitjR><2o zRw^~?AN~AaLJPvg(Rs|{4<57B*4ApSq$}{N5jqU#WCsA`BuSk`S89HwB^T6L=6I?s zA5pVl-`OJTQZ6jeXmX!o+!@?oQTQ^@5#LXC{$Eh3k9^l3JUGH_FS}#xylK%?g}X9_ z>epGCooyJ^4#Eg0CJ<}7J~oiE^p6PPm@*8OpW;S^>mQjej6vXcOC_TI3xWTTpAJTT zp}yn7f6yd4RT>P_moj>7{-G?t0>{l?V&vD}VoUSOS;61U-Df7kAfWeDmwEmX_e%$T zIms}Gwx-6s;eX>$e+^-Hm7(IwyifTDmG%**xO4w3hT~Q8AJL}&Pqi4Q$K{;VZT}7# zd+auoQY`%7fS?h&`Pj-zJL3+|!S5YOI5%5SGVsK9E&bip}fnDp3{+5_ioJr@+s1J7D7+|kZrW%39+SWAuTVPABT2rY2^KUdE zT@|~LQE^+vf9O>i@lPCUE^&(3J?uY8=qpCn4G;b(9(l}*G}Q5x83KP*f`4@X{@D)A zFQWZt%P)K}0({0FM1}Jw<-32obr*keaZ%Qo&Z8r@L+>9g{NL4aqslfG!kTo>{aR8j zYPdwV;u~!n5^C_ zNSe+KueSXymv-jc>=B+s-Nk&f%%BN4+sN57R=D@Im)sQeDK_?1RB9|MMPlM!PmIws ze&*FY&BH?sns{-m9_);$KfVfF+G_?dh`2+XRgidDi00Se`a?#6g@cSgy`JIy1y04a z!HbfXr`=4F(ci)}qzaw%t0yjLhuh94>`i*&kKy8Kf*OEd^m-yjY1By3UDU`p1S{6D##Zb@j#u&b-O| z-VX)#o=Lkf7Drb^(1#D_W|skk<(}vFg2KY$ygbiki}eQ6LOL<{|bq-#^{SU#sv9rzzHY{_H8! z+ zQDBRQgqV2gv}NHFi*L>t7`dD4N--)$j`#iAaAkZ7kNu|}XjCYA{e>E9KUV9mcUYw}ccf#|d zZOw-$p1c`1wE=%*qx_xrx9sA(;EI}4L>1}QE6=z(H@xI9QLK56n;;DQv5S6>Z?ne1 z-=XpLBQ3_c?Uz=$!Pk8&3lVh>Jy8?>CKre#pku-+xJxSbNpwry;KJ`dNlJt8ku-(V zQKuyN#aXf)s8j9za(`<5;^^dd)d&Y=4L|1M`}9oXvDj0QI_GFcB}$=+&BiOqG_Etr z)5&M#$>2r9IE>3gakL~{&E@Ay}ek7-- zS65_Et9NBkXTVms;{hBg_Xj{}e>334bqR!bdqc`6Jo1}rAiK9#I-ilJ=ua__zDpws zTYbcDPH`f9f#_ITP!V;eb@qsY-P*(0I=I-dOv#L)1e-#{OBh#?G713(Xeu_7{=i9SYSY zfX%ZB%_&bJ;g>6ET=HpN>qd|ZYC;b|M=QG(XYONlrfX&qH=+oZ(i#KYgKe9_59JjV z=!=)?OBL25*7b&}s$Wr}0xFK)E9^SV?#Jz2*IzuPd2PpjUbcv#m%A| zqoGaHQdNETq6+~So{1~g?-ho*keSHi?CUA$B5p+Cur#}An){1y#nyq-d+p`f z>t*yrA)b|QKFrzJk?zpv;#f?DS~GUB7DV&A%_ft2y6Jh0(VPJkE#is=W!mnVL{W*UgtiC|#WjO@drQ+djqAH&3y$~%_Ng@JepU#AhNSbLazB-Jx*ihShXGyY)=l?4 z)|%w-Y;Qh}LwhN;L3?`@g~Gxs!e;Eo>ojQ^t_>;NCZ4B7H`0jh50eZv0rX3O*X~P| zSsz(SZ~Yfo@xMn@iWxScC-?B_+2l7r+SJ@0jbW`BUxX1_^}$D4o`Eut6!26E0W_D^ zdtguaY|)`=T}Fy_@>YtjR>$GsP6z6727)7{)qrc}i&p2uQG18|2F7a8b zNK{mG1_B+eRhK#UNX&-?O+7H7HNqhMjtspwCn^={9M=}TuJ#w7+hhE+7Aa}}7kO_P z71y$@4F`fd0fN&=kOT?t?(PJ)5Zv7%NPs|a3!dQa?(PyixTmqk8gHQA&bjxTeQfXh z{r|>TKdRSQy{c-?k~yE6^I0@z@CV~kQK_ZVOam%*U$p|MUjTAUhIU(au4xKvCgE#pYHGdCb7nexwY|Y0PxG4-9mq1X zK4)qQv%b8ZPkLMFu&&JM@3g3gn-)S)yKslE9C}^5rGla&K0W?L=A_x5nQ!HY^|_W; z97i2Sg}I(bg#!9&Z;abFN6$u#4VPe%qspH4pp}NkWI_J0SdW830%7G@>t#B{%nxOL znFpN#r>95As@V|ex`3ms!EvLwd%F)b+AcZ}`#%lj_I#O@$_Nw1>w>Cro)No(qJKvUPeE^p zy-${k)~X08C|Iyp1Diq-kjJjc1*8~Zoj0axT62zN(rK2>&9xbZ4hp{|%oNc}&`{r9 zhX4}%A=`U7u|ia3?<(SZLXhO!;0-%lc>a{k<{JiLro(z>YVrPBD<7ofhU5We<7vDY zch|?1dSeSIdk%1)XY;PN<+0xgfYx;^I;>6-@k_#tfnz1W5vM(WOf0t{u z_VL?H(HE7kNW!tuqt{D#Z8GbDH%e97`b`cU7$ltCw&}vwtIhF(knzNeKr`b;Gl<~B zrhj9v#n^&9yX!AI0sqa9PZ!(ZsmPq197E{JX=kc&;gd~K7T-3;$oOai(3p%75ODdq z{r*D11(J0$+;Ow|x(HiDUphxX{`cvc;afhwftWS$E?%sBJ+Zc|KG#s9`+&Gny<0WVoV?CM?j(twEDRa>sTNHG(kW zMlfil(L-e>ZV1(96_0W2Ic%TH)&wmaPqv*VA_D^Ie{j8k8Avd5b(>42%<7~Q2q!1v zrP_J_U{<2m(K?>Sq4I0O*koudjnB4m)vK?;=!jRv?F(SaIiP;qVsrDmhu=4P3TP3k zDT~v~hMPrWp1}@g^5?P=*}sn;r$hqil`^<-LGljOs9y_JGMISQT*6E6TP0zZqYp9L z0|wt!QjZ6z&zB5E9=Du;r-Jb;0prfcU+6csOvW|pwY7ETqjT2mR-4me$-ZI~|7z|3 zVHKD&ob`*GGWJ!Zf(jXJ&opqK1B4RsI&*d_cc-82_ks-uFqR)P-oYJk`WvK?d{=or zWuc?PMGOg?%J}#}_Pedsj|-ssX>Ge>=bdsGrqG1u&sD1VQmwk9f&RIakZ>%y-Z0FI z;Xdr2EX!zXCPAOw5BrB>DvoGhy~^(=v!<4(1m8@4j=;D2)?%4SS4nO5`q;A`UO5-gez!xxwlw z^vx1ptP94E2DZ%?}|4@$XaYIT=B zuokVrz{NgQlb(sFqJr2&*uvvM)4AiQ>;TAmj^#8m0FO6 z_S|Do{YMqj7sdV#=lqA8(Jj%P`Wygc^(&A+s5`F`Xfr4|jm1FFD8Wt)`H!&NfALtG zU>@t9a2FZ*pV{m%m_ifxH;IBvE}!C`=@ItI;#HWNoeX(!arNknP@aJEw z|A}_}qgmfv(0}KrQVSY1p8nKonPQa*|4*#sf9B5S%OAGAKK5V3M9uM0%D*6MEt`?} zUpo=sTq7r>WE(AO>0tfiwf`o(?r=m{f`M%xC&HUNQ5b4*e|^Z}llK=a05F=2h{!MH zyaGECzUl>Sp5X7`{>r~h;~#*LLEw+|{gu>2yLn&|@!JusN&OFD{Sy`;S_2dAzy&Mb zpY`T<=gu(U!~q+;D#x^cp-W2Da+t%|Dl#hB1u9_b+i% zO;)&8&oUGG(6v8b8(>2tM&{!Wpx2xZ@?Q;~ViVXHBRCGN7Wk`?*nJM8O(2UUIr_8B z>u-N1P=w()!C5#Se_10h1#Df}Q8Od|i)BUhTQDk&Ql%QN_v9~Y9HJ53cNMfL|7*dr z!Yb^#4SiKq_%z_#Jx25KBTe^d9!<}qF;zF@v`Q7oH74=##^W~ztEKdDqpZ|paO}y; zTP3-Jt?D1sF)8&oOe+WG|0_9(62m5c5*15^^uMh;|MGKG0Vb#ReCRfenRMha>gHqW zf8Uw@rnjJ4d=#d!=sHj&)wiH2^S~~7kD&}vud*=$qv`0$0j`Cp$F8c=)kt*iGB0$pF8Echw;9epOv>ORMr6+Gd&xsCPQ*QGc zXO@|mMV)*Qw|v+0c?m|S0*e_Dmk^iS@Z@W0fl&jnqoSd`(WF@%KV4~Sn}fyaOa|^` zVbd~|ryE?|D72>p1{~YgTAm6MLsq*w3JI@2jMi_M11r~D4maUuO3lH&FJE8PhxR|Z z@Saxp_s_k#;-3uOP<)WHn9P3Lry`;yo#oxik>(2^{Mu$x;|F=1asg?j%0U_{)?_#w zw_e^}R8%Z$_bs;`V})t`eceS4{ZEY|V5BIj zX#l@$+PAqz$3ks_23Jk{v z$_-uH7nny`T-<6*t=y>y`*ekdh56XCz?dz$?bqq%OFy+j*M2p81Sa-{Pk7Yk2dwd% zdyr+n1)|5A-5hfPd4|T6p+dRPUtdc6cOCCees)|y%3Ef}A4uIzpu#fb%ga}!dlNUp z31W|s^eK><%*0!VUS>}bCd|XdWEnv7SjX2VUusrLQJ7!ST=WMgL9ycRUHQQ7r8AQm z^d@pVqpN%J@i4=2FT=5mhY;#QJNBS5@_4hx46^}$dXr!sxOEWmUW{*D%s`EjAt!-4 zof&7J$he_+;Nd)I0*oi(cl>9E*Vp)X>l93;i)~Zfw!RMtrTL=D$}xUdpjdX#C+ek~ zBsG6T59TcMTwj}#>L^ejet~^tmQU|oT;vChOUXPw8+@x3C{up ziJb?nFK!gxp55oT0z*4)wt%%J=Q+Oun<2v@EL}Ph=RFu`kFBKYOI3vHm+)D5_e^@Vin)2V%X>M#)|ple`9OEjy^_Zg^l78aBim?ow!79Ah;`ip zmPmyjmz^HhB8Cjwfdz0staB9D`}8Qs($emIT=f7qT<5k|X4qw)vh}=k!WBzl$?I|@ zDTfiG*k9~-<#51h27X4tUex6T5DxPuQTeE`%|2vEZ=5p19K~m@RF0rlOm5X2ZvR5N z_13k}Pu|xZf-okrk>TOEk*>+=o;@n?EsRd%?sCkLb^<~8H(;NcN$omr>7LNC7?q6s zYkPNM(Rgo1{a6^D7Ja|#CddDr02LeE6^i-RuAoUbukAH);&PJa49+L?Tc0 z>k5_feHWEa+_BQ8BCEO}Baa3E1D|QD5=;1WCH=;oV>k-HdIFzH1DmVKQlv#BBbcrj|X?XS2<~VxB5#~JsM1@E3Lf?m)2%r7b zIEe!3xqm0zfKAN?Qw8n-m~w;yJp(txWRqOmc;_9yQu0Ml2v># zu5-x4I9QxTLCpqHV(CUztYD4$Nu8JolQr}SlhTCGe^&r2Qx?SJO6B*txmyis%g9gI zXnj~+)W{zndwVdvMA4o%H=HpM=83jeKxK@O;y@&c!u&+oOUq)6aaaLWy4>yUNCZBL-i z!ZY(691~ytl64yURHc^jOfqLJ z@EH3%Jd-2v^WBM4W%VWmVCYD%l3|Y&)3X&LJKIbm6$0sWA6yB0SARqB$!3MmIQ6N1 z^@@Bq^EC6x;us}0E(C&zM1OnW`Ruqe;GG|#2`dK1bQxww6VL2z$Z2u5p}<#^cqGRK z_9=M})~K?0Gx#Y@BHr_q#(|EoUn<}H4iYZJPcrFB2iaSyaN9oP(Q{6b5qTwu<@wfH zPUKEKZ&AD?$lY>2F%eBDvVU@K!xCLS;aee7V7xECH}9}Jw+aC+R&}P?Ec7|cY~UcC zKaeDCwRrWshq|`rVeyV69&Mezmt+?}e!b=0suLef*UKz%Utg$iNh(RQbm#SMuucK% zk>YT<#$C0o+x(R%{Qq8OvIrDD>lD`RmH29?2D9;w{`XjMi0EC5$Oo6~`m^-~N{NHV zEYx0couK(hf_%B1u*%qv5jlnTuoK5X%_Q5PSX5q@*?iP{v8AEXOeJ_z@n^vEK_&h1 zJ90YmFb#SQi*fE?>`Y=B;lsBh@YM9jzXEi-MwDBPw!G4stV+uD>eeHeM&`Y-!~IKM z3@B!lY)mAB1OiiQ@6AX`N^uTY{dRTgjuWvV8QQ$VGBIhC;qC~wy^^T3jXTTIP#iy# zigX@M5p}i~u4mO#AI`DI+9QPvYhp#XY0;$Lc`Q!1(yL^#;ZkH<_t*&l)-wlsF5bI>b}sa*F#pJ$qOj!oj35 zc=^kKlO~r-Nj{lrY&v;BTch){Y5?{4Z?IO2k zi<2su{9~)=0`(4bIe~Z4a}~Nu@|~JmFKEE&$D)HBFoU?jB^Sz65! zabi5KFtB+)aOYK2D77JWJ^wdR9tykYtNlukD`j1E50N};N1Wtr@%&B z0h5mmn{QeeiO32#*PO;IFyX(8xzU~sv6&6VNht(yZ|oE(yySUpB}BT@f+!x};N!j? zXQRb<=p1coadmhT#3#MR-w7yp zx4b-nQu`&Vh*}cEt=G4=hbXUW&ibZF`jcw#=+bN(y=r?qaR|YX>&RNKfzJIhsZsJBlq(& z0kWH8+`PdwbAr*7gi?M=#P=AXuOy+93;0b$5hjR$2VpT1-h4I5NNJ*McRlxghe9Ff zIP?jbXS&EQO+8ylF>;8w4w!M*?2z>i5?xAH`uygZ*&7DR;GIbkPsKNl?Ih7N+P08Q z-3p^Dl1Z(JOM03vHz5r^!uJAOy0OzO6~nxkVuOWdeUC4J_!#f8F>ahBXLTgzyvzyk z><>32_?=Ln^OzJv>h1RQRy2(PL~tbqg=k@CND#YAFIQzT1UHi0xuGvI@=Y8T+|)7Q z7^Ec)>D!}ir}fUp=Swmm0|`ZVf0;r(h;C170#khd8h zU_1JS&*I5@qQn8y8b~2^*>gV}i{0jR5b5pyMEp1}xwsO!Hzu2iwtOqY;saCW z+sWzr6zs!q?PafhO%^MS2_;P^XOLrFNFrc9IEA*aT{3g{kmOaHzO}9h_d16!((Pk2 z$~*YQYC}@uVnXDN8IDFK{hbRXt~yswWK(T{hY_q2`bxFVhd_)35Fz}jf&1s}XAMJZ zPO6uBJvagz&F1uA;?BDZ4OgS>r*O3u99oh4U3BZ^vq0%)w;1UmG-&C^G$vj3Iu>YL zw}y;pmjvrKgqum26{Jyg_eul&#FO~1`ZDRCUvmuXjJ01+VNAI*6jR`CTr^G=vBN_I_n!>gGw zl*RE$k?L2c!CcNb&odVgB&AYki|>{6138YMrM9$|a!3Y%3gK%^1 zWnfG9C+|8-X~k*!))?;oSS4O;iT8x$+vovSgVCfzl9H4Y$*#Jp{!2-QM9~p*`mDTy znPK(Dr1eBB)V!1^-8BxNuDNQ_B;;`pOOaouyM^TbpKidCPSZiAC&ujaR8 zz2b4g&E->G=XbRnJ$R0VEOY8WJ|U}z5@*O&3y;-xn##gawpjU;UX}sz@&9%*iss(C zg4?0zgsWpf{-ipHz_th@$k{VdTevZ9Cm6ukz`?G~_so0i?QrZKVom`g{7kXS~N z9Fn93(&Kg?Lt{0&hS!#FSePJfG1Y4`t z<0BXw9rj^32UI_dQ^;nfzYXO@xj3>2ZOlbE#)H)(ArKCxQ}mWsDwAXu%TK=(N4x{1 zB-0u?g#=dQ#N6&aDAm|uPO(Q|g;5QVt*@X^tqk7XM`gEFiz9+tC224?&+z@@0&qg~ zV{&-S`(I@qnag+V9?M_sjhIW)2<~j^jTXh1aQ>4aqVn4iNj$+jCe15KsnVfMEK*D~ zUa0g0jcn73pgaj+y89tv`fczjAYl_9`oyM-a=wUQKzKO1y@jHi10~?BhrY06 zt+MGVI3xW1NVO)v`r_hBPgEf5zquP6?Y>TmSu!s3A_Ja_4*8Mjo{2ti-Bv&e=($Bk)lXKwy1KjoD91oaV*eez{`3i71!9B~ksuZf=^ z9v(NCO5KRX;5cw{Sr}$8sNe-jgvX}AQpUFol?qy+-BgRBFX+Q3LHah!6G+prZ%6=7Uf2t!fCsMx-6Le`y&M8R`3_A*N-`g5$NS~yD1k(N!AZe5 zud{wFA=`-GzwpP}_k4yVwRML?J?EPK{$<#ly==+x7tKLFAX)W{0&@F@ah%(eU2};5lzAUZuZ#hd5XW4ELeW=jhk=TCYg+{li)4YKKnH53lMS=6gH2s&1WU z^R$gQ?pN%CI@7rK^ue2J1^OyYQXcgwD~g>|K|_+=92FTr3mTjBrgr{TY!Qd}U=$Hv zwptvd^T8OV0SF}h5FsqSasjJYH53qbJ@hKqd6S{WLrFu!i{l|8jLIMJBF-10hVG0y z&3nK_f+L~>bK1=poL`o3afqKIs}T_CqB83J4CJ(9cz3hpwlr$2cu4RdDuW4_N^-c$ zXyiI#-yWhD*T@g(?YAzRB-LArAO(^rpASyTuz?!0d`t2K8`89-kH~rL#}+_A{kiaW z7tQJYb8|clrR~NtP1LzeiTrLP3uPd^7}U&JhGiHOBZj92H-vqhgq9Hd-szrFTO@aq zl7-9B0IJry#gF^-S!T^0_}9Xm&`m?YPb2S&3&yA5LjI_VJeK5j1!v{0r!Yuy$=h6@ zUc1*h!t^9jboBH(j+k={bqCd9Om|9&Y9xsmQIIlCP*MD|%qv+a+E^mk8xPfnCS1sS zlOje|plIu9&2v-L6);Ho@ePR~nYuy_cQog8Qj|<=7H4oQxMgSwxf1GZtiqQ2?3YBf zl#l+LR?oB0Rz1g|N>YtFf=%I|2*7wB$4~H-x#wpISz{7SCBP*%9SqAD%5SOKOzw&n z?P-DmR^X+HMNz?FRy!P$i>{XST->oke@5s!njd99N^(HT-NF2+#168+6aA8FIWo5^%_ z-K(W~l~~X5#`EzGDa1+xzUMN9TkS008?b9Yr=0vT(tjU`qVQXCA9Gc_X8gtd30X8% zv*)+>-H#R$et%qSdi$-y;1}Y2pN7TN>-~#8M(IoE4C1q26=6z-b?7gL9W$xF!U0jD z5wh{&9Ie*`Z)m9ty~_#)LQ>1Df&kz11_PMQ=oPtX6wW1xUN0D-$&w-jA;mA8Q4%ST$F2iXgUp@SkiofrGKsmvn9Hw+f0G8i_4rmS}B=+Rb zyPC!AGVaA!Fp!9wTq7gHvRrTH*lskk#3VUu$jOW>efZv&HG(~vF$J@pWm!twGK!0L zCks9(>+}vSj8!ti3r#rN{_cqi?n|vvf%TG;LEL-H*UQ2bGul`-oGBbx1ew5L_gHQs z)5p__K*R%|O~IxVN-=m><%$Ke8=?yPDMB)AV1)L{dguH8lL$5A^mI`i0OWe#E;4v! z@0wr|=K=Z_iJn5eSMk;(eQa7}_c2@SWFv5iV$r`Aq1BfBb^dbD{_{S_`lARdkom+6 zk?Z|&2OJhisWXtv&SFj}R&O?@WxstJH`0%o>1(7K<;^-QmI@bp z(@1_FTpVhdZ$_`2UMbMvyOIwW5Hf8KK&Gs{{1I=a=U7=mc}TqYunkBdW_xy^eEt|V zEHV{AX$-Lre6CflItb&RKom5d_QT^X1L9z)B}Hrp1+7$14SuyI1(~n&KHl#A$s~ zchoyz+i$>CEfEQth?^5T>yuWdWm3M$l@4Sk_{LqbY2Fp0IP@U#Ps3FdHe7i{{bvlR zrFyUxR%Ngs^Cov)fs<{ZVZUc>9ZzMOC+jM@x z@bq3ytX@Smj2m~ti5U}GokJWQ89~k~#`*$hkpL}}<^oO`IsePgz#k%r2Kv!Hx39X@ z91sEd#o}8oI>ZxET`pJrcq7ll=`W%jF^IT6?>Y6}?9V7?fp!!#qTXCA<5ufn`LgK0 zqaibF-ZaL04haDvrSfd>8y+*>*S_XV*xw%yCfS=7rQyTbf&(v1GW`(2X%)A5cZ+K6 z+la?kIe9$rhJ;#ZlW|X>tXoHCVSiss0Q-TBcqVorZl8}={r+v~7dm%zrwA|gfrZmc< zoyVFkI!Dq!UBK_Nn5`je%==A+r*4gP8KdpKlk#Iy1d(E}EpjmSah3riFkk_;3oexRkp&O?u5F-RcgFTSzhx1Bv*^%)EPJT=dP0-~gO1O0E7!SRqItld ze1kbBI(xHp5y?^@lw5G9d$iM_H=-rtdbQ$!9D+^k&{<@+E7P#}MsC6;xxh3E%VCPX z$G_80PXlQ?(K6r0=|~7P1_FQLh$P=w#8G*3=qjgb9g%g6bD*KF(ZOfG9!$HP=CTke z)woWI)W8`~R_V%>*oe1**J-zSA~NnBwij}L?Sx4t7CO0KMVB6=bKSDIgnVd7ML>-- zO(~CMjV**ZHKKLdatJ99@nzZe{U^gw9zAX`ry2@%fo3-NHxSj6X+dbe&VE1<6 zfNzvIvT(4XTvsFlf5!drBd5spm7f;*XD_2H&Vbf6{1L!{&beLG4UyC-C$Ex3f--YH zDAV7S-wx&5zO$!$m{|SN#gPZi+&4?!?Pc2m*Dj~2!(5942kg1 zFY2Gb@C_ue6qyfX%5!&Ay%9#WeAV+wh1vmQPAhOnM@#HhPTu{lw=ZdRhw#= z629Czgh%UxilyX@_9aR65w-ceoBea=7x1{1$V4eLXfMLtBwz;kA%eqdvo%uj=6du| zk;2ddRZM7)`=a4d@=u6x=B2ysJ6Ajd|MR{&6$tl)`R@KX9eHKN&HELJYUlYkb8v5p zlTjot9fhJZorD3V!nyLT?lv@iGBL@w_r8d^ZxNV@Y@kdt%N~PdT|suQraC@qwmo4| zJW1h)7m2MdS08ATGZ0R#Y75@<)jiH$QveZ=B29iE+m!U28Ai*#C!6KxGV+vo-v!R% z0G)UHFG)Y&3GkPItd~76F`4X<@-T#~KAW~4stoXGTq$b;eTPFD>c+V`@N4V=$2Pe8 z9Op@4KYR%Se>nRw^~EcaLEX{brg%R>jO|*l#{VK2LH6VSUcCv=q;jhBiQypPq1fa4 zN`NngNAo~`F}4r3M6~GOS%4;(kSQUQ|Dw_Zlx|@p@6I16U>%tzy(_*nQ!vg6jeCX~ zn)xjA2aZ#F8jmGh0K-lfkA(3xa&^<5M>bE-5KAA*SUsFbKd3$8(#G~mGT%Q^5fZ%2 z3$x1D+P*9v>qQWGU*U3D$du$Z`$yYo<*NqyvHLFw%2jRyGC$m63pigSDZ)T_6z;*# z+GVY2P`?;EI&rIocBxlzSy!WDM|)X>7a|a&R(@}wN|1CoTMJ_ zxfTgV8fC32y^)A-VhzCBVzFnh^KpbeGr+9^JLl%ocnK+O-UT$Yx9jA86aA1Q=-()f zc)XygB7+D7QAYEI&^Q)Kf8TltEHJR9IpOrGOVOOZGSPaI%p-28D1^MBicF5!U+g@2 zrh%aJtmG#v02^YxIyJiM$JwVy%Q$t~NI4t-lZKlgmj^THu87k-jR83XA`VB7 zKW9~oki#O3YMmJ_S8(8PA7;~q1lvnbm=w#8Y0_g=(O-V}NJBT}Z z1d#>iy*g_3H87f88iSm6myo6)iJc?|jT9R&h5zp*s)H9%NMm4NN}=z0oW!IDLBxVa zd>9_{l|9nMcgkOhkcHeBU+*18lP0_}?S;-r#T~s*noX;-bVo2COOzg6BBEKI%oebm zX{J>^76~T6?z&a`upzLrVqFeYOneUnCnHb`1f6wK&LawuNyE%9R_d~VzJAEmBm+}#Qxtxl+2QG~hcEJdvP49=Sio`L zd(E(&hR_>lIfwO&rW6^T^pOA4+!-lRNfK4H7gqMYzO9THul!e5xEy0~v?S0UQ}I)` zhZ19k7BX{K_)CdtdIK!oVFApl@T0g>IQ@iYs5|q&};;E2e32FX3HZl zgDa^DDV&kE$_g$vbZX4?%>%J3`X6VCo3C)PbEo>KcqW-$(*KzE|ETrf3zX`(-}doJ zun0X<{_m&TVbmi#S?EAm>;4!Q|FtZdPc1qPLqn7`?c7v*d&HOuR38% z6AfIX@D@s{Vd8&n)IZ%tC^GPDeKn3A ze?t<~!bI!IGhW>{x~u&HpM?l|!{4B%Bq84!`&|h13jNzZ|M4?|9f3M|-}P!Rn&Eji zAQVBC(gio7%k)z}DF>wsi1UV99Itu4G3Ozf%QJLc=7j7|R3o}ejZ-3-gD;mT&C

lH{Y6 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 E2WMS2A^-pY literal 0 HcmV?d00001 diff --git a/scripts/aws/lib/construct/backend.ts b/scripts/aws/lib/construct/backend.ts index 4ddff1e00..5c8540bdb 100644 --- a/scripts/aws/lib/construct/backend.ts +++ b/scripts/aws/lib/construct/backend.ts @@ -14,10 +14,6 @@ import * as dotenv from 'dotenv'; const path = require('path'); dotenv.config({path: path.join(__dirname, "../../.env")}); -console.log(process.env.LANGFLOW_AUTO_LOGIN); -console.log(process.env.LANGFLOW_SUPERUSER); -console.log(process.env.LANGFLOW_SUPERUSER_PASSWORD); - interface BackEndProps { cluster: ecs.Cluster ecsBackSG:ec2.SecurityGroup diff --git a/scripts/aws/lib/construct/network.ts b/scripts/aws/lib/construct/network.ts index aa9e48dc5..7dcfabaa0 100644 --- a/scripts/aws/lib/construct/network.ts +++ b/scripts/aws/lib/construct/network.ts @@ -1,4 +1,4 @@ -import { RemovalPolicy, Duration } from 'aws-cdk-lib' +import { RemovalPolicy, Duration, CfnOutput } from 'aws-cdk-lib' import { Construct } from 'constructs' import { aws_ec2 as ec2, @@ -76,9 +76,9 @@ export class Network extends Construct { }) this.albSG.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(alb_listen_port)) - this.alb = new elb.ApplicationLoadBalancer(this,'alb',{ + this.alb = new elb.ApplicationLoadBalancer(this,'langflow-alb',{ internetFacing: true, //インターネットからのアクセスを許可するかどうか指定 - loadBalancerName: 'alb', + loadBalancerName: 'langflow-alb', securityGroup: this.albSG, //作成したセキュリティグループを割り当てる vpc:this.vpc, }) @@ -127,13 +127,17 @@ export class Network extends Construct { // Create CloudWatch Log Group this.backendLogGroup = new logs.LogGroup(this, 'backendLogGroup', { - logGroupName: 'myapp-backend', + logGroupName: 'langflow-backend-logs', removalPolicy: RemovalPolicy.DESTROY, }); this.frontendLogGroup = new logs.LogGroup(this, 'frontendLogGroup', { - logGroupName: 'myapp-frontend', + logGroupName: 'langflow-frontend-logs', removalPolicy: RemovalPolicy.DESTROY, }); + + new CfnOutput(this, 'URL', { + value: `http://${this.alb.loadBalancerDnsName}`, + }); } } \ No newline at end of file From ebf3189f874a62293f84fed2dfd101ae865e966a Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Fri, 1 Dec 2023 06:39:23 +0000 Subject: [PATCH 098/203] add README --- scripts/aws/README.ja.md | 44 +++++++++++++++++++++++++++++++++++++++ scripts/aws/README.md | 29 +++++++++++++------------- scripts/aws/delete-ecr.sh | 6 +++--- 3 files changed, 62 insertions(+), 17 deletions(-) create mode 100644 scripts/aws/README.ja.md diff --git a/scripts/aws/README.ja.md b/scripts/aws/README.ja.md new file mode 100644 index 000000000..f62de113b --- /dev/null +++ b/scripts/aws/README.ja.md @@ -0,0 +1,44 @@ +# Langflow on AWS + +Langflow on AWS では、 Langflow を AWS 上にデプロイする方法を学べます。 + +このチュートリアルは、AWS アカウントと AWS に関する基本的な知識を有していることを前提としています。 + + +# 環境構築とデプロイ方法 +1. [CloudShell](https://us-east-1.console.aws.amazon.com/cloudshell/home?region=us-east-1)を開きます。 + +1. 以下のコマンドを実行します。 +```shell +git clone https://github.com/aws-samples/cloud9-setup-for-prototyping +cd cloud9-setup-for-prototyping +./bin/bootstrap +``` + +1. `Done!` と表示されたら [Cloud9](https://us-east-1.console.aws.amazon.com/cloud9control/home?region=us-east-1#/) から `cloud9-for-prototyping` を開きます。 +![make-cloud9](./img/langflow-cloud9.png) + +1. 以下のコマンドを実行します。 +```shell +git clone -b aws-cdk-dev2 https://github.com/kazuki306/langflow +cd langflow/scripts/aws +cp .env.example .env # 環境設定を変える場合はこのファイル(.env)を編集してください。 +npm ci +cdk bootstrap +cdk deploy +``` +1. 表示される URL にアクセスします。 +```shell +Outputs: +LangflowAppStack.NetworkURLXXXXXX = http://alb-XXXXXXXXXXX.elb.amazonaws.com +``` + +# 環境の削除 +1. `Cloud9` で以下のコマンドを実行します。 +```shell +cdk destroy +``` + + +1. [CloudFormation](https://us-east-1.console.aws.amazon.com/cloudformation/home?region=us-east-1#/getting-started)を開き、`aws-cloud9-cloud9-for-prototyping-XXXX` を選択して削除します。 +![delete-cfn](./img/langflow-cfn.png) \ No newline at end of file diff --git a/scripts/aws/README.md b/scripts/aws/README.md index a7be98720..00eb0eff8 100644 --- a/scripts/aws/README.md +++ b/scripts/aws/README.md @@ -1,43 +1,44 @@ -# Langflow on AWS +# Deploy Langflow on AWS -Langflow on AWS は、 Langflow を AWS 上に展開する Project になります。 -この Branch では、AWS CDK を用いて 各種 Dockerfile からコンテナイメージを ECR に展開し、ECS、Aurora MySQL を用いて Langflow を構築します。 +In this tutorial, you will learn how to deploy langflow on AWS using CDK. -# デプロイ -[CloudShell](https://us-east-1.console.aws.amazon.com/cloudshell/home?region=us-east-1)を開きます。 +This tutorial assumes you have an AWS account and basic knowledge of AWS. -以下のコマンドを実行します。 +# How to set up your environment and deploy langflow +1. Open [CloudShell](https://us-east-1.console.aws.amazon.com/cloudshell/home?region=us-east-1). + +1. Run the following commands in Cloudshell: ```shell git clone https://github.com/aws-samples/cloud9-setup-for-prototyping cd cloud9-setup-for-prototyping ./bin/bootstrap ``` -`Done!` と表示されたら [Cloud9](https://us-east-1.console.aws.amazon.com/cloud9control/home?region=us-east-1#/) から `cloud9-for-prototyping` を開きます。 +1. When you see `Done!`, open `cloud9-for-prototyping` from [Cloud9](https://us-east-1.console.aws.amazon.com/cloud9control/home?region=us-east-1#/). ![make-cloud9](./img/langflow-cloud9.png) -以下のコマンドを実行します。 +1. Run the following command in the Cloud9 terminal. ```shell git clone -b aws-cdk-dev2 https://github.com/kazuki306/langflow cd langflow/scripts/aws -cp .env.example .env # この後envの設定が必要ならここで追記 +cp .env.example .env # Edit this file if you need environment settings npm ci cdk bootstrap cdk deploy ``` -表示される URL にアクセスします。 +1. Access the URL displayed. ```shell Outputs: LangflowAppStack.NetworkURLXXXXXX = http://alb-XXXXXXXXXXX.elb.amazonaws.com ``` -# 環境の削除 -`Cloud9` で以下のコマンドを実行します。 +# Cleanup +1. `Cloud9` で以下のコマンドを実行します。 ```shell cdk destroy +bash delete-ecr.sh ``` - -[CloudFormation](https://us-east-1.console.aws.amazon.com/cloudformation/home?region=us-east-1#/getting-started)を開き、`aws-cloud9-cloud9-for-prototyping-XXXX` を選択して削除します。 +1. Open [CloudFormation](https://us-east-1.console.aws.amazon.com/cloudformation/home?region=us-east-1#/getting-started), select `aws-cloud9-cloud9-for-prototyping-XXXX` and remove it. ![delete-cfn](./img/langflow-cfn.png) \ No newline at end of file diff --git a/scripts/aws/delete-ecr.sh b/scripts/aws/delete-ecr.sh index ebe837a8a..8e3b6a261 100644 --- a/scripts/aws/delete-ecr.sh +++ b/scripts/aws/delete-ecr.sh @@ -1,4 +1,4 @@ # aws cloudformation delete-stack --stack-name LangflowAppStack -# aws ecr delete-repository --repository-name langflow-backend-repository --force -# aws ecr delete-repository --repository-name langflow-frontend-repository --force -# aws ecr describe-repositories --output json | jq -re ".repositories[].repositoryName" \ No newline at end of file +aws ecr delete-repository --repository-name langflow-backend-repository --force +aws ecr delete-repository --repository-name langflow-frontend-repository --force +aws ecr describe-repositories --output json | jq -re ".repositories[].repositoryName" \ No newline at end of file From 16e538de7d152b0549f7e25767168c71ed295369 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Fri, 1 Dec 2023 06:44:29 +0000 Subject: [PATCH 099/203] add README --- scripts/aws/README.md | 4 ++-- scripts/aws/img/langflow-cloud9.png | Bin 46825 -> 110224 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/aws/README.md b/scripts/aws/README.md index 00eb0eff8..0210870d5 100644 --- a/scripts/aws/README.md +++ b/scripts/aws/README.md @@ -34,11 +34,11 @@ LangflowAppStack.NetworkURLXXXXXX = http://alb-XXXXXXXXXXX.elb.amazonaws.com ``` # Cleanup -1. `Cloud9` で以下のコマンドを実行します。 +1. Run the following command in the `Cloud9` terminal. ```shell cdk destroy bash delete-ecr.sh ``` -1. Open [CloudFormation](https://us-east-1.console.aws.amazon.com/cloudformation/home?region=us-east-1#/getting-started), select `aws-cloud9-cloud9-for-prototyping-XXXX` and remove it. +1. Open [CloudFormation](https://us-east-1.console.aws.amazon.com/cloudformation/home?region=us-east-1#/getting-started), select `aws-cloud9-cloud9-for-prototyping-XXXX` and delete it. ![delete-cfn](./img/langflow-cfn.png) \ No newline at end of file diff --git a/scripts/aws/img/langflow-cloud9.png b/scripts/aws/img/langflow-cloud9.png index 5fd5023533df94a9e241e3402e8ff2d32861d062..a0679de0b705a8f26c044da873accfc861eac4ab 100644 GIT binary patch literal 110224 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
5|3S$D9rd4By6N$X8_{+t<#ovs6o&PNfQVkzNGy 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 fG?@+3Jo8VwV#gTe~DWM4fu2|S6 literal 46825 zcmeFZWmuG5+dm4ZASj|BAV{l#A|Tx@(ji?#NDeTA5<`~=NJw`LIW!0i-QrEd00Rsi z(lK=B9-rrZ|M$HgA3gSm{cZ2zV6HW*&scGu>$k2TRb?4M0!jibEG$Af+1F}VSh${8 zSlIV(<6>f*n9H;DYhgOvm}(oVcFpH~u$_eg9`633VwsIm}bt)ZW}2>|kZ*XpQjD z$HKy~1#0Lx>L@7+n%aTbOw8=wnX|co-v2CuCF~-I34+WWP3T-ewqOTA7ZHYk!l%2gf9WUD}wpR?I1ax$C!uDnsf@-hd{7-SrFA)YSN5}Vq z?Cj3Y&TP(HY>L6D0_?9i**Q5`F*#TrT)~beF05dOC;zVGf9rW|?qF&UeD4Uf z1JnJi*W{g@lcNX&!_S8P&*$I$G}>7q)!&<#nu~G>|EvCgM*ZEnf9F;Ox|rMQz6OFYGQbcb%E`z1 zKZX7?XX1Yr{8z;~e>cg&%lp3_{m-O-6#YrDpo%>Z z)11jqmj5K~m$?7QFUV3541Ik0yx{D2!WnVquA6$-S1)aKYZ3 z#`Dn7oaoqP63G_7{b|O1yD>kVF8H0ZlM|`?w&#cw>xQ18E~$I#%-ffr={^n>9?a;| zJ*CH&qf0#&wzLmSjCdp0`?Pt%l9Q{tuW?o=aqbe~5H@RqeA>*aS7o5b4Pt1Okm!H9 z^*|g8`{w=MeR+tt%;FtI0$%?q(|u+MpMl()bQVv1uyAhE{pPEQPJDIYj%ASNAM298 zPj~Pf`}6p3tHC7ru;0FacJfX49qpew?@N61wx>MSJKo=S={DWm9h^_1P4DBzWPZk60Pu>?zNV9{hoy|39mKYRCWktjbS0{;)raUb+Zwp!$Qn zQ}V>;g1|n9Eb%R+NXzb0E(^JyWu>Kdn-c!#c=6HEPj>Nxh^eSvy1KeXB_}f#juu6? zw0xWOsUU4654ZWeYqW;H~*e*CS1h-*G% zz9?|ljOi3x4owlpCloHj$xGBH>bywJ-)o5oFlVf_(oX6fi(+slw54ms_S!;qbqU$h z;+@eZE~n`R<5}LNX3(!f-!DFL-MCaymfxumf|NEK^#^WghnG-1JCBZtq#uyRsX9>w21565 z{8ndu3!c7zx7KdNe7Kd#zqY&1NzrTub!Qj7aDb*(z1T{3*OPRsx^P&BoSFd}+>=BH zfS!i>Y>AAE0tvB9)t6tTDTV80*M%DgzzfSk$&GRBCr{T@!-QYCCf{{2_1Exz*W~Ex znm@HO%~(IS3Bp@kTNAodVy^~8OmDe;u~p~E0@+zt865rP7UX5`+qh;ba6Wh2gvQQ@92YS~GlWTRKq38z1*{gGARcPUUM?haIfX{MFyQGZhI*YnHJh zee{UV%d4c?T3p;`bBvVbF)t{R@e8HwMqD4-)N^ZPg-H+^@Fx-Oj1R0Fp1PZvW`%4jTE9w+l6g_p(4KlEVZi3qo^nQX6p-l zEM~`~zkO7QPga^uVYt3Djkh9IOP&~6Ty8pC9Ac|Pi#Amnmn!lBDm`6w^{dbPp(W8= zeOG|l`jS*w$H_(SH0LapN_~R0n#h5ybPtvKVHWn-A_ujZF%qMlU+KIDLA~4^5WNt} zEi_Hf4MHz?2w(1x6|*n9SqnRGtI^kzk_1Fu+&km-?5&}vBu@pw;Z>obib&}xJo}wF z`eXW+It{~@{H!7Xuf(HzZqSsfnneosGuN&m;xk{1yIlj`WbHoehTfR8~217&d+ zChhaJSCdNRe`)MKM3whJR+0`8Jf-RrEtWy}`TgfE#kRbyy{wFz0uhm>MjL^Z=V%2G z52;`sG!2dV(zWF&$I)|*-ap*S(!J{5;uva{%bqr}JRPkp7!NF52)oHZ`4Na*hmru9 zvVO?;RpQaOw}&-Xn4-X^Cn5NZ!$I+5A|Iq@AW3Xf>my$x-&&@Dzd^V%Rco;(C31W&5sqv#2mGEh9$GCclC;!*D_J?`i@{q?ucgvh6mReO zt|ck8Jp#4q%Z$4hhYo&yy^WU;v3QpYQ0N7}1Q%E*jogilW8@z?>fK@7I|g&`3a=k^ za|-c>Y2lKN{unYqZb;*j^VSalOA)g+x$I5Fg~EdHvX>2&g~g(7uFAF)5Q^l@8= zPtDaN#o!^3@T)~x%_tg~+&U9Z$PrkmeekY>hv|NGF)q`DGWW@#F*-)#()JikIb&el zj$WI}NYyALvu>kGU7m7Gf?)G42P-@+c;obV?Z@~eD(wEko7Y|h-8FGW2@CE8iHkKZxM z>{_c3*}Zt)zSK`!-MJb*+WjrH#HSGadadnwDPh_olV$iL3n}Qt;2>l(_2koQp*WSv zQP%JKaVb#@W$p{X9!_FP5sLb?ZpA28CZ-N>b0=xyA7+$iT<`TAC2oT=uRgDF>-K9P4SJnnEAN&FBfJEl zaAMqM6TWd5$f_7Ww?FOzB2CRWufmRJC=Kt)0gL5!|>og!-f{%>$@@>s7;T z;*<#}a&CJvA|YL@J#`TM;KWK3@$Fg9W`bzfb3C)wA365hXujaE?fpY%v09@hKyn=H zjLFcEq7l*E9R{(#>{%a$J zWLyzFkfWTXwo~_XbX9jI0J!%ZPF>FWT%B!WeZp&FqGWEBi^O2bm7X1C<(Qr|n z=gA!V0VtT8Q*DidD=c_NZP^Uw!sjCMk4y|WnbZ@Pge&+x>BU+~R9=!Q^NqnKUvIg_1(ojl7Y@CJrA*QwI(OW#yb zUF-FAJ^mIc={yz&(6S0skZ~5v#q>@2x}vHIMf0ctZp@zWFVW_)Pp{oll#%k#V|LqT zlxG*1wTZV=pu#D}R=)Q=S>zIoV71x1rXayF6MVjFQu4mLaezaZU)MLh$*hp94`hX` za$*s>hfr9Usd696lklwF{4u!qt;bG&n+A~c=F2+gVYQg8INWQ2toC$*WhwF;9M8-p z0yb*s)vwVZyRMal{IwN%1kzXNW7Z}`iK@#TOwu}-_0OgwJ|0*8O3QE8;1KP2c!$@;U$cBOr5(ZnREn98>VF( zZk8w&`aoc2@_wCjk}U5XQ_|}mND$L(7Cd}WL*xcKf|<)Tel{KiFB9-i$D@}YVb(e) z=O^0l6NiMw5`9%#Q9a$=an7PA8n}nsPXI#B5jXOIkfO9LfKZn?`Ik5m_v5bY=gs5d zE8hk!YqgE4?7w&%jW}1?R7+gC_ax>*tqc8Tu21gh(=Wc{Kiiz={Ay&k^8EPs%aH~J z#_E0HP@v$Po?HzkC-j6XR6Z`P&2(f*ZBeVObu9;VC}!m{#anFqZ>nt{H>i{kcO3^G9t9{jAr+zK}I1J7*j)a=XWjyOkc(S zdazTH=dhG@;o zCg&dv#Tc!YTuJB+l>-*^hq6Celys^&H&Vc&dFh@sP5q=Jh44~=R( z|H*KtIsu*ElXO3?2;;GcJ?ynN_`T$QcIvig!SLF$@ozbgnIFmt?w@Ila`k+m|BcJ$ zC%FdRG&xnY_7#|F%aZ->q{H*-=Gb^P90f>9z3Ip3CqRjXrPyU8--Wdh!xD#gNS zdLn)dZgMCYQ~$%r5l@%Jj4uXY!tXbun1)ZnFmAl<6qcihe;Cg9nbk15EK6zehnebM zy;@xmS_u~U!_dLL8T=6A@r(+f_!EUb+dn;?{k88@{xF`gd>L-t_6*K8!TrM=LpLY% z)8qO7605}1w>Mw72mhBrpN@k!H1w2SK-b>E0lSO*_U+pd6K~(Di7;g9kZcAo1#bZ?sXjAqjFngZGfprFX3QyrcdL1Gv?Fx z*ZD@xX>i-YsQ^*8qvifI`Zk%+s8zkez1_g=uIIUg$S%w{^?GZ%F?Jl z7(QKc$qg(AT#jEi8MAo7*H`?>J0^gS`M^=y9gS}{ms90a$cq`h#a_SgBU`sEU`zV=dqE{?G=6yss-^LQXAdl9l4#K^>_eQ;;cWSQS8R$YA7 z29LY+!(YQ=m8>`dI*jGr(Yu2~f zbJyK7IQqdQGnQ*~&H0x@`FR=FtVnAh&8Ff#I27f(Y`S7x1>Ka#k3q}%63?xyvv%*R zI?9`Mnh2Ce7djW7z_Csd2h0MM(gC6UP*{)U(n;56=k>1VtXzvh^Kxm)%m=&d8{f=! zOYT#QZ>1mD#^|ncrjb-X#qB1Ajzr=qE0mq@ox~)SuZX7$bJ;f!2X!7Az`u7mD;8l) z*UP0e`mVj1Z|i%jYjVVztfk)%3%=oK3LZRPzbOQ$zdS)Awxm<&WLZ9XrSeWIi^W{e z$Hm0F+{MR_vbb6WB0DClK=JWLu6?28j*CPmWAR3@Z@y4=H@M!}v_He!OFeE60bBNt zXv@dlai8-nSomoB|%i(VYo(5?KC zh03tvH|>j3H=7(p~K~J-6RD-z|bn$A~ z`!{Nb_nY5cx{aH$tqLg_Ww~a(VcfAXW?JJZFcNVq{Se3EV$^fjJbgQ(d*&c1h2&tZ zZ2eTf+~SMKCJp0D!v1a2yq8p3pfP6PGSxBRa&5b?iRj?Y`q2!P z3PiceHN~{8v#!!+TxosVexlWH3pHR~sm%cJ&Z=cBFwNOGR}+&u5Xs(d{vip~*!MqQ z+h3V9Cra2Tyi`Icc1#f5@d$Hz+*Eau)ja%=5Rd}P=piO)8NP>z{d9nJ?D<+YE!+G| z0m_)THNb@YBm}*rp#NgCm@x26oFAx!~Is`wqPw+9kD~ z)<+WheG9j3Mmz9&nuf8?>uA}7BB&W}p09WFAKPdy;e8Ul)qe%v504SDYyK;=O}%)) zPKiHcBhW4Fln%K>&U&T}u3rFK#x;mtJxS#A&Ztl3w`{jVdOOohxTCeUvcknG!Vw}X zFH2q1RA7Ax=Fp?{8EJ+-u}3MqHd{DB8~_C2`m79OD=hXe1#SL{hAjl8sD`2IzUPMm z&lLHmrT#9zZbvos#MxE(K&rE!_{uU{eX81A13}{HC}O=NyA7MKS>)!aAKP zbXCd})&8?-1K@1Ae?C@lrAU`8H+lCVj>~1jqg}*ykhE0BEIAu|!_gM02kT2_8sxDa z!(whR;4cMKz`k!yT5e@68oz-N+NVU&k7`Kw8Z~`G=aElU3QSh0^oDCGCAs*E0`Z8( zTly1AkNfM~=#A{s`nX;Z5E7Q1my(}^2zuAThL{8k0#+Dbj4b$Bcx;{a#D(B`x)rV8 zrzB>`J>IrNZ1;6kpkLx`8d;Il2;lnnGYk^tj$7>*c?TPfgb4iSduY0~>P5Ri_MA9sMcPNe{A{;)MAC?zh@9{< z+jNZsrieL^!Xa~ zgCuD|BwqY#v1Uvz7gpm9`JRx@i?{L|IZnib|AIZM4h)YeM zZ9#>!^*!c^F-CeuSN&j{Tjz9pYmkg9I&tQ-VJ#Ji#5>?4ed%D1j$$nLA?YORgKf;% zF5Igi7Pf1zNFJ^VPEbR631J7{JV{8-q_v%I@lGf~S#As4bMOt@8r7#47ASpzA&lnk z$-*1Y^qsVGz@-|Oy_Nc}8IGX5wQp|~*ou+2QB6y{J=_xg4YZQ=L)HQKWqd?y|ZytSVl^{C1Yr3C>`(ji2TGpA?#j%S}#PrF4o9G&U!wd-%!RT~Za z?QSIY3D;4xl<`Ee56pO8=K^0GeiYr+!6$@{pZG6 z0RI6LzWxtDJkeS)-Ax0^`0)1^nTAY8@e zaUsLEZ*E9vp7MgKIASQyxasbuWz!p4yLRrOU;_O}6Z<#=2Tk>Q2jqt+xD5}QjRj)V zP#iHh2jeads||4K2j)(wTJ=K}q}h9IT43ax8%bMD!ITa%)x`k6oa7gwAC(XlGbyl@ zGT;sE)ruL%x7DqV(>W{fY}ksH)P2IL7wXBCEAj0_8wXkbd-|Xvy9q( zU3pW=x2~hxDCp$aY{ZC2G55=wNfjEGe?iS9Q@;@s92!HvGO zKOAk5Ne)ZSSrA;?J8K$fDf>Dg6OXo=VSivU&r5Zez#hOjiW;*n_zVXg>cv-qqzk(t zXpy?fm&KI(;F9CUE3b{KwfN}}>mF2bH9%(F1u_ zg0+w3)d$)v0iJQjydWNIL_F-{O0$J9Er=aaKrdGO!Krrn<@sFp6I8l4FDb7ZvYVRF zQ*gL1YP%$?f>heFQC~&b#z{6!l&eb%*NGE5QtPfjUju93ivLDpfGlFU*&=yj+~RJU ztZo_8SSULB<#uuhT2cEwNr~W@$g-`%ws+%)aCCWpBIKB;(w5xG!EP2*pDAR8Q$$u- z0PznuRp)J%>mOw~X$;HXKglBMSu}!mGwf%0E`Of4M-rmC-l;Dij|y#%ORNP8e)3zx zTS8a2%LN|!Yp<@-idzapO91tq7z{-C#PAB#`0hE{TDYfl?ur^>M2Hl*`oT&zns%}X{D{)|Cc8r8$9HE2%bWP5}%^htAdlCI||b_ z-Y+5dtz=?;Dz1~0Q>viX>0$hWrpHSH&%rY# z^)1x_Ii_b;PGQeW9uSf#mK(EgG3C;H?a7Aa$_1>=6dS8+qpcN_wRC`_!MudG0uni# zsy3(03tfgM@(0E(ahTDDDpC|HR2%ks!0d%%D{cD;ZrOpYx*x>EplU-w!!L&4t2g+y z?fdM{a;!o9yJJii(?d;`n|q==Qf=IgKpRx1bbdV;X-$TP^a0m%Vl@Q~N9WQ+&}Ns^ zZ|znn(;;QK;gxza$^9s-4j^To8?OkHUQSkPCL|wLY~iG>B31_g7~W|3SZqw15Fp}) zL?3dYxSUeuV0ZYb16leF+6<~7sgC!Oie6I&Y&g+0x=b?qBN;684j!ERc_++X{Z z@B*gs(0Z=nm*f^NKr~P_^?vT@qG@OO;MFR7C1#DUYfQ}n0@tgq*->v<{K09elWc-* zj)T1K4S3FVSbSz0`6axjb(9!O2%`Hf8okrfUdrKJE)gR=laZuTy{sdP=OZSWu`=+xCSOh z(LzeA(W>iCI`@BdR>g^5<=o|34sEXAV0W1R7H~f&azNgn;tpAN!I#GXfPZ2c;6M@{ zKr)e&5J2RHU0-8EpW~VuT&4I4-&v0jv@Xil_%ir$!l)OXc9>vQ-j5FeJ zvTFR!A|X4zHxA^Pxv4eM2U?b0;tF+;F)P31Trb`ZFW3ak!Hi-qBp{)@@ z1i9erFgR-(B?1fSCC?E`?QAe z9E6&#_{TjGCxC8Xg-NYN?Pj31d)wJDSM%d!#YffZM@cg-!{x@6swR^o1+*YHnm{5d zIzfxDu#N>?be5?!nv+yu!t;kR=1||g1(>Ki?jIo9@3G>Xa1VgI07hHpxJQT@*Yel(;Tv$;~VCPPshxKR5is zY3|tJ$17gjWLID?!lFs@N>h;jR(sQ+X%}y6*Nt52ud#w>4NYq=l%$|Ej4o@oFI+6Z z__6Ov@~r3<$J^P1W9EF?w!kB5eUC)7J>SZ}>-j(`VX{#YeO!xav^HH+pp2n;|2JDB zsh0!0uJ_E&y1tGEF7lDw2F8D|Ilk3pv%*wUT{zw3**L`$*T_~V5sl<52cX78>iz0n zTd?)1vwMny?!+PD-i+-Ao^jLfyp4WAea0+q(zoVU5hhnS>7I@1FYk#jg=d6APt#co zin((l^a!(yA;o$_l{PC`WKQ3*vMgK_J3Cdjc#6d$VY52}T06;DOyx?WzqqS?yPrpV z73=ae?spw2=TWbKpc@ETn5`+*(F@yrlLZ zsUK(G-4dm1?V3D$;~nG!4(v&lFO=d+Prn#ez=ib5YD}O zmnN=6*CrlGkbyiqD)SvQP$!Hs4R|^Ln{KQG&h$d)Eek(yYDA_{3+Z@Ivls6S65In( zcIITmp4v@%I_6@2Jp@RRZ8)PTDm`Ki%La~ zsF0KSRxEuSRNbWm*0xOsCG?45`PmuayduyEB_lZ{LkvneP0 z3V^p9j2n>Fre!s!r-rl%s4EE&=u=Ez;V!<9d{L!btmmrjka%l7!6xl&=G=3h;rt3{ z7p5ddM@XliG-ns?%1%B?nQX!apA;y5e`kk?IU4b?+hBenVO>XXGTI;m@eHP4ZJ>^m z)!LJH4==~P?McRL$)fn+&YOBKmJ(n@Ru8Fd(zy^CeHxj$ux+Jnx4`}-UI`|-!l-^& zK|jNT8=>|1%UbFS!I_A#$t+ferz)bg!ZV-bU3m}k&D*a}4+BJqlf;bT2j}wgwx+qQ zhRBY;LncK4$7O`*6N%}^HDSA9L6sP|(}Ln>4UO37X>rmsiPeP<<+;kKj7DCkUtX_x zk6HVN%>-NPE)%^sLD!NS5;p?8rymK`yM0-Q6s3Rcfi1;bS=XArRbp|31MN$fpoTf+ z(#0B`2cIrWyfsFGKE%$Dmfw#4FZd6Zfi6dZWsQZR@rLo~;@JL|TY>>v99GUMlseys zi-7enksk!%Y7)(ZrLlB}y_I2Zj1Th^S)cNEI{J?EeiA5Y9prHt47qeyB4S%lh@HJP z5hfyN7zS;uDFIjj`7;6DBb=mfDbJo#(l+LmZUiRzq)VjM@g59r9bNQ|iKk_#(2~@w zR@K8nrYv^DI#8i`r9zmJ?crMqOKKTe7KsA`f$2bCY?RjS#m=N-Jz|17l^QXzseWTW z$0`?yRr8nQbxv`GZj-SM=H$9^!Ic*IjQ7?huF9V0!9q_&kMhrA2vXp&tA##PUri7x~X8TSJ$go{+(^T z0b;U2ngTm7Tp2&bsl(Nj)?Bc%%EC@B$!Z;jGJYP0El8rnCY?2mR~xjp`%^*WpEjyi z`QJ|Vy0f+3%xnZPFTZriJWlTO0xlUiexa|S^{<_lMl6hhHvGYCUNUVKM?PTK>^8F;|q?R0r zONqgN0H6s#!REak$@oMOWqV8i8b(n*6gt1ajcAd{1s;PDeea#NA)OjWDd2*S7?g5V zS18_aiv}YQxwQtD*6fL{vY?_%Ezy(|Q5r#>TF_dt`C?`@D(=~DI`5jW%X&4otda$6 z!WyrCR1htRsff^vDJ8x9X{DsX#29*Mr-?e6pCE+K8!l=c6BREH`6z^~e2R>kB^a-E zqCE~rZXTDPwd49j#*WECB8t(3F?XwLJr z6#T`8))4hI-!PaC7Lb9NNE)Vv?Y2lNU*Q2C-C-Ba>GM59I0o` z>^vG$CetO}Chv5uxwY!E8``MTHr_6wZ}sKgwi~rE|AJgk+Ue2dWfr?VU>)^wgTIHo z0rf!xKJ=!UdDHQlXZR*7ewSRi$Fy4o(Jj<_&-@b^E}ur^vy?OvfYCOO>cFlZ{F_Yu z9CBwZ6#KIA#T$#{4_^-{HAC?;xW`z=1e2_zm0&;Q+C+*yhF;~Da~}@QiL=O#f~Ku+ z)LW5^0+BwwDT<|1eSNfKk~hc!GKEtUNn8Cth{H9SU2x^<%5h=-JQ!<#2btVdO>j=_ z*z~gGJbU3etHFHTO#Vh33}_y=RR|Ht1#sWn90b4>>V70$d7)lyJD}y2<43xAiZ$-= zO_N(|Mp-()zg3N_ReG%doV%kT_dul76fgDNN2nf5a?1>U55_5{ufS!Y+S;;WX4}kQ zyMV{V)_;=(ZsopvOquE1dm#krX%mwP39HOfDzpW!L#$1;xiFMSLTIlzUbuS(;*$%kZGCDoq}U>2jdf&=k*8Y3_u<7MaOo(;u%o{9T;<$dLDT?}x%ZmaCy^%LU(7!8PkbBUB0F(_OxfYK@6%TN6KQku9UXF(EgT^N;hE z33uj8cAj+_7|+IvRRx9ZX0bNtCFCc_Rvb}KKHOA+BT1AZqT|FueNyLkrKBF^0<}Rr zh1&5~)Ad0Cl9=hn@Dr+lme87e3aDCLA_CQ;&jz>wb0X7b5B00%Qu1pCJO{U05320j z-mF=%rP)-DzS!5PE+wVAtaoxU9NI9Xh6}wyZz*&<3BG%WPZQ8_e9NMgP&*t!YT# zF9n^`L})IH){r?B_+K{2E4w+AoIgTM^|}Jdyg*<=-6|oS{*4%L`~HVpy_l09);rFh zYFLaV`%XkDZv%by$0)jvR!7@!brm#9WG?(LFnQsiH_{)cNKz8&R+^TbAfJS>;G=0^ zcPiag%|qR}wpl~rfWLrwIUTSCk{t8Xt_}qT+mS&Z3u$uQ8a}lk zTFg;xZXw2D4;k%zz}rG$jH`Zb-d)OReIQ-V>pfR~zFn_x=<=Zmu$A)GvMXHd(w5fw z)vU++ZmP*@I~K}E)9){N>|0$|g2 ziou@SmqcBj$1~=BbV3y^;TY(o?J7wQYwy~32d$y}NOWQVLBF(}<$04=^ZO-v{h*AFjE=&vG^HCjgl|&1Z!itx6Mk@V z*FfHVkiLNq3#piH1l~?p>Ja;&*NQ_k9cL(vy0cx#3w9*iuPZgLn?Mf8=!-dsDBj2$ zXLRZ5bi9Q(F`YaEKSaM)bkYkVs&CAjg9Oj&qJ@^woE;<>AToFfx>&v1HQpj3OXRwhUEHjBF8nTkx z_I6ctV;f#|7g;$UGwxt}D?-$HX8Wwh7)g*-p-l14?=8Tnqd7RZ2rRYyv1e~ee{PNI zSfNJ`M%>}(1lg5wGCvws)gRxVdA3{b==?b}S$!IpzdD&twk@NnlsiHjp%BC34(lqu zK{UqU47XqQBuQV@5fx-Z*pO4@zfLy!_Lx-%$>DLvyL;~~JZic93U9I4b!4gCj(`Xv zG}^aE;JFtv`(m(t^!UU|HT(Q=JSAP* zYzaFed262g=1_M|!A!&To(9Jk3?!oa$E}K-w9~8{G)#Z%E1+)8ln`j>x%6z!>MYqw z5~^+FC6|Nyqrrtn!Kx9VNra+4=fiFcH5f` zPrl*?ELqlFvNxT*fh0*xdU3>xO{^z>Z_4AX@ix+Jg!o;Ex;LeGtJJSc;9+zV-oXWs&nklkb=ye^ zX(LK)x#lw-aKxBBy-%%z+?s!Lm(mJR9LAADYIzH@A>vsbDOotUL^j*-xi{3Mh@y7v z^=*rIhK`lx099)%Z9Bd^Siv3MQICw+4#}@yL{Z8K+E=;+T$3rpnE;h z{;(kos=ZaQ4ifHB#w`gKeACgC|Je0u=lQr}B5Xb)K!(<+N+lq9*9E?Tk;QcGno{)# z!`vtH&87#7pP$x_XnwHJEk(i{(p?PnMBW=~Z-&9tmXhq;^mI2N0b zqoir%-SV#LmSOVP8D!d9HN8GEn8H=8uuzVE6b&OENpsusCbm1fYFJBR3Co|5xyBMZ zD76G}UJr;=%llpU6y~8!{>y&d1N*YwTh|fbIH0j=mN<~^mQ7*G-`t(fP3eYyQ;5T@ zI55ywv6jQsh-F9v>Vqjg3wxqY264NX$k8HPfMtYf+47TL9M)7$7Tc2CUAy@9^59!t z*lE$$dTx)k*!#3tNw*9@^@afYwW1T0WrC+=hzeok6sAyNr)f^%xo!11XSz1E7s3D~ zE$rKFQm4?K@LV@;PaoR4qXLgz7NOvt(d={1EY+MibWY%K{eirZ?a=rVNu7Sacm1}I z_SJMPT7e5-m-H&fxToLA6AUf7FI^q)GH|o6HL$ULYCPut(+NVr6E0;H6V?um$7?#0 z-cCI<4vtuE4Cipi5lY~Ak!^Xx6OMzRO_OK3)#f3~<(r68;`LqMoXf)XMZ9>F&(Xnxs^j)l~8IM8di z`DNmK`X(9H{ie9XFgLD{Qa-#7bGWvmH%(viVdQY_E$i@2X*Y)?%caj;N^R*MeUrGh zUA965jXEk=NAvY?{<>^}e*PZhp=IUbz=@MWGJYKl2S+CfWL8J%9S#T&>YJd={6+e! zoZR(d)xVOG@w>9AKfs|yT<-c~ZV=t-kFuQ0s#r&rGO38}>iFgusNA{Z;i#MyKp0{m zBi1mHY_HHrt*|ju8ErdN-sdsN*h4KEYjGLctGG7O7;=}I^DB2q#ob?s`y0r1l81qj zhNtiohOjlxrI^l4(%(1>p0WDRbFjY)(5cqmdLeG-68ktIOKSTo73Pf>|9%(1uUMMD zT_@dA7#ON>j4RZQ68ip#SX`pVK)7kT8~z9$Rc*(B7R~SWF8>Nc z^^In|fB!yRASai~k%gz5`+5f3GoDR(;)0re4AS#>N@GL>gY;DU$WZX&?GitjR><2o zRw^~?AN~AaLJPvg(Rs|{4<57B*4ApSq$}{N5jqU#WCsA`BuSk`S89HwB^T6L=6I?s zA5pVl-`OJTQZ6jeXmX!o+!@?oQTQ^@5#LXC{$Eh3k9^l3JUGH_FS}#xylK%?g}X9_ z>epGCooyJ^4#Eg0CJ<}7J~oiE^p6PPm@*8OpW;S^>mQjej6vXcOC_TI3xWTTpAJTT zp}yn7f6yd4RT>P_moj>7{-G?t0>{l?V&vD}VoUSOS;61U-Df7kAfWeDmwEmX_e%$T zIms}Gwx-6s;eX>$e+^-Hm7(IwyifTDmG%**xO4w3hT~Q8AJL}&Pqi4Q$K{;VZT}7# zd+auoQY`%7fS?h&`Pj-zJL3+|!S5YOI5%5SGVsK9E&bip}fnDp3{+5_ioJr@+s1J7D7+|kZrW%39+SWAuTVPABT2rY2^KUdE zT@|~LQE^+vf9O>i@lPCUE^&(3J?uY8=qpCn4G;b(9(l}*G}Q5x83KP*f`4@X{@D)A zFQWZt%P)K}0({0FM1}Jw<-32obr*keaZ%Qo&Z8r@L+>9g{NL4aqslfG!kTo>{aR8j zYPdwV;u~!n5^C_ zNSe+KueSXymv-jc>=B+s-Nk&f%%BN4+sN57R=D@Im)sQeDK_?1RB9|MMPlM!PmIws ze&*FY&BH?sns{-m9_);$KfVfF+G_?dh`2+XRgidDi00Se`a?#6g@cSgy`JIy1y04a z!HbfXr`=4F(ci)}qzaw%t0yjLhuh94>`i*&kKy8Kf*OEd^m-yjY1By3UDU`p1S{6D##Zb@j#u&b-O| z-VX)#o=Lkf7Drb^(1#D_W|skk<(}vFg2KY$ygbiki}eQ6LOL<{|bq-#^{SU#sv9rzzHY{_H8! z+ zQDBRQgqV2gv}NHFi*L>t7`dD4N--)$j`#iAaAkZ7kNu|}XjCYA{e>E9KUV9mcUYw}ccf#|d zZOw-$p1c`1wE=%*qx_xrx9sA(;EI}4L>1}QE6=z(H@xI9QLK56n;;DQv5S6>Z?ne1 z-=XpLBQ3_c?Uz=$!Pk8&3lVh>Jy8?>CKre#pku-+xJxSbNpwry;KJ`dNlJt8ku-(V zQKuyN#aXf)s8j9za(`<5;^^dd)d&Y=4L|1M`}9oXvDj0QI_GFcB}$=+&BiOqG_Etr z)5&M#$>2r9IE>3gakL~{&E@Ay}ek7-- zS65_Et9NBkXTVms;{hBg_Xj{}e>334bqR!bdqc`6Jo1}rAiK9#I-ilJ=ua__zDpws zTYbcDPH`f9f#_ITP!V;eb@qsY-P*(0I=I-dOv#L)1e-#{OBh#?G713(Xeu_7{=i9SYSY zfX%ZB%_&bJ;g>6ET=HpN>qd|ZYC;b|M=QG(XYONlrfX&qH=+oZ(i#KYgKe9_59JjV z=!=)?OBL25*7b&}s$Wr}0xFK)E9^SV?#Jz2*IzuPd2PpjUbcv#m%A| zqoGaHQdNETq6+~So{1~g?-ho*keSHi?CUA$B5p+Cur#}An){1y#nyq-d+p`f z>t*yrA)b|QKFrzJk?zpv;#f?DS~GUB7DV&A%_ft2y6Jh0(VPJkE#is=W!mnVL{W*UgtiC|#WjO@drQ+djqAH&3y$~%_Ng@JepU#AhNSbLazB-Jx*ihShXGyY)=l?4 z)|%w-Y;Qh}LwhN;L3?`@g~Gxs!e;Eo>ojQ^t_>;NCZ4B7H`0jh50eZv0rX3O*X~P| zSsz(SZ~Yfo@xMn@iWxScC-?B_+2l7r+SJ@0jbW`BUxX1_^}$D4o`Eut6!26E0W_D^ zdtguaY|)`=T}Fy_@>YtjR>$GsP6z6727)7{)qrc}i&p2uQG18|2F7a8b zNK{mG1_B+eRhK#UNX&-?O+7H7HNqhMjtspwCn^={9M=}TuJ#w7+hhE+7Aa}}7kO_P z71y$@4F`fd0fN&=kOT?t?(PJ)5Zv7%NPs|a3!dQa?(PyixTmqk8gHQA&bjxTeQfXh z{r|>TKdRSQy{c-?k~yE6^I0@z@CV~kQK_ZVOam%*U$p|MUjTAUhIU(au4xKvCgE#pYHGdCb7nexwY|Y0PxG4-9mq1X zK4)qQv%b8ZPkLMFu&&JM@3g3gn-)S)yKslE9C}^5rGla&K0W?L=A_x5nQ!HY^|_W; z97i2Sg}I(bg#!9&Z;abFN6$u#4VPe%qspH4pp}NkWI_J0SdW830%7G@>t#B{%nxOL znFpN#r>95As@V|ex`3ms!EvLwd%F)b+AcZ}`#%lj_I#O@$_Nw1>w>Cro)No(qJKvUPeE^p zy-${k)~X08C|Iyp1Diq-kjJjc1*8~Zoj0axT62zN(rK2>&9xbZ4hp{|%oNc}&`{r9 zhX4}%A=`U7u|ia3?<(SZLXhO!;0-%lc>a{k<{JiLro(z>YVrPBD<7ofhU5We<7vDY zch|?1dSeSIdk%1)XY;PN<+0xgfYx;^I;>6-@k_#tfnz1W5vM(WOf0t{u z_VL?H(HE7kNW!tuqt{D#Z8GbDH%e97`b`cU7$ltCw&}vwtIhF(knzNeKr`b;Gl<~B zrhj9v#n^&9yX!AI0sqa9PZ!(ZsmPq197E{JX=kc&;gd~K7T-3;$oOai(3p%75ODdq z{r*D11(J0$+;Ow|x(HiDUphxX{`cvc;afhwftWS$E?%sBJ+Zc|KG#s9`+&Gny<0WVoV?CM?j(twEDRa>sTNHG(kW zMlfil(L-e>ZV1(96_0W2Ic%TH)&wmaPqv*VA_D^Ie{j8k8Avd5b(>42%<7~Q2q!1v zrP_J_U{<2m(K?>Sq4I0O*koudjnB4m)vK?;=!jRv?F(SaIiP;qVsrDmhu=4P3TP3k zDT~v~hMPrWp1}@g^5?P=*}sn;r$hqil`^<-LGljOs9y_JGMISQT*6E6TP0zZqYp9L z0|wt!QjZ6z&zB5E9=Du;r-Jb;0prfcU+6csOvW|pwY7ETqjT2mR-4me$-ZI~|7z|3 zVHKD&ob`*GGWJ!Zf(jXJ&opqK1B4RsI&*d_cc-82_ks-uFqR)P-oYJk`WvK?d{=or zWuc?PMGOg?%J}#}_Pedsj|-ssX>Ge>=bdsGrqG1u&sD1VQmwk9f&RIakZ>%y-Z0FI z;Xdr2EX!zXCPAOw5BrB>DvoGhy~^(=v!<4(1m8@4j=;D2)?%4SS4nO5`q;A`UO5-gez!xxwlw z^vx1ptP94E2DZ%?}|4@$XaYIT=B zuokVrz{NgQlb(sFqJr2&*uvvM)4AiQ>;TAmj^#8m0FO6 z_S|Do{YMqj7sdV#=lqA8(Jj%P`Wygc^(&A+s5`F`Xfr4|jm1FFD8Wt)`H!&NfALtG zU>@t9a2FZ*pV{m%m_ifxH;IBvE}!C`=@ItI;#HWNoeX(!arNknP@aJEw z|A}_}qgmfv(0}KrQVSY1p8nKonPQa*|4*#sf9B5S%OAGAKK5V3M9uM0%D*6MEt`?} zUpo=sTq7r>WE(AO>0tfiwf`o(?r=m{f`M%xC&HUNQ5b4*e|^Z}llK=a05F=2h{!MH zyaGECzUl>Sp5X7`{>r~h;~#*LLEw+|{gu>2yLn&|@!JusN&OFD{Sy`;S_2dAzy&Mb zpY`T<=gu(U!~q+;D#x^cp-W2Da+t%|Dl#hB1u9_b+i% zO;)&8&oUGG(6v8b8(>2tM&{!Wpx2xZ@?Q;~ViVXHBRCGN7Wk`?*nJM8O(2UUIr_8B z>u-N1P=w()!C5#Se_10h1#Df}Q8Od|i)BUhTQDk&Ql%QN_v9~Y9HJ53cNMfL|7*dr z!Yb^#4SiKq_%z_#Jx25KBTe^d9!<}qF;zF@v`Q7oH74=##^W~ztEKdDqpZ|paO}y; zTP3-Jt?D1sF)8&oOe+WG|0_9(62m5c5*15^^uMh;|MGKG0Vb#ReCRfenRMha>gHqW zf8Uw@rnjJ4d=#d!=sHj&)wiH2^S~~7kD&}vud*=$qv`0$0j`Cp$F8c=)kt*iGB0$pF8Echw;9epOv>ORMr6+Gd&xsCPQ*QGc zXO@|mMV)*Qw|v+0c?m|S0*e_Dmk^iS@Z@W0fl&jnqoSd`(WF@%KV4~Sn}fyaOa|^` zVbd~|ryE?|D72>p1{~YgTAm6MLsq*w3JI@2jMi_M11r~D4maUuO3lH&FJE8PhxR|Z z@Saxp_s_k#;-3uOP<)WHn9P3Lry`;yo#oxik>(2^{Mu$x;|F=1asg?j%0U_{)?_#w zw_e^}R8%Z$_bs;`V})t`eceS4{ZEY|V5BIj zX#l@$+PAqz$3ks_23Jk{v z$_-uH7nny`T-<6*t=y>y`*ekdh56XCz?dz$?bqq%OFy+j*M2p81Sa-{Pk7Yk2dwd% zdyr+n1)|5A-5hfPd4|T6p+dRPUtdc6cOCCees)|y%3Ef}A4uIzpu#fb%ga}!dlNUp z31W|s^eK><%*0!VUS>}bCd|XdWEnv7SjX2VUusrLQJ7!ST=WMgL9ycRUHQQ7r8AQm z^d@pVqpN%J@i4=2FT=5mhY;#QJNBS5@_4hx46^}$dXr!sxOEWmUW{*D%s`EjAt!-4 zof&7J$he_+;Nd)I0*oi(cl>9E*Vp)X>l93;i)~Zfw!RMtrTL=D$}xUdpjdX#C+ek~ zBsG6T59TcMTwj}#>L^ejet~^tmQU|oT;vChOUXPw8+@x3C{up ziJb?nFK!gxp55oT0z*4)wt%%J=Q+Oun<2v@EL}Ph=RFu`kFBKYOI3vHm+)D5_e^@Vin)2V%X>M#)|ple`9OEjy^_Zg^l78aBim?ow!79Ah;`ip zmPmyjmz^HhB8Cjwfdz0staB9D`}8Qs($emIT=f7qT<5k|X4qw)vh}=k!WBzl$?I|@ zDTfiG*k9~-<#51h27X4tUex6T5DxPuQTeE`%|2vEZ=5p19K~m@RF0rlOm5X2ZvR5N z_13k}Pu|xZf-okrk>TOEk*>+=o;@n?EsRd%?sCkLb^<~8H(;NcN$omr>7LNC7?q6s zYkPNM(Rgo1{a6^D7Ja|#CddDr02LeE6^i-RuAoUbukAH);&PJa49+L?Tc0 z>k5_feHWEa+_BQ8BCEO}Baa3E1D|QD5=;1WCH=;oV>k-HdIFzH1DmVKQlv#BBbcrj|X?XS2<~VxB5#~JsM1@E3Lf?m)2%r7b zIEe!3xqm0zfKAN?Qw8n-m~w;yJp(txWRqOmc;_9yQu0Ml2v># zu5-x4I9QxTLCpqHV(CUztYD4$Nu8JolQr}SlhTCGe^&r2Qx?SJO6B*txmyis%g9gI zXnj~+)W{zndwVdvMA4o%H=HpM=83jeKxK@O;y@&c!u&+oOUq)6aaaLWy4>yUNCZBL-i z!ZY(691~ytl64yURHc^jOfqLJ z@EH3%Jd-2v^WBM4W%VWmVCYD%l3|Y&)3X&LJKIbm6$0sWA6yB0SARqB$!3MmIQ6N1 z^@@Bq^EC6x;us}0E(C&zM1OnW`Ruqe;GG|#2`dK1bQxww6VL2z$Z2u5p}<#^cqGRK z_9=M})~K?0Gx#Y@BHr_q#(|EoUn<}H4iYZJPcrFB2iaSyaN9oP(Q{6b5qTwu<@wfH zPUKEKZ&AD?$lY>2F%eBDvVU@K!xCLS;aee7V7xECH}9}Jw+aC+R&}P?Ec7|cY~UcC zKaeDCwRrWshq|`rVeyV69&Mezmt+?}e!b=0suLef*UKz%Utg$iNh(RQbm#SMuucK% zk>YT<#$C0o+x(R%{Qq8OvIrDD>lD`RmH29?2D9;w{`XjMi0EC5$Oo6~`m^-~N{NHV zEYx0couK(hf_%B1u*%qv5jlnTuoK5X%_Q5PSX5q@*?iP{v8AEXOeJ_z@n^vEK_&h1 zJ90YmFb#SQi*fE?>`Y=B;lsBh@YM9jzXEi-MwDBPw!G4stV+uD>eeHeM&`Y-!~IKM z3@B!lY)mAB1OiiQ@6AX`N^uTY{dRTgjuWvV8QQ$VGBIhC;qC~wy^^T3jXTTIP#iy# zigX@M5p}i~u4mO#AI`DI+9QPvYhp#XY0;$Lc`Q!1(yL^#;ZkH<_t*&l)-wlsF5bI>b}sa*F#pJ$qOj!oj35 zc=^kKlO~r-Nj{lrY&v;BTch){Y5?{4Z?IO2k zi<2su{9~)=0`(4bIe~Z4a}~Nu@|~JmFKEE&$D)HBFoU?jB^Sz65! zabi5KFtB+)aOYK2D77JWJ^wdR9tykYtNlukD`j1E50N};N1Wtr@%&B z0h5mmn{QeeiO32#*PO;IFyX(8xzU~sv6&6VNht(yZ|oE(yySUpB}BT@f+!x};N!j? zXQRb<=p1coadmhT#3#MR-w7yp zx4b-nQu`&Vh*}cEt=G4=hbXUW&ibZF`jcw#=+bN(y=r?qaR|YX>&RNKfzJIhsZsJBlq(& z0kWH8+`PdwbAr*7gi?M=#P=AXuOy+93;0b$5hjR$2VpT1-h4I5NNJ*McRlxghe9Ff zIP?jbXS&EQO+8ylF>;8w4w!M*?2z>i5?xAH`uygZ*&7DR;GIbkPsKNl?Ih7N+P08Q z-3p^Dl1Z(JOM03vHz5r^!uJAOy0OzO6~nxkVuOWdeUC4J_!#f8F>ahBXLTgzyvzyk z><>32_?=Ln^OzJv>h1RQRy2(PL~tbqg=k@CND#YAFIQzT1UHi0xuGvI@=Y8T+|)7Q z7^Ec)>D!}ir}fUp=Swmm0|`ZVf0;r(h;C170#khd8h zU_1JS&*I5@qQn8y8b~2^*>gV}i{0jR5b5pyMEp1}xwsO!Hzu2iwtOqY;saCW z+sWzr6zs!q?PafhO%^MS2_;P^XOLrFNFrc9IEA*aT{3g{kmOaHzO}9h_d16!((Pk2 z$~*YQYC}@uVnXDN8IDFK{hbRXt~yswWK(T{hY_q2`bxFVhd_)35Fz}jf&1s}XAMJZ zPO6uBJvagz&F1uA;?BDZ4OgS>r*O3u99oh4U3BZ^vq0%)w;1UmG-&C^G$vj3Iu>YL zw}y;pmjvrKgqum26{Jyg_eul&#FO~1`ZDRCUvmuXjJ01+VNAI*6jR`CTr^G=vBN_I_n!>gGw zl*RE$k?L2c!CcNb&odVgB&AYki|>{6138YMrM9$|a!3Y%3gK%^1 zWnfG9C+|8-X~k*!))?;oSS4O;iT8x$+vovSgVCfzl9H4Y$*#Jp{!2-QM9~p*`mDTy znPK(Dr1eBB)V!1^-8BxNuDNQ_B;;`pOOaouyM^TbpKidCPSZiAC&ujaR8 zz2b4g&E->G=XbRnJ$R0VEOY8WJ|U}z5@*O&3y;-xn##gawpjU;UX}sz@&9%*iss(C zg4?0zgsWpf{-ipHz_th@$k{VdTevZ9Cm6ukz`?G~_so0i?QrZKVom`g{7kXS~N z9Fn93(&Kg?Lt{0&hS!#FSePJfG1Y4`t z<0BXw9rj^32UI_dQ^;nfzYXO@xj3>2ZOlbE#)H)(ArKCxQ}mWsDwAXu%TK=(N4x{1 zB-0u?g#=dQ#N6&aDAm|uPO(Q|g;5QVt*@X^tqk7XM`gEFiz9+tC224?&+z@@0&qg~ zV{&-S`(I@qnag+V9?M_sjhIW)2<~j^jTXh1aQ>4aqVn4iNj$+jCe15KsnVfMEK*D~ zUa0g0jcn73pgaj+y89tv`fczjAYl_9`oyM-a=wUQKzKO1y@jHi10~?BhrY06 zt+MGVI3xW1NVO)v`r_hBPgEf5zquP6?Y>TmSu!s3A_Ja_4*8Mjo{2ti-Bv&e=($Bk)lXKwy1KjoD91oaV*eez{`3i71!9B~ksuZf=^ z9v(NCO5KRX;5cw{Sr}$8sNe-jgvX}AQpUFol?qy+-BgRBFX+Q3LHah!6G+prZ%6=7Uf2t!fCsMx-6Le`y&M8R`3_A*N-`g5$NS~yD1k(N!AZe5 zud{wFA=`-GzwpP}_k4yVwRML?J?EPK{$<#ly==+x7tKLFAX)W{0&@F@ah%(eU2};5lzAUZuZ#hd5XW4ELeW=jhk=TCYg+{li)4YKKnH53lMS=6gH2s&1WU z^R$gQ?pN%CI@7rK^ue2J1^OyYQXcgwD~g>|K|_+=92FTr3mTjBrgr{TY!Qd}U=$Hv zwptvd^T8OV0SF}h5FsqSasjJYH53qbJ@hKqd6S{WLrFu!i{l|8jLIMJBF-10hVG0y z&3nK_f+L~>bK1=poL`o3afqKIs}T_CqB83J4CJ(9cz3hpwlr$2cu4RdDuW4_N^-c$ zXyiI#-yWhD*T@g(?YAzRB-LArAO(^rpASyTuz?!0d`t2K8`89-kH~rL#}+_A{kiaW z7tQJYb8|clrR~NtP1LzeiTrLP3uPd^7}U&JhGiHOBZj92H-vqhgq9Hd-szrFTO@aq zl7-9B0IJry#gF^-S!T^0_}9Xm&`m?YPb2S&3&yA5LjI_VJeK5j1!v{0r!Yuy$=h6@ zUc1*h!t^9jboBH(j+k={bqCd9Om|9&Y9xsmQIIlCP*MD|%qv+a+E^mk8xPfnCS1sS zlOje|plIu9&2v-L6);Ho@ePR~nYuy_cQog8Qj|<=7H4oQxMgSwxf1GZtiqQ2?3YBf zl#l+LR?oB0Rz1g|N>YtFf=%I|2*7wB$4~H-x#wpISz{7SCBP*%9SqAD%5SOKOzw&n z?P-DmR^X+HMNz?FRy!P$i>{XST->oke@5s!njd99N^(HT-NF2+#168+6aA8FIWo5^%_ z-K(W~l~~X5#`EzGDa1+xzUMN9TkS008?b9Yr=0vT(tjU`qVQXCA9Gc_X8gtd30X8% zv*)+>-H#R$et%qSdi$-y;1}Y2pN7TN>-~#8M(IoE4C1q26=6z-b?7gL9W$xF!U0jD z5wh{&9Ie*`Z)m9ty~_#)LQ>1Df&kz11_PMQ=oPtX6wW1xUN0D-$&w-jA;mA8Q4%ST$F2iXgUp@SkiofrGKsmvn9Hw+f0G8i_4rmS}B=+Rb zyPC!AGVaA!Fp!9wTq7gHvRrTH*lskk#3VUu$jOW>efZv&HG(~vF$J@pWm!twGK!0L zCks9(>+}vSj8!ti3r#rN{_cqi?n|vvf%TG;LEL-H*UQ2bGul`-oGBbx1ew5L_gHQs z)5p__K*R%|O~IxVN-=m><%$Ke8=?yPDMB)AV1)L{dguH8lL$5A^mI`i0OWe#E;4v! z@0wr|=K=Z_iJn5eSMk;(eQa7}_c2@SWFv5iV$r`Aq1BfBb^dbD{_{S_`lARdkom+6 zk?Z|&2OJhisWXtv&SFj}R&O?@WxstJH`0%o>1(7K<;^-QmI@bp z(@1_FTpVhdZ$_`2UMbMvyOIwW5Hf8KK&Gs{{1I=a=U7=mc}TqYunkBdW_xy^eEt|V zEHV{AX$-Lre6CflItb&RKom5d_QT^X1L9z)B}Hrp1+7$14SuyI1(~n&KHl#A$s~ zchoyz+i$>CEfEQth?^5T>yuWdWm3M$l@4Sk_{LqbY2Fp0IP@U#Ps3FdHe7i{{bvlR zrFyUxR%Ngs^Cov)fs<{ZVZUc>9ZzMOC+jM@x z@bq3ytX@Smj2m~ti5U}GokJWQ89~k~#`*$hkpL}}<^oO`IsePgz#k%r2Kv!Hx39X@ z91sEd#o}8oI>ZxET`pJrcq7ll=`W%jF^IT6?>Y6}?9V7?fp!!#qTXCA<5ufn`LgK0 zqaibF-ZaL04haDvrSfd>8y+*>*S_XV*xw%yCfS=7rQyTbf&(v1GW`(2X%)A5cZ+K6 z+la?kIe9$rhJ;#ZlW|X>tXoHCVSiss0Q-TBcqVorZl8}={r+v~7dm%zrwA|gfrZmc< zoyVFkI!Dq!UBK_Nn5`je%==A+r*4gP8KdpKlk#Iy1d(E}EpjmSah3riFkk_;3oexRkp&O?u5F-RcgFTSzhx1Bv*^%)EPJT=dP0-~gO1O0E7!SRqItld ze1kbBI(xHp5y?^@lw5G9d$iM_H=-rtdbQ$!9D+^k&{<@+E7P#}MsC6;xxh3E%VCPX z$G_80PXlQ?(K6r0=|~7P1_FQLh$P=w#8G*3=qjgb9g%g6bD*KF(ZOfG9!$HP=CTke z)woWI)W8`~R_V%>*oe1**J-zSA~NnBwij}L?Sx4t7CO0KMVB6=bKSDIgnVd7ML>-- zO(~CMjV**ZHKKLdatJ99@nzZe{U^gw9zAX`ry2@%fo3-NHxSj6X+dbe&VE1<6 zfNzvIvT(4XTvsFlf5!drBd5spm7f;*XD_2H&Vbf6{1L!{&beLG4UyC-C$Ex3f--YH zDAV7S-wx&5zO$!$m{|SN#gPZi+&4?!?Pc2m*Dj~2!(5942kg1 zFY2Gb@C_ue6qyfX%5!&Ay%9#WeAV+wh1vmQPAhOnM@#HhPTu{lw=ZdRhw#= z629Czgh%UxilyX@_9aR65w-ceoBea=7x1{1$V4eLXfMLtBwz;kA%eqdvo%uj=6du| zk;2ddRZM7)`=a4d@=u6x=B2ysJ6Ajd|MR{&6$tl)`R@KX9eHKN&HELJYUlYkb8v5p zlTjot9fhJZorD3V!nyLT?lv@iGBL@w_r8d^ZxNV@Y@kdt%N~PdT|suQraC@qwmo4| zJW1h)7m2MdS08ATGZ0R#Y75@<)jiH$QveZ=B29iE+m!U28Ai*#C!6KxGV+vo-v!R% z0G)UHFG)Y&3GkPItd~76F`4X<@-T#~KAW~4stoXGTq$b;eTPFD>c+V`@N4V=$2Pe8 z9Op@4KYR%Se>nRw^~EcaLEX{brg%R>jO|*l#{VK2LH6VSUcCv=q;jhBiQypPq1fa4 zN`NngNAo~`F}4r3M6~GOS%4;(kSQUQ|Dw_Zlx|@p@6I16U>%tzy(_*nQ!vg6jeCX~ zn)xjA2aZ#F8jmGh0K-lfkA(3xa&^<5M>bE-5KAA*SUsFbKd3$8(#G~mGT%Q^5fZ%2 z3$x1D+P*9v>qQWGU*U3D$du$Z`$yYo<*NqyvHLFw%2jRyGC$m63pigSDZ)T_6z;*# z+GVY2P`?;EI&rIocBxlzSy!WDM|)X>7a|a&R(@}wN|1CoTMJ_ zxfTgV8fC32y^)A-VhzCBVzFnh^KpbeGr+9^JLl%ocnK+O-UT$Yx9jA86aA1Q=-()f zc)XygB7+D7QAYEI&^Q)Kf8TltEHJR9IpOrGOVOOZGSPaI%p-28D1^MBicF5!U+g@2 zrh%aJtmG#v02^YxIyJiM$JwVy%Q$t~NI4t-lZKlgmj^THu87k-jR83XA`VB7 zKW9~oki#O3YMmJ_S8(8PA7;~q1lvnbm=w#8Y0_g=(O-V}NJBT}Z z1d#>iy*g_3H87f88iSm6myo6)iJc?|jT9R&h5zp*s)H9%NMm4NN}=z0oW!IDLBxVa zd>9_{l|9nMcgkOhkcHeBU+*18lP0_}?S;-r#T~s*noX;-bVo2COOzg6BBEKI%oebm zX{J>^76~T6?z&a`upzLrVqFeYOneUnCnHb`1f6wK&LawuNyE%9R_d~VzJAEmBm+}#Qxtxl+2QG~hcEJdvP49=Sio`L zd(E(&hR_>lIfwO&rW6^T^pOA4+!-lRNfK4H7gqMYzO9THul!e5xEy0~v?S0UQ}I)` zhZ19k7BX{K_)CdtdIK!oVFApl@T0g>IQ@iYs5|q&};;E2e32FX3HZl zgDa^DDV&kE$_g$vbZX4?%>%J3`X6VCo3C)PbEo>KcqW-$(*KzE|ETrf3zX`(-}doJ zun0X<{_m&TVbmi#S?EAm>;4!Q|FtZdPc1qPLqn7`?c7v*d&HOuR38% z6AfIX@D@s{Vd8&n)IZ%tC^GPDeKn3A ze?t<~!bI!IGhW>{x~u&HpM?l|!{4B%Bq84!`&|h13jNzZ|M4?|9f3M|-}P!Rn&Eji zAQVBC(gio7%k)z}DF>wsi1UV99Itu4G3Ozf%QJLc=7j7|R3o}ejZ-3-gD;mT&C
lH{Y6 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 E2WMS2A^-pY From e02c8fc347a317975d010d9582a64d8d9e4a24c1 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Fri, 1 Dec 2023 06:46:08 +0000 Subject: [PATCH 100/203] add README --- scripts/aws/README.md | 2 +- .../{langflow-cloud9.png => langflow-cloud9-en.png} | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename scripts/aws/img/{langflow-cloud9.png => langflow-cloud9-en.png} (100%) diff --git a/scripts/aws/README.md b/scripts/aws/README.md index 0210870d5..91124be26 100644 --- a/scripts/aws/README.md +++ b/scripts/aws/README.md @@ -15,7 +15,7 @@ cd cloud9-setup-for-prototyping ``` 1. When you see `Done!`, open `cloud9-for-prototyping` from [Cloud9](https://us-east-1.console.aws.amazon.com/cloud9control/home?region=us-east-1#/). -![make-cloud9](./img/langflow-cloud9.png) +![make-cloud9](./img/langflow-cloud9-en.png) 1. Run the following command in the Cloud9 terminal. diff --git a/scripts/aws/img/langflow-cloud9.png b/scripts/aws/img/langflow-cloud9-en.png similarity index 100% rename from scripts/aws/img/langflow-cloud9.png rename to scripts/aws/img/langflow-cloud9-en.png From 4cd4a64826b4cd3a9b2bb7886e097c4a7fe5e20c Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Fri, 1 Dec 2023 06:49:12 +0000 Subject: [PATCH 101/203] add README --- scripts/aws/README.md | 49 +++++++++++++++++++------------------------ 1 file changed, 22 insertions(+), 27 deletions(-) diff --git a/scripts/aws/README.md b/scripts/aws/README.md index 91124be26..0c4636489 100644 --- a/scripts/aws/README.md +++ b/scripts/aws/README.md @@ -6,39 +6,34 @@ This tutorial assumes you have an AWS account and basic knowledge of AWS. # How to set up your environment and deploy langflow 1. Open [CloudShell](https://us-east-1.console.aws.amazon.com/cloudshell/home?region=us-east-1). - 1. Run the following commands in Cloudshell: -```shell -git clone https://github.com/aws-samples/cloud9-setup-for-prototyping -cd cloud9-setup-for-prototyping -./bin/bootstrap -``` - + ```shell + git clone https://github.com/aws-samples/cloud9-setup-for-prototyping + cd cloud9-setup-for-prototyping + ./bin/bootstrap + ``` 1. When you see `Done!`, open `cloud9-for-prototyping` from [Cloud9](https://us-east-1.console.aws.amazon.com/cloud9control/home?region=us-east-1#/). -![make-cloud9](./img/langflow-cloud9-en.png) - - + ![make-cloud9](./img/langflow-cloud9-en.png) 1. Run the following command in the Cloud9 terminal. -```shell -git clone -b aws-cdk-dev2 https://github.com/kazuki306/langflow -cd langflow/scripts/aws -cp .env.example .env # Edit this file if you need environment settings -npm ci -cdk bootstrap -cdk deploy -``` + ```shell + git clone -b aws-cdk-dev2 https://github.com/kazuki306/langflow + cd langflow/scripts/aws + cp .env.example .env # Edit this file if you need environment settings + npm ci + cdk bootstrap + cdk deploy + ``` 1. Access the URL displayed. -```shell -Outputs: -LangflowAppStack.NetworkURLXXXXXX = http://alb-XXXXXXXXXXX.elb.amazonaws.com -``` + ```shell + Outputs: + LangflowAppStack.NetworkURLXXXXXX = http://alb-XXXXXXXXXXX.elb.amazonaws.com + ``` # Cleanup 1. Run the following command in the `Cloud9` terminal. -```shell -cdk destroy -bash delete-ecr.sh -``` - + ```shell + cdk destroy + bash delete-ecr.sh + ``` 1. Open [CloudFormation](https://us-east-1.console.aws.amazon.com/cloudformation/home?region=us-east-1#/getting-started), select `aws-cloud9-cloud9-for-prototyping-XXXX` and delete it. ![delete-cfn](./img/langflow-cfn.png) \ No newline at end of file From 04e9e492faf6bb09d02b866e80ce58e8015bbc57 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Fri, 1 Dec 2023 06:52:58 +0000 Subject: [PATCH 102/203] add README --- scripts/aws/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/aws/README.md b/scripts/aws/README.md index 0c4636489..c18c25db0 100644 --- a/scripts/aws/README.md +++ b/scripts/aws/README.md @@ -12,7 +12,7 @@ This tutorial assumes you have an AWS account and basic knowledge of AWS. cd cloud9-setup-for-prototyping ./bin/bootstrap ``` -1. When you see `Done!`, open `cloud9-for-prototyping` from [Cloud9](https://us-east-1.console.aws.amazon.com/cloud9control/home?region=us-east-1#/). +1. When you see `Done!` in Cloudshell, open `cloud9-for-prototyping` from [Cloud9](https://us-east-1.console.aws.amazon.com/cloud9control/home?region=us-east-1#/). ![make-cloud9](./img/langflow-cloud9-en.png) 1. Run the following command in the Cloud9 terminal. ```shell From 80c75bd7e066a90a33ba312ed9fe41752f11bf99 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Fri, 1 Dec 2023 06:53:35 +0000 Subject: [PATCH 103/203] add README --- scripts/aws/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/aws/README.md b/scripts/aws/README.md index c18c25db0..ddbccb10b 100644 --- a/scripts/aws/README.md +++ b/scripts/aws/README.md @@ -30,7 +30,7 @@ This tutorial assumes you have an AWS account and basic knowledge of AWS. ``` # Cleanup -1. Run the following command in the `Cloud9` terminal. +1. Run the following command in the Cloud9 terminal. ```shell cdk destroy bash delete-ecr.sh From 34f2a77e17ab45b1839a742194ff7bab131a0f62 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Sat, 2 Dec 2023 01:11:30 +0000 Subject: [PATCH 104/203] add archi --- scripts/aws/.env.example | 12 +++++-- scripts/aws/README.ja.md | 51 ++++++++++++++++------------ scripts/aws/README.md | 8 +++++ scripts/aws/img/langflow-archi.png | Bin 0 -> 279821 bytes scripts/aws/img/langflow-signin.png | Bin 0 -> 169654 bytes 5 files changed, 48 insertions(+), 23 deletions(-) create mode 100644 scripts/aws/img/langflow-archi.png create mode 100644 scripts/aws/img/langflow-signin.png diff --git a/scripts/aws/.env.example b/scripts/aws/.env.example index 6ff0702f4..4778f7ca7 100644 --- a/scripts/aws/.env.example +++ b/scripts/aws/.env.example @@ -1,3 +1,11 @@ +# Description: Example of .env file +# Usage: Copy this file to .env and change the values +# according to your needs +# Do not commit .env file to git +# Do not change .env.example file +#     You can set up a superuser's username and password +# If there is no need for user management, set LANGFLOW_AUTO_LOGIN=true and delete LANGFLOW_SUPERUSER and LANGFLOW_SUPERUSER_PASSWORD. + LANGFLOW_AUTO_LOGIN=false -LANGFLOW_SUPERUSER=langflow -LANGFLOW_SUPERUSER_PASSWORD=654321 \ No newline at end of file +LANGFLOW_SUPERUSER=admin +LANGFLOW_SUPERUSER_PASSWORD=123456 \ No newline at end of file diff --git a/scripts/aws/README.ja.md b/scripts/aws/README.ja.md index f62de113b..d7fa5b0a4 100644 --- a/scripts/aws/README.ja.md +++ b/scripts/aws/README.ja.md @@ -4,41 +4,50 @@ Langflow on AWS では、 Langflow を AWS 上にデプロイする方法を学 このチュートリアルは、AWS アカウントと AWS に関する基本的な知識を有していることを前提としています。 +作成するアプリケーションのアーキテクチャです。 +![langflow-archi](./img/langflow-archi.png) +[AWS CDK](https://aws.amazon.com/cdk/?nc2=type_a) によって [Application Load Balancer](https://aws.amazon.com/elasticloadbalancing/application-load-balancer/?nc1=h_ls), [AWS Fargate](https://aws.amazon.com/fargate/?nc2=type_a) and [Amazon Aurora](https://aws.amazon.com/rds/aurora/?nc2=type_a) を作成します。 +Auroraのシークレットは [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/?nc2=type_a) によって管理されます。 +Fargate のタスクはフロントエンドとバックエンドに分かれており、サービス検出によって通信します。 +リソースをデプロイするだけであれば、上記の各サービスについて深い知識は必要ありません。 # 環境構築とデプロイ方法 1. [CloudShell](https://us-east-1.console.aws.amazon.com/cloudshell/home?region=us-east-1)を開きます。 1. 以下のコマンドを実行します。 -```shell -git clone https://github.com/aws-samples/cloud9-setup-for-prototyping -cd cloud9-setup-for-prototyping -./bin/bootstrap -``` + ```shell + git clone https://github.com/aws-samples/cloud9-setup-for-prototyping + cd cloud9-setup-for-prototyping + ./bin/bootstrap + ``` 1. `Done!` と表示されたら [Cloud9](https://us-east-1.console.aws.amazon.com/cloud9control/home?region=us-east-1#/) から `cloud9-for-prototyping` を開きます。 -![make-cloud9](./img/langflow-cloud9.png) + ![make-cloud9](./img/langflow-cloud9.png) 1. 以下のコマンドを実行します。 -```shell -git clone -b aws-cdk-dev2 https://github.com/kazuki306/langflow -cd langflow/scripts/aws -cp .env.example .env # 環境設定を変える場合はこのファイル(.env)を編集してください。 -npm ci -cdk bootstrap -cdk deploy + ```shell + git clone -b aws-cdk-dev2 https://github.com/kazuki306/langflow + cd langflow/scripts/aws + cp .env.example .env # 環境設定を変える場合はこのファイル(.env)を編集してください。 + npm ci + cdk bootstrap + cdk deploy ``` 1. 表示される URL にアクセスします。 -```shell -Outputs: -LangflowAppStack.NetworkURLXXXXXX = http://alb-XXXXXXXXXXX.elb.amazonaws.com -``` + ```shell + Outputs: + LangflowAppStack.NetworkURLXXXXXX = http://alb-XXXXXXXXXXX.elb.amazonaws.com + ``` +1. サインイン画面でユーザー名とパスワードを入力します。`.env`ファイルでユーザー名とパスワードを設定していない場合、ユーザー名は`admin`、パスワードは`123456`で設定されます。 + ![make-cloud9](./img/langflow-signin.png) # 環境の削除 1. `Cloud9` で以下のコマンドを実行します。 -```shell -cdk destroy -``` + ```shell + cdk destroy + bash delete-ecr.sh + ``` 1. [CloudFormation](https://us-east-1.console.aws.amazon.com/cloudformation/home?region=us-east-1#/getting-started)を開き、`aws-cloud9-cloud9-for-prototyping-XXXX` を選択して削除します。 -![delete-cfn](./img/langflow-cfn.png) \ No newline at end of file + ![delete-cfn](./img/langflow-cfn.png) \ No newline at end of file diff --git a/scripts/aws/README.md b/scripts/aws/README.md index ddbccb10b..3912d5792 100644 --- a/scripts/aws/README.md +++ b/scripts/aws/README.md @@ -4,6 +4,12 @@ In this tutorial, you will learn how to deploy langflow on AWS using CDK. This tutorial assumes you have an AWS account and basic knowledge of AWS. +The architecture of the application to be created: [Application Load Balancer](https://aws.amazon.com/elasticloadbalancing/application-load-balancer/?nc1=h_ls), [AWS Fargate](https://aws.amazon.com/fargate/?nc2=type_a) and [Amazon Aurora](https://aws.amazon.com/rds/aurora/?nc2=type_a) are created by [AWS CDK](https://aws.amazon.com/cdk/?nc2=type_a). +![langflow-archi](./img/langflow-archi.png) +The aurora's secrets are managed by [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/?nc2=type_a). +The Fargate task is divided into a frontend and a backend, which communicate through service discovery. +If you just want to deploy resources, you do not need in-depth knowledge of each of the above services. + # How to set up your environment and deploy langflow 1. Open [CloudShell](https://us-east-1.console.aws.amazon.com/cloudshell/home?region=us-east-1). 1. Run the following commands in Cloudshell: @@ -28,6 +34,8 @@ This tutorial assumes you have an AWS account and basic knowledge of AWS. Outputs: LangflowAppStack.NetworkURLXXXXXX = http://alb-XXXXXXXXXXX.elb.amazonaws.com ``` +1. Enter your user name and password to sign in. If you have not set a user name and password in your `.env` file, the user name will be set to `admin` and the password to `123456`. + ![signin-langflow](./img/langflow-signin.png) # Cleanup 1. Run the following command in the Cloud9 terminal. diff --git a/scripts/aws/img/langflow-archi.png b/scripts/aws/img/langflow-archi.png new file mode 100644 index 0000000000000000000000000000000000000000..c46ae811dae5b9033fadf2e28bfe33a3852e5cda GIT binary patch literal 279821 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 U@PMae1N=yc%8DeOy>k2i0in*30{{R3 literal 0 HcmV?d00001 diff --git a/scripts/aws/img/langflow-signin.png b/scripts/aws/img/langflow-signin.png new file mode 100644 index 0000000000000000000000000000000000000000..3a8691a18f1b35bf3fe00f8dc474f299d24d24f2 GIT binary patch literal 169654 zcmeEvby$?$x;`LC7^swhgdiXwT{5&1(m8af^w2F0Dxx4I-JL^sgF$x<9ZEBF*TC;( zf8UOCwsFn3*;2ylXw{dG7mu?s@$nCnI(PiwFw|3F(ITGhqcJB&=p6 zB(!pjtH2}pEB!7=NZ0v|pFWinfBKYM&f3Dj*i;`0>Dh-+6?9d_7W_DkPl19)$fzlA zCs2ck1SK#Sw*8+|K0to*f#sIca&yva6QKqaPFt|>XRP-m1w{{cYsr(6vVGC2HmT8U z$5m>%Cb=9=j=CaGW4IkwV|kD=VrSk9b7z2%D!#Z_ndS?)YFcB(ZsP_bmtbZl!N*mRH;&Lq*E_;q&bP=~im> zaIs4e?pLhhZ_I-43B;}5-BS^_in_NJI{dAvklY+iP~7Y5Z9}94C$!CN6!WY7ax30L z^36CH$a2X~mxH5uywI)azQMXhQ45sfgLdD@G)}Vjz2o4H`S{{dyl?hHG>lDQ?ij*T zL(qvsOGnW4gZ#H(D#d$u=wsR1M^~0V? z+5#*cqo^Z6zq zLWm4XbPJ>)Fcz3YDSI20TQ0DAV<3?=_YM4t^BCIUiyyV!Mf7@VKIN%uiKi)uGQ#6^ zc3gWsF;)pupnBDZFK?9vwk8ZUkGuMBZ7 z`_dCQ`kt=ve$3k zBt7W#ibHxH&*Or?cAw8Cw1mrDojQJzE38RAZ@K72K3Y=jLCTC`P*2p^gjtTvG=+{L z^zc2(205YB>mI`|c8pj1>K`$ag?O;$-^;!V|4f~aw~Xps@79gs|5|bCQ8{X^2k{iC zCLiAv+5-Aoy&EwhaV@<5g%?E5Um?EKNQAphYbG|8rKL-(?Aq4ik>plm|^c@tF{ zn78Y<507u8Pw!fyc~4bs zQ5#yVa!_p@zA1($ji-SZ){2Vvp;aN2gpLNhno*sokQt^V0KwvjuMAOt$|vpm43QwA zXeXx+-Bg;-QqJPc&<49^iYgb$>1IhQ&?`aZcoOW@a%5w(%`-a{<}cR~4 z45i9p%8@YA9QzzMGift|72%b|ky91+I(0|_0^>${tohvf9iJJ*X}#0U8Y#mk5F&?Qfc)-$)%wWdkM2J zHzj?+-&PGf&P5x3{UXS?pz%jcgR>-k+k-Z*Fu$;_Y}=e6WiRCt<-MFtSS?I32bz;N zdduuC=P)O+Y3@)`X>Ms`X=rKqiX0CYkLUQ+Du4O6@}$Xcle5Ie3snjXM+k-nM;y2p z9>3+m2Le=%!|6)*xI#Qjm^EX_&68Q%_5>3)l_X?X!ipI25C8@fzY|T z?98p*W?#;KaTs2(9u1u%`d-;x(y#-Ku8JPY>C71%ALARSX+_{a^}XGp`sMMO(E9pb z1l+2BIypVsuy)?9tFC&vrm)7|k&oDfBTT@4bjaL7(ZYWZe@%w0QZ}p0AYMiXN5|iy zWQ|gQO(1U4zAjyg*Z|*#Yb&)bxo+q*@YFes#)K2DhlGFYo*Yp(X$E1$t#bbL7lFod zqH<<(?)fI`?Nh<`-v;If;@vMBdS}X5^=_POi4??B%ppbfh|$z_DA{t<((08BD$#AC z0@fdHDIzJ%g)CUY1c>RGQ4^DI zUHJ1@a&aSZCCQjT)!==8TJlWZOq;ODNDE->Y+S=|UaE zq{1toyrn{3~qW9TVSIMR02LpjbMQxT$1-L|iQ{VJWf!3!d z6i$6D{$`AxW+Fu(V-fv=M|b06x|fhwUB@>=Ys1oZ)<_O_S27e&p%8X&u3*dbd+o+Q!1nG-WgyHQj8y)_h`TiDtcK z$LT4RIkS`U=(Kk1cV-3%=rrj#a}u+IvKKXpYfFt|4=QKjwb@;o?#aD%g|)2-5UYWs z8`U>dxDL&-NA=1xP5aV2UU!t0p;{PclxF7+NsOuI@3fSDGn;qQJytH#a(5oy&Et8? z19E6wHO;Zg%N*9vH&J6yr_Wp&=X*IlO){5DQMXU6@vc}@lcuXFf6VvYDzWIoGnV3C(_wCp7USA0a z35c00v>-+{W<1+f@HOv|@eyLiDjoC6A6BUqx~5GV&{`E)t!w4>yP%`PRN^2mkU8~O zwX4aOoX*ke(XQ2*F-N035&n2-*CeN zw0}z4hkj~qj-2m6%|Y@8b2jFW+bf^mA)y0*-2r}HC7}HE)mY65SN?h* ztsHm`Nl5XjxHxdDsB5jSZ*F5`Ve6rxx(YmiY57de24Fi>XFtf|3J=zS_a8D=Qngi; zmICQom@&T4vv{e`_{z-k?0t}UUx9$TX8N`-$X}V6n%jV0@lpKc6(HdL*~3f}LT7e|Z#`X?`qTroXKkKNcS$S}U-S_l$*Qm4I6y%+CIyi~+wM z{&5T3N0tULK9d9f7DN&k7E*eJygb&EyGeKJYPZ(miLCKQi~H#w%0|b@$)vfkPMNm) z>(uZ=$?(2|Pp74I`f4X(rLU?-Mfs{oLOW^f_!t6Kvu_4C=e!t#HtasEn>?+_mE3!* z=x}py+hJm`scP+Lt-3DKb>58+72_7Upa&8%%D-|a{#rKtuneQQ5eZFCSGyAP0z-?? zQ1#yYKq(YrUinv!^yh0lKcLW3=>+;YU27I?*v9$SKPl=QCPuT{a|ZGwIE#22xT`SEnEX(OVNXbo~?TH=uZk5Mz-MM6l zv}tM)Ua4(QHaXc;fk@D(?&~YTZnH4(_Qk!xq9daS5In?GMjj@IdYIml;<>=oJWmpA zal&f8`Wa2{&GV6q#3v4#i_q>BQ{-Xn?vED;Yg7Zwnac&tf1OhL_^@%#R(G}jqEVQ@ z5^T_Eshgi|xg?3#d#h^+1Sb7D$%71YaC#?M^&@(Cl}Pdep^4;qDwHsz1I$SNg|}Y| z3NXYHScwSx3mmat4;dIze(}YtFGPd^qcjCMG16lH#hi2&Sj=jIzz{}qV$?pFe>Il@ z<02l)6~y-;^2~T5`LHGcHUNSIJo&|A{k&Y;hJuRr~++`e=AJy{(E71 zd{tIwaHsHS|AfDD1%3QSY+SCZsv8@RX37N;J;ts53c*e_LC!3?OMKE?AjO1e2y)V; z#a|@eWT%{Ju$o0H(DagD9$qZXSmOu!Szn@@r2v7GJa*ybuRv*AbZMETkzBVi_HC*% z0}_n{-{wN+(t7zI(YqRT(*WJ|Z96Tds(`h%=`pu%hKa?+5${>9qOT%Y7ufbl zo@e-A2`Hc73-1d}WSzhpK$XAxx%eVgo*FA9#6^g6=@LOoPJZNB;<1cwBzh49)Q4Kg z)GV5F;dQq`3j?59n{3$Bd@p{0!zfTblmCt7^BL{IYf~lgh2vV09Ei+|NA(t}1k8pz zmZ{=ck74A8MMd3cQrvi{#C&jNT$q@HvUgJrjCpzBrSrWv>3MLcVOJM-viaRN<{L7y zgZz)`B1sq(E>dzajx`e=r~>sY`@;3?0}2(K7AO-0fj3?oUj#Tw;jW_%W9Osk2?(-1 zxkxgk3M{%*!2H)K&2v$=AANYLFW+UZahjo_1J8VV)Sf@+vw5#m018)fyzah+syewy z$hhKTVNhlA=prcz^#tAXlRIAEjW1`w>0;aO8pdU?R`3}Yn7YK`we4zLs$5?dk6a#1 z!Zi`Mo(jN|AeSgCGcmx&ym(=81en?7a0P(! z`mI4a)(0(jjvo<^{@5@l-dVO+B8uzZDdw##0`abvynB&{KRSJv*HvqZN~^; z3$Qs7DtnclZbB9|*?yCN_9C?t)r~Pf7YbxU@P+q<4ZzMg7l0~%QGg$)u!%ODaS8D2 z0YC#7N+DSS;r$EnYbl&&fR~qCc-`CaRR3Vtuj3^(cqhz~>niP0I7p zWum$r=b>8HAM!|vk#F7XiMg+n{U}|m?2?l@>9`sR>7M%6d==jntLt&Kxp4ix4TNjV zD0XE751-ai{;`35`7@yllw9(48_!SAfqGVW@p^_8lAV4j0xDlmpeIm|ABaHez_ z3KQ(ST)_O-Dcv+4HcLJZ7vZZiLnNEK=A_?TVf(60-)i&tG&@&umgTqx=ecXTVR6sfzZBNOzXiavOK^clqZXL|Q9N>KFsVBDfSh>e z;%Nfs89>Rifjmgfc9A8Fpth{hb`|2xx&%)OwE52xR!5Y!UB$n0)*@5WzmittSN}HB z`WFP0bzy4lhyt&?lnAhenmc$o-9euGKdj}@=l@m63ICgp^G^+i|1%v2z+0D-webLU zmH<@w3#-KvEr6&tafzh|pn>YOW;YLmw->;o%+lmXuTA^aFU-qTp8vtFG2Ix=HeQwa zIob34JIiOtr%RzUHnhUasc8v%d}p1kHd$B_!%5gt6~of78T8-SJ&||~)U##)pH1}Un>zSA%cVO3l{+PIpyICU&N&ae zz8@D=%7iwp@5y-V#KwK^&D}RBt!n&qfshuQa=-QPKn2kIvoE~;3Oz1`wJt06=bP41 z{YUZ0rNQKLtzZw+{!7Tx@;e-JGGUO#?c1>x^= z@%ME1`zi?MWw_s0LHLO_V6K4$p_rgImw9@FQ~xS=&@!_HYA*R8&1fT1O@$}BLP)Q;W`Y?;sXKyY`$ zIUqPDX3M!#JT>L8YUb_RCrAEHn;+L)1@^Wo5pd0TI5FxiK_uj#|0;illAD{0suw#; zO%Bh#yMsaQfrN5_U-b<*`RY0Ui}513`NJ5^pf+him>SE{?Q=iq&!6!0rFqU8`M()Y zKlLdl%DhORm-N^+lY4(~E$W)T^J%qy-m#ZWlh#oa_ujoXCOS~s47(1imoCT7>)V4} zB*6&w~oZdDM|O;*B3rIJ2EkeUTn!_V-L?#Tt>QVn9La4t+M~#G2Ed8t*OR+qEO}JOT~09 zVmijz|8q&+0B(Qf++!C06TVl6@Ol3hHzK#)y}AG%=joU?TbbPH)v)hgA9FZv(_A3# z|2)$jMj-qafSp5!tY+AdA$Hz2J8$_I(>(kagVX-VkzG(iF&O*c#o#BsSaJ%9Wll-Ec>zgZ5dM;2);rfeD8d;zHsTn3G2M8sX!z3G4`0mHCIoLpW_X&Dc>p5A`pJy2ru-uy0Cfs8EH4Zh5yRd+!I z`VDzIk&1SzhO9^Q;TI%-EiJ9Lrm*p`vN!mDUxbm5!&Rq-4}N=D4}J z0p81v)n|ODU@rPDODh#ZnJ`jkp)+oOL}JYnxx{{&cOxq+t9MDmLeV2We6F)r92waU z*O|I;pGk9IfT}Q4%8bX$sIeMPz~tGwiH!}}IYGT|K|oFppSg*1e&7)SbDT<@;x;gKCoEGP&QXKwvztu%V>d0fql*mVeiY`m_3OtJ_!eZ^6V2!}2x zip|V^&%%Skn#acxhR}z34^>i!DYzU|4i5K^munGUin{6&>P3;&nH~Hoe)JW)?`h*1 zHqf%MiEI(%DeuMAxLIksY8I!^a29tj?mUF`!Q9%GH}anGs518@P`i_x}9qf?;n>yB_&Dr_+9C$8a%CKUtieSR&FbF!3MHBBP6I*55 z+fEy7yRB4wbLB+dD{`Z?wWAkSMJ5+a-O&jfocHW7P)ypm>0sgh>|{cDXK_F=mob;s zP>+5Rqxlf^s5LLM%!R0|r@DdOFECHTl|QcHoJ#N6rhT?X8qa=tZc9rLzQZc9{z^MZ z=}2BMW~7LZY`fe{WU!APC^?LygJkJ_4JSP85zFK-oD zS!|I;5YLX1iOg|d%{g$l^N4Jq-5AGi1^je-d}123J1sLipV~SD0Zx%LFucs6rY@H6 z?$HjmHy-|NCIXw<)@us=j~}WcHx}_qw1wh@lb0bel`Qou6{yW(tv*(@p$e$%-@@(s6>+ ztL)v91^BJ=K=wv!stql{FQSTEl0kRpb2Qk2P2zpqpW)NMOL+UdGIyaZJLw}l~ z-qKA<@}mWWLxy`3f(`rGct4d?uab!{gd+Q%-nMo&$W;HF0S?xkyx- zPws=&ZKu5smD#1$Oe7}Rimb3g z-S}-6*Xfl#Jfhnd(m}=9L z3MD!sonj9)dqhNeR9E(w6>Iij@T}6v8TfZsd$^)J4%*{ln+K1u{hS)v@?w( zL9T}%qxPMR;8}!_$H=pDNU~ G;NrEVj2$9!~kqv$*!rGYuC0~ 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

dHs@ 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 literal 0 HcmV?d00001 From 20c82e28aba7397ca22de49a071187dedd7a78e7 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Sat, 2 Dec 2023 01:13:24 +0000 Subject: [PATCH 105/203] add archi --- scripts/aws/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/aws/README.md b/scripts/aws/README.md index 3912d5792..d135b1aa4 100644 --- a/scripts/aws/README.md +++ b/scripts/aws/README.md @@ -4,8 +4,9 @@ In this tutorial, you will learn how to deploy langflow on AWS using CDK. This tutorial assumes you have an AWS account and basic knowledge of AWS. -The architecture of the application to be created: [Application Load Balancer](https://aws.amazon.com/elasticloadbalancing/application-load-balancer/?nc1=h_ls), [AWS Fargate](https://aws.amazon.com/fargate/?nc2=type_a) and [Amazon Aurora](https://aws.amazon.com/rds/aurora/?nc2=type_a) are created by [AWS CDK](https://aws.amazon.com/cdk/?nc2=type_a). +The architecture of the application to be created: ![langflow-archi](./img/langflow-archi.png) +[Application Load Balancer](https://aws.amazon.com/elasticloadbalancing/application-load-balancer/?nc1=h_ls), [AWS Fargate](https://aws.amazon.com/fargate/?nc2=type_a) and [Amazon Aurora](https://aws.amazon.com/rds/aurora/?nc2=type_a) are created by [AWS CDK](https://aws.amazon.com/cdk/?nc2=type_a). The aurora's secrets are managed by [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/?nc2=type_a). The Fargate task is divided into a frontend and a backend, which communicate through service discovery. If you just want to deploy resources, you do not need in-depth knowledge of each of the above services. From afa5b80b3031041773f53933a75b42a8617100a2 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Sat, 2 Dec 2023 01:14:13 +0000 Subject: [PATCH 106/203] add archi --- scripts/aws/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/aws/README.md b/scripts/aws/README.md index d135b1aa4..48fcb33de 100644 --- a/scripts/aws/README.md +++ b/scripts/aws/README.md @@ -6,6 +6,7 @@ This tutorial assumes you have an AWS account and basic knowledge of AWS. The architecture of the application to be created: ![langflow-archi](./img/langflow-archi.png) + [Application Load Balancer](https://aws.amazon.com/elasticloadbalancing/application-load-balancer/?nc1=h_ls), [AWS Fargate](https://aws.amazon.com/fargate/?nc2=type_a) and [Amazon Aurora](https://aws.amazon.com/rds/aurora/?nc2=type_a) are created by [AWS CDK](https://aws.amazon.com/cdk/?nc2=type_a). The aurora's secrets are managed by [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/?nc2=type_a). The Fargate task is divided into a frontend and a backend, which communicate through service discovery. From 2bf588e82c7da6ef935645a96c60ec137d2a36e9 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Sat, 2 Dec 2023 01:16:18 +0000 Subject: [PATCH 107/203] add archi --- scripts/aws/README.ja.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/aws/README.ja.md b/scripts/aws/README.ja.md index d7fa5b0a4..da43950c1 100644 --- a/scripts/aws/README.ja.md +++ b/scripts/aws/README.ja.md @@ -6,7 +6,7 @@ Langflow on AWS では、 Langflow を AWS 上にデプロイする方法を学 作成するアプリケーションのアーキテクチャです。 ![langflow-archi](./img/langflow-archi.png) -[AWS CDK](https://aws.amazon.com/cdk/?nc2=type_a) によって [Application Load Balancer](https://aws.amazon.com/elasticloadbalancing/application-load-balancer/?nc1=h_ls), [AWS Fargate](https://aws.amazon.com/fargate/?nc2=type_a) and [Amazon Aurora](https://aws.amazon.com/rds/aurora/?nc2=type_a) を作成します。 +[AWS CDK](https://aws.amazon.com/cdk/?nc2=type_a) によって [Application Load Balancer](https://aws.amazon.com/elasticloadbalancing/application-load-balancer/?nc1=h_ls)、[AWS Fargate](https://aws.amazon.com/fargate/?nc2=type_a)、[Amazon Aurora](https://aws.amazon.com/rds/aurora/?nc2=type_a) を作成します。 Auroraのシークレットは [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/?nc2=type_a) によって管理されます。 Fargate のタスクはフロントエンドとバックエンドに分かれており、サービス検出によって通信します。 リソースをデプロイするだけであれば、上記の各サービスについて深い知識は必要ありません。 From 3b94d5c61ab607e43e2ecf1f703a3e9fcf0d70cd Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Sat, 2 Dec 2023 01:17:44 +0000 Subject: [PATCH 108/203] add archi --- scripts/aws/README.ja.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/aws/README.ja.md b/scripts/aws/README.ja.md index da43950c1..01fb1ae42 100644 --- a/scripts/aws/README.ja.md +++ b/scripts/aws/README.ja.md @@ -1,7 +1,6 @@ # Langflow on AWS Langflow on AWS では、 Langflow を AWS 上にデプロイする方法を学べます。 - このチュートリアルは、AWS アカウントと AWS に関する基本的な知識を有していることを前提としています。 作成するアプリケーションのアーキテクチャです。 @@ -32,7 +31,7 @@ Fargate のタスクはフロントエンドとバックエンドに分かれて npm ci cdk bootstrap cdk deploy -``` + ``` 1. 表示される URL にアクセスします。 ```shell Outputs: From d888da74eb90300f3782dfd87016ea603155e2fa Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Tue, 5 Dec 2023 03:34:28 +0000 Subject: [PATCH 109/203] update readme --- scripts/aws/README.ja.md | 14 ++++++++------ scripts/aws/README.md | 13 +++++++------ .../{delete-ecr.sh => delete-resources.sh} | 4 ++-- scripts/aws/img/langflow-archi.png | Bin 279821 -> 297554 bytes scripts/aws/lib/construct/db.ts | 3 ++- 5 files changed, 19 insertions(+), 15 deletions(-) rename scripts/aws/{delete-ecr.sh => delete-resources.sh} (51%) diff --git a/scripts/aws/README.ja.md b/scripts/aws/README.ja.md index 01fb1ae42..f7f093394 100644 --- a/scripts/aws/README.ja.md +++ b/scripts/aws/README.ja.md @@ -1,6 +1,9 @@ # Langflow on AWS -Langflow on AWS では、 Langflow を AWS 上にデプロイする方法を学べます。 +**想定時間**: 30 分 + +## 説明 +Langflow on AWS では、 AWS Cloud Development Kit (CDK) を用いて Langflow を AWS 上にデプロイする方法を学べます。 このチュートリアルは、AWS アカウントと AWS に関する基本的な知識を有していることを前提としています。 作成するアプリケーションのアーキテクチャです。 @@ -11,7 +14,7 @@ Fargate のタスクはフロントエンドとバックエンドに分かれて リソースをデプロイするだけであれば、上記の各サービスについて深い知識は必要ありません。 # 環境構築とデプロイ方法 -1. [CloudShell](https://us-east-1.console.aws.amazon.com/cloudshell/home?region=us-east-1)を開きます。 +1. [AWS CloudShell](https://us-east-1.console.aws.amazon.com/cloudshell/home?region=us-east-1)を開きます。 1. 以下のコマンドを実行します。 ```shell @@ -20,7 +23,7 @@ Fargate のタスクはフロントエンドとバックエンドに分かれて ./bin/bootstrap ``` -1. `Done!` と表示されたら [Cloud9](https://us-east-1.console.aws.amazon.com/cloud9control/home?region=us-east-1#/) から `cloud9-for-prototyping` を開きます。 +1. `Done!` と表示されたら [AWS Cloud9](https://us-east-1.console.aws.amazon.com/cloud9control/home?region=us-east-1#/) から `cloud9-for-prototyping` を開きます。 ![make-cloud9](./img/langflow-cloud9.png) 1. 以下のコマンドを実行します。 @@ -43,10 +46,9 @@ Fargate のタスクはフロントエンドとバックエンドに分かれて # 環境の削除 1. `Cloud9` で以下のコマンドを実行します。 ```shell - cdk destroy - bash delete-ecr.sh + bash delete-resources.sh ``` -1. [CloudFormation](https://us-east-1.console.aws.amazon.com/cloudformation/home?region=us-east-1#/getting-started)を開き、`aws-cloud9-cloud9-for-prototyping-XXXX` を選択して削除します。 +1. [AWS CloudFormation](https://us-east-1.console.aws.amazon.com/cloudformation/home?region=us-east-1#/getting-started)を開き、`aws-cloud9-cloud9-for-prototyping-XXXX` を選択して削除します。 ![delete-cfn](./img/langflow-cfn.png) \ No newline at end of file diff --git a/scripts/aws/README.md b/scripts/aws/README.md index 48fcb33de..384b755fe 100644 --- a/scripts/aws/README.md +++ b/scripts/aws/README.md @@ -1,7 +1,9 @@ # Deploy Langflow on AWS -In this tutorial, you will learn how to deploy langflow on AWS using CDK. +**Duraration**: 30 minutes +## Introduction +In this tutorial, you will learn how to deploy langflow on AWS using AWS Cloud Development Kit (CDK). This tutorial assumes you have an AWS account and basic knowledge of AWS. The architecture of the application to be created: @@ -13,14 +15,14 @@ The Fargate task is divided into a frontend and a backend, which communicate thr If you just want to deploy resources, you do not need in-depth knowledge of each of the above services. # How to set up your environment and deploy langflow -1. Open [CloudShell](https://us-east-1.console.aws.amazon.com/cloudshell/home?region=us-east-1). +1. Open [AWS CloudShell](https://us-east-1.console.aws.amazon.com/cloudshell/home?region=us-east-1). 1. Run the following commands in Cloudshell: ```shell git clone https://github.com/aws-samples/cloud9-setup-for-prototyping cd cloud9-setup-for-prototyping ./bin/bootstrap ``` -1. When you see `Done!` in Cloudshell, open `cloud9-for-prototyping` from [Cloud9](https://us-east-1.console.aws.amazon.com/cloud9control/home?region=us-east-1#/). +1. When you see `Done!` in Cloudshell, open `cloud9-for-prototyping` from [AWS Cloud9](https://us-east-1.console.aws.amazon.com/cloud9control/home?region=us-east-1#/). ![make-cloud9](./img/langflow-cloud9-en.png) 1. Run the following command in the Cloud9 terminal. ```shell @@ -42,8 +44,7 @@ If you just want to deploy resources, you do not need in-depth knowledge of each # Cleanup 1. Run the following command in the Cloud9 terminal. ```shell - cdk destroy - bash delete-ecr.sh + bash delete-resources.sh ``` -1. Open [CloudFormation](https://us-east-1.console.aws.amazon.com/cloudformation/home?region=us-east-1#/getting-started), select `aws-cloud9-cloud9-for-prototyping-XXXX` and delete it. +1. Open [AWS CloudFormation](https://us-east-1.console.aws.amazon.com/cloudformation/home?region=us-east-1#/getting-started), select `aws-cloud9-cloud9-for-prototyping-XXXX` and delete it. ![delete-cfn](./img/langflow-cfn.png) \ No newline at end of file diff --git a/scripts/aws/delete-ecr.sh b/scripts/aws/delete-resources.sh similarity index 51% rename from scripts/aws/delete-ecr.sh rename to scripts/aws/delete-resources.sh index 8e3b6a261..e299165bf 100644 --- a/scripts/aws/delete-ecr.sh +++ b/scripts/aws/delete-resources.sh @@ -1,4 +1,4 @@ -# aws cloudformation delete-stack --stack-name LangflowAppStack +aws cloudformation delete-stack --stack-name LangflowAppStack aws ecr delete-repository --repository-name langflow-backend-repository --force aws ecr delete-repository --repository-name langflow-frontend-repository --force -aws ecr describe-repositories --output json | jq -re ".repositories[].repositoryName" \ No newline at end of file +# aws ecr describe-repositories --output json | jq -re ".repositories[].repositoryName" \ No newline at end of file diff --git a/scripts/aws/img/langflow-archi.png b/scripts/aws/img/langflow-archi.png index c46ae811dae5b9033fadf2e28bfe33a3852e5cda..3064a562ecd9924caa8493accdd66f81be5d081f 100644 GIT binary patch delta 193372 zcmd43^;?wN`vyu#h=8ad5(HAkrz_ydWmhHPT2UCEW~y0z(ZwG%DTQ zb=K(K-w*C{{($q#Tyr_hJ8P|{?&p5)Wl+GSp2*9-CD>*JPoE6eue-v>n9K&5q&uaf zSuUSr%6fZ=oYAO0e!D$hTU^jFnB}G^*Ugl3mmVuCOGr3$3a;Q(dmWbvG|DR}t(+G= zESQanTUq$LuwbwoKW2?khx-v?QxlP^VB^>X%)Oue0$0(-5h1L>BP?0pF(iS1(#IA# z|Bi^vT=lV%$XobN0&GzN4vFNTasn&3N*JyHJd_X{kLZb-uSDEUk6(h;@SnlB!i3m% z;BhsgT5zruTqgJ$DK_N=mK2Qr{$*&XGxA zVS|_YOW29nw9nEmf%o***rp}t;{u8PtdPD57oV4<4a{jv^}4?`M(VlDxL?6kG!=E|9T!< z_yQrhCD`wO{)RyDyz%{hvSm2-d2G6eh7|W5z8YFxUHoS^WRK}>wm#A`4F-a}-73IB zVIe(j=cq9Il-M9zBMz;ZeUr%GE747EC>fXHJ}zka`($~sKVb0;Ye{H5`Lo=A7f#5& z*77|LhtiPk&q)!|lQH^vj(5CQY2*EX*#`r`5hFMPz4QOK34Hu(z#=cGes6)0klv7x z%)HU$w{6bT`}#6SB$L3ge;Ws$Oo)9B{|%NOzaIYoAHR-|S-f#F+|L1r&NxP5I+s0L zO+>EM)L8Z;jIn5TjbSK0j@k1fU2yILONM`a33JdrM8@fva@*ld?T4qAzXwq59=|o- z{nS|WvmRS8yreec`9H?`_d7p999+r2HjRl98Yo$sh+IxC;>OTWPqj|4lR#Y@oYU;w z5P5m2Ryl-dAE{KmZ8OY1VK+z*Ee%@e2Fw4SlL4zq!~Ck!<>V05{pp&D!6kWWDhpJL z-vbS4tb`2D4Ra0^OPN}a-M%7V6TZGE(9-$nZSHq1slRLvk+IyugjD#ICjyuL@m`EO z(C^@+2WW=3PA|x1=MsfSX-fvvBH=ZUJWUK%G={1?V`xQc#CH-5FP`08s1r`9Y*aW+ zEN}FM#r`NuCb>6#h*-(%$6Glnj}pyCB(E+FGud(I-YwwJwruxkv=(517@h*R_`kS0 zM`(Nvd&hrqAgqmsH`I1WovB0XVzjKOv2;!VMF%P>h*}orQ|DFbl2B9ORwzGI!=&Y0 z#`y2a{#nbd7~o?vE)VBO|Mg0#H8bSZNGJso>F@`#ZG1AQ{P-lCFN08N4_|{gJL3EBU_#p|wryeDmSAr@49373X_;a=iovzg|1m!L=4qWny%j?dH$x_>s_N z)*hLydu?pE_pQm9U%1TBm1eE&UhK#`Z#mjHlJ0!C+ZL%1XHv(dI$b2{X@dUbA8ysI zqdNQ%nNegPGBKDn0X2Q>&hS($+n4__^rmdzF)3nddAeKWDlyaT+G zmIWy?e50g`^~}$by?ZSYB%3!?5*#9(uoSE!U?5UlQex-iSHknsb|!C6uj%;2cS-OI z>w=5LUuS%oO&Mx(Q(4(oygpr1X~gfT zciZobqK30EM<^~ZHO_WMNS*4?OX<<2+<3yU5$W~sYerr&9ep?33#m_*xX1)hz!{O0tcMa3pveHPrF&7=sM zFW7(WU4nicMCz>*+AiF`HeV=FxWzv2I_lk1IX@kqxPziA6>+V!LCI>DJqySk;vV^! zV4A%&j*ua}G0touIrJ;WB<g{wnHG56;jt*K}H+EowZQ}SO zxn1ul*pueMS?^P>I9C)Dmestyz`A@#ePdy-psAhjG;#B-{1ENQ5|35TkZq#Y7iCFy zy<7f^eO#u+7EGmqRCc@+Jg_Ry!H;7ZF6G`+SK&yc_2I zPgm@Q8mu@yNw0^$ojqmZdlvOwaC`lD~Ugwl-zVg(?PAZ9Klg-LCJ?sj9rou z_!CNersds+adra*7kjAV&ZaS7?#oOP$qFe`L!5tQgD1&GF~bf%Ay9dmwaqBJV>aO*hvk^fi?SM^E)J-|=ltHB_^kVPJD8FZLO_6anc?CD) z(E#NNG_G6uRLr2biLlIqLx9)jm#vIh4QpHsgW2g8&sTn1imU(TM&JwY^6Gh-OCxAR zSK6HI4D$4u8+{U3X&f9=$M<884^0N!wP$iauF_5n5r08T%25@Y2QPOk;Gc@Yam|A9eB<{!e5j?l(-*p0L03=8Mdd9?z!T)qBNngaSb#-=tK9!dloqnHh+!O6j@ z?*o1pVNr)PiRj#8XlM ztur+Z6Z_IPFbQN?uEnicD|D-jxP0VwcY?9QYdy(z(CA=Vp=Sc#*@%7tGnD9v-B4cCSb1}i zg1lwFH>2&{>kp&uik#;4wJVcDPoV0!&N~|NV)HI9`&ji`6Pj_(Iyb;14giKl(9Zh7 z{txv6>-+lSP{^Xg~lBC;Q`LIFpGnymMs+3ckiOq<7Fpy#J!#(iN6_HTW9I zgmJs=ek_+&2Aev2A`@MFmwG^YdS%gHi56o@9E>S{-0J%K@D!7^JTl@ZHWgSGxgt6Y za_YideMAf#E-t&+N<~MPt-$US1PiP4uZjp!>nAKhqz;zNZ`ql&&q858<4Y~9Di0HR zadh=85SP{*hSOM!xCGEq6q~E_y5+4VJf>Bdk-JhmdnoQUu)&)6E-)vDygaw;-Ca>N&mi0KJilFpSy%@xOojhHn?vTw}i_;d=b# zPozX!7M|sOxue5lzlumyryH{yZy|n!3Ug{)@N_J18M%Uw?5wo{560vs*dh6@(Afpi zhl=2Ylv;317YElFyH466+Fp(oUg+9&oqDd32ZfizIb7{*4JwO>ZImZ!JOA>e$DCc6 zI(&k~8XT^V!~qPw*q$&83qe1u6}cE7T4*bas!{P zIG;^`m=d@x3y=P=(C_SOyfD+T@kZ*)2hT_GS8d}&n-`x{SL@QUQCV2n4+~d6_+P1~ z-^P1WZuwKJx<183Q(lsy=&@T&_Pi(m%`XUKOZ7YoE

lD}z7Bw@ZU)Waf=dkAfN#kbl_^WP*q1f=}>R8LG`P|H}Wq zJUFE}E};idzv2r4e$OF-BFoK!m2EdpdEK?o*29HewIg>GI3oa77+YjNn?xjjohu5& zirZWquy-|VctgT%b?CC|k#ZHLTP0t1jZwF{Clr5M@5A4Tn;ZwupS7BwS3D$AX&B}y zs&YXp@VfW`8fO<;X)`lHYL{A7{(VrG_>Knv_g>XQB-fwsC~zrvxqq6>mD+w~ zW&1HZIp|EzLn15V&hK*_dg{7g|MvjxalCUhBV@mSs1{xu4mVkueteg<1qI*L$aR8T zKe;Lf8+&f`*82UGM+mhgaFu3Glw-<-0_>OeMb43?{!{!YoKG5_XSGoWy&T~7TqbL94tPPZNYL!KiZS78)w6zZDo`T&M z-Uic#g=iGGxTZ?El$jfnoj+TTL5Ej}BND>|{nxv3aXKuwBLa=ISE79k4(c!uDuxHy zyMEI7{ybf_692zv%Y`Fa9D-kPRN`JdML~WmgOT6!*!$3BDB9KO@nT|AF8{5wssEi` zvYBF8wS(WK!HveIpp|XNSZmLxvD>c^^my;^@x#tm84P%11K`c*cu4qceY;QJmFywl z%2pj1W36EqGYwPPYN&}a@NoWGTmYldIurOac~! zH}2(Mjw?a`3`goTJo3xkFVD}c3mDwNuRZYT(@$GmEBFJp3Cl3WXgm}orp_^OU%Tpw z_?eSu3C9s+l6AYj``P=jb|B)JNq?R9ime)}ir(Jy;5h%YKi6<|%?p3622EQ1>6*sc z65I@WULhBIwj~04Af&IKFva=tA=EeZCq#|xPIS*=1BvYgNr!yqS z6V+tnLL(SKVqDT{X(BP(fLPS6uG>_K7tXANB@Ks3BoRAzcNpm)UAd39k{`*^w5VrG z{Fn8y{LYQS6ibU0)v^)_}8TTK(dhl39;#+ zJ)))YTHT`JVsC+0A0wipZ^y*M%w(!%KYf}mOMyfp!)7|-B+JR!|< zhv8}2%ll4*J&)vlh1na~BkYya=kIix-o?(;rIRJ(((6xC(Gw~M3T)~IaNX%TCkM@6fLo#9kD2sNirsrOVfHh?=cqs_c|1fogwJ(d&F|Sp+K_4UYY78YE+A zqKN({=CcI}<3HatB&1T=R8k&)OA2R_ldW`^PIH)UeVU`eVKGvcx3!2?vaOuHx__`( zV1h~%EfmEf&_%1%lg6Mb=S|&25+rkI zmKDeTt;@ZP*SYfV9Yd-{k%Rxxv+u9m_uBj7wfFO_!%|^$>)Ox8E9gr*ON_~=5P>nL zh!QKbVunK8OmPA+2*JBx#}${De)~;8G}i7Z(zCA8PG;Qk5sCR zgaqE+b^Ggoz{U^A!1oY3<$pie;4OEvZ^-Np(VDL8_u^JAOtT6yFO^Ne&i?G&f0}(- zazkDr0xk<8>~lA-f|b0R&wBSexFj0zVBXv6?$c44m&Zd=#{DiaN|G6?_Hp6_i(6v* zNU2=u`SW*|$bOuN3o3F$yBtXS8*@*7QvN7c+e0x({Z14=H~{@Uek1qqju|+3DOPIt z69s8p@b(iHW788tDZW1^&_LeO*%_^pDv6h;uB=R7Sy?%g8!YU)5}7UsZ{3}MIE6Oj z5l*uSuC2b3d#Wp}U>ivteZ{h9>q&5~d-^{m*EfsV4_|8#PM>|MFqJoCMoNA+6x^m3}Qn#bC4$+u0bPZ#Wj$#6DA^ zpD1A}qid(2(ceCV{Xyb$u%ww_d!)8WWlQxu#gkGXH367TlweGz2Q zdzY0r(q1n`I_=z%k%hPn;Wtj=A9qNi$n2qpZ&q) zwev4d4fZ;zME_UgScY*5Y4CH*s~xt^o(jfKrR({q^}&HHt1O!L;o;$xjkFN6Co@`? zTl6+9s@8gJ*GCNooG}~2rTeQjn`u7B2T)n9evMn9jabatXDZ*vt2pJ1pACZjuO%T@ z00GMyJDZUDza{-Hi!Zc%yXR=}(*@5QM1ZeEq0#p=*VXYNuYHH4RQ+m~Jf-nZkKP(L zz9E6__kUK8$jxQvvFn851vff{S6e2aQx2Un;J+!TJG1eQ!F^dOjX5wMpSoP#@=i9T zk?tM6`4%uBG3}s6e?F`R4xHj0a%&lk9$c0Nf2yhb$&YD9L6te&lo z*A{tfTcSVj>wkKP$EukhubGI5@;=-_hKQe-cdC`xPf8BexEGtl(q*F_6WDb5=72+# z0gpK5yM*>4*@_j1>e%(G)S@|bO<}2TFVaP~MzP67-BEvB;I}eXEeF4=KZ-VBxvn;% z5XbLM!2zj%jvUI+G!3N?ojq8Wx3I9l2SHc?Fps+ zt&1XSzEt#|+;>MELqyiUU8$N=ye{k#X#gGf*Pe_zqL2y#V^c6!4zGjxOb37tDm5Ap z>SkiCrfPS`H?vdyo>133gKxb~Zoc6uKkl`u&`lp@DB~Z*OTh`#!@qcg9de!UE~j#u zDi{}-@M84GC)p?;YDfRLaO{>Lb;JFe^#~8Ds>T?3xpH^hbNT~k9a%Nj4b+C~xO*lQ zi$n8u*Oo8O8ry#`pq2|^18`0NXE+LKHUg;DF14QUO3wi3z@PM*hTr;HNdWAvhLm^o z4IWeZuBt@5MDHDKDlxAL$SgXN(*WkOGCChcxzGxnWqR1EfX`olYx*f9gIlF2x~;ZZ z-dkb+9Qt0fvAw(7&VzEB4x$r>fm357Af>$*@(4mx^UiQuc-JQOul{^X$L|jvMUh0) zjCL2z1ai=+Cpb!klP%`mBvR&L#guBjoyfrrt` zy$8nx#(wszkM7XocqCcEoo2|aisJMo&DOtMC|b|W*{!8cb7-P6tMJ!e8s5lFZ4=Uc zuiqmPBaLI@r123Yema_og!1*Ps}4=ZvaqjFXBj4VH|uoT>aY4q1=F&oN(ONoT^!4+X7#FOPZfJ9OjWN*r@!)XYSp`^XA|v$PRHlAcCN-xte== z;$tO*+rK}X#QEVW2T_@>V>JwASF`>G1HDYYgm=EUqIky|ZG693Qu`bkiw@3m(9n-N z#wKr^yAn^+E!4_#$dVAT~q?CtO8AST1)yO;eN|awK9uJ)}zhq95|~J(YBKX-HLU?+5Na8gW8lFZ@Z3orUF|{%xg1T3P!M z?t{zd$q;c{7^M)S;xifXqcwjjy|m+t%oc0Ik1mQDcYfJg$SJ@lDJv{HMjJpeJo3xj zumDm4P_>$gW8?1I8?~UIyw}UI#OPNWg!IZz=U@w6uzcH5me06#DJqY;mAEtcqwci6 z8n10wFv_<_^geI6$n7|?^JPKh{s~U^_^DNhJ3gV$xEns9^*5e+W0`3)td&z-gH!82 zG&8*#h~0-#DYR!}_nTg_eaCoD{@2QIm8ChT#pbJvPFdP+i=&ydw+87fGdj!0L{4K< zDA2J=jB_8)9p>(*;j%ixa^;kk0notb?lhI%xhWuQLTePMXdmdN zB=^NpwlYkcjAZKiA|I3GZymn)E`GVA(%JHg`6RoAyiPBC+gam6HMwPS5dQnO;Q%j) zAX{6B(z7&U0HlcJiE=ZwL~Q%4w6Ya!wUbum@+4`gWTjxheKo2B*b=+(ElrJ6Chd@$STG!8@B1j`C5XI6BJ=F*(cRkj~sI5c~JVSf>qF z@}-Z1pfEqtlvuTw*})NNo1JfhA_z+gcV(jWm{(4>wcPOEtx(m^A4a>4*$KK|-y}Aq zGfx63e7)vI!U>0uuViUN=(;@KTbL#nCQM? zJr;md0s9ZN)0X#gn%~)HiyFlzx=IFZx^72=fV^>^G1Q_aO>u+MHw20^9(I`U-i`6Q zFd$|jAwSs^lsCjsV1@M-|Iu9AUcM6&VuDv(Z9EvLCr_|fG8kBwPn8NGW$Th$?RLf| zwGskQu-*3x>PYs4+i*K%m-%G2QU|k0Db~mqax?Ad`fsUW3pe z{LgbP3EI-Q*-qXVSnfC@zrWGOISpEo9SbFYkuBOR85fr_)Q&mN$;qLeJ3t%Wv8<*w zxt=SPv$0<%01}8F(N20EeOKRdz;pzl5O^gq*{lhlpy(!tdG$Ep8uyihgi(;v_Eg zyr;;dE$x9nKDH}OfmIK3LZu$ph!Ka7+`^AN5gR8F0xui4zBg%&oi2V|Ctmx!T$??{ zxG;tXsojcoG5njWYmQ@cC zYPlW7z!sGk*ZLOD-8|E0?)3g#VV%hAf*iZly2El~_9_M(W1uFRWTJjs!c&wRHSxx`D@q?9(1Pk5=Ds~j4D8m3d26ip8 z-vo=K7%PDA8MGqCM;0?dhvKl=A@Biztvyk6L`NRxwf>|Kf7txf&hkign`N>;KEmy` zGX~X~MWZ&h=6k1+%t>2FG;!YHOq`u801Gu`=q!~-o%bh+H&crT^z6S=toYJtehs1# zXvJV#I44y(WP}y<69|Q)kzT+U{-&ihJ%Xg`FNEPI(~DFxsTVQ?o?(CM(2n zFuue52P?RNPo-e!x1Htj)1cmoJvq+WTc^jX(D4fYI6CbLf)PQ`hz~$v{mnI~^%v8| zMtFMkXiB-zdK&EM(8t$704NkzoT5`_sOXE#urgP4e|aOOzeRQO)T?|~^Te0_wmsKp zH$SKS><`llWQc^P26GXat6S&(uh+$xSIcm$Onh2mypvq4;m6x()xwxaj`<_=(yzPn z@1^mK1gZ7YAn$+-Sc>F&Kn6+&KcJ# zR?z5+^Qn--x~h^W6KEcCoK?Rq0>@H-XITZQq}HNvtuV~eGfJ&8vx4?9?UE!0m%;WQ zDuXDiJ39uecyvB{&!~7z18si1zp257%YfZ8GS~NRh@h zA*U>*ish=YHofhI{)j|TPmd^c{r>u7v*+}Dz&OuBZiLGN{(*+! zeEfj93*rM`&w+`A788lXQ%b9a;nE!WL=kOXX(r{KdWwX3Nq?bSTpX_rB=d}8FuuY4 z80h3+kuzzAx1#ZGOOuW=!Tl~nE)txg+umU%AbV^r^taVC;p!UzARYaNgeE{tNv9x( z66W@R_lp5;QG*N`=9yYB;g8 zcp!Bi(ak{W>*LZhf!B6X&W)#kcyux)Y;SEvT;`Wd3G>fE2A?ro9xlaD4Ew-ej`0W0 zJrB4~L15D6S`;h`u_cc`uX<@+!!PtDCDqu>%&ZN-!&)8B)!N;ML?!zGyBR|#NBb~m z=jm{{yO$Q*!vGCYJ4MaesT0w;@TnN_Dt0SI5|`X(?_q4Tv$9MJn zS03Mj_xhwLEF-a`^kE)A#kyz;yZ>Q%9y61<4W`WvXYgb4|GypG?{}=6$&g|7T*`+u zr6e&QgXj;&ybF&T=2>99843{~pYAQcsXG!dX(b<_+;`#~2Q0>Z9!(pGP>!-+2TSnr z;Vv9-eTV0U+;*7Q*xHDlx?^l}WlkkNJrGf3VwManUi^UXMUfGiWu+h$baJ!_p>Sc7 z`6{W)BF=qt60Cz+_CeHqL~8m@w>AxY_MhC*%wJON>@!a9VlJcE5}!ya}43*(E1|5 z`|h?DHJ@dq(j^k&E=YpLswesF4N(v2Je|^-m#TeSqsAmf=z~OThM#4WSvBLCLmj4@ zKm0Go7AK$kY>rm`*w1ba_K%ej;M88``_*T|uM~SxLMt4YaED+TYj!z#-26iaFU( z00rAry&vwSj@Btlp7DtTuaO$}%}`g*-7!}=K#zH~F0w=FKW~Ymex7RvnZ6^_y*81r zrTH$!fK|_mR?9yPcsCBx<+R|22=1T(1$e1;o7o^VVkMTBAe1x@OE*zJrVFkWfHz@Lg;8O{$>b`~q!!$C#od zC;$rh!4|eJB&QX&?fZXK zjZ~%>;Jg~C6ZT$RQ6#Gt=k18$X?|}TYje*?&ocO0CNo@RlJ+pBi|mi_pUBb+3j>T! zR!etLz{1cyQ!$|-@2ZP?0#_!OripDkT@8`&W5cwlb3Aaq{R^Y(?3vii3ULsB6i9>P zJiT>TWiVxlTl)X0_P`E5T}K5~o5rq0LVb z$cYQFLTnw*Xnkf6Vxh^DPT9z;7`X%yn3XPd&1D%fIDWuTx-v@X{bi;G55<1(C^pSb zTX-4j>+Aj45>aXH-)91mNpty`ubf7`G{aiG0AB1u46Ok7IF3nJU-LcwQC*Y8NJtv@ zXZ@ii{zqhE;rN|PxgK;^d8BaoYKL^)zz|H2ai8D3i(X@F+hP~+b!$jDAbbDW`1Wv$ zpv?^ss!wpOw$j;-=i0m}?x+!JKpa!c2So|aJJ-=!-AZEnX~Z=A@>|qIkxqSc4Y8Nq z^8^Jgo#uPey%is@O9pxFPs3|>CaIAk;oU2>)c>bFynHu#_cdD2F=(z<|9b!h;_gV9&4tYDtTx-Bq9+)3u(uP`t`1MnBoYSWy*R2TW(W4%367nD7!vYh zv2WrbJgN2RpVbW$yJ+nDrAogxtb$59LP3+qf!*{{4hsy1yOsQpm zQC7~hJQ8E?_QLn6 zd=F3GDY8cW8CnqDA=?WIO73UwK)45jprsbc(yx-n=^R5Rh*~ZB5r*&TLJQa`q%biU>0_+}_G#M=1NgE^- z>2eg6t(F~*Pzat)0t7Aw?aSFhw)vVP2O@?7cQydBGhP}jgqb)$F-u?vyu6Z6a$vS< zW^C~Z@Ef`!^X{A4g+{NJmZLEIE(*(DR>~PPj+$0-!R4@Vj;VOoMww&bJIQN#&$Ilw}M%Xs>%A6>(qlW*N1Avz}r7d5LW2ByVe5K@-E*gG~ba@lOZn{`vnU|k1X_MUs2gSNmRh8{V`LS z%5Bo>mM>IC+vy(YGP^#iS>l~8_Gg`8M7MeYqQymFg(b?&E_~m-!E*KR7Zv@H6+=uC zwvm0%-j#sax}$ABuRm4j7e=pLlLif4{AZv4lue1J7jE@}T>R2OsOxqgWnldM@s}@g zhN_%%lvI(_=8f;{oxMBNS*W^C7}&xoPXLb<$@7TnpUNhkCQ-rD_;>^jXsLs9!*lI? z0K}vVss@=If(CIzj}Pwb(um2o%oDMNV5%@b0+kmCItDrG7Ufyh%hZJH{|LWwIDqx} zu6|WZg6p^i{@B#?^y~gy>cDGU54Ym2x)i}=zwvWYRs(>H0p@6GmQ)nc{{H@@{)^ia z^fxU>vm%Mm#%axpqJLHt@Dg0sdN1CV{Q~iwN5T!Q!Yz)Q*06nTd?=as_r4*V^-J_! zx5YY_&J-m~O`?B~7jDB_^;m_;@|FQ}uq((%Wt{h!tdfIn@Gv&LhGtSpN}l!2t#xGk zVe&DVUb34<6)&5CV$lb9D30LG#T~j(gzGAQv>9!A4;p$|!X4MWxlE_Ug=j!pLxWb(*Hv(J|!!N?FX za&t(z#%*2t^J}$Col;9~hbd_uLrF8%9;)|Sv~R8i7J-2-hOK3~!mJocdR^#M$pj#V zUa55!cLBwQs3s#UxUYADC#&-yl9*LJA3_>`Ny7+ld=n%TCK1OZt4M^xcBF3LyubQ`s(zO^t@ZdS3af5*z(5gml&#xysKkFf>i_cw0LH6iZj*Jk zsV3@&xR7(A%5LiK2&j8ws)P;q-EHU^*Ikhr^8!A}AW~G^pTPCQ1Df&{b#Mvk6x_Iy zH_g!e*-=@!(Le0G(Vl`Z@u4-VT3a~BM)*ydevI&LuVD-jK6F`K1ez5AvzXkc=>ajP zCx@#aIz{GVobW?I5gg=cGt)L}7MzY$#pyIo<#`N>f*LqHCJtSwEE3d}xFi5>KJ1{P z>h@=7&_?ozV^LT0P!y&`?)7d?u@`*{#KMojnl4i%7F=R?wm&H-_JBpt~Yv$>gRI_U1*gRd1E%|=?3UI7<#S-9x&rVZ@ z!c_clX&U6dzX9{)y!TQP=;>`jv@2y{237JK?7I@M*V+$~$-wQxAD%r=mwi5%VNEz% zcgW0``Kndl$lJ;NGno!$!EjehD4)L?)cJFkYL=`Rg<-7vux!j__34%{oS|CCKX>>j zhh2+Dv20a4#>qS5Q8vU}FI^Xw(A$$PH=;3GWb(nrhuh?~<+uBM(tX=aS>4?Reqq#- z2s54Eg$5(n9$y%hQOwqE-9fo*d*WRN)SkOQOhZV{?Gjs$BX_X^ShjGL`<_Jv7D8f0R#i_iTA#8TB24%4z!0=Ds9prc6n zs_yRYUM7luehR8pIvBl|jfnCv#w3`|b|xe$Jg!-CN)AF;G5jKx)ao`6fBG{vF!Yrr z=3m)m!IyHD!)qn*)bat$2QO^vF zuu?jF;89u!Da7_IaqzK~hd=*Z5;jwMD0jMZ8m5anQok#*emz^KPQ^ER@Rh_CPT&+x z%qK*5)j+;Jjkf>!tZ8blPQJ@~fb75wOrx5DXx{eG01U@Kaboc4vA&%mqFv*fWY7R5 zS;7%!Zuc|Zvh_EIaQ{|U(L?u`{sN_XdKwg@KYzisF%Z6y5kIQSEAjS~#Am{}b}mtm ztu;Yfl9Fy-yK#{iFw;lvfHK#|jN*B;ss!lAc_0T}87VISRqzo$DebkVp+Op3lx}n~ z^_A6({1=9XhKwi)uP+4N zOYF__B|~4H`IpAL8vqgkY86qE`$cj>ZBMz=Qk)cS`wIZwpI;vZi|Hr|(Vd-IGg#<9 zK~J;Tjpk65teYQtWNUqS7%{KCSR5=-gb5jM(|{gKqB@N~H1@$~kwvHOa)$jQ6*6K2 z;-bRs^xy5+@BRZbz?XLLix?Sa64f0if6D1x7AMK47+J_;8zI;xMwCtZnv77BKAbY} z8d5V2$oRrd0$D7!Kiuw;l&VxzQfj}(v<|w!0)-q+7Ie-PbR2*SDc z;`opP&>DAA<;otYTePIz}cO$WK z!1+i#tGy9&lA`qxV_*q-K`_mg>D+u+a3&@p33^f-GZ%N+VS%c8D!Cu| zC~`SeAqCFO*=2`4G2>naZKqzFk0}$3LQL52&T@X^FF`)ni3ZJ_J)V_5+wO+ zKqVCj6PJstjjP6=diR+pR5tOX|B{|bY;MLd8_H_uB(G0=XKOKS8pz|`o1HImm=NQ9 z88cEA$2sntt0yBS@+oKT-9W66X7)|Y1(fpk#7Xr;igQFc^#GG{p!Ho7sI(@9@JXgl z08>Ae8sbHec^_m1fBe>57*splABlDa_~hll_GiOf%(Q5rz`(A9A6=S6olB=kbTz&= zPgfvGg2v`FTGuwL0C6G|uODNwS~+`T#4sF)QFY%CQ(boPbfEz3F$qQ|;?3UyG@%VK zG1GtvDkmwysF0LKT>SWRG+yuG6yXmo6(2zbsNjd~EdmhE?QM_RpKoX$<}%Fe_bs-? z4wu=mG08=jm@-?7QWYQ#5vi}96=EdT^^!lF7+;*sm@16vZUmm1>Ip0gxH}Fx2>$Bi zGu?>L2TFH^jg}+Cl%EF2bnx@I>hiko%82&CDuw9fvBl2k*nSP{%8`lK4}l)D=`ha_ zO^L#~31uG;hvuT6vmnw9(HtXxs;G3NgwY!lg}&}0gFi6xkHbjo`0>hou$rjitsP}+ zxsCYoMgDk^$$e?^>c+5ZCbC)FfQ|0RDZOURnR9>D?D{l{BFTMwHFD>otpCDT?S|F^ zpe3oM3=DsEYvM%+qqgM6a!)$+K?&`wRs^Ow`=CMJ1GwdhneC8ipnNu`^85!)C6V=4 z0A4U_^(T)wf2**cY(n-biF0Ve+|!*_$Mu87Pxg|x_3-pkB}1-pHAGEs+Xz^eT$RpP z?BKI3(QJOCB@=DcVW6p>+N51xEy-Oz^R_6TF(%1E$Psmdi>ml+6r9%3*r5d(YANKXn4|O&5A}K+~bsHdbpUq zjgVXtn?#L@*F01S4Td}qlCa!3$Yo!=>r^v>Z{4^bpH^ICP8NzFw>FikHhhmuK)Pqu z*)BdA$YWh@^#ke#70jl5zpZcfQZ<$C9knca@E2Q}97{)v2|_~yKrg8T*d~*Mxb3F| z#9uPv<7us;=K|rXnTp%U^0uz8_`HNjWZLc^P<%272zu?k7%8IEcM7xdN#VZYtsuD} zEE`F2h>-*2;(!}V8?U(Hg4nL}o2HA{Y>>M*UWSY(hw~>YC1aq|^~}+kOIijgT3qfW z3T!ANc1Gnayr5G5<|C2jPi}V7|F_f^?y9#2KB$wZ?2^s2?$DrVbohXpZoETxZ4yz z-us#v+-Z5GGpkdK`z;xRn|+i#;y~}gGbm@qw*Yz&FCau?5CBtd22~X@ zkVV(nUOew@TCq6{qTC}m7U}Q`>r9w8dzQNXYv*;ZkG)+7H>{-kv&tjP-8ga=KTID; z+W?A&*T$CELB(Y7CbHbL#Jsx!FfCTeWe9qRwweedL7QWbI_UxJ^RW&0=CWz^y1+USDr!qB@&D=}>bVnnr^#A(AkCln2q-NE ztPzU^bqAl9%bJ2hPN2*j2_R|H`v98=5j)6wW3Br&rN`w{2|fpO>4G+w)b_n8TYS$AAYq1@`0Z+-a&uXU4_6?JJ)n@8Qri`XHw_l z*73ya4^tz~QfB=$TGeHJ(kWCZob3b~!dEv#13(WxUViJqhb?l`grkwCUi@bE9&so! z`gt0HY0XTK0Xr!ooP3JM2|FCnrQ8p+m@Z?-l*`u!|TmoxDW zjo}dSyyx6@HO9QXXjV28E!0%nB7pN6CSew34b&lBlh?S7rMtLwl7ar9%#ZE^B`3ex z?uCJO_z6kQ1KJxPVDZ_jKt=N%S%#7J%)aVQl_JP>1!ZW+7EMn>!tVhZVC(W~?(NFy zsR&5vYC=qJ?3Olj7rW@d#;07fYp16fuz@t5lX&l)A#DFBJ!kNLVz5#l87WZDLBkfA z+Ql6))V+b)IJq)rHZ=>MbB^%U<|}KrdgQJrbu{&d03D+$7!}?=F%@oYYm30Nf2${; zYI(5gmgVMDrtK?E@lnmMvRJIm0aY{v)B`-hf*zlz&fw zf8FXzS;5*(1ozu-Z)*7bgk3DVH;>9RMuYolMjX&$;tIGM<@W;b8d5;7uzq^6FZ(&o zRC4OgMeCac58W7CChEK$fL=PFv%*M05pVdG(YO1e(Lh1;)c)IjXT_~7dl#sM$a%|Y zS^W1jx?VHcds;Syr@NwO)@q>Y>Z6mL+*HQrnw_mgm3Q$jNxNW^_z*^N^YCS+i+IOMTV^<`fX>Cv45g6o|lD+Mm zD>nL0RK4J^T#CksB5lf_L}V93Q*&)D10}X&LfsE=ctgELE9{E^F~mdo#0UT(Q230G%#QjTvt~VheS2@3jKT;?gmRt(*7=FQhfxg7 zbD0lwCuFYt1_FObjrk|(bZ-p@q-j3fI0b1&&Jy%K11)Y9Zd_gpS-6fVl958(%>i~BqR?BbJ zx&Y*P2W|rO3WMZ8o0zRcn~i6cl6E3^Mp3NqN*vq2s{ zTb_LJAn~a3h-ZHMmrgP4*pgYga7!M^d7oTEm|Ri<52MuuW1C%fRwQ5eDsXC+gQu~4 z^A~i$6%^HW7ewd{zU4(Ih3}B-UWi8ZvQ{T6&Vx zW~@qmD^(_G%(mhuenARKWHaz+XT;8wJ_!BhG|vl6EmD$R^i<9!TH$-XQf2Ndq8{7= z+T>V25y-{4ZtvHHZl(J&{zhO0VhD9!^SQ%SMEO{qW&a&aM`Kg&ZmN-^(Xrz*R4jk1 z?ZQ>|HJXn`Xc(Zdrh%-j+}ov$E$Lm&WBrKkqu|RwzlmW$q!M1|7w#!nE=ux z(-N5@!DNE7ls1`^-<|0N&t;pAXl>Zyr`+73jkszp$wKyQ<%4UO%KM5DusT1@Uu$Ui zKLhyaE(VVem)mgya9*&V@-bMsW@PWtejpW3JCqy+E-%G$E^9AFv#2x>cgZNZt|Y1a z0-ClPszornY<{D79cG8V`@l1JBruIsJVi@+d!M2HMH9OLp?$o%V)0i!q$Xt2lGq8Q zX$FY@hrRFqr@H_Dzlf|dk|diVWR$&?Rmn<5*<9HtdmhItxkP4&V`N0gCVL)bW$!(X z&9V349GuTf*Ohwz4d3r?PPbm;`FPx)k9mJQUp_w7*X&AcZJWTd8qsBL$Ik4p9@}P! z`yylfi8P9qhD98gLx?|kp*MJM@!ofH0~YrE?|}W|0A}D=6LYX`J9)LYsw_<~OYBI> zZ2gDuumL;9kqve7g$V!~=~Ng2LwMgXeEF0jsg* zVG*-U!3o8=%OQ8q`UI1PUqj}xXG||VVYkGA`go9tuW&}I>Yd{@uB!pNaZL=q(D1u$ zpADbxmO;kHAVFf?!e$>47hM{y5_>;`NkRt9+I+7a91>{-+wU(IJL1X)--O=Ci;mp) z;>jJ3Uw?OKoDp^dWE8akN4%;07gstoZXBocJFYMBjl@&l1uhv0Yo|ep`<2VzOpd?LEI-y;Z&OOHUI!iEq}{_k5CvV87g_ z^)jY^bwk81R_butkCm`mZ+wXEFR%b)b_5n77Qoe&BvvYI1^^)XEb>;23bb=##M@O0 zr>`Xz^FE*9salK|kb$VI#R5oI|` zUf?jm{R`@Q3^34RE#@Z7Y~&~gUrQAfxmdM%Ia3uTa#kQre-d|Z=9%E;0vj})UV-Z?OmE~1Wo-$d1~!j zkBbi{Enh1bhN~UNq}JwVoiRSa>Uk76?<$t{NdM1m`hE|8s6M{$7I(m;rEMZCraqyN z{_}%~YbH01m(&3rotP)F0>C%#EWWWJVSzIS&bullz25xls+R50rE11*iJZ_B6oiQ4?c_z8E9@!k-&V-DhyE4~ z{#g2?W+-t@D|sB_*0B85WMDN_t37X|L=xkZ#xqs^D8}76tBh}7jjcUdHqnP=>qd1@ZYWA& zhb!!!TU&V>SRWj05gj`XE=bnl`_BNU#)_%6{0>=4{c73L7sMQqk%3s=;mVNt1k2Y0 zJ{Q3%_;Mqd>aCuqdJkCE10&3O1t9-2vR=R5#Rqx*9Y9xNc}CNB-Yuly8Wvd9!+JX@ zZg`4v&RiO$iEj(NkWqo%Zax%z*_46WaLv4y{lWIOXtJXVFfgW`IeEJn4x`lB%`5>l zszjJAhQvKQ5K=-JpSEWcPu4D&3fpmcs}0kBhWPnfY>eeO&o9_xpFh57u^$mEdds4P zd`;U@un77{%`&0~4!sf$GH~YmRQRLsnm7M5NC>NZxVl^(=HPv}W$F%-?n;z&uNuxH z!{A5M5ii66XG1}|FEexUs~#V0Os-aPO@GCNGKfEY;Mw{GBx5cvHzZvqXOhy}Bjl<6 z%rEu49AzgU@y4;xrN_f}AM~+saH6BNokLH0(g^g=ba&1E5%+s?dx4!dZD|eUGe)0< zBnO*FW=%l}FovMm_b>A>wtrVO~oWj_}y&*26L%-T@@!_hL-l)Z2N9m;{JFBnrqi|61&B0qL3)ykS_}cG0 z#;Xk_+7dxBR)K66E{!%HY5WoWECXG#oH*{@sg|si(CrrJjmH-=d13x#OAm|c!#l7_X4TV^+m9#8Uy-V!b=*x@WhRZ zIdbPc8WKl@u{0_MFMyUk$)f>cu<4-`b$B)Zeb=6&l#CTwB>+v|g)R zyCJM*soY2PUD&}Ae9I(7JGii(+6BA4v7X-1hDQ=+A9?hiTnH9g?%+d_WrLYf@wfuh zPhX`tU8xwHzDt7Z7}5krE8L;z}-`<5gkkDmcTw``~HyjNN*`NQ#YHyjDT$GS62A-Io*P|(-INgQ0AtFVkrCb$j1pIM&k~PWpOBc>8u5CDRDbzZC|ihRdp`Crn|~LYKRFh zDor>4!%dkqus? zxlI3qY(3n$`@7qS)l!n|VskBS?W_X$ALHokFBUIQ&Z(lG|2(OL(m{?zwU5E-RtZN2 zuZK2RD}NGX8FQEC((+yfSny;e8xA2GkwcpoM9n1_&hP=nFNd$hA$G{l(iX8>VA`Vg z$g4cc`uKj0Wp~nI3shw%w+RZCJa+!BI2)RB8)ji|Zt98w8HFiUB=hv&Dwos~_=++6 zG_Y2+{(6bhbf}xQXIJc}#Z~Y;p{A+Y$cQ8k)%NJ9V%x#UoExH%eRRsWOKIZ;3H#9A zH*;3NAANK1KoR>p`h1xKxvZ8q&qR9t*UNy1w#0T5 z>eBh0xMX3v@5JWI*8v++M-Z&rFgNlKA)krc|Kaqqu?MMUCW`w{`F~ETrxL$X?l%S` zm#fyrd%{5uxu_!O=5UUie1qb*;+ zlJ(L6$N0aB1pZYgIN-ko9$;9vJZgx!E=W_|_q=&62162)WKgKVgtfh2XlD1n2ij6T zd;?LVP4`M`)d1!D_v^exPB@;IuTvCw>--PAN(nPwjj|=SsK4(utbVu}L?bUTQZSSs z#RHzlnBe3r&#lh-$HOTflKW1)!58l&E(21uRgTa_ouLT2&xGqEuh=V2n~^^7h~`|; z|2Zc~?k~Xi``Ot?Gt%yRe;zFT;mX6t4uLsK+1nD;ovo0~NHbL2tL`;YRRvjG_f%s2 zsP+(g4%a0Um6$8XvX*lPAODq{T%)0;KANT!VFR(vd!b*Na%yXa7`mVMAeSq8T@BpIXT5F4M3Ra@KYLbUnk2h*9J-c>m!V8Qk;&#Q6 zW_hI$Ez;3r#fi!lTEr^o{S*=q)*i6w__>X#7ET3Q9I(; zRp!25Efaq=;}4Z$(G`=o)YU(J)l@#af`kc`mF4s19z6PE0XMJypa8~U+rC6z@CykE zb1_TOoQs*=6Lpb8htfjME$ZxdcfJxzO+q6U50BaIp%@n zy0UB-5;F1Z5EXSUouB{x_3M;Qf{MV5U+ZR(GhrhhXsj2N+w2yXuG$Ve+yT0csf#li zueIEfl1*~OAeFQl2Bui0jt@H>*A0{3VVRzf>7Q5tVeOSah5qmTzj*r!OS&uR>kjAp z%8XTM{jh+)<^SU~W8^GJCkxaDZ87E0a=Ue0zx#hW`}gwLzwk?`O~`+~)}3>0QZBzs z`r2*QP)0OY1+AmZTdzh+m78^zI<{XxUi-?09lZNjlqMc0NeBX5)gis)g{W5`k0vHzITPYnP&Y z@kB_pSy-&J2x(g>qdxhGkTe_1^;jH-Ci=oz?-GcRkP;9;vZvYT*uX~!lhhxQ5s!r+ ziUi@?V4aSXfcTlO9E>KU_w3Re01eO9BGQ1Fci**kt{PY^3u4UlrTQOe$a>EAR(Oo^ zySWYwP1def{~;+*rUG}thjBE!3X%OGqh^iiw@?HFZ>XRb)Sz->*nFfo{}1`c2IA}H zKNqCRe5oe)TkOPFsq`vg(0N7n-}-+2m+w0s7Arx=g1opt-wKYeVvilJmFhDErE!}? zqZ7Y$P|CxcGin=OghW6Gl$80cEao$rl4M__EXi7Fx7<3D8?pH<@NPPh82F6snTTyb z5ogzVUsOL6F)?`IzWHE;PgF174f%yDUvjeEVM?AX>PWUO$;K7bR{q*D90_uD=)^TN z?kIlv(EfGnfh=tI*6)`#ktHD>TjR9KjG|hi1De&RSIGFUBf9pV{N6iqiX`6C^HFU4 zH~!q4#FW=5z!%!q82od~V()AbspGnrm+dB(e6lP3P`qT>o`=n9=XWzPAgqFVHJ9RS zHb1JD8sDGe{Pix^@ALrD9{$J+1jnNFf04`np#zpebx=y!#wC+K^`>GnG~hosSnBhK zwE^MYUJeN!lyqzS&ZWgsZ`bTY+CG#|k5$`$c>WG4A^1m3Xu^QQ@%vdSTfwfU^eG=g z_d(?X=UBR)2Lj)!X-)n7qSy5m#CBt4+-_y|p^MF^xjvxOy~<)PaZrZv_ZnCPGVmdj zla52``5{aEQeyF|E6pXFHk)e^jCtFM+Bw;<8_mCOY4W@*KocO%_Bmk#)5^|7F;Lg>=N{*cTFt?xnCy5o^Hf2bBY;5aZWysn~4 zy)nWoIn-FNdAjyb0-WSG7Dse_m0#%3AvTTc3MR#pej6}fZc3~5m7sh4(uH41m23k4 z06Ha$#yTkcK_9}<RG-5s?7_d~o`XBE4Ic3dWVpAnfo9T37~n6=MOBh$T6AVgNu0b zI@k)dWWQWuvx3Eg|%5}kznjNlrazT{X5Bx>flNkBatP<~la^~KQ zzYg!+z!xQ^JCpkBjSoM~aWp3=chBL*z^HGB!f*3h%bWwaxX>l)=vkp00QvYl<-})pAO*OnS$^pxqe!8Zgo&MJNfUZ;F?!JtN!6W z`18`T+M_d75qpA5igs5Gi7K)e{eNnGKpXX!f*Mvjsz2ZZA|bX0KiPY7KCwEE`iqEf zIV@{T$*$&Kgw%VG*&Wv(Z_D_fl2Bfk_q`xf^Xd|`pXT2i2v8BclE8+&6S(ZmBEUtU zhS(s9GE3rMf~m;=8c6vs==q=wDnLqSqwDc+3wE}BgGftWaaD~y{ta@1Y`GLmthu(p zWBHqZ?2!+0OU?OD6LSBsKqgm62Gmk3c4y=LABnpw)+_X#6AIkM4@aFc+QYQ z^azAaq>#u@FMf%D_z4I2yVa$%Gx{ewi9Ul^eRPBV41i<=98sXH{kv*x@#nrKdJ4Yy z&CttdP$i9e1jY*Y3?a@S{_ur~Z*zgjjcmU7b8EET1ifQiepw~F=n{b_(N%D3JTgBE zRD?l7IFHqFaOnkjH%^XU>>Z zAnq(a=pPi(J$nMt|6kuv{gIvN&ll4w^!%q9cxXZtOnQx(uWITGnhb9wPHu0t3|-QL zzw^eERlG~7w>4I&sU<65)nA#e(qnPS&h`F(2>kLl2!h9T63rrVCg7A;ErKi=tUA&c z)^5$!>~`^Zhc*S%qWP+I4&kP>1j3xRSwUsvH?QoF&C978Ii+v_VI})Wv>)^Fbbf== zGDm>JKlW}BKmW6k^d4v@Q2{fyM}$rfIReZv0WX_vo>g|&T>UNz){L#~hv9~9qk4%C zWWil_J4a5}QbFBa0b+=JI`mCU9Ikm0kI$MLL{QfEV3FRp2E>T@?ufD&>*BW)rLN-{ ztmR9g{`IP-9iQlZ6HHszKxaWmPzDJcsgN++tt!dom3|#=DCMB93Q;h`Aa*XRQg!yT zzp(gx3#OLHc-PtI#WjVFhsn<5p;mTu9=XQwZ!UQJK+YNHYjg)Vn`F*SjbTH94EV_R52nK>7>o9|-`Sd2{PtX=_@%|y6z8l9 z0;`T%l!vRT(@qv~?>1B^Xhg7}|F{PDl5m52@;<*^y1H$}YgO|84x_@`{Dr{Rx23S;6D(x~s$fPE4}Xrg5N6(ZK~yofMx4-YV-4!ySkwJH7ss&G z+PcZnjf2-WCud?AAO2hWgC(f(5Ve`l$FkkS8HQiTv%j2khY4G7j2PBx3`Xy zXtcpUUQ2=}$2 z`J(UfLMYMokxp0 za1W9=bMZjg%&7`Ncv%nM)Gvo@oJ>{KZaNRY-AjMD(qSm8pRo_)*QU#)tm0x2sAyAV zbtnd>{q#WQwy9_`DEjNs^+Wqq?#EJuc0Pl&Ms$PUXbPQmm5m1z4Lp}Dlf(2}Y#K?H zlo+rBftY5}>nW`N1wQ}*amWjkv5$dEb?n-Ar91}$$i-4*v=QR#l~gUV(z7e-iWAWF z*PTAUf+b?gFIK+sT+XT6d%Ec>!uCNJe-yKfa<9|%%%hLxXuiZ8`$yWZWN6n#VZ2^$ zp8?9D-@2y!Lh37zbk-2+pkJhFtCG%qIu006E1&j%0zar#p0Pf2pm(xedNOo)?jki* z@f#*?>GVGfDSb-FSH1Riid)35MKqFBMBJd*bX~qS;DBQ6(nbz$6A!zOwT~VpbJP8b zLI9^zvJQe`c2VWY!0C}ADjlwr6s!cMgAv3o?ut?l=8bu%^{J!cOek4@ zMc?N%E|8j5`Qvd%pl5*Y=}74NU*UC%y2;EtDt<3}FU_WqBI;IH?X)zNs1a4s-fkB1 z*)7fAIj2ShzHk0Pv96OZXNiE$sxoD@~OhF{rT3MuF) zv$s;U``@eh+c_<#0~P7GkEAp4c)oF`l4}d-2d_DR7}Cl4y9+NH;)%5Cm%iaywhcm@ zsLSZ;XNmCe{Rkx70Hul3;yR*BqG&Sgl@{w`2SstQ_W>_J`k zU0KtWLf(DYE(JD5F;hVbH5Yr}JY%udxNV#U~wpol1xHH}txl(59}x z~?~BeV|1k#g{DK_qX*yrv)Cva>w>OVS{Gm zVq#{C#{;YAVDzzaGH;zs0mNR_eC$S%xpU*9tMwy1Af+bPm}c9f?doEEM_pM!9}b-e z7Y}CZI`s>jOJ<5Nx|DUEemr|$|E&eBok+LgKe@`hkz-QvO0lu*GSy_3g!%5kv&(L# zjjWuC^Y2|JDRHST-z!l}F3OFA$=NBb^rXMcPyPH=tJo`{nKeT3Pxs?7X~JE>@$vDR zk}mm`>=GNtnnE8BC%(vTk+93i1bDvS^8$oqcVWGi-p@8Qq=% z%0lTxH_)ZRWeW2zl}J|@JUWtUAuvG74C3`^cBPt)sZ!Fc^8{tu)+LRmZ;julNH2%u zR2p58K^|i~>|s7mq!S^h_QUMr(Xex~p~TvAuecymRbC6_$5g>JJB$qU*h}ie8sHKG zV^CC?(z4n@-kJ*X&f73`m>W`h5u!_je8u}qjDPuVKfL-y-^I$_u}x&bymZZS>zz*(gH3C+-NkZ$<-{wz{T7$?qz&pbDD&x53oYtN`og{KW)8uI z;hmjG{h}UKoPa8hRMda-qs_QLe_N|wS zwx*I_P6%Vf@GH7w0Si*JwY+94cumlDG@uJ(o6R@Aij?ty*k;FgtPl5}YzFb_$fZndJ(2ypk;rUrn{!`I(5#rbCxL6 z04cfn`!A)dqtwNGzp*ATz}AZjZFp(hq;%6P=n%Vsc#5>Td|U zAQ%W8p1IB(jdb#vkHW-E>{k)7Z5(O8$Oq_P%NCIAu-$#M5(Dt6v9e&5Y%gTn!S%er zE)Y^rWw}PKO)=#P#i&ng`cxEPI;J5FCsP=`M%=M#qw`d+JNSJ7oVT&(X#!gv4((Td zsCu5*nS>D7tftKzF6~`3x}oOnGcXW(s-A2J9+ZQPYtriaYwZ}tvrqSQeX8l}ro8rD#Z6DwH2eM;XRIdsKyuHA&xKN1z zub=#bBRy?M^X_9*g4_b}yr?^Wt<-GStu*HT5^*X{Y4+K9GIom&=9BFODYH{5Do^pH zQYs2$+?0XO%f{MaC6}^r!26kdW_cPvqOKsEQ-)J}gARktQkp7~KCjihrSVwd3EJ!% zjd&oyJX-x;^;3(t`e6fr%84o7`se%DWOAj=>@mBR2efI!weH;PQiAogv7?quhjw}` z!h~VP^^gn7lZNV+`X$KI6D!2V&T@rlG+#Gxs{{RY!9i_RU4}AGwpQpy7|cQ_2?hpj zd#PWt)LVC{N*Ks(z?c;DMeXs=W)@Yr_I8h!joi`1VP#~$qzDEFShm82F-QaRRPhp@ zbfR?8b~Z2cRpHxTVS~wcVvi2j?*?r+df%mKUkM7+*JEw6wdFqK=Dcf#P@(BkWfPbSEv`NrI#{zpV;fypM~(sl854q;U7N{*3d&=C zt>tz77lQbVOv?5IGfc7(b@3Ebx5Qv8Ni)DsLKnwZ1}t@(^}i%)IRL>Rv2lcw@wdAe zBJ1z!1XLoYPWwG~j+FYHtZsMnbn|x$5_F69)xhr);n4yk2>g94+NDc`iqJ_T9Z-xl zIJy;}i79{ZBLi1;3~P@H9eEl5jda2!%$BbRVg;Drasf>#>QifVROdcYZ6+>2Nd%+3 z`R;H>5@7Fw!5Xc*RR$p!b@Z5?a~_<>Vb>$--vtM6mMzu=>KELpgV+z1WxVe!sJr6W zo4n?^cUS#g1^1*@Cj71KZ)>T=$w!XmPhkQl7=aWBFJE7wLOd z)9qi>53m=!-0T9&j86dN&8O~L)cuFZtD%_)Zkx<5CP(;XWhvpEKIiS0w38SdIF>IZ z!TiwvpT2X4NW8}BJC;@2D^?)0vNWLFunDiScGVQk6PX;(=q{-(E8@_0UejlTDY>if zeTEAz1o3;KrbZbJ$9MV$(Uqk<5<~7vE#}sqHEC!7>aw0mB7XTC)4rO-1L0=I)mKL3 zS%_3H0d_m&#k6;B6e8aWQ#8LVr6AXXU*Hx0Tg#d^oJY63)imLh#*1`rlew&Q*B~)_ z>gtPc_eU~VW~0F3t(3QNWB94C+3Fm7a(je&kcUmSLGkpD2xhHL=+KbjM-QV$5@2bM z@RiSrEEPR7osW_sBbVLLXduz65RZdo4=4|1dqbxiv(K`Cf#*daUAH!Z3JMm5e?O^}gBai3&)O zk*gOgPrBNH(i^6N%RwC%s*Q2yv99#bumHONssfa zEi}mco~Pt^B?raJGs&LN@+OU~3vh1yPOVgiQy9{50pk5Bay24>iwcslLr?)B{; z%BaLr{m6(vAXoU;1$g+k2yN(7XFk(r$hF?;bvQ15O8Ih+V&65-IO5H1FQTZ%xB)AUlOig?l|rNDn^0#Kc|b z9-N$Flw`IFUN0|iF4K2wJSYLyDl9FlaEukn#^<6ZXqE?SoKnv?A0=0=sNiDcMNW9? zN-}Kt{T~bXpJcQCt##e@(>*Yr>s?tWKX_|PYMOc+w=@YP`GX-Hb28W=h08&08^dLp z9C7waA{$&>`W{`j>`4yy6;!j|NR8^Bj-#`>!^C8?D=GmI?efZ_fQEo*H@l$2MJ)R@ z<13DsUC!#1qhIa9W;K(pPfgetU?3v-H)&IdGIT3u_I|=sbGq=m%jYfc6p(q9dPKJw zy0|+O&y~=d7zIN)UVBOKKfeX-YuZ~0dOYATd!GZus*`2o_+y#y>cdm zl6HtR`$z7jep{e?I`^)7-LR@$nn@CVqOx{8D*LQyLRsj(>qKAJ-;Q*SucH_kv1k|zFf&DDOZz)$vf4%QoXjg~ zC%j2j#~)-b^n^6J%P13s3og$Wze@D$sg-fs2W*(@Lzy=yZCjBUb{D5_Ws_9AEzg|f8irj z8Tz41-d{6r$cy+_ULqf#e=P0aCgKmODk{^jGY-KXnw!foE1upZxsyr1Asa%P}RIPlaFFP_2q?ZraXBum_D zO}E<}lDZ|WEoY2^lpVqigv@LJj-hu{=2%Z%OmvnGVCa1|`>AOL8tV-m0NvTqY+ysu z_3bp^ogTu*%1^so*;|?r0+zZJvdRl7CjEY44iEo%N=75{Db(u#p$=pft>GfX&f|Hx zbdrH5^v~bl46n|F>F?PYGfzsk+?6)Mlk@cPO!BOwV&A0;H79)1OL@M$X1SDC7KWs; z9q$MW;;1h>(>JHIOd9UF>?@GxyGRXDF|JCaNyFSA8$tQ&lf9*&`|t0oO_TJh>VtV% z0_uA%U{zd+J4Gwujf^;$H}#YcsOAJ$p-OwPado1fvn4NcvGfZR$T(?m6fg%531rHU zdpFcfy=>nfH(Q4@g@@{HK=<3Ljmpi!0sGCwRlQ3un9q?;1F|o)ir^VeL?X|G6TnnY zDi|E@f41?r(%r8H(VRq904eWTk-hUtd+wCBxJ!Q(%-Nopv*3r?8xca@WCCv8>3m~_ z<3nVh?6C`lbTcL+(6WwqwsH6ERQFIH{%&}nM`ueP&hXHnF;AAa)_Cgc%uFEeC?OCI zyIt$Kl=2B(8vQGPO{oB_^7cNjU=X;DQr`YxbYEE-aOh=wo^%k0D5bpWinzPr3DEL( zA33;8?Dku!L_;Jt9xjwrD{Wm%@BR3N0XrnD)Ie=?T{SBbEbMj%#gFa%lM2=r|AT%? zpxk6gmDnL<*Zh=cQDO1}tlEBUq=!y&!zOeH>fYQH4Jq3Fc3`C+9W#hx0-&)=w}UQ0 z3Umh5@FzpF{@QnPu4g@S^#1r}8Z!d}ok6F?)@zQ(KRCL1bQfE9#ldqQ+*O^= z?CQ*>pNQwe8bBCq=9=xMWi@JB_}nx>9iO0$-(fYHO7}$fMvDM0HqwuY|1piuB9qSP zU0p2k3cZ#IDvyeYk=}7Xvk!@oeB5odY7R3^0KXvA_)%VE)ABq!l5_OU3#T=fb=Tb9 zH!lKBM0)eRYfA&aEyO(a57rMrGj&pbwM%9jKbQyK8q3FdyGT2!44MuwdfNyk?l)UW z%?WEtx~dI^B43~D=^#yx`}phhptJeR_>%HTZm;aYaBZ<<*<=-a+2jZKdeKSP(6gcp zXIZtB!>lT;=#Px<>uZLXP0gr`5$|WtPoT3OVtp_Jv2M*DfU7?q**{`bOmKSQ%y6>Z zU^WhsG+Q9jX$g~5srh7c6*hK`9}_3ykkc@zQ$_4c65rE7J11}&y(zutqHb|3jfs=k zOSV#}KVh zOZ7s$?kerVsq zRF`eOofcqJz5HQze7JzSZtBJFzzfU$zJaTA>C|(xuX3gNYDJ~gm_5d8uOtI7$nDYT zcajrII&HgJSb1}WLKVOf=bd|Y%Iiujx?bWd=D}uTTv~5Oou?NWvz~S?8ry|-A|`I= zYrTv~3NxKjkl5P#db;w6E@cSncEA@7Gne1gyKzmZvBNo|Dc3o(B_vZd9E0M53B3_n zpXb{C$DWzd7O~@zi^&x3?KhGpXOB%X{Lg#=V0Y#|i?q%ss_Sv}(`|QnwJgcS92&-m zh>n?RaIZtPkIfyTlMDtkfOc&Nru=l~^XV##Q!d3D-<=l=yOm)2)?uZXo$r*MHNiCY zz-t$bbB#{axg4Audkjlny*orALPtt0mQU=?30Bu{zt8z$_edL`sGLiX4Ir0=Y>mNi zi4Br1$@(?PgYMV<$M>7zOEaQOt8U>KCiRD}jT<-_lIJ~vp*YQkUWPXg414pggjW{w zzcktjJgH!v6j<7xcia!-4|OhKO<0RC{2G347X&;B77e6$)G((-?Bt^*QwTw(({f=) zU{%q*WxX3As&g`zRiJWsU~W|;Omq9I^mc$IR{K0EeX&#w&$l5(augWO?5DnSKEcxg*A^ zjSRB#9D1nbS^?YKRA)6U$#qaIwoh=?!{MOK&Qr5d*Zl6 z(tIJEq9qLaA|P@5!`zG6Mx3-n#>bI+Yjtkt2`I=Bkw^Nf8_^0f-xM%#jcN3VM_A&s#)ME7_$uh~Fe0cuIk_a!Mmv{{RpD)um!6!P| zJ{FtrreJVlGt8STS|kf^;-#Hn**k8e3DapX++?g z&t9@+QMSlQ<~ZVp25!HOnxzm&Ad>g)a0;n7Uv3Sz5k}#-WzhU=YCaZO(z(q1zEzmO zB?QlGW0QRHOi?tI>|x6udOrUXy7=63r>IZ&LfMC;H4NtB?1N+7J+>if&l5J&c55eq zJ@KaSDirR2D_vFuUS)Zqi7KaDBEVkb$j)|Va~INE#LMj!qa&@buyC)#nxNSj7$g_V z99li`L~*8Vyypx(Jd9Y2#kQX;p6-I>t{qS1u^sQ7nw{evsa@~gn)A%qx0O?1^$nfl zvSa}HC~y|FR_v!%&wUD)y1}^mO#04o!QZ=I^BjlU;Vm$GV>$>0+~?tE9}5@*7S)jE zmaTl7%uVLk&LeOmt5BJM%#2gwpZKvA)2@+^UX}dYp%iY0ee#d1-;#JmwrYFH^XiPO z)J{H9W8x2rDZI5`<|UbftS0X@qWY15g!2!JJIEF3#!)+NHVu8+?KN4I;prMSdTibc zPv^#N*?xQff^)>llOFH1H;IaVhI=fvy(y->hLnjcJ!0b1{YUD!WEQ#vEmzih`6%>P zEcCiwkJLrxaCKz6v%Ilcg(3uE43&4egKPRyRRD>j=~RaTwjJI}m+#IQmMisFZU)9@ zIV%q;n=W}9$jG3he#%n0f9G&l>R(BM#lC-cyKgIxhG?xw*kQH&V|*8>DJrzVSGE}3 zLiVyAkBJtk&0MtpY}wLO6!&B1Ve*;NNvJi^%-tyG+k~Tsi7CNar8Ky|Ps;;C!!N<6jvc1A zmoC+Y=gslIN4`yJ5MhK+p>Y{|N3V_^HNHvH+W$nRvT6Q1AWE)pOJLJE7McCQ#=n|$ zmw#3}%M6&Nz}=elrB~)0y2n0CxEUt4H$U6r>Pq~O7G88-do}3*JGBZ}d&CG>B9WGe z@A5Jil1A-oO4`nYUl{UJ55olGgfpaYX}yju6shZ&_O!W;WTm}JnmW}Pd^f@X9SP*E z-mQOV6;xq!Uor=3tzApfi^>ggN6UcE@u?>B=3nQ6eaGX_ldz=N@NqVLAA&Gfp4eTC z?yWScx44NTTb>%F=HWMF)VH5tQa(QUq&Z$_+0^REpTKC#2i$SXzhih}adT;m8QTFp zTGQK#mu_#D#h_ZuPH>mK-5@|ni}){FP5nIOknu<%sR*bHeUUC~(RB1z|6eFH@$$Nh4mnC^jL%T2nZH2go(_MFTTGy$XX2{` z?5Cb0uR69VQmOkqS7_hs!=BEnG!RXxFhkB2_m^)k$$a7C)$l3WJlWH6E3u7KD+$Q} z6C<%%$|vOQLP?lDuurhd-s>jMO5lvl_XTy7!QbI*LAu)^CkQrD}l zE>HMROiX7n$ug;+5sVV8A#TsUd;?p42 zUNF85I}LA0&9E>T$;c?Exb?>BQ237%OY*{={%qd$pR@& zu}*3oUEsHO%52U28rbv3MK;G`5C(3eFE9A0?*YtyJOg%mSdBX$MQn#ligj5-29S=! zWX9MaDYq`bu#_-XWGjk*0IJZ`K(}%pJp5Eo#h&9A0HoGMj>%ljjLKs zsmBgqeg!kLI28VqoDwp;_x9Bah0M#wrEb>v7&2UyJ4$c6eYs*+xz}OV zIc?@gEl=>&5%43gb|(IS9&trlawyz`!R?%I8S9PTuNHUZaxvQbb3t{jSnYT^MFO7Xf5{}5x=+VU_0_(`&2JRy5^}X6UN!^>Pos-Fw%F= zb@BBhP|VZdVPoKNf_7ll7WoBn|9~3+tGw&|002_Ru1oq3@lwgE;e{-7O)f>C@V=2v z8F)d3A(dD-j3UG>Ge8O2_mPYuVlm)xLdKr-^*H8yyEskh;uTo2m)GsRoJ}?RMJ~-5 zk5%)t^ey}KZvILfJmNn}^&I~;MJ$-IWjIKS*v^#G%jQnr%wBhslFZX10!gb<{nc)_7_iomW)UsMrfK?VP0 zK?T?Y3>!jazbc)?l*=@+u0GrMW>*mit}&f-(TCR9n_J77LruN~2?^ZB*`3ZbtEpd+(mW?4RgnPi6^YQwpGpAEFEt>u4RE2|7`>1NMARzN|^PsFb+oj0mjdW=~D4Bh4z zf)F9iQN|Ox3yZOq3aXv;L~9sk!Ldzg6z{`C^hs`kS0@Cinl7Y8r+V(8f!Fo732bfz z%QhCC9PIt&Th@)Am{66v9&uo0^x;&jr(kekNCB*8EE^&&%`+%54KiMl0nZEK%8&DmuRV5g$?9o^`#w+ z0+~eS{T0rE5C3CZag@o`DT_Ng8vhW{&7&*ONzR_0$G)$TTGytkob60h>Hqrquy(*B z)Z88;jiq2qI*spBUL*}f99e+en}bRD=qcxUKwqM7*H48%ykfsCg4rCbfBbS$FR32R zzz-4-AefmP^n{X*-abPuUe*-FZq+iW4Zn@fa_Xc_Jvn12HSZnVJQwKe`s-vuOdqDQ zv(~HS3>6wC_K04y<#9mzf8CdW_$t`iA-y6KOu9x_0>qWtB8DId?y%$z8Ly_U_6)5}w;Xu(s1NBsQsI?4vv{mJ_aPGN;IwH;eWV63;&0raK)K(`{X z4~+?%z8h8E_`5EkP5aGG?asHB@H;$A?l*1#_9{G``YmWLK&-S9G;YTdMX&$a*k|Y$17GJk(2>| zgQ?Wk6cEsYxxq<{hSH`>*iybGy^V9$wdcM z8J~Sas&HAoq)Lfjtqzbfx_#}(Ok9~Qj>jfGqvZpww@Y|`DHu9WtwZe!-~0mG>v}P= z4ruEd7_>1`_#8$!%JhR@lRnyN7TefWRyqmUBf|f~L=b}(KU;HoCA9Fy3<+EAKBq`>h0fuOh;$WRYd%-n-9Z&Z9g@a|ytx$R$9@J=s& z<54-}wjCX=`#F(f&7M8`j%8LE$ZB+#k-8V`E$fObz{Wg1d9EJy3FOGl-P90tL68|q zipG;eLTG?eZVAy0Q5EY3(vB(zC5EF2`BWdBm$KZR^@@VCh3HJ#XP0_cGSWrOX{^bR zjwTFyF?$EOtYbmw{2<=pjPgk9bGyub<;z-i3zh0OwP+THDNpD&!LwVJCa!}cJOcO# ztY%{~tI=2_aDi3)a}nYN`N$c&^>yb^OA9VHQ@UU?Z*5!!MFgA8X_tC9p_>n#Y#C2>>hmQ@oh-mu8_$0HgQ|P@ z?B&~t@Or*yACfq795WbgBkGrOAY_6+gUMfgut8#j`^$+nE>fx29mZhhK;+?8Yld8d zr6lsh)v@lZJrRc07QUOe0Dkq<>Xey~9TE`6z>#pdQK+h{A7ECa*pXWwz&A$so2{CF za~4Tqnx0{+GY$Pf0X~DnH?yDPAfg{1sC(c}00^ZzYWT6X??mRo2CuaypzQdxa_;qB z&4%J?LcYOQk$YB$9jOl3p;~q(o!8ZUg3u+sN8eRT^!DS8EJMq`K1orGJZ;_(Zru@P z-69W~NFqJU`+=fsdm%gDkqd@hog1t&*x3=wWKt67czVaRL3fI_HmqX}Bl7OAKc|Jx zYyQWd#AwmExTMu}&&PuB21zE@$5OQ)v# zieW@NyzE&uhYa3?g5g8R`34a7qV30e)rjjHar9oeTn*`U%VsR(;#MXWo*$f+2&VqV zR!0?anJ-xhmKT;5Bg?~?#|zX|>l@yTSQ@u)t#&=JO(uLZ5`dNQAmZQ;8XHu!@rm3M zJXiNp=JEljRKyER28)yRKo5Ib-e%iM5?x&U&LVW4XlO#!Vr!ywusu1$Q^4o~(|!Dv zV$r_)0y`v7l${yKKk+Ol3j~gO3Ha+{6U4VRHZW#N8km=|s#oehM%ErG&fS4N6{IRb zNAvIIu5WY2_l)l@?y8*0_wCikAKuloy+mJO~6uYc_Hg>zO;({19xNe`z|f zb4P5z<=*OU;_Ui-`*EmcxWaDxZn*dMp%OJbF6BS3AX@||lgJHSW<|-J{q8lw`2w23 z)#mM2sSkdrF`}Ly>BCj_ECSO|!jd6PD8V+I9!&e&gWe5k?Oy{@7>6E8nlbN1n$n3M zpWRv`#>@PLTc-*lBSk;{h3GCGCtL%t3@IrSckWLA?!y{p=D z?0k<>#p1EX3F>nm;K5uIjrPEZGa?G_waA9>+jV z0+NjPKQBrV)S&wFu#{)&@m_O;G`{^Ytq9L71HERThtV{9Nl+Fnf<>uLiTP_!5&}8UD@p0DLHA*gRoXQT!#$%=dNvf( z>_%ZHK550Y|3mfy<45rF3b>EbrXA2w3bQ{V0%ZkO3qdKtK~pH|5ApM14%&pd-hk&{^{h` z>ic9}{gwgoRYw>#Q3r(Huu-&8DWzwEQ5hIvqNo=1aZfEzUX+Og!E!LW@1-$J;%{;h zo#Iv!ldyvrK8v*N!BmyC~+HM^+<>%XURpVkLa8HGTX;M&t{T5cf@<&*n($Vuu-v;3SSPs=#9 zFR^px0V)hopn(!M;&PU|_SY-0l?S;DG$9iSk2I+lU&h{SWE7m$Ft5H$l=y9!|A@U3 zYS2sKf6V{lt?}yfib!GHopNTWZp%=kQQ@lt>L{<3vjw5WZo6kqp}T|NC1ac2i`Fw6 znjr~)3-&<4VBXb-WpX?fUqryYuzo}BB)W5^3RL4U)_ zow-<=mwEH9$o=_gbBs4fT?$%0&p`!cao!k6}rV9^!fU6ayrxngqe*_VD|2tv;+K znx|esOEX#yEjEJdrp}<>+Z!FynVM}JV4uJ3Ffe>NdUob)2QDC-XCVI%`kW$}rlBH* z3NY+p?G-WbPzd8+Rbp0m^U%I_wW!2ZFFuQ*e&$G0%v?bWc~0T{EK-!TQc($FH$djy zRF{<0#3)iY#>6xF+sc4{LCqVPL zggK{D;AabeiCIF~0nXjGmRr;7+6N2*nl~ux_gfNeQ3Lu|WPc&#KkxTZ9c}hL1<2P@ z-A(9*HMBfPiWMgWOL3(=FQSTR&8J3oB)eC!fa+3BbBRW$?TNYIvf0_kBbi4;^(D_W zOy1>F8H?ZJ$S>lOd~dFli(jl)a?eaZfzUmptb5?a-VCt<{fa6ab z6T6REKU$aej5XPr>x785jOb;$XkzN%Jd*yEo*DBB!P)kh$VSDtFI(?v#N|KB#c32) zYwxU-5!hmlO+8y7lWpYPww3MVHGYR`wyjI+%a7F4GnYZQtpHsKT9AT%X}UqJIEgiQ z?|vxaE_^6XV(vQdsEvLwanI=v=&foCp5FsJn4bK$F&s|>yivg+`+4p?X(+PDnM0;U znro8F0K`5j>?TY{UH!>P`VZUWiB-9ix$LnD>)SR_-hJ&(?zL;89%6#TeD~beSG({6 z3ef9~A1*Y%{rgWZ?_&n3h@%Jz>u3$F{`ex0mU*NCAek<3tyl^3u6yp^miPIcw_RPh zK!tJ!)c3UlpOk#ks~gq^4dH-@vpXc`AAz1<4t)Q@W=at>uBJ&OS!DWE^C625uSi-0 zQAnCc4ToS%P!o7`x6lx{e1}(r0?v+Ejd>(`kAubDH`bDr(ecjo%Y7RviD0&I0o45- zKmuK!rNLDdDT?k8XpN|U`Ouzj?9betN9*o`8L@~(n^}2ADlPD?jgBnBFk0se!;sFY zh+5<aQ{ zvX^F~w%rA!!i&Gc^UeCuYjMlj`gf?dW398XCTk~$lWpH~e0rtfA{>_mTIRA}FKkc4 zf26RzE|l(BPT6yxQ(be%|L8!xHZ$Vp)WU1=W|m_iF%h) z0GndFjtK)6?`?M$&ayJ!5R@~F-K;J@i@%p+ym7OBtFQy5r06jJ8^P@rGjB(wWWFT- zfE^%rJT36!t+jd^wPn~Rj>I=$zoCtu^RUULJpTLFeB6nGc?6TSLaK_|aI%6MTe4G; z=lQ|D0S2hsF~ILf2Qh`c6H zYumBj*moH90*H)XKaJGL`?%(#tPcI>32{ge_$B4IURU8#3Wi-3m##x5k?>SW#>14$ zgZytxVI0s}Vi6v@FlZ+Mq+hg*lOR%A=Nn$Ma_6*Z?IE&3?~7+P59TZTfXlqU*$$;Y zT2Pzm?u8vWfMP|f)`75?XfNQ;V+aXVFkB=r3O4&<--~CbSuTCGC8`o_b1TuVSg@}Z z@kfYINdvff51sL9G1l6vIH0%ZpZ%lG#N?@Bwwb zPxBLOO(dxX{P?gT<(eE;))1@9%td6h`yt*;x-%CaUGY%T%+q-%NF&kRN&8Gakoiv0 z@iFPBwF=Yc>1f^h=?9U3`CcIx#-Xoq>jIYgJF+>Z4AEbR+x*`4J7*?D^EvqV&!a)B zgXipO%(ziVF-p98>thG?bG~&Y-f#X_89}(zMk2)T?P6-s)x+OEClix)IPS*%N)F?q zIciu~6El2nF!?5hU#oNCo>_{kKw9m4^epuY^l_@yyl!r zzoF7inG3q8pQQTpX}L^3Pt2YPk?AX1L4ENo1CT!kzM|e+CuM#aCae4q$W2$mPS&i> zK1d_rVzCszqI*lmA8T5hiu&ghqS~H9GQXJ?^w68N-exC%ig~SG!(~h6di36cv@TrJ(IEMgD%4t9)r_Q%-y2sL zvEfMO*cqRQ{`E+3Xs~o|T4x&I!@vdEuxT2Z#&Q{1h8aYqK|>Tv`R%2cGzl&O+1K4b z8p~U=-2RJXg6JNR%gm@QXm-&|vA*S?#0mh3d zpIk$;!!Nhp!_R;*=};BL-4WbZNL=x95<2wk`}F$Er2iODvtxGCMAlDHCk8!tX{1Ja zyqWU~j#(sypwU)lZQxqZQ4|Tojl?<27txC4vGm}7 zgHTo6S|6F3lG~;e?vUz4-4!=9s5=tjKl`zq??X_N$u-Qg1#3&s6N%`h3a8$a1=tO^N9%T#v@Wu*2t zT;cQxf`!S96V%N9FW;0AXn?;0sc5<=r*D!yLRY*M0!QK&QzN=>2O=q?)}(>Jd{aG{ zH(CrlNU-himB*Ue9|)8sE~yfrHw&SL{f~B?;h-NrC|{yarMKME%Mcp2btU+fRrvKD zB#JOQ%JRK=qJY-Zal?2xid!$(CXYXwU4#rE&KZd+i(wW#MIbHj4lUcXaok-WR-F#O zs(xgzINjh>pCWu2<@*0LCJ}=Afrii2*gzUhK@5pE#!;mgTu!9=IJ^I6^Y>nQ>v=)* z`$}GArE5ukPYzd*S>bT_=#lgxQ)`@*zUtBxw|Q)eyjA3#4`c(-iEUz+1melI0z~zj zSK-rqw~vim%j=5CCUnr$ZB;P1Mvau7f18|J(ScSwJb!TYVMEG**hq6>P0=;4(oiG0@2fkQIuD| zqMd((ofWjs{j=?X9l7t>fa>g5&vCxVBWoFoQR)W!2a|@ZQ6^jbMM8lMwF0FTxz7#k zwG2ihGUZSqF)K=k<-T8cRbsZa&DFvY-ka3+SwHk#2t6s*))BZ{4|{o zzek$rDuwskj~9O9e;bn_Zss>S1%pB@k9J?=WEay7VEFyi@m3L|$|~MaS5n+KV|6q~ zOs>-7!~xjqV^WXO=9)c-)A9 zYH!&<`1g3DOY$|Sc%l!_+eT6!FMWNN&UN=1 zk@CvJJK}qIli#h7(^a#rT@$kY%ZB_sIx!|xt=DqV4i^p;2^2H7&a){ASvNJG?X10u z=RYvv1R}j-D6;%4T4R!N4&d`CpR<$Vt)Y+=1eIHTRvWq==UlMHI?8$dEj~&1cT50U zX(l8HvE8ruNwCqwsi8~$&!Y#Y>bsW`m^4HGg>c{x*~%bVt#c}cknc7fDJhCk$40Mn z#~h=w3|Q3^HM`w$snHgN1AY&~I}(T-r3CPSMQM;C2Hp4Rr%0~j{K0V4l=a12{m%0p zDo0i_HDaP0mt9+>91bVJ#rLq!uBv{;?5}at3 zI_09$DIrxWd-1569V$WbuOwmdVm9n{>#kka8jOoQ9|FUUVrCnU_cqCFA3g;*M5>cC zO75j!eVk%wpsqe-lKktL#Sq@o8uT(s?4HGc;?do?#_QC5Ry=e%6K-eiMlJKmlol5r zBF|lHlHo|oF<6g%`e8D!gAk&zdp0jMvPal9T_D~t^0#!L(v$%ZYbdW-?E`e5rkpC3 zYoHW5!BO%!mcRbbKt^|tkfmb9P=@T8LinSwNdpJu2Bm?Fe{jQG=N&f0?axnh=MEx}1tK5=fGO=S7j*k4HzI!FZ>>Q~!>&0WY{!g}u znnj-z=yl0Fqr-;^zJT^Oh}VkkaRzRwB1HTk#sjgoz-fQ>xd@gD=~nnx5W&(5J+^QW z$8GlR!fji3C@#7_u7wNHu3xYHC4keC$=L3e7)h}gc$c8K?gCzf4ll$Q9LD|&owfC z;`IXG1ExO7-Ni|wMwbU)%9zpggFpUl(-J=&B-Q5(zBE>?3b+`@*dXQ>4K3AO_ep8L zVR~v=R&@F9uS}TUEp9uBU@#uc` z4RKBMx=64S1F7#MN+e?WwG>*+OuHQWf8o_X&jpofGm<=&jO@@T5jRKyw9fMCzS-?L zI<}OHkOpLv^O^_lB2i}Ume0KUIRARSUm=~))h08Y;%@*2#p})QGyFB6!)Sw~tl&5X zdctC@AISfIQjzz5AsiSFh@b4T5*^@A=c=lcq4fr*6*KV-Te0#qABfqK6;N5 zOsJ-yUtbJ}BHk3PL$E$|^wfGFHC?ghkY4_+_cD}jNF1v#P`X!)6$QO zF*8=?%)oZI2S`&+96haZva_z@`K`U6Y_|>D!u-1~C`2(GYagz?PuAo^#iqu~a%hsa zcy~7OVWVw3)+dJ*A)@gEJ(&YL+nKspwxR$>n5pz{%=rg~g>WlY-hFZ%HtNW7ZPu?A zIVG!Z^$^UNAi|Y{&kwPoK6{Z4Ai9!=DWp@lM*M$nT@0ZMsf4)eD;M)dm)Ek!I_+Pu z5JU^_&Ln93B3Rkr_WDAr!Lg7B5^P32q=Vl2AX!E|oMLGf$GLwGsz+K^=CquBeD$yoT_Vf+ziIfYO(F z`QdTQFOLm}<|k*cYVXZ#r^Zvwi2r~*h@qWL$d__G1S=O5yEhlBKmYVE^9J83(@_BvrY1;ywL%9~jj$)P zfT+hew#b3+&`e5| z+O~58J?5*feX@!Ol0PiyU6yO$&B~CI&)(A!4kZ8kt+N%yU_?^2hprAo)hZY2`@uoF z^+c1T_>bsp`VdI%NcVR{;qzzV!bA&z=$1RH-gI=cl`y=q-q5B8Ck?_)Y9MSdh zYvSqHKgC3toSlyW(zy~v7}gPPxVM99=2QKQw+==P zUSIxBR*0p7$pN|n8=36;-J(T`dT(B4WQC&AKJVnY3AQp>x>fP?@R#vy+xJDn^%HY& z-~^XFl82EA5`cTdP&T)Ktw6^W8^WiWFNKg&$QVdprb^pd;Gx#)fLW))8!NlhpGSj( z<%7?tag1)04&K6MSCpqaDH}+v?7D+%EZQuL)OUXW{WsH3?QO($a2rX{t@2KRAyG%7 zZS8BY7VBD>KbUcg)X>=YsQw^u$=SM}`Q+$Wx1kmQ4Avt9MoP-VsLLayoYCe@yQ1eg zQ{NIxcYJ#5n0)f`R0#8fpaw|)e}$4Vh6o<{%8Mx(Ftx#CQT& z)7zWiAfJ{kr+^gb;nY7O(&FFh}v~ zprn7J_er9j2;6d)^Wp7jk}!qo;7F#R2_lUc@bB>yDtYf67v3V#oL*O9_i?0&ot7wQ zU0#seYA5}lb*j*U)~S9#=e+DZ`$m)ENpO($wIuyZJX7Kj>s%Y5l;|F*E=CaBlWg@) zZbzq}6~Sj8FCsv)V*qQ@G|O4z<>od#So)m2AeDa5)g>hiFw%8j>aET`2*- zJtWvu{f}Lg5+A?3dU%!dqn{!R#>4wKIy^+c*fiyP*XmspyvzDkTMUX1cR9R{i0X#% z!Vxdv^AbS0wQv5SsbWc^9T^!Rn%Qey4kx96W;gPeyHlZV`|Rpt)@*%+koLux#NIng z^r6yt{13amS)&QZvGF_f?rJs6Bh~&#q<(?XA1!$$_`1IIrDIpEJk z_X3fz)&Uy%$j>?Zft)cd&XS&F>kk!FlLmGo|NTpvD1)DRTtPx$+i?gLCf)@ zQ0^T_?EWfOf)S~tcj(b+?3+D}O&3J@6wh?k>CR2b{?JpftAYp_Ft9hFyqX@QKAM^D zh)GDMc>8jW16ZUK3M&cBxLha3P#g3=^&mP1ae(;2`_Mn+<(?!c$+w@nzp&Fpxw~MM zn71dGtqu-`F9uEE|AFKvu>vID*3bS^=wIJ6!3Qrav9c6Sedu~>rS>y)%XfJI4laNi z`@^!KM=GMhe8}AcIvF(o!ZA1DM>G-$x+*Y|JAN)MF0;WVRGZzFD;t=O-H6t*sPE0V zEA7>ws}#a5lCLmDdphHtlgqy%MKDDIcPfuE*1MigzUmL5Z3a3`mLDaf$%M)0myL(1 zG5PawMymNfie2ZxYy^COStP3)nrnCU8Y~xe$+p5t3ti2*aV-9EzDWJQOq>TaaYSAG zy^gKT`(hw`N_Kg?4~d9=Q|j_yR%f1PTM-&zO6rP#Xj?9J`uWb^GsexehUP*!)xzsk zw%g(;4h$Fjq2=gxWpQ^LCWM&zLWGAN=P5#f^z8K9k@L}Sg7q_nAO}iT<@47r@Vz&Ha4tX`*a}K`i=tNw#={}{BK89Ngw&(E!vUA*zRy!XfXD6X4C-b+bZ;R`)VTm}y!u^`au-Pay@rduKw#NA{0Qe29K(?ekY@?g+`N>Wy}*@XxQ#XxDd&OCbgGqwc-2lt_ND`-gSehZ8XO$|;|YmeqOp!5Y{H*G>Aj zjS09zz-sU3$Jq<|%Ob03@FpfCYeT{Qbv6VJ!&EgU%y>)mFOFYC1}_1DlpVv zNz<>sUPf@y?(2A}W95V|`$Km{|3u($ufXr9+TDR^g;WdD<_{S~eRRKFA?Of;pz!F{*{Hm6V0t{bbs|qm(gRJ>iaHgx!12I0<-L4@ z5lEQe5lDz*gREerE0!D-Ayyv2`$EKM_f1sH^z_JV0B}jPqTNwd#?5_ZW(#h8q|(y% zrplScpZwBi2I_E6D)f23Jm>G6ra1KisMo7WuT;hD)VQV+6=#(|4$y@Z=JMQHtX*dL zF#1?Y;69ssx!1vMd$859{TIQTDp5oso7t+n#8o6y^47cLSAW!qO&vf|ePgeGm2&nF zS~oEgb+kihz$o0tCOWKSYmA?KXP1gQoybt_DNwzd(0&n@66JhD-*b0>Ws-gb*eQr& z$|zT)WsbVMoZ;|F3ha|!ec4a(gHvZ&ZSnhc_cGOtk>Md}&k^OIKgg`4|DRczL1b2) z-Q0nek8pz8LX*1-s4`q6?h%*YD10$R8!7!%nZ*Av7aAOSu!o>C#wq3uKVm{EyYpPS z4k84thb+oh=X9(ikZi~gc=jiyl}lE#<4y*-^o$erb|u^!l!cq9v!$?UKG9ILa{w2n zXV=tlL$#*fB7L!^o7l^Pz<&ay#OWvnw^N=A@@jHPNc<|1fa_37^qU{P%J8fuSfrao z<~4<^Y#LRKF(NoKiX^iw$Kk>FNDHF}wajLQyUx5r;<{WB4>WAyHCnB79U6Lx!sJK( z(&8c7sJ_snu%3_3UcLkPcN|}Qxf@aW=U-r5`CSA67tu})&gD-=Y$N@OH%FpU2vp>{ zROZ#7QEMvuBLXY>S6LzGM;Q2+t3p~B-TpI5Oz2-+OmsO!i1WiVyO@`;C3SNmRnAfA z7x6Kwl(oRPaje8JV7B*&dJyv4eS?^?DQ5r`pu>v^GS9{!9_(`cH!wXGkL=TO* z32z!bG*=Tnvz6#l(^8!iWSRE}Hdz)OFu|V;Bjv{>kCYB&qfrT<3C285J;95dZ`^Cy zx;n>R_t=|juKy9Q1MC;SxIyQgbD=J4xwJ4bHN`4mE;OMFib^ZDz80PI{+K5&`6|jb zyd6pR)9O+vE05&&7c2Cu?uwJLQcUMom)~4a_fpAHZo}R84!VqP5jOziIQ#PoWpd$4 zWrqU+FV85_`EPeu`STb##?aY}Qk}Yoid0q^EcHpk?zN|9{Q!tzqgN4RPR91yRCNslSMid|!;QPcSN(SDmUB>l0#%DX?`ojCtJ0;_{1w7hZbn=(CGXN>o>HI9@m9O5^^ zHR0oL67?%F@<6p>Kvx8rpm+RItK9U+cpJMte2J?M6@Fl_ zka^o&zbG5BUl6g9{P)6;qgI|lCKCdPlE+I z1RQ@RSN`q)f-ye8V)Z`0GXHJ!2N*A(2U8?0wy<)*7oMv z70W&!=cHbRm>nO1%RNsHDQ&UsFk(XjO?|Ek44K8YZY}Fn<{T}ez;?l4438RFD_(UX~#Dt1f1W9l5Ze*VJ zP)8#5zcMw#Jzq-dBt3f?;WoWij`{LzI|V5wpbd;!LmUS9QFR9RU z*zpo!g4v22u(n;)R3mHTr;W_tM75MdFT?E`r&2v;e0-S0li^Dg*|Nf~`z63Y69~da zu)biot23?wKaBh-A=IW)=@Omv@kL60GrT_S zg9EM|U(Er*WH;4UoK`v5hpc6K(?A?$Z&Es@yjuhv0xnh5=Ok>)T^X%+PkW07sI7M| z$<{sYltE*SjB*F@1uQy_jo%`5pXVqx9u-A`)+5MhYRo~_L&O=gRG&o`2?aAJAOJ!wqYU#ggfPJXv=r&&0%M{Dtu6w0(R9@3h zW4EwU_P6PjWJ!|tsqW}(KYG>`KW(SEU2U$PJhCQ1v!*HfJDIdo+@hO=U`sz=4o}s2l3+)(aKU1sI*G8qiV8 zhY@8zW8K5I`mp9}teqgC(|zYdXR`rFU@M;Pp<10M>MX^cGt0@6&G+RAUc_0_V%9a4*&-9%1> z$8k>BKOp{L%alI1Xj)gSpKxi|*btz#5S5VD(Py@Mkjm}J-Hi9a`g8*#_rRFd+&2~Q zMtJLJwv@c>QR-QWjjz}}&-LV6Jon=m#rXr-l~nMSD=|XI#khRDCAxLY52da(AsVA$ zY~WlXj6#&W_4cHE$Po8%&iS~EQkf%A0Hkvlj^?vF_H5X zR=V3}p&vn0N=d84tLdjhihY1rze_LUb927X?-U=H zA+4v&WF1Hma^)ziUqV+`SMNM==^)lUYe@KZIL@iAPI$Dg4*g`$a!qw;GwmC;yazYz z(6M1;@G`C^*L^nB%=KL8`@Bk6JfIg=HkjdGSL|u9^Vys^35e{IU(N4V0|_b_UUYav z2b2Z2IM#0jz3|lS@D%PtOgNj{v16EN zkbMjWW!NB^stW0`zw$|d3@U=Xleh1VeBio^^E$_J|iWL*sAgLQmFyPZoWVDUCDX8xOQqv&`S>rvE2Pm_t) z)1xr|UeDMo`ZJZ?{F!kBxc`4c{%{Cm7zOVH0;Tx*|OQYU@u!J z_wCQ3-Nn*_`=aG+s*3ll>DLyR9+0NI(lR}JVL56FFDzH2*ILfb6f44kNlOS260Z*Z zU1rA7K?p;}(V2TRokEUmI+QKxNwn@u0vQgf=;{kQbYxd>mml1ucy)R!sv73UWoj)i z_+~T?e(7OzQ;^^B!IsF+8Yoo4;B0rc{&dRn;H>qI%(m&^UH~Qu!8be5?fAbQg41_A zrZuQJX+CXM1yT%#|J5)M2h=q*mW~ERyJhLqa=YH)^Dd*mq$IE@AwbXbV_ZIg+4fj4 zXJsAS%;8|9{l^#4#KZ{JJP$q-PSjeHn9{eoNDybcpFQN7<0X9l;)-*4%}dw}UtX## z#QQZOSOW{(tzpeRx)IHBzhSHl{sauqmR-6%m*i*hy)XSZ`sR2G7*?uI>A>#4FmlxrS}8Bs`2b+ga7km&W8sa+)Zl56PW zCVRDrmt-GIOhoVK-Jg6#wp`m;nh1u(^(|2suQSB)=M+M+^cnC3Mmoz~R`6Obx2tN+ zBzqf$wnq?3pVvX|IfB}8+pwj(DYCQEZ+TmfuSii#dG>8vKf{aT@QcxR5fv0?YC`UH zg}-`yeX=OUvihGsRUQ(NEXmF{@Fi(CrYSk-&I>g^&H=oD@f$QN8n^HuE7eCK;oGTF z)INX~E&~foS2*un5Xec;pFi)ykSl$1tNde;*I#R{%x{}9@hRg(Ra{i;kIY|~jT*mz{`k>p=xZGW2G0y-HF~C=Oe?qaAvo%5=^=4qtpr4tWwfHrxB-*KsSo@G`=gD{x zkmE24ERFDav=DWv(-}@QYAH4We znsWv-ZvVS=ptK}lKW^jKXo@)FE)ob{JtR^>#Xt20Tjf*XQ8W*5=IgbWzX$ijt5)R1 z)3Mxjc)Z`?k0X&mN4VWPrZ7|#@Bf-?D!K8#L*=^PaN?RRf{Y@vT z!3I+)=oQ$z_C`kCCma~)8GWB|A}qjhsekmC&xh;P{gA$ZXEJisww;^e#=5fo$TvK8ru@n2I0H}eK1pq7a z?OevX0wDumq=zPvWf*tv_TtQhGR$9Mg|!U1IQT|{42TR_9pCC`)ELf(ViGx7wCrvQ zf6?94w-M_YUe%{i{^KCQAqsi05aqJ7b&GI4oR_TK-1KBrA;09rh$78 zPXY-~1@?NziqReo>8f8OF^JLrRbO=MKh@z*L3qfh3{r{-&cu4jw4&Ft{pu#I%YA?E zNvSEubi}z^X$I!|C4Ce8ZO`kF$Cxvao6h#c02-m;+UU_8fa`Er`cIsqQ zt_*uMPayW*Bi(Oph1SHTOIq4_k+;U9n@jf4vC(gW8X$vr+J;Df}J5 zzU3>~3!OqHN?4w2tmWMpu_ZNO=(hNELi-?ktKwcSxa?{WxZ8R~O`oHG(Dht4vd<_D29 z1`3&K)=cK6r;b0f@4w3Kl!r);J|F_qBr9?}caH@QtX_wN-5fu}V_P28Dz#3u)_sI9 zSM=s-<7Z1qs+p*a-c%f{Bh=wde^Q}^-}KBzcV}sVw5U`%aX}yK`h!7 zjk=P27mqjybR&-?Se`))e5IMs$li`7MOO2#naf_|?sV0>9}{jzPGOB){6VY`lNq}|4(wAM#u*S z=@1Ou8a7Fy)qDq?psEi zRHQm5j(xc8cj92!NQSHl>FlxBiDizlA+SNzUrHhAqNX`Z-EzRnYLsH~U}nOK2c(hG zDP=)6$21W>>03)=V|$ClEMK!0&en4xmzE<%$I{=n-x{y6|mFr}DQ?3SIAaJi!2KS*s{iY~MY=p0@+whW|)f z_$~S7!Dr(;?B;_v9fEEf2azb}%l6kTZ&%L4GJrJ5gu=Q|cJ#K9_8rAqXhQ*MLdS}Y< zTh?J+u;r}&v1ov0H@%%^sjock;9S4(rd_jY5qX@zoHiHa^ux!BLK6zW6KDGeN=FR) zxn1^dv(C4RISTIR@H*=ka*$O)Pr2D$zZ9nVI^5lO+7s{47w#Q)Ue|jCR0IOxr4oC` zbU1Nz&8rz#PtS}HrS$cD!Exe_kiI3-1T0xv!qe?{qc!;$%$8F_Em?@xThq@ry;0rR z{NUA@%n3|-_~>6!T58_|XkIJE%bhm)usUqd6?ZbV7E1Lmzky`vj9Jltu|<2(+e7A9 zSFciOmeAWjvp07%u6feQ-nKYsduXD%2yT4{0}+*>PuSau)J(b35;& z-8>RE7%h7CmSE~#T-*t|)$jNCTa!g_3KL&lT%Ir zGNB8&@6^=qHf+VP_=ewo?}w&8h`&f!dBcWa+LX;)9nD^iCxhuf~i>8P*(<>JH zbSmy(ajHJ;&DZdogIzKa50@tF=w)i3T@2IS%gh0*@QN z>5YW5#5Gvzu9xiu6!&5}SD~cW?vL_~DHP-OO)L( zYc)q;NE^AwNcGeFN8;JD*t?Sb##al#PT2KTS@X95*;X>+$4*5}&b$r9SCJ1_-oQ`W z%m$lBD*BB=_|DktB4J=Ne6`mU`R4cMf6e>IfFolJ)xmI`>NeS;K8l9DL^38x2B3(k zz)q0&bQZyMgXBXBZ^!&uQlr^JlET&S)=btcvq`ELc)`@+P$sZX@kmxIGMh81H*7a{Uz-%gTNt_dHd<|Nqg$l4Tx`PE8tY~um*E6&AqvxY_WF|%)Ba&_egNza ziCRKZl{Ltjx2R&EL8d;z6$%hUwM z%4VyX=Lj^H|YdNlE)BE>hcl!R- z8~Ie$1LF&cP8|0bv7#?ehmNXO1O+bQcdQG2^2-o*FL$PfsJk!8_N&!9rb`ahMH*08 zn+|uJpRPqHXjO$8_CC_+#?``*D$XTXEi4eJ1y~~qdiUs)PsO?^v)}K&Va>8U!CTk9 z68ESiUeDF~t9A4mHFsFhb3ENf{nnAUh`c~*h~J;cOCO#ipUA`S#Q4GXaI)!W_MFU0 zioxnLlLpn_cMiO9uL)vKcRJDEJ(T@oTlw6evY191KdUSLeKu#&1EBOwci#TXJX$|R zP4=n^{>9px8iTf-6q0s_8p6I#lrDy>sLOL}gA-ex?9<9`Ip3-ouyn z3MU;;SDs&&gxifuT8hKZ4*%7&@aShN_&WgU-aX0(K8h7V>`<5BcNL~!<9%~%l)b-Y z!@|86VE-FrF?@33gn_pmi5I*FsN?$L$R5m}_zOOWr}wF+WW&i)bamzTI?kb3{P2}U zLOc0D+OJ)KrMRuBb~{rkE1W+=eUN?H@I}1|iffr_8p+x(rN9yK(XHtyfK`0Fz1)fw z@eLOx3$7m?!etnaa<1Ms6#FW2_ps@do)So*#q|AD@|B z#Yb0&%8il=-~B!IU1F|~(d<{KuzUn=ae)biLxFiC?ng-^-eiV+pj2tcWVYls$XuhF z&ZQe-A1{lPs>(7Hw4L=~T&F@ON=>3fO4SYMg|oGaWCiYp@a`F< z(&GcSIX!;g&7#DA4$YrEZJjM{VPb`N(}*k9*Ip@e_Xs{F`51^)%NPyN-PtpZy{N`d zkLZzJLvt=+`gJa#y^0|eiitJv4F7CFg#wh(s4P+h3c0v8D-U15_x~Jmdb760xj8?+ z#@H}4D2bGlaTR|eOt=_M!yKcik)E|qm$)D`HGY*j(Urh7i1$CLt~xBL_GwEF!us>F%!Y_~pN08x zC)L0j6riFKQOD6geyY{G#c#LF4Cfp5_JI^XJ02{tPiSuKOpzP;xdm+qA4$=5iD45P zfXZ!+A%nYO?nOe(c_=KV%lxuPeP1L!-u~ueyzt%b1F)uO_2j2!X!pObS;hGtF%q|& z>{{7d+C!&%-y(ny>11EHInHp?rME=MStxSefPh8AmE@erh<@)Eg*| z`F+jkGjRBZ`a+dU2NEkwy&dk^Fyn_A^M2Vt-8Tnu+%j7Su}f7japgN@}8rSYxg65fWs* zs5U41k$740! zg_72y1%P;CNwoeE30sgQ*9XG#n2{87>l}q*fyp@7?e~Qp1Q~;sIOBpLlF9UvCZSc? z@_s=BX8*SY39>~x)jxH0ogw&+X^YmjaD`V$XH&CA`)PDV!Jydm%jvgHwgGsOZdn2V znN=8xarMbU(V;s_mgCR_Fi%?XnxXkQaOV{ujqwPMzTN-P#ElBhkZ@MIy;~Me`6KAP z%c``9y%htHn|oxu{{-h%`@)y9#;@`$^P83}@}+PEey5Q|E2dQy^#}vJ<=F855KeOL z{KE|+!i*n8r*XGK$~I3~L7i@>wM>*>RM?k11SVFjARd6ta;|=Mo3PAnJhPS6)ZnJ* zejm;Bg5hE7l_*1XItpna%lufW9BRA@FP=m8#f}OtL{k+^%K_ePW~ecmH?KLK-TGUZ zoPQ+8Y}O}FCguE>4d72fC-MwIiFsEXn#};#lPX8Jw_lwEsUzb)wDCzdK85S$2U5q@ zj**=r+^*Z$n1q>!0tKt~%VqAf)g%kAbgn@f5FH5z5Ix_O;qkfEQ503LrTSw&03GaA z46*k7qhB@VV6?lEtNgdZjm?q5rOJz~x7U8czio<=aPK~(JmC9d|u`E|o#J(6T6 zt7;N*Iy*De8o6wD{Z}9}L=sZwzn^-awtL%;DqVb-665q}sq?ex676Kq%6COb)+)O; z1#Rk*l;xqFeN+7;Dt9c)TYKIodt)nDX!NWL&oEo^K9@A{g=kEs#UJ&>id@m&S{NjQjI3x^WacTY%BvC2iq#QQ`k>&zIRp& zrth<9HU~0uF=*Y?-0P@}FH5Ohp7sW&>nJ=NUTTq*#WH?`Hv8#Hay|3M8TWi$gr1c5uC5q830}3BQ%TrZ zBi7HI*~b5#bH}q3?7|KNX&oH0gWy^{(wPk^EaRDSf*(2a1y6Pa>Pi^j9_ljx1KKb_ zg)R|F`GPID_u-A)EKT6$1L_oMl^lfiWy4M?Y2hgm}V!aLmJ6I|5!PlaDA5d z%g%ip#|ZXT1f}{1v$piMHZ2)JR&xrofl}mo>)BiHNuZ$iPG%(UGwpCzqa$aZKx>4C z;^za^_iOgp#!ij*aqPEPy3ps<50f};F@|6NoNhsQ<=C(n@SO2mN07Uq4wi?{b63gKNuSR4`3rw7>_T{gTgT3F6m7Du8S?eFc=dS{ z={aBhR+y1$s)Po@jYUDRTZ@tfsi}yz4MD<_U|)W%pRK-Cpl*L3>^oVDAVN6P;K}_$ z+FXQEeJ|9z3mbsRF>QW))U(GSvtxZGXCMB@3H`VKAlci!E!9m_E-F0S%ebH#X+jg= zL3@DrDBoLZfsbcHINp@TJx3UMrSF4CiX?I5HQ^5(T__*RL3?}UPmXdo>FdO*1-a~Z z{-L{v;ri~MFy1w&|0}!}Lacf=;3MXF9#PdQUnwa*xo0%rtU6{k?MMoI>|;>Ujvv~f z5=~g8fs-1y_)zNILh_0f<6_>?mB6Pj(!^qU+u(C$##6$`y8MmFWJFf#r;F`;1Ie;DKLRGtya4{mFUJ@Xe&j|eRi zyt+w!yuThL0#D%Ddm-CSFY55@HP*{OGE(}Qdq4-M5Z~TV%izIBZ6$>}Z#ExJ7p;dU zfc8O_S|Zw9Te>|q`aA?e(XUPv?`4F;AFhF(%c|P9Dh)zkg5RwA5hlpg3m&C4Q5;cf zZ_DYV1Pbyx9!j^Tt`Dk8_lG&@K1+k4XABCpmmWB3X_8y~WNpW?4``oBDog|JJ6vNl zwcB6Pbh+F`LU7cT+ap3XfXzYI7v}jmLnIxSZmOq(SiWc~axXJm*daW$@G~2S5tdd3 zT2Cyxf7EFC^X+x&ClwdxM?JcsX_Dmr7g9S4To0?%sj~xAcvi!~CcOif>U*Q{ppZlQ zNX}7P;g;y{arHd5p1{LU<-fkm5ATY)m(aiv>`*`anMF)uafpRO^r_0bYdpr2j!z+L zul2@dhkTEtO-53WVM|%v;1y9a%}PA zb_eKbcAL4g=M(Lxf1MzNzYY_Gi*+-;qc6O{`rfw@&uc~?f`7i1)86jm^*hxcQ@B55 zAOP>RXhgguwRT@bV}QWUk9M8V*MxhcWF~br@Y|bQE=K?M5PvPCsxmTQJPIo+K;g5& z^5Nz29hZZARCMnYN}YUfsyrghPhv|3-y23Q&LZnKC&cvPOQ_%#=F8AVLr;RXwh6&_ zva8Q&g{b<5{zCBkLRu@mK&&NY36>Bk1vETY#W=Aeev~X364jb0xnhlR!W}!I{pf#> z#7~Wt+(~g&OBaeX!N68v-^pQwVBqGlh9K;Kf=jA;m^($Qx*veNX@n4UgYK}0ws76y z-o7y?Jf?!-a`14kau=@fCW-_)*i}q+XQC!8)DN^#Kr^KI;@=Ah{#!r<{qLr=!r-BI{C zg}WvsSMw_~E`RMDKp~TX@C;@-d%mL|>e-7?LCmeZS3tkWfg1%UwV2)Aj`Mde5GA%r zzYqaAu|Sa3Z4=+x-(&rOJHs4Wbxt}1758WVMqjND?CnrrgOz&VG@ax)HrWJU=KUNq zfXqWJt;980hdWs*@GjxK_E{Vn>jU$;zR!z)#UJ1fD_W4A_s_}=c1-|#nv!`b!WL!Y z-}k9obve0Nsq45jOGrhcB>#@3@jrjOciBMbO)9bRGE$BGVVXH1oN?R~T~F&2#7?V) zTy?0P%_-F6suno0b1GiXMUyz2w|bHovYM2yJ{_+pQP=o<%$m7)F}n80`U0|(fXu(X z>;p1Rs95hya33h>lFFL6d?De)#hOe{{UDfB%EyOAs*pn_YXUYoiiQVV@#IX>_}+1c z@ms*hv6BdIdzu!#5mrTzQH6U*L{Nvm0%Sh&@Kac^ev$L^%bgGal%NanBR+-lAyT|} zI(d__3bz@BkT`k0^Mu`peSdOv;@OXny3>mABu2ja)89^lLw+?u|8`M-ZMj+s;J-+T zetBJF-lE8^xY@2yj-Rl5i%g&loKA)y*#g7k zP>u+2D3AtiXjPZ21f1FzkD~RUXCLaxoRVE(&?W`2-vnA5vSLm9-0PSSGzs5$=<2u^ zkJyV6(Z|>WSCP*M&d+RMp`36BJUV!uLHMda=C}BOM0%lxGGLna8QgQ13QLV#M+~`N zLn?vL2NFC}0G0P|*!kOnB3AHEX`ahV3!P+0liqejc5*N8Xn-2j4)S2sTX5u%6i`C$+4~+1+G@x?=(cN>Jq;m`T5Oo=TnApX2c%^w^*i zLo_`wvs+X0nEAPOoPa_H4%~ai!k#z1nm|BK_@wB0S0MlQup;#EQFTnZ&jI8Ev-z*_ zG#YQGdP}uJ8AB-aM0-Y4XP2%Q5SHflUJVD=;YS5DG#bag4^*uL$VsK4zm)6bLoT|B zdK50;xWZ$z@6zmlodFDKVeanLb|k12xSH~vam%eo9hBNLKV`v1HWJ9IwvMvrrRtMT zBacMh$2t`80Mq_~^Drc(v>qGwr{C_A(h~(K7fQTo_I1o$j`@ck1iO>&ZwUY$`d2?# zAHzh_aY#eKzO(=l#pC*SB(OnvR1~G#HOTh?aNsEZx(y;8O+SXn<&i%OZonc&^h7ny z9fvb@y_J7w@JdYU(A(%I#e9Vr#l2YHYpAo|oPreef47f#2&L{a`(nPB(qc5oW}%7( zoKs&4J%8Y>r6&vR>1#v;z?D!6egu8@1=_g(y)}a5TE)$;x8Lh(p3olbP6qXcn%oOIcj@S39?#W>6WH{Th)VLGh4HH|GN^%(zSSTL1v!;fDLQLFSUtCXw+1Adc; zwBUY4BA4PQHRlHY)k{EVg7VhAvYuDlRWSFZf9XB2`R{YoQs`c9Ba|NZrOilS3S3;* zHBy9~Ky;%Zp7`|z)}|Nw-_!%*e|Pt;%&^yM9P726@jI17^A-UPZf%#Z`CLu`pa4Vb;Z7%ww`g~;BwQ56~ zVBX3KSmOP)B?TT;f|K@FI!C2FV&bM?^QaI4k`I^jYZSD6sA0MTXez#=G?mjj`Sy{87hu_@F(0bTQMjgt4H7+BUAATm^e-OKTv7XzW zX4(0!nNJolJ~~PN&qMQ*p~h^Ik-)^e%Rcp$X-_JjtFS~PB*uRJn6(5(RLja5SxY4x zh=wfI1PQ@4g;Q;P_7%*`q{@VV)Bd>8SgF4m7IUy_8FPH`Btk<2Q5fsgXhQh_oX!2S z|EU4-?A=(j5L&#yLknBCp9D-ochO$}H?TAGDJR^Ium6` zj_v1NE0K=ffXk;jp^Bw9$razJvO3tT&@7tk`89GJ@$Ljm{}p!p;3@~*M*=(LM8vBH z`k|2P_vOib_y>%$mldhoZK^{>4lMX?ko()_*N+pUrb0GVpW}%rh3Z%pIwHex`BEx~ zY(A^8rQTO)90pN#JLw|Ym~O+i_>Mpez!T2;2%L@mY@`xF(58OY;~H}L=1&^<71=#> zDYY1iK2GAD$DHwVtTgbwz;=^;u& zT8>ETJ^Z_-7xM-DW)!@hEHa2gt#=TII{G*lwbySP6!2vykO6&>7P;H%8-ba4f4 zpYO`oX_4&(Cei%ZYvnc5_$?IsZFe8vTFWWf0rWAYY)Jr|DFZ5+%Pp#;%1PmiT;HSV5~xdkFt3nD6<$J6I7R0B5P%d z)jrFN#;h3^P)$T-+2^`U#mzwk(KqNJ<)Y>)Uf)17xstkHW9NO7_`;l)$CU8>T>S&% z#u~gnn$aMGmoaU6Z|1N#o>>dy={0iTSVu{>0iSQ_I(&8?3Evb~cg9DhysIzfRHz~s zQbY5g^8aHBvIlVC_3y(!ImLT3czF1j{MxNFV>_YV(6{H}jwonCO6%IjOj7X*%J{9a z?fWocilq9nU0;?kaq3_WE|#G(hX~l^BcE(D zCe5=P&-@kmYD+Ja-^%|CL3J05K4kNS*k?YD;Vwt9sJ*hrzEvTa?7Zqt-C*5L8x#uQTwX#|6;!nC4A8So3{~{=tsA(T8y)b zT%h)LQPZ*0xfM@pYYQ_BlNb~7@w2QQEbR#uhN;Ie+?6=8si6nF>8mn~FHsdwsM0>| zN;DzcnHmlF9hZbkM@zj*q}5*^;Uky>fd+_ceEw4O%0dn zHEa;pFh2W$eG}sz7hRvJQd(^#Om$f{9a((J@uSwe%x2Z;^YeCkcobsyd;h(lz6{}b zC9qh?pfK0_yn0w0dw=NtP+s5dWG)>>1kKuBkTrj6r8uoL_(%QR2(yL)hmnEc=iQWU?<%V`ATJ})a) zNK*@vX<3xkNd$uzr^=?ups;}Hr%hFu1muKWYzr|j%hr@`yjDk#fWSnjP};b7B5-ps zx0wc>4!)M?6JZ$EN~4x7S2}?6AOt@Eo~Ztb+Zee#ss39ufQ;_<6Ah}unR^{w(aBlI zAU6fh3UHnqz3Q8tW+orsx8t!>w{w-s=pyCOXBwTn2Oa;()-1#@PeJEUQl5EeTysvh z^@MpRvBSGq#BTjUGJ#ZJ7POcsKjrW8f7j!biO{e} z+u^siE!!D(*JDRC0%j7PCMNEE7piQVi=@%nTZ!8U)SVPZ1L;4Psa>tEB`^K`B7I$p3to7c<^cw;s0j%!AP(1W5i+J&50E_GP=%8!svWd`pC($gwBOn+>*+sM*2NJaC=Isizp4GI zRw)Y8pUoH@%GX4!ji}gs-Ce(jilb4h0i(QD%xRGTHhSScY}IUCY;kToZP!S~$XH~I zx72(f+SIM5x--E&crSru3%fI|qh{ieO3ff9q2n80^<#1TvJL&sS9+wB@1gZC0*r2XKq zM3_8y`po@l=Is-0U{;2UxD?qIan@Yr2w=U5o6aAz+c*Ooju1eai&Mt>&p*2;_RgVl zL85bxlVAFoE0bm$P5{;Q9D;OwY(Z!qxp|e%1w+P1otDCdZRGR}EYHu|p+t?^&%qt0 zZe%c8h}3dZY5LVi3WL>wA6{1RL1~ZvvAH0w#iu3e!(@Li)x-ASrEXf8jX_jj-tCzF zfyg-e(*R~qXrW6ve4v6D%`8pkD#)b$&!d4~*B9{#3j08gmSQ5>qdtYP>GJ*;NKU3P zmvA+;Tch#sGnTWc+jKkk9b2^Q?FY%$cbV+{GM6){SqHfLXpqQfc<^68i+lOMcl-5b zpD~HkB;TriJ(K*dSBgpp>C9w}X&Gl5ReY?AjW#NL3DL^bVGKvFD4s|wpVR`NgUM9T zq0Gf&lkFZFcrRJ4?-GV0qGyo|4kW*>t9WvXiprJI87nL~&w?%ME1%!f-)`sQ?cT>- zwO74II=v8KepSd~*tqBVxVo)>x}Q%jBv2hF!+WOWO3Y&y_+AsoZLIdiM|fv9^6Jv> zrz!XU+70l~eOlB^?nT!LeuR=u%FfI*v|X%UvF_Kiz)=r|^$uEEVw=DC7Vx@$VB;sd zgQwE?Ri#v*F;9JB#xcQV>ErF=6PCc6A(0GpU&%qyLdvHdaBA!Hf$TuGUfpZS@Edl; zYUbV%F=u5LbT@^%szcsNjYl1K?hUx}zeU3|2oH%ShlH2B!ApUeczO_M>PZ;#2pF_K zQPpS84`Izvplm1{hdFsi1x>Udy@PFzt85*Y!LdC-#0*gbW5b_gguBDb{Xr{7D=CjYi|2(?)#n4_4=3c zO}HV2<5^R|8)ZkT-3C}cJKVKXIRYXQC-jf2DlTrH{EhXxBFavH?+`e7}gf^ZwRI?JAFMiM0Zk zz+^?K+xCpmb`xecGlq!rk@i`+1czWZ!PAC>yDPayNFq5Y z>~y_5d?Ee)baOZAwX=w@IyL%>7mgIWe6Q-SwUz+hA1X9GDxRiN%rH}-?Ts1ZGl%sV zXhv4=>iofRzialN+=~f{oDp3QoyX>E%-crWV>5%{gWWtsuEri0 z8!3V~!iU6NaS#2MO$(`xJ0ich(QjBi-& zjQezTG`ICOO^WeMw_e+&5i?HSA7+-Q2rG;OHy?6|=c&>H`O0L0^V8J{Q%krpw?5~y z>@xy#y(7vee5B_SooN3>wP)GzC(LT~=lcCv^AH$XA5fX#hpxeKiL~xtnO?aQZiKzY zCIIDGDY^~Ke6hlEm|(lY%U8dTv7Q!fKYpw`fE3NA2X88M6NoS~)hc;x zNMc=5xTKv63yk10+-FmA^JRK;mI-Uf7){;B%GxQUi9T(_$R0w(JFg6z;~{w(c$fE@ z?qQ3t!jvdxSX2ap=unVmSb&0)hebF-mGS(gqq^|?TZ*TauG4Q`#nLYmMSS~CdZ?fq zFpM@bHT8Xa@?NHIBSG2^{ilYtkD#?e?6vUR5#ri$e3-{<=3>A*j9FqTSsXjcaVXp;s=*n1ocmsulU6Pj4x& z;4|Zpl^z)<_0qZMtNi|Z$(o2JdNulzG9o&rOC!@-QRcC|5Me;Ln+U7gyiRrde4BgA zr3S48DBg6s$ecrll@)X$J>%1dH{^B7`Gp{bf^0I+DOW}XxGH76?(QM6JBS=6wL&lS zf$Z*0F@?*)TXw0jd6|s3+90Jd$#BnDtuWrs%ogfxCzG!PAZ(PX)yUFz%?m#!>1-GE z;k-kPS{5iz2&1xQH75au#R9re=l2&2A8ej{J7Pn6f36oeer1*R^u<+mlzN3wB!zpc zp7DC_(l#`0HVK+18y!cf`o&S?gObjXQZ0Jj)Z+3hS!CF#t0K`u>WjUmf%2co#tJtk z({p=T9;-vbfX0!mwXnMCLohC`4Ztcf}=C4PX`Tdh0r;m2#l}qKqA<7C{;-UOuz7QnSQC@QG5xg>jpz4?Cw6N#~TX%5Su2AIFMEo?yvMz#)g}bTFJAKLz%A(g}6|NXB1__e`x z-I0Xnv1NPJ1-sGWqLFq`x&-Sqn_^VE|mMyOqll5q*L;BcxGE=I9;C zYlwH7bE}@ZK37+85Y!-Ipt>0OB-uZBq;EI2$LwFjoqez!r)AN1AU=_O(sDt6IRbYF z(w=R>do7I|E!6j>yn%q0X6bBipzLg?CX*`mkcPNtmcKVq&KeF`h)exhJoW6ci;h?B zTQ6&s;6)sdX7Ee5KAMqS3H1bil`=jZE$2SIjQEzIk|PfB_-eG?SKBhc$s^CXboH+t z(I)TVK#R?~riX{-L;Waic?PbqhCTGlP0(3~ze-EWGVV|gSB$O9HxiIvR==DIi=2O) z%{7BK5ipxZt|O($25?PR2s!oX*1_snrbvBV9U7xW>vfubMNji9O8FWOap8w3e-*0 zL5U6%NJ>u;%;c><`bIKYlskG{@kGWk=TrdXcZwa4ThC zXHa~lI!d}E21(v*V5LJ@hjK5o8jfvP5}X&HTi%km_p}z9`SEW*1&)0AW5KFjlP~Oq zN%;ZBYnbl$`yn>*0qB0kNyl&bc3I=*1MEzgnyDz14bo6si(#5BeR8?y5HeQvZkCS8 z0dxVeUN^H2tTe!U;Bcp9SeU^+A(Zk$Hf^)|Mm`*UZFP9PG2-AW2NCl*|9T!ly1p4p zQd)q3Qkx!98JzHappEY4)e0M@xsJGu^f{7Y51OZ44O9AyyIaVw<&IKiy_{&7Dd%q= zZr-zc;CA)-+`{Arj{kQF{p&ZAgYVZ-uQ@iY#pbK`a1FaG2h#Lw)+z9 zgHKH_E)@?KMLq|yy!-<%*wNSlPMa;UPbH`!eH5^Q4?QlXO`|i_*3(SWK*$&cM-%yvR%qlvS8*fg>0S>4gReji2z zg}*isxxG@2k8ur@kx%NKIjky2NQCy+D?1%H<#hi@aZZ!C+z}QHKiTCpfFaSEvLxMa zjG>`(6*gje!w!}|zY8^xnF`}KT9^3r+{Twl&rO}4Am#QG_#HU4+(f)&16Q?6(`O%z zSqtxA5SXlvVw);DXx{G|MT*hCD8O390OXAnmrN*9uzRR1jay*?UeJ8=Tm!{f%3~0l zW?y9JU8cTCwABD@E7TbI{?NIp>fxtt?MjJdi2=F(M3@yWG)w;-)jP^3MvF<$8?J&Z zB#hBmCS9;kfds(xL+YU%Nx1Vv6RXLWWb>6}wwC<-I?AD>Fq0`uvMU1USi9c0VsenK zX%4!=fJZS{qFk*5aV!`Y~;5#gP8 zG@-@Olb!hDN`-FXnuWnukRoZqz0GqYAln=jhsD7Ea2k3wF`le@QOythlQf@9gp za4WI@TXC#&gPEskVofnQP2lz?gwRKgBGd^hE&=lSeMl^J!BN{q<{}T0j8P#aaR2YD z!W4-~8J>O6K`8n99OieA&jeFh9KjMx2W(P|1ruM4I08x0L2mGk`vcb(pM8RN}w z%#eWY&K88?qL27k`$Z@YUQgdMRgC}Ma_FVHNeh4DUI&GaR*hpntSOGQiK}4ksV!eF zuP#w;z;ARZrx>iLD@Y<|eywBLMMs8*Z z8KXS0dhN`U5P53ybzB9T@wxqk(b}so_<(wjoV7%2us~NrX#OnW^gHo}VzD_%*UJnC zu}tw_4Bq|HgXenVayTe4v=Cr6R}z>@<+q+RWBGfaf-eWJr6*+{ibXfz7AecTeE>#Q zRv^qAIN5@gs2UeZDk+<89q*p8g}8jvYe#7nS_nDJSbmTmXWGA*uRLl+y3mltUMUZa zfpO=WmS0 zfQ*586UXu->BspFo09Eun&KU9faa8G#o<=TgA8l4FpYWvd>-{U%RJP#yEo=hre6BX z;wQ{!JHnNS<>ps)`MxjyalNp&#J0U|bTH$Sn>aN*3Oc=rHl)S$gk!c(NiN^G{Rs`b ztV(aZsDd*I{()rmxCZp*<6l*K%GMcFCEPnP0d&4J5eQ~FTU+E$re=D`LYoU5V6hbH zV#|9@fIxu|G;bo;q<;dHgv7s(R-=$=i!{?1Q4?c@gFrglaXKhd^(1@WkB|0h=v%x3 zD&#FpPt@1&i3)J;d>hnS|S2kEkW)!OFB@UaK zF+Nn9tI=%UVmoR7z7zFi)jP_@K1S>IL(o_ns-UHe7=u~O7Q2i2_~nTg2q3tEst)U2 zORhiS?zjvP{x-=&3BbeMk#lb23mtU&N|F7X-|#!{a21}M-r0PVQ^3d4u}OYY0xg{Z zC>6|@gs#&Z-czHY4>8d^`Vsp`wSLXH>0UY!N9A!@g+;o}3HmVCEz=uW=~J60K>~N& z{jcPN$aD}{JmA=T4_Y={?_?`S5FhTiQ29T`5Kt+Zp}nf?veJ>ulm8o6G1m&*edX89 z_Sq22wnP0EqRPd;`bp77^zCVTN&i$f8IK-~cSwABQOpCaw+fcnwM`D>(ODD==H+s& zrnvr?hZf8z4Yi`eOPh&1863Z6BMY0jqhV5HmpPNo_3Na`Rfmvmi zO`w7qpTl^PfFnIF_1Fk+%1l9Z1JOk7 z78nO7gqhfHy3b|+HG=i{vfsIq{}yd>i!P~tsHBS=oq#4%B2q|#@p8p_JR~e?;Pp`d zu-jbDBynV6bVXhSgw7Bad~znZsgIyxQq&iUD_)Q4u+v|&tl5v29?9CH+T(Y#_I659r9I< zlh|6dMiT_ijILEq5?JvM(?aoW_k9x3Upnt#t;adt3c6bEh&i%Bfe2npD*8(C+8bAw zR$^#3$C!%cGUxebUmxS&JnIqj3l%bV-w;r-Km!xr4Rt2in<+(BmW*8##vOM9zC9hdCNUx3KHe=;#mYM_#Uq7S7^rWA$Gjd=+I5 zvNjV3(x(=j2BL2cqv!g%c`e;;M{4=L)^{B*^S$FWOOjVf)F!IN&HtUj8I$kB58E9M zXx4s-Vmahsm_T%$T=?jWp`LsGl&sB!H~csQM#>tSZ|03kUBI%tc-d4vXm|{}=_nK_ zUmo_QaF(>^JsgK3n-^Ywn5vk1uKDsDaBUyZeMn6m*}g@OPDJF0dKpja*k>NM%lo{V z=IE@2vS${I>G7;$0%LId6m{0Rc&`Q0{<%awoIekpWywW zTYm0*VR$2bzX$nBrT1}VM2?}iv<|@3ZTSr#pYmp~=I zA~e0WRf0VT-q6fi;D^F6xQ!DSNk{+bu&=ltkt7O9CYvf*eN6|G=XH6LJEs@Kq*)-S zD%W@VJ}pbUw86~mtk?e}`)0ecLrG=4cJF+raAK}gg5S7Cy_*SWC2dHwky zVM`d3NePp_`qLIHJhZ#G#IHq+g2)XwR;PqJqcRcBOCrfJQW{}enWNnOd{q(rYQ79T z`$Z(b@n-EKd=$i`*~#>;IDtkV%pl<@S^c`-iZA{4>TT_%_zqG(im|~AIHLlAxu3wZ zIvs>a7X{wH#+1<+)nSfhnU%ALk~h;1bk$ms@N;G}{KJ;;FXn<9D_CMevjuFYr|B@F zjkj$HYHbI^rkl6^;tQKs{K=Bhg1)mU^2z8hlgF2y$69uwB~wRQ?2q1P$)HYBni841 zNxP806?)>l_=Dg!B&engaAv6`q=lIlMRXy@Qf9>D7mDfRAC02ZNylK=_e&fOMuh`L zi4ybYmxUJIGQoHE>Y5}3S?a9=uhjRXRZ$ZrHaGwbSxCOe|x5QWr9pn>FZ$5e|Co<(wI>+cS zk!s>y#^XM87p0l~rj&hCW97(O#rI5WalWGL`UAye`{j>DFV*h7SIvi?w(L{7teDGO z8>!~2PdUZyjOWf|_goUc+=6FbuPZHYw_KmCX>ktV%oGazRC%yT^api;#6DMzJn?re<; zSU5`V9gYph%yONUc?@}9OD{E@_6z^RqB4dc!fPCQFiR9S6R(E{KQz0U+6L(0=qc7R z<=w?&7Uer$WcMO4ggWn9FInk(uj9DdHpypwjRx@Iz2m+QOa~dP8eCpf7RsC`nTPhc zHP5tYdwC7_*U7^u=c#v7g~!h3)DQAq8FGg_;rJ-3D4y+wbLI8ukf;aKV`L)yv0hU$ zmI0)hq1;aO$+I{9qnWKqa0L^fSkQju@P2Yfm57eAlOpdC`d!7zzlDfW z=9};-DR@+2L82|H+|;^6S(d8nl@@~j*7$2@*-gL*EbNRHqdg!M!Lud+7#X*ou>VvA zvmD?{z&EcvVQJosE$5VJ(-iwc)nPswUXpNq9b}+Jk42Vcu%EDg)JrG4gD;?Gm7zVi zOIc##v$LaxJDgs5P_yiLwB+oJ)Jx2E?L3uSi4sr6pD+xtu!Ve}=s>EA zKjMOIF(sZ;EPNUfPN>O>+8PV%Yu6pJ{Ip_kv}^bU{b@J*LMmA0tz(C;uhPSgIU@sN zSG#!*xifaPc>xRiw8_mkf4LM93lDzJfx^Y3-qYS2A?9_V@cc}j>3c5b%+u-UqGK^c z9LV2stmiQA_6$U5$mUJ89p@(MH*oL1v5ZbP9ww3;kAHG_BV)(^D5 zG4(XzwK3b2GL=t5t*90)fmw1sC0HmO=z3x72!>PO4%&P`+>ji{-Nh}mF|LLv_MI_O83}z!m%Kz_i-R->dMXKEHCi_+beuPvdN5 zv#4EyUAg$-M0y9Tl|&p%oURQiSInxPBfglZ$xE)x*b27TyaswvnGG@D)-`Qo;#wDq2_NL8xZ@~FW^|8Y(YEPnp(?r-iOT1-&dt+NqCKqE8E>oPBH#0C2ALXyl zx*aPT-lX;GfNj{4=G}i#>Km$se1&bkAf@A^M^UTSmrwRM1@$|8L9k}#>7ubSwq~ev zD&Nm>I~bxFeP46?a_$Ki5x`a0Ks`QPqY5~`&@Djzi`|Hu?}yQ)NqSnh8#`^9&*g#0 zIH+ZsKh~Em*wV!Rz4F1e_VP~b_GE@-f^ZK|r079$!~fhPTkx*#`bi9CrPu2OoU0LTQyv9^}5-Wx+NHPsBSX zBjP5%US*)DFJ`dfQ_&%nDOGnm!j*#^bS~oTk|bQozanP^e{gp&|BLIB`m1hhbDosF z0=ri!to8G^lQS)o3wyQNdIj%mRChb{5&x9$9!od|8eE#T!GKyi*wK1_x^y~Lx4&3L zmucAce2n+Z*1ABBwZFb^pZjK`?||(+N5yf)aFB6_J+&RLoray8UE)6V_yi|%ePHeJ zKh6bSeUtl&8s$=ud+j+-db{QKzqG{1J>RrC?NaQr7hU>(wBm#CFO5W@El@G{_XdMV( z(}g!_pmn_T0ko<8H5)fK8% z5tH1Ud8$&X7kX5*u2fE57Ipmrl@^e8T3VHx4eBI)^eVKU>9$hO{K-E=r62?2Fk&oM zBsy3tP*D)JxqY>x7I5VKjQzm&E)O;(Ki$h$O|B7c%yBF8^IQ+^;MA1TZAApBr zr2_=YF``IVzY6EH3RN^n!lb5dgO&r@<+q8agD~Iecc@8 zSNOM^avc?e-C?^yfXsMn?_h4lbv{P)x2yA=Yp#rKtv~%dI7BD%!8W?~dVHwYA{A!b z5Cu(E@@(ucPQrQq^#d_g1TN86T3)7a3ti>tJw-`Fh~csI#IiI_0|L32vK#2~*CYGmkU6(i86=qSPOzgiD; zHoAV%N!n4o=;l?p9*O>T^ChX9XEAT#`7mWK8kfY#hT}nRqxc*UOvL8F`dY+)=dk;7 zC=JvfOwxn-db)e^mLy||0|SW$&EE65 zlA@%EiOfpHMti>>W?j+MyKfd)(|T^*sPCn;X*M@wDDg)W@asU_10b%8&qsh#L9{Z1 zY;sSY%t=(pY@kfbzm8K6L>!jt~7@6CPa7gI-ezSg338nPl2n3 zPFKS~TCLIvZcBBWH;}ek5q*Nw=bk1cX~TYZzWy1jv(wIOjXEv)Pw8x8SQX=BX2*k>s+(W?8)6 zMaZpQ#AK~AO1!ruV^VKgd9D3ecjU)&J9TshjTdTQ4_duay^(G_t-oq=i*?+W82ZTJ zuZk9A;*t;*Z>_xIz9pDb;TIE0)PUoAdH*^aQj9_rQ z>)=@8fZ94W$3_PWJ zaC_c&Tl&pCk52eBdt=lUhYh40Ub#GNey82nhT9#(sJGJ8&+#19Q~<6Ac@CNv125zR zBv&hfSanV#q#9Jv?5zztZt8^Zk{RY2?ZU>@v|3SkALFya$7UwD!A`!o9E*R_G=hAS zybja&49<)iM+mRr;h&moFldz!+q@LzDQ-_j2fKm>2W9) z$5Y^M_(BD%gH;9#d29J_t&^_TZ5B~(!PT$Ry)z7rOUJME!YOXdB(kuW#AfjwhZs$7 zoG%9s9g&v|I%QW%8w6k%B43Q=n5Dn`6PS*m_bNG#2zV%kk}u(3An3nE_{NDeWAm_c z;|9hK@6k*u!z~JM?w$@0_Rrhfyq&Cj@3bIhxc@E8(H(^x4GxO6#s`EZUQ2?vYa}>A z>K5k>M0RlaPhjz(S}?UR>+iKL2!3b!f82d#R8?IUt{e$LkrL^Ul~E z7jY8mu~~QMkg0#C8{~oQAHglS=*|Mkt0QcW)3(W7!nMhdY6JA`>azQr-t`+cMWpMq zMgXXbcpxdYb}diHleUS&%_UQGr3MEa-&+eWFjh&s<|3}oyw@YfQdMG{lbohkRu=-7 zr$5~f)c?;)MG^ht9M)P>2YP>&WHX`R)a#cCJxt?3h9TTRz=N_DBW;K{`uHm^gq?N9 zh4U5T&7tHm)O1f1FDh;{vF@oX#f2JaPQ@N#^s3Fy^4aV@b>+S?`E=>r z8yocGqU5*!K#pkubgjirBG|xFjws`mas{#pMV$$k-me%U^)|_gesq`~4JfNo_MSoU@QEvwKKgPnp7+1(Tm73vTZ)Mdel3a>=NWO zuO(kF{HK6=B%bo}^`VlHi!1z9SC^nFhP-7qf+3(HJcKrj;$>e|>vN|`w=K%pTfnAT z>8azVuJ|X#FB*Tmfq?Qxd&xyGk0tSDosL#jwb%;Fc0H8k=oHklRAizVG}X?9)_jv& zD@bj;dAn80pP(3#{c(vMh}S`|02{3+c_m~_-_xcJ;VDQqw~L7Mxn4YtsxfcBO;)`uJhB1@_~- z>z6tiA1*4@O8zuCVctd{G9OZ$aZk}b6j=Phi!>!GRDO77-IK|Zu$cqfM?)Zh-oau$ zA-47$=If`hQqIi0bo5s~tX^ReXUv`Xl6J_of6_}gai!l>DWZin!aLwJx%ZBJf=wX0 z+@BL&!1;Y?mI=LG({yl8%gLr4lS+zXLX?pK{T~dw2#zV(IX!RnItp&V(W(*Pm{g4{ zuyJjiC^M__?2GqffnuJY7-~%I@0!ftEq;Rdl9u(1e4VIDI?W}>RyMw3WkewTLe{rq z(4A(U2AS?{ntTQdwulePlQWqo(xI6 z*mccy^tQ94-KNEjav^O&&MLY{cNF6K*UDkKCd`w2PWP5Uq);5s!xAki#>#Uw={TRE1hxQlyXb3P-Mk z+dehxMw$QMC0!3m57yBi(*5H@GoE8&Na+M(TOS~+(gjztuBXp>B@53KE%WXFbQ1s4 z3ScC65$-`#8hnc;v$&dOha1_K^+uUvKttjS_TJcH&dmL`bPM za`W_bHsj$&UZ0l#)23UWXRfSAFs0%UM|-=1$mJZf?a=zVO})+IFJm~DB=4LGxG-}_ zz(qi;eQ2JIena&-*iTC@L;?d56Z+$E=*z~)xS!7Jn>^3IwmMs*-}ux?vmYPW(A-*4 zUVojHalWzV9Z~YVaJNDrqpoo#yd$%O`&>;{K=+(1;>zrc@BrCUh2O#2F9|iDTZ}m> zJ~2e71@Rr;1A!{%s^f7osi!gtA=*dbjzSgxMY><;0fzAuau3=I!DUg+-MZfH4a(%E z=6GfVRZpEso>D`4xAJzI2cJm!P=)I}H*9k0nUUiwHzI=qg|4PLiR*w~1hxieE8P{P z5rJMFHz+txj!Ew1p#SFeX!LWt8J4T7c$%S}g2Bm<3}2D+C7hhBDzWqB zoAh@+6f@Ab@Y=qSg31v`H`$BQ@k<&0g&S$DvjH;6zn{q6@xG*8p&hUKD_NIGF6Ca# zwPSNDj0Vv-k8Hs36ceYnCPvJ*f@t1#O>p6%=ChT zUh7kQ0hEjTw{zIMHRB|1nqF>mndO2GjL#2TPjx80fBG=hIRz0$doD^8Z(})rm5MZ( zioiwV{4P9C+c`9Z{yQKxi=_}%p$QPnsU_e2mE01vYTnvhxV-a)esUpxeH?UEXP#X^ zT)t_xaOay!Gx9jGn|hbr8^;^E0!_@TiOZhBL04^VPs*i2l;jECd^$HlO-V^=!Lz{AIlTQ zVztN1^C{KuiRvMAU)Xz})jh+ZQ+I7sFG$odX$cXm6sdVCH`Nn__Bv&mBs2|c?fyt; z(Syg-4V!(7+@9T~&(-sGpg4!+1H93lJbACjmi&6AJ zr<48f5AzJ5gDI_1`(61s`^%iaQSqHOxa9pbjB*EDZ%o-r{O|{mji}~iV(qgh_l zn1MvU$inJ^vF?8p72Ojt>pkuzR$6kgR?frbBb;SYCW%28CX-cRTuUGV)iiR z+|uGAE}Dp($LEoa_DkD*PUi-uh+~+kH&l;MxUq`TUhucQi83P6%d-B=gGS5Ock-pB z_RLoA(hcg<#?Vsv^kX|UI7g}Kyx8I6Y-%!HjqA(J7>rq`5lBNVU8fJ7M7EjgYyVr9 zz*cHD84S!)-~;nztSZ|NuSHhecWuwQ>d5Gl*qy@J??W#u*^ir~=-ja=25_+a`Tl?> zD$r!?rhKJe&^pJf{r26eGoKykiaSGDL9W{8i9{}|Qf*L6%XPK%zwo2MX^9Z0Zs3(W zyI9Gc-xI`*`I&|1yjv-0&|pAxU96=;%D6kEw(HhV+a*dg_3lprFw_kSnYs8D>vl*s z%+c9Nhd;b&wh!X9D8-$aIU}wWOvkc?mO;=%OD1Ro(HK4UG8N#KcDXqE8O^3k7v7U% zWM|2UkL9DA>^}c;1BPLNdMfvj@X+{y&RPzS9|spx3&&5I>@1Hw)rt(0G9I1DEq*qJ z)|YrVhK|izgY9}Rx#^*||E&0%l;OGn6TyR!dfrQ4i&c({D{HH&q-eS48EdxDTWiX{ z%b)O=K!=%4w|Q{H%}cYHofqZ4tT0l4>Fh2WO|(nfCobG;Tx7p%pUVz9v^yj_kaxsY zQezc3m-)4|FEeM1-J*eyr$$2h>|N?_#B1!n1G)UXViQVe+2Toj5r?i({> zT4kLl5_xUq^G>g-`lPIchqe-VPMmO?8)y3Er$kAEx&9c_#=bb8^zyzACIWYD(=RuF zoQEp4ITbG>Q)2x`mu!j)aU*VN@>`owxiVTTjlP7xsuuCSc84#aTm?y4N2q1Bx*n`u zJ%y4CGuGE}1qT{7uLN5gPWU<#yrVkwaTYqH?n_R(kDn?2`99{40$+6E9JdVRuYL5& z9VXu$LM{(-5|r*IEXpg*HuAL;{KPa!R6y?{8mVrz;tnAk^H`pkR~w2p<+8C;ZWi3) zh^FS^fj(RRPUAac9lJE$Nu2!oUYUs;XOYp25=z;-_z3jk9IrHOBHO9dfQ;4W`#$st z3ZfNcV+>$BCHL&-aajT9w|C+b}B*m5|zh9+FHBE@p^Ts9Cemq5s;VwFhAqNT9 zusX5;W(@A^hlhxZbgVBjjjJ3E1-595pwh`r1L0~kNo&?5bu6!~1A-!sPi3CJQp!AZ zeNr&A2r$&YOD6Y2v_AfJ@N@8kMr{6v?X7F`RSOXx~g_CH{`I4 zOw+`7Y}q?V_12j)VtS%X^*K}`JDc$HiwS0T+N|f zO`Rjv{A@{g)Gl6}ipJM|r)h8XYLfr694SF~ThVSDD<%9%_#sfRI+b%?P^|YKW<-%m zJ)ezMXW>*hkxvNhnu+cupxE{(=G=Z|FgTQ!b7>OH+`X-(*2rQX`_8+(YdzL-WzP` z0?j@L%wCEv_y2ek_|hZ8+qU%jxoEapDjZx}%Z~^>l>Is!mVzhN{U^xYWzx-9f6xRi zkGXSsYOF(jU1|qoXE>J7xSs}`ZxR*KD~nME{?m=_koVIflzeRB%0eXX#HAcYn5v*Ip51b`$c61nRHU^b+Um5$75m(_M9BPcoJ9?q+!B>QOHo&1K2T@Wz^F;;r&Jr$zS; z4Yb)b6Hv;}cVho4(+46Eb~_5LiVT*b6OA44^*2uXZU$Q8m?zS6#m=2u_B^d-;FgMy zF8A`W;cnsn+X%vynvq+^3$E80mS<1=4g2LLA0NIo$9R6Ys_?pnYxX8?iz`R~nzg?0 zia6jGAA$b*Q?v-lQaC$e#%ahDs7QJ9{emmo$!Ybmd^A%*?%L+zxKI_*pUGU=t6%xm znsluEtu1l)5W`>MCI!j8SX-ZY(8#nU_LstY^Z}3$?=Qr45xQVrf(_VBmyN3fFKF*H z6Rp>7781FAdim_mJ#xPXj?k~E=;kHyOx$~>oAfwdWxA7%5|gHt+nd_9mgU>~kGZo= zPfrtdI)y-XD87BTc2>0XG!(NgWCYxz7CN0}z{wd=c zHmo(hNZ%^`*$`5z4*fD0AG`(&iGK+^ypJR022pUcVe(wj{Z(1nD_Ae zNBx<%QSJWICj8!j!Y9oO=4Vbga5n-Cf1r3mHiK|PSPnVfedB*i4$?twc-u}w-gZLU zjFc6_uted0(JZ~1O_Bu}9S5ea25JTljNUn|4}yyfC6o*+tD(Vwns&Ig4tZ zDT|dvihQY$W8$c~;;o0VrQXJeBBzO#p+=YJTybc0HuRl=#~^dOB|cDZVgLL%?(Gfx zgq5rZnAG*hN2F;C%d%Cib5+0J6`)O0kId~xCFmrM{|rRM!;NUqNS$@c!AM*GSIT9| zE-pJO`pwgK26PuxhDK@JtGK$#W-0sliwJvGwKkQOw2L6>05Fr|8Wha2^|y}x)f@ABa#nQM9>n z7?)0BteLr74w0%>EpZH0Y?CM~Nh$baK03dmzm_0b^T=xaTj48!Tlyx+P}zhb5gN?? z4g$IKH~nVhkzpK798XP&zs!{%0h(x##BVp)BcMdH1(3jMb)d_TMP-X5&EEUJAZZMw zq-#AUX46O=CWeZ@N)HZnux_-9hct@TIoe%MsYhIA>EYV_F?wt%P!d6PVvG58c^1}t z#C{uR73YhWQH1t8iW$b4=4}jW^w7@^^NgWUze@wR6~W6ua8uI4hTk*`5mkWb_7{(d zpucW}7(&;?0^dD= z-~Rvo1jnD%0@q>1L=?WcbTlzFb(w4gqcdqn4j_KMmX?;`mc6o-t`ObB*)w}i__Jl@ z4rK%dR;sS3mr20onr~qix1f=RWDSiD4@Yw5>D0TG+!s1h)U*GNE6rg>Gbw;j=)QZ& zO9=a{hrr4tMFY@B__`&V20Rt|`QT(17LG<~=;y?8m|4!&yI*l*$WOyB*I2eH`^#YH zL{smiQ+JBT{976PK)-jo6ta2H#iF65rIjil=KfvN*NW6gF#sMdsA1$lm7@q32S)Vk zO~S*1=nd+$$7TWI#1R>^DIwNsmSrmeHgF$-4HfLBgxH*4VY9;TPT=k>KXFVD->?cH zj<6PV1pd3f_FMixeF6&qKct?&k!D5tC)w9xo7>usX3E7+Iuo(Ie8bMcF|`pF7k2~} zV0C?YHd$?NRNOST3)|+g9DYpV(Ef=3c-$x|K7Pt2a7fL&r8L;AF>Yq2dD@L79veNo}Gt~}8gL8~xYZZYJv8f%uD zo}Rv4-RNW|VDUhpQ%-L+^9z>+AKB`+1H}0|W2ry=p_^5e$;nNG#|B ziK=LDaB%*j(ZP=AGppU=3SOTTsVSW*CCm>MfelKPA}Ryv{Xq8*f9;nxygL7xxMBUa zr<>hzRd&XqiwWzswKhg&3zO@dw=3)GPw2zzc`rG>>N=08#R+@Yl6r2HFoRF5nT%b% zCc7ken?@n?>errG$ph1KRvbWQ5=r;w&y6I{9n{)Mk1Ts@Z-cs%3UJEpKZP_{rXB*L zo#7tnFy}ZeR(-l1Gf$ugIj_3aFl6reQheYu;+K2cuzw(%h@E)oaQ+tIf>Cl#KIS4q(8 zv;K@?SlIaO2Qbk)2xL%E0pJOf_ItmM3nGt2^f~=XmJ5Ehsn}Xu52N!;_phHmdK%!A zyJ_*Z=bOW{ecL*4+Yh|rGBO|0(9kH3bBc;W#%I-*Rn2G) zWy%euKKnE|@^iJvAL*{s>B2i#!o~3C%mdq1bF(=~Xu!+J)gd4h)NYk_IW;4on4cf5 zcXo6Pe8gpN0@K#l2PDa&&?kRrTHosKjAG!j7)-CsObZd#CiB|!BP1mBcWxtt)^BWV zOin_#dr@fdl<)FHJR6+4<~$GB5{$DRIN*ZDNs)$ZCvH`Nd8h%ADO~x%6(+ zO(S@rd{>9bH%@}g(NXU1?k$W0+&{7_;D`Pf)G0NzcFwFDmmD9SdGX&|9{${KBeVMU z9?K>xaD~f`DDv-(M3|y53@(H_(IK}!>0bT%3_-dmIk{(2 z@b`7(lVEQ*coFbOb$(byVFWl|ru|ZD1<@Derg8F*cF>C{{-r<;RVAf?!kKI6D15Ao z$mIgY_QuJK>s;jtw|N_K)0^nU#g`-=KR$m}OFRY-N)K-1@MQ`eYk)-!EO$gqRlp)6 z+Y7(jN|HE7GB=(sR{AEpka(W8BBRZC9rm=`BD31-piM@6{RqZlPqEH@qKxcc{*mY62ikJeo;bwpF&Rmi z*j)s6tCmM#oBDipZ$7+mj9(1lHVW!7#*yRO%rE0~-WZnGS`gP=B-Tn9tzM{>&j>p@R1I_Ws)#f+^+Yv(y!zsyyqjyo3!{ zUn?k(@ZEX1qM}{Zxp=gA zw(oTDJw?zft8FlOX@+pJ(0*&YWQLzcca5R2`pHn10>&7zvv>W>#g{%hOnS>({4lJp z+a$2iI|#VS_oRR~BQKknD1nFEJdee@Q@vDMF;1tF$$MPY!d=36xZ2}Lyi-0T@0cH= zYEjmo;I{Z7tX6!+m;Nl({gu5D zs6u07b7owo3UnAc`}$nB$bcRh-?0j8Y}+Xbi&DZI%tT1sNXv=gb2R0gp*WV7mL5Pr zA;v6G;0)S#*?r!0cDS|)3^>Si;@>JRRc2j|`Q&UsRJl~v!b{-rY5SuL=o)K?) zD%aRdajU7TyYM@0juzA&4L%nbkyI&hSm`vceYT~dt)2VIPXY^Ls~_L)r140n%2p5h zZe;(T(}eu4@!FYx-0-p9{wK@-bGJWYMP+vOl1SR&kNp=Dh5r$X30Z$OQ-|{C5ls)( z|14`2a@j?`ntt!sxikG55Fu1TX*s!|iz9k^`Y%aKg>^e*8p@C3yYll0$Z#k zPW@sIbu(S|3KTKQr7Hj*p?4pXNKFF856 z$$EFkx+RHV;tB4PXP+LfUtjEwfn(N9F65y}f?Du^9&47A17;SxwC#g*Lj~)K3caVM zriRK_w6(Pr)6D=@x~^ehK!$^Z{71L?w_U{Vrf)X3c}~#>dTE>$+ODh>o}oPG&rSV2 zBVR;XIqczway+`IkKg(RO;I~WpWJ;yKj5zzDMj}@n=!1QpVH;#Fc#_vbu>$=aW&lm zTQ^P|^@}cQIn0u5X8RcXx&_yWVJ(gj8mQkix#-jQ=^t$gU_RN+wGNF!5+kK#aOC$- zcy*IJvZQuXl?6xJQyRHyd8_mxTmt|T&|(OmrpP7>>)j{eH=ZFbo6XZ;$@;53=BVXG z*8{MI8e|>#g~x7|v1-O8KFMyP)Fgm^N8~^gDeRG|1ox^_jHZaomZsP@A~bLU@hNH~ zy_(E~ly0(NJFHtl>s2t_P)A?qb*ve3QU{yIGzm=13nF0SXMCr>pN7DrJ6;(A(q9N^ zg$Woy*Vy%TpgTfAnC?CClEm@u91D|nc_;uE?a9#Vb(&91=oAZ_*5it%y$Kdms}lRi zQ+87n6WIqO&cjL$VA6XYw-T6HjL8n+HBftE#D|Mp7ks%ToBimoXK)XJaMCz{!^&Q4 z9;C7`i=j-uOz~wHyGf@Mu=fnZ7XRS&;upi&N|4*pZjiKu=PV7Xv+iq&ZXHwxjb6&7 z#vRobm`Yi4@!afov-Q>Mszk|di>OhPnROevdFhIupKuG|f>8wvl!~AdNT*v}T=1d` z#!|JOU5rC6B7lQn3EOvv2twJP`UY^vE_7>SW1fOlnEdGfT&W6T9t=PX?T0M-jPLG~ zgp&xkv;%suJm2!#U+}%|lCjrdmI9fMyD3s7i*9v){zqm!CT&$x=%u|@ty2#9M$gVn z-3q`gkvwx=D)5aj=KP0W=AbuBW4ew()^m+B`NtKy^=|fb%FoiJWM}0Q`M>8ozD1NG zuSa~Pm#b4%Sm0MJoUd0mn(3N$I{zBO>9sJAMVXKs|C#fTeld@q8`Qwi!OkZY`<`Bx zS!)s4fGdzM_FN(8(B>QPI#;2L)ep%1P;qD;TaoeDCddM(hJ*N+$K3DPRnjET2>{I@ zeI{XIUFNVNGlMUwwg&*5aes(Ii*AhMt>rM%(10UiS^NN$ zrL{$>j?P{N@lrVlXXBL|AbVBVnO#wc>x(Cy3`OnDez!9~{2t8L;(*ImR>mLBr=7)Q zrC^^uAOcWKZ3t&Ms?FGPK|q0i!(`=Gxj4=+c)M_B6@9PBjTeESTd`U}5hdh}3~L8J z_J?t9fT!F`4O<{N`VF-<@md2VMv_9E^6P^cJ(k|?ljRnr_Dd4+!eNVn9KE6ILs?yP zSqZ7MLR-aO(_OYF*-g9g&-T7z;Fzqrfb)epd9YdU?R2XV^S)}Xx6}!Ekt72^%F2Wx zJdH*vh+L_v>Gp20x9ql4hD3s|(-EAnJDP~8hQnH1!Oa`v!cASxb;Z^QdcICO)r-rh z*`MjC+)Um^ID&iz{Movz)MZ;cmd`O$&LCft4L(YYTsxSEZ@YYGxdnx+ociiww`m2W zg39$JIy5|H#`ha4DWZOE9o1l%8aX+nT3FKr1Z{P-ZvIq7zGo&iV8{`*l22N(^X8~D zL6&@C;E3R1GOEved=~)D8DjtM+jD)0q*d|U+L{}i7o4kP-6O#nXV-YvnyEo26U|6R zDG?YtkS5tx?|x_u5|6(*&eg?96}99y0yWNfpR04}3d<2|aAUR3n>11MYNgal1P9~T zu@7RL4D!^OA_6`EH+(^n!d|OcYWxA1BA+dX=gCgN^nFSq@%%U%PK$7dy3gOZia`h{ zb>38e8kKcD)WHJ1z8p-G#E?w#xtJ~ywS_5pL6~6kjt~rJI~p*Cj*qsTR}vs4j#Ng# zU6iAj_bD9bpMl*T)>8!^ne}Sh0necdBIF9ESIfOaqm*Y1Mhwtb0QxME6OtuP71zbm zG#$MRo-E8}s&e8;{v(ZC9Is6(IE$Vf5fShZGb^Nf$AvYkgnS^(X8=;~zZt_7rzTZq z+LLZIR#;iD2%kX>4&l_c7|D$aB;b&M>oa_AdnvZ6hk(+cQaC3%bkfx>q?Gy!rpVGZ zfvB)~f<_w%R+J;SAq@+2f$%|n5ldf-`fZuh=)`U!8k)0%06t|)L61&xU+}2^sXyu% zOy46%*K7ZKYTPZGu6#wqmzTg-t#vx1ner6Et889<_GJr|fk!Ifm+Cej2UfaZ3L9fZ zWNAzAEKq%?IkZ(8jEu!=!8qs@*p&jFYZQK;h+7uK1CE(c3L4X|O$;2S-I$k;Eg|dk zV~yUP1pH3fwO^nW9Y^ld{xxB+&n^%;*t|0Y8%jQmXl{dgsTI1v%m`j?r46%k z`ulDGatx>0Tz7P*T<90UnQ$77x zJeh-5t%oZS3%V)BX8zpN{BMhvo?2B{v8W$}-TlB=3=HtPKK-i5aPy+Q?B#c~D;~q< zTXb5b>F@!(gPC$fS7Z?jiN<4vdh+qcM?VIFr!K91?L&$9HnP*Esf-9g;JAgVny;x8 zpnyTfTs7_R>GH5oB$&z1Z^o|aisl`ekDDx^ZWf3n)EFX{#rFum{gU<^y$#utKF0&fH);W3dP$|p?sl1t5|9))OojeFA~+@_ODi>eG<{9K+3tA8E+d7XMM>9_2eu2mLB#7!S=mD0{%>8n7mEgXvIvN`2wUM2%w>=>kv< zg2QB@=uuNs9x&_j+71}{{@^_=(5{eSF$3JA6bxB!;mUPdA5;e6F2*2?;@M(!&g3Z| zu(`uY&M)R|ZJjbt37j)i`+`bO75+_IKJc^!CCey(n`_P%bL6u(FSgGSrZZ9v%s+2< zv9%wW0DuyfrM8eUbW=EZcV7zPF$UUE63rUGuX5Vu=8xba$Z&xU&twwtdkI*<-F*sG z&7oQ?19I$FN^%NZa_M zXrrv!H;*r3q9*3AqirTisZG!?&o_&rOlr8w+1O!pDiXCW+w`DH5@q0X_H5Q;lWBdn zp$uTt12WLUJJbByvAb9JtELLT=iexz@lbaV8@ne`?W>^+izb4%r^7c2uf9R(ago!fex9K59Za_b4@#b?1< zB`@Cs?`F|18oH(=dHdUoiPXvMa8f?Yk#62-S6I@WxPfRc13Fb3y)TRb5U#X7J6MSr zQV^NRJju&e&iDujqgAl2J<;4&Zf2h3)%KiG~ zczeoZd$K|~O(F=tAwG%#uoKZF_f>*Ky_L==Bni>eMEh0($X8Odzwgln6FdZ$Bb82V ztt@#GI=$NRt?3$$Oj+@_1gwU>w#C?GEnm?BjRNkIfQ*VQzPwKXB%8v)cH{xi z$qK8rjK`VOzxe_wJoTeO@5J0fw}I^VlIJ$<)NV$Okb(eC$Yn{zQorZ#P#19k>?m@| zu1W9w=Vq3ye>NvzEsD0Uu_bs-IwMPL$ar6+Flv>4%XC!^B;=B*$&m;mWIG3N8Z~t? z8}XvVVu)shCLSbuXE+^;C;dodTP=29Yoe)bAb>WOCkmd3- zOLCV0NtzY_FSUnP07;_xu;TLp$!Qtn+mW>1e>jUtPaM~I6MLET1c1wJKiD#jJrHAn zYT01`y)sen0{Z{spPOSafV!kX+RFfbs9fV&Q|z1@r);L(b!Bx zUuFO~(8E3VF|X(GR+v>$gL@?l@(5dIg z>{jZ!Oqi6K4^W8dU`uy|Q=5Q@1E-;MAW5VycWzV5MD|mzH5X?C>fFis5Bd0YIb`UY zWZ*Vm<|HlbUH}HP0*o{=h=@n#=K5+SJwpCK)$H?=w}=Dwt9{8VaBI~C1)ZdWcpSXP zilRwg2hv(qwu#d&Q#OT^i_KD*Ky5q#OnEbaLoH983y;W^4?y(;c)`yZAPg0H)oe_j zh7v3ZevrgRYJk1;Ay?UBrtT`j3HLLoKdmD9DNQlbi${t%%GB#Kbye3utlxFI9S(%6 zyFNOV)&pr34_NedL%bZfO4`tT+DKdzREzZWKyHp2oOx`}ST6|dhuwOdRjbLTAs-}Y z^&)*HB5v!@r|<5g26`H%_&c%YS`250**(QeTVO2~6DPS;oC7Kh+*L^6i5vvJkY;jJ z=UC{oj}O>N>&~G-bl1x;qWEJ1G=AOiYy%2y&w^N!T3F0GU@Xb1dFpaEpuER#)Wf$D zse&l-S7b&LoqZI_vb#lp68Sr4k)tM{vZe-c5ZV5#e87#1*H2Jx9+V}bsh>x;!$m2O zLm~hk0CeP%0txLwD3JXmpd)!2Frclg9IT`zHwk(-zgm-q4LC!HpyVib_T*geJ5jj$ z{WUbp7ZDVLUwjRa2Drq!2>^vo5JC?j{^i?CNO-!2OCF$yns0Qh#?egY92uREH?yyc zh$8I$)>IYCBM7_P`^PzmKyNN1DXUHbPD7jH5X;wqcz&{Lw^;=*T4pF`8Hqd3DXo8m z;;}H}(yL<1GTQ*sbB|O|6ND^!IP}+^jPHHYFpD!d@i1BrKExjU_PLXOK2ZXAeI*-e z>uq?JPhNd?Cf_+7Rh|J)dfI9Ta=4p^@7#&C{b(Azz)T*9)9 zr#u#eRAaKStQU8xy)*k7g^WJ^I}WOu%uh9>;;O>GMvA=Z&R%_I!S(X&?@2Pt4*^?W zR);#+{TTw}3n-x(DxBfnhXUpBf&`=;AfCpST_k=WxmXGjvDRIZyMF`Vz0JB3GIew_ zK+i}x^|nn{$K&W9x!Bc2r9W=~WLpA%zTX6TRWyY@9Z280GHTdi(W&erlQ2^=%jo`j%v32j zQa{TmDax~3Z;^Q)DJg$5>q{zN#B&Bm^-8h|?=u{(^=U-wWh*|?c-9EC0S8c_>{Qdx zqh_6)sIY?Nc}bN6uK>fa{dL_}q8uhIvQY2EaWLiX2j*g^e10v4P0fSq=APLn2bqR4 z{5!9v7+g|wO8+(&Rp<%)A$ofE3IVm}pHX}5q;QI!)cErG|Bm45!xmNb1*R>qBOx!KO`9m5*6(}nI}&~i6$)O| zG81Io&BYpcIQC0+qpL&#*NuVQNF*y6YlYTkO%p_?@fYtvj+9Ht9sbF>Q?n32lnzAh zQoyvTEoQ9YkoPD5RFxeI%6;Nj5pOM|$X`LcGBN5wd*H9z_Y1|AYSR=*uj@1o6K#dB z4c}5-{9lWPf+yYxB(_#OZc~c?mizCbsr*We+FA?l&pI1;{~W2ds18G97c&G#sa$3% zM1B1;A;e(G`GVD+6&eepZn@&af?*#ALeKK7iijrl{dKj+EqG zpA_BGPX9r1-@YRYNY~4M-h_j{D1YlDA3}hD7(^O#-aQIY(3JZ3I{faz(Iql@8QT9$ zB_c<-LG-z~as|c#)xdt(+|h-K#U_S)2k!orwli^lahgcrjd5dFZ&yw&15vD}HM6Ye zU)#j=fUJADIDJH1;>qm+UKxI;jJq*`XFqP{5;`8aH3+ib}QbuU&p8fENXZ*3+I z?JcQPLb;J9FTw)L8}mrG_&r}eGzbyR*eGqn^nX|9SO0V#0Czlbh!hp5;)mffsJ8=% zl=PUcD$B1KZ1heFP(E}CGmZntj6*%i?nCf&U-^MB*;c{^q$g}IOrclvzChN{0U4PR zP^Sz=y;@ZeU75)0t0_x+KqSVImjEZu`TrNN$(j9}gay9zn*!OO@?7L>8E0nvTjir* zh|wD`9H3Qt|0W*PGHC={cOpSmhE~=}eh=J596-wZ(0ev6TjP(wBl?tC!JOc}8VeU- zq=8Y8w6WsjHJmPfVh1|KM7c#o#T{>w0f)lc4SI{o@*D@x+9(dQ-bet=GV%!{kf<3@9~(Yvns_Df*1X-z}&0&*Zy0l-C4bd zOxjT6sd}F)4>(Uw*Q;}>wE2gZz;E`HHni8Q?GtmY6ud4L|EM7OJvVEoGY--r2)zT8 z3qU(>!Fix2PK3V?{^2Zm1&$+X_lvm@Qio+@*`F2GAINOdOnCsvy%Mcs8wMoA9})ua z?8Aiqfb|<{Xa8#Wb0~8d=y9N*dPe={`Gop%z#m_t)yhNcb{mLbkwYD{#`RzG7lqV_ z0jf|l5HfuiZgzJ_{E8aSWm-eXSU@*VG>{%^Yz=^Hnhvn?ASlaSk&zXb>CI<20Cc8Y z@3wC}hg+EpHyn2Pd7xE7@uGP2We?7PJs1PH#b)!x+YIRT%BkWX@P#y#pQnJ@s6QFC zGh#cZGouzZ>Ki}NM1JRGAcu$DWvN#TsWi12dXGhEZf^AUi}Sy3AmuMwn@rLbNtY(6 zpx5Z-F3X?+;5;0&gE7^uKb8s%0}Z19SLy(89g5gmYYIBSg5B84#R$wJ)L3ag;B`F1 zEkH3L?+hZMBy#l5Mj5cf99gYdOX9E_gslNk`Cdw=$;W$&oBr>V`bCm_#%OzQn@vX? zvQFE4NPiWm1>*jHCYkOp+Nk>A3;Vxcx%Dd>_?xO!Lp&Ep@@d%sIQ-uHNV=gKkSXD zw3&(pA~KadJOdoaQS_Kp{FU7h-&Wj~EW+hs1)U1078NP|)(8zszm_ zWxR0G6CkC$=X+oIG72EMv13_lIV1fWfQ6&hLF3d*$I_UUU)ib6C~~qB2w0Rt9!JHw zdPNu{{KEq=$QRH49w7~~LM*KW2o}zU-XVNTAfeX3H=~7rz$6=I`lTQEnlqe>mp_2hfUOFR9mj|EV$}KcA z>vtGy7Vwi563D%0)3434d%f5D3h1sO#y$8~FGZ-ryXO(MXd3A~Y>-@iZSOl>m`PBDtLB3-vz8X6cAo1AS*g0(Iz^DlQQ+G`PpN8 z0}U8n!D<16bn6h4;!l8lOJoZrvHykz6kWO*spGA(zG!~ujXTG5VJW+8FJ|Ech~U!z zG%$?YX7Yhv+m|p&QaauMbZM?3xI)!{u4xdo&%uFO@ylfRlZ4hiu*FJSbsCfNs`RFyyVBlTn8^*5z%D2V_@XY z1y3-vzUZCbC{U7qk~z8c3INW6uU+p^11fWXHuxeci;=4s*;whQ?Rv2)+*-1K3KWMdXjTi)qk8DOF#g$! z7neFfM6m$f3fIijQbp%&o{nBdUrry)(eCx!n)BEb#%KaWkmChGu7g^wDm27M@!iLW zT-zr8y<>h6%EaAzwTt+mIU0ZdB39cr_m>X^UoR46B3nz68N3Sg=O1#P z{(LFB^_0I5%Ul4Int$D!6uC46>pvK9N|hocE5TXx25VbAaxbgl%?ER=I}~FEQ19i& zi=9tLyK^E3&9|W#;8)_`^k@*KbVBBU~sZQTUPzdUPv+ls0jUbdiW=|1$Ao zsTMNoGPYk!0R`3w3+$L}3oCEAV*aqlE z7dGqmH-{9-KIazcU<`H`I9g*`JvxeZl%@7Z>igBRiRZW;+CA;mKrR88;6t05ki-mr zozu=VUn+sx_X3rRJ8L<*X_vG~ZWNi*s;u8@K6?u~&5+t)tHNvIST=(yvO3rW*})?< zj?lG@iE?QfaPngVPb$GrDr*${Ik%-CESr~Zsq_)Eg#^|NQ?KnUFvD{i*>`nn`;Z*< zMooH(nf#6PFCOP@p)A!m-+(lQI}rHoh=LSwH64%buQ?T`k@;DN`0zTSjYx6Pt94K=51iMw6n>WwU4bzZ2BbZjRDv?XXH=JM z-jmv-JKy6LjMF7UNGok5w2g?<31n&WzbZgRVsQCoR#Ds2>A>qaWO@0 zQg=5HYV%SVaaVfg{c3)DG}$)KGU#V3vuWeVCK{mOr<*HTys{D;AXXdS_y%p%1CesS zv}V?&lP>GWiWQda(OM}`0-we4*zNE)CBMl%DI2F{IS~{2+1eG6!=_xjGpEhj+U|>R zTUSWONbPu~|2U<(i$xAm7x5f7p-9)!%UVm9JzAV3TNrHhP^M*=Mc( zXxDWrzgHjMsyUm`RvXB7&vnLG191sUB)r%D-sEdL#Zm4o2fa_D+a6UM`@K5Ox^J$g z-k=#OuBp|zY+JW=0cMO>ri;~2h1Msb@0<)M`(0#?vF2kK z>b*1LUL%rF*WKX_iYm2Y8K0EJZqFj&eDH79-g_o`QB2b(bdq4C?^e)HI%)#M&e{_^ zH)~?hm2r=lSJC5ShiTGS05oO=k~-f?;+RL(xai-|B&}bzhS&0y-YyJJdAn9fCjC7;K9 zwMyqJ$ML@3cL~>Q;%R82Xb3X*ngMBs8Z;EZTiG{V$Oi*WAEZf=`%1p7S{zmv=l0FA z>2Z@JyP&4W2xNOGj)=Hzq?x+RS0XgzZ6bR2K-X8pS$w$v-mLZPLEv%hjR>eeU+K2- zB{M)2oYei=?A-1;F^C<1p5ms^%bX$z*i@p~wKBZdmk3u~uea`n{naaAN&2;lBTSZET@Ckw4Zi&1>9Gn z;G#q^8rdfcbH=0_qJM8npunoGg1WOA_bA6Qf_4U^^L$T%)+>Yo$9a2Q$GC-@Kx>7B z4mM@}ojLrWCB1vI>(Dy)%GL{fn8;mTwn5F*WFYCEZZMp+!0F^Zrk(R|Doz= z(ag5V)#Kb&&hg+~j`tEG4$D#lG}-ZGAXdKwaUrGWX6qHrmq-~~3?TL-1Q1L#>HXge0GnYcwr^G|oqAYcTUA@;Isx?tx1hYl7 zk({O*ksWk$QOvaAb%DA$9LoAR!3E4()G{ylU)z-+aApdZ-hw^HieEf!q2iOhYp+KiDRUgd+LNESXcY86YP{0A2s ze?B=&Ag?mDwm8v1J?@8xXJ1vqPD6)4N8MaNs@TY;1+5TOD`GsHblmu^JkpU>_QJOU zpkum`7j#G%`V$7D561@1KaG3Xq5vxQF|uqHU7tDzK@3h6X8!7PfyK1wYfhT+?32?x zZC#QXkoi*GPagI_1ya`7K?iKd9%m%{)-L$%s>e<{Rhly1B;2YQ1~ zxH2VCShPyTq4ID1qBKzN3KVVM|LWFb6(0*)P=4j-ggeF_`P;+ypN6oxF0}?l;mig> zIdh@--18(z*KB>a<{qmeqvX~H*n%I{-e&VUl%|^C50)-B$lVsJKdh{zjM#+~IA3UC zOu4U^ktv7K#+pU461y7CyOJFYa#7&6p>_R7dQ#wZ+aIKcS8yaA`WBJ(GYU>(BF%C0 zb7q>zmb4m;fiEo2LD2{5T(p{tQLH`AQ*+oW(D1P9=pUY|B_V1;1)7o&*2hcIY!pD# zn@9ZpkDw%VcZVnk6F)e&^GW>tSw3Kq_IYA&Fx-58(gP!@NVFZKbm%!-OD<9<{{SP! zX)*LAQrN@3nzSlXJ4QWd8M>+4Z6qqX<5$HvoJMGu%?_mqPu{?Ptd<)|?=ImKQxBam zfl*%;zxQSWO%2oBFAhj49>96M{Scqco2o?s|9NfXv)kUib(5Gz{Xb;AbySth|HrFH zgVNF=9U>v!NF&`XNa_Y8Ws_Sn#7^91psg z=b6vE<24wlu0H8k%+VV@)fiyr$dsv-T9snq)=JxuV8+g5f)u%GeCqg#7QR*(nLHP`>#(*p+I&EdV8 zFf{x?g&k?2x)k`GQ}C{_KZYM^X{jT(EPLR3zA@ih0^V?Mjj2PBuGD4LDk5Tig2N9^ zt7L|}PuXkaX#)k`5>yd(M;svzV}R453cdH#0{Enrc~6qLA#r1{XP-G~Vg`TMnuBq<+~B5eXmPdfR9bgU9T$bpfCU~Q+=R*NUN5n2^b z9k~4(VrjjGMOllq4l|nY@0Zv!Qx1x~m~l-fYb)}IE#6Gd#XY!r1rGw{rkPi|Q9 z++qcPs|H0FA716)5;Y2){#0)u+ytl2?bJ1PoDJZ8M}k8}enl@x6P381)Y?iqHK}Gw z>rPy`fpiPvYCN#$`@Ts8oVXo&+khqi2P{vFQ2!Kq)b?vG*wq~K;ghg(H2Ui0+~9r` zQzFyGBP@w;W{9J)DleK2^Rs}IB%lthMpn;yQ~f@+2?%ly?MQ@q6`KuUpOpa;*6+Ic zz0bg+K^L(z5ejev1qLc0TBO=O-#9tK!owQnt)~}1)yx5-W9zahH)gGITQ;twN+OR< zB85FV?A?()W{(B%s5SdcotS-V;}M_fw2LUlvx}$2fcS=enr$t?s+mg_Dups*vI-s_~uz!cgCy zWA4;TBd<$ypi#c#{B_clVD`1&@`^oT>dQX<(|=1Tasw5SWAY5WUM*W5hQMG66^;0S zh4J+HND4o}3j-b9pCFh)2S1BVBX>GUy7jobd+fmbbGBBY_O0?1(4~hxM>u1a4rIPp z1zN?-AnZ2M8no0Hn6wzrVQL0at(?x=8aN07$Be6b z^A;p~6_&ie_DgGsIwmTxy6j92ekAXzR!V}!?EUfsMjz8LP%XwdBF2#i^$RPWuabCx zAxH)&TI(^w8Hx^Ja67u6vkHwN{L-g@@NvPL)|TStncqx3HAcXjs5z;-<423PlCG-} zGA@v63-JI?sFLn!xzzR9UaV`i?5i3N5Pee1nV`m!s_N^hInnaBNYAeA+k|~MZsl1X zOq{FPcOhGf-2yeOf;r_X?Uy>?R;jr*HZSoLzs?8pJY>vpEzyem=9wH~H7XhUyXH=^ z=RL4rX=VZx^+hB&fMp!Gt_d)M7RjcxueVyCF3aiy9ee)kn45+_(uB5nD#jy}CmMgc zInKexDpS>$$gF|0C!s3|d-+OzoqI^i#vzyULxp^k(5j_OBZ@!AK{D}svqj8d|FBzCe?Da%_1x~1cB{I*#8D0=Rhmu6eXz~$x@Qa zS2BG<4->fPGOo;9=!!T>aZ$IYkAV8AZbZ2%JY^L%LY=6Z!J1}aZM!2PbX`!=ST`il z2c+E6ADN0oPW^AkA>BgZ2cDXH-XM<=9oisu?nvD0WA5;FD+Y1SIZU$l;p<}x1 z@nlJzdC8}5gA6jWpC1m|>bXAi!R^NOy6639Yv>?th8 zt^>_0Bs5)NkW}$E2(*S;8GWQlZ!yNubeszek|Wq4svG}aB+OfdX(WXK-1l$8D;eCR5)KpnJ&z~7pzh-=L12$L*Q%E?{vJ=%L zehQ)ZvtmA8dzlim>Yu;v%%%py<8%?gx8U<4tKu;_mfy2_z-_-G3Hh_>)?})A3?)+} z{ICpccl8=dX^|~#2AW_e(iz12$4!r`AaK1}ak^FSCyDkvMkc`o_oD^{(iy($&WKxh zgR#fYmI`qi7GSiGCSHR_=KD{PAY*|lX_7l$eA?yeo9Ko7U0wKm6jMzW8q0-sB3%)G z2c?WOVI&=9e3_GuU+QN*m$)+D-@kG(%FEKoYDq%=yOJi9yJ$+is1T8YQ`#f3E+j#QOlG| zT0iooMnUR8^31Nx9SGuox6zF>&C-}_t?tbamu^tcsY_ZamCCCokG7axw{(5^gKGL4 zd4Xw9*f&L$RqmI9FE;2OhSxe&zNvIBg$h|fhFw3nM4H-URv#@~!bNmx&YnA?W;a+D zd5Be%9@#Mo>5{^CAuo=&jlm>K+Mr7;H!{3&B0?5B60_atQ`n#1ec^P7U?+JT>|)?| zI_vk46LTZ>>v@ZGqvjp6FJbFv9@|9@WY;-wapu&@ianBV+wR+-jAB~y!|qHSW8>N7 zx2G*allBqi6fJQTQYOzLl?7!PX~kgo;`dTw8;FY(DYyguBao+0rk<4;p50nYb_Dh4 zSI2>DiG)t0^y_f%#tP3#D#V8dWHutXh?k0>gv}WS*)-lD3Zo#&-FRa)cPE^Jwc}{ny#}j|r8(uHHpJj+~8I>aBUstsm zF-rZ_zqQ!f%KT2_>(DJ+2A4YSeh0w|M{CV+rLK-e(MrsfXqDomMEm{R8{VPeQogIX z8P6yTT!)$b$l=AG`3|WE;(yr0W-HI7h7l<8Zn|+|B&z0v6tyImM7Uqqk^sCtU@l-& z5u|pIg;`*fdj_3=d=Ac#VlOxEyzw|(YR_<$uC%FS=E}qcE~;hGdr$Dk#G8P0Sx**%}(8yB`U5%pyAB$b|04go#$r6po+Vk^q0hnuf zn&rLi1-q;2X|;`9vpsGvH%iV~dPPn;gp2kRHclC%&$&AIUKHMrUQy&Xsfm{2gugw!3#Tsp6ztXui;VZ{4c z5D+0Pt#bJz!epu9+J2RrniAZV)F&i|p@}oY#lxk<#3JJ_sPy>_v5or;ufzFPQ1u-Y zbdIROAv-(lXbePnwYk{(YiQZ2PdQz8Kmu|qOtKiMSf`x2pu^16K;J&%rLs^rQAeTG z=&`k~#atz#72h0L1+#M}_>9f+A&wn(L2cedEQtLIb_Mm<^>tu^>nc^Jx{7s7ih|#7CX4*%~#3Czw zVoy*A!DL~tI=}Mx#{5#>$%Kr?wH~Gn8lgcX2UE?cW4```Xf%zIdswSbR@J2Xl>da7 z6&zHzBJxrj_H>x4r%U;|_e(CKvO>gTk}A|M1&SO39<3_;Mvk0SeR1}f-J2I)*p~T zZ2H7;MsncrPY9t4@Us_2=_$|R6zkJ~y*CL%ik>M(7@jaTQgDepW^c){iC zb2nN}NtMceQ1mf)1Mw}GnproS)Wmc8yGuB82nI@d5OH><(ShpT!jJb+y_oIIHlT`% z(9J%nQ)v-KA^c-U(hL@pn-~~+^r^r1XPzkD9XpA-YoYXaid;tdqZ$7jr$76a7Nn(^ zrusq>x-?;zl%GeK(L%(d3v7&>#LqM%H+=d>a=@|6p^HEp+Rgw)X4Ec8&J{9I!jwQ$ zDC^3a0}8N^iMsD@r(f7hI#h_@xT|pgZ_mehDH$|*sk#b=nJ@!ClWb;$B_R79%;+MZ z+k!kmg~xq7oJt+B<8U{x;pxhyDUc0#FyjMrgX4-hb2vB)YnI8sZR!Ng(n-pKcBP_Oo$*okjj47X!R@59nz}b0tT_xcCoxd zaF2^=;gVpBe1!?wqeq?|nOdG3pDJJSm4q;ew;YF0l{mFvgld=0+L(xz&h5(-jMsZg zqwUzEP}rV7d{?eC&L>`Jc? z&*W{Z$L0&7UwWoZL!NKoBM^xITZw2+s-U=(d$%MMJ4UJkwDLmaRF2>Ipg4W@Ha&rxXg%v zNm^??{Z`QSFzP8~PBUtFewmQv(iP=F0OYaA+-hfI(hWSC{u{&xR2GgkLOG`c3a;k2 zJI02b-b8S^zUlOob7t-KtO9bCZ6iJXJh5dm45!kzsO{54*b-4GIMXL(!3#iQ2=8dH zKU>O3zAFzNch)}*$5Q264NJq(ls+9&T}ystP6Y$y1B}p=XaXV2TC34lMjl5}!u@<1 zDKzqEp#jYzu)iSD?Eo@W7C)j?E3Q)u{+bZM-;6YR{8#0AbMi((uW#>zYg2m%)uSV!F^C z^0UPO5gk|mBN7uEnkm@-NsYH@Vh?@(du2YX1vH#x6!Wn%g-n#hQ`^$NZrY z)gTa>2#()7)q|ZO+$bb7=s5=J5$3^{i%lCCfdXpxcSm*(8Mi!8)c%A-FPVt+ndf}Y zF#_nox8P$uwR%|d_>NiRV(C$?qUsIsDx7UqyIL`TVNp|XQe#;ls>)CQx~)@`nmQf{ zj|N`N1dBUVm)u2{04X12I^p@-uECx#+Q=!?Hut9`ty+C)qOF-nq1>#KCa~|Ht&FwW z&9bT?Q}UqPT9jl^tX*O-ttkMZ*3`hyny#@);?8#v1|n$KQU3SS1!g6KqOGy&@Kqb| zjQU&?hhwZ#BCEhpyV})EOoTR?LF09=VkZkaX@z2SdQc0vK0m>6KKwQw0?*(l2w9oZ zn`e43cFt(88_J#5r^5smRTsf=$g*Vel(TzVd;o|x4B%(!G>-{=5bz8+6^q@=Iru5R z$A#TIG#8lhB?DS?3eJ=T+p_*IqW2WePi38xb9Y*5;4%DW_u68Nk&M!a|OM6vwD@&aq$?wt@dxd-Pl>_UPoDI^)N(h|LDW{Y#|>5i)s4Rfo^U>(yJ zsKXu54L%^^Rq7EVX%Vc^Cs^@t5F~1i&=cveoCDa@=7AE9B8sZivJ;AQ63A?Fu9dNM zFg|=@yL5qi@cJcd9Tv%fPjtTi+Vq^VYXZsr(if=_YBos+k_VMm3UP2q~5;$_B4y>&{}%@NoXbX2?D{1o#q$K6BI6G_}| zmxV1a!uUYBj6Lw8#jO@KoNfL$1Q4=aFZr8dPoc8ynd<%LANE2Jn+ARQAWn6y|0Y>g zgusdn*i|pG@}EOHTpm~OWW}mVDv91WU4q0J(!%>9pRckP?VSf8?8l^SVDAscpSeT@ z(2A}nk|3r1^i@s*yh!LSdaa*Af7s*olPmd;KTAhYkWZK_!+>oudfel#n!u=r-4xu$&a!}b1o{-S9crD9 z0nAm7IoEg#GT5xkJ#zc&Iu&$sGZo`5} z`@8So*$kpvFV{)u%e2f@k_xWIbi%BP6mUj+4rL)ER%2{nco!X9JpA(GQn5N$(i` z;J+LCx-Y^t6$|^}5P5$p8$YjxPMPdD8gSnDH`xg-OS9+u-=~qpaZ$%BX)sMRKJ!?J zK=)Pnv*gUId^sb#-&^@wk{DEmS@9B?=4GU1caC&7z0v8;l8}7y{Q%Vbf0ARFyul$q z0R;#GBC0~f;Y;Xwu*)YX%2zoKLBoEtW@$t5Fj!R6T&w2dgAuRR;bgC4;vb=R>A#3i z1#bfEo7R77ZU6Urq{8uL53AO+IXxcg(Nkhx;9VhYBt&x~dt?gzL8C&H+Ay#>aY$wk8UMX` z?W7)1{$kJXWd^PD+5&_(cR+VVRMjnV0Fa`c1sy;onXEdrcxgMwH~*2>jKY^lp?3IuK} zp9|c=RyzfRGz8FuR&|i@@Qa?+`EDx{bqawda?Nc#KnXx3k^uHX$3-=*H`FWRUQ%!4 zo{|H6B?5%f9{4$qA;MC+`3Msw3^=KhxSfda3$@?m_H9mbg23L)lh&O&!u*VAvyKtu z^AB^^#%%?h$)}CV;v3h1ofWGn3$yrxOJDm%S`LMjGx zMBt`-E4X8rWYcdA+9`8Bq?c61QmBX*)*B8&@!vQ8a#C~eDeB! z$UN~JEItaEYEjE}(bp~zp(>maBZtp*b+3B9C(LBa0G^yc~AuW}mJ#!##uAk$tI8y4gmPqshV zNi*}9?Tc2s^zuJbPD-#k4 zswjV+HF#@koHId4icmC53s}9Jl%mBj4+gyYouW5@YaI=Wsj^_Nap>M(ycXqi{OMhd`-gFSXeF19S)`py>gr zcC=c>P8oQ>v zrl8rVo2%e&!kGU%vT@KA?>Tt;3z(wLcBY`SJ&A9#2;7 zQJ#PW@q<-i3e~Z(PT_wGBAvc1kmvo2pZ^SE9aKKznG0?h5p=(P!|5PoUCyPzJobsA z?`;PLTa4g-UFVqEsOX%@EQkie**l@qE1>Hb!fHc}6v~P{H1(VvS1zD!r^OW(CIJ2u zhKT~rms*B5z*$qgi+{{EZQ=cF7!Zy!m=$hqL0!Ver;(XDGHMGHc4I-2k+|^c4(w=! zl`tNbLCTv!x96S5In|g%xb3Uin(0^tqBv0~Hr42uR##_x5Y3*V)w)aI8k;)lfTwIs z>j436q%UHQLc-gSi!UYfWWbv&J;qjj_ZO8uFOS}^t{H}`S(@glxu#0&NNv~gqh3k6|kbb`d&V5M^g2j4adD`gVb zVM|bLwxF*V*l}j4yK+Q$ua&(GLtc-3&his#3lHrV7qi#6e4)A;$!9$}nI0R0UN3#r z&pCjAdX%%ZUIlX8q|Z$_f6`ez8#$-3qma_ilRMyNZG9kDy#+yUPXD-qi|(x48T9*BXZasI#3)ZP=0~l$8>)e zBBEnsD5CfogAwNfsM^BG7n%H5t)%zc+4tY=@_?*z;#F<~OZP$i!{@EwR^D}E31a^a zAf4`>VasjclmtJ7_h;E=av^G#R*Z_oC`Iq5U_w1LaH5fyMc!O1)|biUh9pb+%jlA0}WlR{V4jeyVj=?U{b1VhkB&Ibe69F7ycI97K_ngXEO1_v~wXADUVv1j% z9~=}6D%|(y>LsZ{hrqEE1_3jA; zVaIcJzIHP`HiS}g5aYpz26%v6ORO#j@slVmHM%@UcqwA#p4RiX8qj+90QEB_|36+& zxUH}FlQX1l2@7xWFlO`-_>iNN!`4Z(?oVhG35-c&5Mpryv=y1fb-_ner?OW&@p={ykV$mv{dnP`kHcr!PN zGyIEy;+L^(HZGA@2g@-G%*M=zLMgH!y`yc8yK|$Kz!)ZO?5`?8JaP9T=a3`2SxpCpgnvMjP)L;sfEI za7B!mP8zw1)$wL#M7N3|hbtMz z5NL=cr|nsob9ozGfFOUZ#y@PYU&2pLf0zPNF%1$Fl@tfsCZSG0IC|nI_{)tT;WdoNkCa zM_ezl{-o4?{rLHrO--`)+$1SSSAfsKUBq1>l2 zA3W4F!_y%BD3JuUVpn~N7r(5CLm3fv2Q*oOkNb1PY>@t1FycsPu+bit*MrIl+KzfQ zyfXshOgmkrryr$G44rtC144w;85zdImh8@#khcPinX@$p;=d=e4UQ9 znsY=mI>+%-;}dBh&EGsYf_$o!$kk`R(gCPAzk!g+%d7lmf3Ch#Q3eU^w=;s41dp!_ z7+h$ll;8eTJ-c8Y0)mWhIDG!Tb#F?PeD>D+r%jT^STd{WrSxwU$#i}&o}W_g`{r5xy*TR6c{a>a+C&}iw610MK`W@A zN-Fk+p}=mX{1=WY`+f}HH^DFj@lyh!5hUjqd{R4qAXclqX?I4i-zX6^7Qzre&uh^n zQC+J{NHZALRE_7~c%3FRlrEF_?64<4)}i^aA|ZU=Z}>yvT?R^)q+I)J>sGzc1OIam z(2b5NP6A1)?Y?i4;JM5e_eFl|>~RbV=*(ejq}=b#LSif-esasd(>KA_;s93Zdkp7k zh+UCtgVWYeLNdD`*tCeW1Lx0Ih)$xQP)ss4T@gjz11V|ziuUh~^GboL$aD{zrjncW z`6`hIsZX@x@o~_ojt5>6i0|!h4vo0pz+-h&V9j_E4YNQrobCRYS{;M#xFx>*3o;jz zdTFz&RUP7cQ5TdgQQ>uTSs4f3`%uI@3^5tg2E=^g_6yXtZo!-b=fsYOiMN1*@N}7p zZz&-P6C^S}9dsiTCf^dyOB&imcQa0GZ{fO0W|fo7G=a8+TMVfq7aGw}+iaFDkerK3 z0fI*b@TOgl>2=GDy>CYs$=vh^26F(SLk*;W;+ulBI49ELe|)OZ4TJfD{E#Lwr&(ZL zQ?zn2-{|CD&~M!t<+dix1En;D2NbRh%Be-Pc6-%R%%?^%>@mJBRD~wr!M;z=rwks+ z{RTeCsrC@lT)E#$NbPw&%z=kKkPuS%A>YO^3AsC2OM;YW`|YBV@To>^*XEWn;(MZ; z4#vqt{IEcioheu;;Y1x`^snV_kMUxg@6j9z6i$+)(AaJ>u0mCIk;pv&Wdqo{d}|k> zHDHLwB&n~p>*+!%RFLnzS9XieI$Mw?<`51I`o`zdOw{=8LFl=IRB{Ou^P^sn_{2D{ zewX{z(;=D%B<8A+Opzsp%P2(cdLLNgfPe|iZv1yV7c|EmSjJAn*@tiSfK+%B5SYhR z7AoFF0Ah03IH<>=2eTBV~YIl_=x_94dF_TaXJ=%K<>Z z+%@1Fek6FTq5DY=jl#~_EEZIrUA>el<8Zo9fg))llm0`Hs{IPB-0quxoq-JJh2NmSgB$+!RQdnl;C2OeGb z8vg63!(<;mR8Z4Y3>5^O=f5Z8%Bhe#5ZzbH=|lQQx^1|U(y!DBf{>$Ovl>E6OsL4xT3bN&*X(k}?L9_>qpDO5qm@K1 z&Dza|&5&@EjS=&{fGT6b&v1bzd^q=K_2UGxLU5OvR^gJ{)+7;io?Eevk_9==utr8O zPnNvpq%Huok_zdz$B!}vV?hf=DB=gIUvz%zdFQce`8QI2m5it~6)+`Xlk__qW9j0) z)>o3~M3Qa#)tYUXsRxX=XmI~C4FmLftHnEI7Vd7(TX{T%x`5>#i^sXThPJ~qw{!SR zpRUeJmu^#}s;1|iu>Q=}Pp{T1cq09bpLk;d1n{MCmG1z22`9AuFgdjRF?A#lWKzLm zICU?d49?P|@`fqkqFz^K9@+l*fp`$QWYEU!_1LCpjVfahbaji~AHhW?3(3K9^lmmd zBzDl=pF1V#6daxeWn}z}9>ZWrH|>f|*qjC}}r|un@Tp-ibE@)&3c2T&J5+ zeoL%t7&8_PDbY_$HHYOoj4P6;zT3Bk|64^6FnUKrg!^yqE2vz!cERs`BeIQLH zKlQ@%LquvggWZf5Ajil4)btj#o!9u)I`ULAV^Z7RqVp8D)v43LnNIoS&cHwaMHNB1 zB(6vhPO)I835zaH4(_4lgq(0^aYI)mzQ~7*Tv^4=sG?*JQ3$*7*(#fXXFLnJ^S4HD z`S2uXz+=+&cer?eL;=jv4N(xH8~;EDkY5WEcPP*hN8u|5uGD@RJ6!IxiHeUwqTR$e?N?7__J1gEyvR~bdD`2y1{CIVP!s+D~n{^Qz#=%<+TKzFs>h4x@b{& zhocK2OP5M(_P9#i|HEg&7fk5=dI5uispHP|H+3a`sc`;vqTyYQ%R>*dFfzSnH|KdA z@2}|nF-$Z{!-H(iCtprLYNv+Ms6U{RhG;kM`@6Y3`6R^#10oub@P)DZ^jT}QbC`r( z*(jP8b?QJslBT<$@Q%Ig_*h~1D6w$gociAzDH42VfYJD6J&5i`<~Xj%+Xo1u)_Xn( zLwf8juVWF9h6FW1%Z=YexD-wslz7mSZ%Z?jW}vq6#bvO4fuF z+{GIyl~aN0p28L|U&{N+L;bo?D0rnA55tjsyYAUo&Fy&6!!QkmN6NgO7Qa20yiv@6 z!qHu@_r|>Jy%HczavT@5?EcR0j~mHGKpp@(Qdu@KgNKUaj^ZvH;|79M<62MflkJMX zujmp>zCrSQ0Y3%0#W1lH0f}Qv+Bzt7BJu#}7GD7YLnoxS!C6STjkK;`7F$pqG>+db zG}YU{T0xse-jRC4f1(*dD4qCM9QS={eK>q_@^6<~o}9n^17ct;b(3SIA3!g1RykGVCs1_dNv z`}(GWDD`yF2oB1!4|dcl&W& z-p}4CX_ju`Q$@mk{}2b>*3Tjzo9|2c>8nBFVxm@K;U^OVeD7cLrSi&GJWFU(&(#!g*|*lT zPeJ@6^swn9;G4fDC@8%0w%0E}{2W?0S@;|Lrmui)oyWt!ZEP@;r%D5N4>=!~xVX&O z2h4$5YyVz^@L4=Gtjx#9r$Dq>%@8+=nD-rOnz|aDh{oBrxbzeV8{4P z;2hieg~CQMtbX3$9&?1<3k>&A_rv6P*(Lnm(z?E#sS#x9EP$_bu_htIF*bPA83L}s z;S<5id?3WKI*rmzBwN~WPBjmh&c;h@Fb(K5UDEnU{jOqs>tiq&-+`?T^fPbYxxWXcGu@rOQ;@eu7a2ujbGPJawv(avEH1pin6 zjudl1{Q08b3rlqUzmtqZ%meBf<5xRCEHypDe)blJ-~nD&2aL)pAR1*Cbac?^`8$1S zGtg;qi5BuCx%mxZhl=;}GQ-vAooBGjS7>A5u>lcr;$`p0?SA%>S?}f>s(+-3E~?1f z9r+ABhhNkoqKn-v^0`d~8JW>}XL5pplEiJ5(j24#P8eo_Hif}yA^hD7>W5VQ2;Z%p zOlg?`>=HJnUSFPaM;l3qw$$P+OTui=xvi1yT7gD~vz+1qo<*=js!EHg*63ZJlmm zplr5I9tg7sb~S%z28=j3o?foSaOFwr^|&cX*D!bv%LsO%2}VQTDU-)PcK z76salEDHuEkSeml3wNDkX-fygyicEu&i-^|E^Dzq61{8Zr&Hi6R+zW@y)WCGsV>}? zA~N8Z{L~J=?!igo6M)0?$6=vMa<$oqMm%*DFDt#se#NdN{T;OsJ}?w#*W*Y1GALjOKU%!lw)^YWO|jL4&;=z)#;wC6f+RjS_26YPRpaJzl(Rb+OQ2l za4VC!$O%$v^O76#H!-J*i) z@Y9gDklcf4$?MY{%h_}9M=0Ay=p4(8vh4%Upth=LLZTfZJfU=R!Q+0jl9ZwIaUZfe zW!^z6c}Vk&X92J-jP~7KkIWJLvagFlkj}(*wg8_XhfN!zr9wCtMibd9lvT1yV+U%H zww26A-4Vh-qh(r?ZJ6>dTT_z`!;UYO2)(HwHH|Kk>z{rz^PLvQ6o778A}I%8`&kPE ziITb%^du2oBurjoqKCdu3XMCq!MzovrbQ--nR<61`F)B;S75_TUg8qJ84R)E1U2!# zs_EX4a)eNSV~=+Pl0irB%P`pLwK9n%GrdhV!C$aQbF&+k8pz{~W($BtV+?uAG~Ud` ztd(*PJL90K874nhXxS~eG4+<8JtvkRC3{UY)iyG)Ek$&?+Bpq2x0J+{JQ&#Bkv{j~ zA0QTW*GZ#^pJ);dAtfIN;v#mk6;i29NMH$@X*TL9SEER4$L8>j0-|g|1nJ;spGoG9 zk$_2_eAr}Vc1l4FL*c-8&%rrqqQVsl^h~)}stjT;BlwoyvQJ>NZG4}hko_#iBP^(w zGOBYMHiJOfVzYR z@*Z`IA8ilC+0=7NcUN!0e7n4i)-iUjhb%F#40hU@4NmL82xo_W$8A=18*{&gzv+7|I@V3PxL=pq> zLhCdZvvJp6e{`>*bV+EDrX5K7e=C)@X>E4~cVAHd2|_TmI;ti7cMqiT!N&cwv%7(j z-bU_l8Ni}#YW^&zkV|75g<7ki(jyjr?{m*$E+!?%ejp52n*e>Yzd;v1W{j(fBeOoT7q?DF)2hbw2KYYro%N zJQTKMv?3EOdJ7fqe=H<+8I`_$Iz9F+pFReLWOmF) z_zHgmzQP!2l0cqjQ#un+L?hyCo_{}9gN1R$8>3{FOZo%~_o2@OF;WE@L>9qsI*Itv zeXUhNJ8}7PUfYC^5Pow30K&wWVIFa4{owZgM$x?mKrc>nh8Q3@X|vQy3Ko*>Sr;Tx zVQ%V&O-ChRYT=R?HGz-AQrH;C5ioBX6W^aRo_kxnee~mifv^>s3o&f8Iyx4Le0Nk+ zUrad6VW;$^bE64&b6U(q zL(bt7vQnnTMEU<6l6rH>Kg#0FBodtPbx)>qv2flD2@WZ~vf?x83jy~XyX->;aGJJYA1lUNi zvp38Piiy7kcHoTtcR=U-Jq@81lI)nRkq62w7C60bbhGCIF|_|Ls`rizxScIiIo`k4 z9jd=SS)6n`1}BY$cP(c&ozlPh z$Iw0U*`@N65=TbHMkGg^mL@|Ykij`+^Fgm`O1BmX4Ies2_t_N8`xK1sBc>Ch_%IgH z49!p2`kC1l?fgw^E+@HQ%65r0H2}Spai2NQtJ)kVbf|Q-{O|y>c^$ZJYSt>vBMBj!fy&+2DvC-QoF{s_DbK+hC)9CMl#pW^N>e*(> z8)s1@BSCG4t%0P&E!b;;yJOKiymu3^sq$_qU$ho?K=Ng5q6}m>>!6@qjp3dC_Knu- z<)V|u5%p;>L$89!(~HZlwG*Cvt70GhiSo$VT$vdMe*hsHkDL=VQY zt~HVt{Gc>Yk;wo&-Ml@A?W5PWdRlO)=N`nIT)Q}SycH(HL>B+*FVkE?iELV~Mkm>% zy6ACe_ME_@qo&DfWu~@|z~Aa<4XwZI4}M1DLP;Z=25>wG2HqO)b=pW9xgKij(1Y{bGddxk?L z_DQT7?dJ+)@BPc&d{N&^ft*|sO@}+N)(ykH@}j+Z$l6`u3I8wdDFgL79Z0>Y(xPV_ zpaF*%iPg+G7AxN9-8PfHzmqN+6cUVk@DKqJRRb3CDP6Jpho2WVm00>`L~x+#=!jhl zcIG#XwF4Ge1PHt3{^~T}1K4*XGLOUdqoW9z(7C-ZYlOje@aR0LPWfA@(!H~%RZM68 zxv3@bi`Da~uNbyMG?;o-mE;OXve-Vlux)kz0Uw3uyh~|AnwFxh_TG-si~8SR_8WsI zVXtF9f;yP2cGrQPp1%Gn*hmi=3b8$yowzxpBNV3pu`H;ZQ3DJHdI62cOQ#my5)r8=82m!YIYomN7 z!^h0UI_!|iqIgbo`SKTQ3%ojeB{1+(slSeAUN25VP-Y7JqUChCgd!RbA;>)Wd$Ps` zt1rV<{4i{qLay|NN{MAM>rgJ0g(G*Pxa!LQxUFOryvpBHk4cuNE52U^C9fUpf=!zS z1Sj;G9JZNL{6l$^GknH9p?5~(C)ry+5Ad<&wSy=GKU!}vxiu-ic`tCa3CmmsY(%Ce z3t38qBE`PhsS=x$wfK^rugAw?H52-+$ZjRb*LVJAQLpAiZ;v8Y!Odc9O;1<}P+ynQ zjo*m^a;Et5T~~|WAGajmR0{ps#VD>4u2%J2C02t$k>;VBAC@9`@OuzffeaBb@S^cK zaJ3>*6A$cR+&@gV4VYkQ@3$;dTb_2l;BI-_V^7al#|m~-8J z>fR!MfRVK^>ivA;4@rK!O#PFsS6c6!f1QZ*fcsDTet~Nr(FtkfVEQ>zyQDT%swUh6 zjzjzm6o3eF0WL&U*D(|+X4WstT8vugH=ZfpTRic-aVzH4j(|Tq54>qrLQ1RETL(N9 z)opKnN}sFk!pOSLoP}-Eje4?%C;oWcj#ht&y>LxmJl+=pkkZj+uZG31roky7VXJp_ z$K3q672Jlk0`f~?0FsmYTWW4h3U&NCXzS$|e$7@yMU5l-uU417^iorzJQ&TDX=<|X z{bPn5XtmjkjtU+)Y$}zKHZYapZ#|mAPiNGEjRip7{9Pf$Fo`{RX2DPAiTzc}SdL}- z1iwml<8>jP)0;hdf5%`$x(^|&HG!?Sr=|6!zpkf;y?EeEJ&MMZ5{t!gLNzRb&GZgU zl17ST5$NAe%G(iV?a{PzK>d(?bFptU7C&~Is-?Dh<&=uR3Z7_7@RVcBE8_te1WeE4 zIBC(q6gEY^RS>%+PtqKV|H~D?AKm}jT?NvFZ`yYS4;|;22f%)2QaJM3)joh(L4$Ry1po}uvKb(ThQEiH+*4oq|&7w;a)Bv zXwYtyO*J^|byhi{C(AOB#TE^7iUVCOCbixd!jxGP!(+!rdZ(<0^Uk2`6;|7{#+st( zxcEe?v0hN;TkuxBNHKP_h@Wi9yVt{zt$M*?#F#j>MeE8zH;*BviQK($65HaJmO3@A=>Ss~WmauS90G}O zxLzC)peE_q*EFWylA6-Osa%+0Mi z#!Gbk>-pH-vAn(a`-IMw=IfpXy{!#Vx4BkP=bO6*++j$UThi^M;xPBthqjZ0TL3#n zf3|w^ciMTU#qC|WBW$8Wq*TAqGLFRSWHlpYi*Nmr)Hz67h}mFdom-FZ)Pn19KTg!x zEq8P*wlV1>ccg7O8(z6H+&ng98y39bhDe-ptGTgV0q5vV7)SGmL=o*?QV$Y^#@nkT zue@d>eVdMXU6zNXwUfca?KjVt&dbxpQ*32XG1qtE+Y$D!U<>iX49JkD{Se;ffXms% z+m92LsVN83xx?jSmZ@8U&nK|Aw{0}4uiSa@@4_~1D1>X&+8`y{H;RYCS=%W|4sMg< zj(SrEMsbcJ&O2|!MsjX9exag)WzOOK0bI)J&q8uGDWh32%QBg3ETybHsHn}O z@J2_eJ*06T*1$5=kMQPZTYDAb%|!>vU@qHG4z}$1pDksWK+9?I2j|7+nVS>;tg5$i zi zSc!V3uyb->;k5bd=zU6XW32z;)Y}N>{Q*4M?V_EUJEXtf`Yriv&u=@6ezmU7`|{l7 z&BH_=Yc<~RB3M#`SIzzAYSgwf*-yG*(;m>`n*Eao?A|tLS#0^)#vToUy)#BsE5D;* z%HaoI=Z%FAvsAR)u=K#~tW}?;^s~c$67fB3jd)~POn3j%5HsFHhYo5sJ07^pP6+a@ zohXdtkg+;Pi_sw8|N9YbZ)J}aJbRGkds?!xIL<#7;Lv)}#kO*D0E2~62n&F)94?rs zOyPTYIq<9rN-K`wGZSr?7Or=wmgb{;g&O1ed&;9;`&lTl~%&+0q$yWqNv#B@&Dqc zrccmkmie`~dr2+v(pItiY9qlPiBh6>n=4{L@8ZrUHPdH|h#YG*Yp zEX=<5S-^>2?s0p2>hO@4Q?sH;k=mLco)V*G*J`vk$aCf~djo<`>7kcrgViM9Mz4N) z^d!(}w9sJyNIokwkSPPB8Rob(`2yvys+frQFk@6q%24TQIrvZIl*X=`*z!Brt4S#@ z+E7-ua?@V$msJVb&0Oh$t4R(oO7E^pUm0iTIwk|Au|1rJr#DvPF2~ZH#p)?r*GHd( z|4JA{1X%QHugeV&a*YQX7jO1U8nteceYk{UtHzWz-V46FoL5&Cb`C2bG;~s(vjV_1 zd%y!JJ(JaSsc`73Zh5tgu`} zD|S*g=ZT4>6Eb4m!$5%hS?E!ZlWZx9In3##9y>cb;b8UUIT8q8r!24=tlGbFSOfm^ zF>!^iN`{Z{tfja_umTzhq%2?K4I}wxX9|?)5{ZXH#y0AWgmt>bHr@Ua7ImJFcWlx&S^<=daWQz6pVDV0tr6K_a57!9i%G%*shM zsN$kzscQC9!g1u-Zr{Low?E?KXl=c`-7WWL9Tv5%eCLsUSi%}Q2^1fRu>noPBb{@& ze!F5j^aUwQzisZFE^&4IpH zQ@~Q#-g$MIiqxy-I)Max8m!eXyBkj)H&9t!BhzuU{;n&nfo2T$!$`FAxF7DlG0@;) zmNQNpc>EC61Qo2~8(xq8{O0=X=hCVb3m&jMo#<7$8MDUz1%Ye>k!v0@S7o<3qS>}X zw{1RC)&V&QYU|7Jd0GdsyZRk8vQ7jjCt)^y5TCYdhxp~m^$l!orl6*#uJXT`(-+&O zV9p#_Xn-yI6+VOt^tEE ztsj(HxbMJzQ_=P9JgDl5Z8wBE$){ z6sWMx6XOjf2d5BRa$%)C{^d2@k2toQyigBXA#W*jC=R5ieL@$TSB-VCM7>jBjS40; zo-@fkz8+K5Cdf9|7Ndzx1u6lo?a$467EDy4##A#GoIfe&g(E?bMQ!D_q*j$562$WojX|mtgP?Dz549dGiVqJmHFUvi4ne8~YuZCYLsKBU^|OEvGFBr;*BY|b zi*VP#$(cP$o<52xD!ttjkzFoH^<%pN4%!+$pS(~BnicF& z{g9-xP{wYJ23s3EJ7jQk0BUpyyqamc7tUCM0NC0fE3`t)GSXGG3{JFR$m{Aq3b#E0 z_{D7g44f%!IQg~#99qCIG(4;i`WzGhxOt$l&$ykS{1`2&_@3;LH>O(G`a(e~$j5v8 zMn;}37BkQyekS_duyErrvFvt47G0WiwWnv40B}0si>&Hrp>kwT%gmunGI#*Z`-8T700B+D(3h5 z9jT+V^Z`i3_P$cm-iN2+Vtxl`T-&^OYmmZBev?@l4Lx_QDCmt zr~{jDN0@)hGMxl%&A9K!lLaP}BL>k3KRTE^i)+(J)qQX#wBoMTDiNLhTXYkKLZHyO za0`G=B(&dkOElL#O#XOpkP!d9NPp}BqJ1V*`;l;dGu3M#3M_Bn2K#Gkao5BSIs>M_ zxemU-aJl-eS^vyF*g=;71vc;1l#I4K|D*tP@+;^*q#WJ>?psNnV`J4CYM|M!>fS$2 zB{8dDg2AY^=!5ZFF8M>$pTC-Z{`=6`94I`%hI7dwa4=&l0Qc3*72vu2;c)nX?pu64 zpevph;4IW2)j|b8?eB+z?+{-WXhz9X*yTX>Z$zRz0rs1EgZCqehaSd_94{Eq&nrPME?~3=X!QKu~MImkG_i z`e%k0m^#V@TftH4`k)?G1v~V!a-|0c8upq|6QERreF#UEtG>?c>kJoqsLaId6`q1}x-h*F{t{%Q`x{`nTL zi?-uh*mE)r0c;3Ja$6uxGAs!50$Fee8ZCAQ7Pwn9{!Vb`D9fh{_&D*$fVM>|S-;={ zD*=* zDE6hbI-bkHg!434#7A)eISl>b+Teu7XWPnPQlz*ZL#X?!?sV&e0D>Bqm5v)6J%$_I z%L1q&#fcBapft-UI*ef2>E2E{ri_9uYxBt7P{0?pRlFCl$53VoWOH1 z98)PEztmJ|qu-xc8R(3aSk&hkg4facano41*K}MfQvis&i;hn#EZ9$eBoyxR_;+fPPK4I(V#gcw{_cOk zZaHSQad4EB#Ba@UCIy-^KgbXJt)nAAsme2yfo;NY(v5&}ILB(~hfSh`SvPUe{okkl zFE{=-(GBc$Bag{#;oJJbXm@C+Yt*VYLc+x$cf?)S!)aPBr`+$sOpRgHU^5TE-skCL zIEyF%&E4;y3hTtaKtrmo3$`p+FQkO+46AQOFM$p$OQk!}0Q||YFUrPSPegWI1r|ti z<)Ze)XC>K>#kDQsAw8<5N&wvd8^?)%Tp<^6wv7hIW*b~9uvbyi%#iT}F(WCCsT{EU zow+9g0GX-rnU!?oRZ9vYWg>`@1X0m9PUaKv{SU?m4#Ayh)R%uk9v&LK4W_UoF^9HC zsQ3@tgBUo$M-~>r*1FXA+{Wl3+Nkf}!b&KE?^2QAh$Da>*rG}yLVbT(zV+|-y~4-? zN!0ULuE5&&qkDk!p}rh{8H2SX)34WjaU!hl3iw5mi-F+rJ^tXYXw(F{P1wq&DpXm6 zmm+koUqE>aBHZ{kOyCn;-{1#?-9<;EzSN6(;DWj(dv%HC_xw%O!Tdvw zL(w;=H1Q8AL&j0g0pQjv>*xPxek>lxzv&B!y#5&U$Ca1z+E##@E8mUde>1 z7G?P8TzCtpBEhLK1>a{`m)#HU#JomOBY*Yh66yvDDFj1<)bIKRjy%u{3aKKCY}8L& z%4Y27SFy-8ETT*jLdC*3=~MtCzeGq~0D`B!6wie|`+Ek}%tFBlTBJB7*MYaC+Ds1n zGr>pkBdDj95^~5W<;5{kMMKHSQ%P!l9KML>z$5scWfFVWphJVP50_2snemMR^UOM{d zZ}Q@0y&8U##~ly&f8j?C4=UclH@zEggZlNJTJr^Z6nWSOa=MNuF+U=JHqzk8)1qss zl{^+>19Kt8<>mvTf8QWX#SnbmoQmEPb8Z!S;;H%az=L!z3{K+7I6r1=i8bU-H#EHE zAV&GYuo%S=Vq9@QRJb zXhrGKUN!Xl8oE<=xbPR&sf7QgJ?cO%XK+J#U+nZUaA*BT zeqd?>IA^INi2Yz#*5E#GBD247ASo(Jdmg$K=COk=fHeg;O2X8KiedQiUW;=81L~<| z2mD;O5YKuo~L@(!`~sJHy#KXqn};?%!T2U&;haI6(t9tK4FuP zfg5iZT>KNRnBE0bCN+Faiy{b{l@r`)t%v_RJi){GKaD;tR!;89DGp?4 z8F^l1m1cKN_uUC-++d2;)<>WcXL4*Y!1wK2VUnnX;+l56kw-(rhn<~R+TA8r4+WQH z;-zTksZ3;ySmmql1bQCvGE82YzmwB{N?Zog?#NL^YlEaf8Ff_`5Rai8YE>2d}4dzmp;zaaigX5Mq7vfe>LaaWpG zD{h329F`bE`vv@qgJ+>9cQIz+_9O|))HN3s;~zB{ju2wie~A+-=kzj@{~ag)F`7$S z9t|v-_2C33j1BI4Y7+NhS_YKw@dJV?V#%k)#F!+Zi9+M(N{N0i)Fy#H#>o8*==S?P zuGf>n>pWCYPlk9 zYkg;PAx{fMr+upNg#v%9e{qjaz62fLZ!nXONuv4gyySHFceCEsdlQCf`ug84H-0M= zJGmJ;vej!0txuK+roBDOBuv$S<=M~6wx9jyZ$^$r{Pa-rn_0UgyCct(Uzq9`#OW-e z_ZSW>)Got@RoOKu@;~}>Qky-cD5DU)k!WE4zy@C8>q9PbUGLDDa5^=+GN$bLw{&yF zy;F9I$0INVHNxug;slxc5WiZC2c0Ss(>UH)P*P6K=A9UIHhK-Uy$_;KwBAZ5hl#pO zY9}Wj)iKI^*pcv|-)Du+*@u0}zvfr#j<mdF?S(Ar$g7WM z?l~In2@)kef1s2XPvkGg+Z8I+SU6iS71E!$(hK$L*W+#K?<=)8Y@`)gjM)sfw@V=3 zu!rRR%RW2u(EW&DA4BiA2LxF`Q0``~B!#!d zzXe0yj&qadC6U^-+-~MK`k%A31jEarYpOApPr{&=eb4MvBJBDHCn7smD`{4t=wW9^&YeklM^QKLz|Hvf75|^nTceLw&Un?ZB zjCINH*B1uG)xY%1BLO6rhmKY z*8B$JG508P5u31DawrNmeA@*-rs@MtGOu}U8F@*gtS5(ELQ<7TsMxwKd-c4>Q{ko9 zrw29Tg(+NFTLeLOdAr%qIOCy*P7fDj)wnFm^O5)T1{H09(iSFZ_h@s`-8*?MEo@O*Gs!3mVQ@A^9Y*a0aICUt#44USB zpm2Fu?3=S%y+nQbbj<`FFp@Y?fis+-&V)+xWv0VB+3MKU%M5#Hgba23skCgL_2%F5 zbeF8O>#l`O{;W&1n2aiz$rYfl^l@unE>Ey~<{1rI+N53yHl zDEk*KTOoYw``rYGbllk=u4MlxlqlHRJz>HdaTSW(z0IJ>F@LM`wmnp(9l(KM2^SHT zd@)>zI0pVGJm=+Ri(3`V^xadpdtPlj{m);L;-7dpK_4A|IuJq#whG-XZ(f4jsYMfp z*y7eN?0TCH56ml|Zw*#iQ);XUPd68%?Vy_D^Z`>f51X2dz(?=TkZl{ez2YS{FK@ z+m=V4j3^6Q6N2Cd5K;wRD??i5bP)TgG5w6Y@>D4E;E{9wy>$C8!2S#XmEUAG5}E7g zxSzpGuzG)ca?k-OS^VIV*$?&!h1BQFf!TK!;$a+w?_DRK0-9l#D+1frp)=G3% zPxu*=-{E~Pr*7m2Q?1;4W&0u_ya8vrkWDMV-N5O8JCD0=;55`X{G z!_VpYu8-NPR^G6`+>GPdpr-W;1@7 zmBde#;2#fO%+OLv;XP>h12WIYakCe2FXbQ|hcH;cFTD8qx4rEf4F=;&(!=T2gdBsR zZ(u1>xI^qt^m^9ts`aiP7GHe`^F*nD3xl6*D;hB$IpUHW?M!_bhRS$f7LAHM9 zi>5r2)qQDQgMqo_rzf>Vi3am4-k04+TnN~gp?zrSM15=BV`vZ+uTJjK>$g&qO3tLX$7*u;IDl@p7yXs_Q$D~yYCx;~_>8Hj04nyZmwa9FVBXD2IS?FT14MCdfU zVRNs31?lVWq*N5}m{08)4;ddBN5U1JmxQItz*G_Ey%8jq%+_F=sut5d+IVWdTz@+`LnD4eTDgKdnD( zv#E0*@Zlc@UP^xJ$+?kg9*Suyr6X+Rw`n^bRC`;$U#mPPET+gsy^;=@I226S-s^Cwz#(U7a!qTn!)IYh%v0R-I4hq0{SS1?@^}LD zfERHJqxMeUYD@OoMrIa3i1D;M<)zH@kQQ?VLDEx-xxuX!LKA6*3T7Q)0j8<%VmTvo zM%SZXN#l+j9wP~NwW$hr*9kRO)mJHcm`>3P6!%Oo4f_u0IcINvhkQb{j(0t+DTo49 zQ`KD?s|p}yyj1pbq{q*vU5zu&6c#(m{GQHT@ShFpo~-yBt(}ES!}?p=6%FYk4xHKV zy1NUsb_MwOzWuCnU^DkwJGQBGUO#C?e_&IgnlaE07V!|Yqtp9Qu+iI;Mb;%;8YBAD z1m}SqGh;`GuxRA2*saK2L4L~jA=Ofl@^F@o{yLXzz$}4*+A!tMu0F~f2W^d~5=Jw* zwBBvZ$DvWp3+Fi{SzScTTx8Gv;X|P*ixCO zXS!jzzh=H2=7qF>U#!>~>XLma&Q~YTYCe5NfdyJF>g;1HjcELx5d;Ypao~|wefF!0 z{&epV;=u4*97J8P=5?dbMf%ReEa}srU%nlktqwN-?SL$nf1 zdwpW0aPyC`2-D2G3T07M@;_R9SM zytXAi6mHPz-0x6W(+WXG`nP!^cabN01IaSd_8BHV4iZD5V)mNs<&(_?Q|p@2G)d^E zs9iGw0-{T~h`#?$t3X_G!lCu?(v&EG+N%R`W0DwH)7?-fqtI$5hiIqlTJ8cV9i&Cjc)73s>{L z*ldWJjT<36_ZzCZds`yfpO zn#baKH9xI((X#J*?y^cEUzOdOF*v}Y;PB(H{&y=7Z0IAntlxQ^vF@TYC`jf*GbLwQ zb*i(EbyqJCBAPi9j~b+BsYRW-Kg5g?71YNP)WBM1!)5AtZ=dCl(^1q&vnjiVCg9XQ!gFj#ul~q5VB3%rkf`;2Z zus}Ko0mefwOgneJteLwU`91x0;!c5=w{KBgrC8qk>`SR;CsO^9@p^Uzo~A~x(emWU zwds@XKyujgXL+qKe;SftQF~Y4JC2BOXh*`cLpBd<#+6&GY3}o_M7PPrXd`96Q-IS= z$K#V7xQz+Dp~r^%8f;U*fiwn`p>nC7TA=hE8$m|QKhw!dhJt`{j0C>KQL6;eacn} zKVZ3QX*a^$HR0$jgzDkRd%GCTLh2-avIz+gG~_V5)AN>a_mF*R!E3{g&ojh*C*(sZ zEqOsd&fp@9ev>+l^wa>vk8o{^Ieo}PV^raH*fi|Na({{=>49>-dhkSec7Pn}NeEIk zW>G=KWR=HBW`(a?@jDCnG^Yw>rEv+Wj>pA5VybBeV_IJRfYW%5rmkNTD(&y|4~IX0 za&&ycl5M^@Vnsf zCs)JN5=a9JL-c-Vw^gSFU;cKyL*gmQRk7>Eqt{3v*?g=%VYo5JplKOd{gBUXtASm9 zs}V$Tvrmtk@F9i(g|oVrt}ZB$UTjcjJNwB$7d0B#$sroKC#v7rHaFs4)KL(+T%!(p z1G}H{q`4X^0uByeEZfZdU_{#{uz}?s>}hj+b)73s;z>m88hOcCD7dH=e+9m;JgW+) z068(we)h=+;wun}S=?gU$m0P0$!$b{u^F36)i{j~u2LpNf}xTg9}sMd#UQXcM~6giAPR}7gy zX%y?WcQB-)#vl&7k^cIPE*XzKp)wz1sIhOu14Kb%q%pgg{xYS$UXO9lz}5OOl8U>; zY*mleERd@$Z7plj49pcaZ4rZ`CPJI;xp<@HYxBahc5SqH6}wI_&M=yjoUNpylu55| zYmgiP#uf2@&`^IoMo1sceuvF6Q4^ImF)FI%wSq2>-VftK%0q2SI}%fPPhM2=!!j2= z1yqg>kgQ_cPwfr{Uz8t7z?)frj;qZw$#e~|X{Z?o%Lm~z4Gw$>{yQ!heD7{ew~GL# zf0cB#2iD;g+dbCXO9s874hhhWrFo&PMO~JniMh>(B+=_!B+JJ{NfUDp8(Vy1mr2u{ zkbWu)>RegYgGLQF0+L@_v%{vI-KG3JVbmWw74-G?=W@L*zCQn;W7ECdS)8;Jwe(4)4BbS^Hazu@)RRxb&16R;fsJ8Y`=CRpl5o#^kgT2uB3nplbFsxJ_Hz%P{tz7YFcEhG#F7)JG$qFPzUY&N))+!^FS(&s)8I)@6BQP^$i33tZ*?G=KlieZ0c*|yR zhr#2F@kG9kdc*~H~z>x@UDxLn1FkjdGY!t#7Ho|3%h?y z(_Zw+e32`LgUgzoJT!#lX6mxA`@vM>o!-bMwZ; zPUf%Ic*@V*XN5^tj-<;++7O?}GlsJx=Q$PYIp~QaH#KhDvON?v{Mt$;m$@-FnRz__ z(e&BA%srQl9qN=W9pSt}AEPFL!>7}fxRzJnBoUoTKM(_Le$6zP8|{8r5H=bSltVaB zcF*}x(WJL>Pi?oTn)65Vg|+22&iPl) z8R)GSbwDw0x_MttpfdtffFwXHZsjmNYqT;L= zj*Vul$`nLrhH)x9Xy|7C$X-nTyya)gtBzyRA}Zw98=~Z*EDlsf$Iz3H&Irp=^Hx= zna(diQHHr$4rUp2RE*}b-dR~l?S6-AfAZ0~1|M;8sOv-f=@i9XF!wHJRlRu@a0Ul| ztPT1HeT6jqWSoO(knduQ7q492{yKiw&yNl5e$U$6zBiDOyKRxSJEoyW?A8mLG*!y| zOJ5I3A2}DuxZ9+Fa>bR zJ8@1`_tAsb_o5zr{`vO5DESASg^1fnK)X`in@>=#U{tm%qg2}M{heLYz9j~gu{)|NyR<0{4Be4T7NSnh zmsP&AoG9)a6sd3@C?`!Ywkhnurmy@R83JVO-31iUvhU%Zl6a=9UF^R`FD;~KrWk*7 zn!1i8XUcoVRWIaJ??hZ^kDj`O)BpJXPRUXMgXLISm}PJaQu6-ke6KWFp?O;f_8qOY zJcdy(y)V!>#Thz0jAyfMDy|y{W&5#*(1xX$;Ho!eSiAge+^$-yzL?63%|bxT1pAf9 zBX8EVA!(Ie>fDa0Z)2}#7kC~pFo`9C9(-@2L}Y_UwC5k6@)59c09W2vU-~}!|DZyV zCEqo5t5#-Ru5fUg+@#iu!RjunTHQeE+B<3JX7_ML1k-T%uEk)fY*o|sGbb?f_Mdtf z^)zP`)1d9~>|?l(MR<{XR@+g`jgVfr+oN+|J`?o1^pS+up=?ZUcvfxa&iF%1l8?$c zDy>RJ85{mQriZI_InR&dZhCZ#^sCtIie?@TC*X2Owe)wpvRg{3DjaM>PUdd#T;> z=ntQ9sokxyHt2l$$Zl;c*IVqeLR~S|6s^|UZOZSC=zg1H%Dp1Utc^S@w&Gt$j-yc< zv6dH9HiDt_LvJV6kUM06+M9_e2h0Ia7Y z!vI3at#}k9V?RoudWIn{vR-GEMWHvIs2Gs72U>M_Scg%7*Z)y=yolwm_+oSfm_(qU zM}y~D=Hl3TW~EW|z0EOM;~R2e?ySe_Zmc4^TIJpqOt$zjrw+x#l_b7{QD;pUc?u%X znF(G%w>py1D5`OqI+C^KER5h+ah|m|8J*%tn_`b+5jhfCD4LIMWEgh#7!CNeBi0Lm z%RO>8v{&;0otRpAFAv!#A5=iJ!inFxQx-RGo zZm%e0-OU0^7|gr9!w{kE(IBywwP=NvwXu3c9Emi%7mU2Pob@SABt%~4R5<^j@3T&{ z_WKoCosw}Tqepo)YI%=uja$dsv=ns3HVWwm=o1?ZqlY2=mj z(D*Nsd)&kePm6^rH(zhY3#}MM$8Ox37o7}LE*PqAk0waQZ%%%!_GngQ1sP-#Q{&!{ z0V8Q>m!EexhGLu`m&>1=DgHCq=ukGd>D*qlYwXQ2jySvGHLV7BTAUTV`!jw}^Z+>WA!(yi+$vn(k-N-R<7d0Q|Ses9XrRXk-qof*c+ z=tUOpbr{LAAWs6nC#hTd5X(GUrJm%yqlM4Z=zh|o3ftoZVMbmevtnDOB+IVJE47tE zs}B?WaxUZi9j3{_G1JvSlg5ICdNvW2vnYxxjGnk zBkJ;@QYwPfUrs5f_ydh409ah64X zyb`g%hrakOZq-z~@E!5^_`pVv0^it>mDrUfYmr%S%fflQEuLX&OJtf}r74}sx5l-~ z3{*-`u6^4{c*+uSy8GyyB))fKJd%!$U1`VJRw)y|3iirXN!YC&es@e#v=}+IZPG@Q zi&Mb8=1}T-VaM*-i|LJa>dl+K8G(wmJzPmA9z?lTBbTYqhW&#h9>jR;(VQT|Jh};* zLeM?bVZ;<1+%+*{GzBe>#_CRl4C-&Ic=fq^h?gsv>yL14RuA%Tx^wOIa7v#EO*}pc zw@li*_h@%MYyPA{c{EQ{hZ9n`r#Yx$KCKMp2ZaV(xN6%SZ?i0J{)~CdRcM0qoRnmH ze|}|gBdXgEJ?v(+Lj3Fl9Cw(H#Z`_%o;9;wGfw#cDo&Fx?WD&*JfsHn)=GLop-S?m!&nv`BYvd?|aPlH@I+oQm z?pzo>)eMhALf|E!Rem9fGdTV0@^a7{n%B1a#-r1&LGOE9nC3-STHAQE;YaTjt|=Cz zR?%BmvE+|lF*)Rl<`{#mx?JEAww1hbRztAm_Q)lRVX+FxmC521Indp9gO)i-E>VYf zaPn%IPp|Z9xzUuV$F$#8;LKx6;4du=Zk|?1i<41Z^Rf&sb!gwY92UBS_a0wy92!mO z!Vxo#Y#%O)`tr=tP-D*U>M3gc<1vF>_QN@AFZrR0^Vq|URc^-Bct5skV>}e~L+gX6PPnyMgM@iYzu)IyBvmt$q5mpwdhoH;3WR zv;CSr7S5x`E)h)CPx&`rP!;8zOjoHc!0K@wC=#_DwCUy23d{N*CMjUfvnwBw-Rk9b zNVwOm#-^x{VeBTKn}}ZCEIqqa5rb<#q;NdyV8P1ws{EP%G(>utB3?9LB!Qo7JpLfh z@Xk)_i^7?v^@fiU^Aw(sS|QhGu!SqVm776}qQ}C)&H9$-Ty{hsOH93ock)&3hsx7y zd8Idcmy~yZto3lOpnVsniS2ui>3Tmvej;3GcHwy?1DmXmWUcAm+J%NHgkq=0H0=he zbamw~a=_7BPf~i|R5)SRpP~~%)*c}?DS6r@YqURaQtwb9U0HdzRl08VOCjS}{qDd> zZq4+EdmYDZHSH_5GA_A6M_-CJJrv`f_cBCv&SjnhfrO= zO|n`lY*x4dM~uPCPib(5erBn=xe!6IMUE+0wOX#4#l`DwkqQ|Ma|M5#sAXu_>XW!X zns?wAda`#-!t^$rH+c6$`KfiG386WZ-enb;b^`w0ynhzy$TyPyo?uO3bg7>bb2bVQ zuqgpG61{X7|IVCWejl?AUYSofcKIIOn99oMO%m;GyUN^|v%xSfq0Qeyzka5tr;#2S zh6amnC5Fb@$eL?s!n~Bn9@l4knq-MSwVO_O8W@_cd^#;gvBeuGHXjA+=Yx`M-9@8%Rcx+XRLm+?QYZ`GhVu06(%$yZo{!6ge?I1;q4DfL@ z_jV&J?ondR?Z*wmB8?eMsn#p+Q;D2Hsck}8X`C1>gJhbW>Ke950z|V=708nQv5bb^ zB@O%is|gy2-vmVQL=~r@}@=WXZv7x=V0YN`eSSx z(ZJZUCz(%)5L_b5nD!(0DZe1x+*|LN%n9u{@t&*SAjiZ~|3iaDT9fi7R4}}skj7!N z{zg*{{!z`md;6141Jw`SwS}(7RjZYft5dHH#xALfA~Qo{ewjfkRlib+d001wyM33k zbeuJteU)@rW8J^o-z*(xhL<0iI(@M#SPB0AEfo^ZdG9o?&Y5u7NHjC*F4TPO?zx4w z;1K)Yk%?V>OHFn~TR=yJ;9AZiGC=-Cj`cnI9DUrf5ma)93dE1s$(m=^@2t{OW~;1Z zsZnK3r9Q`X-?nP3{^KTptCb#RWx@3uVFlK}K!-6}l=MU$dya<^uP(&jTG?D_-5O93 zoK;<5m~QXNi+T7rbb7O%Hr_PnMtfT`GtZJnx}IrzUT?AM;m{I>NzG5?mcRp^Myg$# zf_2`F1Ju2Y_ZBG`3*_2;W&idRnhP&7HdXK~x@uM(4Rh%DWl1I{BC zvmP+Yagnj>it-9pxBk>ej4wKF)hjH*K?lw`6|0uLl_tvLOyv?wizSnxNafwZ{zdB* z30^!i4VYDF+v2eoUdh3U`#5jNe*0v8-_fM~w$qG%IMPxSORN3Fv+vof`*Z!@anEh4 zn(Wu*Yr9AN9Cr~P`qVO4Td9;!juoN)ZF-1h?sh&G;vef7RT1a(MyaQTJ_^qUtV91%*%;!H?aUfyF~lMQ}Q?^=I& z%jbSqtDs@tsNLzz)K5@zqs7BvOebuo8F z>o&eTvddAJcqJp{Z4Qsgw_jw^*j~ya&MnLxBUmnvk_r%U9hNSfTbekm&ve|7Xx=6c z7*>*S@y%}`Jg<{B`M$3BcJN{MeLGF>9H77SdvDc}c5@tAF(%k7{mO+-<#M!j zZm49xI=ZYcDQdeF2U%E+=xmA(^A~kAxXS)3GalrEIu^Ew*vTlKiDQ%+Y?Lt<|F%`&;>$vZ> zVl}TNBzPWI7R!R#YoAjm)fo>?!*H-&x_ZSmvbCB?{n_VQ`J3!jNP>kBp_|j5mj10P zAv?v#BKI1X9yQ=DySy?tH~S{sJ2zYkcb_^r7r-Fv1Z_nWt`~mcv$6M(nAlB;!cF|| z$DMVvE4?CyqYC;}RF()a#@M!+_rt4deCCG?DH5CZYpf^XgdBh3Qu7C;4rZ?Zzj;BHlt?}$hhV7_75?UOAgoQ zw<*oz~OQiO%qo2&Z- z)rt~W+Bd^We<3ZaV=k)%6~ty@F|k(8AjTW_&q~@&YG4UQ}IWYZM+ zbtl?9PTJmZ<;KE(RPv9K^@potI+3=X%Fx&?_!?M6Y4}7^zRQ=9dqX|RVEncVjg^kE zQb9u#MSC+{61mqoVg|aQdkPVRLIg`hsxYy`wPnp;FgDg9i!ck(qhAKwY-@+VuD{h$ zp;*diEoQlPhy87qw^)hOxXYNM$&-hhGfC*vGf5N6m^^p>+6VMUtP|`LRL*7S!K;C3 z^YZill6}G{MbC#WWV*~cc=u)d43Ag8mBvhxQ_!uIc@?$`U!LP!$nA=gQ>d4zBhDE& zAM`r2w?HoRN-;j2RX*goJNlctN}%f?OvGMVO&dL!i?c1x-0mU*2m7kNDC&0ak~?{! z^&;56WNzcyFn-X%?Ze!O{=E5()j_ILL+&WR{J}{3yxb$+`oMm&p`v}I5mmi;R(LDHIfLh?aAxyfSl|U;A_K-}H}-L3 zAmk^DikhE~cltSx@A3L1{u>+_CN{`2_5zPM$W+#wZZ(*FP6{nI$9Dc=|EYQ2M_tNz zK}v#Z>X703TxJhOi``R_>@wdQRB~Y(Jx?Ni75qw#tYB*h2{xWsGBrY|pfLXWyK|fn zxACau-DeufhBl-TDqlH?BInsfJq0*aw&}$bdUYCDDhpS*2wsL*rcK3(jwrvFUMWqh zf6{k-ZAU+w=)oze9>P~anIgavruje06ocru#(CVwIrT(LACsBrk{+?Aray>u_2Zj+ zy0m>&CblNNK+!~CX&q{rpB*mEu{j$P4TG0SmsFuP+2i+PX2H80dCM^2B*cn-91~2AasNV=_+_@6e*oH!njQp(WbuXz_~dS zuLZq8oZO)um~T2mQ0y0y@wQXfLy6Q7&`vI~X>p5zbjKnem5oKGJhNu#K=I{@?Xt>( zwDlL=wMkzCLH(is)nkL;>^Q3bh-t1g(W6S|AHtSG#x}WE9IS*SBshR zP2s%2iCU)smWq@5AOmd|j_M_DSUUSt6i;Z%~<6AoCyyYYN1v_bC`cuW= z@hGPq++C{hQSPe~jq~?)%KUMhCZ+E$(`eq(sTiMKQGAr!RcNJQ2zQM|CcKE{dvKn0 zH&u$Se?@9=CO+Rm$DHSaw-5q4CPpMo!HT2jeSPS89;mCMa>`A-ccbUqROmVsYc!J+ z*Tb4lk|4GjR_x-I23LQu@;I7>Py&l~e$%()?<2k&ItNw z@%R0T_KT(E6YZJMwBYa6ywa74jr5mmIzOOq z+powRN>?hs@+>A=2%Gent4(=w$%VS^K4-8zX!lXmYZb2Ig znfTdYnmT)My|^tsKB?NX!W-l?#4Tn8FQR4dnQNh_h?u#wy_9Ks zodT1uDj7E_4s+#2bo{FUtD8E{T?{9OUf^K-NUm$^7?Y4~J-SUnpIc1?) zSI;n+6VcEPGD+*pXEkrIxPvivA!_Zx@|g_&E^whi7#g_Ym{;vBYM3jYyqa=}BNy^_ z@@_**drZU$R=ZW1ih|IRR_1jMJ>C2-o$C5)ac2y4tYwos3M($%?9&*Vn(=dPOY=AK zPX-R(Ki@rP=>B!EA?)SJ=AY^@(yX4X@MDik`i`fxvh`-}3R@uy#2k9^flAqZkexyC z1yRP+j72CWGqYmXjZk5TylV(TlzqT0W<1wj!N6-1O)=@Af+p+gWU0qO4U z?%0fqN_TfR2n?Mn-O`P8clWzJ#~C>P=l#Mp7XvfDSnFQ*%6%5qtRr6MLOgMizIWQD zFEYPV-?g3N3S3?nHQr{~90}78t0<-D511g1@4T&Zp{qDu4v9EBZt@%3#w!*gqqwRO zFqQk8SZp#4O=C|b=w}`uu+kd2s1u&((kR;?J8c|D*x$)rbhp(1o-q-?uNC5^Iw==t;$N+tL}U5hqeft@gn& zIR`R6Fr+_8|6UnW0iDB_cS{~wpnE^_!G3z*ckMoKI%ND6c_2qmK}+m5rhh4rf8XNm zL6hq&CdoQ@c|sVuian$eL$>3&wNq2vcssqVLev@b!6vzwjbGjVwu)&g_oS=$E59@o zeeypz@h`h)z5USl8#VmM$#2I)XGbaFJbO6I1M2bI$NUtW{;W3o%@N6&K$){(#x0L% zpj$6gvt)UAcOVmt9c4K$NJwQs&45v?I8jx4_gfDv9Yq0j%D`6g9I8=x(jq^2Ah8r6~3o55W2Y)knZMVmbWmr~je zeRclMuB~c7sWpr!XBO7nhWPWV;S&J zu%jfK3&*NN&{1$Pi_NHUZqAv9LzQ#mn(z2V4ZwU{fAyxa0F+)VqgIu2vim14>pHPx z#a;Nywks$8t?a4fS}5-Dn-!=liNreIuUV`nBq`^;`7oh7?fS&4Fdw82{2RRHO+!n1 zVED14%Ui`PQ@QqCu8*Vg^OwNcFbNpOt2SG{9@Iv@=GIs8YacM>#+%>KuwLDWGQ!v;ELe&iG2_Zug&Z-Z|>C*DIqaey}%_nMtn)s^^P%}No{=%vYI zFyL}nmAaCdZ=_5`$)FyKO>pF>j%3987Cv-1|AHX8Dfx%y$62gbJOT|WS?10w)efy~vm_jh#&$E*kYW|lUwQnq z)byS$0!Ay*m`V?!e(vpsdfb$99?%-1V^FDd54`3s&p_e!;b)TUy86-CCHA_CpU__! zTmH*;NhXqkiotwYxZ4gia^F?)+o-1>6GC2h#EUJ{PE{6uI`0dh?YSq$8Mep(LD`xlW_n-E#!*uXQ zS#f)0@=V7^7JaXw0)NG(+YP0N^hXwYIIGN{vTDHR2=m`qV4({0w&`H9Y*C~K+vwTc zXF1hi&(3i=mI-`~UcT%Bqdkv78n{KKn1A~xeo;9k@zoXmGZjTUic27H=e>c(IeJ(A zPlA)c^t6Il}zp?KO9cZa$T|#$d)VCYnI!yZRyWC zx4CrhzzAowOU39V!vEDMm>ni7?wb(B3(kyKCTQ&#r)LA_S$$rIgQU_y?5im$>i2qs z-VRBqplnlb81iIGqlBNy>L7&(KpT0kA#Z@w`hzc;7%0o=7l5u6w4@n#Oh2=}fQVO< zMu(+#W6u~!dh6Ls1qsOWT~V_X**e_CXBSh0*%t9db0WV@Ri|usWKT{7Fgu*6Jyzg! zHkppoHp$)dfe$;|x-b863#?G|q!y`~Lhnfx8=!t3&=`Z@-{T3$z)Jup=+8}reH_MpuV5$6->pjceyaQQ zym4ZzcIkd*rr1XZE$N|H7ajS!(4maoD|t{-bO4pkAM@a>`1Fgav5WdR`8wLKW0C%9 z$B)aCwW63eXZFqIZ-(0@ilsa|5yv+jrTc^BLApaS%s*ALn7{$D6$hjN>V))VD*s5Bz)fb)ePwynwid z%L~DNl#yMyfe*R?y3cwIstnfqIZ~N#|0x_@pRc_L^(41lWE)jBnb~#eleIIze}pX4 zwqZpHmxNF4<2B@PR1F_CzQF#6cfGB15Pya%3l?7Xy_mx~^o<9233xu3nV39UxQ>8y z&|ED&w6GtRgb9~sY8*1$5+gWX*Z!x7elDK8k7qBoM`lsWI!S!_py>`ms(APRlwh76 ze8s(VKmLWE0A|!Zs0Va{Z^k|ovrsRx;}PSGfZ@1(&nMATUPYkjA&C-ocbpc1{}!rQ z{8nX5;_;C1T3q%}+?&f|2zvUPj=q?XLhI3pO~9kfJXtVgwk>MW!hd_U=*t*6Z1!%% zkHGdHIUs47w}}(i#mt|K_!0T!vY+P~$ZaP#XJo8;o?GEQ8nr)GrzmvvFjB7oWWGP~ zZ(55E!g^Sd@+tH+LY81U7~p>H2s9#f@8Z4fh`uAr#8_A zQK&xMBaDEd+oVvdHfj;6g$;t6s+C;Sku|`{3I5S|JD=-RR94VQN&)isq-``%B!F^T zbf>bUnTI2<@>td+Bubsbsz}oyV2S#3l-zIkC*smSDe#?H!5;QvVLi5q6%T}Q^Nwx`WlBR-u ze%EDKUEl^n>39=pQO#!RAArqC@A>#iB~dDI0#?P}iP)$dU&#=3%fY}nny<1B>?K zu;}R>V4Hu&eH*N`V^P;F)O9+4w;p?0g`tl!fwR2IkEp}FJb-h``&h%$4zByOp$c$8i3k@ zv$W^EUgm{iqB}uKkw{E-3c79?~ z3mI^w6f2X#RH$tqb#y1}ifVx3&1|3+E1+&jvhkU#Pi991it>bxoY8Z6JehbYekqaORW z%DgKZ@7!mepprdVHSgPOnM}?2Ihv}K*RDYtHOv>C!N>vJn2SUz-Ju%kZMVDgC&ioS zh=m}_ICKi!dzUE8B<$Y3aQX6}hq_c4EPGcne%QlWtUD>Cq8>c)`$hd;m4kiP`0J zP{$|a1H-B~T==_;9REmMhIW7CW5hZF)c>&7!85&51b!jNI$W_XGlBx&aOazFZ8zue zJSB^;`KdtEPR-7y>`H374_|cfIhpNBX{x!Y2i($Q$2PN7&q%HE44yXBXdZLtl??z? z2A0&vdKt#V(Jx50TtUMCK9o}BydS6n1U{{YLXXZGC_R+*46az;`$EC)e+8s>Jrb!| z%|@W}T6nzwjrHo^{?X?`!MdeaK^9cb1BQ9^@>E2+F><}uK*H`h4|zHt>5Q)3@u4u- zhc;aN#YC}VKr0&0+|uq<>Zsk43lniem938Hiz(pbK0i#VHWmTtG%At1xPFBX}`7IzYNqE zc=P_uIT|@#ED8&cN{2t(;DJ&MzTDsd6H?D8YM8srv^oapt=BImCb<5To6Bg#=;7o? z3b5)1V@dw{nyBRZz1T=4GD39g^+|I~Q>J69Xl##RN94ii`V&UH=}BXITrA@IMQKq7 z>C|u?0pQ)(oro^-OV0%qlxYl$q<4g*J&0}bE`vEK;c5n^OAq0%vBp82_k3RSj9N$X zg`|3@t8xstZriOFzl36npU|6(&P1@fZnK&`8a_S2pMgiQ9t^#*VFs4$eWJ!6Pw=&X zu%kzM)uLFUFV{v;@A%8!US(-4?52PlctR)60{Y3>h^+B$_N~w*gAWNleHLx{v^|M% zry?|6JxNGxt%SNQU(}!L9jyAT;(Q^)W2M5eEyu-Q$=SMzV*N$=nfu9Ig_fc@$j&Yh zoN}-&s6{1061yq0fjFE;2uc_E;OoxHy-3A}MOXCjuRCssdDxaSs2gX1V+QX`<-j)z zP^++Q6NYYq#z_KR=Glcm|gV}PN3nsDdX#bjN4pv!xFC)EG#>Jy~ST|*H> z0d0a<-xgyK;%=^?X5xXxM|}iLR~gwq@3KADc=SdluXsXSHC3jkfjvCWpaFmBh(~1Q zQB!@^4~HlJ27Z|uppJh(YR z$Bd6jT~)vrM>l76+XPlJr_GE(kn1Iiqo(nJ@yOoYi^lII4R z47B8YS=g7+=aGQa03oJSyH>Q#EBP2EzhFRBM|-^`kGHKIy|v?_=L%$y-=8QOwxTH& zoBE`?KzJ*R*!7#r`jB}*a^P3!*_ov*=Xq6iws`$A z$V%>3{>XV7y#OhYT=GDe3lL1WZ?T@%k;XqB`b+CTk2b&qwcx@i#=~1j7_m#_KLik= z&Qrg%>);fl2+sZPU}*JB0GdoG5}aQ^SJ*OpT%@}$1NQeiThqWTo$?ABJZzCFT26L< zLWa61AVs$b5@Rq-AI^PqpG3PnRt#`{7fs@lmD$|5s_|$Ph=}hflPw}>$}-QZAA3Ye zD)3WN0IEzl6$y#fBe}93GU>YcH<1}hEitKgwL$6yeGw^&I4!X8#3D&7==Bq4q8--f4H>?~LGBXZquJuf*K_O!ABfu=3N{Vd8D`j>Rl!byia2 zLuT^+bk)BN^mWYgEmaQJV=BAu7TJJvBt<+f3Gl<;ns7FIE&sT zADlTl8j~<+6GM~t4gQYlQMU}IDcXKuzoR5EBEL<7`)yq3Fff~(E=u_`flBXe%9a2O zTadX?)8DvEHiGJ&`#@;$pfC4G@O&UAz6NmwyjXuI{&ki>TI3P`eJg+tCH=!!F-UK* z*FcwcTm<7Ez4FVgg-+%P2?Y8YmRWjKr}SFu0=QQikoGZN9XrY*?KiqB6(A&71fVPUx&T^qzs7EwN zYqrl|%)R=O4=nohG6}NeAF&GR7;qe>D+l%SX?K~C@7&88H`f<4 z<&S-2`W4LDddFFpnv8d9_?}OMl$Q0FaeC(waqB$NQDnw6&5`+fmD?-9?!;q90(m&L zN^N||C@fUfGI=7-`JeEx|ef-lM1VLqk zfSkN@LJ9gGIReFlcN?9vQ8czgiy-?EmN0?5f^HAV&Lbf~H7X*9&#s#9kL7`WOMMfG zK;LrXopOUaN*lG_ThC1VyVwPhsRUk9Thv640YR+e<6)Pd@fE2$HnSBHwS_UYD@Q!? z!&`#*lR4)bO__}s9bI~3S;M~C{VaG|B_7Z=FwO39(gr@g_Wsv1Z$+?BGBFhlchPsDTq#!)`s@yQ@)7QOrxM3@g!`F1a#w86 zc>z#x#zdf(DX_nM!wK#9PEmYQX2Os2tO4CdLgR5@_YGJ?98}xRE&;biZJ{Y-(6@D> zJ7(tu*UoTt?c^F&Ps`orIom|NKHn?$SunCV>j0z;8kV7^T~(b`-0@N4JCYY`V=h`6 z`N)Vecx-U>x{_`W9NiKBHVnjR@}7XvKf`zuc_iyafSx@nSea7uY{gXmac#6*K_h#3 z&SJ)`p0fCh_wRdC^IvUQE!8oRl~O7e&F-_7@Kl~mmIN#6Xmj6-mREFkx}CayJ?Br6 zjygg%rRcjiI|$o^F$L%4nQe5eQ|03Aefipy2SIR668T+wuZDT7^@OJx)FNf%rqg;gtYn!byt$y}7i3 zw!Bc_F|MxJ=kA_RCClT6WxEzd8n)BAvfG(%YpS`mdu{?W*z|?e7sEQZca}F;fs#^Z z`6d@A*=@ncz*D$^U03jbW3!~)WWQU#@uw|xZSF@B>vM#1Af^N$RMFyoLU$v|mxoA1 zN65Lt?cK@o#BRN}%ePHS^1Pl!=VIrcTx2AtqW7j4q#W6{&=oQOf-JZ5SEG&yuRtOr zW%uTqihwT*Zlw~TqXMf*z}Q^s+Xuq3^N+$|ksV2q#kI9!(Il>Ns$D$%=LMAwIZ5li z^u<$o02S*-WrRwVJJ61SzK@TauPnDP9^0zJO+p)eM9A#Ik*^zpoCxt}m0;r;2=xZN zY0TCS5X%oxMqM8p!Ky?aECQrpHW+s-4#&Txs*8TF=*!ar3mm~9W_n)GM7es_NWjRE zmFaE`hiEWec&oGNu%e_Ve3H87=|b}%dE4w7RL1WQS>aZK4~O|^ere&4^ZbmS6N_N5H%lj{Io)m3)< zk3Bz@dcfIl)-7LOoV-2mB1sW)Xfptl`$ZF>eiaH zcb&bojds|W`jdR@?9r%VJp$YN4ZBQyH!t3xW1ePG7cwl^J7KjyBe~M%F^_IESxOgx zv04mN&d$ZUM%MBx!cpVp-FC{q88AN_QOLM|g^z%>I)*gxmJtvlmm6&nXUV$_;*W3~ z`SUBx;U9zykVgeuoNLD$m{KZePF$3k=Bc5^kA_uDPsf&i3Z~+jhw<$}T`|(d62PZb z1MAi&OEGaIC)v%HwHv z(k8iFtvrR5p+2mrCr?7UTLIK4YW$(pj`PTj*I%JY_;`Dlm?qRNI13nPG9w$K>WHH8 zje8tzEKyG=Z>cs5-Ox7tX|)sqNf93{)`#Yq`q$;yr>33gG6)IdWp=&vMth2MhhRP! zeQvK*K_A~YvT`@$qs)P)q=1B|S6!ns3HU77E)Ku`v(}5?QhEC(?nsd^@x#EmK2SPJ zeQ^G){jw>*0hMkA>lZ5zMnMgYXaS#W4i@loGbRFf5CeG>^#V=g|aP1>B z0eO4`(R}eGbkQpab%YUOTP$>|4Phddj$mRKDT*40-}iCMUWtb)a`$q_FTeY^RSCFv zsnLr$Q}i=2xQW8%ihQI!e6%PlOR|4jYun#NmZ)EY_1)@o+b+i+H1~?EQ&mU^`gzX> zR4E=<(DTMN+27v74l~ETStlEKprl+qqxITea;zhE5AKAZfEi3N^e^_TFIGIa}sWvTvaL}x42n|NL!90kLNhGAcfCSmCfkW z4bN*x7FQ@rN+=0dW@q$vQ8eXbgN2`2rw45eTPpWtYPV|eYhnqCI=Wk#846r5BD!F* z*=|dKDK&P1$b-vLMDVi+P~;s+a7ixYk8b!Dtv?VO^n?!diblpwnyDf=9BlVbOC7hd z-W5Il$6k|CqQ527Q#UBGr~t#7eW?<9rQ93ZGoNs0KE-P11+bfj4;RlKuSUy>+~zKx zoC7RYCcBDi-LI5nDWPSlIrJ8Gr&%oW;;wTl+%1|<*CiTe6n5xviUbU#rt&y4Et;>1 zdS&5F7XB;6h|5QTfJL|m+{&=z3o?1hNZBuG3h;snXn5bJw$Q$*$4G>1CP%TSGyPos zH^_(-5s)w(quY(hZ-?Uwb=*!?yh96Mxf zh7B65I|w)H!l-0UiX+ypN;gKs4a0_=c0c90^}?Qdr;I_Sq@l#sV+PS;eVreWaaymW z;hxIx6o3YPdlv0OV$hA;4H_d2=smnWibQJ6-q#;b-#YC(8ICY*o%AH{q2d~o?YNB=kNX9|VqYRhxyKUrXjlc#iSV0SR z?Ud90Ciqs3I8jQszw#mfAgql7EbuLghoXgcf6{{`AUHjTvBlSR zL_A6(Mq$QRzFG6sW$|B__K8>g6-2eU6&$ox$knFDO;XABP)AYi%_Rts=A!oJ*JL-^ z5@^lal&chS^pmAA!D6sqN-!~Q0Br+hb|16Uf!hCJ9p8N2)4QlbRW~!i-o|sP@O*>l zcdOxv=o^{SVGqD+g_0qi)@KEiE9oXQH;{RI_6V@Zl4$jFfeI3N|60RBNz(TeYfj(J zTJ;EOfnv8zS8m0~*!^Jf<6xNyrt_~m++pXohEC$6p0!baliEKS4fmb*Plomcr4q)t z0SRPyo);X9gij#5mA~);Ps*wuw!Ob<7Wq6P8g)W#T-IucwXH*z6Dq(Mhj(d6K@?WN zaPXexS*A#C){ClgwJ%-Vc>yo`&xYbiiuFmdX^PTG4@su%{wTX2+ zO`3k8Mkf|Mjhia+U^vUsr6-P3LHCL?uM^EX2S!?ZpHQ|+%k`KT(&fwl=`RMK@tdv4 zDNW)6xH@HS1Rv-a9fx!nuS1lT7Sv;(g%9Es#aIZ0(xg{C!lAsPo!3xW3UL3kP zR^0PzdvLms-p^_6mxK#W`w=t#V(==rm*ELg1pmYfbY@gF#r}^7^1_1XdcbC&_*y`t z`Vb_Px4A=a_!f6kGA+}GQmE6qZbrO1Q(OpKp-J_R5Adt%E+|;ccNdV4nwMmCLry5V0Fx=$}k^hy9o0|7Aek-_aV0DP7M#Kg=psJFINX1m^*Y)bOpiFecNL+SGNW z^qBQ<0QSU=d#Aws(VxkCM$t_{dzp#siqCbMSf9=uthD!LGWw+zOUl&c^W$dglOaFQufjF_Z6mBZ%-nE9Suf zy8|+&TMk;sGrR7+j?TwV<4GC;7U*T*cFAJ*ejv65<}pb@)Ps(p4_uzjzpr@xFwoea z2;fo*k#HMTCweg}i~B#ZudwAF{>6NII^ICLQ*mq>9*SF(dYq+`Pr=f3GAo>^ReUzl zh%W%0w|;#Izl*G>fnFk}ZifKRvQ=j$gZI8aabDeFwJgV8aD)mC>U<0JFN0U>1c}lN z_9Z@s>pZcP%@0Z7{->22TIFXQ_b!wJG0zKiJo&F+(FU3dIoCth^)8yRwI<60;)yZ^ zW{LRRM#sj{*1{TrA~%m0$iEgUcHc6S2NgN|xzhCq04MAhPHG|X{*3GS2e@A19{`Dz zPNmEX$Qo!OvFwxFI_Z8cr_u2YoXVsa)G3Tinm(S)c z#6FeR#P`d5rRP7;pKUgR7q-$Io=^_-J|*gqmC2x6h}UG3HRxB8weU=4W(1Alfjc-yHwsf2{vE#1 zTE#mR=Q`rH^3#fpoQ7trS*C}20<%pI&cq>~m$UkfBH!_6XqMynoXEv*={5X4Err2D zERn@-rOfc5@RN4M8mY*l+MVi8)(Cq8o?@1t`(BIcmi|Oq3itCI%=nhqz`{SpRSpUo`{*%`OI$XsfX zT!Wv!B`i4cdj;03P3!t zlYR-JGA^)jZ8f={x02_+7Ph{2V*aw%(qv0q!yipwE0#B=k{?&d@k*G|Lz5ydWSr)i zxt>IjucG3z$3i)t!k7+$AYavqW7NX(sET;H9glYC-PFsECVek}p0rXdwXK^^la{$h zt^HK#`)72Z)n#FW<}`biCxo<@e?`KaY@mazQsczFK-CnM^FFf@)MN+){c zr}=)&=RGyoZg4hYmN^G>tz)V6Y|Va@`@(47<&UyqT zgylJD8|sJssdF=a9+w5?@u&D{o)Z7=*Cr1yg0B-g5ErG*MoHPAA7P2Tj@zrs(GS%o zXGS+_f|mw;&RGz@Ji!c3ROco!xt_>$fF^J0mjE<$e_wD!pIo!MRWM=XXk2!uqRrG? zZLAe~LLni&E7>o52EzD!+lh7Xe$A^?As?J8>&^PWyUUPHlA$GCE8Dy_pMTC5xiL<< zFu}v`r;G5FLGPmBegd>%NlTe4lzrRf|hCR$0QKZop< zx8;@EXn9iipdSc}jeKGu=~q~dt#Nogvh~F^-VevHs`wJ4$g9=Zai7QF*BrwM zB_(ObqSJ`{&jp7k>GL?FbKE&vPOah!PhxWG#pOyW#UOG(p_m)Y&figSnCCQy-Tzej z7jt%-tU^YtKR0CO>d=iHA()))yy~Lp8CH&LMkKs;$bqPTw?f^Sa38 zJ(QVlBWbgUa^3Nm%zqf`zj2oL;QUZ6(frX5UA5bQvf;V%_ofhdsTtD}O*WrcnJ|>R zT0*zBlQTZl`r}67V6Ieg@(2G!yvqQT7Ut}Ep@^Zh9+mNTY}1-)xge8gzZoj5cEC0} z%8+Uc!@B;6f8-TwXk#>x83^2SF)xbSkviDvR4r(<$5^-`uYimaY!PfZ-g6FzOqtt% zdRN$@d|cBLXQo&XY;xF_BXUyQ-uM?Ze{Z5^7+4>EZvS6$at-w28p$un5(<+TaFVQ($pnFZ+GVGzIIVX?SC$iT{xyb|szm#Ks zzC@TeQM{*5Sg1~R1XHWd0!!duRV8eG+KE)p5wJ}Mf6V(8St1)LZ7z52b?>8}_o?_7 zEk8CcU^~186A|NsSz#w6iLrgRR=y(M|7<=hs!mZ})OQqZau1JQsP^K%%RAO;tQ8L8 z@x0LEG2tLFR<-Yqr{~E!aiZS_%8GU3=r3tSWKb~cIvEjwD#@_N8wU{L$;Z|XZ>o2uzd%kuicvP zP-9acdr@inQe{Hr>o{5(i$sG=Ik9yQ#0$lShZ&IcS3%QZS5*k2(Wzg=Oz^%sO+IP&K^W}a_t_M7C zrqpLUFqNCw&cxMK&OuTEDkcA9f&o zS17hzXPs)`_GXEJdd)t_R75%C=1qaN zW@@W22d%8W9g57ZSSb^iUj;F^>KYA$H^)B87BUn?Eeyh4w-y#Kk`w z+xN4ZR`%0aDlXS> zOrbL8cD^=^x>9x(AyRFp7B4pmcR$f@{;cddF#kdf?AuDM5GOVVja`&n|yBoP3#apZ8pulo{Am@>k&BSv^3nUOwV?h%bE;QP(oib=+COzMJIcAb7m1 zm`Qrktsq@ZQH&)F{qjb{O-F^tm9B~`nkjdof9gZfq&I>uf*hMB{+ci}@aP>^3v~E) z_zjf=;gU?Q(|PwZ8|0y5$h<&V@RJ?6SVjj#fPycWC1~f)3HtKCmO8-v43g zu=}X7bV2X7-)8KOvh;BLOx=x5eA}Z=h%#fS0-ONsyR!OfTJk$xQt49AVi;(*@2WRLUctnm-r>>=Lprj6H&Ga6$xoB%d}hC7hybMcK(M zt9plWYUB`Z^?#sijx69mnZ(cW!K-XJ8Z>|1)Prm%mazpPG3!|V|1-6k4~<=gG}bwK z7GrDNYxR!dNOI4Zu#~3Trx!IJXn&SHsm=5k8eRe)fNCBmn6FH}<8oQhj*8)cCRDg3 zB;x}jA5EjRRwzP5c_T3ta77DwfWBCZ;7W}o6>T@BTb9EQsD!mb$b<`rXfx*La$7j-3ZHq0lUk?MKxQY+l4-kRpR%H_`Y`moeWV zz6hZUr0#WrI0obV_=gD(qwgQbdFu&DuLs+iVsM2$_=09<8ZuEh=A)jW7x&ST*tGK& zbI_&zgJqHN28lJejF64Wv@bMfA?^s)gKeQ}B0XO@NaJb(+?>llVw{CbdNPOfT|AK` zDUm8LrM4%=Uj2I4f-0}KIE&k*cv|A3k`POSt2511^bcP z7Q#@I&Zt(->jC86DIZ-_>Ih++b+w-hS)@q!02QMU=c`%wz!_nd>UmUB(8r7W4M1dU zTKhdS`C~v_b}B8t)l9M-nb?q#0)>la>7%al|K5s>4vbwaH9Ia4zxYn|ZT-aE8D}}v z7M|3*ZG8UuUeA5n2;@HaS~997Mp@Px`N$j$y??%R2@Dw`sHw3!!QF|)%NM}pjM1wj z9xvlxIW&@CBWg2Bgz3q&wZ~mNX`l8rPp`LDFttEa8@t{hmcZ-rs9Bv&)bPSAxjmDm ztsKyAuC6B@75KydX0s=xWID9@{PcOLG3#ZewQBW4oCdWTh)3CG>&tm+bK&XYGV4_r zMdv8L@36)F0pmM=1??P_Y~(O}%O5NYfnnSi%6qDM{HZU|+`)UeNFeI?>nrUPxV^H& zpv=DH$%~sankxGySmvcfbgaMQRG6x^d@fUA8TfxThZCwKW=m45?3Y2+5O0x#FXr@i zo>->z*3L>x7OKq7XUMpjWfM#2PxkzidM+;!VJu_RAk!aOTK7>AwKwmN&{aHI&)j16 zeOc9pt>eNVJd}%ZL|9*@IaCstf67C)T(V!ex)_0)MqI;dGU_d>Jw!upSJ`/}^U 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

VT` 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 DNH9Go delta 170622 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

|#fh7UgY5X%J(XzH?kf1%T8) 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 diff --git a/scripts/aws/lib/construct/db.ts b/scripts/aws/lib/construct/db.ts index 8be1f5212..34cb8a482 100644 --- a/scripts/aws/lib/construct/db.ts +++ b/scripts/aws/lib/construct/db.ts @@ -1,6 +1,7 @@ import { Construct } from 'constructs'; import * as ec2 from 'aws-cdk-lib/aws-ec2' import * as rds from "aws-cdk-lib/aws-rds"; +import * as cdk from 'aws-cdk-lib'; interface RdsProps { vpc: ec2.Vpc @@ -20,7 +21,7 @@ export class Rds extends Construct{ const rdsCredentials = rds.Credentials.fromGeneratedSecret('db_user',{ secretName: 'langflow-DbSecret', }) - + // DB クラスターのパラメータグループ作成 const clusterParameterGroup = new rds.ParameterGroup(scope, 'ClusterParameterGroup',{ engine: rds.DatabaseClusterEngine.auroraMysql({ From 7541b532ba4b9750506a7688a72d1003fb1274a7 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Tue, 5 Dec 2023 03:37:03 +0000 Subject: [PATCH 110/203] update readme --- scripts/aws/README.ja.md | 4 ++-- scripts/aws/README.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/aws/README.ja.md b/scripts/aws/README.ja.md index f7f093394..e8c7c6a81 100644 --- a/scripts/aws/README.ja.md +++ b/scripts/aws/README.ja.md @@ -3,12 +3,12 @@ **想定時間**: 30 分 ## 説明 -Langflow on AWS では、 AWS Cloud Development Kit (CDK) を用いて Langflow を AWS 上にデプロイする方法を学べます。 +Langflow on AWS では、 [AWS Cloud Development Kit](https://aws.amazon.com/cdk/?nc2=type_a) (CDK) を用いて Langflow を AWS 上にデプロイする方法を学べます。 このチュートリアルは、AWS アカウントと AWS に関する基本的な知識を有していることを前提としています。 作成するアプリケーションのアーキテクチャです。 ![langflow-archi](./img/langflow-archi.png) -[AWS CDK](https://aws.amazon.com/cdk/?nc2=type_a) によって [Application Load Balancer](https://aws.amazon.com/elasticloadbalancing/application-load-balancer/?nc1=h_ls)、[AWS Fargate](https://aws.amazon.com/fargate/?nc2=type_a)、[Amazon Aurora](https://aws.amazon.com/rds/aurora/?nc2=type_a) を作成します。 +AWS CDK によって [Application Load Balancer](https://aws.amazon.com/elasticloadbalancing/application-load-balancer/?nc1=h_ls)、[AWS Fargate](https://aws.amazon.com/fargate/?nc2=type_a)、[Amazon Aurora](https://aws.amazon.com/rds/aurora/?nc2=type_a) を作成します。 Auroraのシークレットは [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/?nc2=type_a) によって管理されます。 Fargate のタスクはフロントエンドとバックエンドに分かれており、サービス検出によって通信します。 リソースをデプロイするだけであれば、上記の各サービスについて深い知識は必要ありません。 diff --git a/scripts/aws/README.md b/scripts/aws/README.md index 384b755fe..06c475ae8 100644 --- a/scripts/aws/README.md +++ b/scripts/aws/README.md @@ -3,13 +3,13 @@ **Duraration**: 30 minutes ## Introduction -In this tutorial, you will learn how to deploy langflow on AWS using AWS Cloud Development Kit (CDK). +In this tutorial, you will learn how to deploy langflow on AWS using [AWS Cloud Development Kit](https://aws.amazon.com/cdk/?nc2=type_a) (CDK). This tutorial assumes you have an AWS account and basic knowledge of AWS. The architecture of the application to be created: ![langflow-archi](./img/langflow-archi.png) -[Application Load Balancer](https://aws.amazon.com/elasticloadbalancing/application-load-balancer/?nc1=h_ls), [AWS Fargate](https://aws.amazon.com/fargate/?nc2=type_a) and [Amazon Aurora](https://aws.amazon.com/rds/aurora/?nc2=type_a) are created by [AWS CDK](https://aws.amazon.com/cdk/?nc2=type_a). +[Application Load Balancer](https://aws.amazon.com/elasticloadbalancing/application-load-balancer/?nc1=h_ls), [AWS Fargate](https://aws.amazon.com/fargate/?nc2=type_a) and [Amazon Aurora](https://aws.amazon.com/rds/aurora/?nc2=type_a) are created by AWS CDK. The aurora's secrets are managed by [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/?nc2=type_a). The Fargate task is divided into a frontend and a backend, which communicate through service discovery. If you just want to deploy resources, you do not need in-depth knowledge of each of the above services. From 43aa1d97dae2dbb062c2a03032cec04ae80edc11 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Wed, 6 Dec 2023 23:24:14 +0900 Subject: [PATCH 111/203] reverted: py file --- src/backend/langflow/alembic.ini | 2 +- .../langflow/services/settings/base.py | 40 +++++++++---------- src/backend/langflow/settings.py | 8 ++-- 3 files changed, 23 insertions(+), 27 deletions(-) diff --git a/src/backend/langflow/alembic.ini b/src/backend/langflow/alembic.ini index cba482993..379661422 100644 --- a/src/backend/langflow/alembic.ini +++ b/src/backend/langflow/alembic.ini @@ -63,7 +63,7 @@ version_path_separator = os # Use os.pathsep. Default configuration used for ne # This is the path to the db in the root of the project. # When the user runs the Langflow the database url will # be set dinamically. -# sqlalchemy.url = sqlite:///../../../langflow.db +sqlalchemy.url = sqlite:///../../../langflow.db [post_write_hooks] diff --git a/src/backend/langflow/services/settings/base.py b/src/backend/langflow/services/settings/base.py index 1f30aa3e0..4e4ff164b 100644 --- a/src/backend/langflow/services/settings/base.py +++ b/src/backend/langflow/services/settings/base.py @@ -86,31 +86,29 @@ class Settings(BaseSettings): value = langflow_database_url logger.debug("Using LANGFLOW_DATABASE_URL env variable.") else: - # logger.debug("No DATABASE_URL env variable, using sqlite database") - logger.debug("No DATABASE_URL env variable, using custom database from secrets of {}".format(os.environ["host"])) + logger.debug("No DATABASE_URL env variable, using sqlite database") # Originally, we used sqlite:///./langflow.db # so we need to migrate to the new format # if there is a database in that location - # if not values["CONFIG_DIR"]: - # raise ValueError( - # "CONFIG_DIR not set, please set it or provide a DATABASE_URL" - # ) + if not values["CONFIG_DIR"]: + raise ValueError( + "CONFIG_DIR not set, please set it or provide a DATABASE_URL" + ) - # new_path = f"{values['CONFIG_DIR']}/langflow.db" - # if Path("./langflow.db").exists(): - # if Path(new_path).exists(): - # logger.debug(f"Database already exists at {new_path}, using it") - # else: - # try: - # logger.debug("Copying existing database to new location") - # copy2("./langflow.db", new_path) - # logger.debug(f"Copied existing database to {new_path}") - # except Exception: - # logger.error("Failed to copy database, using default path") - # new_path = "./langflow.db" + new_path = f"{values['CONFIG_DIR']}/langflow.db" + if Path("./langflow.db").exists(): + if Path(new_path).exists(): + logger.debug(f"Database already exists at {new_path}, using it") + else: + try: + logger.debug("Copying existing database to new location") + copy2("./langflow.db", new_path) + logger.debug(f"Copied existing database to {new_path}") + except Exception: + logger.error("Failed to copy database, using default path") + new_path = "./langflow.db" - # value = f"sqlite:///{new_path}" - value = "mysql+pymysql://{}:{}@{}:3306/{}".format(os.environ["username"],os.environ["password"],os.environ["host"],os.environ["dbname"]) + value = f"sqlite:///{new_path}" return value @@ -234,4 +232,4 @@ def load_settings_from_yaml(file_path: str) -> Settings: raise KeyError(f"Key {key} not found in settings") logger.debug(f"Loading {len(settings_dict[key])} {key} from {file_path}") - return Settings(**settings_dict) + return Settings(**settings_dict) \ No newline at end of file diff --git a/src/backend/langflow/settings.py b/src/backend/langflow/settings.py index ab9217d2c..1710bb013 100644 --- a/src/backend/langflow/settings.py +++ b/src/backend/langflow/settings.py @@ -46,10 +46,8 @@ class Settings(BaseSettings): value = langflow_database_url logger.debug("Using LANGFLOW_DATABASE_URL env variable.") else: - # logger.debug("No DATABASE_URL env variable, using sqlite database") - logger.debug("No DATABASE_URL env variable, using custom database from secrets of {}".format(os.environ["host"])) - # value = "sqlite:///./langflow.db" - value = "mysql+pymysql://{}:{}@{}:3306/{}".format(os.environ["username"],os.environ["password"],os.environ["host"],os.environ["dbname"]) + logger.debug("No DATABASE_URL env variable, using sqlite database") + value = "sqlite:///./langflow.db" return value @@ -176,4 +174,4 @@ def load_settings_from_yaml(file_path: str) -> Settings: return Settings(**settings_dict) -settings = load_settings_from_yaml("config.yaml") +settings = load_settings_from_yaml("config.yaml") \ No newline at end of file From 51159fc3c10c04d58712f992e67da18d72ce5730 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 7 Dec 2023 19:19:48 +0900 Subject: [PATCH 112/203] Set Environment variable by Dockerfile --- cdk.Dockerfile | 2 +- container-cmd-cdk.sh | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 container-cmd-cdk.sh diff --git a/cdk.Dockerfile b/cdk.Dockerfile index 44ccf0acb..670ae49bd 100644 --- a/cdk.Dockerfile +++ b/cdk.Dockerfile @@ -17,4 +17,4 @@ RUN poetry config virtualenvs.create false && poetry install --no-interaction -- RUN poetry add pymysql==1.0.2 -CMD ["uvicorn", "--factory", "src.backend.langflow.main:create_app", "--host", "0.0.0.0", "--port", "7860", "--reload", "--log-level", "debug"] +CMD ["sh", "./container-cmd-cdk.sh"] diff --git a/container-cmd-cdk.sh b/container-cmd-cdk.sh new file mode 100644 index 000000000..6b71d0fcc --- /dev/null +++ b/container-cmd-cdk.sh @@ -0,0 +1,3 @@ +export LANGFLOW_DATABASE_URL="mysql+pymysql://${username}:${password}@${host}:3306/${dbname}" +echo $LANGFLOW_DATABASE_URL +uvicorn --factory src.backend.langflow.main:create_app --host 0.0.0.0 --port 7860 --reload --log-level debug \ No newline at end of file From 1113a4cf7e8fad64df70b1f47dee5a9599b91231 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Thu, 7 Dec 2023 21:08:24 +0900 Subject: [PATCH 113/203] modified: match settings with dev --- src/backend/langflow/services/settings/base.py | 2 +- src/backend/langflow/settings.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/langflow/services/settings/base.py b/src/backend/langflow/services/settings/base.py index 4e4ff164b..053c45afd 100644 --- a/src/backend/langflow/services/settings/base.py +++ b/src/backend/langflow/services/settings/base.py @@ -232,4 +232,4 @@ def load_settings_from_yaml(file_path: str) -> Settings: raise KeyError(f"Key {key} not found in settings") logger.debug(f"Loading {len(settings_dict[key])} {key} from {file_path}") - return Settings(**settings_dict) \ No newline at end of file + return Settings(**settings_dict) diff --git a/src/backend/langflow/settings.py b/src/backend/langflow/settings.py index 1710bb013..6b6e81baf 100644 --- a/src/backend/langflow/settings.py +++ b/src/backend/langflow/settings.py @@ -174,4 +174,4 @@ def load_settings_from_yaml(file_path: str) -> Settings: return Settings(**settings_dict) -settings = load_settings_from_yaml("config.yaml") \ No newline at end of file +settings = load_settings_from_yaml("config.yaml") From e465d254b07ed66b8207eeaaa439c99617056bc3 Mon Sep 17 00:00:00 2001 From: nsxshota Date: Fri, 8 Dec 2023 00:18:04 +0900 Subject: [PATCH 114/203] modified: docker compose --- container-cmd-cdk.sh | 2 +- docker-compose.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/container-cmd-cdk.sh b/container-cmd-cdk.sh index 6b71d0fcc..3ac6400d8 100644 --- a/container-cmd-cdk.sh +++ b/container-cmd-cdk.sh @@ -1,3 +1,3 @@ export LANGFLOW_DATABASE_URL="mysql+pymysql://${username}:${password}@${host}:3306/${dbname}" -echo $LANGFLOW_DATABASE_URL +# echo $LANGFLOW_DATABASE_URL uvicorn --factory src.backend.langflow.main:create_app --host 0.0.0.0 --port 7860 --reload --log-level debug \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 8799c90aa..81914ee40 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,7 +6,7 @@ services: backend: build: context: ./ - dockerfile: ./cdk.Dockerfile + dockerfile: ./dev.Dockerfile env_file: - .env ports: @@ -19,7 +19,7 @@ services: frontend: build: context: ./src/frontend - dockerfile: ./cdk.Dockerfile + dockerfile: ./dev.Dockerfile args: - BACKEND_URL=http://backend:7860 environment: From 40664f561a709edf614c4b68266539f5e117240f Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 7 Dec 2023 13:58:49 -0300 Subject: [PATCH 115/203] Fix WebSocket host configuration --- src/frontend/src/modals/formModal/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/frontend/src/modals/formModal/index.tsx b/src/frontend/src/modals/formModal/index.tsx index 6c8a733ef..b04ac8dd0 100644 --- a/src/frontend/src/modals/formModal/index.tsx +++ b/src/frontend/src/modals/formModal/index.tsx @@ -197,8 +197,8 @@ export default function FormModal({ const isSecureProtocol = window.location.protocol === "https:" || window.location.port === "443"; const webSocketProtocol = isSecureProtocol ? "wss" : "ws"; - // const host = isDevelopment ? "localhost:7860" : window.location.host; - const host = window.location.host; + const host = isDevelopment ? "localhost:7860" : window.location.host; + const chatEndpoint = `/api/v1/chat/${chatId}`; return `${ From 79c93bcfe9c0c27559772104a6ec2e3c7d086b1a Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 7 Dec 2023 14:00:51 -0300 Subject: [PATCH 116/203] Refactor database URL handling and add logger messages --- src/backend/langflow/settings.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/backend/langflow/settings.py b/src/backend/langflow/settings.py index ab9217d2c..284e810fc 100644 --- a/src/backend/langflow/settings.py +++ b/src/backend/langflow/settings.py @@ -1,13 +1,13 @@ import contextlib import json import os -from typing import Optional, List from pathlib import Path +from typing import List, Optional import yaml -from pydantic import validator, model_validator -from pydantic_settings import BaseSettings from langflow.utils.logger import logger +from pydantic import model_validator, validator +from pydantic_settings import BaseSettings BASE_COMPONENTS_PATH = str(Path(__file__).parent / "components") @@ -46,11 +46,8 @@ class Settings(BaseSettings): value = langflow_database_url logger.debug("Using LANGFLOW_DATABASE_URL env variable.") else: - # logger.debug("No DATABASE_URL env variable, using sqlite database") - logger.debug("No DATABASE_URL env variable, using custom database from secrets of {}".format(os.environ["host"])) - # value = "sqlite:///./langflow.db" - value = "mysql+pymysql://{}:{}@{}:3306/{}".format(os.environ["username"],os.environ["password"],os.environ["host"],os.environ["dbname"]) - + logger.debug("No DATABASE_URL env variable, using sqlite database") + value = "sqlite:///./langflow.db" return value @validator("COMPONENTS_PATH", pre=True) @@ -58,7 +55,7 @@ class Settings(BaseSettings): if os.getenv("LANGFLOW_COMPONENTS_PATH"): logger.debug("Adding LANGFLOW_COMPONENTS_PATH to components_path") langflow_component_path = os.getenv("LANGFLOW_COMPONENTS_PATH") - if ( + if langflow_component_path and ( Path(langflow_component_path).exists() and langflow_component_path not in value ): From 501ba416d14076330abd8ad29c5bed0372391b58 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 7 Dec 2023 14:02:41 -0300 Subject: [PATCH 117/203] Refactor database connection logic in base settings --- .../langflow/services/settings/base.py | 46 +++++++++---------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/src/backend/langflow/services/settings/base.py b/src/backend/langflow/services/settings/base.py index 1f30aa3e0..91b0044b6 100644 --- a/src/backend/langflow/services/settings/base.py +++ b/src/backend/langflow/services/settings/base.py @@ -1,15 +1,15 @@ import contextlib import json -import orjson import os -from shutil import copy2 -from typing import Optional, List from pathlib import Path +from shutil import copy2 +from typing import List, Optional +import orjson import yaml +from loguru import logger from pydantic import field_validator, validator from pydantic_settings import BaseSettings, SettingsConfigDict -from loguru import logger # BASE_COMPONENTS_PATH = str(Path(__file__).parent / "components") BASE_COMPONENTS_PATH = str(Path(__file__).parent.parent.parent / "components") @@ -86,31 +86,29 @@ class Settings(BaseSettings): value = langflow_database_url logger.debug("Using LANGFLOW_DATABASE_URL env variable.") else: - # logger.debug("No DATABASE_URL env variable, using sqlite database") - logger.debug("No DATABASE_URL env variable, using custom database from secrets of {}".format(os.environ["host"])) + logger.debug("No DATABASE_URL env variable, using sqlite database") # Originally, we used sqlite:///./langflow.db # so we need to migrate to the new format # if there is a database in that location - # if not values["CONFIG_DIR"]: - # raise ValueError( - # "CONFIG_DIR not set, please set it or provide a DATABASE_URL" - # ) + if not values["CONFIG_DIR"]: + raise ValueError( + "CONFIG_DIR not set, please set it or provide a DATABASE_URL" + ) - # new_path = f"{values['CONFIG_DIR']}/langflow.db" - # if Path("./langflow.db").exists(): - # if Path(new_path).exists(): - # logger.debug(f"Database already exists at {new_path}, using it") - # else: - # try: - # logger.debug("Copying existing database to new location") - # copy2("./langflow.db", new_path) - # logger.debug(f"Copied existing database to {new_path}") - # except Exception: - # logger.error("Failed to copy database, using default path") - # new_path = "./langflow.db" + new_path = f"{values['CONFIG_DIR']}/langflow.db" + if Path("./langflow.db").exists(): + if Path(new_path).exists(): + logger.debug(f"Database already exists at {new_path}, using it") + else: + try: + logger.debug("Copying existing database to new location") + copy2("./langflow.db", new_path) + logger.debug(f"Copied existing database to {new_path}") + except Exception: + logger.error("Failed to copy database, using default path") + new_path = "./langflow.db" - # value = f"sqlite:///{new_path}" - value = "mysql+pymysql://{}:{}@{}:3306/{}".format(os.environ["username"],os.environ["password"],os.environ["host"],os.environ["dbname"]) + value = f"sqlite:///{new_path}" return value From 1e1e49b862340b7b0e8e74f628f788148fdafc7a Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 7 Dec 2023 14:03:20 -0300 Subject: [PATCH 118/203] Update database URL in alembic.ini --- src/backend/langflow/alembic.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/langflow/alembic.ini b/src/backend/langflow/alembic.ini index cba482993..379661422 100644 --- a/src/backend/langflow/alembic.ini +++ b/src/backend/langflow/alembic.ini @@ -63,7 +63,7 @@ version_path_separator = os # Use os.pathsep. Default configuration used for ne # This is the path to the db in the root of the project. # When the user runs the Langflow the database url will # be set dinamically. -# sqlalchemy.url = sqlite:///../../../langflow.db +sqlalchemy.url = sqlite:///../../../langflow.db [post_write_hooks] From 4e9ef4c83141c3c5c6fde4c435f57d82e4265dff Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 7 Dec 2023 14:05:42 -0300 Subject: [PATCH 119/203] Fix typo in README.md --- scripts/aws/README.md | 51 +++++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/scripts/aws/README.md b/scripts/aws/README.md index 06c475ae8..9190046a3 100644 --- a/scripts/aws/README.md +++ b/scripts/aws/README.md @@ -1,8 +1,9 @@ # Deploy Langflow on AWS -**Duraration**: 30 minutes +**Duration**: 30 minutes ## Introduction + In this tutorial, you will learn how to deploy langflow on AWS using [AWS Cloud Development Kit](https://aws.amazon.com/cdk/?nc2=type_a) (CDK). This tutorial assumes you have an AWS account and basic knowledge of AWS. @@ -15,36 +16,38 @@ The Fargate task is divided into a frontend and a backend, which communicate thr If you just want to deploy resources, you do not need in-depth knowledge of each of the above services. # How to set up your environment and deploy langflow + 1. Open [AWS CloudShell](https://us-east-1.console.aws.amazon.com/cloudshell/home?region=us-east-1). 1. Run the following commands in Cloudshell: - ```shell - git clone https://github.com/aws-samples/cloud9-setup-for-prototyping - cd cloud9-setup-for-prototyping - ./bin/bootstrap - ``` + ```shell + git clone https://github.com/aws-samples/cloud9-setup-for-prototyping + cd cloud9-setup-for-prototyping + ./bin/bootstrap + ``` 1. When you see `Done!` in Cloudshell, open `cloud9-for-prototyping` from [AWS Cloud9](https://us-east-1.console.aws.amazon.com/cloud9control/home?region=us-east-1#/). - ![make-cloud9](./img/langflow-cloud9-en.png) + ![make-cloud9](./img/langflow-cloud9-en.png) 1. Run the following command in the Cloud9 terminal. - ```shell - git clone -b aws-cdk-dev2 https://github.com/kazuki306/langflow - cd langflow/scripts/aws - cp .env.example .env # Edit this file if you need environment settings - npm ci - cdk bootstrap - cdk deploy - ``` + ```shell + git clone -b aws-cdk-dev2 https://github.com/kazuki306/langflow + cd langflow/scripts/aws + cp .env.example .env # Edit this file if you need environment settings + npm ci + cdk bootstrap + cdk deploy + ``` 1. Access the URL displayed. - ```shell - Outputs: - LangflowAppStack.NetworkURLXXXXXX = http://alb-XXXXXXXXXXX.elb.amazonaws.com - ``` + ```shell + Outputs: + LangflowAppStack.NetworkURLXXXXXX = http://alb-XXXXXXXXXXX.elb.amazonaws.com + ``` 1. Enter your user name and password to sign in. If you have not set a user name and password in your `.env` file, the user name will be set to `admin` and the password to `123456`. - ![signin-langflow](./img/langflow-signin.png) + ![signin-langflow](./img/langflow-signin.png) # Cleanup + 1. Run the following command in the Cloud9 terminal. - ```shell - bash delete-resources.sh - ``` + ```shell + bash delete-resources.sh + ``` 1. Open [AWS CloudFormation](https://us-east-1.console.aws.amazon.com/cloudformation/home?region=us-east-1#/getting-started), select `aws-cloud9-cloud9-for-prototyping-XXXX` and delete it. -![delete-cfn](./img/langflow-cfn.png) \ No newline at end of file + ![delete-cfn](./img/langflow-cfn.png) From 4328c180d8bcdcfc494fd3e6b019d0dac0c59763 Mon Sep 17 00:00:00 2001 From: kazuki306 Date: Sat, 9 Dec 2023 10:47:50 +0900 Subject: [PATCH 120/203] update README --- scripts/aws/README.ja.md | 2 +- scripts/aws/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/aws/README.ja.md b/scripts/aws/README.ja.md index e8c7c6a81..aa3b6c710 100644 --- a/scripts/aws/README.ja.md +++ b/scripts/aws/README.ja.md @@ -28,7 +28,7 @@ Fargate のタスクはフロントエンドとバックエンドに分かれて 1. 以下のコマンドを実行します。 ```shell - git clone -b aws-cdk-dev2 https://github.com/kazuki306/langflow + git clone -b aws-cdk https://github.com/logspace-ai/langflow.git cd langflow/scripts/aws cp .env.example .env # 環境設定を変える場合はこのファイル(.env)を編集してください。 npm ci diff --git a/scripts/aws/README.md b/scripts/aws/README.md index 06c475ae8..cd5f25b8a 100644 --- a/scripts/aws/README.md +++ b/scripts/aws/README.md @@ -26,7 +26,7 @@ If you just want to deploy resources, you do not need in-depth knowledge of each ![make-cloud9](./img/langflow-cloud9-en.png) 1. Run the following command in the Cloud9 terminal. ```shell - git clone -b aws-cdk-dev2 https://github.com/kazuki306/langflow + git clone -b aws-cdk https://github.com/logspace-ai/langflow.git cd langflow/scripts/aws cp .env.example .env # Edit this file if you need environment settings npm ci From 2fd455362949a01147ae0f45407896ec68a343c9 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Mon, 11 Dec 2023 15:01:22 -0300 Subject: [PATCH 121/203] Commented out the "Stop services" step in the CI workflow --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ae1c613e2..2bc6e64f0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -48,5 +48,5 @@ jobs: run: docker compose up --exit-code-from tests tests result_backend broker celeryworker db --build continue-on-error: true - - name: Stop services - run: docker compose down + # - name: Stop services + # run: docker compose down From e61277cc6da3e523785e05fbb4e97f9a9c21b50b Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 13 Dec 2023 08:37:29 -0300 Subject: [PATCH 122/203] Fix typo in README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 068a9bd47..e8b2db8c1 100644 --- a/README.md +++ b/README.md @@ -115,7 +115,7 @@ Each option is detailed below: - `--install-completion [bash|zsh|fish|powershell|pwsh]`: Installs completion for the specified shell. - `--show-completion [bash|zsh|fish|powershell|pwsh]`: Shows completion for the specified shell, allowing you to copy it or customize the installation. - `--backend-only`: This parameter, with a default value of `False`, allows running only the backend server without the frontend. It can also be set using the `LANGFLOW_BACKEND_ONLY` environment variable. -- `store`: This parameter, with a default value of `True`, enables the store features, use `--no-store` to deactivate it. It can be configured using the `LANGFLOW_STORE` environment variable. +- `--store`: This parameter, with a default value of `True`, enables the store features, use `--no-store` to deactivate it. It can be configured using the `LANGFLOW_STORE` environment variable. These parameters are important for users who need to customize the behavior of Langflow, especially in development or specialized deployment scenarios. You may want to update the documentation to include these parameters for completeness and clarity. From 24ec1bc39e1a929c7803eac44b1be1d8ff8fa249 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 13 Dec 2023 15:10:01 -0300 Subject: [PATCH 123/203] Remove stale.yml configuration file --- .github/stale.yml | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 .github/stale.yml diff --git a/.github/stale.yml b/.github/stale.yml deleted file mode 100644 index a28a07086..000000000 --- a/.github/stale.yml +++ /dev/null @@ -1,17 +0,0 @@ -# Number of days of inactivity before an issue becomes stale -daysUntilStale: 45 -# Number of days of inactivity before a stale issue is closed -daysUntilClose: 7 -# Issues with these labels will never be considered stale -exemptLabels: - - pinned - - security -# Label to use when marking an issue as stale -staleLabel: stale -# Comment to post when marking an issue as stale. Set to `false` to disable -markComment: > - This issue has been automatically marked as stale because it has not had - recent activity. It will be closed if no further activity occurs. Thank you - for your contributions. -# Comment to post when closing a stale issue. Set to `false` to disable -closeComment: false From c8917481356417961fd436556e47c98a2eecc737 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 13 Dec 2023 19:55:01 -0300 Subject: [PATCH 124/203] Add python-ffmpeg packages --- poetry.lock | 34 +++++++++++++++++++++++++++++++++- pyproject.toml | 1 + 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index fbc0c2909..7031e2fe5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -6044,6 +6044,23 @@ files = [ pydantic = ">=2.3.0" python-dotenv = ">=0.21.0" +[[package]] +name = "pyee" +version = "11.1.0" +description = "A rough port of Node.js's EventEmitter to Python with a few tricks of its own" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyee-11.1.0-py3-none-any.whl", hash = "sha256:5d346a7d0f861a4b2e6c47960295bd895f816725b27d656181947346be98d7c1"}, + {file = "pyee-11.1.0.tar.gz", hash = "sha256:b53af98f6990c810edd9b56b87791021a8f54fd13db4edd1142438d44ba2263f"}, +] + +[package.dependencies] +typing-extensions = "*" + +[package.extras] +dev = ["black", "build", "flake8", "flake8-black", "isort", "jupyter-console", "mkdocs", "mkdocs-include-markdown-plugin", "mkdocstrings[python]", "pytest", "pytest-asyncio", "pytest-trio", "sphinx", "toml", "tox", "trio", "trio", "trio-typing", "twine", "twisted", "validate-pyproject[all]"] + [[package]] name = "pygments" version = "2.17.2" @@ -6383,6 +6400,21 @@ files = [ [package.extras] cli = ["click (>=5.0)"] +[[package]] +name = "python-ffmpeg" +version = "2.0.9" +description = "A python binding for FFmpeg which provides sync and async APIs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "python-ffmpeg-2.0.9.tar.gz", hash = "sha256:b06f2e85c5485d170c0e741b55072a5230de27a8e6b984399a4217a55c8cf043"}, + {file = "python_ffmpeg-2.0.9-py3-none-any.whl", hash = "sha256:0cd440da47caf378e512b5de97e578fb3f763f11576d97f8053ab0107b24d49e"}, +] + +[package.dependencies] +pyee = "*" +typing-extensions = "*" + [[package]] name = "python-iso639" version = "2023.12.11" @@ -9217,4 +9249,4 @@ local = ["ctransformers", "llama-cpp-python", "sentence-transformers"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.11" -content-hash = "a3b010e02c9cb3c943898847ab78644a5dcc38c8bf5108d833b06fb3378e7c96" +content-hash = "419f15ce0412c90f6235c4a9c2d80bdb80333b264dcb375c58fa303cf1c072ad" diff --git a/pyproject.toml b/pyproject.toml index eb07a828f..f5ed4b23e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -102,6 +102,7 @@ numexpr = "^2.8.6" qianfan = "0.0.5" pgvector = "^0.2.3" pyautogen = "^0.2.0" +python-ffmpeg = "^2.0.9" [tool.poetry.group.dev.dependencies] pytest-asyncio = "^0.23.1" From 94003cf39aa7e6ff20262c028925a9637cf6ee4c Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 13 Dec 2023 20:01:33 -0300 Subject: [PATCH 125/203] =?UTF-8?q?=F0=9F=90=9B=20fix(utils.py):=20add=20s?= =?UTF-8?q?upport=20for=20initializing=20class=20objects=20with=20a=20temp?= =?UTF-8?q?late=20parameter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/interface/initialize/utils.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/backend/langflow/interface/initialize/utils.py b/src/backend/langflow/interface/initialize/utils.py index 69e436fcf..5ecae3d70 100644 --- a/src/backend/langflow/interface/initialize/utils.py +++ b/src/backend/langflow/interface/initialize/utils.py @@ -5,6 +5,7 @@ from typing import Any, Dict, List import orjson from langchain.agents import ZeroShotAgent from langchain.schema import BaseOutputParser, Document + from langflow.services.database.models.base import orjson_dumps @@ -16,6 +17,8 @@ def handle_node_type(node_type, class_object, params: Dict): prompt = instantiate_from_template(class_object, params) elif node_type == "ChatPromptTemplate": prompt = class_object.from_messages(**params) + elif hasattr(class_object, "from_template") and params.get("template"): + prompt = class_object.from_template(template=params.pop("template")) else: prompt = class_object(**params) return params, prompt From 03be55a1bae1f37c6364a90d41069d0b36e1ce5d Mon Sep 17 00:00:00 2001 From: cristhianzl Date: Wed, 13 Dec 2023 20:14:34 -0300 Subject: [PATCH 126/203] feat(pageLayout): add support for displaying a beta icon in the page title feat(StorePage): enable beta icon in the PageLayout component style(applies.css): adjust styles for the beta icon in the page title --- src/frontend/src/components/pageLayout/index.tsx | 7 ++++++- src/frontend/src/pages/StorePage/index.tsx | 1 + src/frontend/src/style/applies.css | 8 ++++++-- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/frontend/src/components/pageLayout/index.tsx b/src/frontend/src/components/pageLayout/index.tsx index c6bc9de47..9af894730 100644 --- a/src/frontend/src/components/pageLayout/index.tsx +++ b/src/frontend/src/components/pageLayout/index.tsx @@ -6,11 +6,13 @@ export default function PageLayout({ description, children, button, + betaIcon, }: { title: string; description: string; children: React.ReactNode; button?: React.ReactNode; + betaIcon: boolean; }) { return (

@@ -18,7 +20,10 @@ export default function PageLayout({
-

{title}

+

+ {title} + {betaIcon && BETA} +

{description}

{button && button}
diff --git a/src/frontend/src/pages/StorePage/index.tsx b/src/frontend/src/pages/StorePage/index.tsx index 43067c7e3..dc2e4db37 100644 --- a/src/frontend/src/pages/StorePage/index.tsx +++ b/src/frontend/src/pages/StorePage/index.tsx @@ -164,6 +164,7 @@ export default function StorePage(): JSX.Element { return ( Date: Wed, 13 Dec 2023 20:27:07 -0300 Subject: [PATCH 127/203] refactor(GenericNode): simplify conditional class assignment for the div element in the GenericNode component --- src/frontend/src/CustomNodes/GenericNode/index.tsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/frontend/src/CustomNodes/GenericNode/index.tsx b/src/frontend/src/CustomNodes/GenericNode/index.tsx index eef1f64b9..425590896 100644 --- a/src/frontend/src/CustomNodes/GenericNode/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/index.tsx @@ -364,10 +364,9 @@ export default function GenericNode({
From b8698523653f2b90fa9fd25a3a7ef74a6c8514dd Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 13 Dec 2023 20:35:16 -0300 Subject: [PATCH 128/203] Update dependencies: ffmpeg-python, google-cloud-aiplatform, google-cloud-bigquery --- poetry.lock | 63 +++++++++++++++++++------------------------------- pyproject.toml | 2 +- 2 files changed, 25 insertions(+), 40 deletions(-) diff --git a/poetry.lock b/poetry.lock index 7031e2fe5..422fc564a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1615,6 +1615,23 @@ lz4 = ["lz4"] snappy = ["cramjam"] zstandard = ["zstandard"] +[[package]] +name = "ffmpeg-python" +version = "0.2.0" +description = "Python bindings for FFmpeg - with complex filtering support" +optional = false +python-versions = "*" +files = [ + {file = "ffmpeg-python-0.2.0.tar.gz", hash = "sha256:65225db34627c578ef0e11c8b1eb528bb35e024752f6f10b78c011f6f64c4127"}, + {file = "ffmpeg_python-0.2.0-py3-none-any.whl", hash = "sha256:ac441a0404e053f8b6a1113a77c0f452f1cfc62f6344a769475ffdc0f56c23c5"}, +] + +[package.dependencies] +future = "*" + +[package.extras] +dev = ["Sphinx (==2.1.0)", "future (==0.17.1)", "numpy (==1.16.4)", "pytest (==4.6.1)", "pytest-mock (==1.10.4)", "tox (==3.12.1)"] + [[package]] name = "filelock" version = "3.13.1" @@ -2140,13 +2157,13 @@ httplib2 = ">=0.19.0" [[package]] name = "google-cloud-aiplatform" -version = "1.38.0" +version = "1.38.1" description = "Vertex AI API client library" optional = false python-versions = ">=3.8" files = [ - {file = "google-cloud-aiplatform-1.38.0.tar.gz", hash = "sha256:dff91f79b64e279f0e61dfd63c4e067ba5fa75ef0f4614289bbdca70d086a9e2"}, - {file = "google_cloud_aiplatform-1.38.0-py2.py3-none-any.whl", hash = "sha256:7eec50d9a36d43e163f019a1ade9284d4580602a5108738a0ebff8940ea47ce0"}, + {file = "google-cloud-aiplatform-1.38.1.tar.gz", hash = "sha256:30439d914bb028443c0506cc0e6dd825cff5401aeb8233e13d8cfd77c3c87da1"}, + {file = "google_cloud_aiplatform-1.38.1-py2.py3-none-any.whl", hash = "sha256:5e1fcd1068dd2c4f0fc89aa616e34a8b9434eaa72ea6216f5036ef26f08bd448"}, ] [package.dependencies] @@ -2179,13 +2196,13 @@ xai = ["tensorflow (>=2.3.0,<3.0.0dev)"] [[package]] name = "google-cloud-bigquery" -version = "3.14.0" +version = "3.14.1" description = "Google BigQuery API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-bigquery-3.14.0.tar.gz", hash = "sha256:76c919f771ac82ba372f5a8d326c032229c5fdab738d03a2b6e73b412c22c9eb"}, - {file = "google_cloud_bigquery-3.14.0-py2.py3-none-any.whl", hash = "sha256:3304f4742546be70e531232f31bbf5b4b257aa63a508101ab7c4582c9503b636"}, + {file = "google-cloud-bigquery-3.14.1.tar.gz", hash = "sha256:aa15bd86f79ea76824c7d710f5ae532323c4b3ba01ef4abff42d4ee7a2e9b142"}, + {file = "google_cloud_bigquery-3.14.1-py2.py3-none-any.whl", hash = "sha256:a8ded18455da71508db222b7c06197bc12b6dbc6ed5b0b64e7007b76d7016957"}, ] [package.dependencies] @@ -6044,23 +6061,6 @@ files = [ pydantic = ">=2.3.0" python-dotenv = ">=0.21.0" -[[package]] -name = "pyee" -version = "11.1.0" -description = "A rough port of Node.js's EventEmitter to Python with a few tricks of its own" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pyee-11.1.0-py3-none-any.whl", hash = "sha256:5d346a7d0f861a4b2e6c47960295bd895f816725b27d656181947346be98d7c1"}, - {file = "pyee-11.1.0.tar.gz", hash = "sha256:b53af98f6990c810edd9b56b87791021a8f54fd13db4edd1142438d44ba2263f"}, -] - -[package.dependencies] -typing-extensions = "*" - -[package.extras] -dev = ["black", "build", "flake8", "flake8-black", "isort", "jupyter-console", "mkdocs", "mkdocs-include-markdown-plugin", "mkdocstrings[python]", "pytest", "pytest-asyncio", "pytest-trio", "sphinx", "toml", "tox", "trio", "trio", "trio-typing", "twine", "twisted", "validate-pyproject[all]"] - [[package]] name = "pygments" version = "2.17.2" @@ -6400,21 +6400,6 @@ files = [ [package.extras] cli = ["click (>=5.0)"] -[[package]] -name = "python-ffmpeg" -version = "2.0.9" -description = "A python binding for FFmpeg which provides sync and async APIs" -optional = false -python-versions = ">=3.7" -files = [ - {file = "python-ffmpeg-2.0.9.tar.gz", hash = "sha256:b06f2e85c5485d170c0e741b55072a5230de27a8e6b984399a4217a55c8cf043"}, - {file = "python_ffmpeg-2.0.9-py3-none-any.whl", hash = "sha256:0cd440da47caf378e512b5de97e578fb3f763f11576d97f8053ab0107b24d49e"}, -] - -[package.dependencies] -pyee = "*" -typing-extensions = "*" - [[package]] name = "python-iso639" version = "2023.12.11" @@ -9249,4 +9234,4 @@ local = ["ctransformers", "llama-cpp-python", "sentence-transformers"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.11" -content-hash = "419f15ce0412c90f6235c4a9c2d80bdb80333b264dcb375c58fa303cf1c072ad" +content-hash = "d6070874c0d4f695ee9863984c135de863f7978c33ed32998b0b7e11b2de2a9d" diff --git a/pyproject.toml b/pyproject.toml index 17c9098db..2ae3eb1fc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -102,7 +102,7 @@ numexpr = "^2.8.6" qianfan = "0.0.5" pgvector = "^0.2.3" pyautogen = "^0.2.0" -python-ffmpeg = "^2.0.9" +ffmpeg-python = "^0.2.0" [tool.poetry.group.dev.dependencies] pytest-asyncio = "^0.23.1" From f5c673d20775d4bb5a2a058072a60ddd3e2c18a5 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 13 Dec 2023 21:09:09 -0300 Subject: [PATCH 129/203] Add Google Generative AI component --- poetry.lock | 53 +++++++++++++- pyproject.toml | 1 + .../components/llms/GoogleGenerativeAI.py | 69 +++++++++++++++++++ 3 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 src/backend/langflow/components/llms/GoogleGenerativeAI.py diff --git a/poetry.lock b/poetry.lock index 422fc564a..4be3bc594 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2075,6 +2075,22 @@ certifi = "*" gevent = ">=0.13" six = "*" +[[package]] +name = "google-ai-generativelanguage" +version = "0.4.0" +description = "Google Ai Generativelanguage API client library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-ai-generativelanguage-0.4.0.tar.gz", hash = "sha256:c8199066c08f74c4e91290778329bb9f357ba1ea5d6f82de2bc0d10552bf4f8c"}, + {file = "google_ai_generativelanguage-0.4.0-py3-none-any.whl", hash = "sha256:e4c425376c1ee26c78acbc49a24f735f90ebfa81bf1a06495fae509a2433232c"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" + [[package]] name = "google-api-core" version = "2.15.0" @@ -2361,6 +2377,26 @@ files = [ [package.extras] testing = ["pytest"] +[[package]] +name = "google-generativeai" +version = "0.3.1" +description = "Google Generative AI High level API client library and tools." +optional = false +python-versions = ">=3.9" +files = [ + {file = "google_generativeai-0.3.1-py3-none-any.whl", hash = "sha256:800ec6041ca537b897d7ba654f4125651c64b38506f2bfce3b464370e3333a1b"}, +] + +[package.dependencies] +google-ai-generativelanguage = "0.4.0" +google-api-core = "*" +google-auth = "*" +protobuf = "*" +tqdm = "*" + +[package.extras] +dev = ["Pillow", "absl-py", "black", "ipython", "nose2", "pandas", "pytype", "pyyaml"] + [[package]] name = "google-resumable-media" version = "2.7.0" @@ -3635,6 +3671,21 @@ langchain-core = ">=0.1,<0.2" [package.extras] extended-testing = ["faker (>=19.3.1,<20.0.0)", "jinja2 (>=3,<4)", "presidio-analyzer (>=2.2.33,<3.0.0)", "presidio-anonymizer (>=2.2.33,<3.0.0)", "sentence-transformers (>=2,<3)", "vowpal-wabbit-next (==0.6.0)"] +[[package]] +name = "langchain-google-genai" +version = "0.0.2" +description = "An integration package connecting Google's genai package and LangChain" +optional = false +python-versions = ">=3.9,<4.0" +files = [ + {file = "langchain_google_genai-0.0.2-py3-none-any.whl", hash = "sha256:d98b1bb5eb0b65e7582fe18031ec0fe35d78820deb2825bddfe6c37218008e5c"}, + {file = "langchain_google_genai-0.0.2.tar.gz", hash = "sha256:6209991f8c5b07efc194514ab04baf3e8ffa4a95ae697db7d1c6ba8cd430ead8"}, +] + +[package.dependencies] +google-generativeai = ">=0.3.1,<0.4.0" +langchain-core = ">=0.1,<0.2" + [[package]] name = "langdetect" version = "1.0.9" @@ -9234,4 +9285,4 @@ local = ["ctransformers", "llama-cpp-python", "sentence-transformers"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.11" -content-hash = "d6070874c0d4f695ee9863984c135de863f7978c33ed32998b0b7e11b2de2a9d" +content-hash = "e86a9499adc75fb8d43f7bd1ff034128763c04669907bdf4e910ccc6a1f12770" diff --git a/pyproject.toml b/pyproject.toml index 2ae3eb1fc..20d93d01a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -103,6 +103,7 @@ qianfan = "0.0.5" pgvector = "^0.2.3" pyautogen = "^0.2.0" ffmpeg-python = "^0.2.0" +langchain-google-genai = "^0.0.2" [tool.poetry.group.dev.dependencies] pytest-asyncio = "^0.23.1" diff --git a/src/backend/langflow/components/llms/GoogleGenerativeAI.py b/src/backend/langflow/components/llms/GoogleGenerativeAI.py new file mode 100644 index 000000000..6a97405e8 --- /dev/null +++ b/src/backend/langflow/components/llms/GoogleGenerativeAI.py @@ -0,0 +1,69 @@ +from typing import Optional + +from langchain_google_genai import ChatGoogleGenerativeAI + +from langflow import CustomComponent +from langflow.field_typing import BaseLanguageModel, RangeSpec, TemplateField + + +class GoogleGenerativeAIComponent(CustomComponent): + display_name: str = "Google Generative AI" + description: str = "A component that uses Google Generative AI to generate text." + documentation: str = "http://docs.langflow.org/components/custom" + + def build_config(self): + return { + "google_api_key": TemplateField( + display_name="Google API Key", + info="The Google API Key to use for the Google Generative AI.", + ), + "max_output_tokens": TemplateField( + display_name="Max Output Tokens", + info="The maximum number of tokens to generate.", + ), + "temperature": TemplateField( + display_name="Temperature", + info="Run inference with this temperature. Must by in the closed interval [0.0, 1.0].", + ), + "top_k": TemplateField( + display_name="Top K", + info="Decode using top-k sampling: consider the set of top_k most probable tokens. Must be positive.", + range_spec=RangeSpec(min=0, max=2, step=0.1), + advanced=True, + ), + "top_p": TemplateField( + display_name="Top P", + info="The maximum cumulative probability of tokens to consider when sampling.", + advanced=True, + ), + "n": TemplateField( + display_name="N", + info="Number of chat completions to generate for each prompt. Note that the API may not return the full n completions if duplicates are generated.", + advanced=True, + ), + "model": TemplateField( + display_name="Model", + info="The name of the model to use. Supported examples: gemini-pro", + options=["gemini-pro", "gemini-pro-vision"], + ), + } + + def build( + self, + google_api_key: str, + model: str, + max_output_tokens: Optional[int] = None, + temperature: float = 0.1, + top_k: Optional[int] = None, + top_p: Optional[float] = None, + n: Optional[int] = 1, + ) -> BaseLanguageModel: + return ChatGoogleGenerativeAI( + model=model, + max_output_tokens=max_output_tokens or None, + temperature=temperature, + top_k=top_k or None, + top_p=top_p or None, + n=n or 1, + google_api_key=google_api_key, + ) From cb02ca0dc9047fd8397a4fc78e7aac27af2a0cda Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 13 Dec 2023 21:10:43 -0300 Subject: [PATCH 130/203] Remove ffmpeg-python package and its dependencies --- poetry.lock | 19 +------------------ pyproject.toml | 1 - 2 files changed, 1 insertion(+), 19 deletions(-) diff --git a/poetry.lock b/poetry.lock index 4be3bc594..05ee5bba5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1615,23 +1615,6 @@ lz4 = ["lz4"] snappy = ["cramjam"] zstandard = ["zstandard"] -[[package]] -name = "ffmpeg-python" -version = "0.2.0" -description = "Python bindings for FFmpeg - with complex filtering support" -optional = false -python-versions = "*" -files = [ - {file = "ffmpeg-python-0.2.0.tar.gz", hash = "sha256:65225db34627c578ef0e11c8b1eb528bb35e024752f6f10b78c011f6f64c4127"}, - {file = "ffmpeg_python-0.2.0-py3-none-any.whl", hash = "sha256:ac441a0404e053f8b6a1113a77c0f452f1cfc62f6344a769475ffdc0f56c23c5"}, -] - -[package.dependencies] -future = "*" - -[package.extras] -dev = ["Sphinx (==2.1.0)", "future (==0.17.1)", "numpy (==1.16.4)", "pytest (==4.6.1)", "pytest-mock (==1.10.4)", "tox (==3.12.1)"] - [[package]] name = "filelock" version = "3.13.1" @@ -9285,4 +9268,4 @@ local = ["ctransformers", "llama-cpp-python", "sentence-transformers"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.11" -content-hash = "e86a9499adc75fb8d43f7bd1ff034128763c04669907bdf4e910ccc6a1f12770" +content-hash = "6bed78abe6228dfd01ba4cf4052a95d24bcb0746294a8da442bbaa846187071f" diff --git a/pyproject.toml b/pyproject.toml index 20d93d01a..b3f662565 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -102,7 +102,6 @@ numexpr = "^2.8.6" qianfan = "0.0.5" pgvector = "^0.2.3" pyautogen = "^0.2.0" -ffmpeg-python = "^0.2.0" langchain-google-genai = "^0.0.2" [tool.poetry.group.dev.dependencies] From e212d83f6ab37c618a74979f02f7cdab46b431db Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 13 Dec 2023 21:11:38 -0300 Subject: [PATCH 131/203] Bump version to 0.6.3 in pyproject.toml --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index b3f662565..24b492c4f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langflow" -version = "0.6.2" +version = "0.6.3" description = "A Python package with a built-in web application" authors = ["Logspace "] maintainers = [ From 0442c7d42a3bc0c32f461b860d83441d6751d0e4 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 13 Dec 2023 21:15:22 -0300 Subject: [PATCH 132/203] Add "code" field to GoogleGenerativeAIComponent --- src/backend/langflow/components/llms/GoogleGenerativeAI.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/backend/langflow/components/llms/GoogleGenerativeAI.py b/src/backend/langflow/components/llms/GoogleGenerativeAI.py index 6a97405e8..4f9d2e779 100644 --- a/src/backend/langflow/components/llms/GoogleGenerativeAI.py +++ b/src/backend/langflow/components/llms/GoogleGenerativeAI.py @@ -46,6 +46,9 @@ class GoogleGenerativeAIComponent(CustomComponent): info="The name of the model to use. Supported examples: gemini-pro", options=["gemini-pro", "gemini-pro-vision"], ), + "code": TemplateField( + advanced=True, + ), } def build( From 10c9c95a6435857d5127244efc20ab88545586a5 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 13 Dec 2023 21:19:11 -0300 Subject: [PATCH 133/203] Fix import error in GoogleGenerativeAI.py --- src/backend/langflow/components/llms/GoogleGenerativeAI.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/langflow/components/llms/GoogleGenerativeAI.py b/src/backend/langflow/components/llms/GoogleGenerativeAI.py index 4f9d2e779..4faee52d6 100644 --- a/src/backend/langflow/components/llms/GoogleGenerativeAI.py +++ b/src/backend/langflow/components/llms/GoogleGenerativeAI.py @@ -1,6 +1,6 @@ from typing import Optional -from langchain_google_genai import ChatGoogleGenerativeAI +from langchain_google_genai import ChatGoogleGenerativeAI # type: ignore from langflow import CustomComponent from langflow.field_typing import BaseLanguageModel, RangeSpec, TemplateField From 2909fd73e402008a3f566a87a7bbd2bd5a3a6600 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 14 Dec 2023 08:00:17 -0300 Subject: [PATCH 134/203] Update dependencies versions in poetry.lock and pyproject.toml jq dependency problem on windows #1209 --- poetry.lock | 18 +++++++++--------- pyproject.toml | 3 ++- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/poetry.lock b/poetry.lock index 05ee5bba5..1efc16a2b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3711,13 +3711,13 @@ langchain = ["langchain (>=0.0.309)"] [[package]] name = "langsmith" -version = "0.0.69" +version = "0.0.70" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false python-versions = ">=3.8.1,<4.0" files = [ - {file = "langsmith-0.0.69-py3-none-any.whl", hash = "sha256:49a2546bb83eedb0552673cf81a068bb08078d6d48471f4f1018e1d5c6aa46b1"}, - {file = "langsmith-0.0.69.tar.gz", hash = "sha256:8fb5297f274db0576ec650d9bab0319acfbb6622d62bc5bb9fe31c6235dc0358"}, + {file = "langsmith-0.0.70-py3-none-any.whl", hash = "sha256:a0d4cac3af94fe44c2ef3814c32b6740f92aebe267e395d62e62040bc5bad343"}, + {file = "langsmith-0.0.70.tar.gz", hash = "sha256:3a546c45e67f6600d6669ef63f1f58b772e505703126338ad4f22fe0e2bbf677"}, ] [package.dependencies] @@ -3743,12 +3743,12 @@ regex = ["regex"] [[package]] name = "llama-cpp-python" -version = "0.2.22" +version = "0.2.23" description = "Python bindings for the llama.cpp library" optional = true python-versions = ">=3.8" files = [ - {file = "llama_cpp_python-0.2.22.tar.gz", hash = "sha256:29d3c5af374fa7b1c34abd4a76b9f477b50abb1d618872bb6cb1cb32841667bc"}, + {file = "llama_cpp_python-0.2.23.tar.gz", hash = "sha256:364b61a13970932ea189b45a1c5dea89797b90e5da00f1fe6e72c47fbc512898"}, ] [package.dependencies] @@ -8198,13 +8198,13 @@ test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0, [[package]] name = "transformers" -version = "4.36.0" +version = "4.36.1" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" optional = true python-versions = ">=3.8.0" files = [ - {file = "transformers-4.36.0-py3-none-any.whl", hash = "sha256:e5a9d9424bcbc5008782ddd79ecbc3a50991e168cc730a14c4c89e80c61f419d"}, - {file = "transformers-4.36.0.tar.gz", hash = "sha256:64e120d252db4bdcd355288d19e857dac9d89886f9d0ac20244cb9af3142bb50"}, + {file = "transformers-4.36.1-py3-none-any.whl", hash = "sha256:0e309d03634885f02d46801ec4f2c3fc1d614a5b9ebde608181f3e842bac53b8"}, + {file = "transformers-4.36.1.tar.gz", hash = "sha256:28e55952d9bed68f06cf45a3d29cc480679b528afe944e68f8cf6c799e428759"}, ] [package.dependencies] @@ -9268,4 +9268,4 @@ local = ["ctransformers", "llama-cpp-python", "sentence-transformers"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.11" -content-hash = "6bed78abe6228dfd01ba4cf4052a95d24bcb0746294a8da442bbaa846187071f" +content-hash = "2309dbc81b811f81dadcd68200b7266265ddc7e60429ed2e5f1612ebd2dad9d9" diff --git a/pyproject.toml b/pyproject.toml index 24b492c4f..13986e8b4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -96,7 +96,8 @@ pillow = "^10.0.0" metal-sdk = "^2.4.0" markupsafe = "^2.1.3" extract-msg = "^0.45.0" -jq = "^1.6.0" +# jq is not available for windows +jq = { version = "^1.6.0", markers = "sys_platform != 'win32'" } boto3 = "^1.28.63" numexpr = "^2.8.6" qianfan = "0.0.5" From 7fdc9bfbd823f0e621a97ba2a2cb52fa5e41ec33 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 14 Dec 2023 09:27:38 -0300 Subject: [PATCH 135/203] Add new code parser and directory reader modules --- src/backend/langflow/api/v1/endpoints.py | 29 +- .../interface/custom/code_parser/__init__.py | 3 + .../custom/{ => code_parser}/code_parser.py | 0 .../interface/custom/code_parser/utils.py | 39 ++ .../interface/custom/custom_component.py | 4 +- .../custom/directory_reader/__init__.py | 3 + .../directory_reader.py | 6 +- .../custom/directory_reader/utils.py | 147 +++++ .../langflow/interface/custom/utils.py | 397 ++++++++++++- src/backend/langflow/interface/types.py | 534 +----------------- tests/test_custom_component.py | 7 +- 11 files changed, 586 insertions(+), 583 deletions(-) create mode 100644 src/backend/langflow/interface/custom/code_parser/__init__.py rename src/backend/langflow/interface/custom/{ => code_parser}/code_parser.py (100%) create mode 100644 src/backend/langflow/interface/custom/code_parser/utils.py create mode 100644 src/backend/langflow/interface/custom/directory_reader/__init__.py rename src/backend/langflow/interface/custom/{ => directory_reader}/directory_reader.py (98%) create mode 100644 src/backend/langflow/interface/custom/directory_reader/utils.py diff --git a/src/backend/langflow/api/v1/endpoints.py b/src/backend/langflow/api/v1/endpoints.py index 6ebb04182..ccba9674c 100644 --- a/src/backend/langflow/api/v1/endpoints.py +++ b/src/backend/langflow/api/v1/endpoints.py @@ -3,26 +3,24 @@ from typing import Annotated, Optional, Union import sqlalchemy as sa from fastapi import APIRouter, Body, Depends, HTTPException, UploadFile, status -from loguru import logger -from sqlmodel import select - from langflow.api.utils import update_frontend_node_with_template_values -from langflow.api.v1.schemas import ( - CustomComponentCode, - ProcessResponse, - TaskResponse, - TaskStatusResponse, - UploadFileResponse, -) +from langflow.api.v1.schemas import (CustomComponentCode, ProcessResponse, + TaskResponse, TaskStatusResponse, + UploadFileResponse) from langflow.interface.custom.custom_component import CustomComponent from langflow.interface.custom.directory_reader import DirectoryReader -from langflow.interface.types import build_custom_component_template, create_and_validate_component +from langflow.interface.custom.utils import (build_custom_component_template, + create_and_validate_component) from langflow.processing.process import process_graph_cached, process_tweaks -from langflow.services.auth.utils import api_key_security, get_current_active_user +from langflow.services.auth.utils import (api_key_security, + get_current_active_user) from langflow.services.cache.utils import save_uploaded_file from langflow.services.database.models.flow import Flow from langflow.services.database.models.user.model import User -from langflow.services.deps import get_session, get_session_service, get_settings_service, get_task_service +from langflow.services.deps import (get_session, get_session_service, + get_settings_service, get_task_service) +from loguru import logger +from sqlmodel import select try: from langflow.worker import process_graph_cached_task @@ -32,9 +30,8 @@ except ImportError: raise NotImplementedError("Celery is not installed") -from sqlmodel import Session - from langflow.services.task.service import TaskService +from sqlmodel import Session # build router router = APIRouter(tags=["Base"]) @@ -226,7 +223,7 @@ async def custom_component( @router.post("/custom_component/reload", status_code=HTTPStatus.OK) async def reload_custom_component(path: str, user: User = Depends(get_current_active_user)): - from langflow.interface.types import build_custom_component_template + from langflow.interface.custom.utils import build_custom_component_template try: reader = DirectoryReader("") diff --git a/src/backend/langflow/interface/custom/code_parser/__init__.py b/src/backend/langflow/interface/custom/code_parser/__init__.py new file mode 100644 index 000000000..328fa4d47 --- /dev/null +++ b/src/backend/langflow/interface/custom/code_parser/__init__.py @@ -0,0 +1,3 @@ +from .code_parser import CodeParser + +__all__ = ["CodeParser"] diff --git a/src/backend/langflow/interface/custom/code_parser.py b/src/backend/langflow/interface/custom/code_parser/code_parser.py similarity index 100% rename from src/backend/langflow/interface/custom/code_parser.py rename to src/backend/langflow/interface/custom/code_parser/code_parser.py diff --git a/src/backend/langflow/interface/custom/code_parser/utils.py b/src/backend/langflow/interface/custom/code_parser/utils.py new file mode 100644 index 000000000..5675ea85b --- /dev/null +++ b/src/backend/langflow/interface/custom/code_parser/utils.py @@ -0,0 +1,39 @@ +import re +from types import GenericAlias +from typing import Any + + +def extract_inner_type(return_type: str) -> str: + """ + Extracts the inner type from a type hint that is a list. + """ + if match := re.match(r"list\[(.*)\]", return_type, re.IGNORECASE): + return match[1] + return return_type + + +def extract_inner_type_from_generic_alias(return_type: GenericAlias) -> Any: + """ + Extracts the inner type from a type hint that is a list. + """ + if return_type.__origin__ == list: + return list(return_type.__args__) + + return return_type + + +def extract_union_types(return_type: str) -> list[str]: + """ + Extracts the inner type from a type hint that is a list. + """ + # If the return type is a Union, then we need to parse it + return_type = return_type.replace("Union", "").replace("[", "").replace("]", "") + return_types = return_type.split(",") + return [item.strip() for item in return_types] + + +def extract_union_types_from_generic_alias(return_type: GenericAlias) -> list: + """ + Extracts the inner type from a type hint that is a Union. + """ + return list(return_type.__args__) \ No newline at end of file diff --git a/src/backend/langflow/interface/custom/custom_component.py b/src/backend/langflow/interface/custom/custom_component.py index c2a7c4c74..948618d66 100644 --- a/src/backend/langflow/interface/custom/custom_component.py +++ b/src/backend/langflow/interface/custom/custom_component.py @@ -1,6 +1,7 @@ import operator from typing import Any, Callable, ClassVar, List, Optional, Union from uuid import UUID +from langflow.interface.custom.code_parser.utils import extract_inner_type_from_generic_alias import yaml from cachetools import TTLCache, cachedmethod @@ -8,8 +9,7 @@ from fastapi import HTTPException from langflow.interface.custom.component import Component from langflow.interface.custom.directory_reader import DirectoryReader -from langflow.interface.custom.utils import ( - extract_inner_type_from_generic_alias, +from langflow.interface.custom.code_parser.utils import ( extract_union_types_from_generic_alias, ) from langflow.services.database.models.flow import Flow diff --git a/src/backend/langflow/interface/custom/directory_reader/__init__.py b/src/backend/langflow/interface/custom/directory_reader/__init__.py new file mode 100644 index 000000000..2e8e0b9e5 --- /dev/null +++ b/src/backend/langflow/interface/custom/directory_reader/__init__.py @@ -0,0 +1,3 @@ +from .directory_reader import DirectoryReader + +__all__ = ["DirectoryReader"] diff --git a/src/backend/langflow/interface/custom/directory_reader.py b/src/backend/langflow/interface/custom/directory_reader/directory_reader.py similarity index 98% rename from src/backend/langflow/interface/custom/directory_reader.py rename to src/backend/langflow/interface/custom/directory_reader/directory_reader.py index e80f0bd28..41dd11483 100644 --- a/src/backend/langflow/interface/custom/directory_reader.py +++ b/src/backend/langflow/interface/custom/directory_reader/directory_reader.py @@ -1,6 +1,7 @@ -import os import ast +import os import zlib + from loguru import logger @@ -63,12 +64,13 @@ class DirectoryReader: return len(file_content.strip()) == 0 def filter_loaded_components(self, data: dict, with_errors: bool) -> dict: + from langflow.interface.custom.utils import build_component items = [ { "name": menu["name"], "path": menu["path"], "components": [ - component + (*build_component(component),component) for component in menu["components"] if (component["error"] if with_errors else not component["error"]) ], diff --git a/src/backend/langflow/interface/custom/directory_reader/utils.py b/src/backend/langflow/interface/custom/directory_reader/utils.py new file mode 100644 index 000000000..2dbbd2caa --- /dev/null +++ b/src/backend/langflow/interface/custom/directory_reader/utils.py @@ -0,0 +1,147 @@ +from langflow.interface.custom.directory_reader import DirectoryReader +from langflow.template.frontend_node.custom_components import \ + CustomComponentFrontendNode +from loguru import logger + + +def merge_nested_dicts_with_renaming(dict1, dict2): + for key, value in dict2.items(): + if key in dict1 and isinstance(value, dict) and isinstance(dict1.get(key), dict): + for sub_key, sub_value in value.items(): + # if sub_key in dict1[key]: + # new_key = get_new_key(dict1[key], sub_key) + # dict1[key][new_key] = sub_value + # else: + dict1[key][sub_key] = sub_value + else: + dict1[key] = value + return dict1 + + +def build_invalid_menu(invalid_components): + """Build the invalid menu.""" + if not invalid_components.get("menu"): + return {} + + logger.debug("------------------- INVALID COMPONENTS -------------------") + invalid_menu = {} + for menu_item in invalid_components["menu"]: + menu_name = menu_item["name"] + invalid_menu[menu_name] = build_invalid_menu_items(menu_item) + return invalid_menu + + +def build_valid_menu(valid_components): + """Build the valid menu.""" + valid_menu = {} + logger.debug("------------------- VALID COMPONENTS -------------------") + for menu_item in valid_components["menu"]: + menu_name = menu_item["name"] + valid_menu[menu_name] = build_menu_items(menu_item) + return valid_menu + + +def build_and_validate_all_files(reader: DirectoryReader, file_list): + """Build and validate all files""" + data = reader.build_component_menu_list(file_list) + + valid_components = reader.filter_loaded_components(data=data, with_errors=False) + invalid_components = reader.filter_loaded_components(data=data, with_errors=True) + + return valid_components, invalid_components + + +def load_files_from_path(path: str): + """Load all files from a given path""" + reader = DirectoryReader(path, False) + + return reader.get_files() + + +def build_custom_component_list_from_path(path: str): + """Build a list of custom components for the langchain from a given path""" + file_list = load_files_from_path(path) + reader = DirectoryReader(path, False) + + valid_components, invalid_components = build_and_validate_all_files(reader, file_list) + + valid_menu = build_valid_menu(valid_components) + invalid_menu = build_invalid_menu(invalid_components) + + return merge_nested_dicts_with_renaming(valid_menu, invalid_menu) + + +def create_invalid_component_template(component, component_name): + """Create a template for an invalid component.""" + component_code = component["code"] + component_frontend_node = CustomComponentFrontendNode( + description="ERROR - Check your Python Code", + display_name=f"ERROR - {component_name}", + ) + + + component_frontend_node.error = component.get("error", None) + field = component_frontend_node.template.get_field("code") + field.value = component_code + component_frontend_node.template.update_field("code", field) + return component_frontend_node.model_dump(by_alias=True, exclude_none=True) + + +def log_invalid_component_details(component): + """Log details of an invalid component.""" + logger.debug(component) + logger.debug(f"Component Path: {component.get('path', None)}") + logger.debug(f"Component Error: {component.get('error', None)}") + + +def build_invalid_component(component): + """Build a single invalid component.""" + component_name = component["name"] + component_template = create_invalid_component_template(component, component_name) + log_invalid_component_details(component) + return component_name, component_template + + +def build_invalid_menu_items(menu_item): + """Build invalid menu items for a given menu.""" + menu_items = {} + for component in menu_item["components"]: + try: + component_name, component_template = build_invalid_component(component) + menu_items[component_name] = component_template + logger.debug(f"Added {component_name} to invalid menu.") + except Exception as exc: + logger.exception(f"Error while creating custom component [{component_name}]: {str(exc)}") + return menu_items + + +def get_new_key(dictionary, original_key): + counter = 1 + new_key = original_key + " (" + str(counter) + ")" + while new_key in dictionary: + counter += 1 + new_key = original_key + " (" + str(counter) + ")" + return new_key + + +def determine_component_name(component): + """Determine the name of the component.""" + component_output_types = component["output_types"] + if len(component_output_types) == 1: + return component_output_types[0] + else: + file_name = component.get("file").split(".")[0] + return "".join(word.capitalize() for word in file_name.split("_")) if "_" in file_name else file_name + + +def build_menu_items(menu_item): + """Build menu items for a given menu.""" + menu_items = {} + for component_name, component_template, component in menu_item["components"]: + try: + menu_items[component_name] = component_template + logger.debug(f"Added {component_name} to valid menu.") + except Exception as exc: + logger.error(f"Error loading Component: {component['output_types']}") + logger.exception(f"Error while building custom component {component['output_types']}: {exc}") + return menu_items \ No newline at end of file diff --git a/src/backend/langflow/interface/custom/utils.py b/src/backend/langflow/interface/custom/utils.py index e527670a0..30eaab719 100644 --- a/src/backend/langflow/interface/custom/utils.py +++ b/src/backend/langflow/interface/custom/utils.py @@ -1,40 +1,379 @@ -import re -from types import GenericAlias -from typing import Any +import traceback +from typing import Any, Dict, List, Optional, Union +from uuid import UUID + +from fastapi import HTTPException +from langflow.field_typing.range_spec import RangeSpec +from langflow.interface.custom.code_parser.utils import extract_inner_type +from langflow.interface.custom.custom_component import CustomComponent +from langflow.interface.custom.directory_reader.utils import ( + build_custom_component_list_from_path, determine_component_name, + merge_nested_dicts_with_renaming) +from langflow.interface.importing.utils import eval_custom_component_code +from langflow.template.field.base import TemplateField +from langflow.template.frontend_node.custom_components import \ + CustomComponentFrontendNode +from langflow.utils.util import get_base_classes +from loguru import logger -def extract_inner_type(return_type: str) -> str: +def add_output_types(frontend_node: CustomComponentFrontendNode, return_types: List[str]): + """Add output types to the frontend node""" + for return_type in return_types: + if return_type is None: + raise HTTPException( + status_code=400, + detail={ + "error": ("Invalid return type. Please check your code and try again."), + "traceback": traceback.format_exc(), + }, + ) + if hasattr(return_type, "__name__"): + return_type = return_type.__name__ + elif hasattr(return_type, "__class__"): + return_type = return_type.__class__.__name__ + else: + return_type = str(return_type) + + frontend_node.add_output_type(return_type) + + +def add_base_classes(frontend_node: CustomComponentFrontendNode, return_types: List[str]): + """Add base classes to the frontend node""" + for return_type_instance in return_types: + if return_type_instance is None: + raise HTTPException( + status_code=400, + detail={ + "error": ("Invalid return type. Please check your code and try again."), + "traceback": traceback.format_exc(), + }, + ) + + base_classes = get_base_classes(return_type_instance) + + for base_class in base_classes: + frontend_node.add_base_class(base_class) + + +def extract_type_from_optional(field_type): """ - Extracts the inner type from a type hint that is a list. + Extract the type from a string formatted as "Optional[]". + + Parameters: + field_type (str): The string from which to extract the type. + + Returns: + str: The extracted type, or an empty string if no type was found. """ - if match := re.match(r"list\[(.*)\]", return_type, re.IGNORECASE): - return match[1] - return return_type + match = re.search(r"\[(.*?)\]$", field_type) + return match[1] if match else None -def extract_inner_type_from_generic_alias(return_type: GenericAlias) -> Any: - """ - Extracts the inner type from a type hint that is a list. - """ - if return_type.__origin__ == list: - return list(return_type.__args__) +def get_field_properties(extra_field): + """Get the properties of an extra field""" + field_name = extra_field["name"] + field_type = extra_field.get("type", "str") + field_value = extra_field.get("default", "") + field_required = "optional" not in field_type.lower() - return return_type + if not field_required: + field_type = extract_type_from_optional(field_type) + if field_value is not None: + with contextlib.suppress(Exception): + field_value = ast.literal_eval(field_value) + return field_name, field_type, field_value, field_required -def extract_union_types_from_generic_alias(return_type: GenericAlias) -> list: - """ - Extracts the inner type from a type hint that is a Union. - """ - return list(return_type.__args__) +def process_type(field_type: str): + if field_type.startswith("list") or field_type.startswith("List"): + return extract_inner_type(field_type) + return "prompt" if field_type == "Prompt" else field_type + + +def add_new_custom_field( + frontend_node: CustomComponentFrontendNode, + field_name: str, + field_type: str, + field_value: Any, + field_required: bool, + field_config: dict, +): + # Check field_config if any of the keys are in it + # if it is, update the value + display_name = field_config.pop("display_name", field_name) + field_type = field_config.pop("field_type", field_type) + field_contains_list = "list" in field_type.lower() + field_type = process_type(field_type) + field_value = field_config.pop("value", field_value) + field_advanced = field_config.pop("advanced", False) + + if field_type == "bool" and field_value is None: + field_value = False + + # If options is a list, then it's a dropdown + # If options is None, then it's a list of strings + is_list = isinstance(field_config.get("options"), list) + field_config["is_list"] = is_list or field_config.get("is_list", False) or field_contains_list + + if "name" in field_config: + warnings.warn("The 'name' key in field_config is used to build the object and can't be changed.") + required = field_config.pop("required", field_required) + placeholder = field_config.pop("placeholder", "") + + new_field = TemplateField( + name=field_name, + field_type=field_type, + value=field_value, + show=True, + required=required, + advanced=field_advanced, + placeholder=placeholder, + display_name=display_name, + **sanitize_field_config(field_config), + ) + frontend_node.template.upsert_field(field_name, new_field) + if isinstance(frontend_node.custom_fields, dict): + frontend_node.custom_fields[field_name] = None + + return frontend_node + + +def add_extra_fields(frontend_node, field_config, function_args): + """Add extra fields to the frontend node""" + if not function_args: + return + + # sort function_args which is a list of dicts + function_args.sort(key=lambda x: x["name"]) + + for extra_field in function_args: + if "name" not in extra_field or extra_field["name"] == "self": + continue + + field_name, field_type, field_value, field_required = get_field_properties(extra_field) + config = field_config.get(field_name, {}) + frontend_node = add_new_custom_field( + frontend_node, + field_name, + field_type, + field_value, + field_required, + config, + ) + + +def get_field_dict(field: Union[TemplateField, dict]): + """Get the field dictionary from a TemplateField or a dict""" + if isinstance(field, TemplateField): + return field.model_dump(by_alias=True, exclude_none=True) + return field + + +def run_build_config( + custom_component: CustomComponent, user_id: Optional[Union[str, UUID]] = None, update_field=None +): + """Build the field configuration for a custom component""" + + try: + if custom_component.code is None: + return {} + elif isinstance(custom_component.code, str): + custom_class = eval_custom_component_code(custom_component.code) + else: + raise ValueError("Invalid code type") + except Exception as exc: + logger.error(f"Error while evaluating custom component code: {str(exc)}") + raise HTTPException( + status_code=400, + detail={ + "error": ("Invalid type convertion. Please check your code and try again."), + "traceback": traceback.format_exc(), + }, + ) from exc + + try: + build_config: Dict = custom_class(user_id=user_id).build_config() + + for field_name, field in build_config.items(): + # Allow user to build TemplateField as well + # as a dict with the same keys as TemplateField + field_dict = get_field_dict(field) + if update_field is not None and field_name != update_field: + continue + try: + update_field_dict(field_dict) + build_config[field_name] = field_dict + except Exception as exc: + logger.error(f"Error while getting build_config: {str(exc)}") + + return build_config + + except Exception as exc: + logger.error(f"Error while building field config: {str(exc)}") + raise HTTPException( + status_code=400, + detail={ + "error": ("Invalid type convertion. Please check your code and try again."), + "traceback": traceback.format_exc(), + }, + ) from exc + + +def sanitize_template_config(template_config): + """Sanitize the template config""" + attributes = { + "display_name", + "description", + "beta", + "documentation", + "output_types", + } + for key in template_config.copy(): + if key not in attributes: + template_config.pop(key, None) + + return template_config + + +def build_frontend_node(template_config): + """Build a frontend node for a custom component""" + try: + sanitized_template_config = sanitize_template_config(template_config) + return CustomComponentFrontendNode(**sanitized_template_config) + except Exception as exc: + logger.error(f"Error while building base frontend node: {exc}") + raise exc + + +def add_code_field(frontend_node: CustomComponentFrontendNode, raw_code, field_config): + code_field = TemplateField( + dynamic=True, + required=True, + placeholder="", + multiline=True, + value=raw_code, + password=False, + name="code", + advanced=field_config.pop("advanced", False), + field_type="code", + is_list=False, + ) + frontend_node.template.add_field(code_field) + + return frontend_node + + +def build_custom_component_template( + custom_component: CustomComponent, + user_id: Optional[Union[str, UUID]] = None, + update_field: Optional[str] = None, +) -> Optional[Dict[str, Any]]: + """Build a custom component template for the langchain""" + try: + logger.debug("Building custom component template") + frontend_node = build_frontend_node(custom_component.template_config) + + logger.debug("Built base frontend node") + + logger.debug("Updated attributes") + field_config = run_build_config(custom_component, user_id=user_id, update_field=update_field) + logger.debug("Built field config") + entrypoint_args = custom_component.get_function_entrypoint_args + + add_extra_fields(frontend_node, field_config, entrypoint_args) + logger.debug("Added extra fields") + frontend_node = add_code_field(frontend_node, custom_component.code, field_config.get("code", {})) + logger.debug("Added code field") + add_base_classes(frontend_node, custom_component.get_function_entrypoint_return_type) + add_output_types(frontend_node, custom_component.get_function_entrypoint_return_type) + logger.debug("Added base classes") + return frontend_node.to_dict(add_name=False) + except Exception as exc: + if isinstance(exc, HTTPException): + raise exc + raise HTTPException( + status_code=400, + detail={ + "error": ("Invalid type convertion. Please check your code and try again."), + "traceback": traceback.format_exc(), + }, + ) from exc + + +def create_component_template(component): + """Create a template for a component.""" + component_code = component["code"] + component_output_types = component["output_types"] + + component_extractor = CustomComponent(code=component_code) + component_extractor.validate() + + component_template = build_custom_component_template(component_extractor) + component_template["output_types"] = component_output_types + return component_template + + +def build_custom_components(settings_service): + """Build custom components from the specified paths.""" + if not settings_service.settings.COMPONENTS_PATH: + return {} + + logger.info(f"Building custom components from {settings_service.settings.COMPONENTS_PATH}") + custom_components_from_file = {} + processed_paths = set() + for path in settings_service.settings.COMPONENTS_PATH: + path_str = str(path) + if path_str in processed_paths: + continue + + custom_component_dict = build_custom_component_list_from_path(path_str) + if custom_component_dict: + category = next(iter(custom_component_dict)) + logger.info(f"Loading {len(custom_component_dict[category])} component(s) from category {category}") + custom_components_from_file = merge_nested_dicts_with_renaming( + custom_components_from_file, custom_component_dict + ) + processed_paths.add(path_str) + + return custom_components_from_file + + +def create_and_validate_component(code: str) -> CustomComponent: + component = CustomComponent(code=code) + component.validate() + return component + + +def update_field_dict(field_dict): + """Update the field dictionary by calling options() or value() if they are callable""" + if "options" in field_dict and callable(field_dict["options"]): + field_dict["options"] = field_dict["options"]() + # Also update the "refresh" key + field_dict["refresh"] = True + + if "value" in field_dict and callable(field_dict["value"]): + field_dict["value"] = field_dict["value"](field_dict.get("options", [])) + field_dict["refresh"] = True + + # Let's check if "range_spec" is a RangeSpec object + if "rangeSpec" in field_dict and isinstance(field_dict["rangeSpec"], RangeSpec): + field_dict["rangeSpec"] = field_dict["rangeSpec"].model_dump() + + +def sanitize_field_config(field_config: Dict): + # If any of the already existing keys are in field_config, remove them + for key in ["name", "field_type", "value", "required", "placeholder", "display_name", "advanced", "show"]: + field_config.pop(key, None) + return field_config + + +def build_component(component): + """Build a single component.""" + logger.debug(f"Building component: {component.get('name'), component.get('output_types')}") + component_name = determine_component_name(component) + component_template = create_component_template(component) + return component_name, component_template + -def extract_union_types(return_type: str) -> list[str]: - """ - Extracts the inner type from a type hint that is a list. - """ - # If the return type is a Union, then we need to parse it - return_type = return_type.replace("Union", "").replace("[", "").replace("]", "") - return_types = return_type.split(",") - return_types = [item.strip() for item in return_types] - return return_types diff --git a/src/backend/langflow/interface/types.py b/src/backend/langflow/interface/types.py index b6e4250f9..59b2ec66e 100644 --- a/src/backend/langflow/interface/types.py +++ b/src/backend/langflow/interface/types.py @@ -1,24 +1,12 @@ -import ast -import contextlib -import re -import traceback -import warnings -from typing import Any, Dict, List, Optional, Union -from uuid import UUID from cachetools import LRUCache, cached -from fastapi import HTTPException -from loguru import logger - -from langflow.field_typing.range_spec import RangeSpec from langflow.interface.agents.base import agent_creator from langflow.interface.chains.base import chain_creator -from langflow.interface.custom.custom_component import CustomComponent -from langflow.interface.custom.directory_reader import DirectoryReader -from langflow.interface.custom.utils import extract_inner_type +from langflow.interface.custom.directory_reader.utils import \ + merge_nested_dicts_with_renaming +from langflow.interface.custom.utils import build_custom_components from langflow.interface.document_loaders.base import documentloader_creator from langflow.interface.embeddings.base import embedding_creator -from langflow.interface.importing.utils import eval_custom_component_code from langflow.interface.llms.base import llm_creator from langflow.interface.memories.base import memory_creator from langflow.interface.output_parsers.base import output_parser_creator @@ -30,9 +18,6 @@ from langflow.interface.tools.base import tool_creator from langflow.interface.utilities.base import utility_creator from langflow.interface.vector_store.base import vectorstore_creator from langflow.interface.wrappers.base import wrapper_creator -from langflow.template.field.base import TemplateField -from langflow.template.frontend_node.custom_components import CustomComponentFrontendNode -from langflow.utils.util import get_base_classes # Used to get the base_classes list @@ -80,481 +65,6 @@ def build_langchain_types_dict(): # sourcery skip: dict-assign-update-to-union return all_types -def process_type(field_type: str): - if field_type.startswith("list") or field_type.startswith("List"): - return extract_inner_type(field_type) - return "prompt" if field_type == "Prompt" else field_type - - -# TODO: Move to correct place -def add_new_custom_field( - frontend_node: CustomComponentFrontendNode, - field_name: str, - field_type: str, - field_value: Any, - field_required: bool, - field_config: dict, -): - # Check field_config if any of the keys are in it - # if it is, update the value - display_name = field_config.pop("display_name", field_name) - field_type = field_config.pop("field_type", field_type) - field_contains_list = "list" in field_type.lower() - field_type = process_type(field_type) - field_value = field_config.pop("value", field_value) - field_advanced = field_config.pop("advanced", False) - - if field_type == "bool" and field_value is None: - field_value = False - - # If options is a list, then it's a dropdown - # If options is None, then it's a list of strings - is_list = isinstance(field_config.get("options"), list) - field_config["is_list"] = is_list or field_config.get("is_list", False) or field_contains_list - - if "name" in field_config: - warnings.warn("The 'name' key in field_config is used to build the object and can't be changed.") - required = field_config.pop("required", field_required) - placeholder = field_config.pop("placeholder", "") - - new_field = TemplateField( - name=field_name, - field_type=field_type, - value=field_value, - show=True, - required=required, - advanced=field_advanced, - placeholder=placeholder, - display_name=display_name, - **sanitize_field_config(field_config), - ) - frontend_node.template.upsert_field(field_name, new_field) - if isinstance(frontend_node.custom_fields, dict): - frontend_node.custom_fields[field_name] = None - - return frontend_node - - -def sanitize_field_config(field_config: Dict): - # If any of the already existing keys are in field_config, remove them - for key in ["name", "field_type", "value", "required", "placeholder", "display_name", "advanced", "show"]: - field_config.pop(key, None) - return field_config - - -# TODO: Move to correct place -def add_code_field(frontend_node: CustomComponentFrontendNode, raw_code, field_config): - code_field = TemplateField( - dynamic=True, - required=True, - placeholder="", - multiline=True, - value=raw_code, - password=False, - name="code", - advanced=field_config.pop("advanced", False), - field_type="code", - is_list=False, - ) - frontend_node.template.add_field(code_field) - - return frontend_node - - -def extract_type_from_optional(field_type): - """ - Extract the type from a string formatted as "Optional[]". - - Parameters: - field_type (str): The string from which to extract the type. - - Returns: - str: The extracted type, or an empty string if no type was found. - """ - match = re.search(r"\[(.*?)\]$", field_type) - return match[1] if match else None - - -def build_frontend_node(template_config): - """Build a frontend node for a custom component""" - try: - sanitized_template_config = sanitize_template_config(template_config) - return CustomComponentFrontendNode(**sanitized_template_config) - except Exception as exc: - logger.error(f"Error while building base frontend node: {exc}") - raise exc - - -def sanitize_template_config(template_config): - """Sanitize the template config""" - attributes = { - "display_name", - "description", - "beta", - "documentation", - "output_types", - } - for key in template_config.copy(): - if key not in attributes: - template_config.pop(key, None) - - return template_config - - -def build_field_config( - custom_component: CustomComponent, user_id: Optional[Union[str, UUID]] = None, update_field=None -): - """Build the field configuration for a custom component""" - - try: - if custom_component.code is None: - return {} - elif isinstance(custom_component.code, str): - custom_class = eval_custom_component_code(custom_component.code) - else: - raise ValueError("Invalid code type") - except Exception as exc: - logger.error(f"Error while evaluating custom component code: {str(exc)}") - raise HTTPException( - status_code=400, - detail={ - "error": ("Invalid type convertion. Please check your code and try again."), - "traceback": traceback.format_exc(), - }, - ) from exc - - try: - build_config: Dict = custom_class(user_id=user_id).build_config() - - for field_name, field in build_config.items(): - # Allow user to build TemplateField as well - # as a dict with the same keys as TemplateField - field_dict = get_field_dict(field) - if update_field is not None and field_name != update_field: - continue - try: - update_field_dict(field_dict) - build_config[field_name] = field_dict - except Exception as exc: - logger.error(f"Error while getting build_config: {str(exc)}") - - return build_config - - except Exception as exc: - logger.error(f"Error while building field config: {str(exc)}") - raise HTTPException( - status_code=400, - detail={ - "error": ("Invalid type convertion. Please check your code and try again."), - "traceback": traceback.format_exc(), - }, - ) from exc - - -def get_field_dict(field): - """Get the field dictionary from a TemplateField or a dict""" - if isinstance(field, TemplateField): - return field.model_dump(by_alias=True, exclude_none=True) - return field - - -def update_field_dict(field_dict): - """Update the field dictionary by calling options() or value() if they are callable""" - if "options" in field_dict and callable(field_dict["options"]): - field_dict["options"] = field_dict["options"]() - # Also update the "refresh" key - field_dict["refresh"] = True - - if "value" in field_dict and callable(field_dict["value"]): - field_dict["value"] = field_dict["value"](field_dict.get("options", [])) - field_dict["refresh"] = True - - # Let's check if "range_spec" is a RangeSpec object - if "rangeSpec" in field_dict and isinstance(field_dict["rangeSpec"], RangeSpec): - field_dict["rangeSpec"] = field_dict["rangeSpec"].model_dump() - - -def add_extra_fields(frontend_node, field_config, function_args): - """Add extra fields to the frontend node""" - if not function_args: - return - - # sort function_args which is a list of dicts - function_args.sort(key=lambda x: x["name"]) - - for extra_field in function_args: - if "name" not in extra_field or extra_field["name"] == "self": - continue - - field_name, field_type, field_value, field_required = get_field_properties(extra_field) - config = field_config.get(field_name, {}) - frontend_node = add_new_custom_field( - frontend_node, - field_name, - field_type, - field_value, - field_required, - config, - ) - - -def get_field_properties(extra_field): - """Get the properties of an extra field""" - field_name = extra_field["name"] - field_type = extra_field.get("type", "str") - field_value = extra_field.get("default", "") - field_required = "optional" not in field_type.lower() - - if not field_required: - field_type = extract_type_from_optional(field_type) - if field_value is not None: - with contextlib.suppress(Exception): - field_value = ast.literal_eval(field_value) - return field_name, field_type, field_value, field_required - - -def add_base_classes(frontend_node: CustomComponentFrontendNode, return_types: List[str]): - """Add base classes to the frontend node""" - for return_type_instance in return_types: - if return_type_instance is None: - raise HTTPException( - status_code=400, - detail={ - "error": ("Invalid return type. Please check your code and try again."), - "traceback": traceback.format_exc(), - }, - ) - - base_classes = get_base_classes(return_type_instance) - - for base_class in base_classes: - frontend_node.add_base_class(base_class) - - -def add_output_types(frontend_node: CustomComponentFrontendNode, return_types: List[str]): - """Add output types to the frontend node""" - for return_type in return_types: - if return_type is None: - raise HTTPException( - status_code=400, - detail={ - "error": ("Invalid return type. Please check your code and try again."), - "traceback": traceback.format_exc(), - }, - ) - if hasattr(return_type, "__name__"): - return_type = return_type.__name__ - elif hasattr(return_type, "__class__"): - return_type = return_type.__class__.__name__ - else: - return_type = str(return_type) - - frontend_node.add_output_type(return_type) - - -def build_custom_component_template( - custom_component: CustomComponent, - user_id: Optional[Union[str, UUID]] = None, - update_field: Optional[str] = None, -) -> Optional[Dict[str, Any]]: - """Build a custom component template for the langchain""" - try: - logger.debug("Building custom component template") - frontend_node = build_frontend_node(custom_component.template_config) - - logger.debug("Built base frontend node") - - logger.debug("Updated attributes") - field_config = build_field_config(custom_component, user_id=user_id, update_field=update_field) - logger.debug("Built field config") - entrypoint_args = custom_component.get_function_entrypoint_args - - add_extra_fields(frontend_node, field_config, entrypoint_args) - logger.debug("Added extra fields") - frontend_node = add_code_field(frontend_node, custom_component.code, field_config.get("code", {})) - logger.debug("Added code field") - add_base_classes(frontend_node, custom_component.get_function_entrypoint_return_type) - add_output_types(frontend_node, custom_component.get_function_entrypoint_return_type) - logger.debug("Added base classes") - return frontend_node.to_dict(add_name=False) - except Exception as exc: - if isinstance(exc, HTTPException): - raise exc - raise HTTPException( - status_code=400, - detail={ - "error": ("Invalid type convertion. Please check your code and try again."), - "traceback": traceback.format_exc(), - }, - ) from exc - - -def load_files_from_path(path: str): - """Load all files from a given path""" - reader = DirectoryReader(path, False) - - return reader.get_files() - - -def build_and_validate_all_files(reader: DirectoryReader, file_list): - """Build and validate all files""" - data = reader.build_component_menu_list(file_list) - - valid_components = reader.filter_loaded_components(data=data, with_errors=False) - invalid_components = reader.filter_loaded_components(data=data, with_errors=True) - - return valid_components, invalid_components - - -def build_valid_menu(valid_components): - """Build the valid menu.""" - valid_menu = {} - logger.debug("------------------- VALID COMPONENTS -------------------") - for menu_item in valid_components["menu"]: - menu_name = menu_item["name"] - valid_menu[menu_name] = build_menu_items(menu_item) - return valid_menu - - -def build_menu_items(menu_item): - """Build menu items for a given menu.""" - menu_items = {} - for component in menu_item["components"]: - try: - component_name, component_template = build_component(component) - menu_items[component_name] = component_template - logger.debug(f"Added {component_name} to valid menu.") - except Exception as exc: - logger.error(f"Error loading Component: {component['output_types']}") - logger.exception(f"Error while building custom component {component['output_types']}: {exc}") - return menu_items - - -def build_component(component): - """Build a single component.""" - logger.debug(f"Building component: {component.get('name'), component.get('output_types')}") - component_name = determine_component_name(component) - component_template = create_component_template(component) - return component_name, component_template - - -def determine_component_name(component): - """Determine the name of the component.""" - component_output_types = component["output_types"] - if len(component_output_types) == 1: - return component_output_types[0] - else: - file_name = component.get("file").split(".")[0] - return "".join(word.capitalize() for word in file_name.split("_")) if "_" in file_name else file_name - - -def create_component_template(component): - """Create a template for a component.""" - component_code = component["code"] - component_output_types = component["output_types"] - - component_extractor = CustomComponent(code=component_code) - component_extractor.validate() - - component_template = build_custom_component_template(component_extractor) - component_template["output_types"] = component_output_types - return component_template - - -def build_invalid_menu(invalid_components): - """Build the invalid menu.""" - if not invalid_components.get("menu"): - return {} - - logger.debug("------------------- INVALID COMPONENTS -------------------") - invalid_menu = {} - for menu_item in invalid_components["menu"]: - menu_name = menu_item["name"] - invalid_menu[menu_name] = build_invalid_menu_items(menu_item) - return invalid_menu - - -def build_invalid_menu_items(menu_item): - """Build invalid menu items for a given menu.""" - menu_items = {} - for component in menu_item["components"]: - try: - component_name, component_template = build_invalid_component(component) - menu_items[component_name] = component_template - logger.debug(f"Added {component_name} to invalid menu.") - except Exception as exc: - logger.exception(f"Error while creating custom component [{component_name}]: {str(exc)}") - return menu_items - - -def build_invalid_component(component): - """Build a single invalid component.""" - component_name = component["name"] - component_template = create_invalid_component_template(component, component_name) - log_invalid_component_details(component) - return component_name, component_template - - -def create_invalid_component_template(component, component_name): - """Create a template for an invalid component.""" - component_code = component["code"] - component_template = ( - CustomComponentFrontendNode( - description="ERROR - Check your Python Code", - display_name=f"ERROR - {component_name}", - ) - .to_dict() - .get(type(CustomComponent()).__name__) - ) - - component_template["error"] = component.get("error", None) - component_template.get("template").get("code")["value"] = component_code - return component_template - - -def log_invalid_component_details(component): - """Log details of an invalid component.""" - logger.debug(component) - logger.debug(f"Component Path: {component.get('path', None)}") - logger.debug(f"Component Error: {component.get('error', None)}") - - -def get_new_key(dictionary, original_key): - counter = 1 - new_key = original_key + " (" + str(counter) + ")" - while new_key in dictionary: - counter += 1 - new_key = original_key + " (" + str(counter) + ")" - return new_key - - -def merge_nested_dicts_with_renaming(dict1, dict2): - for key, value in dict2.items(): - if key in dict1 and isinstance(value, dict) and isinstance(dict1.get(key), dict): - for sub_key, sub_value in value.items(): - # if sub_key in dict1[key]: - # new_key = get_new_key(dict1[key], sub_key) - # dict1[key][new_key] = sub_value - # else: - dict1[key][sub_key] = sub_value - else: - dict1[key] = value - return dict1 - - -def build_custom_component_list_from_path(path: str): - """Build a list of custom components for the langchain from a given path""" - file_list = load_files_from_path(path) - reader = DirectoryReader(path, False) - - valid_components, invalid_components = build_and_validate_all_files(reader, file_list) - - valid_menu = build_valid_menu(valid_components) - invalid_menu = build_invalid_menu(invalid_components) - - return merge_nested_dicts_with_renaming(valid_menu, invalid_menu) - - def get_all_types_dict(settings_service): """Get all types dictionary combining native and custom components.""" native_components = build_langchain_types_dict() @@ -562,41 +72,3 @@ def get_all_types_dict(settings_service): return merge_nested_dicts_with_renaming(native_components, custom_components_from_file) -def build_custom_components(settings_service): - """Build custom components from the specified paths.""" - if not settings_service.settings.COMPONENTS_PATH: - return {} - - logger.info(f"Building custom components from {settings_service.settings.COMPONENTS_PATH}") - custom_components_from_file = {} - processed_paths = set() - for path in settings_service.settings.COMPONENTS_PATH: - path_str = str(path) - if path_str in processed_paths: - continue - - custom_component_dict = build_custom_component_list_from_path(path_str) - if custom_component_dict: - category = next(iter(custom_component_dict)) - logger.info(f"Loading {len(custom_component_dict[category])} component(s) from category {category}") - custom_components_from_file = merge_nested_dicts_with_renaming( - custom_components_from_file, custom_component_dict - ) - processed_paths.add(path_str) - - return custom_components_from_file - - -def merge_nested_dicts(dict1, dict2): - for key, value in dict2.items(): - if isinstance(value, dict) and isinstance(dict1.get(key), dict): - dict1[key] = merge_nested_dicts(dict1[key], value) - else: - dict1[key] = value - return dict1 - - -def create_and_validate_component(code: str) -> CustomComponent: - component = CustomComponent(code=code) - component.validate() - return component diff --git a/tests/test_custom_component.py b/tests/test_custom_component.py index 35eaba00e..98dd587f5 100644 --- a/tests/test_custom_component.py +++ b/tests/test_custom_component.py @@ -4,11 +4,12 @@ from uuid import uuid4 import pytest from fastapi import HTTPException - from langflow.interface.custom.base import CustomComponent from langflow.interface.custom.code_parser import CodeParser, CodeSyntaxError -from langflow.interface.custom.component import Component, ComponentCodeNullError -from langflow.interface.types import build_custom_component_template, create_and_validate_component +from langflow.interface.custom.component import (Component, + ComponentCodeNullError) +from langflow.interface.custom.utils import (build_custom_component_template, + create_and_validate_component) from langflow.services.database.models.flow import Flow, FlowCreate code_default = """ From e7e364be38a7512441f74c689bb1650c27cd7803 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 14 Dec 2023 09:32:45 -0300 Subject: [PATCH 136/203] Add custom component classes and methods --- .../interface/custom/custom_component/__init__.py | 3 +++ .../custom/{ => custom_component}/component.py | 0 .../{ => custom_component}/custom_component.py | 14 +++++++------- 3 files changed, 10 insertions(+), 7 deletions(-) create mode 100644 src/backend/langflow/interface/custom/custom_component/__init__.py rename src/backend/langflow/interface/custom/{ => custom_component}/component.py (100%) rename src/backend/langflow/interface/custom/{ => custom_component}/custom_component.py (97%) diff --git a/src/backend/langflow/interface/custom/custom_component/__init__.py b/src/backend/langflow/interface/custom/custom_component/__init__.py new file mode 100644 index 000000000..295992f60 --- /dev/null +++ b/src/backend/langflow/interface/custom/custom_component/__init__.py @@ -0,0 +1,3 @@ +from .custom_component import CustomComponent + +__all__ = ["CustomComponent"] diff --git a/src/backend/langflow/interface/custom/component.py b/src/backend/langflow/interface/custom/custom_component/component.py similarity index 100% rename from src/backend/langflow/interface/custom/component.py rename to src/backend/langflow/interface/custom/custom_component/component.py diff --git a/src/backend/langflow/interface/custom/custom_component.py b/src/backend/langflow/interface/custom/custom_component/custom_component.py similarity index 97% rename from src/backend/langflow/interface/custom/custom_component.py rename to src/backend/langflow/interface/custom/custom_component/custom_component.py index 948618d66..b60ced196 100644 --- a/src/backend/langflow/interface/custom/custom_component.py +++ b/src/backend/langflow/interface/custom/custom_component/custom_component.py @@ -1,22 +1,21 @@ import operator from typing import Any, Callable, ClassVar, List, Optional, Union from uuid import UUID -from langflow.interface.custom.code_parser.utils import extract_inner_type_from_generic_alias import yaml from cachetools import TTLCache, cachedmethod from fastapi import HTTPException - -from langflow.interface.custom.component import Component -from langflow.interface.custom.directory_reader import DirectoryReader from langflow.interface.custom.code_parser.utils import ( - extract_union_types_from_generic_alias, -) + extract_inner_type_from_generic_alias, + extract_union_types_from_generic_alias) +from langflow.interface.custom.directory_reader import DirectoryReader from langflow.services.database.models.flow import Flow from langflow.services.database.utils import session_getter from langflow.services.deps import get_credential_service, get_db_service from langflow.utils import validate +from .component import Component + class CustomComponent(Component): display_name: Optional[str] = None @@ -218,7 +217,8 @@ class CustomComponent(Component): return validate.create_function(self.code, self.function_entrypoint_name) async def load_flow(self, flow_id: str, tweaks: Optional[dict] = None) -> Any: - from langflow.processing.process import build_sorted_vertices, process_tweaks + from langflow.processing.process import (build_sorted_vertices, + process_tweaks) db_service = get_db_service() with session_getter(db_service) as session: From 5de717c7707859fceb645a01bece1302d7c9d1c2 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 14 Dec 2023 09:39:19 -0300 Subject: [PATCH 137/203] Fix CustomComponent get_build_method return value --- .../custom_component/custom_component.py | 25 ++++++------------- 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/src/backend/langflow/interface/custom/custom_component/custom_component.py b/src/backend/langflow/interface/custom/custom_component/custom_component.py index b60ced196..b26764b9c 100644 --- a/src/backend/langflow/interface/custom/custom_component/custom_component.py +++ b/src/backend/langflow/interface/custom/custom_component/custom_component.py @@ -76,7 +76,7 @@ class CustomComponent(Component): @property def tree(self): - return self.get_code_tree(self.code) + return self.get_code_tree(self.code or "") @property def get_function_entrypoint_args(self) -> list: @@ -104,11 +104,11 @@ class CustomComponent(Component): @cachedmethod(operator.attrgetter("cache")) def get_build_method(self): if not self.code: - return [] + return {} component_classes = [cls for cls in self.tree["classes"] if self.code_class_base_inheritance in cls["bases"]] if not component_classes: - return [] + return {} # Assume the first Component class is the one we're interested in component_class = component_classes[0] @@ -116,19 +116,13 @@ class CustomComponent(Component): method for method in component_class["methods"] if method["name"] == self.function_entrypoint_name ] - if not build_methods: - return [] - - return build_methods[0] + return build_methods[0] if build_methods else {} @property def get_function_entrypoint_return_type(self) -> List[Any]: build_method = self.get_build_method() - if not build_method: + if not build_method or not build_method.get("has_return"): return [] - elif not build_method["has_return"]: - return [] - return_type = build_method["return_type"] # If list or List is in the return type, then we remove it and return the inner type @@ -137,10 +131,7 @@ class CustomComponent(Component): # If the return type is not a Union, then we just return it as a list if not hasattr(return_type, "__origin__") or return_type.__origin__ != Union: - if isinstance(return_type, list): - return return_type - return [return_type] - + return return_type if isinstance(return_type, list) else [return_type] # If the return type is a Union, then we need to parse itx return_type = extract_union_types_from_generic_alias(return_type) return return_type @@ -206,9 +197,7 @@ class CustomComponent(Component): """Returns a function that returns the value at the given index in the iterable.""" def get_index(iterable: List[Any]): - if iterable: - return iterable[value] - return iterable + return iterable[value] if iterable else iterable return get_index From 2d92da6ed4b42a7da7d0b89175cea2a97e5d402a Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 14 Dec 2023 09:43:55 -0300 Subject: [PATCH 138/203] Add import for warnings module --- src/backend/langflow/interface/custom/utils.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/backend/langflow/interface/custom/utils.py b/src/backend/langflow/interface/custom/utils.py index 30eaab719..73df90771 100644 --- a/src/backend/langflow/interface/custom/utils.py +++ b/src/backend/langflow/interface/custom/utils.py @@ -1,4 +1,5 @@ import traceback +import warnings from typing import Any, Dict, List, Optional, Union from uuid import UUID From 570822d20bf42bc77e9e3581aed3e93fcefbb6b7 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 14 Dec 2023 09:45:23 -0300 Subject: [PATCH 139/203] Add imports to utils.py --- src/backend/langflow/interface/custom/utils.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/backend/langflow/interface/custom/utils.py b/src/backend/langflow/interface/custom/utils.py index 73df90771..3744e48be 100644 --- a/src/backend/langflow/interface/custom/utils.py +++ b/src/backend/langflow/interface/custom/utils.py @@ -1,3 +1,6 @@ +import ast +import contextlib +import re import traceback import warnings from typing import Any, Dict, List, Optional, Union From 7ec8a6c2a840afffd48a71c5da144ae4eb9f5d99 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 14 Dec 2023 10:00:43 -0300 Subject: [PATCH 140/203] Refactor code_parser.py and test_custom_component.py --- .../custom/code_parser/code_parser.py | 8 +++---- tests/test_custom_component.py | 23 ++++++++++--------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/backend/langflow/interface/custom/code_parser/code_parser.py b/src/backend/langflow/interface/custom/code_parser/code_parser.py index a7bf8023c..4e108ad2b 100644 --- a/src/backend/langflow/interface/custom/code_parser/code_parser.py +++ b/src/backend/langflow/interface/custom/code_parser/code_parser.py @@ -6,8 +6,8 @@ from typing import Any, Dict, List, Type, Union from cachetools import TTLCache, cachedmethod, keys from fastapi import HTTPException - -from langflow.interface.custom.schema import CallableCodeDetails, ClassCodeDetails +from langflow.interface.custom.schema import (CallableCodeDetails, + ClassCodeDetails) class CodeSyntaxError(HTTPException): @@ -57,7 +57,7 @@ class CodeParser: ast.Assign: self.parse_global_vars, } - def __get_tree(self): + def get_tree(self): """ Parses the provided code to validate its syntax. It tries to parse the code into an abstract syntax tree (AST). @@ -313,7 +313,7 @@ class CodeParser: """ Runs all parsing operations and returns the resulting data. """ - tree = self.__get_tree() + tree = self.get_tree() for node in ast.walk(tree): self.parse_node(node) diff --git a/tests/test_custom_component.py b/tests/test_custom_component.py index 98dd587f5..7908dd83a 100644 --- a/tests/test_custom_component.py +++ b/tests/test_custom_component.py @@ -5,9 +5,10 @@ from uuid import uuid4 import pytest from fastapi import HTTPException from langflow.interface.custom.base import CustomComponent -from langflow.interface.custom.code_parser import CodeParser, CodeSyntaxError -from langflow.interface.custom.component import (Component, - ComponentCodeNullError) +from langflow.interface.custom.code_parser.code_parser import (CodeParser, + CodeSyntaxError) +from langflow.interface.custom.custom_component.component import ( + Component, ComponentCodeNullError) from langflow.interface.custom.utils import (build_custom_component_template, create_and_validate_component) from langflow.services.database.models.flow import Flow, FlowCreate @@ -50,7 +51,7 @@ def test_code_parser_get_tree(): Test the __get_tree method of the CodeParser class. """ parser = CodeParser(code_default) - tree = parser._CodeParser__get_tree() + tree = parser.get_tree() assert isinstance(tree, ast.AST) @@ -63,7 +64,7 @@ def test_code_parser_syntax_error(): parser = CodeParser(code_syntax_error) with pytest.raises(CodeSyntaxError): - parser._CodeParser__get_tree() + parser.get_tree() def test_component_init(): @@ -140,7 +141,7 @@ def test_code_parser_parse_imports_import(): class with an import statement. """ parser = CodeParser(code_default) - tree = parser._CodeParser__get_tree() + tree = parser.get_tree() for node in ast.walk(tree): if isinstance(node, ast.Import): parser.parse_imports(node) @@ -153,7 +154,7 @@ def test_code_parser_parse_imports_importfrom(): class with an import from statement. """ parser = CodeParser("from os import path") - tree = parser._CodeParser__get_tree() + tree = parser.get_tree() for node in ast.walk(tree): if isinstance(node, ast.ImportFrom): parser.parse_imports(node) @@ -165,7 +166,7 @@ def test_code_parser_parse_functions(): Test the parse_functions method of the CodeParser class. """ parser = CodeParser("def test(): pass") - tree = parser._CodeParser__get_tree() + tree = parser.get_tree() for node in ast.walk(tree): if isinstance(node, ast.FunctionDef): parser.parse_functions(node) @@ -178,7 +179,7 @@ def test_code_parser_parse_classes(): Test the parse_classes method of the CodeParser class. """ parser = CodeParser("class Test: pass") - tree = parser._CodeParser__get_tree() + tree = parser.get_tree() for node in ast.walk(tree): if isinstance(node, ast.ClassDef): parser.parse_classes(node) @@ -191,7 +192,7 @@ def test_code_parser_parse_global_vars(): Test the parse_global_vars method of the CodeParser class. """ parser = CodeParser("x = 1") - tree = parser._CodeParser__get_tree() + tree = parser.get_tree() for node in ast.walk(tree): if isinstance(node, ast.Assign): parser.parse_global_vars(node) @@ -312,7 +313,7 @@ def test_code_parser_parse_ann_assign(): stmt = ast.AnnAssign( target=ast.Name(id="x", ctx=ast.Store()), annotation=ast.Name(id="int", ctx=ast.Load()), - value=ast.Num(n=1), + value=ast.Constant(n=1), simple=1, ) result = parser.parse_ann_assign(stmt) From 599bf44f08e11e00d716c5500dfd10ba7dafbd87 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 14 Dec 2023 10:00:53 -0300 Subject: [PATCH 141/203] Add support for passing arguments to pytest --- Makefile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 0ba2d5442..66b7afb06 100644 --- a/Makefile +++ b/Makefile @@ -18,9 +18,12 @@ coverage: --cov-report xml \ --cov-report term-missing:skip-covered +# allow passing arguments to pytest tests: @make install_backend - poetry run pytest tests --instafail + + poetry run pytest tests --instafail $(args) +# Use like: format: poetry run ruff . --fix From e249b9d8fe17a68fd62520fede56b8bd821c0c7f Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 14 Dec 2023 12:55:26 -0300 Subject: [PATCH 142/203] Update version to 0.6.3a0 in pyproject.toml --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 24b492c4f..79cd083b1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langflow" -version = "0.6.3" +version = "0.6.3a0" description = "A Python package with a built-in web application" authors = ["Logspace "] maintainers = [ From 865c7ce4d096c22eebf8794f72b17fa746a6174f Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 14 Dec 2023 08:00:17 -0300 Subject: [PATCH 143/203] Update dependencies versions in poetry.lock and pyproject.toml jq dependency problem on windows #1209 --- poetry.lock | 18 +++++++++--------- pyproject.toml | 3 ++- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/poetry.lock b/poetry.lock index 05ee5bba5..1efc16a2b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3711,13 +3711,13 @@ langchain = ["langchain (>=0.0.309)"] [[package]] name = "langsmith" -version = "0.0.69" +version = "0.0.70" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false python-versions = ">=3.8.1,<4.0" files = [ - {file = "langsmith-0.0.69-py3-none-any.whl", hash = "sha256:49a2546bb83eedb0552673cf81a068bb08078d6d48471f4f1018e1d5c6aa46b1"}, - {file = "langsmith-0.0.69.tar.gz", hash = "sha256:8fb5297f274db0576ec650d9bab0319acfbb6622d62bc5bb9fe31c6235dc0358"}, + {file = "langsmith-0.0.70-py3-none-any.whl", hash = "sha256:a0d4cac3af94fe44c2ef3814c32b6740f92aebe267e395d62e62040bc5bad343"}, + {file = "langsmith-0.0.70.tar.gz", hash = "sha256:3a546c45e67f6600d6669ef63f1f58b772e505703126338ad4f22fe0e2bbf677"}, ] [package.dependencies] @@ -3743,12 +3743,12 @@ regex = ["regex"] [[package]] name = "llama-cpp-python" -version = "0.2.22" +version = "0.2.23" description = "Python bindings for the llama.cpp library" optional = true python-versions = ">=3.8" files = [ - {file = "llama_cpp_python-0.2.22.tar.gz", hash = "sha256:29d3c5af374fa7b1c34abd4a76b9f477b50abb1d618872bb6cb1cb32841667bc"}, + {file = "llama_cpp_python-0.2.23.tar.gz", hash = "sha256:364b61a13970932ea189b45a1c5dea89797b90e5da00f1fe6e72c47fbc512898"}, ] [package.dependencies] @@ -8198,13 +8198,13 @@ test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0, [[package]] name = "transformers" -version = "4.36.0" +version = "4.36.1" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" optional = true python-versions = ">=3.8.0" files = [ - {file = "transformers-4.36.0-py3-none-any.whl", hash = "sha256:e5a9d9424bcbc5008782ddd79ecbc3a50991e168cc730a14c4c89e80c61f419d"}, - {file = "transformers-4.36.0.tar.gz", hash = "sha256:64e120d252db4bdcd355288d19e857dac9d89886f9d0ac20244cb9af3142bb50"}, + {file = "transformers-4.36.1-py3-none-any.whl", hash = "sha256:0e309d03634885f02d46801ec4f2c3fc1d614a5b9ebde608181f3e842bac53b8"}, + {file = "transformers-4.36.1.tar.gz", hash = "sha256:28e55952d9bed68f06cf45a3d29cc480679b528afe944e68f8cf6c799e428759"}, ] [package.dependencies] @@ -9268,4 +9268,4 @@ local = ["ctransformers", "llama-cpp-python", "sentence-transformers"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.11" -content-hash = "6bed78abe6228dfd01ba4cf4052a95d24bcb0746294a8da442bbaa846187071f" +content-hash = "2309dbc81b811f81dadcd68200b7266265ddc7e60429ed2e5f1612ebd2dad9d9" diff --git a/pyproject.toml b/pyproject.toml index 79cd083b1..b4ebf8029 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -96,7 +96,8 @@ pillow = "^10.0.0" metal-sdk = "^2.4.0" markupsafe = "^2.1.3" extract-msg = "^0.45.0" -jq = "^1.6.0" +# jq is not available for windows +jq = { version = "^1.6.0", markers = "sys_platform != 'win32'" } boto3 = "^1.28.63" numexpr = "^2.8.6" qianfan = "0.0.5" From 4fa6956638050e10fe078e55979be3045d45d32e Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 14 Dec 2023 12:59:06 -0300 Subject: [PATCH 144/203] Update version to 0.6.3a1 in pyproject.toml --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index b4ebf8029..04e4cd5d5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langflow" -version = "0.6.3a0" +version = "0.6.3a1" description = "A Python package with a built-in web application" authors = ["Logspace "] maintainers = [ From 45479222d7c12a5ccb9f4584bf7bd1e3fff70dc6 Mon Sep 17 00:00:00 2001 From: cristhianzl Date: Thu, 14 Dec 2023 13:00:48 -0300 Subject: [PATCH 145/203] fix(frontend): fix save component test by removing unnecessary steps and fixing selectors feat(frontend): add test for saving components and verifying their presence in the flow feat(frontend): add test for grouping nodes and verifying the presence of the group node feat(frontend): add test for saving default component with custom values and verifying the saved component feat(frontend): add test for saving the same component multiple times and verifying their presence feat(frontend): add test for saving default component and deleting it from the saved components list --- .../src/CustomNodes/GenericNode/index.tsx | 5 +- .../extraSidebarComponent/index.tsx | 2 +- .../components/nodeToolbarComponent/index.tsx | 5 +- .../tests/onlyFront/assets/flowtest.json | 1 + .../tests/onlyFront/dragAndDrop.spec.ts | 65 ++--- src/frontend/tests/onlyFront/group.spec.ts | 134 +++------ src/frontend/tests/onlyFront/login.spec.ts | 239 ++++++++-------- .../tests/onlyFront/saveComponents.spec.ts | 268 +++++------------- 8 files changed, 254 insertions(+), 465 deletions(-) create mode 100644 src/frontend/tests/onlyFront/assets/flowtest.json diff --git a/src/frontend/src/CustomNodes/GenericNode/index.tsx b/src/frontend/src/CustomNodes/GenericNode/index.tsx index 425590896..ca92a74cf 100644 --- a/src/frontend/src/CustomNodes/GenericNode/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/index.tsx @@ -194,7 +194,10 @@ export default function GenericNode({ takeSnapshot(); }} > -
+
{data.node?.display_name}
{nameEditable && ( diff --git a/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/index.tsx b/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/index.tsx index f1618318e..a47ddd938 100644 --- a/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/index.tsx @@ -285,7 +285,7 @@ export default function ExtraSidebar(): JSX.Element { )}
-
+
{flow && flow.data && ( @@ -216,7 +217,7 @@ export default function NodeToolbarComponent({ {isSaved ? ( -
+
) : ( -
+
str:\n try:\n # Create the directory if it doesn't exist\n os.makedirs(os.path.dirname(save_path), exist_ok=True)\n\n # Open the file in write mode and save the text\n with open(save_path, 'w') as file:\n file.write(text_input)\n except Exception as e:\n raise e\n self.status = text_input\n return text_input","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":false,"dynamic":true,"info":""},"save_path":{"type":"str","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"value":"/home/vazz/.cache/langflow/text.t1.txt","fileTypes":[],"file_path":"","password":false,"name":"save_path","display_name":"Save Path","advanced":false,"dynamic":false,"info":"Put the full path with the file name and extension"},"text_input":{"type":"str","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"text_input","display_name":"Text Input","advanced":false,"input_types":["str"],"dynamic":false,"info":"","value":""},"_type":"CustomComponent"},"base_classes":["str"],"display_name":"text checkpoint","documentation":"http://docs.langflow.org/components/custom","custom_fields":{"save_path":null,"text_input":null},"output_types":["str"],"field_formatters":{},"beta":true},"id":"CustomComponent-MtJjl"},"selected":false,"dragging":false,"positionAbsolute":{"x":534.3712097224906,"y":-135.01908566635723}},{"width":384,"height":453,"id":"CustomComponent-7NQoq","type":"genericNode","position":{"x":27.487979888011637,"y":-414.43998171034826},"data":{"type":"CustomComponent","node":{"template":{"audio":{"type":"file","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"/home/vazz/.cache/langflow/1b0814b7-2964-4e09-9b4b-f7413c4fb50b/b56b043d8940daecbdec03b97ad4346488c58d7cc62016560dd333aa7a6a12ce.m4a","password":false,"name":"audio","display_name":"audio","advanced":false,"dynamic":false,"info":"","value":"Audio Recording 2023-12-13 at 16.35.22.m4a"},"OpenAIKey":{"type":"str","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":true,"name":"OpenAIKey","display_name":"OpenAIKey","advanced":false,"dynamic":false,"info":"","value":""},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from langflow import CustomComponent\nfrom typing import Optional, List, Dict, Union\nfrom langflow.field_typing import (\n AgentExecutor,\n BaseChatMemory,\n BaseLanguageModel,\n BaseLLM,\n BaseLoader,\n BaseMemory,\n BaseOutputParser,\n BasePromptTemplate,\n BaseRetriever,\n Callable,\n Chain,\n ChatPromptTemplate,\n Data,\n Document,\n Embeddings,\n NestedDict,\n Object,\n PromptTemplate,\n TextSplitter,\n Tool,\n VectorStore,\n)\n\nfrom openai import OpenAI\nimport os\nimport ffmpeg\n\nclass Component(CustomComponent):\n display_name: str = \"Whisper Transcriber\"\n description: str = \"Converts audio to text using OpenAI's Whisper.\"\n\n def build_config(self):\n return {\"audio\": {\"field_type\": \"file\", \"suffixes\": [\".mp3\", \".mp4\", \".m4a\"]}, \"OpenAIKey\": {\"field_type\": \"str\", \"password\": True}}\n\n def calculate_segment_duration(self, audio_path, target_chunk_size_mb=24):\n # Calculate the target chunk size in bytes\n target_chunk_size_bytes = target_chunk_size_mb * 1024 * 1024\n\n # Use ffprobe to get the audio file information\n ffprobe_output = ffmpeg.probe(audio_path)\n print(ffprobe_output)\n # Convert duration to float\n duration = float(ffprobe_output[\"format\"][\"duration\"])\n\n # Calculate the approximate bitrate\n bitrate = os.path.getsize(audio_path) / duration\n\n # Calculate the segment duration to achieve the target chunk size\n segment_duration = target_chunk_size_bytes / bitrate\n\n return segment_duration\n\n def split_audio_into_chunks(self, audio_path, target_chunk_size_mb=24):\n # Calculate the segment duration\n segment_duration = self.calculate_segment_duration(audio_path, target_chunk_size_mb)\n\n # Create a directory to store the chunks\n output_directory = f\"{os.path.splitext(audio_path)[0]}_chunks\"\n os.makedirs(output_directory, exist_ok=True)\n\n # Use ffmpeg-python to split the audio file into chunks\n (\n ffmpeg.input(audio_path)\n .output(f\"{output_directory}/%03d{os.path.splitext(audio_path)[1]}\", codec=\"copy\", f=\"segment\", segment_time=segment_duration)\n .run()\n )\n\n # Get the list of generated chunk files\n chunks = [os.path.join(output_directory, file) for file in os.listdir(output_directory)]\n\n return chunks\n\n def build(self, audio: str, OpenAIKey: str) -> str:\n # Split audio into chunks\n audio_chunks = self.split_audio_into_chunks(audio)\n\n client = OpenAI(api_key=OpenAIKey)\n transcripts = []\n\n try:\n for chunk in audio_chunks:\n with open(chunk, \"rb\") as chunk_file:\n transcript = client.audio.transcriptions.create(\n model=\"whisper-1\",\n file=chunk_file,\n response_format=\"text\"\n )\n transcripts.append(transcript)\n finally:\n # Clean up temporary chunk files\n for chunk in audio_chunks:\n os.remove(chunk)\n\n # Concatenate transcripts into the final response\n final_response = \"\\n\".join(transcripts)\n self.status = final_response\n return final_response\n","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":false,"dynamic":true,"info":""},"_type":"CustomComponent"},"description":"Converts audio to text using OpenAI's Whisper.","base_classes":["str"],"display_name":"Whisper Transcriber","documentation":"","custom_fields":{"OpenAIKey":null,"audio":null},"output_types":["str"],"field_formatters":{},"beta":true},"id":"CustomComponent-7NQoq"},"selected":true,"positionAbsolute":{"x":27.487979888011637,"y":-414.43998171034826},"dragging":false}],"edges":[{"source":"CustomComponent-7NQoq","sourceHandle":"{œbaseClassesœ:[œstrœ],œdataTypeœ:œCustomComponentœ,œidœ:œCustomComponent-7NQoqœ}","target":"CustomComponent-MtJjl","targetHandle":"{œfieldNameœ:œtext_inputœ,œidœ:œCustomComponent-MtJjlœ,œinputTypesœ:[œstrœ],œtypeœ:œstrœ}","data":{"targetHandle":{"fieldName":"text_input","id":"CustomComponent-MtJjl","inputTypes":["str"],"type":"str"},"sourceHandle":{"baseClasses":["str"],"dataType":"CustomComponent","id":"CustomComponent-7NQoq"}},"style":{"stroke":"#555"},"className":"stroke-gray-900 stroke-connection","animated":false,"id":"reactflow__edge-CustomComponent-7NQoq{œbaseClassesœ:[œstrœ],œdataTypeœ:œCustomComponentœ,œidœ:œCustomComponent-7NQoqœ}-CustomComponent-MtJjl{œfieldNameœ:œtext_inputœ,œidœ:œCustomComponent-MtJjlœ,œinputTypesœ:[œstrœ],œtypeœ:œstrœ}"}],"viewport":{"x":119.37759169012509,"y":351.3082742479685,"zoom":1}},"is_component":false,"updated_at":"2023-12-13T23:51:56.874099","folder":null,"id":"1b0814b7-2964-4e09-9b4b-f7413c4fb50b","user_id":"8b5cf798-f1b8-4108-88fd-d7274d08d471"} \ No newline at end of file diff --git a/src/frontend/tests/onlyFront/dragAndDrop.spec.ts b/src/frontend/tests/onlyFront/dragAndDrop.spec.ts index a4bf680d4..7f1af0f12 100644 --- a/src/frontend/tests/onlyFront/dragAndDrop.spec.ts +++ b/src/frontend/tests/onlyFront/dragAndDrop.spec.ts @@ -26,7 +26,7 @@ test.describe("drag and drop test", () => { const dataTransfer = await page.evaluateHandle((data) => { const dt = new DataTransfer(); // Convert the buffer to a hex array - const file = new File([data], "collection.json", { + const file = new File([data], "flowtest.json", { type: "application/json", }); dt.items.add(file); @@ -34,54 +34,25 @@ test.describe("drag and drop test", () => { }, jsonContent); // Now dispatch - await page.dispatchEvent('//*[@id="root"]/div/div[2]/div[2]', "drop", { - dataTransfer, - }); - expect( - await page - .locator(".main-page-flows-display") - .evaluate((el) => el.children) - ).toBeTruthy(); - }); - - test("drop flow", async ({ page }) => { - await page.routeFromHAR("harFiles/langflow.har", { - url: "**/api/v1/**", - update: false, - }); - await page.route("**/api/v1/flows/", async (route) => { - const json = { - id: "e9ac1bdc-429b-475d-ac03-d26f9a2a3210", - }; - await route.fulfill({ json, status: 201 }); - }); - await page.goto("http:localhost:3000/"); - await page.locator("span").filter({ hasText: "My Collection" }).isVisible(); - // Read your file into a buffer. - const jsonContent = readFileSync( - "tests/onlyFront/assets/flow.json", - "utf-8" + await page.dispatchEvent( + '//*[@id="root"]/div/div[1]/div[2]/div[3]/div/div', + "drop", + { + dataTransfer, + } ); - // Create the DataTransfer and File - const dataTransfer = await page.evaluateHandle((data) => { - const dt = new DataTransfer(); - // Convert the buffer to a hex array - const file = new File([data], "flow.json", { - type: "application/json", - }); - dt.items.add(file); - return dt; - }, jsonContent); + await page + .locator( + '//*[@id="root"]/div/div[1]/div[2]/div[3]/div/div/div/div/div/div/div/div[2]/span[2]' + ) + .click(); + await page.waitForTimeout(2000); - // Now dispatch - await page.dispatchEvent('//*[@id="root"]/div/div[2]/div[2]', "drop", { - dataTransfer, - }); - expect( - await page - .locator(".main-page-flows-display") - .evaluate((el) => el.children) - ).toBeTruthy(); + const genericNoda = page.getByTestId("div-generic-node"); + const elementCount = await genericNoda.count(); + if (elementCount > 0) { + expect(true).toBeTruthy(); + } }); }); diff --git a/src/frontend/tests/onlyFront/group.spec.ts b/src/frontend/tests/onlyFront/group.spec.ts index 572ef9baa..8218e767b 100644 --- a/src/frontend/tests/onlyFront/group.spec.ts +++ b/src/frontend/tests/onlyFront/group.spec.ts @@ -15,10 +15,10 @@ test.describe("group node test", () => { await route.fulfill({ json, status: 201 }); }); await page.goto("http:localhost:3000/"); - await page.locator('//*[@id="new-project-btn"]').click(); + await page.locator("span").filter({ hasText: "My Collection" }).isVisible(); // Read your file into a buffer. const jsonContent = readFileSync( - "tests/onlyFront/assets/flow.json", + "tests/onlyFront/assets/collection.json", "utf-8" ); @@ -26,7 +26,7 @@ test.describe("group node test", () => { const dataTransfer = await page.evaluateHandle((data) => { const dt = new DataTransfer(); // Convert the buffer to a hex array - const file = new File([data], "flow.json", { + const file = new File([data], "flowtest.json", { type: "application/json", }); dt.items.add(file); @@ -34,97 +34,51 @@ test.describe("group node test", () => { }, jsonContent); // Now dispatch - await page.dispatchEvent('//*[@id="root"]/div/div[2]/div[2]', "drop", { - dataTransfer, - }); - expect( - await page - .locator(".main-page-flows-display") - .evaluate((el) => el.children) - ).toBeTruthy(); - await page.getByRole("button", { name: "Edit Flow" }).click(); - //inside the flow - await page - .locator( - "//html/body/div/div/div[2]/div/main/div/div/div/div[1]/div[1]/div[1]/div/div[2]/div[1]/div/div[1]/div" - ) - .click({ - modifiers: ["Control"], - }); - await page - .locator( - "//html/body/div/div/div[2]/div/main/div/div/div/div[1]/div[1]/div[1]/div/div[2]/div[2]/div/div[1]/div" - ) - .click({ - modifiers: ["Control"], - }); - await page - .locator( - "//html/body/div/div/div[2]/div/main/div/div/div/div[1]/div[1]/div[1]/div/div[2]/div[3]/div/div[1]/div" - ) - .click({ - modifiers: ["Control"], - }); - await page.getByRole("button", { name: "Group" }).click(); - expect( - await page - .locator( - "//html/body/div/div/div[2]/div/main/div/div/div/div[1]/div[1]/div[1]/div/div[2]/div/div" - ) - .isVisible() - ).toBeTruthy(); - await page.getByPlaceholder("Type something...").first().click(); - await page.getByPlaceholder("Type something...").first().fill("test"); - await page.locator(".side-bar-buttons-arrangement").click(); - expect( - await page - .locator( - "//html/body/div/div/div[2]/div/main/div/div/div/div[1]/div[1]/div/div/div[2]/div/div/div[1]/div/div[1]/div/div" - ) - .textContent() - ).toBe("test"); - await page - .locator( - "//html/body/div/div/div[2]/div/main/div/div/div/div[1]/div[1]/div[1]/div/div[2]/div/div" - ) - .locator('input[type="text"]') - .click(); - await page - .locator( - "//html/body/div/div/div[2]/div/main/div/div/div/div[1]/div[1]/div[1]/div/div[2]/div/div" - ) - .locator('input[type="text"]') - .fill("fieldValue"); - await page.locator(".side-bar-buttons-arrangement").click(); - await page - .locator( - "//html/body/div/div/div[2]/div/main/div/div/div/div[1]/div[1]/div[1]/div/div[2]/div/div/div[1]/div" - ) - .click(); + await page.dispatchEvent( + '//*[@id="root"]/div/div[1]/div[2]/div[3]/div/div', + "drop", + { + dataTransfer, + } + ); await page .locator( - "//html/body/div/div/div[2]/div/main/div/div/div/div[1]/div[1]/div[2]/div/span/button[3]/div/div" + '//*[@id="root"]/div/div[1]/div[2]/div[3]/div/div/div/div/div/div/div/div[2]/span[2]' ) .click(); - await page.getByLabel("Edit").click(); - await page - .getByRole("button", { name: "zero-shot-react-description" }) - .click(); - await page.getByText("openai-functions").click(); - await page.getByRole("button", { name: "Save Changes" }).click(); - await page - .locator( - "//html/body/div/div/div[2]/div/main/div/div/div/div[1]/div[1]/div[2]/div/span/button[3]/div/div" - ) - .click(); - await page.getByLabel("Ungroup").click(); - await expect(page.locator('//*[@id="input-2"]')).toHaveValue("fieldValue"); - expect( - await page - .getByTestId(/.*rf__node-AgentInitializer.*/) - .getByRole("button", { name: "openai-functions" }) - .textContent() - ).toBe("openai-functions"); + await page.waitForTimeout(2000); + + const genericNoda = page.getByTestId("div-generic-node"); + const elementCount = await genericNoda.count(); + if (elementCount > 0) { + expect(true).toBeTruthy(); + } + + await page.getByTestId("title-PythonFunctionTool").click({ + modifiers: ["Control"], + }); + await page.getByTestId("title-ChatOpenAI").click({ + modifiers: ["Control"], + }); + + await page.getByTestId("title-AgentInitializer").click({ + modifiers: ["Control"], + }); + + await page.getByRole("button", { name: "Group" }).click(); + await page.locator("div").filter({ hasText: "Star13756" }).nth(3).click(); + + const textArea = page.getByTestId("div-textarea-2"); + const elementCountText = await textArea.count(); + if (elementCountText > 0) { + expect(true).toBeTruthy(); + } + + const groupNode = page.getByTestId("title-Group"); + const elementGroup = await groupNode.count(); + if (elementGroup > 0) { + expect(true).toBeTruthy(); + } }); }); diff --git a/src/frontend/tests/onlyFront/login.spec.ts b/src/frontend/tests/onlyFront/login.spec.ts index e3980912a..119d00a37 100644 --- a/src/frontend/tests/onlyFront/login.spec.ts +++ b/src/frontend/tests/onlyFront/login.spec.ts @@ -1,128 +1,121 @@ -import { expect, test } from "@playwright/test"; +import { test } from "@playwright/test"; test.describe("Login Tests", () => { test("Login_Success", async ({ page }) => { - await page.route("**/api/v1/login", async (route) => { - const json = { - access_token: - "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhMWNlM2FkOS1iZTE2LTRiNjgtOGRhYi1hYjA4YTVjMmZjZTkiLCJleHAiOjE2OTUyNTIwNTh9.MBYFwMhTcZnsW_L7p4qavUhSDylCllJQWUCJdU1wX8o", - refresh_token: - "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhMWNlM2FkOS1iZTE2LTRiNjgtOGRhYi1hYjA4YTVjMmZjZTkiLCJ0eXBlIjoicmYiLCJleHAiOjE2OTUyNTI2NTh9.a4wL9-XK_zyTyrXduBFgCsODFXrqiByVr5HOeiCbiQA", - token_type: "bearer", - }; - await route.fulfill({ json }); - }); - - await page.goto("http://localhost:3000/"); - await page.waitForURL("http://localhost:3000/login"); - await page.waitForURL("http://localhost:3000/login", { timeout: 100 }); - await page.getByPlaceholder("Username").click(); - await page.getByPlaceholder("Username").fill("test"); - await page.getByPlaceholder("Password").click(); - await page.getByPlaceholder("Password").fill("test"); - await page.getByRole("button", { name: "Sign in" }).click(); - await page.getByRole("button", { name: "Community Examples" }).click(); - await page.waitForSelector(".community-pages-flows-panel"); - expect( - await page - .locator(".community-pages-flows-panel") - .evaluate((el) => el.children) - ).toBeTruthy(); - }); - - test("Login Error", async ({ page }) => { - await page.route("**/api/v1/login", async (route) => { - const json = { detail: "Incorrect username or password" }; - await route.fulfill({ json, status: 401 }); - }); - - await page.goto("http://localhost:3000/"); - await page.waitForURL("http://localhost:3000/login"); - await page.waitForURL("http://localhost:3000/login", { timeout: 100 }); - await page.getByPlaceholder("Username").click(); - await page.getByPlaceholder("Username").fill("test"); - await page.getByPlaceholder("Password").click(); - await page.getByPlaceholder("Password").fill("test5"); - await page.getByRole("button", { name: "Sign in" }).click(); - await page.getByRole("heading", { name: "Error signing in" }).click(); - }); - - test("Login create account wrong form", async ({ page }) => { - const fullfillForm = async (username, password, confirmPassword) => { - await page.getByPlaceholder("Username").click(); - await page.getByPlaceholder("Username").fill(username); - await page.getByPlaceholder("Password", { exact: true }).click(); - await page.getByPlaceholder("Password", { exact: true }).fill(password); - await page.getByPlaceholder("Confirm your password").click(); - await page - .getByPlaceholder("Confirm your password") - .fill(confirmPassword); - }; - - await page.goto("http://localhost:3000/"); - await page.waitForURL("http://localhost:3000/login"); - await page.waitForURL("http://localhost:3000/login", { timeout: 100 }); - await page - .getByRole("button", { name: "Don't have an account? Sign Up" }) - .click(); - await page.getByText("Sign up to Langflow").click(); - await page.goto("http://localhost:3000/signup"); - await page.getByText("Sign up to Langflow").click(); - - await fullfillForm("name", "vazz", "vazz5"); - expect( - await page.getByRole("button", { name: "Sign up" }).isDisabled() - ).toBeTruthy(); - await fullfillForm("", "vazz", "vazz"); - expect( - await page.getByRole("button", { name: "Sign up" }).isDisabled() - ).toBeTruthy(); - await fullfillForm("name", "", ""); - expect( - await page.getByRole("button", { name: "Sign up" }).isDisabled() - ).toBeTruthy(); - await fullfillForm("", "", ""); - expect( - await page.getByRole("button", { name: "Sign up" }).isDisabled() - ).toBeTruthy(); - }); - test("Login create account success", async ({ page }) => { - await page.route("**/api/v1/users/", async (route) => { - const json = { - id: "e9ac1bdc-429b-475d-ac03-d26f9a2a3210", - username: "teste", - profile_image: null, - is_active: false, - is_superuser: false, - create_at: "2023-09-21T01:45:51.873303", - updated_at: "2023-09-21T01:45:51.873305", - last_login_at: null, - }; - await route.fulfill({ json, status: 201 }); - }); - const submitForm = async (username, password, confirmPassword) => { - await page.getByPlaceholder("Username").click(); - await page.getByPlaceholder("Username").fill(username); - await page.getByPlaceholder("Password", { exact: true }).click(); - await page.getByPlaceholder("Password", { exact: true }).fill(password); - await page.getByPlaceholder("Confirm your password").click(); - await page - .getByPlaceholder("Confirm your password") - .fill(confirmPassword); - }; - - await page.goto("http://localhost:3000/"); - await page.waitForURL("http://localhost:3000/login"); - await page.waitForURL("http://localhost:3000/login", { timeout: 100 }); - await page - .getByRole("button", { name: "Don't have an account? Sign Up" }) - .click(); - await page.getByText("Sign up to Langflow").click(); - await page.goto("http://localhost:3000/signup"); - await page.getByText("Sign up to Langflow").click(); - await submitForm("teste", "pass", "pass"); - await page.getByRole("button", { name: "Sign up" }).click(); - await page.waitForURL("http://localhost:3000/login", { timeout: 1000 }); - await page.getByText("Account created! Await admin activation.").click(); + // await page.route("**/api/v1/login", async (route) => { + // const json = { + // access_token: + // "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhMWNlM2FkOS1iZTE2LTRiNjgtOGRhYi1hYjA4YTVjMmZjZTkiLCJleHAiOjE2OTUyNTIwNTh9.MBYFwMhTcZnsW_L7p4qavUhSDylCllJQWUCJdU1wX8o", + // refresh_token: + // "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhMWNlM2FkOS1iZTE2LTRiNjgtOGRhYi1hYjA4YTVjMmZjZTkiLCJ0eXBlIjoicmYiLCJleHAiOjE2OTUyNTI2NTh9.a4wL9-XK_zyTyrXduBFgCsODFXrqiByVr5HOeiCbiQA", + // token_type: "bearer", + // }; + // await route.fulfill({ json }); + // }); + // await page.goto("http://localhost:3000/"); + // await page.waitForURL("http://localhost:3000/login"); + // await page.waitForURL("http://localhost:3000/login", { timeout: 100 }); + // await page.getByPlaceholder("Username").click(); + // await page.getByPlaceholder("Username").fill("test"); + // await page.getByPlaceholder("Password").click(); + // await page.getByPlaceholder("Password").fill("test"); + // await page.getByRole("button", { name: "Sign in" }).click(); + // await page.getByRole("button", { name: "Community Examples" }).click(); + // await page.waitForSelector(".community-pages-flows-panel"); + // expect( + // await page + // .locator(".community-pages-flows-panel") + // .evaluate((el) => el.children) + // ).toBeTruthy(); + // }); + // test("Login Error", async ({ page }) => { + // await page.route("**/api/v1/login", async (route) => { + // const json = { detail: "Incorrect username or password" }; + // await route.fulfill({ json, status: 401 }); + // }); + // await page.goto("http://localhost:3000/"); + // await page.waitForURL("http://localhost:3000/login"); + // await page.waitForURL("http://localhost:3000/login", { timeout: 100 }); + // await page.getByPlaceholder("Username").click(); + // await page.getByPlaceholder("Username").fill("test"); + // await page.getByPlaceholder("Password").click(); + // await page.getByPlaceholder("Password").fill("test5"); + // await page.getByRole("button", { name: "Sign in" }).click(); + // await page.getByRole("heading", { name: "Error signing in" }).click(); + // }); + // test("Login create account wrong form", async ({ page }) => { + // const fullfillForm = async (username, password, confirmPassword) => { + // await page.getByPlaceholder("Username").click(); + // await page.getByPlaceholder("Username").fill(username); + // await page.getByPlaceholder("Password", { exact: true }).click(); + // await page.getByPlaceholder("Password", { exact: true }).fill(password); + // await page.getByPlaceholder("Confirm your password").click(); + // await page + // .getByPlaceholder("Confirm your password") + // .fill(confirmPassword); + // }; + // await page.goto("http://localhost:3000/"); + // await page.waitForURL("http://localhost:3000/login"); + // await page.waitForURL("http://localhost:3000/login", { timeout: 100 }); + // await page + // .getByRole("button", { name: "Don't have an account? Sign Up" }) + // .click(); + // await page.getByText("Sign up to Langflow").click(); + // await page.goto("http://localhost:3000/signup"); + // await page.getByText("Sign up to Langflow").click(); + // await fullfillForm("name", "vazz", "vazz5"); + // expect( + // await page.getByRole("button", { name: "Sign up" }).isDisabled() + // ).toBeTruthy(); + // await fullfillForm("", "vazz", "vazz"); + // expect( + // await page.getByRole("button", { name: "Sign up" }).isDisabled() + // ).toBeTruthy(); + // await fullfillForm("name", "", ""); + // expect( + // await page.getByRole("button", { name: "Sign up" }).isDisabled() + // ).toBeTruthy(); + // await fullfillForm("", "", ""); + // expect( + // await page.getByRole("button", { name: "Sign up" }).isDisabled() + // ).toBeTruthy(); + // }); + // test("Login create account success", async ({ page }) => { + // await page.route("**/api/v1/users/", async (route) => { + // const json = { + // id: "e9ac1bdc-429b-475d-ac03-d26f9a2a3210", + // username: "teste", + // profile_image: null, + // is_active: false, + // is_superuser: false, + // create_at: "2023-09-21T01:45:51.873303", + // updated_at: "2023-09-21T01:45:51.873305", + // last_login_at: null, + // }; + // await route.fulfill({ json, status: 201 }); + // }); + // const submitForm = async (username, password, confirmPassword) => { + // await page.getByPlaceholder("Username").click(); + // await page.getByPlaceholder("Username").fill(username); + // await page.getByPlaceholder("Password", { exact: true }).click(); + // await page.getByPlaceholder("Password", { exact: true }).fill(password); + // await page.getByPlaceholder("Confirm your password").click(); + // await page + // .getByPlaceholder("Confirm your password") + // .fill(confirmPassword); + // }; + // await page.goto("http://localhost:3000/"); + // await page.waitForURL("http://localhost:3000/login"); + // await page.waitForURL("http://localhost:3000/login", { timeout: 100 }); + // await page + // .getByRole("button", { name: "Don't have an account? Sign Up" }) + // .click(); + // await page.getByText("Sign up to Langflow").click(); + // await page.goto("http://localhost:3000/signup"); + // await page.getByText("Sign up to Langflow").click(); + // await submitForm("teste", "pass", "pass"); + // await page.getByRole("button", { name: "Sign up" }).click(); + // await page.waitForURL("http://localhost:3000/login", { timeout: 1000 }); + // await page.getByText("Account created! Await admin activation.").click(); }); }); diff --git a/src/frontend/tests/onlyFront/saveComponents.spec.ts b/src/frontend/tests/onlyFront/saveComponents.spec.ts index a2539090b..07a074bad 100644 --- a/src/frontend/tests/onlyFront/saveComponents.spec.ts +++ b/src/frontend/tests/onlyFront/saveComponents.spec.ts @@ -5,12 +5,6 @@ test.describe("save component tests", () => { async function saveComponent(page: Page, pattern: RegExp, n: number) { for (let i = 0; i < n; i++) { await page.getByTestId(pattern).click(); - //more node options - await page - .locator( - "//html/body/div/div/div[2]/div/main/div/div/div/div[1]/div[1]/div[2]/div/span/button[3]/div/div" - ) - .click(); await page.getByLabel("Save").click(); } } @@ -32,7 +26,7 @@ test.describe("save component tests", () => { await page.locator("span").filter({ hasText: "My Collection" }).isVisible(); // Read your file into a buffer. const jsonContent = readFileSync( - "tests/onlyFront/assets/flow.json", + "tests/onlyFront/assets/collection.json", "utf-8" ); @@ -40,7 +34,7 @@ test.describe("save component tests", () => { const dataTransfer = await page.evaluateHandle((data) => { const dt = new DataTransfer(); // Convert the buffer to a hex array - const file = new File([data], "flow.json", { + const file = new File([data], "flowtest.json", { type: "application/json", }); dt.items.add(file); @@ -48,207 +42,79 @@ test.describe("save component tests", () => { }, jsonContent); // Now dispatch - await page.dispatchEvent('//*[@id="root"]/div/div[2]/div[2]', "drop", { - dataTransfer, + await page.dispatchEvent( + '//*[@id="root"]/div/div[1]/div[2]/div[3]/div/div', + "drop", + { + dataTransfer, + } + ); + + await page + .locator( + '//*[@id="root"]/div/div[1]/div[2]/div[3]/div/div/div/div/div/div/div/div[2]/span[2]' + ) + .click(); + await page.waitForTimeout(2000); + + const genericNoda = page.getByTestId("div-generic-node"); + const elementCount = await genericNoda.count(); + if (elementCount > 0) { + expect(true).toBeTruthy(); + } + + await page.getByTestId("title-PythonFunctionTool").click({ + modifiers: ["Control"], }); - expect( - await page - .locator(".main-page-flows-display") - .evaluate((el) => el.children) - ).toBeTruthy(); - await page.getByRole("button", { name: "Edit Flow" }).click(); - //inside the flow - await page - .locator( - "//html/body/div/div/div[2]/div/main/div/div/div/div[1]/div[1]/div[1]/div/div[2]/div[1]/div/div[1]/div" - ) - .click({ - modifiers: ["Control"], - }); - await page - .locator( - "//html/body/div/div/div[2]/div/main/div/div/div/div[1]/div[1]/div[1]/div/div[2]/div[2]/div/div[1]/div" - ) - .click({ - modifiers: ["Control"], - }); - await page - .locator( - "//html/body/div/div/div[2]/div/main/div/div/div/div[1]/div[1]/div[1]/div/div[2]/div[3]/div/div[1]/div" - ) - .click({ - modifiers: ["Control"], - }); + await page.getByTestId("title-ChatOpenAI").click({ + modifiers: ["Control"], + }); + + await page.getByTestId("title-AgentInitializer").click({ + modifiers: ["Control"], + }); + await page.getByRole("button", { name: "Group" }).click(); - expect( - await page - .locator( - "//html/body/div/div/div[2]/div/main/div/div/div/div[1]/div[1]/div[1]/div/div[2]/div/div" - ) - .isVisible() - ).toBeTruthy(); - await page.getByPlaceholder("Type something...").first().click(); - await page.getByPlaceholder("Type something...").first().fill("save"); - await page.locator(".react-flow__pane").click(); - await page - .locator(".side-bar-buttons-arrangement > div:nth-child(3)") - .click(); - //more option click - await page - .locator( - "//html/body/div/div/div[2]/div/main/div/div/div/div[1]/div[1]/div[2]/div/span/button[3]/div/div" - ) - .click(); - await page.getByLabel("Save").click(); - await page.getByPlaceholder("Search").click(); - await page.getByPlaceholder("Search").fill("save"); - await page.waitForTimeout(2000); - await page - .locator('//*[@id="custom_componentssave"]') - .dragTo(page.locator('//*[@id="react-flow-id"]')); - await page.waitForTimeout(2000); - expect( - (await page.getByTestId(/.*rf__node-AgentInitializer.*/).all()).length - ).toBe(2); - await page.locator(".isolate > button").first().click(); - expect( - (await page.getByTestId(/.*rf__node-AgentInitializer.*/).all()).length - ).toBe(1); - await page.getByTestId(/.*rf__node-AgentInitializer.*/).click(); - await page.getByTestId(/.*rf__node-AgentInitializer.*/).press("Backspace"); - await page - .locator('//*[@id="custom_componentssave"]') - .dragTo(page.locator('//*[@id="react-flow-id"]')); - await page.getByTestId(/.*rf__node-AgentInitializer.*/).click(); - await page - .locator( - "//html/body/div/div/div[2]/div/main/div/div/div/div[1]/div[1]/div[2]/div/span/button[3]/div/div" - ) - .click(); - await page.getByLabel("Ungroup").click(); - expect((await page.getByTestId(/.*rf__node-.*/).all()).length).toBe(3); - expect( - (await page.getByTestId(/.*rf__edge-reactflow.*/).all()).length - ).toBe(2); - }); + await page.locator("div").filter({ hasText: "Star13756" }).nth(3).click(); - test("save default component with custom values", async ({ page }) => { - await page.routeFromHAR("harFiles/langflow.har", { - url: "**/api/v1/**", - update: false, - }); - await page.route("**/api/v1/flows/", async (route) => { - const json = { - id: "e9ac1bdc-429b-475d-ac03-d26f9a2a3210", - }; - await route.fulfill({ json, status: 201 }); - }); - await page.goto("http://localhost:3000/"); - await page.locator("span").filter({ hasText: "My Collection" }).isVisible(); - await page.locator('//*[@id="new-project-btn"]').click(); + let textArea = page.getByTestId("div-textarea-2"); + let elementCountText = await textArea.count(); + if (elementCountText > 0) { + expect(true).toBeTruthy(); + } + + let groupNode = page.getByTestId("title-Group"); + let elementGroup = await groupNode.count(); + if (elementGroup > 0) { + expect(true).toBeTruthy(); + } + + await page.getByTestId("title-Group").click(); + await page.getByTestId("more-options-modal").click(); + await page.getByTestId("save-button-modal").click(); + await page.getByTestId("delete-button-modal").click(); + + await page.getByPlaceholder("Search").click(); + await page.getByPlaceholder("Search").fill("group"); await page.waitForTimeout(2000); - await page.getByPlaceholder("Search").click(); - await page.getByPlaceholder("Search").fill("Chroma"); - await page - .locator('//*[@id="vectorstoresChroma"]') + .getByTestId("saved_componentsGroup") + .first() .dragTo(page.locator('//*[@id="react-flow-id"]')); - await page.locator("#input-8").click(); - await page.locator("#input-8").fill("test"); - await saveComponent(page, /.*rf__node-Chroma.*/, 1); - await page.getByTestId(/.*rf__node-Chroma.*/).press("Backspace"); - await page.getByPlaceholder("Search").click(); - await page.getByPlaceholder("Search").fill(""); - await page.getByPlaceholder("Search").fill("Chroma"); - await page - .locator('//*[@id="custom_componentsChroma"]') - .dragTo(page.locator('//*[@id="react-flow-id"]')); - expect(await page.locator("#input-8").inputValue()).toBe("test"); - }); + await page.mouse.up(); + await page.mouse.down(); - test("save same component multiple times", async ({ page }) => { - await page.routeFromHAR("harFiles/langflow.har", { - url: "**/api/v1/**", - update: false, - }); - await page.route("**/api/v1/flows/", async (route) => { - const json = { - id: "e9ac1bdc-429b-475d-ac03-d26f9a2a3210", - }; - await route.fulfill({ json, status: 201 }); - }); - await page.goto("http://localhost:3000/"); - await page.locator("span").filter({ hasText: "My Collection" }).isVisible(); - await page.locator('//*[@id="new-project-btn"]').click(); - await page.waitForTimeout(2000); + textArea = page.getByTestId("div-textarea-2"); + elementCountText = await textArea.count(); + if (elementCountText > 0) { + expect(true).toBeTruthy(); + } - await page.getByPlaceholder("Search").click(); - await page.getByPlaceholder("Search").fill("Chroma"); - - await page - .locator('//*[@id="vectorstoresChroma"]') - .dragTo(page.locator('//*[@id="react-flow-id"]')); - await saveComponent(page, /.*rf__node-Chroma.*/, 3); - await page.getByTestId(/.*rf__node-Chroma.*/).press("Backspace"); - await page.getByPlaceholder("Search").click(); - await page.getByPlaceholder("Search").fill(""); - await page.getByPlaceholder("Search").fill("Chroma"); - expect( - await page.locator('//*[@id="custom_componentsChroma"]').isVisible() - ).toBeTruthy(); - expect( - await page.locator('[id="custom_componentsChroma\\ \\(1\\)"]').isVisible() - ).toBeTruthy(); - expect( - await page.locator('[id="custom_componentsChroma\\ \\(2\\)"]').isVisible() - ).toBeTruthy(); - await page - .locator('[id="custom_componentsChroma\\ \\(2\\)"]') - .dragTo(page.locator('//*[@id="react-flow-id"]')); - expect( - (await page.getByTestId(/.*rf__node-Chroma.*/).allInnerTexts()).includes( - "Chroma (2)" - ) - ).toBeTruthy(); - }); - - test("save default component and delete it", async ({ page }) => { - await page.routeFromHAR("harFiles/langflow.har", { - url: "**/api/v1/**", - update: false, - }); - await page.route("**/api/v1/flows/", async (route) => { - const json = { - id: "e9ac1bdc-429b-475d-ac03-d26f9a2a3210", - }; - await route.fulfill({ json, status: 201 }); - }); - await page.goto("http://localhost:3000/"); - await page.locator("span").filter({ hasText: "My Collection" }).isVisible(); - await page.locator('//*[@id="new-project-btn"]').click(); - await page.waitForTimeout(2000); - - await page.getByPlaceholder("Search").click(); - await page.getByPlaceholder("Search").fill("Chroma"); - - await page - .locator('//*[@id="vectorstoresChroma"]') - .dragTo(page.locator('//*[@id="react-flow-id"]')); - await saveComponent(page, /.*rf__node-Chroma.*/, 1); - await page.getByTestId(/.*rf__node-Chroma.*/).press("Backspace"); - await page.getByPlaceholder("Search").click(); - await page.getByPlaceholder("Search").fill(""); - await page.getByPlaceholder("Search").fill("Chroma"); - await page.locator("#custom_componentsChroma").getByRole("combobox").click({ - button: "right", - }); - await page.getByLabel("Delete").click(); - await page.getByPlaceholder("Search").click(); - await page.getByPlaceholder("Search").fill(" "); - await page.getByPlaceholder("Search").fill("Chroma"); - expect( - await page.locator("#custom_componentsChroma").isVisible() - ).toBeFalsy(); + groupNode = page.getByTestId("title-Group"); + elementGroup = await groupNode.count(); + if (elementGroup > 0) { + expect(true).toBeTruthy(); + } }); }); From 5c290c0014c2f8b1747fe3c2c2807a36d5a708ad Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 14 Dec 2023 17:44:25 -0300 Subject: [PATCH 146/203] Pull start_time out of try block --- src/backend/langflow/api/v1/chat.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/backend/langflow/api/v1/chat.py b/src/backend/langflow/api/v1/chat.py index 059ad23b6..de10b318d 100644 --- a/src/backend/langflow/api/v1/chat.py +++ b/src/backend/langflow/api/v1/chat.py @@ -1,18 +1,21 @@ import time -from fastapi import APIRouter, Depends, HTTPException, Query, WebSocket, WebSocketException, status +from fastapi import (APIRouter, Depends, HTTPException, Query, WebSocket, + WebSocketException, status) from fastapi.responses import StreamingResponse -from loguru import logger -from sqlmodel import Session - from langflow.api.utils import build_input_keys_response, format_elapsed_time -from langflow.api.v1.schemas import BuildStatus, BuiltResponse, InitResponse, StreamData +from langflow.api.v1.schemas import (BuildStatus, BuiltResponse, InitResponse, + StreamData) from langflow.graph.graph.base import Graph -from langflow.services.auth.utils import get_current_active_user, get_current_user_by_jwt +from langflow.services.auth.utils import (get_current_active_user, + get_current_user_by_jwt) from langflow.services.cache.service import BaseCacheService from langflow.services.cache.utils import update_build_status from langflow.services.chat.service import ChatService -from langflow.services.deps import get_cache_service, get_chat_service, get_session +from langflow.services.deps import (get_cache_service, get_chat_service, + get_session) +from loguru import logger +from sqlmodel import Session router = APIRouter(tags=["Chat"]) @@ -149,13 +152,12 @@ async def stream_build( logger.debug("No user_id found in cache_service") user_id = None for i, vertex in enumerate(graph.generator_build(), 1): + start_time = time.perf_counter() try: log_dict = { "log": f"Building node {vertex.vertex_type}", } yield str(StreamData(event="log", data=log_dict)) - # time this - start_time = time.perf_counter() if vertex.is_task: vertex = await try_running_celery_task(vertex, user_id) else: From 7999b3364b77e1795647eb162f0de6e4582dc8ff Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 15 Dec 2023 20:08:24 -0300 Subject: [PATCH 147/203] Add Prompt type to CustomComponent --- docs/docs/components/custom.mdx | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/docs/components/custom.mdx b/docs/docs/components/custom.mdx index 382c40cc4..84823e341 100644 --- a/docs/docs/components/custom.mdx +++ b/docs/docs/components/custom.mdx @@ -34,6 +34,7 @@ The CustomComponent class serves as the foundation for creating custom component | --------------------------------------------------------- | | _`str`_, _`int`_, _`float`_, _`bool`_, _`list`_, _`dict`_ | | _`langflow.field_typing.NestedDict`_ | + | _`langflow.field_typing.Prompt`_ | | _`langchain.chains.base.Chain`_ | | _`langchain.PromptTemplate`_ | | _`langchain.llms.base.BaseLLM`_ | @@ -48,10 +49,17 @@ The CustomComponent class serves as the foundation for creating custom component The difference between _`dict`_ and _`langflow.field_typing.NestedDict`_ is that one adds a simple key-value pair field, while the other opens a more robust dictionary editor. - Unlike Langchain types, base Python types do not add a + To use the _`Prompt`_ type, you must also add _`**kwargs`_ to the _`build`_ method. This is because the _`Prompt`_ type passes new arbitrary keyword arguments to it. + + If you want to add the values of the variables to the template you defined, you must format the PromptTemplate inside the CustomComponent class. + + + + + Unlike Langchain types, base Python types do not add a [handle](../guidelines/components) to the field by default. To add handles, use the _`input_types`_ key in the _`build_config`_ method. - + - **build_config**: Used to define the configuration fields of the component (if applicable). It should always return a dictionary with specific keys representing the field names and corresponding configurations. This method is called when the code is processed (i.e., when you click _Check and Save_ in the code editor). It must follow the format described below: From f36b6a5693bcbb5f065b36cd2fad1c672b7a5749 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Sun, 17 Dec 2023 17:32:03 -0300 Subject: [PATCH 148/203] Add support for Runnable objects in generate_result function --- src/backend/langflow/processing/process.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/backend/langflow/processing/process.py b/src/backend/langflow/processing/process.py index de0890802..1a25965de 100644 --- a/src/backend/langflow/processing/process.py +++ b/src/backend/langflow/processing/process.py @@ -12,6 +12,7 @@ from langflow.interface.run import build_sorted_vertices, get_memory_key, update from langflow.services.deps import get_session_service from loguru import logger from pydantic import BaseModel +from langchain_core.runnables.base import Runnable def fix_memory_inputs(langchain_object): @@ -131,6 +132,10 @@ def generate_result(langchain_object: Union[Chain, VectorStore], inputs: dict): result = langchain_object.search(**inputs) elif isinstance(langchain_object, Document): result = langchain_object.dict() + elif isinstance(langchain_object, Runnable): + result = langchain_object.invoke(inputs) + result = result.content if hasattr(result, "content") else result + else: logger.warning(f"Unknown langchain_object type: {type(langchain_object)}") if isinstance(langchain_object, Coroutine): From 2afb0fb119b49cfdbed3cd874b225350402a2e46 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Sun, 17 Dec 2023 20:44:35 -0300 Subject: [PATCH 149/203] Add support for custom components in langchain_object --- src/backend/langflow/processing/process.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/backend/langflow/processing/process.py b/src/backend/langflow/processing/process.py index 1a25965de..80846ec11 100644 --- a/src/backend/langflow/processing/process.py +++ b/src/backend/langflow/processing/process.py @@ -7,6 +7,7 @@ from langchain.agents import AgentExecutor from langchain.chains.base import Chain from langchain.schema import AgentAction, Document from langchain.vectorstores.base import VectorStore +from langflow.components.custom_components import CustomComponent from langflow.graph import Graph from langflow.interface.run import build_sorted_vertices, get_memory_key, update_memory_keys from langflow.services.deps import get_session_service @@ -135,6 +136,8 @@ def generate_result(langchain_object: Union[Chain, VectorStore], inputs: dict): elif isinstance(langchain_object, Runnable): result = langchain_object.invoke(inputs) result = result.content if hasattr(result, "content") else result + elif hasattr(langchain_object, "run") and isinstance(langchain_object, CustomComponent): + result = langchain_object.run(inputs) else: logger.warning(f"Unknown langchain_object type: {type(langchain_object)}") From 60a55784af5efd82b7ba1f6a011c652eb699468b Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Sun, 17 Dec 2023 21:27:07 -0300 Subject: [PATCH 150/203] Refactor flow loading and processing --- src/backend/langflow/__init__.py | 7 +-- src/backend/langflow/processing/load.py | 50 ++++++++++++++++++++++ src/backend/langflow/processing/process.py | 50 ++-------------------- tests/test_loading.py | 2 +- 4 files changed, 58 insertions(+), 51 deletions(-) create mode 100644 src/backend/langflow/processing/load.py diff --git a/src/backend/langflow/__init__.py b/src/backend/langflow/__init__.py index d3afbb4af..2b6dd4fb8 100644 --- a/src/backend/langflow/__init__.py +++ b/src/backend/langflow/__init__.py @@ -1,9 +1,10 @@ from importlib import metadata +from langflow.interface.custom.custom_component import CustomComponent + # Deactivate cache manager for now # from langflow.services.cache import cache_service -from langflow.processing.process import load_flow_from_json -from langflow.interface.custom.custom_component import CustomComponent +from langflow.processing.load import load_flow_from_json try: __version__ = metadata.version(__package__) @@ -12,4 +13,4 @@ except metadata.PackageNotFoundError: __version__ = "" del metadata # optional, avoids polluting the results of dir(__package__) -__all__ = ["load_flow_from_json", "cache_service", "CustomComponent"] +__all__ = ["load_flow_from_json", "CustomComponent"] diff --git a/src/backend/langflow/processing/load.py b/src/backend/langflow/processing/load.py new file mode 100644 index 000000000..8733b7b12 --- /dev/null +++ b/src/backend/langflow/processing/load.py @@ -0,0 +1,50 @@ +from pathlib import Path +from typing import Optional, Union + +from langflow.graph import Graph +from langflow.processing.process import fix_memory_inputs, process_tweaks + + +def load_flow_from_json(flow: Union[Path, str, dict], tweaks: Optional[dict] = None, build=True): + """ + Load flow from a JSON file or a JSON object. + + :param flow: JSON file path or JSON object + :param tweaks: Optional tweaks to be processed + :param build: If True, build the graph, otherwise return the graph object + :return: Langchain object or Graph object depending on the build parameter + """ + # If input is a file path, load JSON from the file + if isinstance(flow, (str, Path)): + with open(flow, "r", encoding="utf-8") as f: + flow_graph = json.load(f) + # If input is a dictionary, assume it's a JSON object + elif isinstance(flow, dict): + flow_graph = flow + else: + raise TypeError("Input must be either a file path (str) or a JSON object (dict)") + + graph_data = flow_graph["data"] + if tweaks is not None: + graph_data = process_tweaks(graph_data, tweaks) + nodes = graph_data["nodes"] + edges = graph_data["edges"] + graph = Graph(nodes, edges) + + if build: + langchain_object = asyncio.run(graph.build()) + + if hasattr(langchain_object, "verbose"): + langchain_object.verbose = True + + if hasattr(langchain_object, "return_intermediate_steps"): + # Deactivating until we have a frontend solution + # to display intermediate steps + langchain_object.return_intermediate_steps = False + + fix_memory_inputs(langchain_object) + return langchain_object + + return graph + + return graph diff --git a/src/backend/langflow/processing/process.py b/src/backend/langflow/processing/process.py index 80846ec11..4b7cf8470 100644 --- a/src/backend/langflow/processing/process.py +++ b/src/backend/langflow/processing/process.py @@ -1,19 +1,16 @@ import asyncio -import json -from pathlib import Path from typing import Any, Coroutine, Dict, List, Optional, Tuple, Union from langchain.agents import AgentExecutor from langchain.chains.base import Chain from langchain.schema import AgentAction, Document from langchain.vectorstores.base import VectorStore +from langchain_core.runnables.base import Runnable from langflow.components.custom_components import CustomComponent -from langflow.graph import Graph from langflow.interface.run import build_sorted_vertices, get_memory_key, update_memory_keys from langflow.services.deps import get_session_service from loguru import logger from pydantic import BaseModel -from langchain_core.runnables.base import Runnable def fix_memory_inputs(langchain_object): @@ -179,49 +176,6 @@ async def process_graph_cached( return Result(result=result, session_id=session_id) -def load_flow_from_json(flow: Union[Path, str, dict], tweaks: Optional[dict] = None, build=True): - """ - Load flow from a JSON file or a JSON object. - - :param flow: JSON file path or JSON object - :param tweaks: Optional tweaks to be processed - :param build: If True, build the graph, otherwise return the graph object - :return: Langchain object or Graph object depending on the build parameter - """ - # If input is a file path, load JSON from the file - if isinstance(flow, (str, Path)): - with open(flow, "r", encoding="utf-8") as f: - flow_graph = json.load(f) - # If input is a dictionary, assume it's a JSON object - elif isinstance(flow, dict): - flow_graph = flow - else: - raise TypeError("Input must be either a file path (str) or a JSON object (dict)") - - graph_data = flow_graph["data"] - if tweaks is not None: - graph_data = process_tweaks(graph_data, tweaks) - nodes = graph_data["nodes"] - edges = graph_data["edges"] - graph = Graph(nodes, edges) - - if build: - langchain_object = asyncio.run(graph.build()) - - if hasattr(langchain_object, "verbose"): - langchain_object.verbose = True - - if hasattr(langchain_object, "return_intermediate_steps"): - # Deactivating until we have a frontend solution - # to display intermediate steps - langchain_object.return_intermediate_steps = False - - fix_memory_inputs(langchain_object) - return langchain_object - - return graph - - def validate_input(graph_data: Dict[str, Any], tweaks: Dict[str, Dict[str, Any]]) -> List[Dict[str, Any]]: if not isinstance(graph_data, dict) or not isinstance(tweaks, dict): raise ValueError("graph_data and tweaks should be dictionaries") @@ -271,3 +225,5 @@ def process_tweaks(graph_data: Dict[str, Any], tweaks: Dict[str, Dict[str, Any]] logger.warning("Each node should be a dictionary with an 'id' key of type str") return graph_data + return graph_data + return graph_data diff --git a/tests/test_loading.py b/tests/test_loading.py index 94cf34d8e..eb3987e93 100644 --- a/tests/test_loading.py +++ b/tests/test_loading.py @@ -3,7 +3,7 @@ import json import pytest from langchain.chains.base import Chain from langflow.graph import Graph -from langflow.processing.process import load_flow_from_json +from langflow.processing.load import load_flow_from_json from langflow.utils.payload import get_root_vertex From 87f8af1db93a0e623dd4b4e564d289b6cde39aff Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Mon, 18 Dec 2023 10:49:52 -0300 Subject: [PATCH 151/203] Add import statements for asyncio and json --- src/backend/langflow/processing/load.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/backend/langflow/processing/load.py b/src/backend/langflow/processing/load.py index 8733b7b12..d564d101f 100644 --- a/src/backend/langflow/processing/load.py +++ b/src/backend/langflow/processing/load.py @@ -1,3 +1,5 @@ +import asyncio +import json from pathlib import Path from typing import Optional, Union From 2edacce3054ba6f27945525bc15d2d814db3d08c Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Mon, 18 Dec 2023 10:50:01 -0300 Subject: [PATCH 152/203] Add traceback property to AnyIOTaskResult class --- src/backend/langflow/services/task/backends/anyio.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/backend/langflow/services/task/backends/anyio.py b/src/backend/langflow/services/task/backends/anyio.py index 49c9c0e4f..04309b8df 100644 --- a/src/backend/langflow/services/task/backends/anyio.py +++ b/src/backend/langflow/services/task/backends/anyio.py @@ -1,8 +1,11 @@ +import traceback from typing import Any, Callable, Optional, Tuple + import anyio -from langflow.services.task.backends.base import TaskBackend from loguru import logger +from langflow.services.task.backends.base import TaskBackend + class AnyIOTaskResult: def __init__(self, scope): @@ -17,6 +20,12 @@ class AnyIOTaskResult: return "FAILURE" if self._exception is not None else "SUCCESS" return self._status + @property + def traceback(self) -> str: + if self._traceback is not None: + return "".join(traceback.format_tb(self._traceback)) + return "" + @property def result(self) -> Any: return self._result @@ -29,6 +38,7 @@ class AnyIOTaskResult: self._result = await func(*args, **kwargs) except Exception as e: self._exception = e + self._traceback = e.__traceback__ finally: self._status = "DONE" From 826a6d07e0401754a6f53a1647426614f64d574b Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Mon, 18 Dec 2023 10:50:43 -0300 Subject: [PATCH 153/203] Refactor ProcessResponse schema in schemas.py --- src/backend/langflow/api/v1/schemas.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/langflow/api/v1/schemas.py b/src/backend/langflow/api/v1/schemas.py index 8c8c4efd7..252df4669 100644 --- a/src/backend/langflow/api/v1/schemas.py +++ b/src/backend/langflow/api/v1/schemas.py @@ -3,12 +3,11 @@ from pathlib import Path from typing import Any, Dict, List, Optional, Union from uuid import UUID -from pydantic import BaseModel, Field, field_validator - from langflow.services.database.models.api_key.model import ApiKeyRead from langflow.services.database.models.base import orjson_dumps from langflow.services.database.models.flow import FlowCreate, FlowRead from langflow.services.database.models.user import UserRead +from pydantic import BaseModel, Field, field_validator class BuildStatus(Enum): @@ -59,6 +58,7 @@ class ProcessResponse(BaseModel): """Process response schema.""" result: Any + status: Optional[str] = None task: Optional[TaskResponse] = None session_id: Optional[str] = None backend: Optional[str] = None From 34e116ddf27b3afe7d4c74b9c9c4144cd157ccf1 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Mon, 18 Dec 2023 10:52:33 -0300 Subject: [PATCH 154/203] Add process_json endpoint for processing JSON data --- src/backend/langflow/api/v1/endpoints.py | 179 +++++++++++++++-------- 1 file changed, 117 insertions(+), 62 deletions(-) diff --git a/src/backend/langflow/api/v1/endpoints.py b/src/backend/langflow/api/v1/endpoints.py index ccba9674c..aef197403 100644 --- a/src/backend/langflow/api/v1/endpoints.py +++ b/src/backend/langflow/api/v1/endpoints.py @@ -3,24 +3,26 @@ from typing import Annotated, Optional, Union import sqlalchemy as sa from fastapi import APIRouter, Body, Depends, HTTPException, UploadFile, status +from loguru import logger +from sqlmodel import select + from langflow.api.utils import update_frontend_node_with_template_values -from langflow.api.v1.schemas import (CustomComponentCode, ProcessResponse, - TaskResponse, TaskStatusResponse, - UploadFileResponse) +from langflow.api.v1.schemas import ( + CustomComponentCode, + ProcessResponse, + TaskResponse, + TaskStatusResponse, + UploadFileResponse, +) from langflow.interface.custom.custom_component import CustomComponent from langflow.interface.custom.directory_reader import DirectoryReader -from langflow.interface.custom.utils import (build_custom_component_template, - create_and_validate_component) +from langflow.interface.custom.utils import build_custom_component_template, create_and_validate_component from langflow.processing.process import process_graph_cached, process_tweaks -from langflow.services.auth.utils import (api_key_security, - get_current_active_user) +from langflow.services.auth.utils import api_key_security, get_current_active_user from langflow.services.cache.utils import save_uploaded_file from langflow.services.database.models.flow import Flow from langflow.services.database.models.user.model import User -from langflow.services.deps import (get_session, get_session_service, - get_settings_service, get_task_service) -from loguru import logger -from sqlmodel import select +from langflow.services.deps import get_session, get_session_service, get_settings_service, get_task_service try: from langflow.worker import process_graph_cached_task @@ -30,13 +32,81 @@ except ImportError: raise NotImplementedError("Celery is not installed") -from langflow.services.task.service import TaskService from sqlmodel import Session +from langflow.services.task.service import TaskService + # build router router = APIRouter(tags=["Base"]) +async def process_graph_data( + graph_data: dict, + inputs: Optional[dict] = None, + tweaks: Optional[dict] = None, + clear_cache: bool = False, + session_id: Optional[str] = None, + task_service: "TaskService" = Depends(get_task_service), + sync: bool = True, +): + task_result = None + task_status = None + if tweaks: + try: + graph_data = process_tweaks(graph_data, tweaks) + except Exception as exc: + logger.error(f"Error processing tweaks: {exc}") + if sync: + task_id, result = await task_service.launch_and_await_task( + process_graph_cached_task if task_service.use_celery else process_graph_cached, + graph_data, + inputs, + clear_cache, + session_id, + ) + if isinstance(result, dict) and "result" in result: + task_result = result["result"] + session_id = result["session_id"] + elif hasattr(result, "result") and hasattr(result, "session_id"): + task_result = result.result + + session_id = result.session_id + else: + logger.warning( + "This is an experimental feature and may not work as expected." + "Please report any issues to our GitHub repository." + ) + if session_id is None: + # Generate a session ID + session_id = get_session_service().generate_key(session_id=session_id, data_graph=graph_data) + task_id, task = await task_service.launch_task( + process_graph_cached_task if task_service.use_celery else process_graph_cached, + graph_data, + inputs, + clear_cache, + session_id, + ) + task_status = task.status + if task.status == "FAILURE": + logger.error(f"Task {task_id} failed: {task.traceback}") + task_result = str(task._exception) + else: + task_result = task.result + + if task_id: + task_response = TaskResponse(id=task_id, href=f"api/v1/task/{task_id}") + else: + task_response = None + + return ProcessResponse( + result=task_result, + status=task_status, + task=task_response, + session_id=session_id, + backend=task_service.backend_name, + ) + + @router.get("/all", dependencies=[Depends(get_current_active_user)]) def get_all( settings_service=Depends(get_settings_service), @@ -50,7 +120,32 @@ def get_all( raise HTTPException(status_code=500, detail=str(exc)) from exc -# For backwards compatibility we will keep the old endpoint +@router.post("/process/json", response_model=ProcessResponse) +async def process_json( + session: Annotated[Session, Depends(get_session)], + data: dict, + inputs: Optional[dict] = None, + tweaks: Optional[dict] = None, + clear_cache: Annotated[bool, Body(embed=True)] = False, # noqa: F821 + session_id: Annotated[Union[None, str], Body(embed=True)] = None, # noqa: F821 + task_service: "TaskService" = Depends(get_task_service), + sync: Annotated[bool, Body(embed=True)] = True, # noqa: F821 +): + try: + return await process_graph_data( + graph_data=data, + inputs=inputs, + tweaks=tweaks, + clear_cache=clear_cache, + session_id=session_id, + task_service=task_service, + sync=sync, + ) + except Exception as exc: + logger.exception(exc) + raise HTTPException(status_code=500, detail=str(exc)) from exc + + @router.post( "/predict/{flow_id}", response_model=ProcessResponse, @@ -91,54 +186,14 @@ async def process( if flow.data is None: raise ValueError(f"Flow {flow_id} has no data") graph_data = flow.data - task_result = None - if tweaks: - try: - graph_data = process_tweaks(graph_data, tweaks) - except Exception as exc: - logger.error(f"Error processing tweaks: {exc}") - if sync: - task_id, result = await task_service.launch_and_await_task( - process_graph_cached_task if task_service.use_celery else process_graph_cached, - graph_data, - inputs, - clear_cache, - session_id, - ) - if isinstance(result, dict) and "result" in result: - task_result = result["result"] - session_id = result["session_id"] - elif hasattr(result, "result") and hasattr(result, "session_id"): - task_result = result.result - - session_id = result.session_id - else: - logger.warning( - "This is an experimental feature and may not work as expected." - "Please report any issues to our GitHub repository." - ) - if session_id is None: - # Generate a session ID - session_id = get_session_service().generate_key(session_id=session_id, data_graph=graph_data) - task_id, task = await task_service.launch_task( - process_graph_cached_task if task_service.use_celery else process_graph_cached, - graph_data, - inputs, - clear_cache, - session_id, - ) - task_result = task.status - - if task_id: - task_response = TaskResponse(id=task_id, href=f"api/v1/task/{task_id}") - else: - task_response = None - - return ProcessResponse( - result=task_result, - task=task_response, + return await process_graph_data( + graph_data=graph_data, + inputs=inputs, + tweaks=tweaks, + clear_cache=clear_cache, session_id=session_id, - backend=task_service.backend_name, + task_service=task_service, + sync=sync, ) except sa.exc.StatementError as exc: # StatementError('(builtins.ValueError) badly formed hexadecimal UUID string') @@ -161,6 +216,8 @@ async def get_task_status(task_id: str): task_service = get_task_service() task = task_service.get_task(task_id) result = None + if task is None: + raise HTTPException(status_code=404, detail="Task not found") if task.ready(): result = task.result # If result isinstance of Exception, can we get the traceback? @@ -172,8 +229,6 @@ async def get_task_status(task_id: str): elif hasattr(result, "result"): result = result.result - if task is None: - raise HTTPException(status_code=404, detail="Task not found") if task.status == "FAILURE": result = str(task.result) logger.error(f"Task {task_id} failed: {task.traceback}") From 96d12b6259659ba9c0919b82e2ca7afd553e3d4b Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 19 Dec 2023 13:38:33 -0300 Subject: [PATCH 155/203] Update import statements in memories.py --- poetry.lock | 952 ++++++++++-------- .../template/frontend_node/memories.py | 11 +- 2 files changed, 512 insertions(+), 451 deletions(-) diff --git a/poetry.lock b/poetry.lock index 1efc16a2b..907ff1ff8 100644 --- a/poetry.lock +++ b/poetry.lock @@ -283,17 +283,17 @@ tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pyte [[package]] name = "authlib" -version = "1.2.1" +version = "1.3.0" description = "The ultimate Python library in building OAuth and OpenID Connect servers and clients." optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "Authlib-1.2.1-py2.py3-none-any.whl", hash = "sha256:c88984ea00149a90e3537c964327da930779afa4564e354edfd98410bea01911"}, - {file = "Authlib-1.2.1.tar.gz", hash = "sha256:421f7c6b468d907ca2d9afede256f068f87e34d23dd221c07d13d4c234726afb"}, + {file = "Authlib-1.3.0-py2.py3-none-any.whl", hash = "sha256:9637e4de1fb498310a56900b3e2043a206b03cb11c05422014b0302cbc814be3"}, + {file = "Authlib-1.3.0.tar.gz", hash = "sha256:959ea62a5b7b5123c5059758296122b57cd2585ae2ed1c0622c21b371ffdae06"}, ] [package.dependencies] -cryptography = ">=3.2" +cryptography = "*" [[package]] name = "backoff" @@ -398,17 +398,17 @@ files = [ [[package]] name = "boto3" -version = "1.34.0" +version = "1.34.3" description = "The AWS SDK for Python" optional = false python-versions = ">= 3.8" files = [ - {file = "boto3-1.34.0-py3-none-any.whl", hash = "sha256:8b3c4d4e720c0ad706590c284b8f30c76de3472c1ce1bac610425f99bf6ab53b"}, - {file = "boto3-1.34.0.tar.gz", hash = "sha256:c9b400529932ed4652304756528ab235c6730aa5d00cb4d9e4848ce460c82c16"}, + {file = "boto3-1.34.3-py3-none-any.whl", hash = "sha256:77e055bd44c7ffc593928d2a272f4931a7f68c22f8d984530fc76cf063b7cc05"}, + {file = "boto3-1.34.3.tar.gz", hash = "sha256:d2fa7c1c65108fd984ac7b6d21cca640a6a005ff1ad99e4429b9f6ef835996f9"}, ] [package.dependencies] -botocore = ">=1.34.0,<1.35.0" +botocore = ">=1.34.3,<1.35.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.9.0,<0.10.0" @@ -417,13 +417,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.34.0" +version = "1.34.3" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">= 3.8" files = [ - {file = "botocore-1.34.0-py3-none-any.whl", hash = "sha256:6ec19f6c9f61c3df22fb3e083940ac7946a3d96128db1f370f10aea702bb157f"}, - {file = "botocore-1.34.0.tar.gz", hash = "sha256:711b406de910585395466ca649bceeea87a04300ddf74d9a2e20727c7f27f2f1"}, + {file = "botocore-1.34.3-py3-none-any.whl", hash = "sha256:c0e7910a118ad497738a327f3456582c69f761ba9d004007570d64093f767a5e"}, + {file = "botocore-1.34.3.tar.gz", hash = "sha256:8e5b32c63db8963af0008e36ceb13c236a46878a3722ffc6dd3be7351fba7163"}, ] [package.dependencies] @@ -913,13 +913,13 @@ testing = ["pytest (>=7.2.1)", "pytest-cov (>=4.0.0)", "tox (>=4.4.3)"] [[package]] name = "cohere" -version = "4.38" +version = "4.39" description = "Python SDK for the Cohere API" optional = false python-versions = ">=3.8,<4.0" files = [ - {file = "cohere-4.38-py3-none-any.whl", hash = "sha256:f0edcf779aa6759dd2f91db37dec7b06303029effbd38fecc4e0f8af36aae757"}, - {file = "cohere-4.38.tar.gz", hash = "sha256:232cde3bb932b154effdab4b78f195032ee2188bf3ae9f1c883a51291307f996"}, + {file = "cohere-4.39-py3-none-any.whl", hash = "sha256:7f157b7ac0a70b1dda77dc56c4fc063e8d21efcd2bb13759cd5b6839080405e7"}, + {file = "cohere-4.39.tar.gz", hash = "sha256:9e94bb1e5b2e2d464738e0ab3c99ed2879c043cccc90ecbeffd124e81867745d"}, ] [package.dependencies] @@ -1030,63 +1030,63 @@ yaml = ["PyYAML"] [[package]] name = "coverage" -version = "7.3.2" +version = "7.3.3" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d872145f3a3231a5f20fd48500274d7df222e291d90baa2026cc5152b7ce86bf"}, - {file = "coverage-7.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:310b3bb9c91ea66d59c53fa4989f57d2436e08f18fb2f421a1b0b6b8cc7fffda"}, - {file = "coverage-7.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f47d39359e2c3779c5331fc740cf4bce6d9d680a7b4b4ead97056a0ae07cb49a"}, - {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa72dbaf2c2068404b9870d93436e6d23addd8bbe9295f49cbca83f6e278179c"}, - {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:beaa5c1b4777f03fc63dfd2a6bd820f73f036bfb10e925fce067b00a340d0f3f"}, - {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dbc1b46b92186cc8074fee9d9fbb97a9dd06c6cbbef391c2f59d80eabdf0faa6"}, - {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:315a989e861031334d7bee1f9113c8770472db2ac484e5b8c3173428360a9148"}, - {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d1bc430677773397f64a5c88cb522ea43175ff16f8bfcc89d467d974cb2274f9"}, - {file = "coverage-7.3.2-cp310-cp310-win32.whl", hash = "sha256:a889ae02f43aa45032afe364c8ae84ad3c54828c2faa44f3bfcafecb5c96b02f"}, - {file = "coverage-7.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c0ba320de3fb8c6ec16e0be17ee1d3d69adcda99406c43c0409cb5c41788a611"}, - {file = "coverage-7.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ac8c802fa29843a72d32ec56d0ca792ad15a302b28ca6203389afe21f8fa062c"}, - {file = "coverage-7.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:89a937174104339e3a3ffcf9f446c00e3a806c28b1841c63edb2b369310fd074"}, - {file = "coverage-7.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e267e9e2b574a176ddb983399dec325a80dbe161f1a32715c780b5d14b5f583a"}, - {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2443cbda35df0d35dcfb9bf8f3c02c57c1d6111169e3c85fc1fcc05e0c9f39a3"}, - {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4175e10cc8dda0265653e8714b3174430b07c1dca8957f4966cbd6c2b1b8065a"}, - {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf38419fb1a347aaf63481c00f0bdc86889d9fbf3f25109cf96c26b403fda1"}, - {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5c913b556a116b8d5f6ef834038ba983834d887d82187c8f73dec21049abd65c"}, - {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1981f785239e4e39e6444c63a98da3a1db8e971cb9ceb50a945ba6296b43f312"}, - {file = "coverage-7.3.2-cp311-cp311-win32.whl", hash = "sha256:43668cabd5ca8258f5954f27a3aaf78757e6acf13c17604d89648ecc0cc66640"}, - {file = "coverage-7.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10c39c0452bf6e694511c901426d6b5ac005acc0f78ff265dbe36bf81f808a2"}, - {file = "coverage-7.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4cbae1051ab791debecc4a5dcc4a1ff45fc27b91b9aee165c8a27514dd160836"}, - {file = "coverage-7.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63"}, - {file = "coverage-7.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7bba973ebee5e56fe9251300c00f1579652587a9f4a5ed8404b15a0471f216"}, - {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4"}, - {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6e9589bd04d0461a417562649522575d8752904d35c12907d8c9dfeba588faf"}, - {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d51ac2a26f71da1b57f2dc81d0e108b6ab177e7d30e774db90675467c847bbdf"}, - {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:99b89d9f76070237975b315b3d5f4d6956ae354a4c92ac2388a5695516e47c84"}, - {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a"}, - {file = "coverage-7.3.2-cp312-cp312-win32.whl", hash = "sha256:289fe43bf45a575e3ab10b26d7b6f2ddb9ee2dba447499f5401cfb5ecb8196bb"}, - {file = "coverage-7.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dbc3ed60e8659bc59b6b304b43ff9c3ed858da2839c78b804973f613d3e92ed"}, - {file = "coverage-7.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f94b734214ea6a36fe16e96a70d941af80ff3bfd716c141300d95ebc85339738"}, - {file = "coverage-7.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af3d828d2c1cbae52d34bdbb22fcd94d1ce715d95f1a012354a75e5913f1bda2"}, - {file = "coverage-7.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630b13e3036e13c7adc480ca42fa7afc2a5d938081d28e20903cf7fd687872e2"}, - {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9eacf273e885b02a0273bb3a2170f30e2d53a6d53b72dbe02d6701b5296101c"}, - {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f17966e861ff97305e0801134e69db33b143bbfb36436efb9cfff6ec7b2fd9"}, - {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b4275802d16882cf9c8b3d057a0839acb07ee9379fa2749eca54efbce1535b82"}, - {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:72c0cfa5250f483181e677ebc97133ea1ab3eb68645e494775deb6a7f6f83901"}, - {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cb536f0dcd14149425996821a168f6e269d7dcd2c273a8bff8201e79f5104e76"}, - {file = "coverage-7.3.2-cp38-cp38-win32.whl", hash = "sha256:307adb8bd3abe389a471e649038a71b4eb13bfd6b7dd9a129fa856f5c695cf92"}, - {file = "coverage-7.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:88ed2c30a49ea81ea3b7f172e0269c182a44c236eb394718f976239892c0a27a"}, - {file = "coverage-7.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b631c92dfe601adf8f5ebc7fc13ced6bb6e9609b19d9a8cd59fa47c4186ad1ce"}, - {file = "coverage-7.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d3d9df4051c4a7d13036524b66ecf7a7537d14c18a384043f30a303b146164e9"}, - {file = "coverage-7.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f7363d3b6a1119ef05015959ca24a9afc0ea8a02c687fe7e2d557705375c01f"}, - {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f11cc3c967a09d3695d2a6f03fb3e6236622b93be7a4b5dc09166a861be6d25"}, - {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:149de1d2401ae4655c436a3dced6dd153f4c3309f599c3d4bd97ab172eaf02d9"}, - {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3a4006916aa6fee7cd38db3bfc95aa9c54ebb4ffbfc47c677c8bba949ceba0a6"}, - {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9028a3871280110d6e1aa2df1afd5ef003bab5fb1ef421d6dc748ae1c8ef2ebc"}, - {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9f805d62aec8eb92bab5b61c0f07329275b6f41c97d80e847b03eb894f38d083"}, - {file = "coverage-7.3.2-cp39-cp39-win32.whl", hash = "sha256:d1c88ec1a7ff4ebca0219f5b1ef863451d828cccf889c173e1253aa84b1e07ce"}, - {file = "coverage-7.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b4767da59464bb593c07afceaddea61b154136300881844768037fd5e859353f"}, - {file = "coverage-7.3.2-pp38.pp39.pp310-none-any.whl", hash = "sha256:ae97af89f0fbf373400970c0a21eef5aa941ffeed90aee43650b81f7d7f47637"}, - {file = "coverage-7.3.2.tar.gz", hash = "sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef"}, + {file = "coverage-7.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d874434e0cb7b90f7af2b6e3309b0733cde8ec1476eb47db148ed7deeb2a9494"}, + {file = "coverage-7.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ee6621dccce8af666b8c4651f9f43467bfbf409607c604b840b78f4ff3619aeb"}, + {file = "coverage-7.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1367aa411afb4431ab58fd7ee102adb2665894d047c490649e86219327183134"}, + {file = "coverage-7.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f0f8f0c497eb9c9f18f21de0750c8d8b4b9c7000b43996a094290b59d0e7523"}, + {file = "coverage-7.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db0338c4b0951d93d547e0ff8d8ea340fecf5885f5b00b23be5aa99549e14cfd"}, + {file = "coverage-7.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d31650d313bd90d027f4be7663dfa2241079edd780b56ac416b56eebe0a21aab"}, + {file = "coverage-7.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:9437a4074b43c177c92c96d051957592afd85ba00d3e92002c8ef45ee75df438"}, + {file = "coverage-7.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9e17d9cb06c13b4f2ef570355fa45797d10f19ca71395910b249e3f77942a837"}, + {file = "coverage-7.3.3-cp310-cp310-win32.whl", hash = "sha256:eee5e741b43ea1b49d98ab6e40f7e299e97715af2488d1c77a90de4a663a86e2"}, + {file = "coverage-7.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:593efa42160c15c59ee9b66c5f27a453ed3968718e6e58431cdfb2d50d5ad284"}, + {file = "coverage-7.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8c944cf1775235c0857829c275c777a2c3e33032e544bcef614036f337ac37bb"}, + {file = "coverage-7.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:eda7f6e92358ac9e1717ce1f0377ed2b9320cea070906ece4e5c11d172a45a39"}, + {file = "coverage-7.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c854c1d2c7d3e47f7120b560d1a30c1ca221e207439608d27bc4d08fd4aeae8"}, + {file = "coverage-7.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:222b038f08a7ebed1e4e78ccf3c09a1ca4ac3da16de983e66520973443b546bc"}, + {file = "coverage-7.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff4800783d85bff132f2cc7d007426ec698cdce08c3062c8d501ad3f4ea3d16c"}, + {file = "coverage-7.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fc200cec654311ca2c3f5ab3ce2220521b3d4732f68e1b1e79bef8fcfc1f2b97"}, + {file = "coverage-7.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:307aecb65bb77cbfebf2eb6e12009e9034d050c6c69d8a5f3f737b329f4f15fb"}, + {file = "coverage-7.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ffb0eacbadb705c0a6969b0adf468f126b064f3362411df95f6d4f31c40d31c1"}, + {file = "coverage-7.3.3-cp311-cp311-win32.whl", hash = "sha256:79c32f875fd7c0ed8d642b221cf81feba98183d2ff14d1f37a1bbce6b0347d9f"}, + {file = "coverage-7.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:243576944f7c1a1205e5cd658533a50eba662c74f9be4c050d51c69bd4532936"}, + {file = "coverage-7.3.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a2ac4245f18057dfec3b0074c4eb366953bca6787f1ec397c004c78176a23d56"}, + {file = "coverage-7.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f9191be7af41f0b54324ded600e8ddbcabea23e1e8ba419d9a53b241dece821d"}, + {file = "coverage-7.3.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31c0b1b8b5a4aebf8fcd227237fc4263aa7fa0ddcd4d288d42f50eff18b0bac4"}, + {file = "coverage-7.3.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee453085279df1bac0996bc97004771a4a052b1f1e23f6101213e3796ff3cb85"}, + {file = "coverage-7.3.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1191270b06ecd68b1d00897b2daddb98e1719f63750969614ceb3438228c088e"}, + {file = "coverage-7.3.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:007a7e49831cfe387473e92e9ff07377f6121120669ddc39674e7244350a6a29"}, + {file = "coverage-7.3.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:af75cf83c2d57717a8493ed2246d34b1f3398cb8a92b10fd7a1858cad8e78f59"}, + {file = "coverage-7.3.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:811ca7373da32f1ccee2927dc27dc523462fd30674a80102f86c6753d6681bc6"}, + {file = "coverage-7.3.3-cp312-cp312-win32.whl", hash = "sha256:733537a182b5d62184f2a72796eb6901299898231a8e4f84c858c68684b25a70"}, + {file = "coverage-7.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:e995efb191f04b01ced307dbd7407ebf6e6dc209b528d75583277b10fd1800ee"}, + {file = "coverage-7.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fbd8a5fe6c893de21a3c6835071ec116d79334fbdf641743332e442a3466f7ea"}, + {file = "coverage-7.3.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:50c472c1916540f8b2deef10cdc736cd2b3d1464d3945e4da0333862270dcb15"}, + {file = "coverage-7.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e9223a18f51d00d3ce239c39fc41410489ec7a248a84fab443fbb39c943616c"}, + {file = "coverage-7.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f501e36ac428c1b334c41e196ff6bd550c0353c7314716e80055b1f0a32ba394"}, + {file = "coverage-7.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:475de8213ed95a6b6283056d180b2442eee38d5948d735cd3d3b52b86dd65b92"}, + {file = "coverage-7.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:afdcc10c01d0db217fc0a64f58c7edd635b8f27787fea0a3054b856a6dff8717"}, + {file = "coverage-7.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:fff0b2f249ac642fd735f009b8363c2b46cf406d3caec00e4deeb79b5ff39b40"}, + {file = "coverage-7.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a1f76cfc122c9e0f62dbe0460ec9cc7696fc9a0293931a33b8870f78cf83a327"}, + {file = "coverage-7.3.3-cp38-cp38-win32.whl", hash = "sha256:757453848c18d7ab5d5b5f1827293d580f156f1c2c8cef45bfc21f37d8681069"}, + {file = "coverage-7.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:ad2453b852a1316c8a103c9c970db8fbc262f4f6b930aa6c606df9b2766eee06"}, + {file = "coverage-7.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3b15e03b8ee6a908db48eccf4e4e42397f146ab1e91c6324da44197a45cb9132"}, + {file = "coverage-7.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:89400aa1752e09f666cc48708eaa171eef0ebe3d5f74044b614729231763ae69"}, + {file = "coverage-7.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c59a3e59fb95e6d72e71dc915e6d7fa568863fad0a80b33bc7b82d6e9f844973"}, + {file = "coverage-7.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9ede881c7618f9cf93e2df0421ee127afdfd267d1b5d0c59bcea771cf160ea4a"}, + {file = "coverage-7.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3bfd2c2f0e5384276e12b14882bf2c7621f97c35320c3e7132c156ce18436a1"}, + {file = "coverage-7.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7f3bad1a9313401ff2964e411ab7d57fb700a2d5478b727e13f156c8f89774a0"}, + {file = "coverage-7.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:65d716b736f16e250435473c5ca01285d73c29f20097decdbb12571d5dfb2c94"}, + {file = "coverage-7.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a702e66483b1fe602717020a0e90506e759c84a71dbc1616dd55d29d86a9b91f"}, + {file = "coverage-7.3.3-cp39-cp39-win32.whl", hash = "sha256:7fbf3f5756e7955174a31fb579307d69ffca91ad163467ed123858ce0f3fd4aa"}, + {file = "coverage-7.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:cad9afc1644b979211989ec3ff7d82110b2ed52995c2f7263e7841c846a75348"}, + {file = "coverage-7.3.3-pp38.pp39.pp310-none-any.whl", hash = "sha256:d299d379b676812e142fb57662a8d0d810b859421412b4d7af996154c00c31bb"}, + {file = "coverage-7.3.3.tar.gz", hash = "sha256:df04c64e58df96b4427db8d0559e95e2df3138c9916c96f9f6a4dd220db2fdb7"}, ] [package.dependencies] @@ -1760,72 +1760,88 @@ tornado = ">=5.0.0,<7.0.0" [[package]] name = "frozenlist" -version = "1.4.0" +version = "1.4.1" description = "A list-like structure which implements collections.abc.MutableSequence" optional = false python-versions = ">=3.8" files = [ - {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab"}, - {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559"}, - {file = "frozenlist-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62"}, - {file = "frozenlist-1.4.0-cp310-cp310-win32.whl", hash = "sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0"}, - {file = "frozenlist-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb"}, - {file = "frozenlist-1.4.0-cp311-cp311-win32.whl", hash = "sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431"}, - {file = "frozenlist-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8"}, - {file = "frozenlist-1.4.0-cp38-cp38-win32.whl", hash = "sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc"}, - {file = "frozenlist-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3"}, - {file = "frozenlist-1.4.0-cp39-cp39-win32.whl", hash = "sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f"}, - {file = "frozenlist-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167"}, - {file = "frozenlist-1.4.0.tar.gz", hash = "sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, + {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, + {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, + {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, + {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, + {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, + {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, + {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, + {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, + {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, + {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, + {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, + {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, ] [[package]] @@ -3424,6 +3440,17 @@ files = [ [package.dependencies] jsonpointer = ">=1.9" +[[package]] +name = "jsonpath-python" +version = "1.0.6" +description = "A more powerful JSONPath implementation in modern python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "jsonpath-python-1.0.6.tar.gz", hash = "sha256:dd5be4a72d8a2995c3f583cf82bf3cd1a9544cfdabf2d22595b67aff07349666"}, + {file = "jsonpath_python-1.0.6-py3-none-any.whl", hash = "sha256:1e3b78df579f5efc23565293612decee04214609208a2335884b3ee3f786b575"}, +] + [[package]] name = "jsonpointer" version = "2.4" @@ -3495,13 +3522,13 @@ test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pyt [[package]] name = "jupyter-core" -version = "5.5.0" +version = "5.5.1" description = "Jupyter core package. A base package on which Jupyter projects rely." optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_core-5.5.0-py3-none-any.whl", hash = "sha256:e11e02cd8ae0a9de5c6c44abf5727df9f2581055afe00b22183f621ba3585805"}, - {file = "jupyter_core-5.5.0.tar.gz", hash = "sha256:880b86053bf298a8724994f95e99b99130659022a4f7f45f563084b6223861d3"}, + {file = "jupyter_core-5.5.1-py3-none-any.whl", hash = "sha256:220dfb00c45f0d780ce132bb7976b58263f81a3ada6e90a9b6823785a424f739"}, + {file = "jupyter_core-5.5.1.tar.gz", hash = "sha256:1553311a97ccd12936037f36b9ab4d6ae8ceea6ad2d5c90d94a909e752178e40"}, ] [package.dependencies] @@ -3548,13 +3575,13 @@ zookeeper = ["kazoo (>=2.8.0)"] [[package]] name = "langchain" -version = "0.0.350" +version = "0.0.351" description = "Building applications with LLMs through composability" optional = false python-versions = ">=3.8.1,<4.0" files = [ - {file = "langchain-0.0.350-py3-none-any.whl", hash = "sha256:11b605f325a4271a7815baaec05bc7622e3ad1f10f26b05c752cafa27663ed38"}, - {file = "langchain-0.0.350.tar.gz", hash = "sha256:f0e68a92d200bb722586688ab7b411b2430bd98ad265ca03b264e7e7acbb6c01"}, + {file = "langchain-0.0.351-py3-none-any.whl", hash = "sha256:90cdaee27db2b2aeeb7b0709a79cbfe3e858fc9536b6bc3ea262135a6affc70f"}, + {file = "langchain-0.0.351.tar.gz", hash = "sha256:6bf2a8665a7a3ca2bbd4eea9889ecfd3d39ab23a505549a03860272474399b38"}, ] [package.dependencies] @@ -3564,7 +3591,7 @@ dataclasses-json = ">=0.5.7,<0.7" jsonpatch = ">=1.33,<2.0" langchain-community = ">=0.0.2,<0.1" langchain-core = ">=0.1,<0.2" -langsmith = ">=0.0.63,<0.1.0" +langsmith = ">=0.0.70,<0.1.0" numpy = ">=1,<2" pydantic = ">=1,<3" PyYAML = ">=5.3" @@ -3588,13 +3615,13 @@ text-helpers = ["chardet (>=5.1.0,<6.0.0)"] [[package]] name = "langchain-community" -version = "0.0.3" +version = "0.0.4" description = "Community contributed LangChain integrations." optional = false python-versions = ">=3.8.1,<4.0" files = [ - {file = "langchain_community-0.0.3-py3-none-any.whl", hash = "sha256:12930ce0bcc39e86804f15e5a31029f836e694d3169b8b10972702760498cf6b"}, - {file = "langchain_community-0.0.3.tar.gz", hash = "sha256:f5df5367504f3ca9c2faed390e2c55a338d236d823c61db4d1b237fbe239b04a"}, + {file = "langchain_community-0.0.4-py3-none-any.whl", hash = "sha256:c021357e8d7570e3a5a03eaae9132b818d4376e39f3e865909464c6a9c4e6119"}, + {file = "langchain_community-0.0.4.tar.gz", hash = "sha256:7a5f8fff6272d6472004c86cb0b6202129a15d42bf94fb7da0c2477c5967212c"}, ] [package.dependencies] @@ -3614,13 +3641,13 @@ extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15. [[package]] name = "langchain-core" -version = "0.1.0" +version = "0.1.1" description = "Building applications with LLMs through composability" optional = false python-versions = ">=3.8.1,<4.0" files = [ - {file = "langchain_core-0.1.0-py3-none-any.whl", hash = "sha256:6b155a175e1f1555860b22333c14161c652b0013e229e7b8a083639c821312a8"}, - {file = "langchain_core-0.1.0.tar.gz", hash = "sha256:4c70aa62905896b65c47a966f87584f72026cbe402655749281df81c794e0d6e"}, + {file = "langchain_core-0.1.1-py3-none-any.whl", hash = "sha256:35b49abde43f37aa2fb2f9a2e11331218036dc34395943d12c2d305d5512a8be"}, + {file = "langchain_core-0.1.1.tar.gz", hash = "sha256:1253acc691548e8ae97c864cc94370d94fbc9e3244751aeaad0b1e9d5150eca4"}, ] [package.dependencies] @@ -3711,13 +3738,13 @@ langchain = ["langchain (>=0.0.309)"] [[package]] name = "langsmith" -version = "0.0.70" +version = "0.0.72" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false python-versions = ">=3.8.1,<4.0" files = [ - {file = "langsmith-0.0.70-py3-none-any.whl", hash = "sha256:a0d4cac3af94fe44c2ef3814c32b6740f92aebe267e395d62e62040bc5bad343"}, - {file = "langsmith-0.0.70.tar.gz", hash = "sha256:3a546c45e67f6600d6669ef63f1f58b772e505703126338ad4f22fe0e2bbf677"}, + {file = "langsmith-0.0.72-py3-none-any.whl", hash = "sha256:2cddd49cd7d1477409c8785746acf42dbd6709a7d36e751247a3cab5e3eee20e"}, + {file = "langsmith-0.0.72.tar.gz", hash = "sha256:505f517e2e67836a4e831917d8223a18cc59d51bdae1e4295fc6dff2266bab5d"}, ] [package.dependencies] @@ -3743,12 +3770,12 @@ regex = ["regex"] [[package]] name = "llama-cpp-python" -version = "0.2.23" +version = "0.2.24" description = "Python bindings for the llama.cpp library" optional = true python-versions = ">=3.8" files = [ - {file = "llama_cpp_python-0.2.23.tar.gz", hash = "sha256:364b61a13970932ea189b45a1c5dea89797b90e5da00f1fe6e72c47fbc512898"}, + {file = "llama_cpp_python-0.2.24.tar.gz", hash = "sha256:85f8fd110b4b90599d5ff427bd4a1a4db6e70817c60ba8aa609fa5c645761ec1"}, ] [package.dependencies] @@ -3760,7 +3787,7 @@ typing-extensions = ">=4.5.0" all = ["llama_cpp_python[dev,server,test]"] dev = ["black (>=23.3.0)", "httpx (>=0.24.1)", "mkdocs (>=1.4.3)", "mkdocs-material (>=9.1.18)", "mkdocstrings[python] (>=0.22.0)", "pytest (>=7.4.0)", "twine (>=4.0.2)"] server = ["fastapi (>=0.100.0)", "pydantic-settings (>=2.0.1)", "sse-starlette (>=1.6.1)", "starlette-context (>=0.3.6,<0.4)", "uvicorn (>=0.22.0)"] -test = ["httpx (>=0.24.1)", "pytest (>=7.4.0)"] +test = ["httpx (>=0.24.1)", "pytest (>=7.4.0)", "scipy (>=1.10)"] [[package]] name = "locust" @@ -4711,13 +4738,13 @@ sympy = "*" [[package]] name = "openai" -version = "1.3.9" +version = "1.5.0" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.3.9-py3-none-any.whl", hash = "sha256:d30faeffe5995a2cf6b790c0260a5b59647e81c3a1f3b62f51b5e0a0e52681c9"}, - {file = "openai-1.3.9.tar.gz", hash = "sha256:6f638d96bc89b4394be1d7b37d312f70a055df1a471c92d4c4b2ae3a70c98cb3"}, + {file = "openai-1.5.0-py3-none-any.whl", hash = "sha256:42d8c84b0714c990e18afe81d37f8a64423e8196bf7157b8ea665b8d8f393253"}, + {file = "openai-1.5.0.tar.gz", hash = "sha256:4cd91e97988ccd6c44f815107def9495cbc718aeb8b28be33a87b6fa2c432508"}, ] [package.dependencies] @@ -5150,13 +5177,13 @@ xml = ["lxml (>=4.6.3)"] [[package]] name = "pandas-stubs" -version = "2.1.1.230928" +version = "2.1.4.231218" description = "Type annotations for pandas" optional = false python-versions = ">=3.9" files = [ - {file = "pandas_stubs-2.1.1.230928-py3-none-any.whl", hash = "sha256:992d97159e054ca3175ebe8321ac5616cf6502dd8218b03bb0eaf3c4f6939037"}, - {file = "pandas_stubs-2.1.1.230928.tar.gz", hash = "sha256:ce1691c71c5d67b8f332da87763f7f54650f46895d99964d588c3a5d79e2cacc"}, + {file = "pandas_stubs-2.1.4.231218-py3-none-any.whl", hash = "sha256:9c9a8db37b83ff4ff9f672644099abc624ed407aa46d9dcb5f305de9925b3d29"}, + {file = "pandas_stubs-2.1.4.231218.tar.gz", hash = "sha256:f0dd07b3bb2935ddcff9c7b7ba9076cf3529b968a0dee96fab53f5f8747974f7"}, ] [package.dependencies] @@ -5507,27 +5534,27 @@ files = [ [[package]] name = "psutil" -version = "5.9.6" +version = "5.9.7" description = "Cross-platform lib for process and system monitoring in Python." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "psutil-5.9.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:fb8a697f11b0f5994550555fcfe3e69799e5b060c8ecf9e2f75c69302cc35c0d"}, - {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:91ecd2d9c00db9817a4b4192107cf6954addb5d9d67a969a4f436dbc9200f88c"}, - {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:10e8c17b4f898d64b121149afb136c53ea8b68c7531155147867b7b1ac9e7e28"}, - {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:18cd22c5db486f33998f37e2bb054cc62fd06646995285e02a51b1e08da97017"}, - {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:ca2780f5e038379e520281e4c032dddd086906ddff9ef0d1b9dcf00710e5071c"}, - {file = "psutil-5.9.6-cp27-none-win32.whl", hash = "sha256:70cb3beb98bc3fd5ac9ac617a327af7e7f826373ee64c80efd4eb2856e5051e9"}, - {file = "psutil-5.9.6-cp27-none-win_amd64.whl", hash = "sha256:51dc3d54607c73148f63732c727856f5febec1c7c336f8f41fcbd6315cce76ac"}, - {file = "psutil-5.9.6-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c69596f9fc2f8acd574a12d5f8b7b1ba3765a641ea5d60fb4736bf3c08a8214a"}, - {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92e0cc43c524834af53e9d3369245e6cc3b130e78e26100d1f63cdb0abeb3d3c"}, - {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:748c9dd2583ed86347ed65d0035f45fa8c851e8d90354c122ab72319b5f366f4"}, - {file = "psutil-5.9.6-cp36-cp36m-win32.whl", hash = "sha256:3ebf2158c16cc69db777e3c7decb3c0f43a7af94a60d72e87b2823aebac3d602"}, - {file = "psutil-5.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:ff18b8d1a784b810df0b0fff3bcb50ab941c3b8e2c8de5726f9c71c601c611aa"}, - {file = "psutil-5.9.6-cp37-abi3-win32.whl", hash = "sha256:a6f01f03bf1843280f4ad16f4bde26b817847b4c1a0db59bf6419807bc5ce05c"}, - {file = "psutil-5.9.6-cp37-abi3-win_amd64.whl", hash = "sha256:6e5fb8dc711a514da83098bc5234264e551ad980cec5f85dabf4d38ed6f15e9a"}, - {file = "psutil-5.9.6-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:daecbcbd29b289aac14ece28eca6a3e60aa361754cf6da3dfb20d4d32b6c7f57"}, - {file = "psutil-5.9.6.tar.gz", hash = "sha256:e4b92ddcd7dd4cdd3f900180ea1e104932c7bce234fb88976e2a3b296441225a"}, + {file = "psutil-5.9.7-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:0bd41bf2d1463dfa535942b2a8f0e958acf6607ac0be52265ab31f7923bcd5e6"}, + {file = "psutil-5.9.7-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:5794944462509e49d4d458f4dbfb92c47539e7d8d15c796f141f474010084056"}, + {file = "psutil-5.9.7-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:fe361f743cb3389b8efda21980d93eb55c1f1e3898269bc9a2a1d0bb7b1f6508"}, + {file = "psutil-5.9.7-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:e469990e28f1ad738f65a42dcfc17adaed9d0f325d55047593cb9033a0ab63df"}, + {file = "psutil-5.9.7-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:3c4747a3e2ead1589e647e64aad601981f01b68f9398ddf94d01e3dc0d1e57c7"}, + {file = "psutil-5.9.7-cp27-none-win32.whl", hash = "sha256:1d4bc4a0148fdd7fd8f38e0498639ae128e64538faa507df25a20f8f7fb2341c"}, + {file = "psutil-5.9.7-cp27-none-win_amd64.whl", hash = "sha256:4c03362e280d06bbbfcd52f29acd79c733e0af33d707c54255d21029b8b32ba6"}, + {file = "psutil-5.9.7-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ea36cc62e69a13ec52b2f625c27527f6e4479bca2b340b7a452af55b34fcbe2e"}, + {file = "psutil-5.9.7-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1132704b876e58d277168cd729d64750633d5ff0183acf5b3c986b8466cd0284"}, + {file = "psutil-5.9.7-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8b7f07948f1304497ce4f4684881250cd859b16d06a1dc4d7941eeb6233bfe"}, + {file = "psutil-5.9.7-cp36-cp36m-win32.whl", hash = "sha256:b27f8fdb190c8c03914f908a4555159327d7481dac2f01008d483137ef3311a9"}, + {file = "psutil-5.9.7-cp36-cp36m-win_amd64.whl", hash = "sha256:44969859757f4d8f2a9bd5b76eba8c3099a2c8cf3992ff62144061e39ba8568e"}, + {file = "psutil-5.9.7-cp37-abi3-win32.whl", hash = "sha256:c727ca5a9b2dd5193b8644b9f0c883d54f1248310023b5ad3e92036c5e2ada68"}, + {file = "psutil-5.9.7-cp37-abi3-win_amd64.whl", hash = "sha256:f37f87e4d73b79e6c5e749440c3113b81d1ee7d26f21c19c47371ddea834f414"}, + {file = "psutil-5.9.7-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:032f4f2c909818c86cea4fe2cc407f1c0f0cde8e6c6d702b28b8ce0c0d143340"}, + {file = "psutil-5.9.7.tar.gz", hash = "sha256:3f02134e82cfb5d089fddf20bb2e03fd5cd52395321d1c8458a9e58500ff417c"}, ] [package.extras] @@ -5535,13 +5562,13 @@ test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] [[package]] name = "psycopg" -version = "3.1.14" +version = "3.1.16" description = "PostgreSQL database adapter for Python" optional = false python-versions = ">=3.7" files = [ - {file = "psycopg-3.1.14-py3-none-any.whl", hash = "sha256:f5bce37d357578b230ede15fb461e2c601122986f6dd590e94283aaca8958b14"}, - {file = "psycopg-3.1.14.tar.gz", hash = "sha256:7a63249f52e9c312d2d3978df5f170d21a0defd3a0c950d7859d226b7cfbfad5"}, + {file = "psycopg-3.1.16-py3-none-any.whl", hash = "sha256:0bfe9741f4fb1c8115cadd8fe832fa91ac277e81e0652ff7fa1400f0ef0f59ba"}, + {file = "psycopg-3.1.16.tar.gz", hash = "sha256:a34d922fd7df3134595e71c3428ba6f1bd5f4968db74857fe95de12db2d6b763"}, ] [package.dependencies] @@ -5549,85 +5576,85 @@ typing-extensions = ">=4.1" tzdata = {version = "*", markers = "sys_platform == \"win32\""} [package.extras] -binary = ["psycopg-binary (==3.1.14)"] -c = ["psycopg-c (==3.1.14)"] -dev = ["black (>=23.1.0)", "dnspython (>=2.1)", "flake8 (>=4.0)", "mypy (>=1.4.1)", "types-setuptools (>=57.4)", "wheel (>=0.37)"] +binary = ["psycopg-binary (==3.1.16)"] +c = ["psycopg-c (==3.1.16)"] +dev = ["black (>=23.1.0)", "codespell (>=2.2)", "dnspython (>=2.1)", "flake8 (>=4.0)", "mypy (>=1.4.1)", "types-setuptools (>=57.4)", "wheel (>=0.37)"] docs = ["Sphinx (>=5.0)", "furo (==2022.6.21)", "sphinx-autobuild (>=2021.3.14)", "sphinx-autodoc-typehints (>=1.12)"] pool = ["psycopg-pool"] test = ["anyio (>=3.6.2,<4.0)", "mypy (>=1.4.1)", "pproxy (>=2.7)", "pytest (>=6.2.5)", "pytest-cov (>=3.0)", "pytest-randomly (>=3.5)"] [[package]] name = "psycopg-binary" -version = "3.1.14" +version = "3.1.16" description = "PostgreSQL database adapter for Python -- C optimisation distribution" optional = false python-versions = ">=3.7" files = [ - {file = "psycopg_binary-3.1.14-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7cf6ff7f025643e42d27d903e8be5d171db7db4f486076a6942cbf8daa4f8b3e"}, - {file = "psycopg_binary-3.1.14-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:57841e59f181e546c28d73036847f42eeab3e917a1cceb4a27e54b4a1d75683e"}, - {file = "psycopg_binary-3.1.14-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67cc4b0b3585bbce8782c7ad4a498549f8150fa77872c3cffdf476f04bbcb714"}, - {file = "psycopg_binary-3.1.14-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fdb9c2e796d029eaa53881ed3de065628639fa0550fa462f145e54e4f90a429e"}, - {file = "psycopg_binary-3.1.14-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7da7f174a34fd0441caf2a44a71d20800f19a9565753e3531197914a7441b42b"}, - {file = "psycopg_binary-3.1.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b95c1d1be1a243e28583a70f257e970941c5b2c7f0d21e24dfc92145ad82407"}, - {file = "psycopg_binary-3.1.14-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e31bb31fa6abe74041715bc15e23e4d784887b388952503f6fa54d38bbcc3258"}, - {file = "psycopg_binary-3.1.14-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:eb1e5df4adc6514a78643ac7119de7725f089338c8907a2b40f919abe5595ce7"}, - {file = "psycopg_binary-3.1.14-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:15b3b04d8ec665c660268169364f4befab490231224486eb4c761d5365a01108"}, - {file = "psycopg_binary-3.1.14-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:96c123bebc7a6d83e90f480ca44696ac804d74e4b7920b5d6ca7479ea179732e"}, - {file = "psycopg_binary-3.1.14-cp310-cp310-win_amd64.whl", hash = "sha256:2ccfa9d7e5272a6cc25038b6e2bc67a9a118765fba4cebcc8318ac0336f2ac86"}, - {file = "psycopg_binary-3.1.14-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:eb093578a56e3074c9573d8c1bea408ae857e3e8330ed831c4d7fc5ece6f9cad"}, - {file = "psycopg_binary-3.1.14-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d431c41321168035dfd7217253ca02f985769636500ae951fa72cb9f6473d393"}, - {file = "psycopg_binary-3.1.14-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae1d4de5646460ea7f26fe19feffc9853648a05ee419d2f861029a1c9c53817d"}, - {file = "psycopg_binary-3.1.14-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dad6eef513754219a696f8bd51c7c5f25f6b988ac5b6edc87e698c737158f4d3"}, - {file = "psycopg_binary-3.1.14-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e0a41b2a2e78a785e7b415e495ae7f35817fac7377d34192b56ce7dd914c1f"}, - {file = "psycopg_binary-3.1.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33a76e665826ebb4298fb931985f466e3cd553bb7cf30cfef9214e2c9156f026"}, - {file = "psycopg_binary-3.1.14-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ab1f40717be4bb12e43c6789ba05efdffd342c8c7aa9db346110d814779a8088"}, - {file = "psycopg_binary-3.1.14-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:664cff756a8a636f9c6810d41dc5da46879142865ebcceae2edcd045dcb30b6f"}, - {file = "psycopg_binary-3.1.14-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:6babfd78e6e0a91eff45b82b2517e82bfe078de084f354853b1017cc04e37ad9"}, - {file = "psycopg_binary-3.1.14-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d88c15597732b6021e29cf5bdaa7245af51a986f2834ca2c77aca4c05f224f59"}, - {file = "psycopg_binary-3.1.14-cp311-cp311-win_amd64.whl", hash = "sha256:32f09adce74208aea1b6500ab07bda68bed45df902f0125a3b292137a2133a2a"}, - {file = "psycopg_binary-3.1.14-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d5ca34fad0558244d5fbfbc19a691b423a471e9e601d4ddabd759aa05ded0fa1"}, - {file = "psycopg_binary-3.1.14-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a19d4776ccb4c22192ffa5878c82389a0d2ba8a861933b95f91b73d426b2f54f"}, - {file = "psycopg_binary-3.1.14-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:749760b5d963390859397b745c797b62ee0757c72a961ee77f918fd4a1ae6646"}, - {file = "psycopg_binary-3.1.14-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:56e668a6a61f33d48b1696207393e5ec33a371a3692cc434c445b909f97a5e34"}, - {file = "psycopg_binary-3.1.14-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:abeb8ed0fe3ff635f10914edb8c8febe99046a99143d21e004352aebc4ab1241"}, - {file = "psycopg_binary-3.1.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f623d0952bc0e118c4de529a20fba98855654ff3a1f30d9bce77898af0518e70"}, - {file = "psycopg_binary-3.1.14-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:57a4055b63a824589f9e9a8edc5dcf498ef49b888bc945d7a5e865ffe5a42ff8"}, - {file = "psycopg_binary-3.1.14-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:068d29ebcba782b815a5a3842c740af8d4c314e2caf82636a5e0e80120606655"}, - {file = "psycopg_binary-3.1.14-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:b1528ea7ef8f5e109d9eda470e7a7917b467938c1371245eddad0caff8edb5a7"}, - {file = "psycopg_binary-3.1.14-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fd078bb91b5957913cebefbaa8b9e296e31c4f3eaab16b875e2f75a84640ebc6"}, - {file = "psycopg_binary-3.1.14-cp312-cp312-win_amd64.whl", hash = "sha256:313be7a062e96dbc153ca7ecd6bce86fc67ac5fd9f5722cfbc5fba5431f4eb36"}, - {file = "psycopg_binary-3.1.14-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:099123c231a38dc071c9d41b983300196e05ed724b7642bc4bc9ee64ee46c5ff"}, - {file = "psycopg_binary-3.1.14-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:501a73961115c962d22ece4a0e1d8d8711cea6d6a8a2284521876973275fb01a"}, - {file = "psycopg_binary-3.1.14-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c74c27acedbc463007647ca3082b1848c07ec9c03bfaea068ee0d87050fdb629"}, - {file = "psycopg_binary-3.1.14-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d8bd8d92d8418fed8c749134469676ce08b492fcaad4cfe2cde713bd33decfa7"}, - {file = "psycopg_binary-3.1.14-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39d7bccddac038d1627425b2ac9e8f054909ef8c4d0f8bfb684831dcee275ee2"}, - {file = "psycopg_binary-3.1.14-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1a394ebcf129e2344d091c04254bb289b7454e913ca921570af8f2185bf8fd86"}, - {file = "psycopg_binary-3.1.14-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a510c6bb19c81587be0ef1e72ab75228bde70d1fef1f2ca62a124b663987fbbb"}, - {file = "psycopg_binary-3.1.14-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e25448293623a0dc2fa32a1781e87d14da7cb608a1cfac27681cc640d9523a1e"}, - {file = "psycopg_binary-3.1.14-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:740f0914da1e4db4021969ff467ae2fcec7cac40ee58b3a32ffa8fe476658f8a"}, - {file = "psycopg_binary-3.1.14-cp37-cp37m-win_amd64.whl", hash = "sha256:d305d825b78a59f32bb6c1bca751d18ccc4bb9b80340c8d2d4c1924ab9d347d5"}, - {file = "psycopg_binary-3.1.14-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e67e5c4f08ce8bf59a54f957168423910bfb46feb469da13fc76d0c6dd377047"}, - {file = "psycopg_binary-3.1.14-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a171ba6aed4845da2f5c1205de498f9f51826f181ef86a2a1e1342c98d35859b"}, - {file = "psycopg_binary-3.1.14-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e612ab1ffb680ac928a641abd75d0b0fa5ea87421f0fdabd082baff55849b90e"}, - {file = "psycopg_binary-3.1.14-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c92805c868fc0fa629033f74eebef58f3d5d15e0d7981ec33a1cb4027a7cc62"}, - {file = "psycopg_binary-3.1.14-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4df14e755962b1324f70aadea2ff915dfdb6dfdf56d9cdb10aebd183d0dc83b7"}, - {file = "psycopg_binary-3.1.14-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e790397d555a438b7785e611bc3ae1f344f1f799507fd97005476e2bc816947"}, - {file = "psycopg_binary-3.1.14-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d49bbdcb49939e97d6a161b864272e5f5daf199034d996b506a1006c78611481"}, - {file = "psycopg_binary-3.1.14-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:19e34d464ceab28825f1e9e8c5b482d5da51b2c9a6e105901d384ea4e225edc1"}, - {file = "psycopg_binary-3.1.14-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:b44af0b30eb4bd733446474eb4051d93c4f2eb30928cd4c4b2180d162fa35483"}, - {file = "psycopg_binary-3.1.14-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:95f212ce9c9c7f754e7d981978de1603ddeac15bb4b2434afccbc976c84a9529"}, - {file = "psycopg_binary-3.1.14-cp38-cp38-win_amd64.whl", hash = "sha256:545ea4b72321c25afa76aa5a7eeb04e22ac7d5ead9762d5f30849fe2fdf1217a"}, - {file = "psycopg_binary-3.1.14-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a9e8cda0acfcfe127b390a877ab43ca2c248adff2ad746f26db19f3025eb4ba3"}, - {file = "psycopg_binary-3.1.14-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:502a06d4037a2c27e67f2521322ec173335108d5ee303dd58129b3a5b358ed30"}, - {file = "psycopg_binary-3.1.14-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0be20bcccca8326a9f060a6749fdf92bf6147e8b5039c7a6cd9f0f5fe7c190ec"}, - {file = "psycopg_binary-3.1.14-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:044f8eb0ae01588d2da80c12f897c7562b430e04aa841555fc478f370be34d1e"}, - {file = "psycopg_binary-3.1.14-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f67b956506958f12fa9a110f19d9ec2caf4c98708386c84b4622d7227b344f4"}, - {file = "psycopg_binary-3.1.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74ee5c67ad273cf0b4653f440afd69cff4d1a19684a52653ad6b10b270d4589b"}, - {file = "psycopg_binary-3.1.14-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b1780b065f3b85403dcf818a6397305eaa57206a4a5d195b9b3589bd818f757b"}, - {file = "psycopg_binary-3.1.14-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:32e9d8bdfcfef9ccbd916bcbb8bcfcb281613e5dec9f5dcc3e4bff3e2eb9d490"}, - {file = "psycopg_binary-3.1.14-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0f7014dd971a3c00d63244381107800d47eebf3b1fa4f95784e6e4fa4d77d3c2"}, - {file = "psycopg_binary-3.1.14-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98409e33c7a2907c5cdf172d8f83c5664cd3ed99122a9c43b8d6e915c3beb050"}, - {file = "psycopg_binary-3.1.14-cp39-cp39-win_amd64.whl", hash = "sha256:d7a52d5bfd09a89872a192ad4bbf0dd2a1de07ceaa420337c35061376606310b"}, + {file = "psycopg_binary-3.1.16-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e08e333366f8583c7bee33ca6a27f84b76e05ee4e9f9f327a48e3ff81386261d"}, + {file = "psycopg_binary-3.1.16-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a18dfcf7eb3db698eb7a38b4a0e82bf5b76a7bc0079068c5837df70b965570f8"}, + {file = "psycopg_binary-3.1.16-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db99192d9f448829322c4f59a584994ce747b8d586ec65788b4c65f7166cfe43"}, + {file = "psycopg_binary-3.1.16-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f6053fe95596e2f67ff2c9464ea23032c748695a3b79060ca01ef878b0ea0f2"}, + {file = "psycopg_binary-3.1.16-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e6092ec21c08ed4ae4ff343c93a3bbb1d39c87dee181860ce40fa3b5c46f4ae"}, + {file = "psycopg_binary-3.1.16-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f81e880d1bd935433efab1c2883a02031df84e739eadcb2c6a715e9c2f41c19"}, + {file = "psycopg_binary-3.1.16-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:430f8843e381199cdc39ce9506a2cdbc27a569c99a0d80193844c787ce7de94d"}, + {file = "psycopg_binary-3.1.16-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:92bda36f0570a5f9a3d6aeb897bad219f1f23fc4e1d0e7780935798771efb536"}, + {file = "psycopg_binary-3.1.16-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b256d500ec0121ad7875bc3539c43c82dc004535d55256a13c49df2d43f07ad8"}, + {file = "psycopg_binary-3.1.16-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:699737cecf675e1eb70b892b1995456db4016eff7189a3ad9325dca5b6715cc3"}, + {file = "psycopg_binary-3.1.16-cp310-cp310-win_amd64.whl", hash = "sha256:5e0885bcd7d9a0c0043be83d6a214069356c640d42496de798d901d0a16a34e7"}, + {file = "psycopg_binary-3.1.16-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4ee8be32eb8b813ef37c5f5968fe03fdddc9a6f0129190f97f6491c798a1ef57"}, + {file = "psycopg_binary-3.1.16-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8f8fb9677fb7873daf9797207e72e9275f61e769a308c4ea8f55dfd3153ebae7"}, + {file = "psycopg_binary-3.1.16-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a611d7256493ee5bb73a070c9c60206af415be6aee01243c186fc03f1eb1a48"}, + {file = "psycopg_binary-3.1.16-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d267cc92f0f0a9ea6c8ef058e95c85e58133d06c06f4ed48d63fc256aef166ab"}, + {file = "psycopg_binary-3.1.16-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e996b38ffeffbaa06d236bbeab5168d33eea95941cf74de1daa0b008333861b1"}, + {file = "psycopg_binary-3.1.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8429017cd7a3ef4699bee4ff8125a5e30b26882b817a178608d73e69fb727ab9"}, + {file = "psycopg_binary-3.1.16-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a7d3b2ea267e7676b3693799fadf941c672f5727fae4947efa1f0cc6e25b672c"}, + {file = "psycopg_binary-3.1.16-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d8290cfd475fadf935da0900dc91b845fe92f792e6d53039c0df82f9049a84ad"}, + {file = "psycopg_binary-3.1.16-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:72539a0c6b9a2a9be2acca993df17f4baaa0ed00f1d76b65733725286e3e3304"}, + {file = "psycopg_binary-3.1.16-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1078370a93eaef1dc5aed540055d50cbe37e9154342f3a3d73fd768a6199344d"}, + {file = "psycopg_binary-3.1.16-cp311-cp311-win_amd64.whl", hash = "sha256:adca24d273fe81ecab2312309db547b345155ec50d15676e2df82b8c5409eb06"}, + {file = "psycopg_binary-3.1.16-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e1c416a7c2a699c3e5ba031357682ebca92bd58f399e553173ab5d67cc71cbc5"}, + {file = "psycopg_binary-3.1.16-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e951a8cc7cf919fdc817a28d57160e7286011a4a45dcad3be21f3e4feba8be1a"}, + {file = "psycopg_binary-3.1.16-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eaa02fe8aa9ef8c8743919fdbc92c04b0ee8c43f3d65e53f24d355776c52fb3"}, + {file = "psycopg_binary-3.1.16-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e23375c14c22ce8fd26d057ac4ab827de79aafced173c68a4c0b03520ea02c70"}, + {file = "psycopg_binary-3.1.16-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84472e5c83e805d4c491f331061cbae3ea4e62f80a480fc4b32200be72262ffd"}, + {file = "psycopg_binary-3.1.16-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b0f824565d1dc325c74c076efd5ba842b86219f8bc1b8048c8816621a8b268c"}, + {file = "psycopg_binary-3.1.16-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6b856d44531475488e773ac78d2a7a91c0909a1e8bdbd20d3ebdbdce1868c9a0"}, + {file = "psycopg_binary-3.1.16-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:198c4f16f806f7d2ad0c4a5b774652e17861b55249efb4e344049b1fcf9a24af"}, + {file = "psycopg_binary-3.1.16-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:b23d4b86acba2d745763ee0801821af1c42b127d8df75b903b7e7ca7c5f6400c"}, + {file = "psycopg_binary-3.1.16-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2cfd857f1085c59da592090f2fa0751da30b67dcafea2ac52c4b404678406aae"}, + {file = "psycopg_binary-3.1.16-cp312-cp312-win_amd64.whl", hash = "sha256:46c9cca48d459d8df71fda4eef7d94a189b8333f4bc3cf1d170c1796fcbbc8cd"}, + {file = "psycopg_binary-3.1.16-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f3136d8f92708c04694ca0cae6a2d6c8170e7174b9ee594218cb229b407e8f48"}, + {file = "psycopg_binary-3.1.16-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1063fe43bb06790a4cfed9f1cacebb165939ca672b6fddcb03627d673ae00bd9"}, + {file = "psycopg_binary-3.1.16-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58289209495a92022e58757add4badb495815a4477f5e9840d481eac2ea422b2"}, + {file = "psycopg_binary-3.1.16-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18c58f99beec18d38094edcb1ae7e6a1e58fb1a53ed08b0f18df714aa4b07cc"}, + {file = "psycopg_binary-3.1.16-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e122c904d4c4e044a3797a62624316cf7359271564f9ebe8ca342ed4a8cef3bd"}, + {file = "psycopg_binary-3.1.16-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:82ffad0edfa3dd77d6aa40c267f61275a6a4061f735cefe97cfd83cfa78e112a"}, + {file = "psycopg_binary-3.1.16-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:82099b6b4b0b12b63c4169d69b48bdbce97e674b86fa51b015e9949fc0ce5c82"}, + {file = "psycopg_binary-3.1.16-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3815c72c590ffe3ad1dc3b7021d082b42215bbd91d2c7211d4a101eec1d0b83e"}, + {file = "psycopg_binary-3.1.16-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2f308bfd39d6dcf3f46165f98d816bce5ac78aaf782eceb3cf43aa0a4fe62f8"}, + {file = "psycopg_binary-3.1.16-cp37-cp37m-win_amd64.whl", hash = "sha256:1e197c3e8d88e984c1e0fcc9a0218947e5a14855939a00b158b428bc449b49e3"}, + {file = "psycopg_binary-3.1.16-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2b22e2dad291a79d7a31b304866fd125038ef7fe378aba9698de0e1804a863c9"}, + {file = "psycopg_binary-3.1.16-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d9e1768c46c595a8177cb709c99626c3cefbd12c2e46eb54323efd8ac4a7fc2d"}, + {file = "psycopg_binary-3.1.16-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8eaabc8dd2d364e1b43d3a25188356191a45abb687b77016544f6847b3fcd73a"}, + {file = "psycopg_binary-3.1.16-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cda744c43b09342b1a8b5aace13d3284c1f5ddbfcefa2d385f703337503a060"}, + {file = "psycopg_binary-3.1.16-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cdaf56adc9cc56df7a05e8f097a776939ba49d5e6afc907ba7b404d8bd21c89"}, + {file = "psycopg_binary-3.1.16-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7232116fc5d4e0274114f152bdb9df089895d4c70f7c03268cab0a4c48a28d04"}, + {file = "psycopg_binary-3.1.16-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6f03239d7c18666f5d6ca82ea972235de4d4d3604287098af6cdc256b76a0ca5"}, + {file = "psycopg_binary-3.1.16-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:edd1b630652bdfff84662b46d11878fbab8ab2966003c1876fcde56650e99e3f"}, + {file = "psycopg_binary-3.1.16-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:481e9dafca1ed9532552e097105e6664ee7f14686270ed0ee0b1d6c78c2cdb11"}, + {file = "psycopg_binary-3.1.16-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d43aa3aa55b5fa964ffa78cf6abdbd51ff33a759f290e9159a9f974ffa3178fa"}, + {file = "psycopg_binary-3.1.16-cp38-cp38-win_amd64.whl", hash = "sha256:51e66b282d8689bc33d81bde3a1e14d0c88a39200c2d9436b028b394d24f1f99"}, + {file = "psycopg_binary-3.1.16-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bfae154f3c88e67f3ed592765ad56531b6076acfe80796e28cccc05727c1cf5b"}, + {file = "psycopg_binary-3.1.16-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f9f4bc3d366951359a68833c8031cc83faf5084b3bc80dd2d24f0add593d4418"}, + {file = "psycopg_binary-3.1.16-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a37d682d7ff57cc2573b1011740ef1566749fc94ae6ac1456405510592735c0a"}, + {file = "psycopg_binary-3.1.16-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0be876e3a8ee359f6a985b662c6b02a094a50b37adf1bd756a655004bddf167a"}, + {file = "psycopg_binary-3.1.16-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f79192b0edd60ef24acb0af5b83319cbb65d4187576757b690646b290de8307"}, + {file = "psycopg_binary-3.1.16-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fcc5996b1db4e7fb948ea47b610456df317625d92474c779a20f92ca8cbcec92"}, + {file = "psycopg_binary-3.1.16-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3f2ceb04f8137462f9312a324bea5402de0a4f0503cd5442f4264911e4b6265b"}, + {file = "psycopg_binary-3.1.16-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:47517d2da63bb10c80c2cf35c80a936db79636534849524fd57940b5f0bbd7bd"}, + {file = "psycopg_binary-3.1.16-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:2a6bd83d0b934aa03897e93acb6897972ccc3827ae61c903589bc92ed423f75d"}, + {file = "psycopg_binary-3.1.16-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:08fb94928e785571ac90d3ab9e09f2721e0d895c2504ecfb8de91c5ea807b267"}, + {file = "psycopg_binary-3.1.16-cp39-cp39-win_amd64.whl", hash = "sha256:cf13807b61315130a59ea8d0950bda2ac875bae9fadc0b1a9aca9b4ef6d62c7b"}, ] [[package]] @@ -5793,47 +5820,47 @@ files = [ [[package]] name = "pyarrow" -version = "14.0.1" +version = "14.0.2" description = "Python library for Apache Arrow" optional = false python-versions = ">=3.8" files = [ - {file = "pyarrow-14.0.1-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:96d64e5ba7dceb519a955e5eeb5c9adcfd63f73a56aea4722e2cc81364fc567a"}, - {file = "pyarrow-14.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a8ae88c0038d1bc362a682320112ee6774f006134cd5afc291591ee4bc06505"}, - {file = "pyarrow-14.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f6f053cb66dc24091f5511e5920e45c83107f954a21032feadc7b9e3a8e7851"}, - {file = "pyarrow-14.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:906b0dc25f2be12e95975722f1e60e162437023f490dbd80d0deb7375baf3171"}, - {file = "pyarrow-14.0.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:78d4a77a46a7de9388b653af1c4ce539350726cd9af62e0831e4f2bd0c95a2f4"}, - {file = "pyarrow-14.0.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:06ca79080ef89d6529bb8e5074d4b4f6086143b2520494fcb7cf8a99079cde93"}, - {file = "pyarrow-14.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:32542164d905002c42dff896efdac79b3bdd7291b1b74aa292fac8450d0e4dcd"}, - {file = "pyarrow-14.0.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:c7331b4ed3401b7ee56f22c980608cf273f0380f77d0f73dd3c185f78f5a6220"}, - {file = "pyarrow-14.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:922e8b49b88da8633d6cac0e1b5a690311b6758d6f5d7c2be71acb0f1e14cd61"}, - {file = "pyarrow-14.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58c889851ca33f992ea916b48b8540735055201b177cb0dcf0596a495a667b00"}, - {file = "pyarrow-14.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30d8494870d9916bb53b2a4384948491444741cb9a38253c590e21f836b01222"}, - {file = "pyarrow-14.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:be28e1a07f20391bb0b15ea03dcac3aade29fc773c5eb4bee2838e9b2cdde0cb"}, - {file = "pyarrow-14.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:981670b4ce0110d8dcb3246410a4aabf5714db5d8ea63b15686bce1c914b1f83"}, - {file = "pyarrow-14.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:4756a2b373a28f6166c42711240643fb8bd6322467e9aacabd26b488fa41ec23"}, - {file = "pyarrow-14.0.1-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:cf87e2cec65dd5cf1aa4aba918d523ef56ef95597b545bbaad01e6433851aa10"}, - {file = "pyarrow-14.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:470ae0194fbfdfbf4a6b65b4f9e0f6e1fa0ea5b90c1ee6b65b38aecee53508c8"}, - {file = "pyarrow-14.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6263cffd0c3721c1e348062997babdf0151301f7353010c9c9a8ed47448f82ab"}, - {file = "pyarrow-14.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8089d7e77d1455d529dbd7cff08898bbb2666ee48bc4085203af1d826a33cc"}, - {file = "pyarrow-14.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:fada8396bc739d958d0b81d291cfd201126ed5e7913cb73de6bc606befc30226"}, - {file = "pyarrow-14.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:2a145dab9ed7849fc1101bf03bcdc69913547f10513fdf70fc3ab6c0a50c7eee"}, - {file = "pyarrow-14.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:05fe7994745b634c5fb16ce5717e39a1ac1fac3e2b0795232841660aa76647cd"}, - {file = "pyarrow-14.0.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:a8eeef015ae69d104c4c3117a6011e7e3ecd1abec79dc87fd2fac6e442f666ee"}, - {file = "pyarrow-14.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3c76807540989fe8fcd02285dd15e4f2a3da0b09d27781abec3adc265ddbeba1"}, - {file = "pyarrow-14.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:450e4605e3c20e558485f9161a79280a61c55efe585d51513c014de9ae8d393f"}, - {file = "pyarrow-14.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:323cbe60210173ffd7db78bfd50b80bdd792c4c9daca8843ef3cd70b186649db"}, - {file = "pyarrow-14.0.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:0140c7e2b740e08c5a459439d87acd26b747fc408bde0a8806096ee0baaa0c15"}, - {file = "pyarrow-14.0.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:e592e482edd9f1ab32f18cd6a716c45b2c0f2403dc2af782f4e9674952e6dd27"}, - {file = "pyarrow-14.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:d264ad13605b61959f2ae7c1d25b1a5b8505b112715c961418c8396433f213ad"}, - {file = "pyarrow-14.0.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:01e44de9749cddc486169cb632f3c99962318e9dacac7778315a110f4bf8a450"}, - {file = "pyarrow-14.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d0351fecf0e26e152542bc164c22ea2a8e8c682726fce160ce4d459ea802d69c"}, - {file = "pyarrow-14.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33c1f6110c386464fd2e5e4ea3624466055bbe681ff185fd6c9daa98f30a3f9a"}, - {file = "pyarrow-14.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11e045dfa09855b6d3e7705a37c42e2dc2c71d608fab34d3c23df2e02df9aec3"}, - {file = "pyarrow-14.0.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:097828b55321897db0e1dbfc606e3ff8101ae5725673498cbfa7754ee0da80e4"}, - {file = "pyarrow-14.0.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1daab52050a1c48506c029e6fa0944a7b2436334d7e44221c16f6f1b2cc9c510"}, - {file = "pyarrow-14.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:3f6d5faf4f1b0d5a7f97be987cf9e9f8cd39902611e818fe134588ee99bf0283"}, - {file = "pyarrow-14.0.1.tar.gz", hash = "sha256:b8b3f4fe8d4ec15e1ef9b599b94683c5216adaed78d5cb4c606180546d1e2ee1"}, + {file = "pyarrow-14.0.2-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:ba9fe808596c5dbd08b3aeffe901e5f81095baaa28e7d5118e01354c64f22807"}, + {file = "pyarrow-14.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:22a768987a16bb46220cef490c56c671993fbee8fd0475febac0b3e16b00a10e"}, + {file = "pyarrow-14.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dbba05e98f247f17e64303eb876f4a80fcd32f73c7e9ad975a83834d81f3fda"}, + {file = "pyarrow-14.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a898d134d00b1eca04998e9d286e19653f9d0fcb99587310cd10270907452a6b"}, + {file = "pyarrow-14.0.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:87e879323f256cb04267bb365add7208f302df942eb943c93a9dfeb8f44840b1"}, + {file = "pyarrow-14.0.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:76fc257559404ea5f1306ea9a3ff0541bf996ff3f7b9209fc517b5e83811fa8e"}, + {file = "pyarrow-14.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:b0c4a18e00f3a32398a7f31da47fefcd7a927545b396e1f15d0c85c2f2c778cd"}, + {file = "pyarrow-14.0.2-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:87482af32e5a0c0cce2d12eb3c039dd1d853bd905b04f3f953f147c7a196915b"}, + {file = "pyarrow-14.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:059bd8f12a70519e46cd64e1ba40e97eae55e0cbe1695edd95384653d7626b23"}, + {file = "pyarrow-14.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f16111f9ab27e60b391c5f6d197510e3ad6654e73857b4e394861fc79c37200"}, + {file = "pyarrow-14.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06ff1264fe4448e8d02073f5ce45a9f934c0f3db0a04460d0b01ff28befc3696"}, + {file = "pyarrow-14.0.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:6dd4f4b472ccf4042f1eab77e6c8bce574543f54d2135c7e396f413046397d5a"}, + {file = "pyarrow-14.0.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:32356bfb58b36059773f49e4e214996888eeea3a08893e7dbde44753799b2a02"}, + {file = "pyarrow-14.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:52809ee69d4dbf2241c0e4366d949ba035cbcf48409bf404f071f624ed313a2b"}, + {file = "pyarrow-14.0.2-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:c87824a5ac52be210d32906c715f4ed7053d0180c1060ae3ff9b7e560f53f944"}, + {file = "pyarrow-14.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a25eb2421a58e861f6ca91f43339d215476f4fe159eca603c55950c14f378cc5"}, + {file = "pyarrow-14.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c1da70d668af5620b8ba0a23f229030a4cd6c5f24a616a146f30d2386fec422"}, + {file = "pyarrow-14.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cc61593c8e66194c7cdfae594503e91b926a228fba40b5cf25cc593563bcd07"}, + {file = "pyarrow-14.0.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:78ea56f62fb7c0ae8ecb9afdd7893e3a7dbeb0b04106f5c08dbb23f9c0157591"}, + {file = "pyarrow-14.0.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:37c233ddbce0c67a76c0985612fef27c0c92aef9413cf5aa56952f359fcb7379"}, + {file = "pyarrow-14.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:e4b123ad0f6add92de898214d404e488167b87b5dd86e9a434126bc2b7a5578d"}, + {file = "pyarrow-14.0.2-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:e354fba8490de258be7687f341bc04aba181fc8aa1f71e4584f9890d9cb2dec2"}, + {file = "pyarrow-14.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:20e003a23a13da963f43e2b432483fdd8c38dc8882cd145f09f21792e1cf22a1"}, + {file = "pyarrow-14.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc0de7575e841f1595ac07e5bc631084fd06ca8b03c0f2ecece733d23cd5102a"}, + {file = "pyarrow-14.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66e986dc859712acb0bd45601229021f3ffcdfc49044b64c6d071aaf4fa49e98"}, + {file = "pyarrow-14.0.2-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:f7d029f20ef56673a9730766023459ece397a05001f4e4d13805111d7c2108c0"}, + {file = "pyarrow-14.0.2-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:209bac546942b0d8edc8debda248364f7f668e4aad4741bae58e67d40e5fcf75"}, + {file = "pyarrow-14.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:1e6987c5274fb87d66bb36816afb6f65707546b3c45c44c28e3c4133c010a881"}, + {file = "pyarrow-14.0.2-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:a01d0052d2a294a5f56cc1862933014e696aa08cc7b620e8c0cce5a5d362e976"}, + {file = "pyarrow-14.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a51fee3a7db4d37f8cda3ea96f32530620d43b0489d169b285d774da48ca9785"}, + {file = "pyarrow-14.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64df2bf1ef2ef14cee531e2dfe03dd924017650ffaa6f9513d7a1bb291e59c15"}, + {file = "pyarrow-14.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c0fa3bfdb0305ffe09810f9d3e2e50a2787e3a07063001dcd7adae0cee3601a"}, + {file = "pyarrow-14.0.2-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c65bf4fd06584f058420238bc47a316e80dda01ec0dfb3044594128a6c2db794"}, + {file = "pyarrow-14.0.2-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:63ac901baec9369d6aae1cbe6cca11178fb018a8d45068aaf5bb54f94804a866"}, + {file = "pyarrow-14.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:75ee0efe7a87a687ae303d63037d08a48ef9ea0127064df18267252cfe2e9541"}, + {file = "pyarrow-14.0.2.tar.gz", hash = "sha256:36cef6ba12b499d864d1def3e990f97949e0b79400d08b7cf74504ffbd3eb025"}, ] [package.dependencies] @@ -6225,13 +6252,13 @@ files = [ [[package]] name = "pypdf" -version = "3.17.2" +version = "3.17.3" description = "A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files" optional = false python-versions = ">=3.6" files = [ - {file = "pypdf-3.17.2-py3-none-any.whl", hash = "sha256:e149ed50aa41e04b176246714806cd8d6c6c6d68b528508f849642959041963a"}, - {file = "pypdf-3.17.2.tar.gz", hash = "sha256:d6f077060912f8292d7db3da04f7bf2428ac974781e11eef219193a22120f649"}, + {file = "pypdf-3.17.3-py3-none-any.whl", hash = "sha256:1f77682d95dc6308517caa96e267628f747100634ec43476166763a226320817"}, + {file = "pypdf-3.17.3.tar.gz", hash = "sha256:70c072218e3729218676bdf107e921fa49d1838c2f46056ce26d495c7e58f641"}, ] [package.dependencies] @@ -7029,110 +7056,110 @@ files = [ [[package]] name = "rpds-py" -version = "0.13.2" +version = "0.15.2" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" files = [ - {file = "rpds_py-0.13.2-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:1ceebd0ae4f3e9b2b6b553b51971921853ae4eebf3f54086be0565d59291e53d"}, - {file = "rpds_py-0.13.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:46e1ed994a0920f350a4547a38471217eb86f57377e9314fbaaa329b71b7dfe3"}, - {file = "rpds_py-0.13.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee353bb51f648924926ed05e0122b6a0b1ae709396a80eb583449d5d477fcdf7"}, - {file = "rpds_py-0.13.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:530190eb0cd778363bbb7596612ded0bb9fef662daa98e9d92a0419ab27ae914"}, - {file = "rpds_py-0.13.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d311e44dd16d2434d5506d57ef4d7036544fc3c25c14b6992ef41f541b10fb"}, - {file = "rpds_py-0.13.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e72f750048b32d39e87fc85c225c50b2a6715034848dbb196bf3348aa761fa1"}, - {file = "rpds_py-0.13.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db09b98c7540df69d4b47218da3fbd7cb466db0fb932e971c321f1c76f155266"}, - {file = "rpds_py-0.13.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2ac26f50736324beb0282c819668328d53fc38543fa61eeea2c32ea8ea6eab8d"}, - {file = "rpds_py-0.13.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:12ecf89bd54734c3c2c79898ae2021dca42750c7bcfb67f8fb3315453738ac8f"}, - {file = "rpds_py-0.13.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a44c8440183b43167fd1a0819e8356692bf5db1ad14ce140dbd40a1485f2dea"}, - {file = "rpds_py-0.13.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bcef4f2d3dc603150421de85c916da19471f24d838c3c62a4f04c1eb511642c1"}, - {file = "rpds_py-0.13.2-cp310-none-win32.whl", hash = "sha256:ee6faebb265e28920a6f23a7d4c362414b3f4bb30607141d718b991669e49ddc"}, - {file = "rpds_py-0.13.2-cp310-none-win_amd64.whl", hash = "sha256:ac96d67b37f28e4b6ecf507c3405f52a40658c0a806dffde624a8fcb0314d5fd"}, - {file = "rpds_py-0.13.2-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:b5f6328e8e2ae8238fc767703ab7b95785521c42bb2b8790984e3477d7fa71ad"}, - {file = "rpds_py-0.13.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:729408136ef8d45a28ee9a7411917c9e3459cf266c7e23c2f7d4bb8ef9e0da42"}, - {file = "rpds_py-0.13.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65cfed9c807c27dee76407e8bb29e6f4e391e436774bcc769a037ff25ad8646e"}, - {file = "rpds_py-0.13.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aefbdc934115d2f9278f153952003ac52cd2650e7313750390b334518c589568"}, - {file = "rpds_py-0.13.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d48db29bd47814671afdd76c7652aefacc25cf96aad6daefa82d738ee87461e2"}, - {file = "rpds_py-0.13.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3c55d7f2d817183d43220738270efd3ce4e7a7b7cbdaefa6d551ed3d6ed89190"}, - {file = "rpds_py-0.13.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6aadae3042f8e6db3376d9e91f194c606c9a45273c170621d46128f35aef7cd0"}, - {file = "rpds_py-0.13.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5feae2f9aa7270e2c071f488fab256d768e88e01b958f123a690f1cc3061a09c"}, - {file = "rpds_py-0.13.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:51967a67ea0d7b9b5cd86036878e2d82c0b6183616961c26d825b8c994d4f2c8"}, - {file = "rpds_py-0.13.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d0c10d803549427f427085ed7aebc39832f6e818a011dcd8785e9c6a1ba9b3e"}, - {file = "rpds_py-0.13.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:603d5868f7419081d616dab7ac3cfa285296735e7350f7b1e4f548f6f953ee7d"}, - {file = "rpds_py-0.13.2-cp311-none-win32.whl", hash = "sha256:b8996ffb60c69f677245f5abdbcc623e9442bcc91ed81b6cd6187129ad1fa3e7"}, - {file = "rpds_py-0.13.2-cp311-none-win_amd64.whl", hash = "sha256:5379e49d7e80dca9811b36894493d1c1ecb4c57de05c36f5d0dd09982af20211"}, - {file = "rpds_py-0.13.2-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:8a776a29b77fe0cc28fedfd87277b0d0f7aa930174b7e504d764e0b43a05f381"}, - {file = "rpds_py-0.13.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2a1472956c5bcc49fb0252b965239bffe801acc9394f8b7c1014ae9258e4572b"}, - {file = "rpds_py-0.13.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f252dfb4852a527987a9156cbcae3022a30f86c9d26f4f17b8c967d7580d65d2"}, - {file = "rpds_py-0.13.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f0d320e70b6b2300ff6029e234e79fe44e9dbbfc7b98597ba28e054bd6606a57"}, - {file = "rpds_py-0.13.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ade2ccb937060c299ab0dfb2dea3d2ddf7e098ed63ee3d651ebfc2c8d1e8632a"}, - {file = "rpds_py-0.13.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9d121be0217787a7d59a5c6195b0842d3f701007333426e5154bf72346aa658"}, - {file = "rpds_py-0.13.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fa6bd071ec6d90f6e7baa66ae25820d57a8ab1b0a3c6d3edf1834d4b26fafa2"}, - {file = "rpds_py-0.13.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c918621ee0a3d1fe61c313f2489464f2ae3d13633e60f520a8002a5e910982ee"}, - {file = "rpds_py-0.13.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:25b28b3d33ec0a78e944aaaed7e5e2a94ac811bcd68b557ca48a0c30f87497d2"}, - {file = "rpds_py-0.13.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:31e220a040b89a01505128c2f8a59ee74732f666439a03e65ccbf3824cdddae7"}, - {file = "rpds_py-0.13.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:15253fff410873ebf3cfba1cc686a37711efcd9b8cb30ea21bb14a973e393f60"}, - {file = "rpds_py-0.13.2-cp312-none-win32.whl", hash = "sha256:b981a370f8f41c4024c170b42fbe9e691ae2dbc19d1d99151a69e2c84a0d194d"}, - {file = "rpds_py-0.13.2-cp312-none-win_amd64.whl", hash = "sha256:4c4e314d36d4f31236a545696a480aa04ea170a0b021e9a59ab1ed94d4c3ef27"}, - {file = "rpds_py-0.13.2-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:80e5acb81cb49fd9f2d5c08f8b74ffff14ee73b10ca88297ab4619e946bcb1e1"}, - {file = "rpds_py-0.13.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:efe093acc43e869348f6f2224df7f452eab63a2c60a6c6cd6b50fd35c4e075ba"}, - {file = "rpds_py-0.13.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c2a61c0e4811012b0ba9f6cdcb4437865df5d29eab5d6018ba13cee1c3064a0"}, - {file = "rpds_py-0.13.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:751758d9dd04d548ec679224cc00e3591f5ebf1ff159ed0d4aba6a0746352452"}, - {file = "rpds_py-0.13.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6ba8858933f0c1a979781272a5f65646fca8c18c93c99c6ddb5513ad96fa54b1"}, - {file = "rpds_py-0.13.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bfdfbe6a36bc3059fff845d64c42f2644cf875c65f5005db54f90cdfdf1df815"}, - {file = "rpds_py-0.13.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa0379c1935c44053c98826bc99ac95f3a5355675a297ac9ce0dfad0ce2d50ca"}, - {file = "rpds_py-0.13.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d5593855b5b2b73dd8413c3fdfa5d95b99d657658f947ba2c4318591e745d083"}, - {file = "rpds_py-0.13.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2a7bef6977043673750a88da064fd513f89505111014b4e00fbdd13329cd4e9a"}, - {file = "rpds_py-0.13.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:3ab96754d23372009638a402a1ed12a27711598dd49d8316a22597141962fe66"}, - {file = "rpds_py-0.13.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:e06cfea0ece444571d24c18ed465bc93afb8c8d8d74422eb7026662f3d3f779b"}, - {file = "rpds_py-0.13.2-cp38-none-win32.whl", hash = "sha256:5493569f861fb7b05af6d048d00d773c6162415ae521b7010197c98810a14cab"}, - {file = "rpds_py-0.13.2-cp38-none-win_amd64.whl", hash = "sha256:b07501b720cf060c5856f7b5626e75b8e353b5f98b9b354a21eb4bfa47e421b1"}, - {file = "rpds_py-0.13.2-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:881df98f0a8404d32b6de0fd33e91c1b90ed1516a80d4d6dc69d414b8850474c"}, - {file = "rpds_py-0.13.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d79c159adea0f1f4617f54aa156568ac69968f9ef4d1e5fefffc0a180830308e"}, - {file = "rpds_py-0.13.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38d4f822ee2f338febcc85aaa2547eb5ba31ba6ff68d10b8ec988929d23bb6b4"}, - {file = "rpds_py-0.13.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5d75d6d220d55cdced2f32cc22f599475dbe881229aeddba6c79c2e9df35a2b3"}, - {file = "rpds_py-0.13.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d97e9ae94fb96df1ee3cb09ca376c34e8a122f36927230f4c8a97f469994bff"}, - {file = "rpds_py-0.13.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:67a429520e97621a763cf9b3ba27574779c4e96e49a27ff8a1aa99ee70beb28a"}, - {file = "rpds_py-0.13.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:188435794405c7f0573311747c85a96b63c954a5f2111b1df8018979eca0f2f0"}, - {file = "rpds_py-0.13.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:38f9bf2ad754b4a45b8210a6c732fe876b8a14e14d5992a8c4b7c1ef78740f53"}, - {file = "rpds_py-0.13.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a6ba2cb7d676e9415b9e9ac7e2aae401dc1b1e666943d1f7bc66223d3d73467b"}, - {file = "rpds_py-0.13.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:eaffbd8814bb1b5dc3ea156a4c5928081ba50419f9175f4fc95269e040eff8f0"}, - {file = "rpds_py-0.13.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5a4c1058cdae6237d97af272b326e5f78ee7ee3bbffa6b24b09db4d828810468"}, - {file = "rpds_py-0.13.2-cp39-none-win32.whl", hash = "sha256:b5267feb19070bef34b8dea27e2b504ebd9d31748e3ecacb3a4101da6fcb255c"}, - {file = "rpds_py-0.13.2-cp39-none-win_amd64.whl", hash = "sha256:ddf23960cb42b69bce13045d5bc66f18c7d53774c66c13f24cf1b9c144ba3141"}, - {file = "rpds_py-0.13.2-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:97163a1ab265a1073a6372eca9f4eeb9f8c6327457a0b22ddfc4a17dcd613e74"}, - {file = "rpds_py-0.13.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:25ea41635d22b2eb6326f58e608550e55d01df51b8a580ea7e75396bafbb28e9"}, - {file = "rpds_py-0.13.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76d59d4d451ba77f08cb4cd9268dec07be5bc65f73666302dbb5061989b17198"}, - {file = "rpds_py-0.13.2-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7c564c58cf8f248fe859a4f0fe501b050663f3d7fbc342172f259124fb59933"}, - {file = "rpds_py-0.13.2-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61dbc1e01dc0c5875da2f7ae36d6e918dc1b8d2ce04e871793976594aad8a57a"}, - {file = "rpds_py-0.13.2-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fdb82eb60d31b0c033a8e8ee9f3fc7dfbaa042211131c29da29aea8531b4f18f"}, - {file = "rpds_py-0.13.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d204957169f0b3511fb95395a9da7d4490fb361763a9f8b32b345a7fe119cb45"}, - {file = "rpds_py-0.13.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c45008ca79bad237cbc03c72bc5205e8c6f66403773929b1b50f7d84ef9e4d07"}, - {file = "rpds_py-0.13.2-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:79bf58c08f0756adba691d480b5a20e4ad23f33e1ae121584cf3a21717c36dfa"}, - {file = "rpds_py-0.13.2-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:e86593bf8637659e6a6ed58854b6c87ec4e9e45ee8a4adfd936831cef55c2d21"}, - {file = "rpds_py-0.13.2-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:d329896c40d9e1e5c7715c98529e4a188a1f2df51212fd65102b32465612b5dc"}, - {file = "rpds_py-0.13.2-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:4a5375c5fff13f209527cd886dc75394f040c7d1ecad0a2cb0627f13ebe78a12"}, - {file = "rpds_py-0.13.2-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:06d218e4464d31301e943b65b2c6919318ea6f69703a351961e1baaf60347276"}, - {file = "rpds_py-0.13.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1f41d32a2ddc5a94df4b829b395916a4b7f103350fa76ba6de625fcb9e773ac"}, - {file = "rpds_py-0.13.2-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6bc568b05e02cd612be53900c88aaa55012e744930ba2eeb56279db4c6676eb3"}, - {file = "rpds_py-0.13.2-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d94d78418203904730585efa71002286ac4c8ac0689d0eb61e3c465f9e608ff"}, - {file = "rpds_py-0.13.2-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bed0252c85e21cf73d2d033643c945b460d6a02fc4a7d644e3b2d6f5f2956c64"}, - {file = "rpds_py-0.13.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:244e173bb6d8f3b2f0c4d7370a1aa341f35da3e57ffd1798e5b2917b91731fd3"}, - {file = "rpds_py-0.13.2-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7f55cd9cf1564b7b03f238e4c017ca4794c05b01a783e9291065cb2858d86ce4"}, - {file = "rpds_py-0.13.2-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:f03a1b3a4c03e3e0161642ac5367f08479ab29972ea0ffcd4fa18f729cd2be0a"}, - {file = "rpds_py-0.13.2-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:f5f4424cb87a20b016bfdc157ff48757b89d2cc426256961643d443c6c277007"}, - {file = "rpds_py-0.13.2-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:c82bbf7e03748417c3a88c1b0b291288ce3e4887a795a3addaa7a1cfd9e7153e"}, - {file = "rpds_py-0.13.2-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:c0095b8aa3e432e32d372e9a7737e65b58d5ed23b9620fea7cb81f17672f1fa1"}, - {file = "rpds_py-0.13.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:4c2d26aa03d877c9730bf005621c92da263523a1e99247590abbbe252ccb7824"}, - {file = "rpds_py-0.13.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96f2975fb14f39c5fe75203f33dd3010fe37d1c4e33177feef1107b5ced750e3"}, - {file = "rpds_py-0.13.2-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4dcc5ee1d0275cb78d443fdebd0241e58772a354a6d518b1d7af1580bbd2c4e8"}, - {file = "rpds_py-0.13.2-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61d42d2b08430854485135504f672c14d4fc644dd243a9c17e7c4e0faf5ed07e"}, - {file = "rpds_py-0.13.2-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d3a61e928feddc458a55110f42f626a2a20bea942ccedb6fb4cee70b4830ed41"}, - {file = "rpds_py-0.13.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7de12b69d95072394998c622cfd7e8cea8f560db5fca6a62a148f902a1029f8b"}, - {file = "rpds_py-0.13.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:87a90f5545fd61f6964e65eebde4dc3fa8660bb7d87adb01d4cf17e0a2b484ad"}, - {file = "rpds_py-0.13.2-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:9c95a1a290f9acf7a8f2ebbdd183e99215d491beea52d61aa2a7a7d2c618ddc6"}, - {file = "rpds_py-0.13.2-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:35f53c76a712e323c779ca39b9a81b13f219a8e3bc15f106ed1e1462d56fcfe9"}, - {file = "rpds_py-0.13.2-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:96fb0899bb2ab353f42e5374c8f0789f54e0a94ef2f02b9ac7149c56622eaf31"}, - {file = "rpds_py-0.13.2.tar.gz", hash = "sha256:f8eae66a1304de7368932b42d801c67969fd090ddb1a7a24f27b435ed4bed68f"}, + {file = "rpds_py-0.15.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:337a8653fb11d2fbe7157c961cc78cb3c161d98cf44410ace9a3dc2db4fad882"}, + {file = "rpds_py-0.15.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:813a65f95bfcb7c8f2a70dd6add9b51e9accc3bdb3e03d0ff7a9e6a2d3e174bf"}, + {file = "rpds_py-0.15.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:082e0e55d73690ffb4da4352d1b5bbe1b5c6034eb9dc8c91aa2a3ee15f70d3e2"}, + {file = "rpds_py-0.15.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5595c80dd03d7e6c6afb73f3594bf3379a7d79fa57164b591d012d4b71d6ac4c"}, + {file = "rpds_py-0.15.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb10bb720348fe1647a94eb605accb9ef6a9b1875d8845f9e763d9d71a706387"}, + {file = "rpds_py-0.15.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:53304cc14b1d94487d70086e1cb0cb4c29ec6da994d58ae84a4d7e78c6a6d04d"}, + {file = "rpds_py-0.15.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d64a657de7aae8db2da60dc0c9e4638a0c3893b4d60101fd564a3362b2bfeb34"}, + {file = "rpds_py-0.15.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ee40206d1d6e95eaa2b7b919195e3689a5cf6ded730632de7f187f35a1b6052c"}, + {file = "rpds_py-0.15.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1607cda6129f815493a3c184492acb5ae4aa6ed61d3a1b3663aa9824ed26f7ac"}, + {file = "rpds_py-0.15.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f3e6e2e502c4043c52a99316d89dc49f416acda5b0c6886e0dd8ea7bb35859e8"}, + {file = "rpds_py-0.15.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:044f6f46d62444800402851afa3c3ae50141f12013060c1a3a0677e013310d6d"}, + {file = "rpds_py-0.15.2-cp310-none-win32.whl", hash = "sha256:c827a931c6b57f50f1bb5de400dcfb00bad8117e3753e80b96adb72d9d811514"}, + {file = "rpds_py-0.15.2-cp310-none-win_amd64.whl", hash = "sha256:3bbc89ce2a219662ea142f0abcf8d43f04a41d5b1880be17a794c39f0d609cb0"}, + {file = "rpds_py-0.15.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:1fd0f0b1ccd7d537b858a56355a250108df692102e08aa2036e1a094fd78b2dc"}, + {file = "rpds_py-0.15.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b414ef79f1f06fb90b5165db8aef77512c1a5e3ed1b4807da8476b7e2c853283"}, + {file = "rpds_py-0.15.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c31272c674f725dfe0f343d73b0abe8c878c646967ec1c6106122faae1efc15b"}, + {file = "rpds_py-0.15.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a6945c2d61c42bb7e818677f43638675b8c1c43e858b67a96df3eb2426a86c9d"}, + {file = "rpds_py-0.15.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02744236ac1895d7be837878e707a5c35fb8edc5137602f253b63623d7ad5c8c"}, + {file = "rpds_py-0.15.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2181e86d4e1cdf49a7320cb72a36c45efcb7670d0a88f09fd2d3a7967c0540fd"}, + {file = "rpds_py-0.15.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a8ff8e809da81363bffca2b965cb6e4bf6056b495fc3f078467d1f8266fe27f"}, + {file = "rpds_py-0.15.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:97532802f14d383f37d603a56e226909f825a83ff298dc1b6697de00d2243999"}, + {file = "rpds_py-0.15.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:13716e53627ad97babf72ac9e01cf9a7d4af2f75dd5ed7b323a7a9520e948282"}, + {file = "rpds_py-0.15.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:2f1f295a5c28cfa74a7d48c95acc1c8a7acd49d7d9072040d4b694fe11cd7166"}, + {file = "rpds_py-0.15.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8ec464f20fe803ae00419bd1610934e3bda963aeba1e6181dfc9033dc7e8940c"}, + {file = "rpds_py-0.15.2-cp311-none-win32.whl", hash = "sha256:b61d5096e75fd71018b25da50b82dd70ec39b5e15bb2134daf7eb7bbbc103644"}, + {file = "rpds_py-0.15.2-cp311-none-win_amd64.whl", hash = "sha256:9d41ebb471a6f064c0d1c873c4f7dded733d16ca5db7d551fb04ff3805d87802"}, + {file = "rpds_py-0.15.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:13ff62d3561a23c17341b4afc78e8fcfd799ab67c0b1ca32091d71383a98ba4b"}, + {file = "rpds_py-0.15.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b70b45a40ad0798b69748b34d508259ef2bdc84fb2aad4048bc7c9cafb68ddb3"}, + {file = "rpds_py-0.15.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4ecbba7efd82bd2a4bb88aab7f984eb5470991c1347bdd1f35fb34ea28dba6e"}, + {file = "rpds_py-0.15.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9d38494a8d21c246c535b41ecdb2d562c4b933cf3d68de03e8bc43a0d41be652"}, + {file = "rpds_py-0.15.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:13152dfe7d7c27c40df8b99ac6aab12b978b546716e99f67e8a67a1d441acbc3"}, + {file = "rpds_py-0.15.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:164fcee32f15d04d61568c9cb0d919e37ff3195919cd604039ff3053ada0461b"}, + {file = "rpds_py-0.15.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a5122b17a4faf5d7a6d91fa67b479736c0cacc7afe791ddebb7163a8550b799"}, + {file = "rpds_py-0.15.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:46b4f3d47d1033db569173be62365fbf7808c2bd3fb742314d251f130d90d44c"}, + {file = "rpds_py-0.15.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c61e42b4ceb9759727045765e87d51c1bb9f89987aca1fcc8a040232138cad1c"}, + {file = "rpds_py-0.15.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d2aa3ca9552f83b0b4fa6ca8c6ce08da6580f37e3e0ab7afac73a1cfdc230c0e"}, + {file = "rpds_py-0.15.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ec19e823b4ccd87bd69e990879acbce9e961fc7aebe150156b8f4418d4b27b7f"}, + {file = "rpds_py-0.15.2-cp312-none-win32.whl", hash = "sha256:afeabb382c1256a7477b739820bce7fe782bb807d82927102cee73e79b41b38b"}, + {file = "rpds_py-0.15.2-cp312-none-win_amd64.whl", hash = "sha256:422b0901878a31ef167435c5ad46560362891816a76cc0d150683f3868a6f0d1"}, + {file = "rpds_py-0.15.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:baf744e5f9d5ee6531deea443be78b36ed1cd36c65a0b95ea4e8d69fa0102268"}, + {file = "rpds_py-0.15.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7e072f5da38d6428ba1fc1115d3cc0dae895df671cb04c70c019985e8c7606be"}, + {file = "rpds_py-0.15.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f138f550b83554f5b344d6be35d3ed59348510edc3cb96f75309db6e9bfe8210"}, + {file = "rpds_py-0.15.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b2a4cd924d0e2f4b1a68034abe4cadc73d69ad5f4cf02db6481c0d4d749f548f"}, + {file = "rpds_py-0.15.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5eb05b654a41e0f81ab27a7c3e88b6590425eb3e934e1d533ecec5dc88a6ffff"}, + {file = "rpds_py-0.15.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2ee066a64f0d2ba45391cac15b3a70dcb549e968a117bd0500634754cfe0e5fc"}, + {file = "rpds_py-0.15.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c51a899792ee2c696072791e56b2020caff58b275abecbc9ae0cb71af0645c95"}, + {file = "rpds_py-0.15.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ac2ac84a4950d627d84b61f082eba61314373cfab4b3c264b62efab02ababe83"}, + {file = "rpds_py-0.15.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:62b292fff4739c6be89e6a0240c02bda5a9066a339d90ab191cf66e9fdbdc193"}, + {file = "rpds_py-0.15.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:98ee201a52a7f65608e5494518932e1473fd43535f12cade0a1b4ab32737fe28"}, + {file = "rpds_py-0.15.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3d40fb3ca22e3d40f494d577441b263026a3bd8c97ae6ce89b2d3c4b39ac9581"}, + {file = "rpds_py-0.15.2-cp38-none-win32.whl", hash = "sha256:30479a9f1fce47df56b07460b520f49fa2115ec2926d3b1303c85c81f8401ed1"}, + {file = "rpds_py-0.15.2-cp38-none-win_amd64.whl", hash = "sha256:2df3d07a16a3bef0917b28cd564778fbb31f3ffa5b5e33584470e2d1b0f248f0"}, + {file = "rpds_py-0.15.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:56b51ba29a18e5f5810224bcf00747ad931c0716e3c09a76b4a1edd3d4aba71f"}, + {file = "rpds_py-0.15.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3c11bc5814554b018f6c5d6ae0969e43766f81e995000b53a5d8c8057055e886"}, + {file = "rpds_py-0.15.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2faa97212b0dc465afeedf49045cdd077f97be1188285e646a9f689cb5dfff9e"}, + {file = "rpds_py-0.15.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:86c01299942b0f4b5b5f28c8701689181ad2eab852e65417172dbdd6c5b3ccc8"}, + {file = "rpds_py-0.15.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd7d3608589072f63078b4063a6c536af832e76b0b3885f1bfe9e892abe6c207"}, + {file = "rpds_py-0.15.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:938518a11780b39998179d07f31a4a468888123f9b00463842cd40f98191f4d3"}, + {file = "rpds_py-0.15.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dccc623725d0b298f557d869a68496a2fd2a9e9c41107f234fa5f7a37d278ac"}, + {file = "rpds_py-0.15.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d46ee458452727a147d7897bb33886981ae1235775e05decae5d5d07f537695a"}, + {file = "rpds_py-0.15.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d9d7ebcd11ea76ba0feaae98485cd8e31467c3d7985210fab46983278214736b"}, + {file = "rpds_py-0.15.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:8a5f574b92b3ee7d254e56d56e37ec0e1416acb1ae357c4956d76a1788dc58fb"}, + {file = "rpds_py-0.15.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3db0c998c92b909d7c90b66c965590d4f3cd86157176a6cf14aa1f867b77b889"}, + {file = "rpds_py-0.15.2-cp39-none-win32.whl", hash = "sha256:bbc7421cbd28b4316d1d017db338039a7943f945c6f2bb15e1439b14b5682d28"}, + {file = "rpds_py-0.15.2-cp39-none-win_amd64.whl", hash = "sha256:1c24e30d720c0009b6fb2e1905b025da56103c70a8b31b99138e4ed1c2a6c5b0"}, + {file = "rpds_py-0.15.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:1e6fcd0a0f62f2997107f758bb372397b8d5fd5f39cc6dcb86f7cb98a2172d6c"}, + {file = "rpds_py-0.15.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d800a8e2ac62db1b9ea5d6d1724f1a93c53907ca061de4d05ed94e8dfa79050c"}, + {file = "rpds_py-0.15.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e09d017e3f4d9bd7d17a30d3f59e4d6d9ba2d2ced280eec2425e84112cf623f"}, + {file = "rpds_py-0.15.2-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b88c3ab98556bc351b36d6208a6089de8c8db14a7f6e1f57f82a334bd2c18f0b"}, + {file = "rpds_py-0.15.2-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f333bfe782a2d05a67cfaa0cc9cd68b36b39ee6acfe099f980541ed973a7093"}, + {file = "rpds_py-0.15.2-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b629db53fe17e6ce478a969d30bd1d0e8b53238c46e3a9c9db39e8b65a9ef973"}, + {file = "rpds_py-0.15.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:485fbdd23becb822804ed05622907ee5c8e8a5f43f6f43894a45f463b2217045"}, + {file = "rpds_py-0.15.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:893e38d0f4319dfa70c0f36381a37cc418985c87b11d9784365b1fff4fa6973b"}, + {file = "rpds_py-0.15.2-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:8ffdeb7dbd0160d4e391e1f857477e4762d00aa2199c294eb95dfb9451aa1d9f"}, + {file = "rpds_py-0.15.2-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:fc33267d58dfbb2361baed52668c5d8c15d24bc0372cecbb79fed77339b55e0d"}, + {file = "rpds_py-0.15.2-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:2e7e5633577b3bd56bf3af2ef6ae3778bbafb83743989d57f0e7edbf6c0980e4"}, + {file = "rpds_py-0.15.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:8b9650f92251fdef843e74fc252cdfd6e3c700157ad686eeb0c6d7fdb2d11652"}, + {file = "rpds_py-0.15.2-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:07a2e1d78d382f7181789713cdf0c16edbad4fe14fe1d115526cb6f0eef0daa3"}, + {file = "rpds_py-0.15.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03f9c5875515820633bd7709a25c3e60c1ea9ad1c5d4030ce8a8c203309c36fd"}, + {file = "rpds_py-0.15.2-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:580182fa5b269c2981e9ce9764367cb4edc81982ce289208d4607c203f44ffde"}, + {file = "rpds_py-0.15.2-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa1e626c524d2c7972c0f3a8a575d654a3a9c008370dc2a97e46abd0eaa749b9"}, + {file = "rpds_py-0.15.2-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ae9d83a81b09ce3a817e2cbb23aabc07f86a3abc664c613cd283ce7a03541e95"}, + {file = "rpds_py-0.15.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9235be95662559141934fced8197de6fee8c58870f36756b0584424b6d708393"}, + {file = "rpds_py-0.15.2-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a72e00826a2b032dda3eb25aa3e3579c6d6773d22d8446089a57a123481cc46c"}, + {file = "rpds_py-0.15.2-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:ab095edf1d840a6a6a4307e1a5b907a299a94e7b90e75436ee770b8c35d22a25"}, + {file = "rpds_py-0.15.2-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:3b79c63d29101cbaa53a517683557bb550462394fb91044cc5998dd2acff7340"}, + {file = "rpds_py-0.15.2-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:911e600e798374c0d86235e7ef19109cf865d1336942d398ff313375a25a93ba"}, + {file = "rpds_py-0.15.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3cd61e759c4075510052d1eca5cddbd297fe1164efec14ef1fce3f09b974dfe4"}, + {file = "rpds_py-0.15.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:9d2ae79f31da5143e020a8d4fc74e1f0cbcb8011bdf97453c140aa616db51406"}, + {file = "rpds_py-0.15.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e99d6510c8557510c220b865d966b105464740dcbebf9b79ecd4fbab30a13d9"}, + {file = "rpds_py-0.15.2-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6c43e1b89099279cc03eb1c725c5de12af6edcd2f78e2f8a022569efa639ada3"}, + {file = "rpds_py-0.15.2-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac7187bee72384b9cfedf09a29a3b2b6e8815cc64c095cdc8b5e6aec81e9fd5f"}, + {file = "rpds_py-0.15.2-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3423007fc0661827e06f8a185a3792c73dda41f30f3421562f210cf0c9e49569"}, + {file = "rpds_py-0.15.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2974e6dff38afafd5ccf8f41cb8fc94600b3f4fd9b0a98f6ece6e2219e3158d5"}, + {file = "rpds_py-0.15.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:93c18a1696a8e0388ed84b024fe1a188a26ba999b61d1d9a371318cb89885a8c"}, + {file = "rpds_py-0.15.2-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:c7cd0841a586b7105513a7c8c3d5c276f3adc762a072d81ef7fae80632afad1e"}, + {file = "rpds_py-0.15.2-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:709dc11af2f74ba89c68b1592368c6edcbccdb0a06ba77eb28c8fe08bb6997da"}, + {file = "rpds_py-0.15.2-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:fc066395e6332da1e7525d605b4c96055669f8336600bef8ac569d5226a7c76f"}, + {file = "rpds_py-0.15.2.tar.gz", hash = "sha256:373b76eeb79e8c14f6d82cb1d4d5293f9e4059baec6c1b16dca7ad13b6131b39"}, ] [[package]] @@ -7774,13 +7801,13 @@ test = ["pylint", "pytest", "pytest-black", "pytest-cov", "pytest-pylint"] [[package]] name = "supabase" -version = "2.2.1" +version = "2.3.0" description = "Supabase client for Python." optional = false python-versions = ">=3.8,<4.0" files = [ - {file = "supabase-2.2.1-py3-none-any.whl", hash = "sha256:ce5a5773e47b009714dad645b5d417cc9759725f807e549f08a65e513cee17d3"}, - {file = "supabase-2.2.1.tar.gz", hash = "sha256:d724c16245b92b0faef5c467dafbb81e561f6b44c56195a076666da1bd327317"}, + {file = "supabase-2.3.0-py3-none-any.whl", hash = "sha256:d4c1f154a1110b1fb55d042e78431c7a2cdb7dee58cd6afb741de191ea235c86"}, + {file = "supabase-2.3.0.tar.gz", hash = "sha256:100f9c2b24ab3152b6f851fb77985668e791b85cf3d0df0629c6082c00f4af9a"}, ] [package.dependencies] @@ -8052,31 +8079,31 @@ files = [ [[package]] name = "torch" -version = "2.1.1" +version = "2.1.2" description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" optional = true python-versions = ">=3.8.0" files = [ - {file = "torch-2.1.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:5ebc43f5355a9b7be813392b3fb0133991f0380f6f0fcc8218d5468dc45d1071"}, - {file = "torch-2.1.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:84fefd63356416c0cd20578637ccdbb82164993400ed17b57c951dd6376dcee8"}, - {file = "torch-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:0a7a9da0c324409bcb5a7bdad1b4e94e936d21c2590aaa7ac2f63968da8c62f7"}, - {file = "torch-2.1.1-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:1e1e5faddd43a8f2c0e0e22beacd1e235a2e447794d807483c94a9e31b54a758"}, - {file = "torch-2.1.1-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:e76bf3c5c354874f1da465c852a2fb60ee6cbce306e935337885760f080f9baa"}, - {file = "torch-2.1.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:98fea993639b0bb432dfceb7b538f07c0f1c33386d63f635219f49254968c80f"}, - {file = "torch-2.1.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:61b51b33c61737c287058b0c3061e6a9d3c363863e4a094f804bc486888a188a"}, - {file = "torch-2.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:1d70920da827e2276bf07f7ec46958621cad18d228c97da8f9c19638474dbd52"}, - {file = "torch-2.1.1-cp311-none-macosx_10_9_x86_64.whl", hash = "sha256:a70593806f1d7e6b53657d96810518da0f88ef2608c98a402955765b8c79d52c"}, - {file = "torch-2.1.1-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:e312f7e82e49565f7667b0bbf9559ab0c597063d93044740781c02acd5a87978"}, - {file = "torch-2.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:1e3cbecfa5a7314d828f4a37b0c286714dc9aa2e69beb7a22f7aca76567ed9f4"}, - {file = "torch-2.1.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:9ca0fcbf3d5ba644d6a8572c83a9abbdf5f7ff575bc38529ef6c185a3a71bde9"}, - {file = "torch-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:2dc9f312fc1fa0d61a565a0292ad73119d4b74c9f8b5031b55f8b4722abca079"}, - {file = "torch-2.1.1-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:d56b032176458e2af4709627bbd2c20fe2917eff8cd087a7fe313acccf5ce2f1"}, - {file = "torch-2.1.1-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:29e3b90a8c281f6660804a939d1f4218604c80162e521e1e6d8c8557325902a0"}, - {file = "torch-2.1.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:bd95cee8511584b67ddc0ba465c3f1edeb5708d833ee02af1206b4486f1d9096"}, - {file = "torch-2.1.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b31230bd058424e56dba7f899280dbc6ac8b9948e43902e0c84a44666b1ec151"}, - {file = "torch-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:403f1095e665e4f35971b43797a920725b8b205723aa68254a4050c6beca29b6"}, - {file = "torch-2.1.1-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:715b50d8c1de5da5524a68287eb000f73e026e74d5f6b12bc450ef6995fcf5f9"}, - {file = "torch-2.1.1-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:db67e8725c76f4c7f4f02e7551bb16e81ba1a1912867bc35d7bb96d2be8c78b4"}, + {file = "torch-2.1.2-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:3a871edd6c02dae77ad810335c0833391c1a4ce49af21ea8cf0f6a5d2096eea8"}, + {file = "torch-2.1.2-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:bef6996c27d8f6e92ea4e13a772d89611da0e103b48790de78131e308cf73076"}, + {file = "torch-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:0e13034fd5fb323cbbc29e56d0637a3791e50dd589616f40c79adfa36a5a35a1"}, + {file = "torch-2.1.2-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:d9b535cad0df3d13997dbe8bd68ac33e0e3ae5377639c9881948e40794a61403"}, + {file = "torch-2.1.2-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:f9a55d55af02826ebfbadf4e9b682f0f27766bc33df8236b48d28d705587868f"}, + {file = "torch-2.1.2-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:a6ebbe517097ef289cc7952783588c72de071d4b15ce0f8b285093f0916b1162"}, + {file = "torch-2.1.2-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:8f32ce591616a30304f37a7d5ea80b69ca9e1b94bba7f308184bf616fdaea155"}, + {file = "torch-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:e0ee6cf90c8970e05760f898d58f9ac65821c37ffe8b04269ec787aa70962b69"}, + {file = "torch-2.1.2-cp311-none-macosx_10_9_x86_64.whl", hash = "sha256:76d37967c31c99548ad2c4d3f2cf191db48476f2e69b35a0937137116da356a1"}, + {file = "torch-2.1.2-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:e2d83f07b4aac983453ea5bf8f9aa9dacf2278a8d31247f5d9037f37befc60e4"}, + {file = "torch-2.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:f41fe0c7ecbf903a568c73486139a75cfab287a0f6c17ed0698fdea7a1e8641d"}, + {file = "torch-2.1.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:e3225f47d50bb66f756fe9196a768055d1c26b02154eb1f770ce47a2578d3aa7"}, + {file = "torch-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:33d59cd03cb60106857f6c26b36457793637512998666ee3ce17311f217afe2b"}, + {file = "torch-2.1.2-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:8e221deccd0def6c2badff6be403e0c53491805ed9915e2c029adbcdb87ab6b5"}, + {file = "torch-2.1.2-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:05b18594f60a911a0c4f023f38a8bda77131fba5fd741bda626e97dcf5a3dd0a"}, + {file = "torch-2.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:9ca96253b761e9aaf8e06fb30a66ee301aecbf15bb5a303097de1969077620b6"}, + {file = "torch-2.1.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d93ba70f67b08c2ae5598ee711cbc546a1bc8102cef938904b8c85c2089a51a0"}, + {file = "torch-2.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:255b50bc0608db177e6a3cc118961d77de7e5105f07816585fa6f191f33a9ff3"}, + {file = "torch-2.1.2-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:6984cd5057c0c977b3c9757254e989d3f1124f4ce9d07caa6cb637783c71d42a"}, + {file = "torch-2.1.2-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:bc195d7927feabc0eb7c110e457c955ed2ab616f3c7c28439dd4188cf589699f"}, ] [package.dependencies] @@ -8105,38 +8132,38 @@ opt-einsum = ["opt-einsum (>=3.3)"] [[package]] name = "torchvision" -version = "0.16.1" +version = "0.16.2" description = "image and video datasets and models for torch deep learning" optional = true python-versions = ">=3.8" files = [ - {file = "torchvision-0.16.1-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:987132795e5c037cb74e7be35a693999fdb2f603152266ee15b80206e83a5b0c"}, - {file = "torchvision-0.16.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:25da6a7b22ea0348f62c45ec0daf157731096babcae65d222404081af96e085c"}, - {file = "torchvision-0.16.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:c82e291e674a18b67f92ddb476ae18498fb46d7032ae914f3fda90c955e7d86f"}, - {file = "torchvision-0.16.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:632887b22e67ce32a3ede806b868bba4057601e46d680de14b32a391eac1b483"}, - {file = "torchvision-0.16.1-cp310-cp310-win_amd64.whl", hash = "sha256:92c76a5092b4033efdb183b11fa4854a7630e23c46f4a1c3ffd70c30cb5be4fc"}, - {file = "torchvision-0.16.1-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:4aea5cf491c6c21b1cbdbb1bf2a3838a59d4db93ad5f49019a6564d3ca7127c7"}, - {file = "torchvision-0.16.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3391757167637ace3ef33a67c9d5ef86b1f8cbd93eaa5bad45eebcf266ea6089"}, - {file = "torchvision-0.16.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:4f9d5b192b336982e6dbe32c070b05606f0b53e87d722ae332a02909fbf988ed"}, - {file = "torchvision-0.16.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:3d34601614958c4e30f53ec0eb7bf3f282ee72bb747734be2d75422831a43384"}, - {file = "torchvision-0.16.1-cp311-cp311-win_amd64.whl", hash = "sha256:e11af530585574eb5ca837b8f151bcdd57c10e35c3af56c76a10f3281d2a2f2c"}, - {file = "torchvision-0.16.1-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:4f2cad621fb96cf10e29af93e16c98b3226bdd53ae712b57e873c3deaf061617"}, - {file = "torchvision-0.16.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1d614b3c9e2de9cd75cc0e4e1923fcfbbcd9fdb9f08a0bbbbf7e135e4a0a1cfa"}, - {file = "torchvision-0.16.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:73271e930501a008fe24ba38945b2a75b25a6098f4c2f4402e39a9d0dd305ca6"}, - {file = "torchvision-0.16.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fab67ddc4809fcc2a04610b13cac5193b9d3be2896b77538bfdff401b13022e5"}, - {file = "torchvision-0.16.1-cp38-cp38-win_amd64.whl", hash = "sha256:13782d574033efec6646d1a2f5d85f4c59fcf3f403367bb407b15df07adc87e0"}, - {file = "torchvision-0.16.1-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:f14d201c37176dc4106eec76b229d6585a1505266b8cea99d3366fd38897b7c0"}, - {file = "torchvision-0.16.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a15e88a93a7501cc75b761a2dcd07aaedaaf9cbfaf48c8affa8c98989ecbb19d"}, - {file = "torchvision-0.16.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:72fde5fdb462e66ebe25ae42d2ee11434cbc395f74cad0d3b22cf60524345cc5"}, - {file = "torchvision-0.16.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:153f753f14eba58969cdc86360893a57f8bf63f8136c7d1cd4388108560b5446"}, - {file = "torchvision-0.16.1-cp39-cp39-win_amd64.whl", hash = "sha256:75e33b198b1265f61d822aa66d646ec3df67a712470ffec1e0c37ff46d4103c1"}, + {file = "torchvision-0.16.2-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:bc86f2800cb2c0c1a09c581409cdd6bff66e62f103dc83fc63f73346264c3756"}, + {file = "torchvision-0.16.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b024bd412df6d3a007dcebf311a894eb3c5c21e1af80d12be382bbcb097a7c3a"}, + {file = "torchvision-0.16.2-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:e89f10f3c8351972b6e3fda95bc3e479ea8dbfc9dfcfd2c32902dbad4ba5cfc5"}, + {file = "torchvision-0.16.2-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:96c7583700112a410bdc4e1e4f118c429dab49c29c9a31a2cc3579bc9b08b19d"}, + {file = "torchvision-0.16.2-cp310-cp310-win_amd64.whl", hash = "sha256:9f4032ebb3277fb07ff6a9b818d50a547fb8fcd89d958cfd9e773322454bb688"}, + {file = "torchvision-0.16.2-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:67b1aaf8b8cb02ce75dd445f291a27c8036a502f8c0aa76e28c37a0faac2e153"}, + {file = "torchvision-0.16.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bef30d03e1d1c629761f4dca51d3b7d8a0dc0acce6f4068ab2a1634e8e7b64e0"}, + {file = "torchvision-0.16.2-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:e59cc7b2bd1ab5c0ce4ae382e4e37be8f1c174e8b5de2f6a23c170de9ae28495"}, + {file = "torchvision-0.16.2-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:e130b08cc9b3cc73a6c59d6edf032394a322f9579bfd21d14bc2e1d0999aa758"}, + {file = "torchvision-0.16.2-cp311-cp311-win_amd64.whl", hash = "sha256:8692ab1e48807e9604046a6f4beeb67b523294cee1b00828654bb0df2cfce2b2"}, + {file = "torchvision-0.16.2-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:b82732dcf876a37c852772342aa6ee3480c03bb3e2a802ae109fc5f7e28d26e9"}, + {file = "torchvision-0.16.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4b065143d1a720fe8a9077fd4be35d491f98819ec80b3dbbc3ec64d0b707a906"}, + {file = "torchvision-0.16.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:bc5f274e4ecd1b86062063cdf4fd385a1d39d147a3a2685fbbde9ff08bb720b8"}, + {file = "torchvision-0.16.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:335959c43b371c0474af34c1ef2a52efdc7603c45700d29e4475eeb02984170c"}, + {file = "torchvision-0.16.2-cp38-cp38-win_amd64.whl", hash = "sha256:7fd22d86e08eba321af70cad291020c2cdeac069b00ce88b923ca52e06174769"}, + {file = "torchvision-0.16.2-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:56115268b37f0b75364e3654e47ad9abc66ac34c1f9e5e3dfa89a22d6a40017a"}, + {file = "torchvision-0.16.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:82805f8445b094f9d1e770390ee6cc86855e89955e08ce34af2e2274fc0e5c45"}, + {file = "torchvision-0.16.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:3f4bd5fcbc361476e2e78016636ac7d5509e59d9962521f06eb98e6803898182"}, + {file = "torchvision-0.16.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:8199acdf8ab066a28b84a5b6f4d97b58976d9e164b1acc3a9d14fccfaf74bb3a"}, + {file = "torchvision-0.16.2-cp39-cp39-win_amd64.whl", hash = "sha256:41dd4fa9f176d563fe9f1b9adef3b7e582cdfb60ce8c9bc51b094a025be687c9"}, ] [package.dependencies] numpy = "*" pillow = ">=5.3.0,<8.3.dev0 || >=8.4.dev0" requests = "*" -torch = "2.1.1" +torch = "2.1.2" [package.extras] scipy = ["scipy"] @@ -8198,13 +8225,13 @@ test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0, [[package]] name = "transformers" -version = "4.36.1" +version = "4.36.2" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" optional = true python-versions = ">=3.8.0" files = [ - {file = "transformers-4.36.1-py3-none-any.whl", hash = "sha256:0e309d03634885f02d46801ec4f2c3fc1d614a5b9ebde608181f3e842bac53b8"}, - {file = "transformers-4.36.1.tar.gz", hash = "sha256:28e55952d9bed68f06cf45a3d29cc480679b528afe944e68f8cf6c799e428759"}, + {file = "transformers-4.36.2-py3-none-any.whl", hash = "sha256:462066c4f74ee52516f12890dcc9ec71d1a5e97998db621668455117a54330f6"}, + {file = "transformers-4.36.2.tar.gz", hash = "sha256:d8068e897e47793281501e547d2bbdfc5b8556409c2cb6c3d9e2ca77d4c0b4ec"}, ] [package.dependencies] @@ -8406,13 +8433,13 @@ files = [ [[package]] name = "types-pywin32" -version = "306.0.0.7" +version = "306.0.0.8" description = "Typing stubs for pywin32" optional = false python-versions = ">=3.7" files = [ - {file = "types-pywin32-306.0.0.7.tar.gz", hash = "sha256:0711a7301dec20d6976a179022ca8e2b36bcc7c68cdd38088bb704d5de398e0b"}, - {file = "types_pywin32-306.0.0.7-py3-none-any.whl", hash = "sha256:e20a35530e7d4d95d1447b72c82523316a1a19a0a43d93ab45dc4bb53109cc3c"}, + {file = "types-pywin32-306.0.0.8.tar.gz", hash = "sha256:d6386feba7d2a86ee66294850d998d5bf7dc1d58f782ba4d3333e53063b259b0"}, + {file = "types_pywin32-306.0.0.8-py3-none-any.whl", hash = "sha256:406307352c66c4050093099da696ed38993ec8e55f8d0c1a658223f37d9caa3a"}, ] [[package]] @@ -8522,13 +8549,13 @@ devenv = ["check-manifest", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3) [[package]] name = "unstructured" -version = "0.11.2" +version = "0.11.5" description = "A library that prepares raw documents for downstream ML tasks." optional = false python-versions = ">=3.7.0" files = [ - {file = "unstructured-0.11.2-py3-none-any.whl", hash = "sha256:4c77696f159afb1ac8d0806ec4e22d473dc7440b775728709a535f660fb2cd13"}, - {file = "unstructured-0.11.2.tar.gz", hash = "sha256:68292dfd1616a3e428ac314d6efd4e473c9363c1b2b0ae799031916eee3cc0a4"}, + {file = "unstructured-0.11.5-py3-none-any.whl", hash = "sha256:90c4d027ba8462776c22880daacedd8e379af285c8df7c42598379e258f2a600"}, + {file = "unstructured-0.11.5.tar.gz", hash = "sha256:b50f2d9ca665a000ff8462a9eb57bda997257c7d3df6c2d5bace1569f7f0ebf7"}, ] [package.dependencies] @@ -8548,11 +8575,12 @@ rapidfuzz = "*" requests = "*" tabulate = "*" typing-extensions = "*" +unstructured-client = "*" wrapt = "*" [package.extras] airtable = ["pyairtable"] -all-docs = ["markdown", "msg-parser", "networkx", "onnx", "openpyxl", "pandas", "pdf2image", "pdfminer.six", "pikepdf", "pypandoc", "pypdf", "python-docx (>=1.1.0)", "python-pptx (<=0.6.23)", "unstructured-inference (==0.7.15)", "unstructured.pytesseract (>=0.3.12)", "xlrd"] +all-docs = ["markdown", "msg-parser", "networkx", "onnx", "openpyxl", "pandas", "pdf2image", "pdfminer.six", "pikepdf", "pypandoc", "pypdf", "python-docx (>=1.1.0)", "python-pptx (<=0.6.23)", "unstructured-inference (==0.7.18)", "unstructured.pytesseract (>=0.3.12)", "xlrd"] azure = ["adlfs", "fsspec (==2023.9.1)"] azure-cognitive-search = ["azure-search-documents"] bedrock = ["boto3", "langchain"] @@ -8574,9 +8602,9 @@ gitlab = ["python-gitlab"] google-drive = ["google-api-python-client"] hubspot = ["hubspot-api-client", "urllib3 (>=1.26.17)"] huggingface = ["langdetect", "sacremoses", "sentencepiece", "torch", "transformers"] -image = ["onnx", "pdf2image", "pdfminer.six", "pikepdf", "pypdf", "unstructured-inference (==0.7.15)", "unstructured.pytesseract (>=0.3.12)"] +image = ["onnx", "pdf2image", "pdfminer.six", "pikepdf", "pypdf", "unstructured-inference (==0.7.18)", "unstructured.pytesseract (>=0.3.12)"] jira = ["atlassian-python-api"] -local-inference = ["markdown", "msg-parser", "networkx", "onnx", "openpyxl", "pandas", "pdf2image", "pdfminer.six", "pikepdf", "pypandoc", "pypdf", "python-docx (>=1.1.0)", "python-pptx (<=0.6.23)", "unstructured-inference (==0.7.15)", "unstructured.pytesseract (>=0.3.12)", "xlrd"] +local-inference = ["markdown", "msg-parser", "networkx", "onnx", "openpyxl", "pandas", "pdf2image", "pdfminer.six", "pikepdf", "pypandoc", "pypdf", "python-docx (>=1.1.0)", "python-pptx (<=0.6.23)", "unstructured-inference (==0.7.18)", "unstructured.pytesseract (>=0.3.12)", "xlrd"] md = ["markdown"] mongodb = ["pymongo"] msg = ["msg-parser"] @@ -8587,7 +8615,7 @@ openai = ["langchain", "openai", "tiktoken"] org = ["pypandoc"] outlook = ["Office365-REST-Python-Client (<2.4.3)", "msal"] paddleocr = ["unstructured.paddleocr (==2.6.1.3)"] -pdf = ["onnx", "pdf2image", "pdfminer.six", "pikepdf", "pypdf", "unstructured-inference (==0.7.15)", "unstructured.pytesseract (>=0.3.12)"] +pdf = ["onnx", "pdf2image", "pdfminer.six", "pikepdf", "pypdf", "unstructured-inference (==0.7.18)", "unstructured.pytesseract (>=0.3.12)"] pinecone = ["pinecone-client"] ppt = ["python-pptx (<=0.6.23)"] pptx = ["python-pptx (<=0.6.23)"] @@ -8596,12 +8624,44 @@ rst = ["pypandoc"] rtf = ["pypandoc"] s3 = ["fsspec (==2023.9.1)", "s3fs"] salesforce = ["simple-salesforce"] +sftp = ["fsspec", "paramiko"] sharepoint = ["Office365-REST-Python-Client (<2.4.3)", "msal"] slack = ["slack-sdk"] tsv = ["pandas"] +weaviate = ["weaviate-client"] wikipedia = ["wikipedia"] xlsx = ["networkx", "openpyxl", "pandas", "xlrd"] +[[package]] +name = "unstructured-client" +version = "0.15.0" +description = "Python Client SDK for Unstructured API" +optional = false +python-versions = ">=3.8" +files = [ + {file = "unstructured-client-0.15.0.tar.gz", hash = "sha256:d091e0dcd926f24a356c3cf80e4e3151668c60322fa357bb66419ac59a5672a5"}, + {file = "unstructured_client-0.15.0-py3-none-any.whl", hash = "sha256:7b8640be5b163a8554870959be411ca7c5f39ba5a5c31d83cb7fecda974f5042"}, +] + +[package.dependencies] +certifi = ">=2023.7.22" +charset-normalizer = ">=3.2.0" +dataclasses-json = ">=0.6.1" +idna = ">=3.4" +jsonpath-python = ">=1.0.6" +marshmallow = ">=3.19.0" +mypy-extensions = ">=1.0.0" +packaging = ">=23.1" +python-dateutil = ">=2.8.2" +requests = ">=2.31.0" +six = ">=1.16.0" +typing-extensions = ">=4.7.1" +typing-inspect = ">=0.9.0" +urllib3 = ">=1.26.18" + +[package.extras] +dev = ["pylint (==2.16.2)"] + [[package]] name = "uritemplate" version = "4.1.1" @@ -9160,13 +9220,13 @@ multidict = ">=4.0" [[package]] name = "zep-python" -version = "1.4.2" +version = "1.5.0" description = "Zep: Fast, scalable building blocks for LLM apps. This is the Python client for the Zep service." optional = false python-versions = ">=3.8.1,<4" files = [ - {file = "zep_python-1.4.2-py3-none-any.whl", hash = "sha256:f65bac047fdbf9c10bdab347e2b3bab86c0e5ea480438f63c253205c345993f4"}, - {file = "zep_python-1.4.2.tar.gz", hash = "sha256:ef60083c626d97ac3435814e76194a334f76f7d3ffccb36d56ae93595aa501fa"}, + {file = "zep_python-1.5.0-py3-none-any.whl", hash = "sha256:381b12d62827b7ddfe2a64ffd30e295794fdc12c61e4a781b0f7930d278923e0"}, + {file = "zep_python-1.5.0.tar.gz", hash = "sha256:519668250d56c9165b5786e032b98c755b1d5dbb1af46d19580123ac82d2da5c"}, ] [package.dependencies] diff --git a/src/backend/langflow/template/frontend_node/memories.py b/src/backend/langflow/template/frontend_node/memories.py index bbf1c9a8d..fc9df6291 100644 --- a/src/backend/langflow/template/frontend_node/memories.py +++ b/src/backend/langflow/template/frontend_node/memories.py @@ -1,14 +1,15 @@ from typing import Optional +from langchain_community.chat_message_histories.mongodb import ( + DEFAULT_COLLECTION_NAME, + DEFAULT_DBNAME, +) +from langchain_community.chat_message_histories.postgres import DEFAULT_CONNECTION_STRING + from langflow.template.field.base import TemplateField from langflow.template.frontend_node.base import FrontendNode from langflow.template.frontend_node.constants import INPUT_KEY_INFO, OUTPUT_KEY_INFO from langflow.template.template.base import Template -from langchain.memory.chat_message_histories.postgres import DEFAULT_CONNECTION_STRING -from langchain.memory.chat_message_histories.mongodb import ( - DEFAULT_COLLECTION_NAME, - DEFAULT_DBNAME, -) class MemoryFrontendNode(FrontendNode): From 215a171171d3816879be0a909fb22ce9bb7f6b32 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 19 Dec 2023 13:42:25 -0300 Subject: [PATCH 156/203] Update version to 0.6.3a2 in pyproject.toml --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 04e4cd5d5..61f36daf2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langflow" -version = "0.6.3a1" +version = "0.6.3a2" description = "A Python package with a built-in web application" authors = ["Logspace "] maintainers = [ From 3a5320a0986e680b89612fd632530cfa4803729b Mon Sep 17 00:00:00 2001 From: Yassine Selmi Date: Tue, 19 Dec 2023 18:36:29 +0000 Subject: [PATCH 157/203] Migrated Weaviate to custom component --- .../components/vectorstores/Weaviate.py | 79 +++++++++++++++++++ src/frontend/src/utils/styleUtils.ts | 2 + 2 files changed, 81 insertions(+) create mode 100644 src/backend/langflow/components/vectorstores/Weaviate.py diff --git a/src/backend/langflow/components/vectorstores/Weaviate.py b/src/backend/langflow/components/vectorstores/Weaviate.py new file mode 100644 index 000000000..2e03ca6d4 --- /dev/null +++ b/src/backend/langflow/components/vectorstores/Weaviate.py @@ -0,0 +1,79 @@ +import weaviate # type: ignore +from typing import Optional, Union +from langflow import CustomComponent + +from langchain.vectorstores import Weaviate +from langchain.schema import Document +from langchain.vectorstores.base import VectorStore +from langchain.schema import BaseRetriever +from langchain.embeddings.base import Embeddings + + +class WeaviateVectorStore(CustomComponent): + display_name: str = "Weaviate" + description: str = "Implementation of Vector Store using Weaviate" + documentation = ( + "https://python.langchain.com/docs/integrations/vectorstores/weaviate" + ) + beta = True + field_config = { + "url": {"display_name": "Weaviate URL", "value": "http://localhost:8080"}, + "api_key": { "display_name": "API Key", "password": True,"required": False, }, + "index_name": {"display_name": "Index name","required": False,}, + "text_key": {"display_name": "Text Key","required": False, "advanced": True, "value": "text"}, + "documents": {"display_name": "Documents", "is_list": True}, + "embedding": {"display_name": "Embedding"}, + "attributes": {"display_name": "Attributes", "required": False, "is_list": True, "field_type": "str", "advanced": True}, + "search_by_text": {"display_name": "Search By Text", "field_type": "bool", "advanced": True}, + "code": {"show": False}, + } + + def build( + self, + url: str, + search_by_text: bool = False, + api_key: Optional[str] = None, + index_name: Optional[str] = None, + text_key: Optional[str] = "text", + embedding: Optional[Embeddings] = None, + documents: Optional[Document] = None, + attributes: Optional[list] = None, + ) -> Union[VectorStore, BaseRetriever]: + if api_key: + auth_config = weaviate.AuthApiKey(api_key=api_key) + client = weaviate.Client(url=url, auth_client_secret=auth_config) + else: + client = weaviate.Client(url=url) + + def _to_pascal_case(word: str): + if word and not word[0].isupper(): + word = word.capitalize() + + if word.isidentifier(): + return word + + word = word.replace("-", " ").replace("_", " ") + parts = word.split() + pascal_case_word = "".join([part.capitalize() for part in parts]) + + return pascal_case_word + + index_name = _to_pascal_case(index_name) if index_name else None + + if documents is not None and embedding is not None: + return Weaviate.from_documents( + client=client, + index_name=index_name, + documents=documents, + embedding=embedding, + by_text=search_by_text, + ) + + return Weaviate( + client=client, + index_name=index_name, + text_key=text_key, + embedding=embedding, + by_text=search_by_text, + attributes=attributes if attributes is not None else [], + ) diff --git a/src/frontend/src/utils/styleUtils.ts b/src/frontend/src/utils/styleUtils.ts index d8e96207d..4c1151cc3 100644 --- a/src/frontend/src/utils/styleUtils.ts +++ b/src/frontend/src/utils/styleUtils.ts @@ -129,6 +129,7 @@ import { NotionIcon } from "../icons/Notion"; import { OpenAiIcon } from "../icons/OpenAi"; import { PineconeIcon } from "../icons/Pinecone"; import { QDrantIcon } from "../icons/QDrant"; +import { WeaviateIcon } from "../icons/Weaviate"; import { SearxIcon } from "../icons/Searx"; import { ShareIcon } from "../icons/Share"; import { Share2Icon } from "../icons/Share2"; @@ -254,6 +255,7 @@ export const nodeIconsLucide: iconsType = { OpenAIEmbeddings: OpenAiIcon, Pinecone: PineconeIcon, Qdrant: QDrantIcon, + Weaviate: WeaviateIcon, Searx: SearxIcon, SlackDirectoryLoader: SvgSlackIcon, SupabaseVectorStore: SupabaseIcon, From 843e7a6b50c47c7d1524907226fdb065ec979adb Mon Sep 17 00:00:00 2001 From: Yassine Selmi Date: Tue, 19 Dec 2023 18:45:14 +0000 Subject: [PATCH 158/203] Removed Weaviate from config.yaml --- src/backend/langflow/config.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/backend/langflow/config.yaml b/src/backend/langflow/config.yaml index 186bfa621..a30637e0d 100644 --- a/src/backend/langflow/config.yaml +++ b/src/backend/langflow/config.yaml @@ -270,8 +270,6 @@ vectorstores: # documentation: "https://python.langchain.com/docs/modules/data_connection/vectorstores/integrations/chroma" Qdrant: documentation: "https://python.langchain.com/docs/modules/data_connection/vectorstores/integrations/qdrant" - Weaviate: - documentation: "https://python.langchain.com/docs/modules/data_connection/vectorstores/integrations/weaviate" FAISS: documentation: "https://python.langchain.com/docs/modules/data_connection/vectorstores/integrations/faiss" Pinecone: From 85fc2c10132e3f8d62600357631842b954a55262 Mon Sep 17 00:00:00 2001 From: Yassine Selmi Date: Tue, 19 Dec 2023 20:39:53 +0000 Subject: [PATCH 159/203] Cleanup AgentInitializer component --- src/backend/langflow/custom/customs.py | 1 - .../langflow/interface/agents/custom.py | 36 ------------- .../langflow/template/frontend_node/agents.py | 51 ------------------- 3 files changed, 88 deletions(-) diff --git a/src/backend/langflow/custom/customs.py b/src/backend/langflow/custom/customs.py index 55d855197..fb22c56b3 100644 --- a/src/backend/langflow/custom/customs.py +++ b/src/backend/langflow/custom/customs.py @@ -13,7 +13,6 @@ CUSTOM_NODES = { "agents": { "JsonAgent": frontend_node.agents.JsonAgentNode(), "CSVAgent": frontend_node.agents.CSVAgentNode(), - "AgentInitializer": frontend_node.agents.InitializeAgentNode(), "VectorStoreAgent": frontend_node.agents.VectorStoreAgentNode(), "VectorStoreRouterAgent": frontend_node.agents.VectorStoreRouterAgentNode(), "SQLAgent": frontend_node.agents.SQLAgentNode(), diff --git a/src/backend/langflow/interface/agents/custom.py b/src/backend/langflow/interface/agents/custom.py index 512623ef2..60ef3eafb 100644 --- a/src/backend/langflow/interface/agents/custom.py +++ b/src/backend/langflow/interface/agents/custom.py @@ -264,45 +264,9 @@ class VectorStoreRouterAgent(CustomAgentExecutor): return super().run(*args, **kwargs) -class InitializeAgent(CustomAgentExecutor): - """Implementation of AgentInitializer function""" - - @staticmethod - def function_name(): - return "AgentInitializer" - - @classmethod - def initialize( - cls, - llm: BaseLanguageModel, - tools: List[Tool], - agent: str, - memory: Optional[BaseChatMemory] = None, - ): - # Find which value in the AgentType enum corresponds to the string - # passed in as agent - agent = AgentType(agent) - return initialize_agent( - tools=tools, - llm=llm, - # LangChain now uses Enum for agent, but we still support string - agent=agent, # type: ignore - memory=memory, - return_intermediate_steps=True, - handle_parsing_errors=True, - ) - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - def run(self, *args, **kwargs): - return super().run(*args, **kwargs) - - CUSTOM_AGENTS = { "JsonAgent": JsonAgent, "CSVAgent": CSVAgent, - "AgentInitializer": InitializeAgent, "VectorStoreAgent": VectorStoreAgent, "VectorStoreRouterAgent": VectorStoreRouterAgent, "SQLAgent": SQLAgent, diff --git a/src/backend/langflow/template/frontend_node/agents.py b/src/backend/langflow/template/frontend_node/agents.py index b2a08d944..361abf531 100644 --- a/src/backend/langflow/template/frontend_node/agents.py +++ b/src/backend/langflow/template/frontend_node/agents.py @@ -146,57 +146,6 @@ class CSVAgentNode(FrontendNode): base_classes: list[str] = ["AgentExecutor"] -class InitializeAgentNode(FrontendNode): - name: str = "AgentInitializer" - display_name: str = "AgentInitializer" - template: Template = Template( - type_name="initialize_agent", - fields=[ - TemplateField( - field_type="str", # pyright: ignore - required=True, - is_list=True, # pyright: ignore - show=True, - multiline=False, - options=list(NON_CHAT_AGENTS.keys()), - value=list(NON_CHAT_AGENTS.keys())[0], - name="agent", - advanced=False, - ), - TemplateField( - field_type="BaseChatMemory", # pyright: ignore - required=False, - show=True, - name="memory", - advanced=False, - ), - TemplateField( - field_type="Tool", # pyright: ignore - required=True, - show=True, - name="tools", - is_list=True, # pyright: ignore - advanced=False, - ), - TemplateField( - field_type="BaseLanguageModel", # pyright: ignore - required=True, - show=True, - name="llm", - display_name="LLM", - advanced=False, - ), - ], - ) - description: str = """Construct a zero shot agent from an LLM and tools.""" - base_classes: list[str] = ["AgentExecutor", "Callable"] - - @staticmethod - def format_field(field: TemplateField, name: Optional[str] = None) -> None: - # do nothing and don't return anything - pass - - class JsonAgentNode(FrontendNode): name: str = "JsonAgent" template: Template = Template( From 4197bd4b24e4f1a2ba15450d119af783298cfb1b Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 19 Dec 2023 18:22:18 -0300 Subject: [PATCH 160/203] Refactor API endpoints and remove unnecessary imports --- src/backend/langflow/api/v1/endpoints.py | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/src/backend/langflow/api/v1/endpoints.py b/src/backend/langflow/api/v1/endpoints.py index aef197403..1dc4cac74 100644 --- a/src/backend/langflow/api/v1/endpoints.py +++ b/src/backend/langflow/api/v1/endpoints.py @@ -3,9 +3,6 @@ from typing import Annotated, Optional, Union import sqlalchemy as sa from fastapi import APIRouter, Body, Depends, HTTPException, UploadFile, status -from loguru import logger -from sqlmodel import select - from langflow.api.utils import update_frontend_node_with_template_values from langflow.api.v1.schemas import ( CustomComponentCode, @@ -23,6 +20,8 @@ from langflow.services.cache.utils import save_uploaded_file from langflow.services.database.models.flow import Flow from langflow.services.database.models.user.model import User from langflow.services.deps import get_session, get_session_service, get_settings_service, get_task_service +from loguru import logger +from sqlmodel import select try: from langflow.worker import process_graph_cached_task @@ -32,9 +31,8 @@ except ImportError: raise NotImplementedError("Celery is not installed") -from sqlmodel import Session - from langflow.services.task.service import TaskService +from sqlmodel import Session # build router router = APIRouter(tags=["Base"]) @@ -51,6 +49,7 @@ async def process_graph_data( ): task_result = None task_status = None + task_id = None if tweaks: try: graph_data = process_tweaks(graph_data, tweaks) @@ -79,19 +78,9 @@ async def process_graph_data( if session_id is None: # Generate a session ID session_id = get_session_service().generate_key(session_id=session_id, data_graph=graph_data) - task_id, task = await task_service.launch_task( - process_graph_cached_task if task_service.use_celery else process_graph_cached, - graph_data, - inputs, - clear_cache, - session_id, + result = process_graph_cached( + data_graph=graph_data, inputs=inputs, clear_cache=clear_cache, session_id=session_id ) - task_status = task.status - if task.status == "FAILURE": - logger.error(f"Task {task_id} failed: {task.traceback}") - task_result = str(task._exception) - else: - task_result = task.result if task_id: task_response = TaskResponse(id=task_id, href=f"api/v1/task/{task_id}") From f5e395232485cde74d76174462e9e6bf4f15b9e7 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 19 Dec 2023 18:22:49 -0300 Subject: [PATCH 161/203] Update version to 0.6.3a3 in pyproject.toml --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 61f36daf2..eb229ffce 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langflow" -version = "0.6.3a2" +version = "0.6.3a3" description = "A Python package with a built-in web application" authors = ["Logspace "] maintainers = [ From df443d7986fa556ee8ae39b406f4d06fba6ba9c0 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 20 Dec 2023 08:17:46 -0300 Subject: [PATCH 162/203] Add pretty-quick package for code formatting --- src/frontend/package-lock.json | 501 +++++++++++++++++++++++++++++++++ src/frontend/package.json | 1 + 2 files changed, 502 insertions(+) diff --git a/src/frontend/package-lock.json b/src/frontend/package-lock.json index 21bc83720..94319da10 100644 --- a/src/frontend/package-lock.json +++ b/src/frontend/package-lock.json @@ -94,6 +94,7 @@ "prettier": "^2.8.8", "prettier-plugin-organize-imports": "^3.2.3", "prettier-plugin-tailwindcss": "^0.3.0", + "pretty-quick": "^3.1.3", "tailwindcss": "^3.3.3", "typescript": "^5.2.2", "vite": "^4.5.1" @@ -3774,6 +3775,12 @@ "@types/unist": "^2" } }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, "node_modules/@types/ms": { "version": "0.7.34", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", @@ -4058,6 +4065,33 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -5611,6 +5645,19 @@ "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/find-versions": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-5.1.0.tgz", @@ -6195,6 +6242,15 @@ } ] }, + "node_modules/ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -6862,6 +6918,18 @@ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -7946,6 +8014,22 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/multimatch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-4.0.0.tgz", + "integrity": "sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==", + "dev": true, + "dependencies": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -8221,6 +8305,42 @@ "node": ">=4" } }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -8293,6 +8413,15 @@ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -8684,6 +8813,172 @@ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, + "node_modules/pretty-quick": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-3.1.3.tgz", + "integrity": "sha512-kOCi2FJabvuh1as9enxYmrnBC6tVMoVOenMaBqRfsvBHB0cbpYHjdQEpSglpASDFEXVwplpcGR4CLEaisYAFcA==", + "dev": true, + "dependencies": { + "chalk": "^3.0.0", + "execa": "^4.0.0", + "find-up": "^4.1.0", + "ignore": "^5.1.4", + "mri": "^1.1.5", + "multimatch": "^4.0.0" + }, + "bin": { + "pretty-quick": "bin/pretty-quick.js" + }, + "engines": { + "node": ">=10.13" + }, + "peerDependencies": { + "prettier": ">=2.0.0" + } + }, + "node_modules/pretty-quick/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-quick/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/pretty-quick/node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/pretty-quick/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-quick/node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/pretty-quick/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-quick/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-quick/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-quick/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-quick/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-quick/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/prismjs": { "version": "1.29.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", @@ -13738,6 +14033,12 @@ "@types/unist": "^2" } }, + "@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, "@types/ms": { "version": "0.7.34", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", @@ -13965,6 +14266,24 @@ "is-array-buffer": "^3.0.1" } }, + "array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true + }, "astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -15040,6 +15359,16 @@ "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, "find-versions": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-5.1.0.tgz", @@ -15436,6 +15765,12 @@ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, + "ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "dev": true + }, "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -15893,6 +16228,15 @@ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -16597,6 +16941,19 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "multimatch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-4.0.0.tgz", + "integrity": "sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==", + "dev": true, + "requires": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + } + }, "mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -16776,6 +17133,30 @@ "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", "dev": true }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -16828,6 +17209,12 @@ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -17014,6 +17401,120 @@ } } }, + "pretty-quick": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-3.1.3.tgz", + "integrity": "sha512-kOCi2FJabvuh1as9enxYmrnBC6tVMoVOenMaBqRfsvBHB0cbpYHjdQEpSglpASDFEXVwplpcGR4CLEaisYAFcA==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "execa": "^4.0.0", + "find-up": "^4.1.0", + "ignore": "^5.1.4", + "mri": "^1.1.5", + "multimatch": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "prismjs": { "version": "1.29.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", diff --git a/src/frontend/package.json b/src/frontend/package.json index 103db8472..d411b70eb 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -116,6 +116,7 @@ "prettier": "^2.8.8", "prettier-plugin-organize-imports": "^3.2.3", "prettier-plugin-tailwindcss": "^0.3.0", + "pretty-quick": "^3.1.3", "tailwindcss": "^3.3.3", "typescript": "^5.2.2", "vite": "^4.5.1" From 481606ef00ab12f5f8bb3452d39ffb28a3c7011f Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 20 Dec 2023 08:17:55 -0300 Subject: [PATCH 163/203] Add unique constraints to tables --- .../006b3990db50_add_unique_constraints.py | 34 +++++++++++-------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/src/backend/langflow/alembic/versions/006b3990db50_add_unique_constraints.py b/src/backend/langflow/alembic/versions/006b3990db50_add_unique_constraints.py index cfdd10578..692dc0413 100644 --- a/src/backend/langflow/alembic/versions/006b3990db50_add_unique_constraints.py +++ b/src/backend/langflow/alembic/versions/006b3990db50_add_unique_constraints.py @@ -8,8 +8,7 @@ Create Date: 2023-12-13 18:55:52.587360 from typing import Sequence, Union from alembic import op -import sqlalchemy as sa # noqa: F401 -import sqlmodel # noqa: F401 + # revision identifiers, used by Alembic. revision: str = '006b3990db50' down_revision: Union[str, None] = '1ef9c4f3765d' @@ -19,27 +18,32 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### - with op.batch_alter_table('apikey', schema=None) as batch_op: - batch_op.create_unique_constraint('uq_apikey_id', ['id']) + try: + with op.batch_alter_table('apikey', schema=None) as batch_op: + batch_op.create_unique_constraint('uq_apikey_id', ['id']) - with op.batch_alter_table('flow', schema=None) as batch_op: - batch_op.create_unique_constraint('uq_flow_id', ['id']) + with op.batch_alter_table('flow', schema=None) as batch_op: + batch_op.create_unique_constraint('uq_flow_id', ['id']) - with op.batch_alter_table('user', schema=None) as batch_op: - batch_op.create_unique_constraint('uq_user_id', ['id']) + with op.batch_alter_table('user', schema=None) as batch_op: + batch_op.create_unique_constraint('uq_user_id', ['id']) + except Exception: + pass # ### end Alembic commands ### def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### - with op.batch_alter_table('user', schema=None) as batch_op: - batch_op.drop_constraint('uq_user_id', type_='unique') + try: + with op.batch_alter_table('user', schema=None) as batch_op: + batch_op.drop_constraint('uq_user_id', type_='unique') - with op.batch_alter_table('flow', schema=None) as batch_op: - batch_op.drop_constraint('uq_flow_id', type_='unique') - - with op.batch_alter_table('apikey', schema=None) as batch_op: - batch_op.drop_constraint('uq_apikey_id', type_='unique') + with op.batch_alter_table('flow', schema=None) as batch_op: + batch_op.drop_constraint('uq_flow_id', type_='unique') + with op.batch_alter_table('apikey', schema=None) as batch_op: + batch_op.drop_constraint('uq_apikey_id', type_='unique') + except Exception: + pass # ### end Alembic commands ### From c58837d65dfb209642a6c0a030842fba77b5874f Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 20 Dec 2023 14:17:12 -0300 Subject: [PATCH 164/203] Refactor process_graph_data function to use task_service.launch_task and handle task status --- src/backend/langflow/api/v1/endpoints.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/backend/langflow/api/v1/endpoints.py b/src/backend/langflow/api/v1/endpoints.py index 1dc4cac74..2d993cb6b 100644 --- a/src/backend/langflow/api/v1/endpoints.py +++ b/src/backend/langflow/api/v1/endpoints.py @@ -49,20 +49,19 @@ async def process_graph_data( ): task_result = None task_status = None - task_id = None if tweaks: try: graph_data = process_tweaks(graph_data, tweaks) except Exception as exc: logger.error(f"Error processing tweaks: {exc}") if sync: - task_id, result = await task_service.launch_and_await_task( - process_graph_cached_task if task_service.use_celery else process_graph_cached, + result = await process_graph_cached( graph_data, inputs, clear_cache, session_id, ) + task_id = str(id(result)) if isinstance(result, dict) and "result" in result: task_result = result["result"] session_id = result["session_id"] @@ -78,9 +77,19 @@ async def process_graph_data( if session_id is None: # Generate a session ID session_id = get_session_service().generate_key(session_id=session_id, data_graph=graph_data) - result = process_graph_cached( - data_graph=graph_data, inputs=inputs, clear_cache=clear_cache, session_id=session_id + task_id, task = await task_service.launch_task( + process_graph_cached_task if task_service.use_celery else process_graph_cached, + graph_data, + inputs, + clear_cache, + session_id, ) + task_status = task.status + if task.status == "FAILURE": + logger.error(f"Task {task_id} failed: {task.traceback}") + task_result = str(task._exception) + else: + task_result = task.result if task_id: task_response = TaskResponse(id=task_id, href=f"api/v1/task/{task_id}") From 84f9c34bd18f8d1d015290e5b068c98f250a9a5d Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 20 Dec 2023 14:18:42 -0300 Subject: [PATCH 165/203] Else clause for task_result --- src/backend/langflow/api/v1/endpoints.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/backend/langflow/api/v1/endpoints.py b/src/backend/langflow/api/v1/endpoints.py index 2d993cb6b..df8418e97 100644 --- a/src/backend/langflow/api/v1/endpoints.py +++ b/src/backend/langflow/api/v1/endpoints.py @@ -3,6 +3,9 @@ from typing import Annotated, Optional, Union import sqlalchemy as sa from fastapi import APIRouter, Body, Depends, HTTPException, UploadFile, status +from loguru import logger +from sqlmodel import select + from langflow.api.utils import update_frontend_node_with_template_values from langflow.api.v1.schemas import ( CustomComponentCode, @@ -20,8 +23,6 @@ from langflow.services.cache.utils import save_uploaded_file from langflow.services.database.models.flow import Flow from langflow.services.database.models.user.model import User from langflow.services.deps import get_session, get_session_service, get_settings_service, get_task_service -from loguru import logger -from sqlmodel import select try: from langflow.worker import process_graph_cached_task @@ -31,9 +32,10 @@ except ImportError: raise NotImplementedError("Celery is not installed") -from langflow.services.task.service import TaskService from sqlmodel import Session +from langflow.services.task.service import TaskService + # build router router = APIRouter(tags=["Base"]) @@ -69,6 +71,8 @@ async def process_graph_data( task_result = result.result session_id = result.session_id + else: + task_result = result else: logger.warning( "This is an experimental feature and may not work as expected." From c4daf5095ac231a963d465f8c4a55b844ce34e9d Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 20 Dec 2023 14:18:48 -0300 Subject: [PATCH 166/203] Add async/await to generate_result function --- src/backend/langflow/processing/process.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/backend/langflow/processing/process.py b/src/backend/langflow/processing/process.py index 4b7cf8470..03587cd29 100644 --- a/src/backend/langflow/processing/process.py +++ b/src/backend/langflow/processing/process.py @@ -118,7 +118,7 @@ def process_inputs(inputs: Optional[dict], artifacts: Dict[str, Any]) -> dict: return inputs -def generate_result(langchain_object: Union[Chain, VectorStore], inputs: dict): +async def generate_result(langchain_object: Union[Chain, VectorStore], inputs: dict): if isinstance(langchain_object, Chain): if inputs is None: raise ValueError("Inputs must be provided for a Chain") @@ -131,7 +131,11 @@ def generate_result(langchain_object: Union[Chain, VectorStore], inputs: dict): elif isinstance(langchain_object, Document): result = langchain_object.dict() elif isinstance(langchain_object, Runnable): - result = langchain_object.invoke(inputs) + if isinstance(inputs, List): + call_func = langchain_object.abatch + elif isinstance(inputs, dict): + call_func = langchain_object.ainvoke + result = await call_func(inputs) result = result.content if hasattr(result, "content") else result elif hasattr(langchain_object, "run") and isinstance(langchain_object, CustomComponent): result = langchain_object.run(inputs) @@ -152,7 +156,7 @@ class Result(BaseModel): async def process_graph_cached( data_graph: Dict[str, Any], - inputs: Optional[dict] = None, + inputs: Optional[Union[dict, List[dict]]] = None, clear_cache=False, session_id=None, ) -> Result: @@ -168,7 +172,7 @@ async def process_graph_cached( raise ValueError("Graph not found in the session") built_object = await graph.build() processed_inputs = process_inputs(inputs, artifacts or {}) - result = generate_result(built_object, processed_inputs) + result = await generate_result(built_object, processed_inputs) # langchain_object is now updated with the new memory # we need to update the cache with the updated langchain_object session_service.update_session(session_id, (graph, artifacts)) From 4751e91e909f31aea6838dd94670dbd96d89c18d Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 20 Dec 2023 14:19:04 -0300 Subject: [PATCH 167/203] Update langflow worker.py with async_to_sync for generate_result --- src/backend/langflow/worker.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/backend/langflow/worker.py b/src/backend/langflow/worker.py index a66c35b78..5a55c3c90 100644 --- a/src/backend/langflow/worker.py +++ b/src/backend/langflow/worker.py @@ -2,12 +2,13 @@ from typing import TYPE_CHECKING, Any, Dict, Optional from asgiref.sync import async_to_sync from celery.exceptions import SoftTimeLimitExceeded # type: ignore +from loguru import logger +from rich import print + from langflow.core.celery_app import celery_app from langflow.processing.process import Result, generate_result, process_inputs from langflow.services.deps import get_session_service from langflow.services.manager import initialize_session_service -from loguru import logger -from rich import print if TYPE_CHECKING: from langflow.graph.vertex.base import Vertex @@ -62,7 +63,7 @@ def process_graph_cached_task( logger.debug(f"Built object: {built_object}") processed_inputs = process_inputs(inputs, artifacts or {}) - result = generate_result(built_object, processed_inputs) + result = async_to_sync(generate_result, force_new_loop=True)(built_object, processed_inputs) # Update the session with the new data session_service.update_session(session_id, (graph, artifacts)) From c8992efc537a1687459d55c2ca53e76f93f99ce1 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 20 Dec 2023 14:20:22 -0300 Subject: [PATCH 168/203] Update version to 0.6.3a4 in pyproject.toml --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index eb229ffce..2856cd97a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langflow" -version = "0.6.3a3" +version = "0.6.3a4" description = "A Python package with a built-in web application" authors = ["Logspace "] maintainers = [ From 1148c65c5ef2b742206b955b8f778f413ce0f94e Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 20 Dec 2023 14:41:49 -0300 Subject: [PATCH 169/203] Update type hints for inputs parameter in process_graph_data and process functions --- src/backend/langflow/api/v1/endpoints.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/backend/langflow/api/v1/endpoints.py b/src/backend/langflow/api/v1/endpoints.py index df8418e97..99b7d5427 100644 --- a/src/backend/langflow/api/v1/endpoints.py +++ b/src/backend/langflow/api/v1/endpoints.py @@ -1,5 +1,5 @@ from http import HTTPStatus -from typing import Annotated, Optional, Union +from typing import Annotated, List, Optional, Union import sqlalchemy as sa from fastapi import APIRouter, Body, Depends, HTTPException, UploadFile, status @@ -42,7 +42,7 @@ router = APIRouter(tags=["Base"]) async def process_graph_data( graph_data: dict, - inputs: Optional[dict] = None, + inputs: Optional[Union[List[dict], dict]] = None, tweaks: Optional[dict] = None, clear_cache: bool = False, session_id: Optional[str] = None, @@ -160,7 +160,7 @@ async def process_json( async def process( session: Annotated[Session, Depends(get_session)], flow_id: str, - inputs: Optional[dict] = None, + inputs: Optional[Union[List[dict], dict]] = None, tweaks: Optional[dict] = None, clear_cache: Annotated[bool, Body(embed=True)] = False, # noqa: F821 session_id: Annotated[Union[None, str], Body(embed=True)] = None, # noqa: F821 From 931a2452eb730a440d3059c52b4982d93d295581 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 20 Dec 2023 14:41:55 -0300 Subject: [PATCH 170/203] Refactor result handling in generate_result function --- src/backend/langflow/processing/process.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/backend/langflow/processing/process.py b/src/backend/langflow/processing/process.py index 03587cd29..766027bdf 100644 --- a/src/backend/langflow/processing/process.py +++ b/src/backend/langflow/processing/process.py @@ -136,7 +136,12 @@ async def generate_result(langchain_object: Union[Chain, VectorStore], inputs: d elif isinstance(inputs, dict): call_func = langchain_object.ainvoke result = await call_func(inputs) - result = result.content if hasattr(result, "content") else result + if isinstance(result, list): + result = [r.content if hasattr(r, "content") else r for r in result] + elif hasattr(result, "content"): + result = result.content + else: + result = result elif hasattr(langchain_object, "run") and isinstance(langchain_object, CustomComponent): result = langchain_object.run(inputs) From 3586ba8469782a38f774e56497be3700f93f485b Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 20 Dec 2023 14:53:15 -0300 Subject: [PATCH 171/203] Refactor process.py: Add import statements and update generate_result function --- src/backend/langflow/processing/process.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/backend/langflow/processing/process.py b/src/backend/langflow/processing/process.py index 766027bdf..982ccc6f1 100644 --- a/src/backend/langflow/processing/process.py +++ b/src/backend/langflow/processing/process.py @@ -6,11 +6,12 @@ from langchain.chains.base import Chain from langchain.schema import AgentAction, Document from langchain.vectorstores.base import VectorStore from langchain_core.runnables.base import Runnable +from loguru import logger +from pydantic import BaseModel + from langflow.components.custom_components import CustomComponent from langflow.interface.run import build_sorted_vertices, get_memory_key, update_memory_keys from langflow.services.deps import get_session_service -from loguru import logger -from pydantic import BaseModel def fix_memory_inputs(langchain_object): @@ -118,7 +119,7 @@ def process_inputs(inputs: Optional[dict], artifacts: Dict[str, Any]) -> dict: return inputs -async def generate_result(langchain_object: Union[Chain, VectorStore], inputs: dict): +async def generate_result(langchain_object: Union[Chain, VectorStore, Runnable], inputs: Union[dict, List[dict]]): if isinstance(langchain_object, Chain): if inputs is None: raise ValueError("Inputs must be provided for a Chain") @@ -131,11 +132,15 @@ async def generate_result(langchain_object: Union[Chain, VectorStore], inputs: d elif isinstance(langchain_object, Document): result = langchain_object.dict() elif isinstance(langchain_object, Runnable): - if isinstance(inputs, List): - call_func = langchain_object.abatch - elif isinstance(inputs, dict): - call_func = langchain_object.ainvoke - result = await call_func(inputs) + # Define call_method as a coroutine function + # by default + if isinstance(inputs, List) and hasattr(langchain_object, "abatch"): + call_method = langchain_object.abatch + elif isinstance(inputs, dict) and hasattr(langchain_object, "ainvoke"): + call_method = langchain_object.ainvoke + else: + raise ValueError("Inputs must be provided for a Runnable") + result = await call_method(inputs) if isinstance(result, list): result = [r.content if hasattr(r, "content") else r for r in result] elif hasattr(result, "content"): From c5134d2e372ea7e2320b8e3f88e6a1ad022c38b2 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 20 Dec 2023 14:53:21 -0300 Subject: [PATCH 172/203] Update version to 0.6.3a5 in pyproject.toml --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 2856cd97a..7aed748cc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langflow" -version = "0.6.3a4" +version = "0.6.3a5" description = "A Python package with a built-in web application" authors = ["Logspace "] maintainers = [ From b288ae3df36335bacc3ee453d0ac8c4c1d0cc838 Mon Sep 17 00:00:00 2001 From: Yassine Selmi Date: Wed, 20 Dec 2023 17:55:47 +0000 Subject: [PATCH 173/203] Added Azure OpenAI --- .../components/llms/AzureChatOpenAI.py | 83 +++++++++++++++++++ src/frontend/src/utils/styleUtils.ts | 1 + 2 files changed, 84 insertions(+) create mode 100644 src/backend/langflow/components/llms/AzureChatOpenAI.py diff --git a/src/backend/langflow/components/llms/AzureChatOpenAI.py b/src/backend/langflow/components/llms/AzureChatOpenAI.py new file mode 100644 index 000000000..3ebaab32b --- /dev/null +++ b/src/backend/langflow/components/llms/AzureChatOpenAI.py @@ -0,0 +1,83 @@ +from typing import Optional +from langflow import CustomComponent +from langchain.llms.base import BaseLanguageModel +from langchain.chat_models.azure_openai import AzureChatOpenAI + +class AzureChatOpenAIComponent(CustomComponent): + display_name: str = "AzureChatOpenAI" + description: str = "LLM model from Azure OpenAI." + + AZURE_OPENAI_MODELS = [ + "gpt-35-turbo", + "gpt-35-turbo-16k", + "gpt-35-turbo-instruct", + "gpt-4", + "gpt-4-32k", + "gpt-4-vision", + ] + + def build_config(self): + return { + "model": { + "display_name": "Model Name", + "value": "gpt-35-turbo", + "options": self.AZURE_OPENAI_MODELS, + "required": True, + }, + "azure_endpoint": { + "display_name": "Azure Endpoint", + "required": True, + "info": "Your Azure endpoint, including the resource.. Example: `https://example-resource.azure.openai.com/`" + }, + "azure_deployment": { + "display_name": "Deployment Name", + "required": True, + }, + "api_version": { + "display_name": "OpenAI API Version", + "value": "2023-05-15", + "required": True, + "advanced": True, + }, + "api_key": { + "display_name": "OpenAI API Key", + "required": True, + "password": True + }, + "temperature": { + "display_name": "Temperature", + "value": 0.7, + "field_type": "float", + "required": False, + }, + "max_tokens": { + "display_name": "Max Tokens", + "value": 1000, + "required": False, + "field_type": "int", + "advanced": True, + }, + "code": {"show": False}, + } + + def build( + self, + model: str, + azure_endpoint: str, + azure_deployment: str, + api_version: str, + api_key: Optional[str] = "2023-05-15", + temperature: float = 0.7, + max_tokens: Optional[int] = 1000, + ) -> BaseLanguageModel: + + + return AzureChatOpenAI( + model=model, + azure_endpoint=azure_endpoint, + azure_deployment=azure_deployment, + api_version=api_version, + api_key=api_key, + temperature=temperature, + max_tokens=max_tokens + ) diff --git a/src/frontend/src/utils/styleUtils.ts b/src/frontend/src/utils/styleUtils.ts index 4c1151cc3..4e67e0eb9 100644 --- a/src/frontend/src/utils/styleUtils.ts +++ b/src/frontend/src/utils/styleUtils.ts @@ -251,6 +251,7 @@ export const nodeIconsLucide: iconsType = { MongoDBAtlasVectorSearch: MongoDBIcon, NotionDirectoryLoader: NotionIcon, ChatOpenAI: OpenAiIcon, + AzureChatOpenAIComponent: OpenAiIcon, OpenAI: OpenAiIcon, OpenAIEmbeddings: OpenAiIcon, Pinecone: PineconeIcon, From 28fe0982e6f5688528137810603b3f2cbf8c2427 Mon Sep 17 00:00:00 2001 From: Yassine Selmi Date: Wed, 20 Dec 2023 18:44:58 +0000 Subject: [PATCH 174/203] Added documentation link --- src/backend/langflow/components/llms/AzureChatOpenAI.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/backend/langflow/components/llms/AzureChatOpenAI.py b/src/backend/langflow/components/llms/AzureChatOpenAI.py index 3ebaab32b..04b385c69 100644 --- a/src/backend/langflow/components/llms/AzureChatOpenAI.py +++ b/src/backend/langflow/components/llms/AzureChatOpenAI.py @@ -6,6 +6,7 @@ from langchain.chat_models.azure_openai import AzureChatOpenAI class AzureChatOpenAIComponent(CustomComponent): display_name: str = "AzureChatOpenAI" description: str = "LLM model from Azure OpenAI." + documentation: str = "https://python.langchain.com/docs/integrations/llms/azure_openai" AZURE_OPENAI_MODELS = [ "gpt-35-turbo", From abd9c67d3c9426b676c321a68d24e20717f56df1 Mon Sep 17 00:00:00 2001 From: Yassine Selmi Date: Wed, 20 Dec 2023 20:01:30 +0000 Subject: [PATCH 175/203] Fixed wrong style attribute --- src/frontend/src/utils/styleUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/src/utils/styleUtils.ts b/src/frontend/src/utils/styleUtils.ts index 4e67e0eb9..a7940b67d 100644 --- a/src/frontend/src/utils/styleUtils.ts +++ b/src/frontend/src/utils/styleUtils.ts @@ -251,7 +251,7 @@ export const nodeIconsLucide: iconsType = { MongoDBAtlasVectorSearch: MongoDBIcon, NotionDirectoryLoader: NotionIcon, ChatOpenAI: OpenAiIcon, - AzureChatOpenAIComponent: OpenAiIcon, + AzureChatOpenAI: OpenAiIcon, OpenAI: OpenAiIcon, OpenAIEmbeddings: OpenAiIcon, Pinecone: PineconeIcon, From 1b4a7dc949287accf30c5652a7c0827adf8ef3b5 Mon Sep 17 00:00:00 2001 From: Yassine Selmi Date: Wed, 20 Dec 2023 20:06:57 +0000 Subject: [PATCH 176/203] Fixed default param value --- src/backend/langflow/components/llms/AzureChatOpenAI.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/langflow/components/llms/AzureChatOpenAI.py b/src/backend/langflow/components/llms/AzureChatOpenAI.py index 04b385c69..21a6e1189 100644 --- a/src/backend/langflow/components/llms/AzureChatOpenAI.py +++ b/src/backend/langflow/components/llms/AzureChatOpenAI.py @@ -66,8 +66,8 @@ class AzureChatOpenAIComponent(CustomComponent): model: str, azure_endpoint: str, azure_deployment: str, - api_version: str, - api_key: Optional[str] = "2023-05-15", + api_key: str, + api_version: Optional[str] = "2023-05-15", temperature: float = 0.7, max_tokens: Optional[int] = 1000, ) -> BaseLanguageModel: From 60d715f61d9440af251d9ce9f046b913c2d340b7 Mon Sep 17 00:00:00 2001 From: Yassine Selmi Date: Wed, 20 Dec 2023 20:07:41 +0000 Subject: [PATCH 177/203] Lint --- src/backend/langflow/components/llms/AzureChatOpenAI.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/langflow/components/llms/AzureChatOpenAI.py b/src/backend/langflow/components/llms/AzureChatOpenAI.py index 21a6e1189..9b4064cc1 100644 --- a/src/backend/langflow/components/llms/AzureChatOpenAI.py +++ b/src/backend/langflow/components/llms/AzureChatOpenAI.py @@ -67,7 +67,7 @@ class AzureChatOpenAIComponent(CustomComponent): azure_endpoint: str, azure_deployment: str, api_key: str, - api_version: Optional[str] = "2023-05-15", + api_version: str = "2023-05-15", temperature: float = 0.7, max_tokens: Optional[int] = 1000, ) -> BaseLanguageModel: From 3f7b43d2194da0214199152115feb675c40605a3 Mon Sep 17 00:00:00 2001 From: Yassine Selmi Date: Wed, 20 Dec 2023 20:09:14 +0000 Subject: [PATCH 178/203] Rename attributes --- src/backend/langflow/components/llms/AzureChatOpenAI.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/langflow/components/llms/AzureChatOpenAI.py b/src/backend/langflow/components/llms/AzureChatOpenAI.py index 9b4064cc1..21188d0c3 100644 --- a/src/backend/langflow/components/llms/AzureChatOpenAI.py +++ b/src/backend/langflow/components/llms/AzureChatOpenAI.py @@ -35,13 +35,13 @@ class AzureChatOpenAIComponent(CustomComponent): "required": True, }, "api_version": { - "display_name": "OpenAI API Version", + "display_name": "API Version", "value": "2023-05-15", "required": True, "advanced": True, }, "api_key": { - "display_name": "OpenAI API Key", + "display_name": "API Key", "required": True, "password": True }, From 4a9c7506ead3da8bbae0adf943bc3b8aee1e8136 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 20 Dec 2023 18:56:32 -0300 Subject: [PATCH 179/203] Refactor process.py to improve code structure and readability --- src/backend/langflow/processing/process.py | 77 ++++++++++++++-------- 1 file changed, 49 insertions(+), 28 deletions(-) diff --git a/src/backend/langflow/processing/process.py b/src/backend/langflow/processing/process.py index 982ccc6f1..1fb4b322e 100644 --- a/src/backend/langflow/processing/process.py +++ b/src/backend/langflow/processing/process.py @@ -6,12 +6,11 @@ from langchain.chains.base import Chain from langchain.schema import AgentAction, Document from langchain.vectorstores.base import VectorStore from langchain_core.runnables.base import Runnable -from loguru import logger -from pydantic import BaseModel - -from langflow.components.custom_components import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent from langflow.interface.run import build_sorted_vertices, get_memory_key, update_memory_keys from langflow.services.deps import get_session_service +from loguru import logger +from pydantic import BaseModel def fix_memory_inputs(langchain_object): @@ -119,42 +118,64 @@ def process_inputs(inputs: Optional[dict], artifacts: Dict[str, Any]) -> dict: return inputs -async def generate_result(langchain_object: Union[Chain, VectorStore, Runnable], inputs: Union[dict, List[dict]]): - if isinstance(langchain_object, Chain): +async def process_runnable(runnable: Runnable, inputs: Union[dict, List[dict]]): + if isinstance(inputs, List) and hasattr(runnable, "abatch"): + result = await runnable.abatch(inputs) + elif isinstance(inputs, dict) and hasattr(runnable, "ainvoke"): + result = await runnable.ainvoke(inputs) + else: + raise ValueError(f"Runnable {runnable} does not support inputs of type {type(inputs)}") + return result + + +async def process_inputs_dict(built_object: Union[Chain, VectorStore, Runnable], inputs: dict): + if isinstance(built_object, Chain): if inputs is None: raise ValueError("Inputs must be provided for a Chain") logger.debug("Generating result and thought") - result = get_result_and_thought(langchain_object, inputs) + result = get_result_and_thought(built_object, inputs) logger.debug("Generated result and thought") - elif isinstance(langchain_object, VectorStore): - result = langchain_object.search(**inputs) - elif isinstance(langchain_object, Document): - result = langchain_object.dict() - elif isinstance(langchain_object, Runnable): - # Define call_method as a coroutine function - # by default - if isinstance(inputs, List) and hasattr(langchain_object, "abatch"): - call_method = langchain_object.abatch - elif isinstance(inputs, dict) and hasattr(langchain_object, "ainvoke"): - call_method = langchain_object.ainvoke - else: - raise ValueError("Inputs must be provided for a Runnable") - result = await call_method(inputs) + elif isinstance(built_object, VectorStore) and "query" in inputs: + if isinstance(inputs, dict) and "search_type" not in inputs: + inputs["search_type"] = "similarity" + logger.info("search_type not provided, using default value: similarity") + result = built_object.search(**inputs) + elif isinstance(built_object, Document): + result = built_object.dict() + elif isinstance(built_object, Runnable): + result = await process_runnable(built_object, inputs) if isinstance(result, list): result = [r.content if hasattr(r, "content") else r for r in result] elif hasattr(result, "content"): result = result.content else: result = result - elif hasattr(langchain_object, "run") and isinstance(langchain_object, CustomComponent): - result = langchain_object.run(inputs) - + elif hasattr(built_object, "run") and isinstance(built_object, CustomComponent): + result = built_object.run(inputs) else: - logger.warning(f"Unknown langchain_object type: {type(langchain_object)}") - if isinstance(langchain_object, Coroutine): - result = asyncio.run(langchain_object) - result = langchain_object + result = None + + return result + + +async def process_inputs_list(built_object: Runnable, inputs: List[dict]): + return await process_runnable(built_object, inputs) + + +async def generate_result(built_object: Union[Chain, VectorStore, Runnable], inputs: Union[dict, List[dict]]): + if isinstance(inputs, dict): + result = await process_inputs_dict(built_object, inputs) + elif isinstance(inputs, List) and isinstance(built_object, Runnable): + result = await process_inputs_list(built_object, inputs) + else: + raise ValueError(f"Invalid inputs type: {type(inputs)}") + + if result is None: + logger.warning(f"Unknown built_object type: {type(built_object)}") + if isinstance(built_object, Coroutine): + result = asyncio.run(built_object) + result = built_object return result From 955ef77060eba0151da4b30a37919a33eb926c65 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 20 Dec 2023 21:03:17 -0300 Subject: [PATCH 180/203] Add Redis URL configuration option --- src/backend/langflow/services/cache/factory.py | 1 + src/backend/langflow/services/cache/service.py | 16 +++++++++------- src/backend/langflow/services/settings/base.py | 1 + 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/backend/langflow/services/cache/factory.py b/src/backend/langflow/services/cache/factory.py index 32f726c6b..145f4e653 100644 --- a/src/backend/langflow/services/cache/factory.py +++ b/src/backend/langflow/services/cache/factory.py @@ -22,6 +22,7 @@ class CacheServiceFactory(ServiceFactory): host=settings_service.settings.REDIS_HOST, port=settings_service.settings.REDIS_PORT, db=settings_service.settings.REDIS_DB, + url=settings_service.settings.REDIS_URL, expiration_time=settings_service.settings.REDIS_CACHE_EXPIRE, ) if redis_cache.is_connected(): diff --git a/src/backend/langflow/services/cache/service.py b/src/backend/langflow/services/cache/service.py index 3ee8d001b..ced345851 100644 --- a/src/backend/langflow/services/cache/service.py +++ b/src/backend/langflow/services/cache/service.py @@ -1,14 +1,13 @@ +import pickle import threading import time from collections import OrderedDict -from langflow.services.base import Service - -from langflow.services.cache.base import BaseCacheService - -import pickle from loguru import logger +from langflow.services.base import Service +from langflow.services.cache.base import BaseCacheService + class InMemoryCache(BaseCacheService, Service): @@ -204,7 +203,7 @@ class RedisCache(BaseCacheService, Service): b = cache["b"] """ - def __init__(self, host="localhost", port=6379, db=0, expiration_time=60 * 60): + def __init__(self, host="localhost", port=6379, db=0, url=None, expiration_time=60 * 60): """ Initialize a new RedisCache instance. @@ -226,7 +225,10 @@ class RedisCache(BaseCacheService, Service): "RedisCache is an experimental feature and may not work as expected." " Please report any issues to our GitHub repository." ) - self._client = redis.StrictRedis(host=host, port=port, db=db) + if url: + self._client = redis.StrictRedis.from_url(url) + else: + self._client = redis.StrictRedis(host=host, port=port, db=db) self.expiration_time = expiration_time # check connection diff --git a/src/backend/langflow/services/settings/base.py b/src/backend/langflow/services/settings/base.py index c74d88a42..f68afb0f4 100644 --- a/src/backend/langflow/services/settings/base.py +++ b/src/backend/langflow/services/settings/base.py @@ -47,6 +47,7 @@ class Settings(BaseSettings): REDIS_HOST: str = "localhost" REDIS_PORT: int = 6379 REDIS_DB: int = 0 + REDIS_URL: Optional[str] = None REDIS_CACHE_EXPIRE: int = 3600 # PLUGIN_DIR: Optional[str] = None From cfcfc37928709f13ee45e3a52c172f1893e2a548 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 20 Dec 2023 21:06:09 -0300 Subject: [PATCH 181/203] Add temperature parameter to ConversationalAgent --- .../components/agents/OpenAIConversationalAgent.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/backend/langflow/components/agents/OpenAIConversationalAgent.py b/src/backend/langflow/components/agents/OpenAIConversationalAgent.py index 499775747..66ff0f275 100644 --- a/src/backend/langflow/components/agents/OpenAIConversationalAgent.py +++ b/src/backend/langflow/components/agents/OpenAIConversationalAgent.py @@ -9,7 +9,9 @@ from langchain.prompts import SystemMessagePromptTemplate from langchain.prompts.chat import MessagesPlaceholder from langchain.schema.memory import BaseMemory from langchain.tools import Tool + from langflow import CustomComponent +from langflow.field_typing.range_spec import RangeSpec class ConversationalAgent(CustomComponent): @@ -35,6 +37,11 @@ class ConversationalAgent(CustomComponent): "value": openai_function_models[0], }, "code": {"show": False}, + "temperature": { + "display_name": "Temperature", + "value": 0.2, + "range_spec": RangeSpec(min=0, max=2, step=0.1), + }, } def build( @@ -46,11 +53,14 @@ class ConversationalAgent(CustomComponent): memory: Optional[BaseMemory] = None, system_message: Optional[SystemMessagePromptTemplate] = None, max_token_limit: int = 2000, + temperature: float = 0.9, ) -> AgentExecutor: llm = ChatOpenAI( model=model_name, api_key=openai_api_key, base_url=openai_api_base, + max_tokens=max_token_limit, + temperature=temperature, ) if not memory: memory_key = "chat_history" From 55e9b4ba1c71edb9e5a78686ed0456b55aad7d43 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 21 Dec 2023 14:52:12 -0300 Subject: [PATCH 182/203] Add AIMessage support and update Result model --- src/backend/langflow/processing/process.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/backend/langflow/processing/process.py b/src/backend/langflow/processing/process.py index 1fb4b322e..659141446 100644 --- a/src/backend/langflow/processing/process.py +++ b/src/backend/langflow/processing/process.py @@ -5,12 +5,14 @@ from langchain.agents import AgentExecutor from langchain.chains.base import Chain from langchain.schema import AgentAction, Document from langchain.vectorstores.base import VectorStore +from langchain_core.messages import AIMessage from langchain_core.runnables.base import Runnable +from loguru import logger +from pydantic import BaseModel + from langflow.interface.custom.custom_component import CustomComponent from langflow.interface.run import build_sorted_vertices, get_memory_key, update_memory_keys from langflow.services.deps import get_session_service -from loguru import logger -from pydantic import BaseModel def fix_memory_inputs(langchain_object): @@ -125,6 +127,11 @@ async def process_runnable(runnable: Runnable, inputs: Union[dict, List[dict]]): result = await runnable.ainvoke(inputs) else: raise ValueError(f"Runnable {runnable} does not support inputs of type {type(inputs)}") + # Check if the result is a list of AIMessages + if isinstance(result, list) and all(isinstance(r, AIMessage) for r in result): + result = [r.content for r in result] + elif isinstance(result, AIMessage): + result = result.content return result @@ -181,7 +188,7 @@ async def generate_result(built_object: Union[Chain, VectorStore, Runnable], inp class Result(BaseModel): - result: Any + result: Union[dict, List[dict], str, List[str], AIMessage] session_id: str From 34474166b8a5a33b7eb9c345c607718b9cd3b15b Mon Sep 17 00:00:00 2001 From: cristhianzl Date: Thu, 21 Dec 2023 15:06:41 -0300 Subject: [PATCH 183/203] fix(extraSidebarComponent): update condition to show ExportMemo button based on hasApiKey and validApiKey variables --- .../pages/FlowPage/components/extraSidebarComponent/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/index.tsx b/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/index.tsx index f1618318e..59ab964bc 100644 --- a/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/index.tsx @@ -231,7 +231,7 @@ export default function ExtraSidebar(): JSX.Element { return (
- {hasStore && ( + {hasStore && validApiKey && (
- {!hasStore && ExportMemo} + {(!hasApiKey || !validApiKey) && ExportMemo}
{flow && flow.data && ( From 8306a5bbd88e859b6ff11de751ce7a37175152c9 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 22 Dec 2023 10:39:17 -0300 Subject: [PATCH 184/203] Remove import validation for typing module --- src/backend/langflow/api/v1/endpoints.py | 6 ++-- .../custom_component/custom_component.py | 36 +++---------------- .../langflow/interface/custom/utils.py | 22 ++++-------- src/backend/langflow/utils/validate.py | 15 ++++---- 4 files changed, 20 insertions(+), 59 deletions(-) diff --git a/src/backend/langflow/api/v1/endpoints.py b/src/backend/langflow/api/v1/endpoints.py index 99b7d5427..9bf081163 100644 --- a/src/backend/langflow/api/v1/endpoints.py +++ b/src/backend/langflow/api/v1/endpoints.py @@ -16,7 +16,7 @@ from langflow.api.v1.schemas import ( ) from langflow.interface.custom.custom_component import CustomComponent from langflow.interface.custom.directory_reader import DirectoryReader -from langflow.interface.custom.utils import build_custom_component_template, create_and_validate_component +from langflow.interface.custom.utils import build_custom_component_template from langflow.processing.process import process_graph_cached, process_tweaks from langflow.services.auth.utils import api_key_security, get_current_active_user from langflow.services.cache.utils import save_uploaded_file @@ -270,7 +270,7 @@ async def custom_component( raw_code: CustomComponentCode, user: User = Depends(get_current_active_user), ): - component = create_and_validate_component(raw_code.code) + component = CustomComponent(code=raw_code.code) built_frontend_node = build_custom_component_template(component, user_id=user.id) @@ -300,7 +300,7 @@ async def custom_component_update( raw_code: CustomComponentCode, user: User = Depends(get_current_active_user), ): - component = create_and_validate_component(raw_code.code) + component = CustomComponent(code=raw_code.code) component_node = build_custom_component_template(component, user_id=user.id, update_field=raw_code.field) # Update the field diff --git a/src/backend/langflow/interface/custom/custom_component/custom_component.py b/src/backend/langflow/interface/custom/custom_component/custom_component.py index b26764b9c..15e7cd845 100644 --- a/src/backend/langflow/interface/custom/custom_component/custom_component.py +++ b/src/backend/langflow/interface/custom/custom_component/custom_component.py @@ -5,10 +5,11 @@ from uuid import UUID import yaml from cachetools import TTLCache, cachedmethod from fastapi import HTTPException + from langflow.interface.custom.code_parser.utils import ( extract_inner_type_from_generic_alias, - extract_union_types_from_generic_alias) -from langflow.interface.custom.directory_reader import DirectoryReader + extract_union_types_from_generic_alias, +) from langflow.services.database.models.flow import Flow from langflow.services.database.utils import session_getter from langflow.services.deps import get_credential_service, get_db_service @@ -46,34 +47,6 @@ class CustomComponent(Component): def build_config(self): return self.field_config - def _class_template_validation(self, code: str): - TYPE_HINT_LIST = ["Optional", "Prompt", "PromptTemplate", "LLMChain"] - - if not code: - raise HTTPException( - status_code=400, - detail={ - "error": self.ERROR_CODE_NULL, - "traceback": "", - }, - ) - - reader = DirectoryReader("", False) - - for type_hint in TYPE_HINT_LIST: - if reader._is_type_hint_used_in_args(type_hint, code) and not reader._is_type_hint_imported( - type_hint, code - ): - error_detail = { - "error": "Type hint Error", - "traceback": f"Type hint '{type_hint}' is used but not imported in the code.", - } - raise HTTPException(status_code=400, detail=error_detail) - return True - - def validate(self) -> bool: - return self._class_template_validation(self.code) if self.code else False - @property def tree(self): return self.get_code_tree(self.code or "") @@ -206,8 +179,7 @@ class CustomComponent(Component): return validate.create_function(self.code, self.function_entrypoint_name) async def load_flow(self, flow_id: str, tweaks: Optional[dict] = None) -> Any: - from langflow.processing.process import (build_sorted_vertices, - process_tweaks) + from langflow.processing.process import build_sorted_vertices, process_tweaks db_service = get_db_service() with session_getter(db_service) as session: diff --git a/src/backend/langflow/interface/custom/utils.py b/src/backend/langflow/interface/custom/utils.py index 3744e48be..86c55b0ae 100644 --- a/src/backend/langflow/interface/custom/utils.py +++ b/src/backend/langflow/interface/custom/utils.py @@ -11,12 +11,13 @@ from langflow.field_typing.range_spec import RangeSpec from langflow.interface.custom.code_parser.utils import extract_inner_type from langflow.interface.custom.custom_component import CustomComponent from langflow.interface.custom.directory_reader.utils import ( - build_custom_component_list_from_path, determine_component_name, - merge_nested_dicts_with_renaming) + build_custom_component_list_from_path, + determine_component_name, + merge_nested_dicts_with_renaming, +) from langflow.interface.importing.utils import eval_custom_component_code from langflow.template.field.base import TemplateField -from langflow.template.frontend_node.custom_components import \ - CustomComponentFrontendNode +from langflow.template.frontend_node.custom_components import CustomComponentFrontendNode from langflow.utils.util import get_base_classes from loguru import logger @@ -174,9 +175,7 @@ def get_field_dict(field: Union[TemplateField, dict]): return field -def run_build_config( - custom_component: CustomComponent, user_id: Optional[Union[str, UUID]] = None, update_field=None -): +def run_build_config(custom_component: CustomComponent, user_id: Optional[Union[str, UUID]] = None, update_field=None): """Build the field configuration for a custom component""" try: @@ -343,12 +342,6 @@ def build_custom_components(settings_service): return custom_components_from_file -def create_and_validate_component(code: str) -> CustomComponent: - component = CustomComponent(code=code) - component.validate() - return component - - def update_field_dict(field_dict): """Update the field dictionary by calling options() or value() if they are callable""" if "options" in field_dict and callable(field_dict["options"]): @@ -378,6 +371,3 @@ def build_component(component): component_name = determine_component_name(component) component_template = create_component_template(component) return component_name, component_template - - - diff --git a/src/backend/langflow/utils/validate.py b/src/backend/langflow/utils/validate.py index 785055dba..6e6226568 100644 --- a/src/backend/langflow/utils/validate.py +++ b/src/backend/langflow/utils/validate.py @@ -2,7 +2,7 @@ import ast import contextlib import importlib from types import FunctionType -from typing import Dict +from typing import Dict, List, Optional, Union from langflow.field_typing.constants import CUSTOM_COMPONENT_SUPPORTED_TYPES @@ -260,14 +260,13 @@ def get_default_imports(code_string): """ Returns a dictionary of default imports for the dynamic class constructor. """ - typing_module = importlib.import_module("typing") - default_imports = { - "Optional": typing_module.Optional, - "List": typing_module.List, - "Dict": typing_module.Dict, - "Union": typing_module.Union, - } + default_imports = { + "Optional": Optional, + "List": List, + "Dict": Dict, + "Union": Union, + } langflow_imports = list(CUSTOM_COMPONENT_SUPPORTED_TYPES.keys()) necessary_imports = find_names_in_code(code_string, langflow_imports) langflow_module = importlib.import_module("langflow.field_typing") From f943ea26d6cf1eff673f69873b6f8dc8333de95f Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 22 Dec 2023 10:39:26 -0300 Subject: [PATCH 185/203] Refactor AgentInitializerComponent to support optional memory parameter --- .../components/agents/AgentInitializer.py | 39 +++++++++++++------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/src/backend/langflow/components/agents/AgentInitializer.py b/src/backend/langflow/components/agents/AgentInitializer.py index 2e8a9de2f..c847de43f 100644 --- a/src/backend/langflow/components/agents/AgentInitializer.py +++ b/src/backend/langflow/components/agents/AgentInitializer.py @@ -1,7 +1,6 @@ -from typing import Callable, List, Union +from typing import Callable, List, Optional, Union from langchain.agents import AgentExecutor, AgentType, initialize_agent, types - from langflow import CustomComponent from langflow.field_typing import BaseChatMemory, BaseLanguageModel, Tool @@ -20,18 +19,34 @@ class AgentInitializerComponent(CustomComponent): "memory": {"display_name": "Memory"}, "tools": {"display_name": "Tools"}, "llm": {"display_name": "Language Model"}, + "code": {"advanced": True}, } def build( - self, agent: str, llm: BaseLanguageModel, memory: BaseChatMemory, tools: List[Tool], max_iterations: int + self, + agent: str, + llm: BaseLanguageModel, + tools: List[Tool], + max_iterations: int, + memory: Optional[BaseChatMemory] = None, ) -> Union[AgentExecutor, Callable]: agent = AgentType(agent) - return initialize_agent( - tools=tools, - llm=llm, - agent=agent, - memory=memory, - return_intermediate_steps=True, - handle_parsing_errors=True, - max_iterations=max_iterations, - ) + if memory: + return initialize_agent( + tools=tools, + llm=llm, + agent=agent, + memory=memory, + return_intermediate_steps=True, + handle_parsing_errors=True, + max_iterations=max_iterations, + ) + else: + return initialize_agent( + tools=tools, + llm=llm, + agent=agent, + return_intermediate_steps=True, + handle_parsing_errors=True, + max_iterations=max_iterations, + ) From 13783c1c60d8ea163704e89974c0d9c82d42d1b0 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 22 Dec 2023 10:39:43 -0300 Subject: [PATCH 186/203] Format json file --- .../tests/onlyFront/assets/flowtest.json | 197 +++++++++++++++++- 1 file changed, 196 insertions(+), 1 deletion(-) diff --git a/src/frontend/tests/onlyFront/assets/flowtest.json b/src/frontend/tests/onlyFront/assets/flowtest.json index 0627db4f4..8b83ee270 100644 --- a/src/frontend/tests/onlyFront/assets/flowtest.json +++ b/src/frontend/tests/onlyFront/assets/flowtest.json @@ -1 +1,196 @@ -{"name":"Lonely Stonebraker","description":"Design Dialogues with Langflow.","data":{"nodes":[{"width":384,"height":461,"id":"CustomComponent-MtJjl","type":"genericNode","position":{"x":534.3712097224906,"y":-135.01908566635723},"data":{"type":"CustomComponent","node":{"template":{"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from langflow import CustomComponent\nfrom langflow.field_typing import Data\nfrom pathlib import Path\nfrom platformdirs import user_cache_dir\nimport os\n\nclass Component(CustomComponent):\n documentation: str = \"http://docs.langflow.org/components/custom\"\n\n def build_config(self):\n return {\"text_input\":{\"display_name\":\"Text Input\", \"input_types\":[\"str\"]},\"save_path\":{\"display_name\":\"Save Path\",\n \"info\":\"Put the full path with the file name and extension\",\"value\":Path(user_cache_dir(\"langflow\"))/\"text.t1.txt\"}}\n\n def build(self, text_input:str,save_path:str) -> str:\n try:\n # Create the directory if it doesn't exist\n os.makedirs(os.path.dirname(save_path), exist_ok=True)\n\n # Open the file in write mode and save the text\n with open(save_path, 'w') as file:\n file.write(text_input)\n except Exception as e:\n raise e\n self.status = text_input\n return text_input","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":false,"dynamic":true,"info":""},"save_path":{"type":"str","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"value":"/home/vazz/.cache/langflow/text.t1.txt","fileTypes":[],"file_path":"","password":false,"name":"save_path","display_name":"Save Path","advanced":false,"dynamic":false,"info":"Put the full path with the file name and extension"},"text_input":{"type":"str","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"text_input","display_name":"Text Input","advanced":false,"input_types":["str"],"dynamic":false,"info":"","value":""},"_type":"CustomComponent"},"base_classes":["str"],"display_name":"text checkpoint","documentation":"http://docs.langflow.org/components/custom","custom_fields":{"save_path":null,"text_input":null},"output_types":["str"],"field_formatters":{},"beta":true},"id":"CustomComponent-MtJjl"},"selected":false,"dragging":false,"positionAbsolute":{"x":534.3712097224906,"y":-135.01908566635723}},{"width":384,"height":453,"id":"CustomComponent-7NQoq","type":"genericNode","position":{"x":27.487979888011637,"y":-414.43998171034826},"data":{"type":"CustomComponent","node":{"template":{"audio":{"type":"file","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"/home/vazz/.cache/langflow/1b0814b7-2964-4e09-9b4b-f7413c4fb50b/b56b043d8940daecbdec03b97ad4346488c58d7cc62016560dd333aa7a6a12ce.m4a","password":false,"name":"audio","display_name":"audio","advanced":false,"dynamic":false,"info":"","value":"Audio Recording 2023-12-13 at 16.35.22.m4a"},"OpenAIKey":{"type":"str","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":true,"name":"OpenAIKey","display_name":"OpenAIKey","advanced":false,"dynamic":false,"info":"","value":""},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from langflow import CustomComponent\nfrom typing import Optional, List, Dict, Union\nfrom langflow.field_typing import (\n AgentExecutor,\n BaseChatMemory,\n BaseLanguageModel,\n BaseLLM,\n BaseLoader,\n BaseMemory,\n BaseOutputParser,\n BasePromptTemplate,\n BaseRetriever,\n Callable,\n Chain,\n ChatPromptTemplate,\n Data,\n Document,\n Embeddings,\n NestedDict,\n Object,\n PromptTemplate,\n TextSplitter,\n Tool,\n VectorStore,\n)\n\nfrom openai import OpenAI\nimport os\nimport ffmpeg\n\nclass Component(CustomComponent):\n display_name: str = \"Whisper Transcriber\"\n description: str = \"Converts audio to text using OpenAI's Whisper.\"\n\n def build_config(self):\n return {\"audio\": {\"field_type\": \"file\", \"suffixes\": [\".mp3\", \".mp4\", \".m4a\"]}, \"OpenAIKey\": {\"field_type\": \"str\", \"password\": True}}\n\n def calculate_segment_duration(self, audio_path, target_chunk_size_mb=24):\n # Calculate the target chunk size in bytes\n target_chunk_size_bytes = target_chunk_size_mb * 1024 * 1024\n\n # Use ffprobe to get the audio file information\n ffprobe_output = ffmpeg.probe(audio_path)\n print(ffprobe_output)\n # Convert duration to float\n duration = float(ffprobe_output[\"format\"][\"duration\"])\n\n # Calculate the approximate bitrate\n bitrate = os.path.getsize(audio_path) / duration\n\n # Calculate the segment duration to achieve the target chunk size\n segment_duration = target_chunk_size_bytes / bitrate\n\n return segment_duration\n\n def split_audio_into_chunks(self, audio_path, target_chunk_size_mb=24):\n # Calculate the segment duration\n segment_duration = self.calculate_segment_duration(audio_path, target_chunk_size_mb)\n\n # Create a directory to store the chunks\n output_directory = f\"{os.path.splitext(audio_path)[0]}_chunks\"\n os.makedirs(output_directory, exist_ok=True)\n\n # Use ffmpeg-python to split the audio file into chunks\n (\n ffmpeg.input(audio_path)\n .output(f\"{output_directory}/%03d{os.path.splitext(audio_path)[1]}\", codec=\"copy\", f=\"segment\", segment_time=segment_duration)\n .run()\n )\n\n # Get the list of generated chunk files\n chunks = [os.path.join(output_directory, file) for file in os.listdir(output_directory)]\n\n return chunks\n\n def build(self, audio: str, OpenAIKey: str) -> str:\n # Split audio into chunks\n audio_chunks = self.split_audio_into_chunks(audio)\n\n client = OpenAI(api_key=OpenAIKey)\n transcripts = []\n\n try:\n for chunk in audio_chunks:\n with open(chunk, \"rb\") as chunk_file:\n transcript = client.audio.transcriptions.create(\n model=\"whisper-1\",\n file=chunk_file,\n response_format=\"text\"\n )\n transcripts.append(transcript)\n finally:\n # Clean up temporary chunk files\n for chunk in audio_chunks:\n os.remove(chunk)\n\n # Concatenate transcripts into the final response\n final_response = \"\\n\".join(transcripts)\n self.status = final_response\n return final_response\n","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":false,"dynamic":true,"info":""},"_type":"CustomComponent"},"description":"Converts audio to text using OpenAI's Whisper.","base_classes":["str"],"display_name":"Whisper Transcriber","documentation":"","custom_fields":{"OpenAIKey":null,"audio":null},"output_types":["str"],"field_formatters":{},"beta":true},"id":"CustomComponent-7NQoq"},"selected":true,"positionAbsolute":{"x":27.487979888011637,"y":-414.43998171034826},"dragging":false}],"edges":[{"source":"CustomComponent-7NQoq","sourceHandle":"{œbaseClassesœ:[œstrœ],œdataTypeœ:œCustomComponentœ,œidœ:œCustomComponent-7NQoqœ}","target":"CustomComponent-MtJjl","targetHandle":"{œfieldNameœ:œtext_inputœ,œidœ:œCustomComponent-MtJjlœ,œinputTypesœ:[œstrœ],œtypeœ:œstrœ}","data":{"targetHandle":{"fieldName":"text_input","id":"CustomComponent-MtJjl","inputTypes":["str"],"type":"str"},"sourceHandle":{"baseClasses":["str"],"dataType":"CustomComponent","id":"CustomComponent-7NQoq"}},"style":{"stroke":"#555"},"className":"stroke-gray-900 stroke-connection","animated":false,"id":"reactflow__edge-CustomComponent-7NQoq{œbaseClassesœ:[œstrœ],œdataTypeœ:œCustomComponentœ,œidœ:œCustomComponent-7NQoqœ}-CustomComponent-MtJjl{œfieldNameœ:œtext_inputœ,œidœ:œCustomComponent-MtJjlœ,œinputTypesœ:[œstrœ],œtypeœ:œstrœ}"}],"viewport":{"x":119.37759169012509,"y":351.3082742479685,"zoom":1}},"is_component":false,"updated_at":"2023-12-13T23:51:56.874099","folder":null,"id":"1b0814b7-2964-4e09-9b4b-f7413c4fb50b","user_id":"8b5cf798-f1b8-4108-88fd-d7274d08d471"} \ No newline at end of file +{ + "name": "Lonely Stonebraker", + "description": "Design Dialogues with Langflow.", + "data": { + "nodes": [ + { + "width": 384, + "height": 461, + "id": "CustomComponent-MtJjl", + "type": "genericNode", + "position": { "x": 534.3712097224906, "y": -135.01908566635723 }, + "data": { + "type": "CustomComponent", + "node": { + "template": { + "code": { + "type": "code", + "required": true, + "placeholder": "", + "list": false, + "show": true, + "multiline": true, + "value": "from langflow import CustomComponent\nfrom langflow.field_typing import Data\nfrom pathlib import Path\nfrom platformdirs import user_cache_dir\nimport os\n\nclass Component(CustomComponent):\n documentation: str = \"http://docs.langflow.org/components/custom\"\n\n def build_config(self):\n return {\"text_input\":{\"display_name\":\"Text Input\", \"input_types\":[\"str\"]},\"save_path\":{\"display_name\":\"Save Path\",\n \"info\":\"Put the full path with the file name and extension\",\"value\":Path(user_cache_dir(\"langflow\"))/\"text.t1.txt\"}}\n\n def build(self, text_input:str,save_path:str) -> str:\n try:\n # Create the directory if it doesn't exist\n os.makedirs(os.path.dirname(save_path), exist_ok=True)\n\n # Open the file in write mode and save the text\n with open(save_path, 'w') as file:\n file.write(text_input)\n except Exception as e:\n raise e\n self.status = text_input\n return text_input", + "fileTypes": [], + "file_path": "", + "password": false, + "name": "code", + "advanced": false, + "dynamic": true, + "info": "" + }, + "save_path": { + "type": "str", + "required": true, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "value": "/home/vazz/.cache/langflow/text.t1.txt", + "fileTypes": [], + "file_path": "", + "password": false, + "name": "save_path", + "display_name": "Save Path", + "advanced": false, + "dynamic": false, + "info": "Put the full path with the file name and extension" + }, + "text_input": { + "type": "str", + "required": true, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "fileTypes": [], + "file_path": "", + "password": false, + "name": "text_input", + "display_name": "Text Input", + "advanced": false, + "input_types": ["str"], + "dynamic": false, + "info": "", + "value": "" + }, + "_type": "CustomComponent" + }, + "base_classes": ["str"], + "display_name": "text checkpoint", + "documentation": "http://docs.langflow.org/components/custom", + "custom_fields": { "save_path": null, "text_input": null }, + "output_types": ["str"], + "field_formatters": {}, + "beta": true + }, + "id": "CustomComponent-MtJjl" + }, + "selected": false, + "dragging": false, + "positionAbsolute": { "x": 534.3712097224906, "y": -135.01908566635723 } + }, + { + "width": 384, + "height": 453, + "id": "CustomComponent-7NQoq", + "type": "genericNode", + "position": { "x": 27.487979888011637, "y": -414.43998171034826 }, + "data": { + "type": "CustomComponent", + "node": { + "template": { + "audio": { + "type": "file", + "required": true, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "fileTypes": [], + "file_path": "/home/vazz/.cache/langflow/1b0814b7-2964-4e09-9b4b-f7413c4fb50b/b56b043d8940daecbdec03b97ad4346488c58d7cc62016560dd333aa7a6a12ce.m4a", + "password": false, + "name": "audio", + "display_name": "audio", + "advanced": false, + "dynamic": false, + "info": "", + "value": "Audio Recording 2023-12-13 at 16.35.22.m4a" + }, + "OpenAIKey": { + "type": "str", + "required": true, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "fileTypes": [], + "file_path": "", + "password": true, + "name": "OpenAIKey", + "display_name": "OpenAIKey", + "advanced": false, + "dynamic": false, + "info": "", + "value": "" + }, + "code": { + "type": "code", + "required": true, + "placeholder": "", + "list": false, + "show": true, + "multiline": true, + "value": "from langflow import CustomComponent\nfrom typing import Optional, List, Dict, Union\nfrom langflow.field_typing import (\n AgentExecutor,\n BaseChatMemory,\n BaseLanguageModel,\n BaseLLM,\n BaseLoader,\n BaseMemory,\n BaseOutputParser,\n BasePromptTemplate,\n BaseRetriever,\n Callable,\n Chain,\n ChatPromptTemplate,\n Data,\n Document,\n Embeddings,\n NestedDict,\n Object,\n PromptTemplate,\n TextSplitter,\n Tool,\n VectorStore,\n)\n\nfrom openai import OpenAI\nimport os\nimport ffmpeg\n\nclass Component(CustomComponent):\n display_name: str = \"Whisper Transcriber\"\n description: str = \"Converts audio to text using OpenAI's Whisper.\"\n\n def build_config(self):\n return {\"audio\": {\"field_type\": \"file\", \"suffixes\": [\".mp3\", \".mp4\", \".m4a\"]}, \"OpenAIKey\": {\"field_type\": \"str\", \"password\": True}}\n\n def calculate_segment_duration(self, audio_path, target_chunk_size_mb=24):\n # Calculate the target chunk size in bytes\n target_chunk_size_bytes = target_chunk_size_mb * 1024 * 1024\n\n # Use ffprobe to get the audio file information\n ffprobe_output = ffmpeg.probe(audio_path)\n print(ffprobe_output)\n # Convert duration to float\n duration = float(ffprobe_output[\"format\"][\"duration\"])\n\n # Calculate the approximate bitrate\n bitrate = os.path.getsize(audio_path) / duration\n\n # Calculate the segment duration to achieve the target chunk size\n segment_duration = target_chunk_size_bytes / bitrate\n\n return segment_duration\n\n def split_audio_into_chunks(self, audio_path, target_chunk_size_mb=24):\n # Calculate the segment duration\n segment_duration = self.calculate_segment_duration(audio_path, target_chunk_size_mb)\n\n # Create a directory to store the chunks\n output_directory = f\"{os.path.splitext(audio_path)[0]}_chunks\"\n os.makedirs(output_directory, exist_ok=True)\n\n # Use ffmpeg-python to split the audio file into chunks\n (\n ffmpeg.input(audio_path)\n .output(f\"{output_directory}/%03d{os.path.splitext(audio_path)[1]}\", codec=\"copy\", f=\"segment\", segment_time=segment_duration)\n .run()\n )\n\n # Get the list of generated chunk files\n chunks = [os.path.join(output_directory, file) for file in os.listdir(output_directory)]\n\n return chunks\n\n def build(self, audio: str, OpenAIKey: str) -> str:\n # Split audio into chunks\n audio_chunks = self.split_audio_into_chunks(audio)\n\n client = OpenAI(api_key=OpenAIKey)\n transcripts = []\n\n try:\n for chunk in audio_chunks:\n with open(chunk, \"rb\") as chunk_file:\n transcript = client.audio.transcriptions.create(\n model=\"whisper-1\",\n file=chunk_file,\n response_format=\"text\"\n )\n transcripts.append(transcript)\n finally:\n # Clean up temporary chunk files\n for chunk in audio_chunks:\n os.remove(chunk)\n\n # Concatenate transcripts into the final response\n final_response = \"\\n\".join(transcripts)\n self.status = final_response\n return final_response\n", + "fileTypes": [], + "file_path": "", + "password": false, + "name": "code", + "advanced": false, + "dynamic": true, + "info": "" + }, + "_type": "CustomComponent" + }, + "description": "Converts audio to text using OpenAI's Whisper.", + "base_classes": ["str"], + "display_name": "Whisper Transcriber", + "documentation": "", + "custom_fields": { "OpenAIKey": null, "audio": null }, + "output_types": ["str"], + "field_formatters": {}, + "beta": true + }, + "id": "CustomComponent-7NQoq" + }, + "selected": true, + "positionAbsolute": { + "x": 27.487979888011637, + "y": -414.43998171034826 + }, + "dragging": false + } + ], + "edges": [ + { + "source": "CustomComponent-7NQoq", + "sourceHandle": "{œbaseClassesœ:[œstrœ],œdataTypeœ:œCustomComponentœ,œidœ:œCustomComponent-7NQoqœ}", + "target": "CustomComponent-MtJjl", + "targetHandle": "{œfieldNameœ:œtext_inputœ,œidœ:œCustomComponent-MtJjlœ,œinputTypesœ:[œstrœ],œtypeœ:œstrœ}", + "data": { + "targetHandle": { + "fieldName": "text_input", + "id": "CustomComponent-MtJjl", + "inputTypes": ["str"], + "type": "str" + }, + "sourceHandle": { + "baseClasses": ["str"], + "dataType": "CustomComponent", + "id": "CustomComponent-7NQoq" + } + }, + "style": { "stroke": "#555" }, + "className": "stroke-gray-900 stroke-connection", + "animated": false, + "id": "reactflow__edge-CustomComponent-7NQoq{œbaseClassesœ:[œstrœ],œdataTypeœ:œCustomComponentœ,œidœ:œCustomComponent-7NQoqœ}-CustomComponent-MtJjl{œfieldNameœ:œtext_inputœ,œidœ:œCustomComponent-MtJjlœ,œinputTypesœ:[œstrœ],œtypeœ:œstrœ}" + } + ], + "viewport": { "x": 119.37759169012509, "y": 351.3082742479685, "zoom": 1 } + }, + "is_component": false, + "updated_at": "2023-12-13T23:51:56.874099", + "folder": null, + "id": "1b0814b7-2964-4e09-9b4b-f7413c4fb50b", + "user_id": "8b5cf798-f1b8-4108-88fd-d7274d08d471" +} From 113861eb59e633d0275997e3ea4dd242a7c6c897 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 22 Dec 2023 10:39:59 -0300 Subject: [PATCH 187/203] Refactor test_custom_component.py --- tests/test_custom_component.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/tests/test_custom_component.py b/tests/test_custom_component.py index 7908dd83a..a89efa4d4 100644 --- a/tests/test_custom_component.py +++ b/tests/test_custom_component.py @@ -5,12 +5,9 @@ from uuid import uuid4 import pytest from fastapi import HTTPException from langflow.interface.custom.base import CustomComponent -from langflow.interface.custom.code_parser.code_parser import (CodeParser, - CodeSyntaxError) -from langflow.interface.custom.custom_component.component import ( - Component, ComponentCodeNullError) -from langflow.interface.custom.utils import (build_custom_component_template, - create_and_validate_component) +from langflow.interface.custom.code_parser.code_parser import CodeParser, CodeSyntaxError +from langflow.interface.custom.custom_component.component import Component, ComponentCodeNullError +from langflow.interface.custom.utils import build_custom_component_template from langflow.services.database.models.flow import Flow, FlowCreate code_default = """ @@ -535,12 +532,12 @@ def test_build_config_field_value_keys(component): def test_create_and_validate_component_valid_code(test_component_code): - component = create_and_validate_component(test_component_code) + component = CustomComponent(code=test_component_code) assert isinstance(component, CustomComponent) def test_build_langchain_template_custom_component_valid_code(test_component_code): - component = create_and_validate_component(test_component_code) + component = CustomComponent(code=test_component_code) frontend_node = build_custom_component_template(component) assert isinstance(frontend_node, dict) template = frontend_node["template"] @@ -554,7 +551,7 @@ def test_build_langchain_template_custom_component_valid_code(test_component_cod def test_build_langchain_template_custom_component_templatefield(test_component_with_templatefield_code): - component = create_and_validate_component(test_component_with_templatefield_code) + component = CustomComponent(code=test_component_with_templatefield_code) frontend_node = build_custom_component_template(component) assert isinstance(frontend_node, dict) template = frontend_node["template"] From 28ff6a8c032b057b3399da7ac5927323cc898d54 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 22 Dec 2023 10:40:38 -0300 Subject: [PATCH 188/203] Fix code formatting and import statements --- src/backend/langflow/api/v1/chat.py | 12 +++------ .../components/llms/AzureChatOpenAI.py | 17 +++++------- .../components/vectorstores/Weaviate.py | 27 +++++++++++++------ .../langflow/interface/agents/custom.py | 5 ++-- .../custom/code_parser/code_parser.py | 3 +-- .../interface/custom/code_parser/utils.py | 2 +- .../directory_reader/directory_reader.py | 3 ++- .../custom/directory_reader/utils.py | 12 ++++----- src/backend/langflow/interface/types.py | 6 +---- 9 files changed, 41 insertions(+), 46 deletions(-) diff --git a/src/backend/langflow/api/v1/chat.py b/src/backend/langflow/api/v1/chat.py index de10b318d..9fa1ec3a3 100644 --- a/src/backend/langflow/api/v1/chat.py +++ b/src/backend/langflow/api/v1/chat.py @@ -1,19 +1,15 @@ import time -from fastapi import (APIRouter, Depends, HTTPException, Query, WebSocket, - WebSocketException, status) +from fastapi import APIRouter, Depends, HTTPException, Query, WebSocket, WebSocketException, status from fastapi.responses import StreamingResponse from langflow.api.utils import build_input_keys_response, format_elapsed_time -from langflow.api.v1.schemas import (BuildStatus, BuiltResponse, InitResponse, - StreamData) +from langflow.api.v1.schemas import BuildStatus, BuiltResponse, InitResponse, StreamData from langflow.graph.graph.base import Graph -from langflow.services.auth.utils import (get_current_active_user, - get_current_user_by_jwt) +from langflow.services.auth.utils import get_current_active_user, get_current_user_by_jwt from langflow.services.cache.service import BaseCacheService from langflow.services.cache.utils import update_build_status from langflow.services.chat.service import ChatService -from langflow.services.deps import (get_cache_service, get_chat_service, - get_session) +from langflow.services.deps import get_cache_service, get_chat_service, get_session from loguru import logger from sqlmodel import Session diff --git a/src/backend/langflow/components/llms/AzureChatOpenAI.py b/src/backend/langflow/components/llms/AzureChatOpenAI.py index 21188d0c3..92f52d1d1 100644 --- a/src/backend/langflow/components/llms/AzureChatOpenAI.py +++ b/src/backend/langflow/components/llms/AzureChatOpenAI.py @@ -3,6 +3,7 @@ from langflow import CustomComponent from langchain.llms.base import BaseLanguageModel from langchain.chat_models.azure_openai import AzureChatOpenAI + class AzureChatOpenAIComponent(CustomComponent): display_name: str = "AzureChatOpenAI" description: str = "LLM model from Azure OpenAI." @@ -16,7 +17,7 @@ class AzureChatOpenAIComponent(CustomComponent): "gpt-4-32k", "gpt-4-vision", ] - + def build_config(self): return { "model": { @@ -28,7 +29,7 @@ class AzureChatOpenAIComponent(CustomComponent): "azure_endpoint": { "display_name": "Azure Endpoint", "required": True, - "info": "Your Azure endpoint, including the resource.. Example: `https://example-resource.azure.openai.com/`" + "info": "Your Azure endpoint, including the resource.. Example: `https://example-resource.azure.openai.com/`", }, "azure_deployment": { "display_name": "Deployment Name", @@ -40,18 +41,14 @@ class AzureChatOpenAIComponent(CustomComponent): "required": True, "advanced": True, }, - "api_key": { - "display_name": "API Key", - "required": True, - "password": True - }, + "api_key": {"display_name": "API Key", "required": True, "password": True}, "temperature": { "display_name": "Temperature", "value": 0.7, "field_type": "float", "required": False, }, - "max_tokens": { + "max_tokens": { "display_name": "Max Tokens", "value": 1000, "required": False, @@ -71,8 +68,6 @@ class AzureChatOpenAIComponent(CustomComponent): temperature: float = 0.7, max_tokens: Optional[int] = 1000, ) -> BaseLanguageModel: - - return AzureChatOpenAI( model=model, azure_endpoint=azure_endpoint, @@ -80,5 +75,5 @@ class AzureChatOpenAIComponent(CustomComponent): api_version=api_version, api_key=api_key, temperature=temperature, - max_tokens=max_tokens + max_tokens=max_tokens, ) diff --git a/src/backend/langflow/components/vectorstores/Weaviate.py b/src/backend/langflow/components/vectorstores/Weaviate.py index 2e03ca6d4..bab1322f7 100644 --- a/src/backend/langflow/components/vectorstores/Weaviate.py +++ b/src/backend/langflow/components/vectorstores/Weaviate.py @@ -1,4 +1,4 @@ -import weaviate # type: ignore +import weaviate # type: ignore from typing import Optional, Union from langflow import CustomComponent @@ -12,18 +12,29 @@ from langchain.embeddings.base import Embeddings class WeaviateVectorStore(CustomComponent): display_name: str = "Weaviate" description: str = "Implementation of Vector Store using Weaviate" - documentation = ( - "https://python.langchain.com/docs/integrations/vectorstores/weaviate" - ) + documentation = "https://python.langchain.com/docs/integrations/vectorstores/weaviate" beta = True field_config = { "url": {"display_name": "Weaviate URL", "value": "http://localhost:8080"}, - "api_key": { "display_name": "API Key", "password": True,"required": False, }, - "index_name": {"display_name": "Index name","required": False,}, - "text_key": {"display_name": "Text Key","required": False, "advanced": True, "value": "text"}, + "api_key": { + "display_name": "API Key", + "password": True, + "required": False, + }, + "index_name": { + "display_name": "Index name", + "required": False, + }, + "text_key": {"display_name": "Text Key", "required": False, "advanced": True, "value": "text"}, "documents": {"display_name": "Documents", "is_list": True}, "embedding": {"display_name": "Embedding"}, - "attributes": {"display_name": "Attributes", "required": False, "is_list": True, "field_type": "str", "advanced": True}, + "attributes": { + "display_name": "Attributes", + "required": False, + "is_list": True, + "field_type": "str", + "advanced": True, + }, "search_by_text": {"display_name": "Search By Text", "field_type": "bool", "advanced": True}, "code": {"show": False}, } diff --git a/src/backend/langflow/interface/agents/custom.py b/src/backend/langflow/interface/agents/custom.py index 60ef3eafb..5df96e584 100644 --- a/src/backend/langflow/interface/agents/custom.py +++ b/src/backend/langflow/interface/agents/custom.py @@ -1,6 +1,6 @@ -from typing import Any, List, Optional +from typing import Any, Optional -from langchain.agents import AgentExecutor, AgentType, Tool, ZeroShotAgent, initialize_agent +from langchain.agents import AgentExecutor, ZeroShotAgent from langchain.agents.agent_toolkits import ( SQLDatabaseToolkit, VectorStoreInfo, @@ -15,7 +15,6 @@ from langchain.agents.agent_toolkits.vectorstore.prompt import ROUTER_PREFIX as from langchain.agents.mrkl.prompt import FORMAT_INSTRUCTIONS from langchain.base_language import BaseLanguageModel from langchain.chains.llm import LLMChain -from langchain.memory.chat_memory import BaseChatMemory from langchain.sql_database import SQLDatabase from langchain.tools.sql_database.prompt import QUERY_CHECKER from langchain_experimental.agents.agent_toolkits.pandas.prompt import PREFIX as PANDAS_PREFIX diff --git a/src/backend/langflow/interface/custom/code_parser/code_parser.py b/src/backend/langflow/interface/custom/code_parser/code_parser.py index 4e108ad2b..7a102e33f 100644 --- a/src/backend/langflow/interface/custom/code_parser/code_parser.py +++ b/src/backend/langflow/interface/custom/code_parser/code_parser.py @@ -6,8 +6,7 @@ from typing import Any, Dict, List, Type, Union from cachetools import TTLCache, cachedmethod, keys from fastapi import HTTPException -from langflow.interface.custom.schema import (CallableCodeDetails, - ClassCodeDetails) +from langflow.interface.custom.schema import CallableCodeDetails, ClassCodeDetails class CodeSyntaxError(HTTPException): diff --git a/src/backend/langflow/interface/custom/code_parser/utils.py b/src/backend/langflow/interface/custom/code_parser/utils.py index 5675ea85b..d9b9def26 100644 --- a/src/backend/langflow/interface/custom/code_parser/utils.py +++ b/src/backend/langflow/interface/custom/code_parser/utils.py @@ -36,4 +36,4 @@ def extract_union_types_from_generic_alias(return_type: GenericAlias) -> list: """ Extracts the inner type from a type hint that is a Union. """ - return list(return_type.__args__) \ No newline at end of file + return list(return_type.__args__) diff --git a/src/backend/langflow/interface/custom/directory_reader/directory_reader.py b/src/backend/langflow/interface/custom/directory_reader/directory_reader.py index 41dd11483..9c50e0181 100644 --- a/src/backend/langflow/interface/custom/directory_reader/directory_reader.py +++ b/src/backend/langflow/interface/custom/directory_reader/directory_reader.py @@ -65,12 +65,13 @@ class DirectoryReader: def filter_loaded_components(self, data: dict, with_errors: bool) -> dict: from langflow.interface.custom.utils import build_component + items = [ { "name": menu["name"], "path": menu["path"], "components": [ - (*build_component(component),component) + (*build_component(component), component) for component in menu["components"] if (component["error"] if with_errors else not component["error"]) ], diff --git a/src/backend/langflow/interface/custom/directory_reader/utils.py b/src/backend/langflow/interface/custom/directory_reader/utils.py index 2dbbd2caa..f1771b2d7 100644 --- a/src/backend/langflow/interface/custom/directory_reader/utils.py +++ b/src/backend/langflow/interface/custom/directory_reader/utils.py @@ -1,6 +1,5 @@ from langflow.interface.custom.directory_reader import DirectoryReader -from langflow.template.frontend_node.custom_components import \ - CustomComponentFrontendNode +from langflow.template.frontend_node.custom_components import CustomComponentFrontendNode from loguru import logger @@ -75,10 +74,9 @@ def create_invalid_component_template(component, component_name): """Create a template for an invalid component.""" component_code = component["code"] component_frontend_node = CustomComponentFrontendNode( - description="ERROR - Check your Python Code", - display_name=f"ERROR - {component_name}", - ) - + description="ERROR - Check your Python Code", + display_name=f"ERROR - {component_name}", + ) component_frontend_node.error = component.get("error", None) field = component_frontend_node.template.get_field("code") @@ -144,4 +142,4 @@ def build_menu_items(menu_item): except Exception as exc: logger.error(f"Error loading Component: {component['output_types']}") logger.exception(f"Error while building custom component {component['output_types']}: {exc}") - return menu_items \ No newline at end of file + return menu_items diff --git a/src/backend/langflow/interface/types.py b/src/backend/langflow/interface/types.py index 59b2ec66e..7f44be3ec 100644 --- a/src/backend/langflow/interface/types.py +++ b/src/backend/langflow/interface/types.py @@ -1,9 +1,7 @@ - from cachetools import LRUCache, cached from langflow.interface.agents.base import agent_creator from langflow.interface.chains.base import chain_creator -from langflow.interface.custom.directory_reader.utils import \ - merge_nested_dicts_with_renaming +from langflow.interface.custom.directory_reader.utils import merge_nested_dicts_with_renaming from langflow.interface.custom.utils import build_custom_components from langflow.interface.document_loaders.base import documentloader_creator from langflow.interface.embeddings.base import embedding_creator @@ -70,5 +68,3 @@ def get_all_types_dict(settings_service): native_components = build_langchain_types_dict() custom_components_from_file = build_custom_components(settings_service) return merge_nested_dicts_with_renaming(native_components, custom_components_from_file) - - From 266bc0d7f86978064a5fb8462bef58faa4a38abb Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 22 Dec 2023 10:40:58 -0300 Subject: [PATCH 189/203] Format imports --- src/frontend/src/utils/styleUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/src/utils/styleUtils.ts b/src/frontend/src/utils/styleUtils.ts index a7940b67d..de71f11f3 100644 --- a/src/frontend/src/utils/styleUtils.ts +++ b/src/frontend/src/utils/styleUtils.ts @@ -129,12 +129,12 @@ import { NotionIcon } from "../icons/Notion"; import { OpenAiIcon } from "../icons/OpenAi"; import { PineconeIcon } from "../icons/Pinecone"; import { QDrantIcon } from "../icons/QDrant"; -import { WeaviateIcon } from "../icons/Weaviate"; import { SearxIcon } from "../icons/Searx"; import { ShareIcon } from "../icons/Share"; import { Share2Icon } from "../icons/Share2"; import SvgSlackIcon from "../icons/Slack/SlackIcon"; import { VertexAIIcon } from "../icons/VertexAI"; +import { WeaviateIcon } from "../icons/Weaviate"; import SvgWikipedia from "../icons/Wikipedia/Wikipedia"; import SvgWolfram from "../icons/Wolfram/Wolfram"; import { HackerNewsIcon } from "../icons/hackerNews"; From 3213c8719363667a8d76cfe236e5cf0237fc1422 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 22 Dec 2023 10:41:49 -0300 Subject: [PATCH 190/203] Refactor API endpoints and imports --- src/backend/langflow/api/v1/endpoints.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/backend/langflow/api/v1/endpoints.py b/src/backend/langflow/api/v1/endpoints.py index 9bf081163..d6e509295 100644 --- a/src/backend/langflow/api/v1/endpoints.py +++ b/src/backend/langflow/api/v1/endpoints.py @@ -3,9 +3,6 @@ from typing import Annotated, List, Optional, Union import sqlalchemy as sa from fastapi import APIRouter, Body, Depends, HTTPException, UploadFile, status -from loguru import logger -from sqlmodel import select - from langflow.api.utils import update_frontend_node_with_template_values from langflow.api.v1.schemas import ( CustomComponentCode, @@ -23,6 +20,8 @@ from langflow.services.cache.utils import save_uploaded_file from langflow.services.database.models.flow import Flow from langflow.services.database.models.user.model import User from langflow.services.deps import get_session, get_session_service, get_settings_service, get_task_service +from loguru import logger +from sqlmodel import select try: from langflow.worker import process_graph_cached_task @@ -32,9 +31,8 @@ except ImportError: raise NotImplementedError("Celery is not installed") -from sqlmodel import Session - from langflow.services.task.service import TaskService +from sqlmodel import Session # build router router = APIRouter(tags=["Base"]) @@ -289,7 +287,6 @@ async def reload_custom_component(path: str, user: User = Depends(get_current_ac raise ValueError(content) extractor = CustomComponent(code=content) - extractor.validate() return build_custom_component_template(extractor, user_id=user.id) except Exception as exc: raise HTTPException(status_code=400, detail=str(exc)) From 75493bbdea5601856dc3402ccbafd496d4f26c63 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 22 Dec 2023 10:46:35 -0300 Subject: [PATCH 191/203] Refactor process_inputs function to handle both dict and list inputs --- src/backend/langflow/processing/process.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/backend/langflow/processing/process.py b/src/backend/langflow/processing/process.py index 659141446..647e8cd4b 100644 --- a/src/backend/langflow/processing/process.py +++ b/src/backend/langflow/processing/process.py @@ -7,12 +7,11 @@ from langchain.schema import AgentAction, Document from langchain.vectorstores.base import VectorStore from langchain_core.messages import AIMessage from langchain_core.runnables.base import Runnable -from loguru import logger -from pydantic import BaseModel - from langflow.interface.custom.custom_component import CustomComponent from langflow.interface.run import build_sorted_vertices, get_memory_key, update_memory_keys from langflow.services.deps import get_session_service +from loguru import logger +from pydantic import BaseModel def fix_memory_inputs(langchain_object): @@ -107,10 +106,19 @@ def get_build_result(data_graph, session_id): return build_sorted_vertices(data_graph) -def process_inputs(inputs: Optional[dict], artifacts: Dict[str, Any]) -> dict: +def process_inputs(inputs: Union[dict, List[dict]], artifacts: Dict[str, Any]) -> dict: if inputs is None: inputs = {} + if isinstance(inputs, dict): + inputs = update_inputs_dict(inputs, artifacts) + elif isinstance(inputs, List): + inputs = [update_inputs_dict(inp, artifacts) for inp in inputs] + + return inputs + + +def update_inputs_dict(inputs: dict, artifacts: Dict[str, Any]) -> dict: for key, value in artifacts.items(): if key == "repr": continue From 010a045448e828618407ec52f67dea5537d7e1ec Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 22 Dec 2023 10:46:47 -0300 Subject: [PATCH 192/203] Update typing imports and add logger import --- src/backend/langflow/api/v1/endpoints.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/backend/langflow/api/v1/endpoints.py b/src/backend/langflow/api/v1/endpoints.py index d6e509295..0247be7e7 100644 --- a/src/backend/langflow/api/v1/endpoints.py +++ b/src/backend/langflow/api/v1/endpoints.py @@ -1,8 +1,11 @@ from http import HTTPStatus -from typing import Annotated, List, Optional, Union +from typing import Annotated, Any, List, Optional, Union import sqlalchemy as sa from fastapi import APIRouter, Body, Depends, HTTPException, UploadFile, status +from loguru import logger +from sqlmodel import select + from langflow.api.utils import update_frontend_node_with_template_values from langflow.api.v1.schemas import ( CustomComponentCode, @@ -20,8 +23,6 @@ from langflow.services.cache.utils import save_uploaded_file from langflow.services.database.models.flow import Flow from langflow.services.database.models.user.model import User from langflow.services.deps import get_session, get_session_service, get_settings_service, get_task_service -from loguru import logger -from sqlmodel import select try: from langflow.worker import process_graph_cached_task @@ -31,9 +32,10 @@ except ImportError: raise NotImplementedError("Celery is not installed") -from langflow.services.task.service import TaskService from sqlmodel import Session +from langflow.services.task.service import TaskService + # build router router = APIRouter(tags=["Base"]) @@ -47,7 +49,7 @@ async def process_graph_data( task_service: "TaskService" = Depends(get_task_service), sync: bool = True, ): - task_result = None + task_result: Any = None task_status = None if tweaks: try: From d07150ad177b8d14d998e699d55fee981593ea02 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 22 Dec 2023 10:53:46 -0300 Subject: [PATCH 193/203] Update worker.py with typing changes --- src/backend/langflow/worker.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/backend/langflow/worker.py b/src/backend/langflow/worker.py index 5a55c3c90..b3872bcd8 100644 --- a/src/backend/langflow/worker.py +++ b/src/backend/langflow/worker.py @@ -1,14 +1,13 @@ -from typing import TYPE_CHECKING, Any, Dict, Optional +from typing import TYPE_CHECKING, Any, Dict, List, Optional, Union from asgiref.sync import async_to_sync from celery.exceptions import SoftTimeLimitExceeded # type: ignore -from loguru import logger -from rich import print - from langflow.core.celery_app import celery_app from langflow.processing.process import Result, generate_result, process_inputs from langflow.services.deps import get_session_service from langflow.services.manager import initialize_session_service +from loguru import logger +from rich import print if TYPE_CHECKING: from langflow.graph.vertex.base import Vertex @@ -35,7 +34,7 @@ def build_vertex(self, vertex: "Vertex") -> "Vertex": @celery_app.task(acks_late=True) def process_graph_cached_task( data_graph: Dict[str, Any], - inputs: Optional[dict] = None, + inputs: Optional[Union[dict, List[dict]]] = None, clear_cache=False, session_id=None, ) -> Dict[str, Any]: From f7ae3ae852f4284593c0c2131db2a7b6fb684bf0 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 22 Dec 2023 10:53:53 -0300 Subject: [PATCH 194/203] Refactor process_inputs function to handle optional inputs and artifacts --- src/backend/langflow/processing/process.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/backend/langflow/processing/process.py b/src/backend/langflow/processing/process.py index 647e8cd4b..9432b7f96 100644 --- a/src/backend/langflow/processing/process.py +++ b/src/backend/langflow/processing/process.py @@ -7,11 +7,12 @@ from langchain.schema import AgentAction, Document from langchain.vectorstores.base import VectorStore from langchain_core.messages import AIMessage from langchain_core.runnables.base import Runnable +from loguru import logger +from pydantic import BaseModel + from langflow.interface.custom.custom_component import CustomComponent from langflow.interface.run import build_sorted_vertices, get_memory_key, update_memory_keys from langflow.services.deps import get_session_service -from loguru import logger -from pydantic import BaseModel def fix_memory_inputs(langchain_object): @@ -106,9 +107,13 @@ def get_build_result(data_graph, session_id): return build_sorted_vertices(data_graph) -def process_inputs(inputs: Union[dict, List[dict]], artifacts: Dict[str, Any]) -> dict: +def process_inputs( + inputs: Optional[Union[dict, List[dict]]] = None, artifacts: Optional[Dict[str, Any]] = None +) -> Union[dict, List[dict]]: if inputs is None: inputs = {} + if artifacts is None: + artifacts = {} if isinstance(inputs, dict): inputs = update_inputs_dict(inputs, artifacts) From 232a53a05c9d3f2b9de08bd8369b485d404c1892 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 22 Dec 2023 11:00:11 -0300 Subject: [PATCH 195/203] Update langflow version to 0.6.3a6 --- poetry.lock | 1005 ++++++++++++++++++++++++------------------------ pyproject.toml | 2 +- 2 files changed, 510 insertions(+), 497 deletions(-) diff --git a/poetry.lock b/poetry.lock index 907ff1ff8..8d2b12d2e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -123,13 +123,13 @@ frozenlist = ">=1.1.0" [[package]] name = "alembic" -version = "1.13.0" +version = "1.13.1" description = "A database migration tool for SQLAlchemy." optional = false python-versions = ">=3.8" files = [ - {file = "alembic-1.13.0-py3-none-any.whl", hash = "sha256:a23974ea301c3ee52705db809c7413cecd165290c6679b9998dd6c74342ca23a"}, - {file = "alembic-1.13.0.tar.gz", hash = "sha256:ab4b3b94d2e1e5f81e34be8a9b7b7575fc9dd5398fccb0bef351ec9b14872623"}, + {file = "alembic-1.13.1-py3-none-any.whl", hash = "sha256:2edcc97bed0bd3272611ce3a98d98279e9c209e7186e43e75bbb1b2bdfdbcc43"}, + {file = "alembic-1.13.1.tar.gz", hash = "sha256:4932c8558bf68f2ee92b9bbcb8218671c627064d5b08939437af6d77dc05e595"}, ] [package.dependencies] @@ -308,13 +308,13 @@ files = [ [[package]] name = "bce-python-sdk" -version = "0.8.97" +version = "0.8.98" description = "BCE SDK for python" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, <4" files = [ - {file = "bce-python-sdk-0.8.97.tar.gz", hash = "sha256:9143f8f19f652752423ec1b0bc4f51d7c4c864b1b7bbdb6991d6d66dc28449de"}, - {file = "bce_python_sdk-0.8.97-py3-none-any.whl", hash = "sha256:6ad446ecde6e1026c4b8b902f8da2c1c741afff2401840cd1018af16998622af"}, + {file = "bce-python-sdk-0.8.98.tar.gz", hash = "sha256:8d2a55541a5bf21228f248ed4faea9dd40dfcfc1df2c5bf1e9cdb69db6e0fab4"}, + {file = "bce_python_sdk-0.8.98-py3-none-any.whl", hash = "sha256:0e044fa2e4efd749642dfaf22f9e047a04618761780deeaa24ff06dc6ac55f34"}, ] [package.dependencies] @@ -398,32 +398,32 @@ files = [ [[package]] name = "boto3" -version = "1.34.3" +version = "1.34.6" description = "The AWS SDK for Python" optional = false python-versions = ">= 3.8" files = [ - {file = "boto3-1.34.3-py3-none-any.whl", hash = "sha256:77e055bd44c7ffc593928d2a272f4931a7f68c22f8d984530fc76cf063b7cc05"}, - {file = "boto3-1.34.3.tar.gz", hash = "sha256:d2fa7c1c65108fd984ac7b6d21cca640a6a005ff1ad99e4429b9f6ef835996f9"}, + {file = "boto3-1.34.6-py3-none-any.whl", hash = "sha256:1dd6d952a175da45d05cf9eb2b8d5be31f4863cc54444ac27fbcbba966fc4053"}, + {file = "boto3-1.34.6.tar.gz", hash = "sha256:ae47b84db94fc3b8e635c6d1b93da85a5fdca961b212260e5dbf5166435fe7b0"}, ] [package.dependencies] -botocore = ">=1.34.3,<1.35.0" +botocore = ">=1.34.6,<1.35.0" jmespath = ">=0.7.1,<2.0.0" -s3transfer = ">=0.9.0,<0.10.0" +s3transfer = ">=0.10.0,<0.11.0" [package.extras] crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.34.3" +version = "1.34.6" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">= 3.8" files = [ - {file = "botocore-1.34.3-py3-none-any.whl", hash = "sha256:c0e7910a118ad497738a327f3456582c69f761ba9d004007570d64093f767a5e"}, - {file = "botocore-1.34.3.tar.gz", hash = "sha256:8e5b32c63db8963af0008e36ceb13c236a46878a3722ffc6dd3be7351fba7163"}, + {file = "botocore-1.34.6-py3-none-any.whl", hash = "sha256:697000cb756b8f469c10ed0a8a8590f799a90a98b814ebfccd2add4048084ff1"}, + {file = "botocore-1.34.6.tar.gz", hash = "sha256:bfe587f48e154a3a836f85af165116b7d5dba9b3b746ce0b94e6d2ed1e06c206"}, ] [package.dependencies] @@ -435,7 +435,7 @@ urllib3 = [ ] [package.extras] -crt = ["awscrt (==0.19.17)"] +crt = ["awscrt (==0.19.19)"] [[package]] name = "brotli" @@ -1030,63 +1030,63 @@ yaml = ["PyYAML"] [[package]] name = "coverage" -version = "7.3.3" +version = "7.3.4" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d874434e0cb7b90f7af2b6e3309b0733cde8ec1476eb47db148ed7deeb2a9494"}, - {file = "coverage-7.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ee6621dccce8af666b8c4651f9f43467bfbf409607c604b840b78f4ff3619aeb"}, - {file = "coverage-7.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1367aa411afb4431ab58fd7ee102adb2665894d047c490649e86219327183134"}, - {file = "coverage-7.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f0f8f0c497eb9c9f18f21de0750c8d8b4b9c7000b43996a094290b59d0e7523"}, - {file = "coverage-7.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db0338c4b0951d93d547e0ff8d8ea340fecf5885f5b00b23be5aa99549e14cfd"}, - {file = "coverage-7.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d31650d313bd90d027f4be7663dfa2241079edd780b56ac416b56eebe0a21aab"}, - {file = "coverage-7.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:9437a4074b43c177c92c96d051957592afd85ba00d3e92002c8ef45ee75df438"}, - {file = "coverage-7.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9e17d9cb06c13b4f2ef570355fa45797d10f19ca71395910b249e3f77942a837"}, - {file = "coverage-7.3.3-cp310-cp310-win32.whl", hash = "sha256:eee5e741b43ea1b49d98ab6e40f7e299e97715af2488d1c77a90de4a663a86e2"}, - {file = "coverage-7.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:593efa42160c15c59ee9b66c5f27a453ed3968718e6e58431cdfb2d50d5ad284"}, - {file = "coverage-7.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8c944cf1775235c0857829c275c777a2c3e33032e544bcef614036f337ac37bb"}, - {file = "coverage-7.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:eda7f6e92358ac9e1717ce1f0377ed2b9320cea070906ece4e5c11d172a45a39"}, - {file = "coverage-7.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c854c1d2c7d3e47f7120b560d1a30c1ca221e207439608d27bc4d08fd4aeae8"}, - {file = "coverage-7.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:222b038f08a7ebed1e4e78ccf3c09a1ca4ac3da16de983e66520973443b546bc"}, - {file = "coverage-7.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff4800783d85bff132f2cc7d007426ec698cdce08c3062c8d501ad3f4ea3d16c"}, - {file = "coverage-7.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fc200cec654311ca2c3f5ab3ce2220521b3d4732f68e1b1e79bef8fcfc1f2b97"}, - {file = "coverage-7.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:307aecb65bb77cbfebf2eb6e12009e9034d050c6c69d8a5f3f737b329f4f15fb"}, - {file = "coverage-7.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ffb0eacbadb705c0a6969b0adf468f126b064f3362411df95f6d4f31c40d31c1"}, - {file = "coverage-7.3.3-cp311-cp311-win32.whl", hash = "sha256:79c32f875fd7c0ed8d642b221cf81feba98183d2ff14d1f37a1bbce6b0347d9f"}, - {file = "coverage-7.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:243576944f7c1a1205e5cd658533a50eba662c74f9be4c050d51c69bd4532936"}, - {file = "coverage-7.3.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a2ac4245f18057dfec3b0074c4eb366953bca6787f1ec397c004c78176a23d56"}, - {file = "coverage-7.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f9191be7af41f0b54324ded600e8ddbcabea23e1e8ba419d9a53b241dece821d"}, - {file = "coverage-7.3.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31c0b1b8b5a4aebf8fcd227237fc4263aa7fa0ddcd4d288d42f50eff18b0bac4"}, - {file = "coverage-7.3.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee453085279df1bac0996bc97004771a4a052b1f1e23f6101213e3796ff3cb85"}, - {file = "coverage-7.3.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1191270b06ecd68b1d00897b2daddb98e1719f63750969614ceb3438228c088e"}, - {file = "coverage-7.3.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:007a7e49831cfe387473e92e9ff07377f6121120669ddc39674e7244350a6a29"}, - {file = "coverage-7.3.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:af75cf83c2d57717a8493ed2246d34b1f3398cb8a92b10fd7a1858cad8e78f59"}, - {file = "coverage-7.3.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:811ca7373da32f1ccee2927dc27dc523462fd30674a80102f86c6753d6681bc6"}, - {file = "coverage-7.3.3-cp312-cp312-win32.whl", hash = "sha256:733537a182b5d62184f2a72796eb6901299898231a8e4f84c858c68684b25a70"}, - {file = "coverage-7.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:e995efb191f04b01ced307dbd7407ebf6e6dc209b528d75583277b10fd1800ee"}, - {file = "coverage-7.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fbd8a5fe6c893de21a3c6835071ec116d79334fbdf641743332e442a3466f7ea"}, - {file = "coverage-7.3.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:50c472c1916540f8b2deef10cdc736cd2b3d1464d3945e4da0333862270dcb15"}, - {file = "coverage-7.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e9223a18f51d00d3ce239c39fc41410489ec7a248a84fab443fbb39c943616c"}, - {file = "coverage-7.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f501e36ac428c1b334c41e196ff6bd550c0353c7314716e80055b1f0a32ba394"}, - {file = "coverage-7.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:475de8213ed95a6b6283056d180b2442eee38d5948d735cd3d3b52b86dd65b92"}, - {file = "coverage-7.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:afdcc10c01d0db217fc0a64f58c7edd635b8f27787fea0a3054b856a6dff8717"}, - {file = "coverage-7.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:fff0b2f249ac642fd735f009b8363c2b46cf406d3caec00e4deeb79b5ff39b40"}, - {file = "coverage-7.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a1f76cfc122c9e0f62dbe0460ec9cc7696fc9a0293931a33b8870f78cf83a327"}, - {file = "coverage-7.3.3-cp38-cp38-win32.whl", hash = "sha256:757453848c18d7ab5d5b5f1827293d580f156f1c2c8cef45bfc21f37d8681069"}, - {file = "coverage-7.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:ad2453b852a1316c8a103c9c970db8fbc262f4f6b930aa6c606df9b2766eee06"}, - {file = "coverage-7.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3b15e03b8ee6a908db48eccf4e4e42397f146ab1e91c6324da44197a45cb9132"}, - {file = "coverage-7.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:89400aa1752e09f666cc48708eaa171eef0ebe3d5f74044b614729231763ae69"}, - {file = "coverage-7.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c59a3e59fb95e6d72e71dc915e6d7fa568863fad0a80b33bc7b82d6e9f844973"}, - {file = "coverage-7.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9ede881c7618f9cf93e2df0421ee127afdfd267d1b5d0c59bcea771cf160ea4a"}, - {file = "coverage-7.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3bfd2c2f0e5384276e12b14882bf2c7621f97c35320c3e7132c156ce18436a1"}, - {file = "coverage-7.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7f3bad1a9313401ff2964e411ab7d57fb700a2d5478b727e13f156c8f89774a0"}, - {file = "coverage-7.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:65d716b736f16e250435473c5ca01285d73c29f20097decdbb12571d5dfb2c94"}, - {file = "coverage-7.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a702e66483b1fe602717020a0e90506e759c84a71dbc1616dd55d29d86a9b91f"}, - {file = "coverage-7.3.3-cp39-cp39-win32.whl", hash = "sha256:7fbf3f5756e7955174a31fb579307d69ffca91ad163467ed123858ce0f3fd4aa"}, - {file = "coverage-7.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:cad9afc1644b979211989ec3ff7d82110b2ed52995c2f7263e7841c846a75348"}, - {file = "coverage-7.3.3-pp38.pp39.pp310-none-any.whl", hash = "sha256:d299d379b676812e142fb57662a8d0d810b859421412b4d7af996154c00c31bb"}, - {file = "coverage-7.3.3.tar.gz", hash = "sha256:df04c64e58df96b4427db8d0559e95e2df3138c9916c96f9f6a4dd220db2fdb7"}, + {file = "coverage-7.3.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aff2bd3d585969cc4486bfc69655e862028b689404563e6b549e6a8244f226df"}, + {file = "coverage-7.3.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4353923f38d752ecfbd3f1f20bf7a3546993ae5ecd7c07fd2f25d40b4e54571"}, + {file = "coverage-7.3.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea473c37872f0159294f7073f3fa72f68b03a129799f3533b2bb44d5e9fa4f82"}, + {file = "coverage-7.3.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5214362abf26e254d749fc0c18af4c57b532a4bfde1a057565616dd3b8d7cc94"}, + {file = "coverage-7.3.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f99b7d3f7a7adfa3d11e3a48d1a91bb65739555dd6a0d3fa68aa5852d962e5b1"}, + {file = "coverage-7.3.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:74397a1263275bea9d736572d4cf338efaade2de9ff759f9c26bcdceb383bb49"}, + {file = "coverage-7.3.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f154bd866318185ef5865ace5be3ac047b6d1cc0aeecf53bf83fe846f4384d5d"}, + {file = "coverage-7.3.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e0d84099ea7cba9ff467f9c6f747e3fc3906e2aadac1ce7b41add72e8d0a3712"}, + {file = "coverage-7.3.4-cp310-cp310-win32.whl", hash = "sha256:3f477fb8a56e0c603587b8278d9dbd32e54bcc2922d62405f65574bd76eba78a"}, + {file = "coverage-7.3.4-cp310-cp310-win_amd64.whl", hash = "sha256:c75738ce13d257efbb6633a049fb2ed8e87e2e6c2e906c52d1093a4d08d67c6b"}, + {file = "coverage-7.3.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:997aa14b3e014339d8101b9886063c5d06238848905d9ad6c6eabe533440a9a7"}, + {file = "coverage-7.3.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8a9c5bc5db3eb4cd55ecb8397d8e9b70247904f8eca718cc53c12dcc98e59fc8"}, + {file = "coverage-7.3.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27ee94f088397d1feea3cb524e4313ff0410ead7d968029ecc4bc5a7e1d34fbf"}, + {file = "coverage-7.3.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ce03e25e18dd9bf44723e83bc202114817f3367789052dc9e5b5c79f40cf59d"}, + {file = "coverage-7.3.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85072e99474d894e5df582faec04abe137b28972d5e466999bc64fc37f564a03"}, + {file = "coverage-7.3.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a877810ef918d0d345b783fc569608804f3ed2507bf32f14f652e4eaf5d8f8d0"}, + {file = "coverage-7.3.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9ac17b94ab4ca66cf803f2b22d47e392f0977f9da838bf71d1f0db6c32893cb9"}, + {file = "coverage-7.3.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:36d75ef2acab74dc948d0b537ef021306796da551e8ac8b467810911000af66a"}, + {file = "coverage-7.3.4-cp311-cp311-win32.whl", hash = "sha256:47ee56c2cd445ea35a8cc3ad5c8134cb9bece3a5cb50bb8265514208d0a65928"}, + {file = "coverage-7.3.4-cp311-cp311-win_amd64.whl", hash = "sha256:11ab62d0ce5d9324915726f611f511a761efcca970bd49d876cf831b4de65be5"}, + {file = "coverage-7.3.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:33e63c578f4acce1b6cd292a66bc30164495010f1091d4b7529d014845cd9bee"}, + {file = "coverage-7.3.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:782693b817218169bfeb9b9ba7f4a9f242764e180ac9589b45112571f32a0ba6"}, + {file = "coverage-7.3.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c4277ddaad9293454da19121c59f2d850f16bcb27f71f89a5c4836906eb35ef"}, + {file = "coverage-7.3.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3d892a19ae24b9801771a5a989fb3e850bd1ad2e2b6e83e949c65e8f37bc67a1"}, + {file = "coverage-7.3.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3024ec1b3a221bd10b5d87337d0373c2bcaf7afd86d42081afe39b3e1820323b"}, + {file = "coverage-7.3.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a1c3e9d2bbd6f3f79cfecd6f20854f4dc0c6e0ec317df2b265266d0dc06535f1"}, + {file = "coverage-7.3.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e91029d7f151d8bf5ab7d8bfe2c3dbefd239759d642b211a677bc0709c9fdb96"}, + {file = "coverage-7.3.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6879fe41c60080aa4bb59703a526c54e0412b77e649a0d06a61782ecf0853ee1"}, + {file = "coverage-7.3.4-cp312-cp312-win32.whl", hash = "sha256:fd2f8a641f8f193968afdc8fd1697e602e199931012b574194052d132a79be13"}, + {file = "coverage-7.3.4-cp312-cp312-win_amd64.whl", hash = "sha256:d1d0ce6c6947a3a4aa5479bebceff2c807b9f3b529b637e2b33dea4468d75fc7"}, + {file = "coverage-7.3.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:36797b3625d1da885b369bdaaa3b0d9fb8865caed3c2b8230afaa6005434aa2f"}, + {file = "coverage-7.3.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bfed0ec4b419fbc807dec417c401499ea869436910e1ca524cfb4f81cf3f60e7"}, + {file = "coverage-7.3.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f97ff5a9fc2ca47f3383482858dd2cb8ddbf7514427eecf5aa5f7992d0571429"}, + {file = "coverage-7.3.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:607b6c6b35aa49defaebf4526729bd5238bc36fe3ef1a417d9839e1d96ee1e4c"}, + {file = "coverage-7.3.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8e258dcc335055ab59fe79f1dec217d9fb0cdace103d6b5c6df6b75915e7959"}, + {file = "coverage-7.3.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a02ac7c51819702b384fea5ee033a7c202f732a2a2f1fe6c41e3d4019828c8d3"}, + {file = "coverage-7.3.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b710869a15b8caf02e31d16487a931dbe78335462a122c8603bb9bd401ff6fb2"}, + {file = "coverage-7.3.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c6a23ae9348a7a92e7f750f9b7e828448e428e99c24616dec93a0720342f241d"}, + {file = "coverage-7.3.4-cp38-cp38-win32.whl", hash = "sha256:758ebaf74578b73f727acc4e8ab4b16ab6f22a5ffd7dd254e5946aba42a4ce76"}, + {file = "coverage-7.3.4-cp38-cp38-win_amd64.whl", hash = "sha256:309ed6a559bc942b7cc721f2976326efbfe81fc2b8f601c722bff927328507dc"}, + {file = "coverage-7.3.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:aefbb29dc56317a4fcb2f3857d5bce9b881038ed7e5aa5d3bcab25bd23f57328"}, + {file = "coverage-7.3.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:183c16173a70caf92e2dfcfe7c7a576de6fa9edc4119b8e13f91db7ca33a7923"}, + {file = "coverage-7.3.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a4184dcbe4f98d86470273e758f1d24191ca095412e4335ff27b417291f5964"}, + {file = "coverage-7.3.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93698ac0995516ccdca55342599a1463ed2e2d8942316da31686d4d614597ef9"}, + {file = "coverage-7.3.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb220b3596358a86361139edce40d97da7458412d412e1e10c8e1970ee8c09ab"}, + {file = "coverage-7.3.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d5b14abde6f8d969e6b9dd8c7a013d9a2b52af1235fe7bebef25ad5c8f47fa18"}, + {file = "coverage-7.3.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:610afaf929dc0e09a5eef6981edb6a57a46b7eceff151947b836d869d6d567c1"}, + {file = "coverage-7.3.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d6ed790728fb71e6b8247bd28e77e99d0c276dff952389b5388169b8ca7b1c28"}, + {file = "coverage-7.3.4-cp39-cp39-win32.whl", hash = "sha256:c15fdfb141fcf6a900e68bfa35689e1256a670db32b96e7a931cab4a0e1600e5"}, + {file = "coverage-7.3.4-cp39-cp39-win_amd64.whl", hash = "sha256:38d0b307c4d99a7aca4e00cad4311b7c51b7ac38fb7dea2abe0d182dd4008e05"}, + {file = "coverage-7.3.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:b1e0f25ae99cf247abfb3f0fac7ae25739e4cd96bf1afa3537827c576b4847e5"}, + {file = "coverage-7.3.4.tar.gz", hash = "sha256:020d56d2da5bc22a0e00a5b0d54597ee91ad72446fa4cf1b97c35022f6b6dbf0"}, ] [package.dependencies] @@ -1571,42 +1571,42 @@ all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)" [[package]] name = "fastavro" -version = "1.9.1" +version = "1.9.2" description = "Fast read/write of AVRO files" optional = false python-versions = ">=3.8" files = [ - {file = "fastavro-1.9.1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:de181b2e67f1f42f0c15f87ff530dda88cfe2efc91653b6d38d0aaf4c8800bbf"}, - {file = "fastavro-1.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84616dae53581733aac1161685d35c269922cee79170d8a1f7dbc56c8e2c6a95"}, - {file = "fastavro-1.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee78b13e118468e6796a97857a02dd2a8076f2946c6ab992a25597ee60a8963"}, - {file = "fastavro-1.9.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:70df5a6428e5c60b08d92a3cf955d2c658e0460059654b0490c908d429bcf332"}, - {file = "fastavro-1.9.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:47f66f8282f7b2b70d4edc1c1853c154a9db14693a20fc1fa78859eb091c6beb"}, - {file = "fastavro-1.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:b558a789b1a24be3b471a2d430a1583e4e18b09896a27ce80211d40c91d3895a"}, - {file = "fastavro-1.9.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cd00aa7a7e463538b3930b27ea98270af11de3a6436b658086802964ae53cfc7"}, - {file = "fastavro-1.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d8037a800914acfd2d17894accfdd9ba96e316bce173e3ac2bc36c9d6f91adb"}, - {file = "fastavro-1.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5a6d15fd3783165113b8292058f06c555fecb7b0bbc0dfd391dc6f320675157"}, - {file = "fastavro-1.9.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:46e69d9fe30ccba8a1a22c2ed2e88deb4ae1ce42f47495f59bd1cac60c3f3e75"}, - {file = "fastavro-1.9.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a06ae6b12b4dfe8fa6c84019a949b44067bf5d7fb051f7101a9093dc2c8c7631"}, - {file = "fastavro-1.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:47f18c4f3f5a945c32d386402cf007f700433fd1b9b6af78eb35ee09a29ba8ad"}, - {file = "fastavro-1.9.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7ce88e5bc88d3d210dca99b69cffc6a7a0538815e86e806730cd79914ac9c17f"}, - {file = "fastavro-1.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16ebff73e08bc6437746e36a131f3a025d49b5867f5975bcc4a3e57cafcb3338"}, - {file = "fastavro-1.9.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b5ebcf4ea3b50cfb80c7cd363e57daab8c2662b85de9ced838e32b5a46a106f"}, - {file = "fastavro-1.9.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2d52c69089f6ce7110665149ced29cb68f2f1cd6812b28ebb53b158b53e069f7"}, - {file = "fastavro-1.9.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e21c23b7d19df260244ae8fb4470ce27399dc1c0129fa523285e39d8ff7b5ef8"}, - {file = "fastavro-1.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:28886022b9c5e5175e44aa04ed10d733b7503028092e38e61ecafe006f839362"}, - {file = "fastavro-1.9.1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:dfdfb3706646397f1c71e6652c9ca23ed29698c5f1bd20f32903589d3ae62219"}, - {file = "fastavro-1.9.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9b1edaebef41500028b6bfbef1a46dc2e5b23f8a5dbde8d8c087b290572e5d2"}, - {file = "fastavro-1.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ff2184d82788ff6d986372e72add561700ccdedea13b649593604d078dbf674"}, - {file = "fastavro-1.9.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:13ae31bb1b9ee69109e4032946d94ab92c1f1c49194917e64bb7f5923ba4f8fd"}, - {file = "fastavro-1.9.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a9f549ee83ae4df5bc952552caad2011272d20a9fb0cddd50ff3fa1edd8d11a9"}, - {file = "fastavro-1.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:b0265fbec0a268baadf3482eb92d0a4f644f68f8dc266a19a0440b7a28987564"}, - {file = "fastavro-1.9.1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:0533a430aafe75bc02fe66391361a5f374f08375a89ec93365cb15c016e7f911"}, - {file = "fastavro-1.9.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dc30d9fa7592b0a652911466a7898547277e7f054e23f95fc5d0e8b88788174"}, - {file = "fastavro-1.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b786f872d5caa34b8c18f2ed73efd99b8b8e1c404342a4242cf3ad7344bdd46c"}, - {file = "fastavro-1.9.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9a9a7213d80eb5e47ffb471c089cfbc19ec5b2390b75f6ef2e09e8678c0f7aeb"}, - {file = "fastavro-1.9.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0b9e9cb05500ed8578ce614a5df4b2b525ded2674320725d405435925addd446"}, - {file = "fastavro-1.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:abfef36fdd2cdbf3b7e7551f6506b908f24e241eebc2ab14e7ff6862679fd1ef"}, - {file = "fastavro-1.9.1.tar.gz", hash = "sha256:f37011d66de8ba81b26760db0478009a14c08ebfd34269b3390abfd4616b308f"}, + {file = "fastavro-1.9.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:223cecf135fd29b83ca6a30035b15b8db169aeaf8dc4f9a5d34afadc4b31638a"}, + {file = "fastavro-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e08c9be8c6f7eed2cf30f8b64d50094cba38a81b751c7db9f9c4be2656715259"}, + {file = "fastavro-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:394f06cc865c6fbae3bbca323633a28a5d914c55dc2c1cdefb75432456ef8f6f"}, + {file = "fastavro-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7a7caadd47bdd04bda534ff70b4b98d2823800c488fd911918115aec4c4dc09b"}, + {file = "fastavro-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:68478a1b8a583d83ad6550e9dceac6cbb148a99a52c3559a0413bf4c0b9c8786"}, + {file = "fastavro-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:b59a1123f1d534743af33fdbda80dd7b9146685bdd7931eae12bee6203065222"}, + {file = "fastavro-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:887c20dc527a549764c91f9e48ece071f2f26d217af66ebcaeb87bf29578fee5"}, + {file = "fastavro-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46458f78b481c12db62d3d8a81bae09cb0b5b521c0d066c6856fc2746908d00d"}, + {file = "fastavro-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f4a2a4bed0e829f79fa1e4f172d484b2179426e827bcc80c0069cc81328a5af"}, + {file = "fastavro-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6167f9bbe1c5a28fbc2db767f97dbbb4981065e6eeafd4e613f6fe76c576ffd4"}, + {file = "fastavro-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d574bc385f820da0404528157238de4e5fdd775d2cb3d05b3b0f1b475d493837"}, + {file = "fastavro-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:ec600eb15b3ec931904c5bf8da62b3b725cb0f369add83ba47d7b5e9322f92a0"}, + {file = "fastavro-1.9.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c82b0761503420cd45f7f50bc31975ac1c75b5118e15434c1d724b751abcc249"}, + {file = "fastavro-1.9.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db62d9b8c944b8d9c481e5f980d5becfd034bdd58c72e27c9333bd504b06bda0"}, + {file = "fastavro-1.9.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65e61f040bc9494646f42a466e9cd428783b82d7161173f3296710723ba5a453"}, + {file = "fastavro-1.9.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6278b93cdd5bef1778c0232ce1f265137f90bc6be97a5c1dd7e0d99a406c0488"}, + {file = "fastavro-1.9.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:cd003ddea5d89720194b6e57011c37221d9fc4ddc750e6f4723516eb659be686"}, + {file = "fastavro-1.9.2-cp312-cp312-win_amd64.whl", hash = "sha256:43f09d100a26e8b59f30dde664d93e423b648e008abfc43132608a18fe8ddcc2"}, + {file = "fastavro-1.9.2-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:3ddffeff5394f285c69f9cd481f47b6cf62379840cdbe6e0dc74683bd589b56e"}, + {file = "fastavro-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e75a2b2ec697d2058a7d96522e921f03f174cf9049ace007c24be7ab58c5370"}, + {file = "fastavro-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fd2e8fd0567483eb0fdada1b979ad4d493305dfdd3f351c82a87df301f0ae1f"}, + {file = "fastavro-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c652dbe3f087c943a5b89f9a50a574e64f23790bfbec335ce2b91a2ae354a443"}, + {file = "fastavro-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bba73e9a1822162f1b3a43de0362f29880014c5c4d49d63ad7fcce339ef73ea2"}, + {file = "fastavro-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:beeef2964bbfd09c539424808539b956d7425afbb7055b89e2aa311374748b56"}, + {file = "fastavro-1.9.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:d5fa48266d75e057b27d8586b823d6d7d7c94593fd989d75033eb4c8078009fb"}, + {file = "fastavro-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b69aeb0d063f5955a0e412f9779444fc452568a49db75a90a8d372f9cb4a01c8"}, + {file = "fastavro-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ce336c59fb40fdb8751bda8cc6076cfcdf9767c3c107f6049e049166b26c61f"}, + {file = "fastavro-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:581036e18661f045415a51ad528865e1d7ba5a9690a3dede9e6ea50f94ed6c4c"}, + {file = "fastavro-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:39b6b5c3cda569c0a130fd2d08d4c53a326ede7e05174a24eda08f7698f70eda"}, + {file = "fastavro-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:d33e40f246bf07f106f9d2da68d0234efcc62276b6e35bde00ff920ea7f871fd"}, + {file = "fastavro-1.9.2.tar.gz", hash = "sha256:5c1ffad986200496bd69b5c4748ae90b5d934d3b1456f33147bee3a0bb17f89b"}, ] [package.extras] @@ -2378,12 +2378,12 @@ testing = ["pytest"] [[package]] name = "google-generativeai" -version = "0.3.1" +version = "0.3.2" description = "Google Generative AI High level API client library and tools." optional = false python-versions = ">=3.9" files = [ - {file = "google_generativeai-0.3.1-py3-none-any.whl", hash = "sha256:800ec6041ca537b897d7ba654f4125651c64b38506f2bfce3b464370e3333a1b"}, + {file = "google_generativeai-0.3.2-py3-none-any.whl", hash = "sha256:8761147e6e167141932dc14a7b7af08f2310dd56668a78d206c19bb8bd85bcd7"}, ] [package.dependencies] @@ -2392,6 +2392,7 @@ google-api-core = "*" google-auth = "*" protobuf = "*" tqdm = "*" +typing-extensions = "*" [package.extras] dev = ["Pillow", "absl-py", "black", "ipython", "nose2", "pandas", "pytype", "pyyaml"] @@ -2462,73 +2463,73 @@ pydantic = ">=1.10,<3" [[package]] name = "greenlet" -version = "3.0.2" +version = "3.0.3" description = "Lightweight in-process concurrent programming" optional = false python-versions = ">=3.7" files = [ - {file = "greenlet-3.0.2-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9acd8fd67c248b8537953cb3af8787c18a87c33d4dcf6830e410ee1f95a63fd4"}, - {file = "greenlet-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:339c0272a62fac7e602e4e6ec32a64ff9abadc638b72f17f6713556ed011d493"}, - {file = "greenlet-3.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38878744926cec29b5cc3654ef47f3003f14bfbba7230e3c8492393fe29cc28b"}, - {file = "greenlet-3.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b3f0497db77cfd034f829678b28267eeeeaf2fc21b3f5041600f7617139e6773"}, - {file = "greenlet-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed1a8a08de7f68506a38f9a2ddb26bbd1480689e66d788fcd4b5f77e2d9ecfcc"}, - {file = "greenlet-3.0.2-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:89a6f6ddcbef4000cda7e205c4c20d319488ff03db961d72d4e73519d2465309"}, - {file = "greenlet-3.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c1f647fe5b94b51488b314c82fdda10a8756d650cee8d3cd29f657c6031bdf73"}, - {file = "greenlet-3.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9560c580c896030ff9c311c603aaf2282234643c90d1dec738a1d93e3e53cd51"}, - {file = "greenlet-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2e9c5423046eec21f6651268cb674dfba97280701e04ef23d312776377313206"}, - {file = "greenlet-3.0.2-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1fd25dfc5879a82103b3d9e43fa952e3026c221996ff4d32a9c72052544835d"}, - {file = "greenlet-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cecfdc950dd25f25d6582952e58521bca749cf3eeb7a9bad69237024308c8196"}, - {file = "greenlet-3.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:edf7a1daba1f7c54326291a8cde58da86ab115b78c91d502be8744f0aa8e3ffa"}, - {file = "greenlet-3.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4cf532bf3c58a862196b06947b1b5cc55503884f9b63bf18582a75228d9950e"}, - {file = "greenlet-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e79fb5a9fb2d0bd3b6573784f5e5adabc0b0566ad3180a028af99523ce8f6138"}, - {file = "greenlet-3.0.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:006c1028ac0cfcc4e772980cfe73f5476041c8c91d15d64f52482fc571149d46"}, - {file = "greenlet-3.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fefd5eb2c0b1adffdf2802ff7df45bfe65988b15f6b972706a0e55d451bffaea"}, - {file = "greenlet-3.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0c0fdb8142742ee68e97c106eb81e7d3e883cc739d9c5f2b28bc38a7bafeb6d1"}, - {file = "greenlet-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:8f8d14a0a4e8c670fbce633d8b9a1ee175673a695475acd838e372966845f764"}, - {file = "greenlet-3.0.2-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:654b84c9527182036747938b81938f1d03fb8321377510bc1854a9370418ab66"}, - {file = "greenlet-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd5bc4fde0842ff2b9cf33382ad0b4db91c2582db836793d58d174c569637144"}, - {file = "greenlet-3.0.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c27b142a9080bdd5869a2fa7ebf407b3c0b24bd812db925de90e9afe3c417fd6"}, - {file = "greenlet-3.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0df7eed98ea23b20e9db64d46eb05671ba33147df9405330695bcd81a73bb0c9"}, - {file = "greenlet-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb5d60805057d8948065338be6320d35e26b0a72f45db392eb32b70dd6dc9227"}, - {file = "greenlet-3.0.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e0e28f5233d64c693382f66d47c362b72089ebf8ac77df7e12ac705c9fa1163d"}, - {file = "greenlet-3.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e4bfa752b3688d74ab1186e2159779ff4867644d2b1ebf16db14281f0445377"}, - {file = "greenlet-3.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c42bb589e6e9f9d8bdd79f02f044dff020d30c1afa6e84c0b56d1ce8a324553c"}, - {file = "greenlet-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:b2cedf279ca38ef3f4ed0d013a6a84a7fc3d9495a716b84a5fc5ff448965f251"}, - {file = "greenlet-3.0.2-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:6d65bec56a7bc352bcf11b275b838df618651109074d455a772d3afe25390b7d"}, - {file = "greenlet-3.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0acadbc3f72cb0ee85070e8d36bd2a4673d2abd10731ee73c10222cf2dd4713c"}, - {file = "greenlet-3.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:14b5d999aefe9ffd2049ad19079f733c3aaa426190ffecadb1d5feacef8fe397"}, - {file = "greenlet-3.0.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f27aa32466993c92d326df982c4acccd9530fe354e938d9e9deada563e71ce76"}, - {file = "greenlet-3.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f34a765c5170c0673eb747213a0275ecc749ab3652bdbec324621ed5b2edaef"}, - {file = "greenlet-3.0.2-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:520fcb53a39ef90f5021c77606952dbbc1da75d77114d69b8d7bded4a8e1a813"}, - {file = "greenlet-3.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d1fceb5351ab1601903e714c3028b37f6ea722be6873f46e349a960156c05650"}, - {file = "greenlet-3.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7363756cc439a503505b67983237d1cc19139b66488263eb19f5719a32597836"}, - {file = "greenlet-3.0.2-cp37-cp37m-win32.whl", hash = "sha256:d5547b462b8099b84746461e882a3eb8a6e3f80be46cb6afb8524eeb191d1a30"}, - {file = "greenlet-3.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:950e21562818f9c771989b5b65f990e76f4ac27af66e1bb34634ae67886ede2a"}, - {file = "greenlet-3.0.2-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:d64643317e76b4b41fdba659e7eca29634e5739b8bc394eda3a9127f697ed4b0"}, - {file = "greenlet-3.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f9ea7c2c9795549653b6f7569f6bc75d2c7d1f6b2854eb8ce0bc6ec3cb2dd88"}, - {file = "greenlet-3.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db4233358d3438369051a2f290f1311a360d25c49f255a6c5d10b5bcb3aa2b49"}, - {file = "greenlet-3.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed9bf77b41798e8417657245b9f3649314218a4a17aefb02bb3992862df32495"}, - {file = "greenlet-3.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4d0df07a38e41a10dfb62c6fc75ede196572b580f48ee49b9282c65639f3965"}, - {file = "greenlet-3.0.2-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10d247260db20887ae8857c0cbc750b9170f0b067dd7d38fb68a3f2334393bd3"}, - {file = "greenlet-3.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a37ae53cca36823597fd5f65341b6f7bac2dd69ecd6ca01334bb795460ab150b"}, - {file = "greenlet-3.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:80d068e4b6e2499847d916ef64176811ead6bf210a610859220d537d935ec6fd"}, - {file = "greenlet-3.0.2-cp38-cp38-win32.whl", hash = "sha256:b1405614692ac986490d10d3e1a05e9734f473750d4bee3cf7d1286ef7af7da6"}, - {file = "greenlet-3.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:8756a94ed8f293450b0e91119eca2a36332deba69feb2f9ca410d35e74eae1e4"}, - {file = "greenlet-3.0.2-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:2c93cd03acb1499ee4de675e1a4ed8eaaa7227f7949dc55b37182047b006a7aa"}, - {file = "greenlet-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1dac09e3c0b78265d2e6d3cbac2d7c48bd1aa4b04a8ffeda3adde9f1688df2c3"}, - {file = "greenlet-3.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ee59c4627c8c4bb3e15949fbcd499abd6b7f4ad9e0bfcb62c65c5e2cabe0ec4"}, - {file = "greenlet-3.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18fe39d70d482b22f0014e84947c5aaa7211fb8e13dc4cc1c43ed2aa1db06d9a"}, - {file = "greenlet-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84bef3cfb6b6bfe258c98c519811c240dbc5b33a523a14933a252e486797c90"}, - {file = "greenlet-3.0.2-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aecea0442975741e7d69daff9b13c83caff8c13eeb17485afa65f6360a045765"}, - {file = "greenlet-3.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f260e6c2337871a52161824058923df2bbddb38bc11a5cbe71f3474d877c5bd9"}, - {file = "greenlet-3.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fc14dd9554f88c9c1fe04771589ae24db76cd56c8f1104e4381b383d6b71aff8"}, - {file = "greenlet-3.0.2-cp39-cp39-win32.whl", hash = "sha256:bfcecc984d60b20ffe30173b03bfe9ba6cb671b0be1e95c3e2056d4fe7006590"}, - {file = "greenlet-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:c235131bf59d2546bb3ebaa8d436126267392f2e51b85ff45ac60f3a26549af0"}, - {file = "greenlet-3.0.2.tar.gz", hash = "sha256:1c1129bc47266d83444c85a8e990ae22688cf05fb20d7951fd2866007c2ba9bc"}, + {file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405"}, + {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f"}, + {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb"}, + {file = "greenlet-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9"}, + {file = "greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22"}, + {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3"}, + {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d"}, + {file = "greenlet-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728"}, + {file = "greenlet-3.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf"}, + {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305"}, + {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6"}, + {file = "greenlet-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2"}, + {file = "greenlet-3.0.3-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41"}, + {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7"}, + {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6"}, + {file = "greenlet-3.0.3-cp37-cp37m-win32.whl", hash = "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d"}, + {file = "greenlet-3.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67"}, + {file = "greenlet-3.0.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4"}, + {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5"}, + {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da"}, + {file = "greenlet-3.0.3-cp38-cp38-win32.whl", hash = "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3"}, + {file = "greenlet-3.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf"}, + {file = "greenlet-3.0.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b"}, + {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6"}, + {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113"}, + {file = "greenlet-3.0.3-cp39-cp39-win32.whl", hash = "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e"}, + {file = "greenlet-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067"}, + {file = "greenlet-3.0.3.tar.gz", hash = "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"}, ] [package.extras] -docs = ["Sphinx"] +docs = ["Sphinx", "furo"] test = ["objgraph", "psutil"] [[package]] @@ -3575,13 +3576,13 @@ zookeeper = ["kazoo (>=2.8.0)"] [[package]] name = "langchain" -version = "0.0.351" +version = "0.0.352" description = "Building applications with LLMs through composability" optional = false python-versions = ">=3.8.1,<4.0" files = [ - {file = "langchain-0.0.351-py3-none-any.whl", hash = "sha256:90cdaee27db2b2aeeb7b0709a79cbfe3e858fc9536b6bc3ea262135a6affc70f"}, - {file = "langchain-0.0.351.tar.gz", hash = "sha256:6bf2a8665a7a3ca2bbd4eea9889ecfd3d39ab23a505549a03860272474399b38"}, + {file = "langchain-0.0.352-py3-none-any.whl", hash = "sha256:43ab580e1223e5d7c3495b3c0cb79e2f3a0ecb52caf8126271fb10d42cede2d0"}, + {file = "langchain-0.0.352.tar.gz", hash = "sha256:8928d7b63d73af9681fe1b2a2b99b84238efef61ed537de666160fd001f41efd"}, ] [package.dependencies] @@ -3615,13 +3616,13 @@ text-helpers = ["chardet (>=5.1.0,<6.0.0)"] [[package]] name = "langchain-community" -version = "0.0.4" +version = "0.0.6" description = "Community contributed LangChain integrations." optional = false python-versions = ">=3.8.1,<4.0" files = [ - {file = "langchain_community-0.0.4-py3-none-any.whl", hash = "sha256:c021357e8d7570e3a5a03eaae9132b818d4376e39f3e865909464c6a9c4e6119"}, - {file = "langchain_community-0.0.4.tar.gz", hash = "sha256:7a5f8fff6272d6472004c86cb0b6202129a15d42bf94fb7da0c2477c5967212c"}, + {file = "langchain_community-0.0.6-py3-none-any.whl", hash = "sha256:13b16da0f89c328df456911ff03069e4d919f647c7dd3bfc5062525cf956ed82"}, + {file = "langchain_community-0.0.6.tar.gz", hash = "sha256:b7deb63fd8205d54b51cf8b1702de15d1da77987f8465c356b158a65adff378c"}, ] [package.dependencies] @@ -3637,17 +3638,17 @@ tenacity = ">=8.1.0,<9.0.0" [package.extras] cli = ["typer (>=0.9.0,<0.10.0)"] -extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.3.11,<0.4.0)", "arxiv (>=1.4,<2.0)", "assemblyai (>=0.17.0,<0.18.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.1.0,<0.2.0)", "chardet (>=5.1.0,<6.0.0)", "cohere (>=4,<5)", "dashvector (>=1.0.1,<2.0.0)", "databricks-vectorsearch (>=0.21,<0.22)", "datasets (>=2.15.0,<3.0.0)", "dgml-utils (>=0.3.0,<0.4.0)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "feedparser (>=6.0.10,<7.0.0)", "fireworks-ai (>=0.9.0,<0.10.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "google-cloud-documentai (>=2.20.1,<3.0.0)", "gql (>=3.4.1,<4.0.0)", "hologres-vector (>=0.0.6,<0.0.7)", "html2text (>=2020.1.16,<2021.0.0)", "javelin-sdk (>=0.1.8,<0.2.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "jsonschema (>1)", "lxml (>=4.9.2,<5.0.0)", "markdownify (>=0.11.6,<0.12.0)", "motor (>=3.3.1,<4.0.0)", "msal (>=1.25.0,<2.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "numexpr (>=2.8.6,<3.0.0)", "openai (<2)", "openapi-pydantic (>=0.3.2,<0.4.0)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "praw (>=7.7.1,<8.0.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "rapidocr-onnxruntime (>=1.3.2,<2.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "rspace_client (>=2.5.0,<3.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "sqlite-vss (>=0.1.2,<0.2.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "timescale-vector (>=0.0.1,<0.0.2)", "tqdm (>=4.48.0)", "upstash-redis (>=0.15.0,<0.16.0)", "xata (>=1.0.0a7,<2.0.0)", "xmltodict (>=0.13.0,<0.14.0)"] +extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.3.11,<0.4.0)", "arxiv (>=1.4,<2.0)", "assemblyai (>=0.17.0,<0.18.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.1.0,<0.2.0)", "chardet (>=5.1.0,<6.0.0)", "cohere (>=4,<5)", "dashvector (>=1.0.1,<2.0.0)", "databricks-vectorsearch (>=0.21,<0.22)", "datasets (>=2.15.0,<3.0.0)", "dgml-utils (>=0.3.0,<0.4.0)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "feedparser (>=6.0.10,<7.0.0)", "fireworks-ai (>=0.9.0,<0.10.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "google-cloud-documentai (>=2.20.1,<3.0.0)", "gql (>=3.4.1,<4.0.0)", "gradientai (>=1.4.0,<2.0.0)", "hologres-vector (>=0.0.6,<0.0.7)", "html2text (>=2020.1.16,<2021.0.0)", "javelin-sdk (>=0.1.8,<0.2.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "jsonschema (>1)", "lxml (>=4.9.2,<5.0.0)", "markdownify (>=0.11.6,<0.12.0)", "motor (>=3.3.1,<4.0.0)", "msal (>=1.25.0,<2.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "numexpr (>=2.8.6,<3.0.0)", "openai (<2)", "openapi-pydantic (>=0.3.2,<0.4.0)", "oracle-ads (>=2.9.1,<3.0.0)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "praw (>=7.7.1,<8.0.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "rapidocr-onnxruntime (>=1.3.2,<2.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "rspace_client (>=2.5.0,<3.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "sqlite-vss (>=0.1.2,<0.2.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "timescale-vector (>=0.0.1,<0.0.2)", "tqdm (>=4.48.0)", "upstash-redis (>=0.15.0,<0.16.0)", "xata (>=1.0.0a7,<2.0.0)", "xmltodict (>=0.13.0,<0.14.0)"] [[package]] name = "langchain-core" -version = "0.1.1" +version = "0.1.3" description = "Building applications with LLMs through composability" optional = false python-versions = ">=3.8.1,<4.0" files = [ - {file = "langchain_core-0.1.1-py3-none-any.whl", hash = "sha256:35b49abde43f37aa2fb2f9a2e11331218036dc34395943d12c2d305d5512a8be"}, - {file = "langchain_core-0.1.1.tar.gz", hash = "sha256:1253acc691548e8ae97c864cc94370d94fbc9e3244751aeaad0b1e9d5150eca4"}, + {file = "langchain_core-0.1.3-py3-none-any.whl", hash = "sha256:bfbbc5dfeb06cfe3fd078e7a12db3a4cfb9d28b715b200a64f7abb7ae1976b17"}, + {file = "langchain_core-0.1.3.tar.gz", hash = "sha256:d8898254dfea1c4ab614f470db40909969604775f7524175f6d9167ea58050c9"}, ] [package.dependencies] @@ -3738,13 +3739,13 @@ langchain = ["langchain (>=0.0.309)"] [[package]] name = "langsmith" -version = "0.0.72" +version = "0.0.74" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false python-versions = ">=3.8.1,<4.0" files = [ - {file = "langsmith-0.0.72-py3-none-any.whl", hash = "sha256:2cddd49cd7d1477409c8785746acf42dbd6709a7d36e751247a3cab5e3eee20e"}, - {file = "langsmith-0.0.72.tar.gz", hash = "sha256:505f517e2e67836a4e831917d8223a18cc59d51bdae1e4295fc6dff2266bab5d"}, + {file = "langsmith-0.0.74-py3-none-any.whl", hash = "sha256:5d573dae3c59c84aca9e4d30a79ef49906151a32bf43830ff83863a825993ac2"}, + {file = "langsmith-0.0.74.tar.gz", hash = "sha256:249dae3625580fc9c1477be447ecd8dc1db76d1c8b59d0296abc027a37a0ce0b"}, ] [package.dependencies] @@ -3835,99 +3836,110 @@ dev = ["Sphinx (==7.2.5)", "colorama (==0.4.5)", "colorama (==0.4.6)", "exceptio [[package]] name = "lxml" -version = "4.9.3" +version = "4.9.4" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" files = [ - {file = "lxml-4.9.3-cp27-cp27m-macosx_11_0_x86_64.whl", hash = "sha256:b0a545b46b526d418eb91754565ba5b63b1c0b12f9bd2f808c852d9b4b2f9b5c"}, - {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:075b731ddd9e7f68ad24c635374211376aa05a281673ede86cbe1d1b3455279d"}, - {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1e224d5755dba2f4a9498e150c43792392ac9b5380aa1b845f98a1618c94eeef"}, - {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0781a98ff5e6586926293e59480b64ddd46282953203c76ae15dbbbf302e8bb"}, - {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cef2502e7e8a96fe5ad686d60b49e1ab03e438bd9123987994528febd569868e"}, - {file = "lxml-4.9.3-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b86164d2cff4d3aaa1f04a14685cbc072efd0b4f99ca5708b2ad1b9b5988a991"}, - {file = "lxml-4.9.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:42871176e7896d5d45138f6d28751053c711ed4d48d8e30b498da155af39aebd"}, - {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:411007c0d88188d9f621b11d252cce90c4a2d1a49db6c068e3c16422f306eab8"}, - {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:cd47b4a0d41d2afa3e58e5bf1f62069255aa2fd6ff5ee41604418ca925911d76"}, - {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e2cb47860da1f7e9a5256254b74ae331687b9672dfa780eed355c4c9c3dbd23"}, - {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1247694b26342a7bf47c02e513d32225ededd18045264d40758abeb3c838a51f"}, - {file = "lxml-4.9.3-cp310-cp310-win32.whl", hash = "sha256:cdb650fc86227eba20de1a29d4b2c1bfe139dc75a0669270033cb2ea3d391b85"}, - {file = "lxml-4.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:97047f0d25cd4bcae81f9ec9dc290ca3e15927c192df17331b53bebe0e3ff96d"}, - {file = "lxml-4.9.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:1f447ea5429b54f9582d4b955f5f1985f278ce5cf169f72eea8afd9502973dd5"}, - {file = "lxml-4.9.3-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:57d6ba0ca2b0c462f339640d22882acc711de224d769edf29962b09f77129cbf"}, - {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:71c52db65e4b56b8ddc5bb89fb2e66c558ed9d1a74a45ceb7dcb20c191c3df2f"}, - {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d73d8ecf8ecf10a3bd007f2192725a34bd62898e8da27eb9d32a58084f93962b"}, - {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0a3d3487f07c1d7f150894c238299934a2a074ef590b583103a45002035be120"}, - {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e28c51fa0ce5674be9f560c6761c1b441631901993f76700b1b30ca6c8378d6"}, - {file = "lxml-4.9.3-cp311-cp311-win32.whl", hash = "sha256:0bfd0767c5c1de2551a120673b72e5d4b628737cb05414f03c3277bf9bed3305"}, - {file = "lxml-4.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:25f32acefac14ef7bd53e4218fe93b804ef6f6b92ffdb4322bb6d49d94cad2bc"}, - {file = "lxml-4.9.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:d3ff32724f98fbbbfa9f49d82852b159e9784d6094983d9a8b7f2ddaebb063d4"}, - {file = "lxml-4.9.3-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:48d6ed886b343d11493129e019da91d4039826794a3e3027321c56d9e71505be"}, - {file = "lxml-4.9.3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9a92d3faef50658dd2c5470af249985782bf754c4e18e15afb67d3ab06233f13"}, - {file = "lxml-4.9.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b4e4bc18382088514ebde9328da057775055940a1f2e18f6ad2d78aa0f3ec5b9"}, - {file = "lxml-4.9.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fc9b106a1bf918db68619fdcd6d5ad4f972fdd19c01d19bdb6bf63f3589a9ec5"}, - {file = "lxml-4.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:d37017287a7adb6ab77e1c5bee9bcf9660f90ff445042b790402a654d2ad81d8"}, - {file = "lxml-4.9.3-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:56dc1f1ebccc656d1b3ed288f11e27172a01503fc016bcabdcbc0978b19352b7"}, - {file = "lxml-4.9.3-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:578695735c5a3f51569810dfebd05dd6f888147a34f0f98d4bb27e92b76e05c2"}, - {file = "lxml-4.9.3-cp35-cp35m-win32.whl", hash = "sha256:704f61ba8c1283c71b16135caf697557f5ecf3e74d9e453233e4771d68a1f42d"}, - {file = "lxml-4.9.3-cp35-cp35m-win_amd64.whl", hash = "sha256:c41bfca0bd3532d53d16fd34d20806d5c2b1ace22a2f2e4c0008570bf2c58833"}, - {file = "lxml-4.9.3-cp36-cp36m-macosx_11_0_x86_64.whl", hash = "sha256:64f479d719dc9f4c813ad9bb6b28f8390360660b73b2e4beb4cb0ae7104f1c12"}, - {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:dd708cf4ee4408cf46a48b108fb9427bfa00b9b85812a9262b5c668af2533ea5"}, - {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c31c7462abdf8f2ac0577d9f05279727e698f97ecbb02f17939ea99ae8daa98"}, - {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:4930be26af26ac545c3dffb662521d4e6268352866956672231887d18f0eaab2"}, - {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4aec80cde9197340bc353d2768e2a75f5f60bacda2bab72ab1dc499589b3878c"}, - {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:14e019fd83b831b2e61baed40cab76222139926b1fb5ed0e79225bc0cae14584"}, - {file = "lxml-4.9.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0c0850c8b02c298d3c7006b23e98249515ac57430e16a166873fc47a5d549287"}, - {file = "lxml-4.9.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:aca086dc5f9ef98c512bac8efea4483eb84abbf926eaeedf7b91479feb092458"}, - {file = "lxml-4.9.3-cp36-cp36m-win32.whl", hash = "sha256:50baa9c1c47efcaef189f31e3d00d697c6d4afda5c3cde0302d063492ff9b477"}, - {file = "lxml-4.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bef4e656f7d98aaa3486d2627e7d2df1157d7e88e7efd43a65aa5dd4714916cf"}, - {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:46f409a2d60f634fe550f7133ed30ad5321ae2e6630f13657fb9479506b00601"}, - {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:4c28a9144688aef80d6ea666c809b4b0e50010a2aca784c97f5e6bf143d9f129"}, - {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:53ace1c1fd5a74ef662f844a0413446c0629d151055340e9893da958a374f70d"}, - {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17a753023436a18e27dd7769e798ce302963c236bc4114ceee5b25c18c52c693"}, - {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7d298a1bd60c067ea75d9f684f5f3992c9d6766fadbc0bcedd39750bf344c2f4"}, - {file = "lxml-4.9.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:081d32421db5df44c41b7f08a334a090a545c54ba977e47fd7cc2deece78809a"}, - {file = "lxml-4.9.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:23eed6d7b1a3336ad92d8e39d4bfe09073c31bfe502f20ca5116b2a334f8ec02"}, - {file = "lxml-4.9.3-cp37-cp37m-win32.whl", hash = "sha256:1509dd12b773c02acd154582088820893109f6ca27ef7291b003d0e81666109f"}, - {file = "lxml-4.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:120fa9349a24c7043854c53cae8cec227e1f79195a7493e09e0c12e29f918e52"}, - {file = "lxml-4.9.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4d2d1edbca80b510443f51afd8496be95529db04a509bc8faee49c7b0fb6d2cc"}, - {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8d7e43bd40f65f7d97ad8ef5c9b1778943d02f04febef12def25f7583d19baac"}, - {file = "lxml-4.9.3-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:6fc3c450eaa0b56f815c7b62f2b7fba7266c4779adcf1cece9e6deb1de7305ce"}, - {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65299ea57d82fb91c7f019300d24050c4ddeb7c5a190e076b5f48a2b43d19c42"}, - {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:eadfbbbfb41b44034a4c757fd5d70baccd43296fb894dba0295606a7cf3124aa"}, - {file = "lxml-4.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3e9bdd30efde2b9ccfa9cb5768ba04fe71b018a25ea093379c857c9dad262c40"}, - {file = "lxml-4.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fcdd00edfd0a3001e0181eab3e63bd5c74ad3e67152c84f93f13769a40e073a7"}, - {file = "lxml-4.9.3-cp38-cp38-win32.whl", hash = "sha256:57aba1bbdf450b726d58b2aea5fe47c7875f5afb2c4a23784ed78f19a0462574"}, - {file = "lxml-4.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:92af161ecbdb2883c4593d5ed4815ea71b31fafd7fd05789b23100d081ecac96"}, - {file = "lxml-4.9.3-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:9bb6ad405121241e99a86efff22d3ef469024ce22875a7ae045896ad23ba2340"}, - {file = "lxml-4.9.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8ed74706b26ad100433da4b9d807eae371efaa266ffc3e9191ea436087a9d6a7"}, - {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:303bf1edce6ced16bf67a18a1cf8339d0db79577eec5d9a6d4a80f0fb10aa2da"}, - {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:5515edd2a6d1a5a70bfcdee23b42ec33425e405c5b351478ab7dc9347228f96e"}, - {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:690dafd0b187ed38583a648076865d8c229661ed20e48f2335d68e2cf7dc829d"}, - {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b6420a005548ad52154c8ceab4a1290ff78d757f9e5cbc68f8c77089acd3c432"}, - {file = "lxml-4.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bb3bb49c7a6ad9d981d734ef7c7193bc349ac338776a0360cc671eaee89bcf69"}, - {file = "lxml-4.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d27be7405547d1f958b60837dc4c1007da90b8b23f54ba1f8b728c78fdb19d50"}, - {file = "lxml-4.9.3-cp39-cp39-win32.whl", hash = "sha256:8df133a2ea5e74eef5e8fc6f19b9e085f758768a16e9877a60aec455ed2609b2"}, - {file = "lxml-4.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:4dd9a263e845a72eacb60d12401e37c616438ea2e5442885f65082c276dfb2b2"}, - {file = "lxml-4.9.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6689a3d7fd13dc687e9102a27e98ef33730ac4fe37795d5036d18b4d527abd35"}, - {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:f6bdac493b949141b733c5345b6ba8f87a226029cbabc7e9e121a413e49441e0"}, - {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c2006f5c8d28dee289f7020f721354362fa304acbaaf9745751ac4006650254b"}, - {file = "lxml-4.9.3-pp38-pypy38_pp73-macosx_11_0_x86_64.whl", hash = "sha256:5c245b783db29c4e4fbbbfc9c5a78be496c9fea25517f90606aa1f6b2b3d5f7b"}, - {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4fb960a632a49f2f089d522f70496640fdf1218f1243889da3822e0a9f5f3ba7"}, - {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9719fe17307a9e814580af1f5c6e05ca593b12fb7e44fe62450a5384dbf61b4b"}, - {file = "lxml-4.9.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3331bece23c9ee066e0fb3f96c61322b9e0f54d775fccefff4c38ca488de283a"}, - {file = "lxml-4.9.3-pp39-pypy39_pp73-macosx_11_0_x86_64.whl", hash = "sha256:ed667f49b11360951e201453fc3967344d0d0263aa415e1619e85ae7fd17b4e0"}, - {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8b77946fd508cbf0fccd8e400a7f71d4ac0e1595812e66025bac475a8e811694"}, - {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fe4bda6bd4340caa6e5cf95e73f8fea5c4bfc55763dd42f1b50a94c1b4a2fbd4"}, - {file = "lxml-4.9.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f3df3db1d336b9356dd3112eae5f5c2b8b377f3bc826848567f10bfddfee77e9"}, - {file = "lxml-4.9.3.tar.gz", hash = "sha256:48628bd53a426c9eb9bc066a923acaa0878d1e86129fd5359aee99285f4eed9c"}, + {file = "lxml-4.9.4-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e214025e23db238805a600f1f37bf9f9a15413c7bf5f9d6ae194f84980c78722"}, + {file = "lxml-4.9.4-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:ec53a09aee61d45e7dbe7e91252ff0491b6b5fee3d85b2d45b173d8ab453efc1"}, + {file = "lxml-4.9.4-cp27-cp27m-win32.whl", hash = "sha256:7d1d6c9e74c70ddf524e3c09d9dc0522aba9370708c2cb58680ea40174800013"}, + {file = "lxml-4.9.4-cp27-cp27m-win_amd64.whl", hash = "sha256:cb53669442895763e61df5c995f0e8361b61662f26c1b04ee82899c2789c8f69"}, + {file = "lxml-4.9.4-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:647bfe88b1997d7ae8d45dabc7c868d8cb0c8412a6e730a7651050b8c7289cf2"}, + {file = "lxml-4.9.4-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:4d973729ce04784906a19108054e1fd476bc85279a403ea1a72fdb051c76fa48"}, + {file = "lxml-4.9.4-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:056a17eaaf3da87a05523472ae84246f87ac2f29a53306466c22e60282e54ff8"}, + {file = "lxml-4.9.4-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:aaa5c173a26960fe67daa69aa93d6d6a1cd714a6eb13802d4e4bd1d24a530644"}, + {file = "lxml-4.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:647459b23594f370c1c01768edaa0ba0959afc39caeeb793b43158bb9bb6a663"}, + {file = "lxml-4.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:bdd9abccd0927673cffe601d2c6cdad1c9321bf3437a2f507d6b037ef91ea307"}, + {file = "lxml-4.9.4-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:00e91573183ad273e242db5585b52670eddf92bacad095ce25c1e682da14ed91"}, + {file = "lxml-4.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a602ed9bd2c7d85bd58592c28e101bd9ff9c718fbde06545a70945ffd5d11868"}, + {file = "lxml-4.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:de362ac8bc962408ad8fae28f3967ce1a262b5d63ab8cefb42662566737f1dc7"}, + {file = "lxml-4.9.4-cp310-cp310-win32.whl", hash = "sha256:33714fcf5af4ff7e70a49731a7cc8fd9ce910b9ac194f66eaa18c3cc0a4c02be"}, + {file = "lxml-4.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:d3caa09e613ece43ac292fbed513a4bce170681a447d25ffcbc1b647d45a39c5"}, + {file = "lxml-4.9.4-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:359a8b09d712df27849e0bcb62c6a3404e780b274b0b7e4c39a88826d1926c28"}, + {file = "lxml-4.9.4-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:43498ea734ccdfb92e1886dfedaebeb81178a241d39a79d5351ba2b671bff2b2"}, + {file = "lxml-4.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:4855161013dfb2b762e02b3f4d4a21cc7c6aec13c69e3bffbf5022b3e708dd97"}, + {file = "lxml-4.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c71b5b860c5215fdbaa56f715bc218e45a98477f816b46cfde4a84d25b13274e"}, + {file = "lxml-4.9.4-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9a2b5915c333e4364367140443b59f09feae42184459b913f0f41b9fed55794a"}, + {file = "lxml-4.9.4-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d82411dbf4d3127b6cde7da0f9373e37ad3a43e89ef374965465928f01c2b979"}, + {file = "lxml-4.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:273473d34462ae6e97c0f4e517bd1bf9588aa67a1d47d93f760a1282640e24ac"}, + {file = "lxml-4.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:389d2b2e543b27962990ab529ac6720c3dded588cc6d0f6557eec153305a3622"}, + {file = "lxml-4.9.4-cp311-cp311-win32.whl", hash = "sha256:8aecb5a7f6f7f8fe9cac0bcadd39efaca8bbf8d1bf242e9f175cbe4c925116c3"}, + {file = "lxml-4.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:c7721a3ef41591341388bb2265395ce522aba52f969d33dacd822da8f018aff8"}, + {file = "lxml-4.9.4-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:dbcb2dc07308453db428a95a4d03259bd8caea97d7f0776842299f2d00c72fc8"}, + {file = "lxml-4.9.4-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:01bf1df1db327e748dcb152d17389cf6d0a8c5d533ef9bab781e9d5037619229"}, + {file = "lxml-4.9.4-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:e8f9f93a23634cfafbad6e46ad7d09e0f4a25a2400e4a64b1b7b7c0fbaa06d9d"}, + {file = "lxml-4.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3f3f00a9061605725df1816f5713d10cd94636347ed651abdbc75828df302b20"}, + {file = "lxml-4.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:953dd5481bd6252bd480d6ec431f61d7d87fdcbbb71b0d2bdcfc6ae00bb6fb10"}, + {file = "lxml-4.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:f1faee2a831fe249e1bae9cbc68d3cd8a30f7e37851deee4d7962b17c410dd56"}, + {file = "lxml-4.9.4-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:23d891e5bdc12e2e506e7d225d6aa929e0a0368c9916c1fddefab88166e98b20"}, + {file = "lxml-4.9.4-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e96a1788f24d03e8d61679f9881a883ecdf9c445a38f9ae3f3f193ab6c591c66"}, + {file = "lxml-4.9.4-cp36-cp36m-macosx_11_0_x86_64.whl", hash = "sha256:5557461f83bb7cc718bc9ee1f7156d50e31747e5b38d79cf40f79ab1447afd2d"}, + {file = "lxml-4.9.4-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:fdb325b7fba1e2c40b9b1db407f85642e32404131c08480dd652110fc908561b"}, + {file = "lxml-4.9.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d74d4a3c4b8f7a1f676cedf8e84bcc57705a6d7925e6daef7a1e54ae543a197"}, + {file = "lxml-4.9.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:ac7674d1638df129d9cb4503d20ffc3922bd463c865ef3cb412f2c926108e9a4"}, + {file = "lxml-4.9.4-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:ddd92e18b783aeb86ad2132d84a4b795fc5ec612e3545c1b687e7747e66e2b53"}, + {file = "lxml-4.9.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2bd9ac6e44f2db368ef8986f3989a4cad3de4cd55dbdda536e253000c801bcc7"}, + {file = "lxml-4.9.4-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:bc354b1393dce46026ab13075f77b30e40b61b1a53e852e99d3cc5dd1af4bc85"}, + {file = "lxml-4.9.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:f836f39678cb47c9541f04d8ed4545719dc31ad850bf1832d6b4171e30d65d23"}, + {file = "lxml-4.9.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:9c131447768ed7bc05a02553d939e7f0e807e533441901dd504e217b76307745"}, + {file = "lxml-4.9.4-cp36-cp36m-win32.whl", hash = "sha256:bafa65e3acae612a7799ada439bd202403414ebe23f52e5b17f6ffc2eb98c2be"}, + {file = "lxml-4.9.4-cp36-cp36m-win_amd64.whl", hash = "sha256:6197c3f3c0b960ad033b9b7d611db11285bb461fc6b802c1dd50d04ad715c225"}, + {file = "lxml-4.9.4-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:7b378847a09d6bd46047f5f3599cdc64fcb4cc5a5a2dd0a2af610361fbe77b16"}, + {file = "lxml-4.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:1343df4e2e6e51182aad12162b23b0a4b3fd77f17527a78c53f0f23573663545"}, + {file = "lxml-4.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:6dbdacf5752fbd78ccdb434698230c4f0f95df7dd956d5f205b5ed6911a1367c"}, + {file = "lxml-4.9.4-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:506becdf2ecaebaf7f7995f776394fcc8bd8a78022772de66677c84fb02dd33d"}, + {file = "lxml-4.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca8e44b5ba3edb682ea4e6185b49661fc22b230cf811b9c13963c9f982d1d964"}, + {file = "lxml-4.9.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9d9d5726474cbbef279fd709008f91a49c4f758bec9c062dfbba88eab00e3ff9"}, + {file = "lxml-4.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:bbdd69e20fe2943b51e2841fc1e6a3c1de460d630f65bde12452d8c97209464d"}, + {file = "lxml-4.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8671622256a0859f5089cbe0ce4693c2af407bc053dcc99aadff7f5310b4aa02"}, + {file = "lxml-4.9.4-cp37-cp37m-win32.whl", hash = "sha256:dd4fda67f5faaef4f9ee5383435048ee3e11ad996901225ad7615bc92245bc8e"}, + {file = "lxml-4.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6bee9c2e501d835f91460b2c904bc359f8433e96799f5c2ff20feebd9bb1e590"}, + {file = "lxml-4.9.4-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:1f10f250430a4caf84115b1e0f23f3615566ca2369d1962f82bef40dd99cd81a"}, + {file = "lxml-4.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:3b505f2bbff50d261176e67be24e8909e54b5d9d08b12d4946344066d66b3e43"}, + {file = "lxml-4.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1449f9451cd53e0fd0a7ec2ff5ede4686add13ac7a7bfa6988ff6d75cff3ebe2"}, + {file = "lxml-4.9.4-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:4ece9cca4cd1c8ba889bfa67eae7f21d0d1a2e715b4d5045395113361e8c533d"}, + {file = "lxml-4.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59bb5979f9941c61e907ee571732219fa4774d5a18f3fa5ff2df963f5dfaa6bc"}, + {file = "lxml-4.9.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b1980dbcaad634fe78e710c8587383e6e3f61dbe146bcbfd13a9c8ab2d7b1192"}, + {file = "lxml-4.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9ae6c3363261021144121427b1552b29e7b59de9d6a75bf51e03bc072efb3c37"}, + {file = "lxml-4.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bcee502c649fa6351b44bb014b98c09cb00982a475a1912a9881ca28ab4f9cd9"}, + {file = "lxml-4.9.4-cp38-cp38-win32.whl", hash = "sha256:a8edae5253efa75c2fc79a90068fe540b197d1c7ab5803b800fccfe240eed33c"}, + {file = "lxml-4.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:701847a7aaefef121c5c0d855b2affa5f9bd45196ef00266724a80e439220e46"}, + {file = "lxml-4.9.4-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:f610d980e3fccf4394ab3806de6065682982f3d27c12d4ce3ee46a8183d64a6a"}, + {file = "lxml-4.9.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:aa9b5abd07f71b081a33115d9758ef6077924082055005808f68feccb27616bd"}, + {file = "lxml-4.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:365005e8b0718ea6d64b374423e870648ab47c3a905356ab6e5a5ff03962b9a9"}, + {file = "lxml-4.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:16b9ec51cc2feab009e800f2c6327338d6ee4e752c76e95a35c4465e80390ccd"}, + {file = "lxml-4.9.4-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:a905affe76f1802edcac554e3ccf68188bea16546071d7583fb1b693f9cf756b"}, + {file = "lxml-4.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fd814847901df6e8de13ce69b84c31fc9b3fb591224d6762d0b256d510cbf382"}, + {file = "lxml-4.9.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:91bbf398ac8bb7d65a5a52127407c05f75a18d7015a270fdd94bbcb04e65d573"}, + {file = "lxml-4.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f99768232f036b4776ce419d3244a04fe83784bce871b16d2c2e984c7fcea847"}, + {file = "lxml-4.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bb5bd6212eb0edfd1e8f254585290ea1dadc3687dd8fd5e2fd9a87c31915cdab"}, + {file = "lxml-4.9.4-cp39-cp39-win32.whl", hash = "sha256:88f7c383071981c74ec1998ba9b437659e4fd02a3c4a4d3efc16774eb108d0ec"}, + {file = "lxml-4.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:936e8880cc00f839aa4173f94466a8406a96ddce814651075f95837316369899"}, + {file = "lxml-4.9.4-pp310-pypy310_pp73-macosx_11_0_x86_64.whl", hash = "sha256:f6c35b2f87c004270fa2e703b872fcc984d714d430b305145c39d53074e1ffe0"}, + {file = "lxml-4.9.4-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:606d445feeb0856c2b424405236a01c71af7c97e5fe42fbc778634faef2b47e4"}, + {file = "lxml-4.9.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a1bdcbebd4e13446a14de4dd1825f1e778e099f17f79718b4aeaf2403624b0f7"}, + {file = "lxml-4.9.4-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0a08c89b23117049ba171bf51d2f9c5f3abf507d65d016d6e0fa2f37e18c0fc5"}, + {file = "lxml-4.9.4-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:232fd30903d3123be4c435fb5159938c6225ee8607b635a4d3fca847003134ba"}, + {file = "lxml-4.9.4-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:231142459d32779b209aa4b4d460b175cadd604fed856f25c1571a9d78114771"}, + {file = "lxml-4.9.4-pp38-pypy38_pp73-macosx_11_0_x86_64.whl", hash = "sha256:520486f27f1d4ce9654154b4494cf9307b495527f3a2908ad4cb48e4f7ed7ef7"}, + {file = "lxml-4.9.4-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:562778586949be7e0d7435fcb24aca4810913771f845d99145a6cee64d5b67ca"}, + {file = "lxml-4.9.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:a9e7c6d89c77bb2770c9491d988f26a4b161d05c8ca58f63fb1f1b6b9a74be45"}, + {file = "lxml-4.9.4-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:786d6b57026e7e04d184313c1359ac3d68002c33e4b1042ca58c362f1d09ff58"}, + {file = "lxml-4.9.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:95ae6c5a196e2f239150aa4a479967351df7f44800c93e5a975ec726fef005e2"}, + {file = "lxml-4.9.4-pp39-pypy39_pp73-macosx_11_0_x86_64.whl", hash = "sha256:9b556596c49fa1232b0fff4b0e69b9d4083a502e60e404b44341e2f8fb7187f5"}, + {file = "lxml-4.9.4-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:cc02c06e9e320869d7d1bd323df6dd4281e78ac2e7f8526835d3d48c69060683"}, + {file = "lxml-4.9.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:857d6565f9aa3464764c2cb6a2e3c2e75e1970e877c188f4aeae45954a314e0c"}, + {file = "lxml-4.9.4-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c42ae7e010d7d6bc51875d768110c10e8a59494855c3d4c348b068f5fb81fdcd"}, + {file = "lxml-4.9.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f10250bb190fb0742e3e1958dd5c100524c2cc5096c67c8da51233f7448dc137"}, + {file = "lxml-4.9.4.tar.gz", hash = "sha256:b1541e50b78e15fa06a2670157a1962ef06591d4c998b998047fff5e3236880e"}, ] [package.extras] cssselect = ["cssselect (>=0.7)"] html5 = ["html5lib"] htmlsoup = ["BeautifulSoup4"] -source = ["Cython (>=0.29.35)"] +source = ["Cython (==0.29.37)"] [[package]] name = "mako" @@ -4326,38 +4338,38 @@ dill = ">=0.3.7" [[package]] name = "mypy" -version = "1.7.1" +version = "1.8.0" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:12cce78e329838d70a204293e7b29af9faa3ab14899aec397798a4b41be7f340"}, - {file = "mypy-1.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1484b8fa2c10adf4474f016e09d7a159602f3239075c7bf9f1627f5acf40ad49"}, - {file = "mypy-1.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31902408f4bf54108bbfb2e35369877c01c95adc6192958684473658c322c8a5"}, - {file = "mypy-1.7.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f2c2521a8e4d6d769e3234350ba7b65ff5d527137cdcde13ff4d99114b0c8e7d"}, - {file = "mypy-1.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:fcd2572dd4519e8a6642b733cd3a8cfc1ef94bafd0c1ceed9c94fe736cb65b6a"}, - {file = "mypy-1.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4b901927f16224d0d143b925ce9a4e6b3a758010673eeded9b748f250cf4e8f7"}, - {file = "mypy-1.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2f7f6985d05a4e3ce8255396df363046c28bea790e40617654e91ed580ca7c51"}, - {file = "mypy-1.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:944bdc21ebd620eafefc090cdf83158393ec2b1391578359776c00de00e8907a"}, - {file = "mypy-1.7.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9c7ac372232c928fff0645d85f273a726970c014749b924ce5710d7d89763a28"}, - {file = "mypy-1.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:f6efc9bd72258f89a3816e3a98c09d36f079c223aa345c659622f056b760ab42"}, - {file = "mypy-1.7.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6dbdec441c60699288adf051f51a5d512b0d818526d1dcfff5a41f8cd8b4aaf1"}, - {file = "mypy-1.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4fc3d14ee80cd22367caaaf6e014494415bf440980a3045bf5045b525680ac33"}, - {file = "mypy-1.7.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c6e4464ed5f01dc44dc9821caf67b60a4e5c3b04278286a85c067010653a0eb"}, - {file = "mypy-1.7.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:d9b338c19fa2412f76e17525c1b4f2c687a55b156320acb588df79f2e6fa9fea"}, - {file = "mypy-1.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:204e0d6de5fd2317394a4eff62065614c4892d5a4d1a7ee55b765d7a3d9e3f82"}, - {file = "mypy-1.7.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:84860e06ba363d9c0eeabd45ac0fde4b903ad7aa4f93cd8b648385a888e23200"}, - {file = "mypy-1.7.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8c5091ebd294f7628eb25ea554852a52058ac81472c921150e3a61cdd68f75a7"}, - {file = "mypy-1.7.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40716d1f821b89838589e5b3106ebbc23636ffdef5abc31f7cd0266db936067e"}, - {file = "mypy-1.7.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5cf3f0c5ac72139797953bd50bc6c95ac13075e62dbfcc923571180bebb662e9"}, - {file = "mypy-1.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:78e25b2fd6cbb55ddfb8058417df193f0129cad5f4ee75d1502248e588d9e0d7"}, - {file = "mypy-1.7.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:75c4d2a6effd015786c87774e04331b6da863fc3fc4e8adfc3b40aa55ab516fe"}, - {file = "mypy-1.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2643d145af5292ee956aa0a83c2ce1038a3bdb26e033dadeb2f7066fb0c9abce"}, - {file = "mypy-1.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75aa828610b67462ffe3057d4d8a4112105ed211596b750b53cbfe182f44777a"}, - {file = "mypy-1.7.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ee5d62d28b854eb61889cde4e1dbc10fbaa5560cb39780c3995f6737f7e82120"}, - {file = "mypy-1.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:72cf32ce7dd3562373f78bd751f73c96cfb441de147cc2448a92c1a308bd0ca6"}, - {file = "mypy-1.7.1-py3-none-any.whl", hash = "sha256:f7c5d642db47376a0cc130f0de6d055056e010debdaf0707cd2b0fc7e7ef30ea"}, - {file = "mypy-1.7.1.tar.gz", hash = "sha256:fcb6d9afb1b6208b4c712af0dafdc650f518836065df0d4fb1d800f5d6773db2"}, + {file = "mypy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485a8942f671120f76afffff70f259e1cd0f0cfe08f81c05d8816d958d4577d3"}, + {file = "mypy-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:df9824ac11deaf007443e7ed2a4a26bebff98d2bc43c6da21b2b64185da011c4"}, + {file = "mypy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2afecd6354bbfb6e0160f4e4ad9ba6e4e003b767dd80d85516e71f2e955ab50d"}, + {file = "mypy-1.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8963b83d53ee733a6e4196954502b33567ad07dfd74851f32be18eb932fb1cb9"}, + {file = "mypy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:e46f44b54ebddbeedbd3d5b289a893219065ef805d95094d16a0af6630f5d410"}, + {file = "mypy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:855fe27b80375e5c5878492f0729540db47b186509c98dae341254c8f45f42ae"}, + {file = "mypy-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c886c6cce2d070bd7df4ec4a05a13ee20c0aa60cb587e8d1265b6c03cf91da3"}, + {file = "mypy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d19c413b3c07cbecf1f991e2221746b0d2a9410b59cb3f4fb9557f0365a1a817"}, + {file = "mypy-1.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9261ed810972061388918c83c3f5cd46079d875026ba97380f3e3978a72f503d"}, + {file = "mypy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:51720c776d148bad2372ca21ca29256ed483aa9a4cdefefcef49006dff2a6835"}, + {file = "mypy-1.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:52825b01f5c4c1c4eb0db253ec09c7aa17e1a7304d247c48b6f3599ef40db8bd"}, + {file = "mypy-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f5ac9a4eeb1ec0f1ccdc6f326bcdb464de5f80eb07fb38b5ddd7b0de6bc61e55"}, + {file = "mypy-1.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afe3fe972c645b4632c563d3f3eff1cdca2fa058f730df2b93a35e3b0c538218"}, + {file = "mypy-1.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:42c6680d256ab35637ef88891c6bd02514ccb7e1122133ac96055ff458f93fc3"}, + {file = "mypy-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:720a5ca70e136b675af3af63db533c1c8c9181314d207568bbe79051f122669e"}, + {file = "mypy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:028cf9f2cae89e202d7b6593cd98db6759379f17a319b5faf4f9978d7084cdc6"}, + {file = "mypy-1.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4e6d97288757e1ddba10dd9549ac27982e3e74a49d8d0179fc14d4365c7add66"}, + {file = "mypy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f1478736fcebb90f97e40aff11a5f253af890c845ee0c850fe80aa060a267c6"}, + {file = "mypy-1.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42419861b43e6962a649068a61f4a4839205a3ef525b858377a960b9e2de6e0d"}, + {file = "mypy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:2b5b6c721bd4aabaadead3a5e6fa85c11c6c795e0c81a7215776ef8afc66de02"}, + {file = "mypy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c1538c38584029352878a0466f03a8ee7547d7bd9f641f57a0f3017a7c905b8"}, + {file = "mypy-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ef4be7baf08a203170f29e89d79064463b7fc7a0908b9d0d5114e8009c3a259"}, + {file = "mypy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178def594014aa6c35a8ff411cf37d682f428b3b5617ca79029d8ae72f5402b"}, + {file = "mypy-1.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ab3c84fa13c04aeeeabb2a7f67a25ef5d77ac9d6486ff33ded762ef353aa5592"}, + {file = "mypy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:99b00bc72855812a60d253420d8a2eae839b0afa4938f09f4d2aa9bb4654263a"}, + {file = "mypy-1.8.0-py3-none-any.whl", hash = "sha256:538fd81bb5e430cc1381a443971c0475582ff9f434c16cd46d2c66763ce85d9d"}, + {file = "mypy-1.8.0.tar.gz", hash = "sha256:6ff8b244d7085a0b425b56d327b480c3b29cafbd2eff27316a004f9a7391ae07"}, ] [package.dependencies] @@ -4738,13 +4750,13 @@ sympy = "*" [[package]] name = "openai" -version = "1.5.0" +version = "1.6.1" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.5.0-py3-none-any.whl", hash = "sha256:42d8c84b0714c990e18afe81d37f8a64423e8196bf7157b8ea665b8d8f393253"}, - {file = "openai-1.5.0.tar.gz", hash = "sha256:4cd91e97988ccd6c44f815107def9495cbc718aeb8b28be33a87b6fa2c432508"}, + {file = "openai-1.6.1-py3-none-any.whl", hash = "sha256:bc9f774838d67ac29fb24cdeb2d58faf57de8b311085dcd1348f7aa02a96c7ee"}, + {file = "openai-1.6.1.tar.gz", hash = "sha256:d553ca9dbf9486b08e75b09e8671e4f638462aaadccfced632bf490fc3d75fa2"}, ] [package.dependencies] @@ -4754,20 +4766,20 @@ httpx = ">=0.23.0,<1" pydantic = ">=1.9.0,<3" sniffio = "*" tqdm = ">4" -typing-extensions = ">=4.5,<5" +typing-extensions = ">=4.7,<5" [package.extras] datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] [[package]] name = "opentelemetry-api" -version = "1.21.0" +version = "1.22.0" description = "OpenTelemetry Python API" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_api-1.21.0-py3-none-any.whl", hash = "sha256:4bb86b28627b7e41098f0e93280fe4892a1abed1b79a19aec6f928f39b17dffb"}, - {file = "opentelemetry_api-1.21.0.tar.gz", hash = "sha256:d6185fd5043e000075d921822fd2d26b953eba8ca21b1e2fa360dd46a7686316"}, + {file = "opentelemetry_api-1.22.0-py3-none-any.whl", hash = "sha256:43621514301a7e9f5d06dd8013a1b450f30c2e9372b8e30aaeb4562abf2ce034"}, + {file = "opentelemetry_api-1.22.0.tar.gz", hash = "sha256:15ae4ca925ecf9cfdfb7a709250846fbb08072260fca08ade78056c502b86bed"}, ] [package.dependencies] @@ -4776,43 +4788,43 @@ importlib-metadata = ">=6.0,<7.0" [[package]] name = "opentelemetry-exporter-otlp" -version = "1.21.0" +version = "1.22.0" description = "OpenTelemetry Collector Exporters" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_exporter_otlp-1.21.0-py3-none-any.whl", hash = "sha256:40552c016ad3f26c1650b0f08acbf0fef96d57b056a07d4dd00b6df3d5c27b7e"}, - {file = "opentelemetry_exporter_otlp-1.21.0.tar.gz", hash = "sha256:2a959e6893b14d737f259d309e972f6b7343ab2be58e592fa6d8c23127f62875"}, + {file = "opentelemetry_exporter_otlp-1.22.0-py3-none-any.whl", hash = "sha256:cb03a1cbf300e12b47690858be13dd26fe2f60b2610204959f3497cd6645e3a1"}, + {file = "opentelemetry_exporter_otlp-1.22.0.tar.gz", hash = "sha256:309a7d4dc67602801f15818e110ce452e78989886aaab5d37e7cf7f55f1d3d27"}, ] [package.dependencies] -opentelemetry-exporter-otlp-proto-grpc = "1.21.0" -opentelemetry-exporter-otlp-proto-http = "1.21.0" +opentelemetry-exporter-otlp-proto-grpc = "1.22.0" +opentelemetry-exporter-otlp-proto-http = "1.22.0" [[package]] name = "opentelemetry-exporter-otlp-proto-common" -version = "1.21.0" +version = "1.22.0" description = "OpenTelemetry Protobuf encoding" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_exporter_otlp_proto_common-1.21.0-py3-none-any.whl", hash = "sha256:97b1022b38270ec65d11fbfa348e0cd49d12006485c2321ea3b1b7037d42b6ec"}, - {file = "opentelemetry_exporter_otlp_proto_common-1.21.0.tar.gz", hash = "sha256:61db274d8a68d636fb2ec2a0f281922949361cdd8236e25ff5539edf942b3226"}, + {file = "opentelemetry_exporter_otlp_proto_common-1.22.0-py3-none-any.whl", hash = "sha256:3f2538bec5312587f8676c332b3747f54c89fe6364803a807e217af4603201fa"}, + {file = "opentelemetry_exporter_otlp_proto_common-1.22.0.tar.gz", hash = "sha256:71ae2f81bc6d6fe408d06388826edc8933759b2ca3a97d24054507dc7cfce52d"}, ] [package.dependencies] backoff = {version = ">=1.10.0,<3.0.0", markers = "python_version >= \"3.7\""} -opentelemetry-proto = "1.21.0" +opentelemetry-proto = "1.22.0" [[package]] name = "opentelemetry-exporter-otlp-proto-grpc" -version = "1.21.0" +version = "1.22.0" description = "OpenTelemetry Collector Protobuf over gRPC Exporter" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_exporter_otlp_proto_grpc-1.21.0-py3-none-any.whl", hash = "sha256:ab37c63d6cb58d6506f76d71d07018eb1f561d83e642a8f5aa53dddf306087a4"}, - {file = "opentelemetry_exporter_otlp_proto_grpc-1.21.0.tar.gz", hash = "sha256:a497c5611245a2d17d9aa1e1cbb7ab567843d53231dcc844a62cea9f0924ffa7"}, + {file = "opentelemetry_exporter_otlp_proto_grpc-1.22.0-py3-none-any.whl", hash = "sha256:b5bcadc129272004316a455e9081216d3380c1fc2231a928ea6a70aa90e173fb"}, + {file = "opentelemetry_exporter_otlp_proto_grpc-1.22.0.tar.gz", hash = "sha256:1e0e5aa4bbabc74942f06f268deffd94851d12a8dc30b02527472ef1729fe5b1"}, ] [package.dependencies] @@ -4821,22 +4833,22 @@ deprecated = ">=1.2.6" googleapis-common-protos = ">=1.52,<2.0" grpcio = ">=1.0.0,<2.0.0" opentelemetry-api = ">=1.15,<2.0" -opentelemetry-exporter-otlp-proto-common = "1.21.0" -opentelemetry-proto = "1.21.0" -opentelemetry-sdk = ">=1.21.0,<1.22.0" +opentelemetry-exporter-otlp-proto-common = "1.22.0" +opentelemetry-proto = "1.22.0" +opentelemetry-sdk = ">=1.22.0,<1.23.0" [package.extras] test = ["pytest-grpc"] [[package]] name = "opentelemetry-exporter-otlp-proto-http" -version = "1.21.0" +version = "1.22.0" description = "OpenTelemetry Collector Protobuf over HTTP Exporter" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_exporter_otlp_proto_http-1.21.0-py3-none-any.whl", hash = "sha256:56837773de6fb2714c01fc4895caebe876f6397bbc4d16afddf89e1299a55ee2"}, - {file = "opentelemetry_exporter_otlp_proto_http-1.21.0.tar.gz", hash = "sha256:19d60afa4ae8597f7ef61ad75c8b6c6b7ef8cb73a33fb4aed4dbc86d5c8d3301"}, + {file = "opentelemetry_exporter_otlp_proto_http-1.22.0-py3-none-any.whl", hash = "sha256:e002e842190af45b91dc55a97789d0b98e4308c88d886b16049ee90e17a4d396"}, + {file = "opentelemetry_exporter_otlp_proto_http-1.22.0.tar.gz", hash = "sha256:79ed108981ec68d5f7985355bca32003c2f3a5be1534a96d62d5861b758a82f4"}, ] [package.dependencies] @@ -4844,9 +4856,9 @@ backoff = {version = ">=1.10.0,<3.0.0", markers = "python_version >= \"3.7\""} deprecated = ">=1.2.6" googleapis-common-protos = ">=1.52,<2.0" opentelemetry-api = ">=1.15,<2.0" -opentelemetry-exporter-otlp-proto-common = "1.21.0" -opentelemetry-proto = "1.21.0" -opentelemetry-sdk = ">=1.21.0,<1.22.0" +opentelemetry-exporter-otlp-proto-common = "1.22.0" +opentelemetry-proto = "1.22.0" +opentelemetry-sdk = ">=1.22.0,<1.23.0" requests = ">=2.7,<3.0" [package.extras] @@ -4870,12 +4882,12 @@ prometheus-client = ">=0.5.0,<1.0.0" [[package]] name = "opentelemetry-instrumentation" -version = "0.42b0" +version = "0.43b0" description = "Instrumentation Tools & Auto Instrumentation for OpenTelemetry Python" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_instrumentation-0.42b0-py3-none-any.whl", hash = "sha256:65ae54ddb90ca2d05d2d16bf6863173e7141eba1bbbf41fc9bbb02446adbe369"}, + {file = "opentelemetry_instrumentation-0.43b0-py3-none-any.whl", hash = "sha256:0ff1334d7e359e27640e9d420024efeb73eacae464309c2e14ede7ba6c93967e"}, ] [package.dependencies] @@ -4885,19 +4897,19 @@ wrapt = ">=1.0.0,<2.0.0" [[package]] name = "opentelemetry-instrumentation-aiohttp-client" -version = "0.42b0" +version = "0.43b0" description = "OpenTelemetry aiohttp client instrumentation" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_instrumentation_aiohttp_client-0.42b0-py3-none-any.whl", hash = "sha256:130a58fe4a702a5c828e87190c1bba8321fd2ecdad0834daeb90b494e51369c7"}, + {file = "opentelemetry_instrumentation_aiohttp_client-0.43b0-py3-none-any.whl", hash = "sha256:305de7a2e1e5f4c6882a3048d0f6551033a53818465ba270ddb35502a1348874"}, ] [package.dependencies] opentelemetry-api = ">=1.12,<2.0" -opentelemetry-instrumentation = "0.42b0" -opentelemetry-semantic-conventions = "0.42b0" -opentelemetry-util-http = "0.42b0" +opentelemetry-instrumentation = "0.43b0" +opentelemetry-semantic-conventions = "0.43b0" +opentelemetry-util-http = "0.43b0" wrapt = ">=1.0.0,<2.0.0" [package.extras] @@ -4906,79 +4918,79 @@ test = ["http-server-mock", "opentelemetry-instrumentation-aiohttp-client[instru [[package]] name = "opentelemetry-instrumentation-asgi" -version = "0.42b0" +version = "0.43b0" description = "ASGI instrumentation for OpenTelemetry" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_instrumentation_asgi-0.42b0-py3-none-any.whl", hash = "sha256:79b7278fb614aba1bf2211060960d3e8501c1d7d9314b857b30ad80ba34a2805"}, - {file = "opentelemetry_instrumentation_asgi-0.42b0.tar.gz", hash = "sha256:da1d5dd4f172c44c6c100dae352e1fd0ae36dc4f266b3fed68ce9d5ab94c9146"}, + {file = "opentelemetry_instrumentation_asgi-0.43b0-py3-none-any.whl", hash = "sha256:1f593829fa039e9367820736fb063e92acd15c25b53d7bcb5d319971b8e93fd7"}, + {file = "opentelemetry_instrumentation_asgi-0.43b0.tar.gz", hash = "sha256:3f6f19333dca31ef696672e4e36cb1c2613c71dc7e847c11ff36a37e1130dadc"}, ] [package.dependencies] asgiref = ">=3.0,<4.0" opentelemetry-api = ">=1.12,<2.0" -opentelemetry-instrumentation = "0.42b0" -opentelemetry-semantic-conventions = "0.42b0" -opentelemetry-util-http = "0.42b0" +opentelemetry-instrumentation = "0.43b0" +opentelemetry-semantic-conventions = "0.43b0" +opentelemetry-util-http = "0.43b0" [package.extras] instruments = ["asgiref (>=3.0,<4.0)"] -test = ["opentelemetry-instrumentation-asgi[instruments]", "opentelemetry-test-utils (==0.42b0)"] +test = ["opentelemetry-instrumentation-asgi[instruments]", "opentelemetry-test-utils (==0.43b0)"] [[package]] name = "opentelemetry-instrumentation-fastapi" -version = "0.42b0" +version = "0.43b0" description = "OpenTelemetry FastAPI Instrumentation" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_instrumentation_fastapi-0.42b0-py3-none-any.whl", hash = "sha256:d53a26c4859767d5ba67109038cabc7165d97a8a8b7654ccde4ce290036d1725"}, - {file = "opentelemetry_instrumentation_fastapi-0.42b0.tar.gz", hash = "sha256:7181d4886e57182e93477c4b797a7cd5467820b93c238eeb3e7d27a563c176e8"}, + {file = "opentelemetry_instrumentation_fastapi-0.43b0-py3-none-any.whl", hash = "sha256:b79c044df68a52e07b35fa12a424e7cc0dd27ff0a171c5fdcc41dea9de8fc938"}, + {file = "opentelemetry_instrumentation_fastapi-0.43b0.tar.gz", hash = "sha256:2afaaf470622e1a2732182c68f6d2431ffe5e026a7edacd0f83605632b66347f"}, ] [package.dependencies] opentelemetry-api = ">=1.12,<2.0" -opentelemetry-instrumentation = "0.42b0" -opentelemetry-instrumentation-asgi = "0.42b0" -opentelemetry-semantic-conventions = "0.42b0" -opentelemetry-util-http = "0.42b0" +opentelemetry-instrumentation = "0.43b0" +opentelemetry-instrumentation-asgi = "0.43b0" +opentelemetry-semantic-conventions = "0.43b0" +opentelemetry-util-http = "0.43b0" [package.extras] instruments = ["fastapi (>=0.58,<1.0)"] -test = ["httpx (>=0.22,<1.0)", "opentelemetry-instrumentation-fastapi[instruments]", "opentelemetry-test-utils (==0.42b0)", "requests (>=2.23,<3.0)"] +test = ["httpx (>=0.22,<1.0)", "opentelemetry-instrumentation-fastapi[instruments]", "opentelemetry-test-utils (==0.43b0)", "requests (>=2.23,<3.0)"] [[package]] name = "opentelemetry-instrumentation-grpc" -version = "0.42b0" +version = "0.43b0" description = "OpenTelemetry gRPC instrumentation" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_instrumentation_grpc-0.42b0-py3-none-any.whl", hash = "sha256:30ce476de63b4d09e402ed3225d8308e124b6c9764bb202f05c16b7f7cb62f9d"}, - {file = "opentelemetry_instrumentation_grpc-0.42b0.tar.gz", hash = "sha256:4c5701b1e54765f9000336a243ddfd4ecf3f76cd62070a8e7f3054a3b928679e"}, + {file = "opentelemetry_instrumentation_grpc-0.43b0-py3-none-any.whl", hash = "sha256:b028870c9e5d2c6ad0a94ff7781975f4217351626f19b7bce6706a3823eff0d8"}, + {file = "opentelemetry_instrumentation_grpc-0.43b0.tar.gz", hash = "sha256:c991458bec7be5eef142b552f74ecd15d7dba6b1a64e06704566eb06e54f1ce2"}, ] [package.dependencies] opentelemetry-api = ">=1.12,<2.0" -opentelemetry-instrumentation = "0.42b0" +opentelemetry-instrumentation = "0.43b0" opentelemetry-sdk = ">=1.12,<2.0" -opentelemetry-semantic-conventions = "0.42b0" +opentelemetry-semantic-conventions = "0.43b0" wrapt = ">=1.0.0,<2.0.0" [package.extras] instruments = ["grpcio (>=1.27,<2.0)"] -test = ["opentelemetry-instrumentation-grpc[instruments]", "opentelemetry-sdk (>=1.12,<2.0)", "opentelemetry-test-utils (==0.42b0)", "protobuf (>=3.13,<4.0)"] +test = ["opentelemetry-instrumentation-grpc[instruments]", "opentelemetry-sdk (>=1.12,<2.0)", "opentelemetry-test-utils (==0.43b0)", "protobuf (>=3.13,<4.0)"] [[package]] name = "opentelemetry-proto" -version = "1.21.0" +version = "1.22.0" description = "OpenTelemetry Python Proto" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_proto-1.21.0-py3-none-any.whl", hash = "sha256:32fc4248e83eebd80994e13963e683f25f3b443226336bb12b5b6d53638f50ba"}, - {file = "opentelemetry_proto-1.21.0.tar.gz", hash = "sha256:7d5172c29ed1b525b5ecf4ebe758c7138a9224441b3cfe683d0a237c33b1941f"}, + {file = "opentelemetry_proto-1.22.0-py3-none-any.whl", hash = "sha256:ce7188d22c75b6d0fe53e7fb58501613d0feade5139538e79dedd9420610fa0c"}, + {file = "opentelemetry_proto-1.22.0.tar.gz", hash = "sha256:9ec29169286029f17ca34ec1f3455802ffb90131642d2f545ece9a63e8f69003"}, ] [package.dependencies] @@ -4986,40 +4998,40 @@ protobuf = ">=3.19,<5.0" [[package]] name = "opentelemetry-sdk" -version = "1.21.0" +version = "1.22.0" description = "OpenTelemetry Python SDK" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_sdk-1.21.0-py3-none-any.whl", hash = "sha256:9fe633243a8c655fedace3a0b89ccdfc654c0290ea2d8e839bd5db3131186f73"}, - {file = "opentelemetry_sdk-1.21.0.tar.gz", hash = "sha256:3ec8cd3020328d6bc5c9991ccaf9ae820ccb6395a5648d9a95d3ec88275b8879"}, + {file = "opentelemetry_sdk-1.22.0-py3-none-any.whl", hash = "sha256:a730555713d7c8931657612a88a141e3a4fe6eb5523d9e2d5a8b1e673d76efa6"}, + {file = "opentelemetry_sdk-1.22.0.tar.gz", hash = "sha256:45267ac1f38a431fc2eb5d6e0c0d83afc0b78de57ac345488aa58c28c17991d0"}, ] [package.dependencies] -opentelemetry-api = "1.21.0" -opentelemetry-semantic-conventions = "0.42b0" +opentelemetry-api = "1.22.0" +opentelemetry-semantic-conventions = "0.43b0" typing-extensions = ">=3.7.4" [[package]] name = "opentelemetry-semantic-conventions" -version = "0.42b0" +version = "0.43b0" description = "OpenTelemetry Semantic Conventions" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_semantic_conventions-0.42b0-py3-none-any.whl", hash = "sha256:5cd719cbfec448af658860796c5d0fcea2fdf0945a2bed2363f42cb1ee39f526"}, - {file = "opentelemetry_semantic_conventions-0.42b0.tar.gz", hash = "sha256:44ae67a0a3252a05072877857e5cc1242c98d4cf12870159f1a94bec800d38ec"}, + {file = "opentelemetry_semantic_conventions-0.43b0-py3-none-any.whl", hash = "sha256:291284d7c1bf15fdaddf309b3bd6d3b7ce12a253cec6d27144439819a15d8445"}, + {file = "opentelemetry_semantic_conventions-0.43b0.tar.gz", hash = "sha256:b9576fb890df479626fa624e88dde42d3d60b8b6c8ae1152ad157a8b97358635"}, ] [[package]] name = "opentelemetry-util-http" -version = "0.42b0" +version = "0.43b0" description = "Web util for OpenTelemetry" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_util_http-0.42b0-py3-none-any.whl", hash = "sha256:764069ed2f7e9a98ed1a7a87111f838000484e388e81f467405933be4b0306c6"}, - {file = "opentelemetry_util_http-0.42b0.tar.gz", hash = "sha256:665e7d372837811aa08cbb9102d4da862441d1c9b1795d649ef08386c8a3cbbd"}, + {file = "opentelemetry_util_http-0.43b0-py3-none-any.whl", hash = "sha256:f25a820784b030f6cb86b3d76e5676c769b75ed3f55a210bcdae0a5e175ebadb"}, + {file = "opentelemetry_util_http-0.43b0.tar.gz", hash = "sha256:3ff6ab361dbe99fc81200d625603c0fb890c055c6e416a3e6d661ddf47a6c7f7"}, ] [[package]] @@ -5973,18 +5985,18 @@ files = [ [[package]] name = "pydantic" -version = "2.5.2" +version = "2.5.3" description = "Data validation using Python type hints" optional = false python-versions = ">=3.7" files = [ - {file = "pydantic-2.5.2-py3-none-any.whl", hash = "sha256:80c50fb8e3dcecfddae1adbcc00ec5822918490c99ab31f6cf6140ca1c1429f0"}, - {file = "pydantic-2.5.2.tar.gz", hash = "sha256:ff177ba64c6faf73d7afa2e8cad38fd456c0dbe01c9954e71038001cd15a6edd"}, + {file = "pydantic-2.5.3-py3-none-any.whl", hash = "sha256:d0caf5954bee831b6bfe7e338c32b9e30c85dfe080c843680783ac2b631673b4"}, + {file = "pydantic-2.5.3.tar.gz", hash = "sha256:b3ef57c62535b0941697cce638c08900d87fcb67e29cfa99e8a68f747f393f7a"}, ] [package.dependencies] annotated-types = ">=0.4.0" -pydantic-core = "2.14.5" +pydantic-core = "2.14.6" typing-extensions = ">=4.6.1" [package.extras] @@ -5992,116 +6004,116 @@ email = ["email-validator (>=2.0.0)"] [[package]] name = "pydantic-core" -version = "2.14.5" +version = "2.14.6" description = "" optional = false python-versions = ">=3.7" files = [ - {file = "pydantic_core-2.14.5-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:7e88f5696153dc516ba6e79f82cc4747e87027205f0e02390c21f7cb3bd8abfd"}, - {file = "pydantic_core-2.14.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4641e8ad4efb697f38a9b64ca0523b557c7931c5f84e0fd377a9a3b05121f0de"}, - {file = "pydantic_core-2.14.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:774de879d212db5ce02dfbf5b0da9a0ea386aeba12b0b95674a4ce0593df3d07"}, - {file = "pydantic_core-2.14.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ebb4e035e28f49b6f1a7032920bb9a0c064aedbbabe52c543343d39341a5b2a3"}, - {file = "pydantic_core-2.14.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b53e9ad053cd064f7e473a5f29b37fc4cc9dc6d35f341e6afc0155ea257fc911"}, - {file = "pydantic_core-2.14.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aa1768c151cf562a9992462239dfc356b3d1037cc5a3ac829bb7f3bda7cc1f9"}, - {file = "pydantic_core-2.14.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eac5c82fc632c599f4639a5886f96867ffced74458c7db61bc9a66ccb8ee3113"}, - {file = "pydantic_core-2.14.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d2ae91f50ccc5810b2f1b6b858257c9ad2e08da70bf890dee02de1775a387c66"}, - {file = "pydantic_core-2.14.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6b9ff467ffbab9110e80e8c8de3bcfce8e8b0fd5661ac44a09ae5901668ba997"}, - {file = "pydantic_core-2.14.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:61ea96a78378e3bd5a0be99b0e5ed00057b71f66115f5404d0dae4819f495093"}, - {file = "pydantic_core-2.14.5-cp310-none-win32.whl", hash = "sha256:bb4c2eda937a5e74c38a41b33d8c77220380a388d689bcdb9b187cf6224c9720"}, - {file = "pydantic_core-2.14.5-cp310-none-win_amd64.whl", hash = "sha256:b7851992faf25eac90bfcb7bfd19e1f5ffa00afd57daec8a0042e63c74a4551b"}, - {file = "pydantic_core-2.14.5-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:4e40f2bd0d57dac3feb3a3aed50f17d83436c9e6b09b16af271b6230a2915459"}, - {file = "pydantic_core-2.14.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ab1cdb0f14dc161ebc268c09db04d2c9e6f70027f3b42446fa11c153521c0e88"}, - {file = "pydantic_core-2.14.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aae7ea3a1c5bb40c93cad361b3e869b180ac174656120c42b9fadebf685d121b"}, - {file = "pydantic_core-2.14.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:60b7607753ba62cf0739177913b858140f11b8af72f22860c28eabb2f0a61937"}, - {file = "pydantic_core-2.14.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2248485b0322c75aee7565d95ad0e16f1c67403a470d02f94da7344184be770f"}, - {file = "pydantic_core-2.14.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:823fcc638f67035137a5cd3f1584a4542d35a951c3cc68c6ead1df7dac825c26"}, - {file = "pydantic_core-2.14.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96581cfefa9123accc465a5fd0cc833ac4d75d55cc30b633b402e00e7ced00a6"}, - {file = "pydantic_core-2.14.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a33324437018bf6ba1bb0f921788788641439e0ed654b233285b9c69704c27b4"}, - {file = "pydantic_core-2.14.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9bd18fee0923ca10f9a3ff67d4851c9d3e22b7bc63d1eddc12f439f436f2aada"}, - {file = "pydantic_core-2.14.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:853a2295c00f1d4429db4c0fb9475958543ee80cfd310814b5c0ef502de24dda"}, - {file = "pydantic_core-2.14.5-cp311-none-win32.whl", hash = "sha256:cb774298da62aea5c80a89bd58c40205ab4c2abf4834453b5de207d59d2e1651"}, - {file = "pydantic_core-2.14.5-cp311-none-win_amd64.whl", hash = "sha256:e87fc540c6cac7f29ede02e0f989d4233f88ad439c5cdee56f693cc9c1c78077"}, - {file = "pydantic_core-2.14.5-cp311-none-win_arm64.whl", hash = "sha256:57d52fa717ff445cb0a5ab5237db502e6be50809b43a596fb569630c665abddf"}, - {file = "pydantic_core-2.14.5-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:e60f112ac88db9261ad3a52032ea46388378034f3279c643499edb982536a093"}, - {file = "pydantic_core-2.14.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6e227c40c02fd873c2a73a98c1280c10315cbebe26734c196ef4514776120aeb"}, - {file = "pydantic_core-2.14.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0cbc7fff06a90bbd875cc201f94ef0ee3929dfbd5c55a06674b60857b8b85ed"}, - {file = "pydantic_core-2.14.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:103ef8d5b58596a731b690112819501ba1db7a36f4ee99f7892c40da02c3e189"}, - {file = "pydantic_core-2.14.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c949f04ecad823f81b1ba94e7d189d9dfb81edbb94ed3f8acfce41e682e48cef"}, - {file = "pydantic_core-2.14.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1452a1acdf914d194159439eb21e56b89aa903f2e1c65c60b9d874f9b950e5d"}, - {file = "pydantic_core-2.14.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb4679d4c2b089e5ef89756bc73e1926745e995d76e11925e3e96a76d5fa51fc"}, - {file = "pydantic_core-2.14.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cf9d3fe53b1ee360e2421be95e62ca9b3296bf3f2fb2d3b83ca49ad3f925835e"}, - {file = "pydantic_core-2.14.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:70f4b4851dbb500129681d04cc955be2a90b2248d69273a787dda120d5cf1f69"}, - {file = "pydantic_core-2.14.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:59986de5710ad9613ff61dd9b02bdd2f615f1a7052304b79cc8fa2eb4e336d2d"}, - {file = "pydantic_core-2.14.5-cp312-none-win32.whl", hash = "sha256:699156034181e2ce106c89ddb4b6504c30db8caa86e0c30de47b3e0654543260"}, - {file = "pydantic_core-2.14.5-cp312-none-win_amd64.whl", hash = "sha256:5baab5455c7a538ac7e8bf1feec4278a66436197592a9bed538160a2e7d11e36"}, - {file = "pydantic_core-2.14.5-cp312-none-win_arm64.whl", hash = "sha256:e47e9a08bcc04d20975b6434cc50bf82665fbc751bcce739d04a3120428f3e27"}, - {file = "pydantic_core-2.14.5-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:af36f36538418f3806048f3b242a1777e2540ff9efaa667c27da63d2749dbce0"}, - {file = "pydantic_core-2.14.5-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:45e95333b8418ded64745f14574aa9bfc212cb4fbeed7a687b0c6e53b5e188cd"}, - {file = "pydantic_core-2.14.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e47a76848f92529879ecfc417ff88a2806438f57be4a6a8bf2961e8f9ca9ec7"}, - {file = "pydantic_core-2.14.5-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d81e6987b27bc7d101c8597e1cd2bcaa2fee5e8e0f356735c7ed34368c471550"}, - {file = "pydantic_core-2.14.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:34708cc82c330e303f4ce87758828ef6e457681b58ce0e921b6e97937dd1e2a3"}, - {file = "pydantic_core-2.14.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:652c1988019752138b974c28f43751528116bcceadad85f33a258869e641d753"}, - {file = "pydantic_core-2.14.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e4d090e73e0725b2904fdbdd8d73b8802ddd691ef9254577b708d413bf3006e"}, - {file = "pydantic_core-2.14.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5c7d5b5005f177764e96bd584d7bf28d6e26e96f2a541fdddb934c486e36fd59"}, - {file = "pydantic_core-2.14.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:a71891847f0a73b1b9eb86d089baee301477abef45f7eaf303495cd1473613e4"}, - {file = "pydantic_core-2.14.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a717aef6971208f0851a2420b075338e33083111d92041157bbe0e2713b37325"}, - {file = "pydantic_core-2.14.5-cp37-none-win32.whl", hash = "sha256:de790a3b5aa2124b8b78ae5faa033937a72da8efe74b9231698b5a1dd9be3405"}, - {file = "pydantic_core-2.14.5-cp37-none-win_amd64.whl", hash = "sha256:6c327e9cd849b564b234da821236e6bcbe4f359a42ee05050dc79d8ed2a91588"}, - {file = "pydantic_core-2.14.5-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:ef98ca7d5995a82f43ec0ab39c4caf6a9b994cb0b53648ff61716370eadc43cf"}, - {file = "pydantic_core-2.14.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6eae413494a1c3f89055da7a5515f32e05ebc1a234c27674a6956755fb2236f"}, - {file = "pydantic_core-2.14.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcf4e6d85614f7a4956c2de5a56531f44efb973d2fe4a444d7251df5d5c4dcfd"}, - {file = "pydantic_core-2.14.5-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6637560562134b0e17de333d18e69e312e0458ee4455bdad12c37100b7cad706"}, - {file = "pydantic_core-2.14.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77fa384d8e118b3077cccfcaf91bf83c31fe4dc850b5e6ee3dc14dc3d61bdba1"}, - {file = "pydantic_core-2.14.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16e29bad40bcf97aac682a58861249ca9dcc57c3f6be22f506501833ddb8939c"}, - {file = "pydantic_core-2.14.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:531f4b4252fac6ca476fbe0e6f60f16f5b65d3e6b583bc4d87645e4e5ddde331"}, - {file = "pydantic_core-2.14.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:074f3d86f081ce61414d2dc44901f4f83617329c6f3ab49d2bc6c96948b2c26b"}, - {file = "pydantic_core-2.14.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c2adbe22ab4babbca99c75c5d07aaf74f43c3195384ec07ccbd2f9e3bddaecec"}, - {file = "pydantic_core-2.14.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0f6116a558fd06d1b7c2902d1c4cf64a5bd49d67c3540e61eccca93f41418124"}, - {file = "pydantic_core-2.14.5-cp38-none-win32.whl", hash = "sha256:fe0a5a1025eb797752136ac8b4fa21aa891e3d74fd340f864ff982d649691867"}, - {file = "pydantic_core-2.14.5-cp38-none-win_amd64.whl", hash = "sha256:079206491c435b60778cf2b0ee5fd645e61ffd6e70c47806c9ed51fc75af078d"}, - {file = "pydantic_core-2.14.5-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:a6a16f4a527aae4f49c875da3cdc9508ac7eef26e7977952608610104244e1b7"}, - {file = "pydantic_core-2.14.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:abf058be9517dc877227ec3223f0300034bd0e9f53aebd63cf4456c8cb1e0863"}, - {file = "pydantic_core-2.14.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49b08aae5013640a3bfa25a8eebbd95638ec3f4b2eaf6ed82cf0c7047133f03b"}, - {file = "pydantic_core-2.14.5-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c2d97e906b4ff36eb464d52a3bc7d720bd6261f64bc4bcdbcd2c557c02081ed2"}, - {file = "pydantic_core-2.14.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3128e0bbc8c091ec4375a1828d6118bc20404883169ac95ffa8d983b293611e6"}, - {file = "pydantic_core-2.14.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88e74ab0cdd84ad0614e2750f903bb0d610cc8af2cc17f72c28163acfcf372a4"}, - {file = "pydantic_core-2.14.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c339dabd8ee15f8259ee0f202679b6324926e5bc9e9a40bf981ce77c038553db"}, - {file = "pydantic_core-2.14.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3387277f1bf659caf1724e1afe8ee7dbc9952a82d90f858ebb931880216ea955"}, - {file = "pydantic_core-2.14.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ba6b6b3846cfc10fdb4c971980a954e49d447cd215ed5a77ec8190bc93dd7bc5"}, - {file = "pydantic_core-2.14.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ca61d858e4107ce5e1330a74724fe757fc7135190eb5ce5c9d0191729f033209"}, - {file = "pydantic_core-2.14.5-cp39-none-win32.whl", hash = "sha256:ec1e72d6412f7126eb7b2e3bfca42b15e6e389e1bc88ea0069d0cc1742f477c6"}, - {file = "pydantic_core-2.14.5-cp39-none-win_amd64.whl", hash = "sha256:c0b97ec434041827935044bbbe52b03d6018c2897349670ff8fe11ed24d1d4ab"}, - {file = "pydantic_core-2.14.5-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:79e0a2cdbdc7af3f4aee3210b1172ab53d7ddb6a2d8c24119b5706e622b346d0"}, - {file = "pydantic_core-2.14.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:678265f7b14e138d9a541ddabbe033012a2953315739f8cfa6d754cc8063e8ca"}, - {file = "pydantic_core-2.14.5-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95b15e855ae44f0c6341ceb74df61b606e11f1087e87dcb7482377374aac6abe"}, - {file = "pydantic_core-2.14.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:09b0e985fbaf13e6b06a56d21694d12ebca6ce5414b9211edf6f17738d82b0f8"}, - {file = "pydantic_core-2.14.5-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3ad873900297bb36e4b6b3f7029d88ff9829ecdc15d5cf20161775ce12306f8a"}, - {file = "pydantic_core-2.14.5-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:2d0ae0d8670164e10accbeb31d5ad45adb71292032d0fdb9079912907f0085f4"}, - {file = "pydantic_core-2.14.5-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:d37f8ec982ead9ba0a22a996129594938138a1503237b87318392a48882d50b7"}, - {file = "pydantic_core-2.14.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:35613015f0ba7e14c29ac6c2483a657ec740e5ac5758d993fdd5870b07a61d8b"}, - {file = "pydantic_core-2.14.5-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:ab4ea451082e684198636565224bbb179575efc1658c48281b2c866bfd4ddf04"}, - {file = "pydantic_core-2.14.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ce601907e99ea5b4adb807ded3570ea62186b17f88e271569144e8cca4409c7"}, - {file = "pydantic_core-2.14.5-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb2ed8b3fe4bf4506d6dab3b93b83bbc22237e230cba03866d561c3577517d18"}, - {file = "pydantic_core-2.14.5-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:70f947628e074bb2526ba1b151cee10e4c3b9670af4dbb4d73bc8a89445916b5"}, - {file = "pydantic_core-2.14.5-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4bc536201426451f06f044dfbf341c09f540b4ebdb9fd8d2c6164d733de5e634"}, - {file = "pydantic_core-2.14.5-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f4791cf0f8c3104ac668797d8c514afb3431bc3305f5638add0ba1a5a37e0d88"}, - {file = "pydantic_core-2.14.5-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:038c9f763e650712b899f983076ce783175397c848da04985658e7628cbe873b"}, - {file = "pydantic_core-2.14.5-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:27548e16c79702f1e03f5628589c6057c9ae17c95b4c449de3c66b589ead0520"}, - {file = "pydantic_core-2.14.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c97bee68898f3f4344eb02fec316db93d9700fb1e6a5b760ffa20d71d9a46ce3"}, - {file = "pydantic_core-2.14.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9b759b77f5337b4ea024f03abc6464c9f35d9718de01cfe6bae9f2e139c397e"}, - {file = "pydantic_core-2.14.5-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:439c9afe34638ace43a49bf72d201e0ffc1a800295bed8420c2a9ca8d5e3dbb3"}, - {file = "pydantic_core-2.14.5-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ba39688799094c75ea8a16a6b544eb57b5b0f3328697084f3f2790892510d144"}, - {file = "pydantic_core-2.14.5-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ccd4d5702bb90b84df13bd491be8d900b92016c5a455b7e14630ad7449eb03f8"}, - {file = "pydantic_core-2.14.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:81982d78a45d1e5396819bbb4ece1fadfe5f079335dd28c4ab3427cd95389944"}, - {file = "pydantic_core-2.14.5-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:7f8210297b04e53bc3da35db08b7302a6a1f4889c79173af69b72ec9754796b8"}, - {file = "pydantic_core-2.14.5-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:8c8a8812fe6f43a3a5b054af6ac2d7b8605c7bcab2804a8a7d68b53f3cd86e00"}, - {file = "pydantic_core-2.14.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:206ed23aecd67c71daf5c02c3cd19c0501b01ef3cbf7782db9e4e051426b3d0d"}, - {file = "pydantic_core-2.14.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2027d05c8aebe61d898d4cffd774840a9cb82ed356ba47a90d99ad768f39789"}, - {file = "pydantic_core-2.14.5-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:40180930807ce806aa71eda5a5a5447abb6b6a3c0b4b3b1b1962651906484d68"}, - {file = "pydantic_core-2.14.5-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:615a0a4bff11c45eb3c1996ceed5bdaa2f7b432425253a7c2eed33bb86d80abc"}, - {file = "pydantic_core-2.14.5-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5e412d717366e0677ef767eac93566582518fe8be923361a5c204c1a62eaafe"}, - {file = "pydantic_core-2.14.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:513b07e99c0a267b1d954243845d8a833758a6726a3b5d8948306e3fe14675e3"}, - {file = "pydantic_core-2.14.5.tar.gz", hash = "sha256:6d30226dfc816dd0fdf120cae611dd2215117e4f9b124af8c60ab9093b6e8e71"}, + {file = "pydantic_core-2.14.6-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:72f9a942d739f09cd42fffe5dc759928217649f070056f03c70df14f5770acf9"}, + {file = "pydantic_core-2.14.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6a31d98c0d69776c2576dda4b77b8e0c69ad08e8b539c25c7d0ca0dc19a50d6c"}, + {file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5aa90562bc079c6c290f0512b21768967f9968e4cfea84ea4ff5af5d917016e4"}, + {file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:370ffecb5316ed23b667d99ce4debe53ea664b99cc37bfa2af47bc769056d534"}, + {file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f85f3843bdb1fe80e8c206fe6eed7a1caeae897e496542cee499c374a85c6e08"}, + {file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9862bf828112e19685b76ca499b379338fd4c5c269d897e218b2ae8fcb80139d"}, + {file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:036137b5ad0cb0004c75b579445a1efccd072387a36c7f217bb8efd1afbe5245"}, + {file = "pydantic_core-2.14.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:92879bce89f91f4b2416eba4429c7b5ca22c45ef4a499c39f0c5c69257522c7c"}, + {file = "pydantic_core-2.14.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0c08de15d50fa190d577e8591f0329a643eeaed696d7771760295998aca6bc66"}, + {file = "pydantic_core-2.14.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:36099c69f6b14fc2c49d7996cbf4f87ec4f0e66d1c74aa05228583225a07b590"}, + {file = "pydantic_core-2.14.6-cp310-none-win32.whl", hash = "sha256:7be719e4d2ae6c314f72844ba9d69e38dff342bc360379f7c8537c48e23034b7"}, + {file = "pydantic_core-2.14.6-cp310-none-win_amd64.whl", hash = "sha256:36fa402dcdc8ea7f1b0ddcf0df4254cc6b2e08f8cd80e7010d4c4ae6e86b2a87"}, + {file = "pydantic_core-2.14.6-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:dea7fcd62915fb150cdc373212141a30037e11b761fbced340e9db3379b892d4"}, + {file = "pydantic_core-2.14.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ffff855100bc066ff2cd3aa4a60bc9534661816b110f0243e59503ec2df38421"}, + {file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b027c86c66b8627eb90e57aee1f526df77dc6d8b354ec498be9a757d513b92b"}, + {file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:00b1087dabcee0b0ffd104f9f53d7d3eaddfaa314cdd6726143af6bc713aa27e"}, + {file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:75ec284328b60a4e91010c1acade0c30584f28a1f345bc8f72fe8b9e46ec6a96"}, + {file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e1f4744eea1501404b20b0ac059ff7e3f96a97d3e3f48ce27a139e053bb370b"}, + {file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2602177668f89b38b9f84b7b3435d0a72511ddef45dc14446811759b82235a1"}, + {file = "pydantic_core-2.14.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6c8edaea3089bf908dd27da8f5d9e395c5b4dc092dbcce9b65e7156099b4b937"}, + {file = "pydantic_core-2.14.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:478e9e7b360dfec451daafe286998d4a1eeaecf6d69c427b834ae771cad4b622"}, + {file = "pydantic_core-2.14.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b6ca36c12a5120bad343eef193cc0122928c5c7466121da7c20f41160ba00ba2"}, + {file = "pydantic_core-2.14.6-cp311-none-win32.whl", hash = "sha256:2b8719037e570639e6b665a4050add43134d80b687288ba3ade18b22bbb29dd2"}, + {file = "pydantic_core-2.14.6-cp311-none-win_amd64.whl", hash = "sha256:78ee52ecc088c61cce32b2d30a826f929e1708f7b9247dc3b921aec367dc1b23"}, + {file = "pydantic_core-2.14.6-cp311-none-win_arm64.whl", hash = "sha256:a19b794f8fe6569472ff77602437ec4430f9b2b9ec7a1105cfd2232f9ba355e6"}, + {file = "pydantic_core-2.14.6-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:667aa2eac9cd0700af1ddb38b7b1ef246d8cf94c85637cbb03d7757ca4c3fdec"}, + {file = "pydantic_core-2.14.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cdee837710ef6b56ebd20245b83799fce40b265b3b406e51e8ccc5b85b9099b7"}, + {file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c5bcf3414367e29f83fd66f7de64509a8fd2368b1edf4351e862910727d3e51"}, + {file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:26a92ae76f75d1915806b77cf459811e772d8f71fd1e4339c99750f0e7f6324f"}, + {file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a983cca5ed1dd9a35e9e42ebf9f278d344603bfcb174ff99a5815f953925140a"}, + {file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cb92f9061657287eded380d7dc455bbf115430b3aa4741bdc662d02977e7d0af"}, + {file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4ace1e220b078c8e48e82c081e35002038657e4b37d403ce940fa679e57113b"}, + {file = "pydantic_core-2.14.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef633add81832f4b56d3b4c9408b43d530dfca29e68fb1b797dcb861a2c734cd"}, + {file = "pydantic_core-2.14.6-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7e90d6cc4aad2cc1f5e16ed56e46cebf4877c62403a311af20459c15da76fd91"}, + {file = "pydantic_core-2.14.6-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e8a5ac97ea521d7bde7621d86c30e86b798cdecd985723c4ed737a2aa9e77d0c"}, + {file = "pydantic_core-2.14.6-cp312-none-win32.whl", hash = "sha256:f27207e8ca3e5e021e2402ba942e5b4c629718e665c81b8b306f3c8b1ddbb786"}, + {file = "pydantic_core-2.14.6-cp312-none-win_amd64.whl", hash = "sha256:b3e5fe4538001bb82e2295b8d2a39356a84694c97cb73a566dc36328b9f83b40"}, + {file = "pydantic_core-2.14.6-cp312-none-win_arm64.whl", hash = "sha256:64634ccf9d671c6be242a664a33c4acf12882670b09b3f163cd00a24cffbd74e"}, + {file = "pydantic_core-2.14.6-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:24368e31be2c88bd69340fbfe741b405302993242ccb476c5c3ff48aeee1afe0"}, + {file = "pydantic_core-2.14.6-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:e33b0834f1cf779aa839975f9d8755a7c2420510c0fa1e9fa0497de77cd35d2c"}, + {file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6af4b3f52cc65f8a0bc8b1cd9676f8c21ef3e9132f21fed250f6958bd7223bed"}, + {file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d15687d7d7f40333bd8266f3814c591c2e2cd263fa2116e314f60d82086e353a"}, + {file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:095b707bb287bfd534044166ab767bec70a9bba3175dcdc3371782175c14e43c"}, + {file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94fc0e6621e07d1e91c44e016cc0b189b48db053061cc22d6298a611de8071bb"}, + {file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ce830e480f6774608dedfd4a90c42aac4a7af0a711f1b52f807130c2e434c06"}, + {file = "pydantic_core-2.14.6-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a306cdd2ad3a7d795d8e617a58c3a2ed0f76c8496fb7621b6cd514eb1532cae8"}, + {file = "pydantic_core-2.14.6-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:2f5fa187bde8524b1e37ba894db13aadd64faa884657473b03a019f625cee9a8"}, + {file = "pydantic_core-2.14.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:438027a975cc213a47c5d70672e0d29776082155cfae540c4e225716586be75e"}, + {file = "pydantic_core-2.14.6-cp37-none-win32.whl", hash = "sha256:f96ae96a060a8072ceff4cfde89d261837b4294a4f28b84a28765470d502ccc6"}, + {file = "pydantic_core-2.14.6-cp37-none-win_amd64.whl", hash = "sha256:e646c0e282e960345314f42f2cea5e0b5f56938c093541ea6dbf11aec2862391"}, + {file = "pydantic_core-2.14.6-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:db453f2da3f59a348f514cfbfeb042393b68720787bbef2b4c6068ea362c8149"}, + {file = "pydantic_core-2.14.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3860c62057acd95cc84044e758e47b18dcd8871a328ebc8ccdefd18b0d26a21b"}, + {file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36026d8f99c58d7044413e1b819a67ca0e0b8ebe0f25e775e6c3d1fabb3c38fb"}, + {file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8ed1af8692bd8d2a29d702f1a2e6065416d76897d726e45a1775b1444f5928a7"}, + {file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:314ccc4264ce7d854941231cf71b592e30d8d368a71e50197c905874feacc8a8"}, + {file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:982487f8931067a32e72d40ab6b47b1628a9c5d344be7f1a4e668fb462d2da42"}, + {file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dbe357bc4ddda078f79d2a36fc1dd0494a7f2fad83a0a684465b6f24b46fe80"}, + {file = "pydantic_core-2.14.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2f6ffc6701a0eb28648c845f4945a194dc7ab3c651f535b81793251e1185ac3d"}, + {file = "pydantic_core-2.14.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7f5025db12fc6de7bc1104d826d5aee1d172f9ba6ca936bf6474c2148ac336c1"}, + {file = "pydantic_core-2.14.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dab03ed811ed1c71d700ed08bde8431cf429bbe59e423394f0f4055f1ca0ea60"}, + {file = "pydantic_core-2.14.6-cp38-none-win32.whl", hash = "sha256:dfcbebdb3c4b6f739a91769aea5ed615023f3c88cb70df812849aef634c25fbe"}, + {file = "pydantic_core-2.14.6-cp38-none-win_amd64.whl", hash = "sha256:99b14dbea2fdb563d8b5a57c9badfcd72083f6006caf8e126b491519c7d64ca8"}, + {file = "pydantic_core-2.14.6-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:4ce8299b481bcb68e5c82002b96e411796b844d72b3e92a3fbedfe8e19813eab"}, + {file = "pydantic_core-2.14.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b9a9d92f10772d2a181b5ca339dee066ab7d1c9a34ae2421b2a52556e719756f"}, + {file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd9e98b408384989ea4ab60206b8e100d8687da18b5c813c11e92fd8212a98e0"}, + {file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4f86f1f318e56f5cbb282fe61eb84767aee743ebe32c7c0834690ebea50c0a6b"}, + {file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86ce5fcfc3accf3a07a729779d0b86c5d0309a4764c897d86c11089be61da160"}, + {file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dcf1978be02153c6a31692d4fbcc2a3f1db9da36039ead23173bc256ee3b91b"}, + {file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eedf97be7bc3dbc8addcef4142f4b4164066df0c6f36397ae4aaed3eb187d8ab"}, + {file = "pydantic_core-2.14.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d5f916acf8afbcab6bacbb376ba7dc61f845367901ecd5e328fc4d4aef2fcab0"}, + {file = "pydantic_core-2.14.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8a14c192c1d724c3acbfb3f10a958c55a2638391319ce8078cb36c02283959b9"}, + {file = "pydantic_core-2.14.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0348b1dc6b76041516e8a854ff95b21c55f5a411c3297d2ca52f5528e49d8411"}, + {file = "pydantic_core-2.14.6-cp39-none-win32.whl", hash = "sha256:de2a0645a923ba57c5527497daf8ec5df69c6eadf869e9cd46e86349146e5975"}, + {file = "pydantic_core-2.14.6-cp39-none-win_amd64.whl", hash = "sha256:aca48506a9c20f68ee61c87f2008f81f8ee99f8d7f0104bff3c47e2d148f89d9"}, + {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:d5c28525c19f5bb1e09511669bb57353d22b94cf8b65f3a8d141c389a55dec95"}, + {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:78d0768ee59baa3de0f4adac9e3748b4b1fffc52143caebddfd5ea2961595277"}, + {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b93785eadaef932e4fe9c6e12ba67beb1b3f1e5495631419c784ab87e975670"}, + {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a874f21f87c485310944b2b2734cd6d318765bcbb7515eead33af9641816506e"}, + {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b89f4477d915ea43b4ceea6756f63f0288941b6443a2b28c69004fe07fde0d0d"}, + {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:172de779e2a153d36ee690dbc49c6db568d7b33b18dc56b69a7514aecbcf380d"}, + {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:dfcebb950aa7e667ec226a442722134539e77c575f6cfaa423f24371bb8d2e94"}, + {file = "pydantic_core-2.14.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:55a23dcd98c858c0db44fc5c04fc7ed81c4b4d33c653a7c45ddaebf6563a2f66"}, + {file = "pydantic_core-2.14.6-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:4241204e4b36ab5ae466ecec5c4c16527a054c69f99bba20f6f75232a6a534e2"}, + {file = "pydantic_core-2.14.6-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e574de99d735b3fc8364cba9912c2bec2da78775eba95cbb225ef7dda6acea24"}, + {file = "pydantic_core-2.14.6-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1302a54f87b5cd8528e4d6d1bf2133b6aa7c6122ff8e9dc5220fbc1e07bffebd"}, + {file = "pydantic_core-2.14.6-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f8e81e4b55930e5ffab4a68db1af431629cf2e4066dbdbfef65348b8ab804ea8"}, + {file = "pydantic_core-2.14.6-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c99462ffc538717b3e60151dfaf91125f637e801f5ab008f81c402f1dff0cd0f"}, + {file = "pydantic_core-2.14.6-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e4cf2d5829f6963a5483ec01578ee76d329eb5caf330ecd05b3edd697e7d768a"}, + {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:cf10b7d58ae4a1f07fccbf4a0a956d705356fea05fb4c70608bb6fa81d103cda"}, + {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:399ac0891c284fa8eb998bcfa323f2234858f5d2efca3950ae58c8f88830f145"}, + {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c6a5c79b28003543db3ba67d1df336f253a87d3112dac3a51b94f7d48e4c0e1"}, + {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:599c87d79cab2a6a2a9df4aefe0455e61e7d2aeede2f8577c1b7c0aec643ee8e"}, + {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43e166ad47ba900f2542a80d83f9fc65fe99eb63ceec4debec160ae729824052"}, + {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3a0b5db001b98e1c649dd55afa928e75aa4087e587b9524a4992316fa23c9fba"}, + {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:747265448cb57a9f37572a488a57d873fd96bf51e5bb7edb52cfb37124516da4"}, + {file = "pydantic_core-2.14.6-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7ebe3416785f65c28f4f9441e916bfc8a54179c8dea73c23023f7086fa601c5d"}, + {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:86c963186ca5e50d5c8287b1d1c9d3f8f024cbe343d048c5bd282aec2d8641f2"}, + {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:e0641b506486f0b4cd1500a2a65740243e8670a2549bb02bc4556a83af84ae03"}, + {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71d72ca5eaaa8d38c8df16b7deb1a2da4f650c41b58bb142f3fb75d5ad4a611f"}, + {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27e524624eace5c59af499cd97dc18bb201dc6a7a2da24bfc66ef151c69a5f2a"}, + {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a3dde6cac75e0b0902778978d3b1646ca9f438654395a362cb21d9ad34b24acf"}, + {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:00646784f6cd993b1e1c0e7b0fdcbccc375d539db95555477771c27555e3c556"}, + {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:23598acb8ccaa3d1d875ef3b35cb6376535095e9405d91a3d57a8c7db5d29341"}, + {file = "pydantic_core-2.14.6-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7f41533d7e3cf9520065f610b41ac1c76bc2161415955fbcead4981b22c7611e"}, + {file = "pydantic_core-2.14.6.tar.gz", hash = "sha256:1fd0c1d395372843fba13a51c28e3bb9d59bd7aebfeb17358ffaaa1e4dbbe948"}, ] [package.dependencies] @@ -7197,39 +7209,39 @@ msg-parse = ["extract-msg (>=0.27)"] [[package]] name = "ruff" -version = "0.1.8" +version = "0.1.9" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.1.8-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:7de792582f6e490ae6aef36a58d85df9f7a0cfd1b0d4fe6b4fb51803a3ac96fa"}, - {file = "ruff-0.1.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:c8e3255afd186c142eef4ec400d7826134f028a85da2146102a1172ecc7c3696"}, - {file = "ruff-0.1.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff78a7583020da124dd0deb835ece1d87bb91762d40c514ee9b67a087940528b"}, - {file = "ruff-0.1.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd8ee69b02e7bdefe1e5da2d5b6eaaddcf4f90859f00281b2333c0e3a0cc9cd6"}, - {file = "ruff-0.1.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a05b0ddd7ea25495e4115a43125e8a7ebed0aa043c3d432de7e7d6e8e8cd6448"}, - {file = "ruff-0.1.8-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:e6f08ca730f4dc1b76b473bdf30b1b37d42da379202a059eae54ec7fc1fbcfed"}, - {file = "ruff-0.1.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f35960b02df6b827c1b903091bb14f4b003f6cf102705efc4ce78132a0aa5af3"}, - {file = "ruff-0.1.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7d076717c67b34c162da7c1a5bda16ffc205e0e0072c03745275e7eab888719f"}, - {file = "ruff-0.1.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6a21ab023124eafb7cef6d038f835cb1155cd5ea798edd8d9eb2f8b84be07d9"}, - {file = "ruff-0.1.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ce697c463458555027dfb194cb96d26608abab920fa85213deb5edf26e026664"}, - {file = "ruff-0.1.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:db6cedd9ffed55548ab313ad718bc34582d394e27a7875b4b952c2d29c001b26"}, - {file = "ruff-0.1.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:05ffe9dbd278965271252704eddb97b4384bf58b971054d517decfbf8c523f05"}, - {file = "ruff-0.1.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5daaeaf00ae3c1efec9742ff294b06c3a2a9db8d3db51ee4851c12ad385cda30"}, - {file = "ruff-0.1.8-py3-none-win32.whl", hash = "sha256:e49fbdfe257fa41e5c9e13c79b9e79a23a79bd0e40b9314bc53840f520c2c0b3"}, - {file = "ruff-0.1.8-py3-none-win_amd64.whl", hash = "sha256:f41f692f1691ad87f51708b823af4bb2c5c87c9248ddd3191c8f088e66ce590a"}, - {file = "ruff-0.1.8-py3-none-win_arm64.whl", hash = "sha256:aa8ee4f8440023b0a6c3707f76cadce8657553655dcbb5fc9b2f9bb9bee389f6"}, - {file = "ruff-0.1.8.tar.gz", hash = "sha256:f7ee467677467526cfe135eab86a40a0e8db43117936ac4f9b469ce9cdb3fb62"}, + {file = "ruff-0.1.9-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:e6a212f436122ac73df851f0cf006e0c6612fe6f9c864ed17ebefce0eff6a5fd"}, + {file = "ruff-0.1.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:28d920e319783d5303333630dae46ecc80b7ba294aeffedf946a02ac0b7cc3db"}, + {file = "ruff-0.1.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:104aa9b5e12cb755d9dce698ab1b97726b83012487af415a4512fedd38b1459e"}, + {file = "ruff-0.1.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1e63bf5a4a91971082a4768a0aba9383c12392d0d6f1e2be2248c1f9054a20da"}, + {file = "ruff-0.1.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4d0738917c203246f3e275b37006faa3aa96c828b284ebfe3e99a8cb413c8c4b"}, + {file = "ruff-0.1.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:69dac82d63a50df2ab0906d97a01549f814b16bc806deeac4f064ff95c47ddf5"}, + {file = "ruff-0.1.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2aec598fb65084e41a9c5d4b95726173768a62055aafb07b4eff976bac72a592"}, + {file = "ruff-0.1.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:744dfe4b35470fa3820d5fe45758aace6269c578f7ddc43d447868cfe5078bcb"}, + {file = "ruff-0.1.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:479ca4250cab30f9218b2e563adc362bd6ae6343df7c7b5a7865300a5156d5a6"}, + {file = "ruff-0.1.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:aa8344310f1ae79af9ccd6e4b32749e93cddc078f9b5ccd0e45bd76a6d2e8bb6"}, + {file = "ruff-0.1.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:837c739729394df98f342319f5136f33c65286b28b6b70a87c28f59354ec939b"}, + {file = "ruff-0.1.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:e6837202c2859b9f22e43cb01992373c2dbfeae5c0c91ad691a4a2e725392464"}, + {file = "ruff-0.1.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:331aae2cd4a0554667ac683243b151c74bd60e78fb08c3c2a4ac05ee1e606a39"}, + {file = "ruff-0.1.9-py3-none-win32.whl", hash = "sha256:8151425a60878e66f23ad47da39265fc2fad42aed06fb0a01130e967a7a064f4"}, + {file = "ruff-0.1.9-py3-none-win_amd64.whl", hash = "sha256:c497d769164df522fdaf54c6eba93f397342fe4ca2123a2e014a5b8fc7df81c7"}, + {file = "ruff-0.1.9-py3-none-win_arm64.whl", hash = "sha256:0e17f53bcbb4fff8292dfd84cf72d767b5e146f009cccd40c2fad27641f8a7a9"}, + {file = "ruff-0.1.9.tar.gz", hash = "sha256:b041dee2734719ddbb4518f762c982f2e912e7f28b8ee4fe1dee0b15d1b6e800"}, ] [[package]] name = "s3transfer" -version = "0.9.0" +version = "0.10.0" description = "An Amazon S3 Transfer Manager" optional = false python-versions = ">= 3.8" files = [ - {file = "s3transfer-0.9.0-py3-none-any.whl", hash = "sha256:01d4d2c35a016db8cb14f9a4d5e84c1f8c96e7ffc211422555eed45c11fa7eb1"}, - {file = "s3transfer-0.9.0.tar.gz", hash = "sha256:9e1b186ec8bb5907a1e82b51237091889a9973a2bb799a924bcd9f301ff79d3d"}, + {file = "s3transfer-0.10.0-py3-none-any.whl", hash = "sha256:3cdb40f5cfa6966e812209d0994f2a4709b561c88e90cf00c2696d2df4e56b2e"}, + {file = "s3transfer-0.10.0.tar.gz", hash = "sha256:d0c8bbf672d5eebbe4e57945e23b972d963f07d82f661cabf678a5c88831595b"}, ] [package.dependencies] @@ -8383,13 +8395,13 @@ files = [ [[package]] name = "types-pyasn1" -version = "0.5.0.1" +version = "0.5.0.20231222" description = "Typing stubs for pyasn1" optional = false python-versions = ">=3.7" files = [ - {file = "types-pyasn1-0.5.0.1.tar.gz", hash = "sha256:023e903f5920ec9585555235f95bb2d2756b7b58023d3f94890ee8d1d4d9d1ff"}, - {file = "types_pyasn1-0.5.0.1-py3-none-any.whl", hash = "sha256:1bbbe3fcf16a65064e4a5bd7f1be43c375ba241054f8f361b5e6c61c8deb3935"}, + {file = "types-pyasn1-0.5.0.20231222.tar.gz", hash = "sha256:b5d91bc5e002d7d69d37f857fcd8f364102c957385dffa54009657c40763b20c"}, + {file = "types_pyasn1-0.5.0.20231222-py3-none-any.whl", hash = "sha256:4140ac0c74cd82a65e900a6199fed2648314c670018a45dac977a33ee6419a8e"}, ] [[package]] @@ -8549,13 +8561,13 @@ devenv = ["check-manifest", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3) [[package]] name = "unstructured" -version = "0.11.5" +version = "0.11.6" description = "A library that prepares raw documents for downstream ML tasks." optional = false python-versions = ">=3.7.0" files = [ - {file = "unstructured-0.11.5-py3-none-any.whl", hash = "sha256:90c4d027ba8462776c22880daacedd8e379af285c8df7c42598379e258f2a600"}, - {file = "unstructured-0.11.5.tar.gz", hash = "sha256:b50f2d9ca665a000ff8462a9eb57bda997257c7d3df6c2d5bace1569f7f0ebf7"}, + {file = "unstructured-0.11.6-py3-none-any.whl", hash = "sha256:f3e95dd82574bd1e082e2f65bcbc83664928488a426e1ff1c8b1b04b76852dfc"}, + {file = "unstructured-0.11.6.tar.gz", hash = "sha256:f748e1b15010f63b178af8117c17f69ced7a14b0b18edda0bb9199ff84a22a2f"}, ] [package.dependencies] @@ -8586,6 +8598,7 @@ azure-cognitive-search = ["azure-search-documents"] bedrock = ["boto3", "langchain"] biomed = ["bs4"] box = ["boxfs", "fsspec (==2023.9.1)"] +chroma = ["chromadb"] confluence = ["atlassian-python-api"] csv = ["pandas"] delta-table = ["deltalake", "fsspec (==2023.9.1)"] @@ -8892,13 +8905,13 @@ files = [ [[package]] name = "weaviate-client" -version = "3.25.3" +version = "3.26.0" description = "A python native Weaviate client" optional = false python-versions = ">=3.8" files = [ - {file = "weaviate-client-3.25.3.tar.gz", hash = "sha256:894df700fc1f0a932fa370029f644af4062f8718026fda5ad07647d357d95167"}, - {file = "weaviate_client-3.25.3-py3-none-any.whl", hash = "sha256:cb049ed7b710088ff9038d27b97f28c80206ce9e4d12d622c3597da5790b2be0"}, + {file = "weaviate-client-3.26.0.tar.gz", hash = "sha256:ee809bf2d1f5a500c9a68c5edc2eb174ab5142a36802e274ab24afe675ffb28b"}, + {file = "weaviate_client-3.26.0-py3-none-any.whl", hash = "sha256:0816861d0d6c893d4c457209d5299b265f54f3cda7ee0a37e66ac50ddf16a33d"}, ] [package.dependencies] diff --git a/pyproject.toml b/pyproject.toml index 7aed748cc..0a09d4532 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langflow" -version = "0.6.3a5" +version = "0.6.3a6" description = "A Python package with a built-in web application" authors = ["Logspace "] maintainers = [ From b900b6dd55ff3349cbcbbc25c5f9b5b4512281c6 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 22 Dec 2023 11:21:42 -0300 Subject: [PATCH 196/203] Remove validate --- src/backend/langflow/interface/custom/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/langflow/interface/custom/utils.py b/src/backend/langflow/interface/custom/utils.py index 86c55b0ae..7e54bd547 100644 --- a/src/backend/langflow/interface/custom/utils.py +++ b/src/backend/langflow/interface/custom/utils.py @@ -7,6 +7,8 @@ from typing import Any, Dict, List, Optional, Union from uuid import UUID from fastapi import HTTPException +from loguru import logger + from langflow.field_typing.range_spec import RangeSpec from langflow.interface.custom.code_parser.utils import extract_inner_type from langflow.interface.custom.custom_component import CustomComponent @@ -19,7 +21,6 @@ from langflow.interface.importing.utils import eval_custom_component_code from langflow.template.field.base import TemplateField from langflow.template.frontend_node.custom_components import CustomComponentFrontendNode from langflow.utils.util import get_base_classes -from loguru import logger def add_output_types(frontend_node: CustomComponentFrontendNode, return_types: List[str]): @@ -310,7 +311,6 @@ def create_component_template(component): component_output_types = component["output_types"] component_extractor = CustomComponent(code=component_code) - component_extractor.validate() component_template = build_custom_component_template(component_extractor) component_template["output_types"] = component_output_types From 3d4b9a81a3ba94662d1a4e20d22278e4ac2a2c0e Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 22 Dec 2023 11:21:48 -0300 Subject: [PATCH 197/203] Refactor imports and update Result model --- src/backend/langflow/processing/process.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/backend/langflow/processing/process.py b/src/backend/langflow/processing/process.py index 9432b7f96..3c7596774 100644 --- a/src/backend/langflow/processing/process.py +++ b/src/backend/langflow/processing/process.py @@ -7,12 +7,11 @@ from langchain.schema import AgentAction, Document from langchain.vectorstores.base import VectorStore from langchain_core.messages import AIMessage from langchain_core.runnables.base import Runnable -from loguru import logger -from pydantic import BaseModel - from langflow.interface.custom.custom_component import CustomComponent from langflow.interface.run import build_sorted_vertices, get_memory_key, update_memory_keys from langflow.services.deps import get_session_service +from loguru import logger +from pydantic import BaseModel def fix_memory_inputs(langchain_object): @@ -201,7 +200,7 @@ async def generate_result(built_object: Union[Chain, VectorStore, Runnable], inp class Result(BaseModel): - result: Union[dict, List[dict], str, List[str], AIMessage] + result: Any session_id: str From 692a078e29dfaae267fa83a16ffed6ba041854b7 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 22 Dec 2023 11:21:55 -0300 Subject: [PATCH 198/203] Remove unused import and test case --- tests/test_custom_component.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/tests/test_custom_component.py b/tests/test_custom_component.py index a89efa4d4..96a7d7acc 100644 --- a/tests/test_custom_component.py +++ b/tests/test_custom_component.py @@ -3,7 +3,6 @@ import types from uuid import uuid4 import pytest -from fastapi import HTTPException from langflow.interface.custom.base import CustomComponent from langflow.interface.custom.code_parser.code_parser import CodeParser, CodeSyntaxError from langflow.interface.custom.custom_component.component import Component, ComponentCodeNullError @@ -365,16 +364,6 @@ def test_component_get_code_tree_syntax_error(): component.get_code_tree(component.code) -def test_custom_component_class_template_validation_no_code(): - """ - Test the _class_template_validation method of the CustomComponent class - raises the HTTPException when the code is None. - """ - custom_component = CustomComponent(code=None, function_entrypoint_name="build") - with pytest.raises(HTTPException): - custom_component._class_template_validation(custom_component.code) - - def test_custom_component_get_code_tree_syntax_error(): """ Test the get_code_tree method of the CustomComponent class From e35b5c01b0333f334207c30b37e8d5751f092f84 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 22 Dec 2023 11:56:31 -0300 Subject: [PATCH 199/203] Add workflow_dispatch to pre-release.yml --- .github/workflows/pre-release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/pre-release.yml b/.github/workflows/pre-release.yml index a013f686a..9bd84922c 100644 --- a/.github/workflows/pre-release.yml +++ b/.github/workflows/pre-release.yml @@ -8,6 +8,7 @@ on: - dev paths: - "pyproject.toml" + workflow_dispatch: env: POETRY_VERSION: "1.5.1" From e1b01a084a2e51049b35ae4c25852b02a39e4805 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 22 Dec 2023 12:02:15 -0300 Subject: [PATCH 200/203] Update commit reference to use GitHub SHA --- .github/workflows/pre-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pre-release.yml b/.github/workflows/pre-release.yml index 9bd84922c..b20c8817a 100644 --- a/.github/workflows/pre-release.yml +++ b/.github/workflows/pre-release.yml @@ -41,7 +41,7 @@ jobs: generateReleaseNotes: true prerelease: true tag: v${{ steps.check-version.outputs.version }} - commit: main + commit: ${{ github.sha }} - name: Publish to PyPI env: POETRY_PYPI_TOKEN_PYPI: ${{ secrets.PYPI_API_TOKEN }} From b8ba344c22e5a78a3c8d130117c3219300855011 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 22 Dec 2023 12:03:20 -0300 Subject: [PATCH 201/203] Update commit message to use 'Set commit to dev' --- .github/workflows/pre-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pre-release.yml b/.github/workflows/pre-release.yml index b20c8817a..77f10c392 100644 --- a/.github/workflows/pre-release.yml +++ b/.github/workflows/pre-release.yml @@ -41,7 +41,7 @@ jobs: generateReleaseNotes: true prerelease: true tag: v${{ steps.check-version.outputs.version }} - commit: ${{ github.sha }} + commit: dev - name: Publish to PyPI env: POETRY_PYPI_TOKEN_PYPI: ${{ secrets.PYPI_API_TOKEN }} From 6a41af66c821b107e2e507c85738c886daec22b6 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 22 Dec 2023 12:07:23 -0300 Subject: [PATCH 202/203] Update version to 0.6.3a7 in pyproject.toml --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 0a09d4532..6a7b7bc6e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langflow" -version = "0.6.3a6" +version = "0.6.3a7" description = "A Python package with a built-in web application" authors = ["Logspace "] maintainers = [ From ef3f7bb8d70db2daa8325e4e5958d5433ec75046 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 22 Dec 2023 12:58:20 -0300 Subject: [PATCH 203/203] Update version number in pyproject.toml --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 6a7b7bc6e..13986e8b4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langflow" -version = "0.6.3a7" +version = "0.6.3" description = "A Python package with a built-in web application" authors = ["Logspace "] maintainers = [