@decaf-ts/integrations 0.3.8 → 0.3.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/integrations.cjs +2 -1649
- package/dist/integrations.cjs.map +1 -0
- package/dist/integrations.js +2 -1885
- package/dist/integrations.js.map +1 -0
- package/lib/cjs/blob/azure/AzureBlobStoreService.cjs +2 -2
- package/lib/cjs/blob/azure/AzureBlobStoreService.cjs.map +1 -0
- package/lib/cjs/blob/azure/index.cjs +2 -2
- package/lib/cjs/blob/azure/index.cjs.map +1 -0
- package/lib/cjs/blob/core/BlobErrors.cjs +2 -2
- package/lib/cjs/blob/core/BlobErrors.cjs.map +1 -0
- package/lib/cjs/blob/core/BlobKey.cjs +2 -2
- package/lib/cjs/blob/core/BlobKey.cjs.map +1 -0
- package/lib/cjs/blob/core/BlobStoreFactory.cjs +2 -2
- package/lib/cjs/blob/core/BlobStoreFactory.cjs.map +1 -0
- package/lib/cjs/blob/core/BlobStoreService.cjs +2 -2
- package/lib/cjs/blob/core/BlobStoreService.cjs.map +1 -0
- package/lib/cjs/blob/core/BlobTypes.cjs +2 -2
- package/lib/cjs/blob/core/BlobTypes.cjs.map +1 -0
- package/lib/cjs/blob/core/BlobValue.cjs +2 -2
- package/lib/cjs/blob/core/BlobValue.cjs.map +1 -0
- package/lib/cjs/blob/core/index.cjs +2 -2
- package/lib/cjs/blob/core/index.cjs.map +1 -0
- package/lib/cjs/blob/gcp/GcsBlobStoreService.cjs +2 -2
- package/lib/cjs/blob/gcp/GcsBlobStoreService.cjs.map +1 -0
- package/lib/cjs/blob/gcp/index.cjs +2 -2
- package/lib/cjs/blob/gcp/index.cjs.map +1 -0
- package/lib/cjs/blob/index.cjs +2 -2
- package/lib/cjs/blob/index.cjs.map +1 -0
- package/lib/cjs/blob/ipfs/IpfsBlobStoreService.cjs +2 -2
- package/lib/cjs/blob/ipfs/IpfsBlobStoreService.cjs.map +1 -0
- package/lib/cjs/blob/ipfs/IpfsKeyIndex.cjs +2 -2
- package/lib/cjs/blob/ipfs/IpfsKeyIndex.cjs.map +1 -0
- package/lib/cjs/blob/ipfs/LocalJsonIpfsKeyIndex.cjs +2 -2
- package/lib/cjs/blob/ipfs/LocalJsonIpfsKeyIndex.cjs.map +1 -0
- package/lib/cjs/blob/ipfs/MemoryIpfsKeyIndex.cjs +2 -2
- package/lib/cjs/blob/ipfs/MemoryIpfsKeyIndex.cjs.map +1 -0
- package/lib/cjs/blob/ipfs/PostgresIpfsKeyIndex.cjs +2 -2
- package/lib/cjs/blob/ipfs/PostgresIpfsKeyIndex.cjs.map +1 -0
- package/lib/cjs/blob/ipfs/index.cjs +2 -2
- package/lib/cjs/blob/ipfs/index.cjs.map +1 -0
- package/lib/cjs/blob/local/LocalBlobStoreService.cjs +2 -2
- package/lib/cjs/blob/local/LocalBlobStoreService.cjs.map +1 -0
- package/lib/cjs/blob/local/index.cjs +2 -2
- package/lib/cjs/blob/local/index.cjs.map +1 -0
- package/lib/cjs/blob/memory/MemoryBlobStoreService.cjs +2 -2
- package/lib/cjs/blob/memory/MemoryBlobStoreService.cjs.map +1 -0
- package/lib/cjs/blob/memory/index.cjs +2 -2
- package/lib/cjs/blob/memory/index.cjs.map +1 -0
- package/lib/cjs/blob/s3/MinioBlobStoreService.cjs +2 -2
- package/lib/cjs/blob/s3/MinioBlobStoreService.cjs.map +1 -0
- package/lib/cjs/blob/s3/R2BlobStoreService.cjs +2 -2
- package/lib/cjs/blob/s3/R2BlobStoreService.cjs.map +1 -0
- package/lib/cjs/blob/s3/S3BlobStoreService.cjs +2 -2
- package/lib/cjs/blob/s3/S3BlobStoreService.cjs.map +1 -0
- package/lib/cjs/blob/s3/index.cjs +2 -2
- package/lib/cjs/blob/s3/index.cjs.map +1 -0
- package/lib/cjs/docker/DockerComposeService.cjs +2 -2
- package/lib/cjs/docker/DockerComposeService.cjs.map +1 -0
- package/lib/cjs/docker/index.cjs +2 -2
- package/lib/cjs/docker/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/constants.cjs +58 -0
- package/lib/cjs/graph/engine/constants.cjs.map +1 -0
- package/lib/cjs/graph/engine/decorators.cjs +4 -0
- package/lib/cjs/graph/engine/decorators.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/GraphCycleError.cjs +20 -0
- package/lib/cjs/graph/engine/errors/GraphCycleError.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/GraphExecutionError.cjs +27 -0
- package/lib/cjs/graph/engine/errors/GraphExecutionError.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/GraphInputError.cjs +20 -0
- package/lib/cjs/graph/engine/errors/GraphInputError.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/GraphLoopLimitError.cjs +20 -0
- package/lib/cjs/graph/engine/errors/GraphLoopLimitError.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/GraphPinningError.cjs +20 -0
- package/lib/cjs/graph/engine/errors/GraphPinningError.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/GraphPortError.cjs +20 -0
- package/lib/cjs/graph/engine/errors/GraphPortError.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/GraphStoreError.cjs +20 -0
- package/lib/cjs/graph/engine/errors/GraphStoreError.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/GraphTopologyError.cjs +20 -0
- package/lib/cjs/graph/engine/errors/GraphTopologyError.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/index.cjs +31 -0
- package/lib/cjs/graph/engine/errors/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/events/GraphExecutionEvent.cjs +4 -0
- package/lib/cjs/graph/engine/events/GraphExecutionEvent.cjs.map +1 -0
- package/lib/cjs/graph/engine/events/GraphExecutionEventEmitter.cjs +40 -0
- package/lib/cjs/graph/engine/events/GraphExecutionEventEmitter.cjs.map +1 -0
- package/lib/cjs/graph/engine/events/GraphExecutionEventFactory.cjs +37 -0
- package/lib/cjs/graph/engine/events/GraphExecutionEventFactory.cjs.map +1 -0
- package/lib/cjs/graph/engine/events/GraphExecutionObserver.cjs +4 -0
- package/lib/cjs/graph/engine/events/GraphExecutionObserver.cjs.map +1 -0
- package/lib/cjs/graph/engine/events/index.cjs +27 -0
- package/lib/cjs/graph/engine/events/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/CodeSandboxEvaluator.cjs +4 -0
- package/lib/cjs/graph/engine/execution/CodeSandboxEvaluator.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionContext.cjs +79 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionContext.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionEngine.cjs +413 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionEngine.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionFrame.cjs +32 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionFrame.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionResult.cjs +30 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionResult.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/GraphNodeExecutor.cjs +4 -0
- package/lib/cjs/graph/engine/execution/GraphNodeExecutor.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/SwitchGraphNodeExecutor.cjs +103 -0
- package/lib/cjs/graph/engine/execution/SwitchGraphNodeExecutor.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/index.cjs +30 -0
- package/lib/cjs/graph/engine/execution/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/index.cjs +84 -0
- package/lib/cjs/graph/engine/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/loops/ConditionExpressionEvaluator.cjs +87 -0
- package/lib/cjs/graph/engine/loops/ConditionExpressionEvaluator.cjs.map +1 -0
- package/lib/cjs/graph/engine/loops/ForeachGraphNodeExecutor.cjs +85 -0
- package/lib/cjs/graph/engine/loops/ForeachGraphNodeExecutor.cjs.map +1 -0
- package/lib/cjs/graph/engine/loops/GraphConditionEvaluator.cjs +85 -0
- package/lib/cjs/graph/engine/loops/GraphConditionEvaluator.cjs.map +1 -0
- package/lib/cjs/graph/engine/loops/GraphLoopExecutionContext.cjs +16 -0
- package/lib/cjs/graph/engine/loops/GraphLoopExecutionContext.cjs.map +1 -0
- package/lib/cjs/graph/engine/loops/UntilGraphNodeExecutor.cjs +77 -0
- package/lib/cjs/graph/engine/loops/UntilGraphNodeExecutor.cjs.map +1 -0
- package/lib/cjs/graph/engine/loops/WhileGraphNodeExecutor.cjs +78 -0
- package/lib/cjs/graph/engine/loops/WhileGraphNodeExecutor.cjs.map +1 -0
- package/lib/cjs/graph/engine/loops/index.cjs +29 -0
- package/lib/cjs/graph/engine/loops/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/pinning/GraphPinningDependencyResolver.cjs +28 -0
- package/lib/cjs/graph/engine/pinning/GraphPinningDependencyResolver.cjs.map +1 -0
- package/lib/cjs/graph/engine/pinning/GraphPinningMetadata.cjs +20 -0
- package/lib/cjs/graph/engine/pinning/GraphPinningMetadata.cjs.map +1 -0
- package/lib/cjs/graph/engine/pinning/GraphPinningPolicy.cjs +34 -0
- package/lib/cjs/graph/engine/pinning/GraphPinningPolicy.cjs.map +1 -0
- package/lib/cjs/graph/engine/pinning/GraphPinningService.cjs +191 -0
- package/lib/cjs/graph/engine/pinning/GraphPinningService.cjs.map +1 -0
- package/lib/cjs/graph/engine/pinning/index.cjs +27 -0
- package/lib/cjs/graph/engine/pinning/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlan.cjs +4 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlan.cjs.map +1 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanEdge.cjs +4 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanEdge.cjs.map +1 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanLayer.cjs +4 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanLayer.cjs.map +1 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanNode.cjs +4 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanNode.cjs.map +1 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanner.cjs +197 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanner.cjs.map +1 -0
- package/lib/cjs/graph/engine/planning/GraphRelationResolver.cjs +172 -0
- package/lib/cjs/graph/engine/planning/GraphRelationResolver.cjs.map +1 -0
- package/lib/cjs/graph/engine/planning/GraphTopology.cjs +57 -0
- package/lib/cjs/graph/engine/planning/GraphTopology.cjs.map +1 -0
- package/lib/cjs/graph/engine/planning/index.cjs +30 -0
- package/lib/cjs/graph/engine/planning/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/registry/GraphNodeExecutorRegistry.cjs +44 -0
- package/lib/cjs/graph/engine/registry/GraphNodeExecutorRegistry.cjs.map +1 -0
- package/lib/cjs/graph/engine/registry/GraphNodeExecutorResolver.cjs +27 -0
- package/lib/cjs/graph/engine/registry/GraphNodeExecutorResolver.cjs.map +1 -0
- package/lib/cjs/graph/engine/registry/index.cjs +25 -0
- package/lib/cjs/graph/engine/registry/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/snapshots/GraphExecutionSnapshotMapper.cjs +53 -0
- package/lib/cjs/graph/engine/snapshots/GraphExecutionSnapshotMapper.cjs.map +1 -0
- package/lib/cjs/graph/engine/snapshots/index.cjs +24 -0
- package/lib/cjs/graph/engine/snapshots/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/store/GraphCachedValue.cjs +4 -0
- package/lib/cjs/graph/engine/store/GraphCachedValue.cjs.map +1 -0
- package/lib/cjs/graph/engine/store/GraphValueKey.cjs +4 -0
- package/lib/cjs/graph/engine/store/GraphValueKey.cjs.map +1 -0
- package/lib/cjs/graph/engine/store/GraphValueStore.cjs +76 -0
- package/lib/cjs/graph/engine/store/GraphValueStore.cjs.map +1 -0
- package/lib/cjs/graph/engine/store/GraphValueStoreAdapter.cjs +4 -0
- package/lib/cjs/graph/engine/store/GraphValueStoreAdapter.cjs.map +1 -0
- package/lib/cjs/graph/engine/store/InMemoryGraphValueStoreAdapter.cjs +69 -0
- package/lib/cjs/graph/engine/store/InMemoryGraphValueStoreAdapter.cjs.map +1 -0
- package/lib/cjs/graph/engine/store/index.cjs +28 -0
- package/lib/cjs/graph/engine/store/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/types.cjs +4 -0
- package/lib/cjs/graph/engine/types.cjs.map +1 -0
- package/lib/cjs/graph/engine/validation/GraphDefinitionValidator.cjs +33 -0
- package/lib/cjs/graph/engine/validation/GraphDefinitionValidator.cjs.map +1 -0
- package/lib/cjs/graph/engine/validation/GraphPortSchemaResolver.cjs +58 -0
- package/lib/cjs/graph/engine/validation/GraphPortSchemaResolver.cjs.map +1 -0
- package/lib/cjs/graph/engine/validation/GraphValueValidator.cjs +52 -0
- package/lib/cjs/graph/engine/validation/GraphValueValidator.cjs.map +1 -0
- package/lib/cjs/graph/engine/validation/index.cjs +26 -0
- package/lib/cjs/graph/engine/validation/index.cjs.map +1 -0
- package/lib/cjs/graph/index.cjs +10 -60
- package/lib/cjs/graph/index.cjs.map +1 -0
- package/lib/cjs/graph/shared/constants.cjs +44 -0
- package/lib/cjs/graph/shared/constants.cjs.map +1 -0
- package/lib/cjs/graph/shared/index.cjs +38 -0
- package/lib/cjs/graph/shared/index.cjs.map +1 -0
- package/lib/cjs/graph/shared/nodes/agent.cjs +110 -0
- package/lib/cjs/graph/shared/nodes/agent.cjs.map +1 -0
- package/lib/cjs/graph/shared/nodes/base.cjs +36 -0
- package/lib/cjs/graph/shared/nodes/base.cjs.map +1 -0
- package/lib/cjs/graph/shared/nodes/category-styles.cjs +38 -0
- package/lib/cjs/graph/shared/nodes/category-styles.cjs.map +1 -0
- package/lib/cjs/graph/shared/nodes/flow-control.cjs +464 -0
- package/lib/cjs/graph/shared/nodes/flow-control.cjs.map +1 -0
- package/lib/cjs/graph/shared/nodes/index.cjs +35 -0
- package/lib/cjs/graph/shared/nodes/index.cjs.map +1 -0
- package/lib/cjs/graph/shared/nodes/triggers.cjs +250 -0
- package/lib/cjs/graph/shared/nodes/triggers.cjs.map +1 -0
- package/lib/cjs/graph/shared/types.cjs +4 -0
- package/lib/cjs/graph/shared/types.cjs.map +1 -0
- package/lib/cjs/index.cjs +5 -5
- package/lib/cjs/index.cjs.map +1 -0
- package/lib/cjs/keycloak/index.cjs +2 -2
- package/lib/cjs/keycloak/index.cjs.map +1 -0
- package/lib/cjs/keycloak/services/KeycloakAuthService.cjs +2 -2
- package/lib/cjs/keycloak/services/KeycloakAuthService.cjs.map +1 -0
- package/lib/cjs/keycloak/services/KeycloakClientService.cjs +2 -2
- package/lib/cjs/keycloak/services/KeycloakClientService.cjs.map +1 -0
- package/lib/cjs/keycloak/services/KeycloakIdentityProviderService.cjs +2 -2
- package/lib/cjs/keycloak/services/KeycloakIdentityProviderService.cjs.map +1 -0
- package/lib/cjs/keycloak/services/KeycloakRealmService.cjs +2 -2
- package/lib/cjs/keycloak/services/KeycloakRealmService.cjs.map +1 -0
- package/lib/cjs/keycloak/services/KeycloakRoleService.cjs +2 -2
- package/lib/cjs/keycloak/services/KeycloakRoleService.cjs.map +1 -0
- package/lib/cjs/keycloak/services/KeycloakService.cjs +2 -2
- package/lib/cjs/keycloak/services/KeycloakService.cjs.map +1 -0
- package/lib/cjs/keycloak/services/KeycloakUserService.cjs +2 -2
- package/lib/cjs/keycloak/services/KeycloakUserService.cjs.map +1 -0
- package/lib/cjs/keycloak/services/index.cjs +2 -2
- package/lib/cjs/keycloak/services/index.cjs.map +1 -0
- package/lib/cjs/keycloak/services/runtime.cjs +2 -2
- package/lib/cjs/keycloak/services/runtime.cjs.map +1 -0
- package/lib/cjs/keycloak/types.cjs +2 -2
- package/lib/cjs/keycloak/types.cjs.map +1 -0
- package/lib/cjs/kibana/helpers.cjs +2 -2
- package/lib/cjs/kibana/helpers.cjs.map +1 -0
- package/lib/cjs/kibana/index.cjs +2 -2
- package/lib/cjs/kibana/index.cjs.map +1 -0
- package/lib/cjs/kibana/services/KibanaAuthService.cjs +2 -2
- package/lib/cjs/kibana/services/KibanaAuthService.cjs.map +1 -0
- package/lib/cjs/kibana/services/KibanaDashboardService.cjs +2 -2
- package/lib/cjs/kibana/services/KibanaDashboardService.cjs.map +1 -0
- package/lib/cjs/kibana/services/KibanaDataViewService.cjs +2 -2
- package/lib/cjs/kibana/services/KibanaDataViewService.cjs.map +1 -0
- package/lib/cjs/kibana/services/KibanaRoleService.cjs +2 -2
- package/lib/cjs/kibana/services/KibanaRoleService.cjs.map +1 -0
- package/lib/cjs/kibana/services/KibanaService.cjs +2 -2
- package/lib/cjs/kibana/services/KibanaService.cjs.map +1 -0
- package/lib/cjs/kibana/services/KibanaSpaceService.cjs +2 -2
- package/lib/cjs/kibana/services/KibanaSpaceService.cjs.map +1 -0
- package/lib/cjs/kibana/services/KibanaUserService.cjs +2 -2
- package/lib/cjs/kibana/services/KibanaUserService.cjs.map +1 -0
- package/lib/cjs/kibana/services/index.cjs +2 -2
- package/lib/cjs/kibana/services/index.cjs.map +1 -0
- package/lib/cjs/kibana/services/runtime.cjs +2 -2
- package/lib/cjs/kibana/services/runtime.cjs.map +1 -0
- package/lib/cjs/kibana/types.cjs +2 -2
- package/lib/cjs/kibana/types.cjs.map +1 -0
- package/lib/cjs/namespaces/index.cjs +2 -2
- package/lib/cjs/namespaces/index.cjs.map +1 -0
- package/lib/cjs/namespaces/models/authorization-model.cjs +2 -2
- package/lib/cjs/namespaces/models/authorization-model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/effective-permission.model.cjs +2 -2
- package/lib/cjs/namespaces/models/effective-permission.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/group-membership.model.cjs +2 -2
- package/lib/cjs/namespaces/models/group-membership.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/group.model.cjs +2 -2
- package/lib/cjs/namespaces/models/group.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/index.cjs +2 -2
- package/lib/cjs/namespaces/models/index.cjs.map +1 -0
- package/lib/cjs/namespaces/models/inheritance-block.model.cjs +2 -2
- package/lib/cjs/namespaces/models/inheritance-block.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/org-unit-closure.model.cjs +2 -2
- package/lib/cjs/namespaces/models/org-unit-closure.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/org-unit-membership.model.cjs +2 -2
- package/lib/cjs/namespaces/models/org-unit-membership.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/org-unit-profile.model.cjs +2 -2
- package/lib/cjs/namespaces/models/org-unit-profile.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/org-unit.model.cjs +2 -2
- package/lib/cjs/namespaces/models/org-unit.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/permission.model.cjs +2 -2
- package/lib/cjs/namespaces/models/permission.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/principal.model.cjs +2 -2
- package/lib/cjs/namespaces/models/principal.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/protected-resource.model.cjs +2 -2
- package/lib/cjs/namespaces/models/protected-resource.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/resource-grant.model.cjs +2 -2
- package/lib/cjs/namespaces/models/resource-grant.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/role-assignment.model.cjs +2 -2
- package/lib/cjs/namespaces/models/role-assignment.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/role-permission.model.cjs +2 -2
- package/lib/cjs/namespaces/models/role-permission.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/role.model.cjs +2 -2
- package/lib/cjs/namespaces/models/role.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/storage-binding.model.cjs +2 -2
- package/lib/cjs/namespaces/models/storage-binding.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/tenant-membership.model.cjs +2 -2
- package/lib/cjs/namespaces/models/tenant-membership.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/tenant-profile.model.cjs +2 -2
- package/lib/cjs/namespaces/models/tenant-profile.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/tenant.model.cjs +2 -2
- package/lib/cjs/namespaces/models/tenant.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/user.model.cjs +2 -2
- package/lib/cjs/namespaces/models/user.model.cjs.map +1 -0
- package/lib/cjs/namespaces/org-based-authorization-system.cjs +10 -4
- package/lib/cjs/namespaces/org-based-authorization-system.cjs.map +1 -0
- package/lib/cjs/namespaces/org-based-authorization-system.models.cjs +2 -2
- package/lib/cjs/namespaces/org-based-authorization-system.models.cjs.map +1 -0
- package/lib/cjs/namespaces/org-based-authorization-system.services.cjs +19 -10
- package/lib/cjs/namespaces/org-based-authorization-system.services.cjs.map +1 -0
- package/lib/cjs/namespaces/services/authz.service.cjs +39 -13
- package/lib/cjs/namespaces/services/authz.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/bootstrap.service.cjs +2 -2
- package/lib/cjs/namespaces/services/bootstrap.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/effective-permission.service.cjs +2 -2
- package/lib/cjs/namespaces/services/effective-permission.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/group-membership.service.cjs +2 -2
- package/lib/cjs/namespaces/services/group-membership.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/group.service.cjs +2 -2
- package/lib/cjs/namespaces/services/group.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/index.cjs +2 -2
- package/lib/cjs/namespaces/services/index.cjs.map +1 -0
- package/lib/cjs/namespaces/services/inheritance-block.service.cjs +6 -4
- package/lib/cjs/namespaces/services/inheritance-block.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/org-unit-closure.service.cjs +16 -7
- package/lib/cjs/namespaces/services/org-unit-closure.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/org-unit-membership.service.cjs +2 -2
- package/lib/cjs/namespaces/services/org-unit-membership.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/org-unit-profile.service.cjs +2 -2
- package/lib/cjs/namespaces/services/org-unit-profile.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/org-unit.service.cjs +2 -2
- package/lib/cjs/namespaces/services/org-unit.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/permission.service.cjs +2 -2
- package/lib/cjs/namespaces/services/permission.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/principal.service.cjs +2 -2
- package/lib/cjs/namespaces/services/principal.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/protected-resource.service.cjs +2 -2
- package/lib/cjs/namespaces/services/protected-resource.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/resource-grant.service.cjs +2 -2
- package/lib/cjs/namespaces/services/resource-grant.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/resource-lifecycle.service.cjs +2 -2
- package/lib/cjs/namespaces/services/resource-lifecycle.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/role-assignment.service.cjs +4 -3
- package/lib/cjs/namespaces/services/role-assignment.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/role-permission.service.cjs +2 -2
- package/lib/cjs/namespaces/services/role-permission.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/role.service.cjs +2 -2
- package/lib/cjs/namespaces/services/role.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/storage-binding.service.cjs +2 -2
- package/lib/cjs/namespaces/services/storage-binding.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/system-management.service.cjs +2 -2
- package/lib/cjs/namespaces/services/system-management.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/tenant-membership.service.cjs +2 -2
- package/lib/cjs/namespaces/services/tenant-membership.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/tenant-profile.service.cjs +2 -2
- package/lib/cjs/namespaces/services/tenant-profile.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/tenant.service.cjs +2 -2
- package/lib/cjs/namespaces/services/tenant.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/user.service.cjs +2 -2
- package/lib/cjs/namespaces/services/user.service.cjs.map +1 -0
- package/lib/cjs/namespaces/types.cjs +2 -2
- package/lib/cjs/namespaces/types.cjs.map +1 -0
- package/lib/cjs/namespaces/utils.cjs +13 -5
- package/lib/cjs/namespaces/utils.cjs.map +1 -0
- package/lib/cjs/nest/authService.cjs +2 -2
- package/lib/cjs/nest/authService.cjs.map +1 -0
- package/lib/cjs/nest/graph/GraphExecutionController.cjs +2 -2
- package/lib/cjs/nest/graph/GraphExecutionController.cjs.map +1 -0
- package/lib/cjs/nest/graph/GraphExecutionModule.cjs +6 -4
- package/lib/cjs/nest/graph/GraphExecutionModule.cjs.map +1 -0
- package/lib/cjs/nest/graph/GraphExecutionResultModel.cjs +2 -2
- package/lib/cjs/nest/graph/GraphExecutionResultModel.cjs.map +1 -0
- package/lib/cjs/nest/graph/GraphExecutionResultRepository.cjs +2 -2
- package/lib/cjs/nest/graph/GraphExecutionResultRepository.cjs.map +1 -0
- package/lib/cjs/nest/graph/GraphExecutorRegistryFactory.cjs +97 -11
- package/lib/cjs/nest/graph/GraphExecutorRegistryFactory.cjs.map +1 -0
- package/lib/cjs/nest/graph/index.cjs +2 -2
- package/lib/cjs/nest/graph/index.cjs.map +1 -0
- package/lib/cjs/nest/graph/main.cjs +30 -0
- package/lib/cjs/nest/graph/main.cjs.map +1 -0
- package/lib/cjs/nest/index.cjs +2 -2
- package/lib/cjs/nest/index.cjs.map +1 -0
- package/lib/cjs/nest/keycloakAuthHandler.cjs +2 -2
- package/lib/cjs/nest/keycloakAuthHandler.cjs.map +1 -0
- package/lib/cjs/nest/keycloakModule.cjs +2 -2
- package/lib/cjs/nest/keycloakModule.cjs.map +1 -0
- package/lib/cjs/nest/logging.cjs +2 -2
- package/lib/cjs/nest/logging.cjs.map +1 -0
- package/lib/cjs/nest/types.cjs +2 -2
- package/lib/cjs/nest/types.cjs.map +1 -0
- package/lib/cjs/nest/utils.cjs +2 -2
- package/lib/cjs/nest/utils.cjs.map +1 -0
- package/lib/cjs/secrets/aws/AwsSecretService.cjs +2 -2
- package/lib/cjs/secrets/aws/AwsSecretService.cjs.map +1 -0
- package/lib/cjs/secrets/aws/AwsSecretServiceConfig.cjs +2 -2
- package/lib/cjs/secrets/aws/AwsSecretServiceConfig.cjs.map +1 -0
- package/lib/cjs/secrets/aws/index.cjs +2 -2
- package/lib/cjs/secrets/aws/index.cjs.map +1 -0
- package/lib/cjs/secrets/azure/AzureKeyVaultSecretService.cjs +2 -2
- package/lib/cjs/secrets/azure/AzureKeyVaultSecretService.cjs.map +1 -0
- package/lib/cjs/secrets/azure/AzureKeyVaultSecretServiceConfig.cjs +2 -2
- package/lib/cjs/secrets/azure/AzureKeyVaultSecretServiceConfig.cjs.map +1 -0
- package/lib/cjs/secrets/azure/index.cjs +2 -2
- package/lib/cjs/secrets/azure/index.cjs.map +1 -0
- package/lib/cjs/secrets/core/SecretErrors.cjs +2 -2
- package/lib/cjs/secrets/core/SecretErrors.cjs.map +1 -0
- package/lib/cjs/secrets/core/SecretName.cjs +2 -2
- package/lib/cjs/secrets/core/SecretName.cjs.map +1 -0
- package/lib/cjs/secrets/core/SecretReference.cjs +2 -2
- package/lib/cjs/secrets/core/SecretReference.cjs.map +1 -0
- package/lib/cjs/secrets/core/SecretSerialization.cjs +2 -2
- package/lib/cjs/secrets/core/SecretSerialization.cjs.map +1 -0
- package/lib/cjs/secrets/core/SecretService.cjs +2 -2
- package/lib/cjs/secrets/core/SecretService.cjs.map +1 -0
- package/lib/cjs/secrets/core/SecretTypes.cjs +2 -2
- package/lib/cjs/secrets/core/SecretTypes.cjs.map +1 -0
- package/lib/cjs/secrets/core/index.cjs +2 -2
- package/lib/cjs/secrets/core/index.cjs.map +1 -0
- package/lib/cjs/secrets/gcp/GcpSecretManagerService.cjs +2 -2
- package/lib/cjs/secrets/gcp/GcpSecretManagerService.cjs.map +1 -0
- package/lib/cjs/secrets/gcp/GcpSecretManagerServiceConfig.cjs +2 -2
- package/lib/cjs/secrets/gcp/GcpSecretManagerServiceConfig.cjs.map +1 -0
- package/lib/cjs/secrets/gcp/index.cjs +2 -2
- package/lib/cjs/secrets/gcp/index.cjs.map +1 -0
- package/lib/cjs/secrets/index.cjs +2 -2
- package/lib/cjs/secrets/index.cjs.map +1 -0
- package/lib/cjs/secrets/model/ModelSecretCrypto.cjs +2 -2
- package/lib/cjs/secrets/model/ModelSecretCrypto.cjs.map +1 -0
- package/lib/cjs/secrets/model/ModelSecretService.cjs +2 -2
- package/lib/cjs/secrets/model/ModelSecretService.cjs.map +1 -0
- package/lib/cjs/secrets/model/ModelSecretServiceConfig.cjs +2 -2
- package/lib/cjs/secrets/model/ModelSecretServiceConfig.cjs.map +1 -0
- package/lib/cjs/secrets/model/Secret.cjs +2 -2
- package/lib/cjs/secrets/model/Secret.cjs.map +1 -0
- package/lib/cjs/secrets/model/index.cjs +2 -2
- package/lib/cjs/secrets/model/index.cjs.map +1 -0
- package/lib/cjs/secrets/onepassword/OnePasswordSecretService.cjs +2 -2
- package/lib/cjs/secrets/onepassword/OnePasswordSecretService.cjs.map +1 -0
- package/lib/cjs/secrets/onepassword/OnePasswordSecretServiceConfig.cjs +2 -2
- package/lib/cjs/secrets/onepassword/OnePasswordSecretServiceConfig.cjs.map +1 -0
- package/lib/cjs/secrets/onepassword/index.cjs +2 -2
- package/lib/cjs/secrets/onepassword/index.cjs.map +1 -0
- package/lib/cjs/secrets/vault/VaultSecretService.cjs +2 -2
- package/lib/cjs/secrets/vault/VaultSecretService.cjs.map +1 -0
- package/lib/cjs/secrets/vault/VaultSecretServiceConfig.cjs +2 -2
- package/lib/cjs/secrets/vault/VaultSecretServiceConfig.cjs.map +1 -0
- package/lib/cjs/secrets/vault/index.cjs +2 -2
- package/lib/cjs/secrets/vault/index.cjs.map +1 -0
- package/lib/cjs/shared/runtime.cjs +2 -2
- package/lib/cjs/shared/runtime.cjs.map +1 -0
- package/lib/cjs/utils.cjs +2 -2
- package/lib/cjs/utils.cjs.map +1 -0
- package/lib/esm/blob/azure/AzureBlobStoreService.js +1 -1
- package/lib/esm/blob/azure/AzureBlobStoreService.js.map +1 -0
- package/lib/esm/blob/azure/index.js +1 -1
- package/lib/esm/blob/azure/index.js.map +1 -0
- package/lib/esm/blob/core/BlobErrors.js +1 -1
- package/lib/esm/blob/core/BlobErrors.js.map +1 -0
- package/lib/esm/blob/core/BlobKey.js +1 -1
- package/lib/esm/blob/core/BlobKey.js.map +1 -0
- package/lib/esm/blob/core/BlobStoreFactory.js +1 -1
- package/lib/esm/blob/core/BlobStoreFactory.js.map +1 -0
- package/lib/esm/blob/core/BlobStoreService.js +1 -1
- package/lib/esm/blob/core/BlobStoreService.js.map +1 -0
- package/lib/esm/blob/core/BlobTypes.js +1 -1
- package/lib/esm/blob/core/BlobTypes.js.map +1 -0
- package/lib/esm/blob/core/BlobValue.js +1 -1
- package/lib/esm/blob/core/BlobValue.js.map +1 -0
- package/lib/esm/blob/core/index.js +1 -1
- package/lib/esm/blob/core/index.js.map +1 -0
- package/lib/esm/blob/gcp/GcsBlobStoreService.js +1 -1
- package/lib/esm/blob/gcp/GcsBlobStoreService.js.map +1 -0
- package/lib/esm/blob/gcp/index.js +1 -1
- package/lib/esm/blob/gcp/index.js.map +1 -0
- package/lib/esm/blob/index.js +1 -1
- package/lib/esm/blob/index.js.map +1 -0
- package/lib/esm/blob/ipfs/IpfsBlobStoreService.js +1 -1
- package/lib/esm/blob/ipfs/IpfsBlobStoreService.js.map +1 -0
- package/lib/esm/blob/ipfs/IpfsKeyIndex.js +1 -1
- package/lib/esm/blob/ipfs/IpfsKeyIndex.js.map +1 -0
- package/lib/esm/blob/ipfs/LocalJsonIpfsKeyIndex.js +1 -1
- package/lib/esm/blob/ipfs/LocalJsonIpfsKeyIndex.js.map +1 -0
- package/lib/esm/blob/ipfs/MemoryIpfsKeyIndex.js +1 -1
- package/lib/esm/blob/ipfs/MemoryIpfsKeyIndex.js.map +1 -0
- package/lib/esm/blob/ipfs/PostgresIpfsKeyIndex.js +1 -1
- package/lib/esm/blob/ipfs/PostgresIpfsKeyIndex.js.map +1 -0
- package/lib/esm/blob/ipfs/index.js +1 -1
- package/lib/esm/blob/ipfs/index.js.map +1 -0
- package/lib/esm/blob/local/LocalBlobStoreService.js +1 -1
- package/lib/esm/blob/local/LocalBlobStoreService.js.map +1 -0
- package/lib/esm/blob/local/index.js +1 -1
- package/lib/esm/blob/local/index.js.map +1 -0
- package/lib/esm/blob/memory/MemoryBlobStoreService.js +1 -1
- package/lib/esm/blob/memory/MemoryBlobStoreService.js.map +1 -0
- package/lib/esm/blob/memory/index.js +1 -1
- package/lib/esm/blob/memory/index.js.map +1 -0
- package/lib/esm/blob/s3/MinioBlobStoreService.js +1 -1
- package/lib/esm/blob/s3/MinioBlobStoreService.js.map +1 -0
- package/lib/esm/blob/s3/R2BlobStoreService.js +1 -1
- package/lib/esm/blob/s3/R2BlobStoreService.js.map +1 -0
- package/lib/esm/blob/s3/S3BlobStoreService.js +1 -1
- package/lib/esm/blob/s3/S3BlobStoreService.js.map +1 -0
- package/lib/esm/blob/s3/index.js +1 -1
- package/lib/esm/blob/s3/index.js.map +1 -0
- package/lib/esm/docker/DockerComposeService.js +1 -1
- package/lib/esm/docker/DockerComposeService.js.map +1 -0
- package/lib/esm/docker/index.js +1 -1
- package/lib/esm/docker/index.js.map +1 -0
- package/lib/esm/graph/engine/constants.js +62 -0
- package/lib/esm/graph/engine/constants.js.map +1 -0
- package/lib/esm/graph/engine/decorators.js +2 -0
- package/lib/esm/graph/engine/decorators.js.map +1 -0
- package/lib/esm/graph/engine/errors/GraphCycleError.js +15 -0
- package/lib/esm/graph/engine/errors/GraphCycleError.js.map +1 -0
- package/lib/esm/graph/engine/errors/GraphExecutionError.js +22 -0
- package/lib/esm/graph/engine/errors/GraphExecutionError.js.map +1 -0
- package/lib/esm/graph/engine/errors/GraphInputError.js +15 -0
- package/lib/esm/graph/engine/errors/GraphInputError.js.map +1 -0
- package/lib/esm/graph/engine/errors/GraphLoopLimitError.js +15 -0
- package/lib/esm/graph/engine/errors/GraphLoopLimitError.js.map +1 -0
- package/lib/esm/graph/engine/errors/GraphPinningError.js +15 -0
- package/lib/esm/graph/engine/errors/GraphPinningError.js.map +1 -0
- package/lib/esm/graph/engine/errors/GraphPortError.js +15 -0
- package/lib/esm/graph/engine/errors/GraphPortError.js.map +1 -0
- package/lib/esm/graph/engine/errors/GraphStoreError.js +15 -0
- package/lib/esm/graph/engine/errors/GraphStoreError.js.map +1 -0
- package/lib/esm/graph/engine/errors/GraphTopologyError.js +15 -0
- package/lib/esm/graph/engine/errors/GraphTopologyError.js.map +1 -0
- package/lib/esm/graph/engine/errors/index.js +14 -0
- package/lib/esm/graph/engine/errors/index.js.map +1 -0
- package/lib/esm/graph/engine/events/GraphExecutionEvent.js +2 -0
- package/lib/esm/graph/engine/events/GraphExecutionEvent.js.map +1 -0
- package/lib/esm/graph/engine/events/GraphExecutionEventEmitter.js +35 -0
- package/lib/esm/graph/engine/events/GraphExecutionEventEmitter.js.map +1 -0
- package/lib/esm/graph/engine/events/GraphExecutionEventFactory.js +32 -0
- package/lib/esm/graph/engine/events/GraphExecutionEventFactory.js.map +1 -0
- package/lib/esm/graph/engine/events/GraphExecutionObserver.js +2 -0
- package/lib/esm/graph/engine/events/GraphExecutionObserver.js.map +1 -0
- package/lib/esm/graph/engine/events/index.js +10 -0
- package/lib/esm/graph/engine/events/index.js.map +1 -0
- package/lib/esm/graph/engine/execution/CodeSandboxEvaluator.js +18 -0
- package/lib/esm/graph/engine/execution/CodeSandboxEvaluator.js.map +1 -0
- package/lib/esm/graph/engine/execution/GraphExecutionContext.js +74 -0
- package/lib/esm/graph/engine/execution/GraphExecutionContext.js.map +1 -0
- package/lib/esm/graph/engine/execution/GraphExecutionEngine.js +408 -0
- package/lib/esm/graph/engine/execution/GraphExecutionEngine.js.map +1 -0
- package/lib/esm/graph/engine/execution/GraphExecutionFrame.js +27 -0
- package/lib/esm/graph/engine/execution/GraphExecutionFrame.js.map +1 -0
- package/lib/esm/graph/engine/execution/GraphExecutionResult.js +26 -0
- package/lib/esm/graph/engine/execution/GraphExecutionResult.js.map +1 -0
- package/lib/esm/graph/engine/execution/GraphNodeExecutor.js +2 -0
- package/lib/esm/graph/engine/execution/GraphNodeExecutor.js.map +1 -0
- package/lib/esm/graph/engine/execution/SwitchGraphNodeExecutor.js +98 -0
- package/lib/esm/graph/engine/execution/SwitchGraphNodeExecutor.js.map +1 -0
- package/lib/esm/graph/engine/execution/index.js +13 -0
- package/lib/esm/graph/engine/execution/index.js.map +1 -0
- package/lib/esm/graph/engine/index.js +67 -0
- package/lib/esm/graph/engine/index.js.map +1 -0
- package/lib/esm/graph/engine/loops/ConditionExpressionEvaluator.js +82 -0
- package/lib/esm/graph/engine/loops/ConditionExpressionEvaluator.js.map +1 -0
- package/lib/esm/graph/engine/loops/ForeachGraphNodeExecutor.js +80 -0
- package/lib/esm/graph/engine/loops/ForeachGraphNodeExecutor.js.map +1 -0
- package/lib/esm/graph/engine/loops/GraphConditionEvaluator.js +80 -0
- package/lib/esm/graph/engine/loops/GraphConditionEvaluator.js.map +1 -0
- package/lib/esm/graph/engine/loops/GraphLoopExecutionContext.js +11 -0
- package/lib/esm/graph/engine/loops/GraphLoopExecutionContext.js.map +1 -0
- package/lib/esm/graph/engine/loops/UntilGraphNodeExecutor.js +72 -0
- package/lib/esm/graph/engine/loops/UntilGraphNodeExecutor.js.map +1 -0
- package/lib/esm/graph/engine/loops/WhileGraphNodeExecutor.js +73 -0
- package/lib/esm/graph/engine/loops/WhileGraphNodeExecutor.js.map +1 -0
- package/lib/esm/graph/engine/loops/index.js +12 -0
- package/lib/esm/graph/engine/loops/index.js.map +1 -0
- package/lib/esm/graph/engine/pinning/GraphPinningDependencyResolver.js +23 -0
- package/lib/esm/graph/engine/pinning/GraphPinningDependencyResolver.js.map +1 -0
- package/lib/esm/graph/engine/pinning/GraphPinningMetadata.js +15 -0
- package/lib/esm/graph/engine/pinning/GraphPinningMetadata.js.map +1 -0
- package/lib/esm/graph/engine/pinning/GraphPinningPolicy.js +29 -0
- package/lib/esm/graph/engine/pinning/GraphPinningPolicy.js.map +1 -0
- package/lib/esm/graph/engine/pinning/GraphPinningService.js +186 -0
- package/lib/esm/graph/engine/pinning/GraphPinningService.js.map +1 -0
- package/lib/esm/graph/engine/pinning/index.js +10 -0
- package/lib/esm/graph/engine/pinning/index.js.map +1 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlan.js +2 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlan.js.map +1 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanEdge.js +7 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanEdge.js.map +1 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanLayer.js +2 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanLayer.js.map +1 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanNode.js +2 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanNode.js.map +1 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanner.js +192 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanner.js.map +1 -0
- package/lib/esm/graph/engine/planning/GraphRelationResolver.js +167 -0
- package/lib/esm/graph/engine/planning/GraphRelationResolver.js.map +1 -0
- package/lib/esm/graph/engine/planning/GraphTopology.js +52 -0
- package/lib/esm/graph/engine/planning/GraphTopology.js.map +1 -0
- package/lib/esm/graph/engine/planning/index.js +13 -0
- package/lib/esm/graph/engine/planning/index.js.map +1 -0
- package/lib/esm/graph/engine/registry/GraphNodeExecutorRegistry.js +39 -0
- package/lib/esm/graph/engine/registry/GraphNodeExecutorRegistry.js.map +1 -0
- package/lib/esm/graph/engine/registry/GraphNodeExecutorResolver.js +22 -0
- package/lib/esm/graph/engine/registry/GraphNodeExecutorResolver.js.map +1 -0
- package/lib/esm/graph/engine/registry/index.js +8 -0
- package/lib/esm/graph/engine/registry/index.js.map +1 -0
- package/lib/esm/graph/engine/snapshots/GraphExecutionSnapshotMapper.js +48 -0
- package/lib/esm/graph/engine/snapshots/GraphExecutionSnapshotMapper.js.map +1 -0
- package/lib/esm/graph/engine/snapshots/index.js +7 -0
- package/lib/esm/graph/engine/snapshots/index.js.map +1 -0
- package/lib/esm/graph/engine/store/GraphCachedValue.js +2 -0
- package/lib/esm/graph/engine/store/GraphCachedValue.js.map +1 -0
- package/lib/esm/graph/engine/store/GraphValueKey.js +7 -0
- package/lib/esm/graph/engine/store/GraphValueKey.js.map +1 -0
- package/lib/esm/graph/engine/store/GraphValueStore.js +71 -0
- package/lib/esm/graph/engine/store/GraphValueStore.js.map +1 -0
- package/lib/esm/graph/engine/store/GraphValueStoreAdapter.js +2 -0
- package/lib/esm/graph/engine/store/GraphValueStoreAdapter.js.map +1 -0
- package/lib/esm/graph/engine/store/InMemoryGraphValueStoreAdapter.js +64 -0
- package/lib/esm/graph/engine/store/InMemoryGraphValueStoreAdapter.js.map +1 -0
- package/lib/esm/graph/engine/store/index.js +11 -0
- package/lib/esm/graph/engine/store/index.js.map +1 -0
- package/lib/esm/graph/engine/types.js +2 -0
- package/lib/esm/graph/engine/types.js.map +1 -0
- package/lib/esm/graph/engine/validation/GraphDefinitionValidator.js +28 -0
- package/lib/esm/graph/engine/validation/GraphDefinitionValidator.js.map +1 -0
- package/lib/esm/graph/engine/validation/GraphPortSchemaResolver.js +53 -0
- package/lib/esm/graph/engine/validation/GraphPortSchemaResolver.js.map +1 -0
- package/lib/esm/graph/engine/validation/GraphValueValidator.js +47 -0
- package/lib/esm/graph/engine/validation/GraphValueValidator.js.map +1 -0
- package/lib/esm/graph/engine/validation/index.js +9 -0
- package/lib/esm/graph/engine/validation/index.js.map +1 -0
- package/lib/esm/graph/index.js +9 -59
- package/lib/esm/graph/index.js.map +1 -0
- package/lib/esm/graph/shared/constants.js +56 -0
- package/lib/esm/graph/shared/constants.js.map +1 -0
- package/lib/esm/graph/shared/index.js +19 -0
- package/lib/esm/graph/shared/index.js.map +1 -0
- package/lib/esm/graph/shared/nodes/agent.js +101 -0
- package/lib/esm/graph/shared/nodes/agent.js.map +1 -0
- package/lib/esm/graph/shared/nodes/base.js +31 -0
- package/lib/esm/graph/shared/nodes/base.js.map +1 -0
- package/lib/esm/graph/shared/nodes/category-styles.js +34 -0
- package/lib/esm/graph/shared/nodes/category-styles.js.map +1 -0
- package/lib/esm/graph/shared/nodes/flow-control.js +455 -0
- package/lib/esm/graph/shared/nodes/flow-control.js.map +1 -0
- package/lib/esm/graph/shared/nodes/index.js +18 -0
- package/lib/esm/graph/shared/nodes/index.js.map +1 -0
- package/lib/esm/graph/shared/nodes/triggers.js +241 -0
- package/lib/esm/graph/shared/nodes/triggers.js.map +1 -0
- package/lib/esm/graph/shared/types.js +2 -0
- package/lib/esm/graph/shared/types.js.map +1 -0
- package/lib/esm/index.js +4 -4
- package/lib/esm/index.js.map +1 -0
- package/lib/esm/keycloak/index.js +1 -1
- package/lib/esm/keycloak/index.js.map +1 -0
- package/lib/esm/keycloak/services/KeycloakAuthService.js +1 -1
- package/lib/esm/keycloak/services/KeycloakAuthService.js.map +1 -0
- package/lib/esm/keycloak/services/KeycloakClientService.js +1 -1
- package/lib/esm/keycloak/services/KeycloakClientService.js.map +1 -0
- package/lib/esm/keycloak/services/KeycloakIdentityProviderService.js +1 -1
- package/lib/esm/keycloak/services/KeycloakIdentityProviderService.js.map +1 -0
- package/lib/esm/keycloak/services/KeycloakRealmService.js +1 -1
- package/lib/esm/keycloak/services/KeycloakRealmService.js.map +1 -0
- package/lib/esm/keycloak/services/KeycloakRoleService.js +1 -1
- package/lib/esm/keycloak/services/KeycloakRoleService.js.map +1 -0
- package/lib/esm/keycloak/services/KeycloakService.js +1 -1
- package/lib/esm/keycloak/services/KeycloakService.js.map +1 -0
- package/lib/esm/keycloak/services/KeycloakUserService.js +1 -1
- package/lib/esm/keycloak/services/KeycloakUserService.js.map +1 -0
- package/lib/esm/keycloak/services/index.js +1 -1
- package/lib/esm/keycloak/services/index.js.map +1 -0
- package/lib/esm/keycloak/services/runtime.js +1 -1
- package/lib/esm/keycloak/services/runtime.js.map +1 -0
- package/lib/esm/keycloak/types.js +1 -1
- package/lib/esm/keycloak/types.js.map +1 -0
- package/lib/esm/kibana/helpers.js +1 -1
- package/lib/esm/kibana/helpers.js.map +1 -0
- package/lib/esm/kibana/index.js +1 -1
- package/lib/esm/kibana/index.js.map +1 -0
- package/lib/esm/kibana/services/KibanaAuthService.js +1 -1
- package/lib/esm/kibana/services/KibanaAuthService.js.map +1 -0
- package/lib/esm/kibana/services/KibanaDashboardService.js +1 -1
- package/lib/esm/kibana/services/KibanaDashboardService.js.map +1 -0
- package/lib/esm/kibana/services/KibanaDataViewService.js +1 -1
- package/lib/esm/kibana/services/KibanaDataViewService.js.map +1 -0
- package/lib/esm/kibana/services/KibanaRoleService.js +1 -1
- package/lib/esm/kibana/services/KibanaRoleService.js.map +1 -0
- package/lib/esm/kibana/services/KibanaService.js +1 -1
- package/lib/esm/kibana/services/KibanaService.js.map +1 -0
- package/lib/esm/kibana/services/KibanaSpaceService.js +1 -1
- package/lib/esm/kibana/services/KibanaSpaceService.js.map +1 -0
- package/lib/esm/kibana/services/KibanaUserService.js +1 -1
- package/lib/esm/kibana/services/KibanaUserService.js.map +1 -0
- package/lib/esm/kibana/services/index.js +1 -1
- package/lib/esm/kibana/services/index.js.map +1 -0
- package/lib/esm/kibana/services/runtime.js +1 -1
- package/lib/esm/kibana/services/runtime.js.map +1 -0
- package/lib/esm/kibana/types.js +1 -1
- package/lib/esm/kibana/types.js.map +1 -0
- package/lib/esm/namespaces/index.js +1 -1
- package/lib/esm/namespaces/index.js.map +1 -0
- package/lib/esm/namespaces/models/authorization-model.js +1 -1
- package/lib/esm/namespaces/models/authorization-model.js.map +1 -0
- package/lib/esm/namespaces/models/effective-permission.model.js +1 -1
- package/lib/esm/namespaces/models/effective-permission.model.js.map +1 -0
- package/lib/esm/namespaces/models/group-membership.model.js +1 -1
- package/lib/esm/namespaces/models/group-membership.model.js.map +1 -0
- package/lib/esm/namespaces/models/group.model.js +1 -1
- package/lib/esm/namespaces/models/group.model.js.map +1 -0
- package/lib/esm/namespaces/models/index.js +1 -1
- package/lib/esm/namespaces/models/index.js.map +1 -0
- package/lib/esm/namespaces/models/inheritance-block.model.js +1 -1
- package/lib/esm/namespaces/models/inheritance-block.model.js.map +1 -0
- package/lib/esm/namespaces/models/org-unit-closure.model.js +1 -1
- package/lib/esm/namespaces/models/org-unit-closure.model.js.map +1 -0
- package/lib/esm/namespaces/models/org-unit-membership.model.js +1 -1
- package/lib/esm/namespaces/models/org-unit-membership.model.js.map +1 -0
- package/lib/esm/namespaces/models/org-unit-profile.model.js +1 -1
- package/lib/esm/namespaces/models/org-unit-profile.model.js.map +1 -0
- package/lib/esm/namespaces/models/org-unit.model.js +1 -1
- package/lib/esm/namespaces/models/org-unit.model.js.map +1 -0
- package/lib/esm/namespaces/models/permission.model.js +1 -1
- package/lib/esm/namespaces/models/permission.model.js.map +1 -0
- package/lib/esm/namespaces/models/principal.model.js +1 -1
- package/lib/esm/namespaces/models/principal.model.js.map +1 -0
- package/lib/esm/namespaces/models/protected-resource.model.js +1 -1
- package/lib/esm/namespaces/models/protected-resource.model.js.map +1 -0
- package/lib/esm/namespaces/models/resource-grant.model.js +1 -1
- package/lib/esm/namespaces/models/resource-grant.model.js.map +1 -0
- package/lib/esm/namespaces/models/role-assignment.model.js +1 -1
- package/lib/esm/namespaces/models/role-assignment.model.js.map +1 -0
- package/lib/esm/namespaces/models/role-permission.model.js +1 -1
- package/lib/esm/namespaces/models/role-permission.model.js.map +1 -0
- package/lib/esm/namespaces/models/role.model.js +1 -1
- package/lib/esm/namespaces/models/role.model.js.map +1 -0
- package/lib/esm/namespaces/models/storage-binding.model.js +1 -1
- package/lib/esm/namespaces/models/storage-binding.model.js.map +1 -0
- package/lib/esm/namespaces/models/tenant-membership.model.js +1 -1
- package/lib/esm/namespaces/models/tenant-membership.model.js.map +1 -0
- package/lib/esm/namespaces/models/tenant-profile.model.js +1 -1
- package/lib/esm/namespaces/models/tenant-profile.model.js.map +1 -0
- package/lib/esm/namespaces/models/tenant.model.js +3 -3
- package/lib/esm/namespaces/models/tenant.model.js.map +1 -0
- package/lib/esm/namespaces/models/user.model.js +1 -1
- package/lib/esm/namespaces/models/user.model.js.map +1 -0
- package/lib/esm/namespaces/org-based-authorization-system.js +10 -4
- package/lib/esm/namespaces/org-based-authorization-system.js.map +1 -0
- package/lib/esm/namespaces/org-based-authorization-system.models.js +1 -1
- package/lib/esm/namespaces/org-based-authorization-system.models.js.map +1 -0
- package/lib/esm/namespaces/org-based-authorization-system.services.js +18 -9
- package/lib/esm/namespaces/org-based-authorization-system.services.js.map +1 -0
- package/lib/esm/namespaces/services/authz.service.js +40 -14
- package/lib/esm/namespaces/services/authz.service.js.map +1 -0
- package/lib/esm/namespaces/services/bootstrap.service.js +1 -1
- package/lib/esm/namespaces/services/bootstrap.service.js.map +1 -0
- package/lib/esm/namespaces/services/effective-permission.service.js +1 -1
- package/lib/esm/namespaces/services/effective-permission.service.js.map +1 -0
- package/lib/esm/namespaces/services/group-membership.service.js +1 -1
- package/lib/esm/namespaces/services/group-membership.service.js.map +1 -0
- package/lib/esm/namespaces/services/group.service.js +1 -1
- package/lib/esm/namespaces/services/group.service.js.map +1 -0
- package/lib/esm/namespaces/services/index.js +1 -1
- package/lib/esm/namespaces/services/index.js.map +1 -0
- package/lib/esm/namespaces/services/inheritance-block.service.js +5 -3
- package/lib/esm/namespaces/services/inheritance-block.service.js.map +1 -0
- package/lib/esm/namespaces/services/org-unit-closure.service.js +16 -7
- package/lib/esm/namespaces/services/org-unit-closure.service.js.map +1 -0
- package/lib/esm/namespaces/services/org-unit-membership.service.js +1 -1
- package/lib/esm/namespaces/services/org-unit-membership.service.js.map +1 -0
- package/lib/esm/namespaces/services/org-unit-profile.service.js +1 -1
- package/lib/esm/namespaces/services/org-unit-profile.service.js.map +1 -0
- package/lib/esm/namespaces/services/org-unit.service.js +1 -1
- package/lib/esm/namespaces/services/org-unit.service.js.map +1 -0
- package/lib/esm/namespaces/services/permission.service.js +1 -1
- package/lib/esm/namespaces/services/permission.service.js.map +1 -0
- package/lib/esm/namespaces/services/principal.service.js +1 -1
- package/lib/esm/namespaces/services/principal.service.js.map +1 -0
- package/lib/esm/namespaces/services/protected-resource.service.js +1 -1
- package/lib/esm/namespaces/services/protected-resource.service.js.map +1 -0
- package/lib/esm/namespaces/services/resource-grant.service.js +1 -1
- package/lib/esm/namespaces/services/resource-grant.service.js.map +1 -0
- package/lib/esm/namespaces/services/resource-lifecycle.service.js +1 -1
- package/lib/esm/namespaces/services/resource-lifecycle.service.js.map +1 -0
- package/lib/esm/namespaces/services/role-assignment.service.js +3 -2
- package/lib/esm/namespaces/services/role-assignment.service.js.map +1 -0
- package/lib/esm/namespaces/services/role-permission.service.js +1 -1
- package/lib/esm/namespaces/services/role-permission.service.js.map +1 -0
- package/lib/esm/namespaces/services/role.service.js +1 -1
- package/lib/esm/namespaces/services/role.service.js.map +1 -0
- package/lib/esm/namespaces/services/storage-binding.service.js +1 -1
- package/lib/esm/namespaces/services/storage-binding.service.js.map +1 -0
- package/lib/esm/namespaces/services/system-management.service.js +1 -1
- package/lib/esm/namespaces/services/system-management.service.js.map +1 -0
- package/lib/esm/namespaces/services/tenant-membership.service.js +1 -1
- package/lib/esm/namespaces/services/tenant-membership.service.js.map +1 -0
- package/lib/esm/namespaces/services/tenant-profile.service.js +1 -1
- package/lib/esm/namespaces/services/tenant-profile.service.js.map +1 -0
- package/lib/esm/namespaces/services/tenant.service.js +1 -1
- package/lib/esm/namespaces/services/tenant.service.js.map +1 -0
- package/lib/esm/namespaces/services/user.service.js +1 -1
- package/lib/esm/namespaces/services/user.service.js.map +1 -0
- package/lib/esm/namespaces/types.js +1 -1
- package/lib/esm/namespaces/types.js.map +1 -0
- package/lib/esm/namespaces/utils.js +12 -4
- package/lib/esm/namespaces/utils.js.map +1 -0
- package/lib/esm/nest/authService.js +1 -1
- package/lib/esm/nest/authService.js.map +1 -0
- package/lib/esm/nest/graph/GraphExecutionController.js +1 -1
- package/lib/esm/nest/graph/GraphExecutionController.js.map +1 -0
- package/lib/esm/nest/graph/GraphExecutionModule.js +6 -4
- package/lib/esm/nest/graph/GraphExecutionModule.js.map +1 -0
- package/lib/esm/nest/graph/GraphExecutionResultModel.js +1 -1
- package/lib/esm/nest/graph/GraphExecutionResultModel.js.map +1 -0
- package/lib/esm/nest/graph/GraphExecutionResultRepository.js +1 -1
- package/lib/esm/nest/graph/GraphExecutionResultRepository.js.map +1 -0
- package/lib/esm/nest/graph/GraphExecutorRegistryFactory.js +96 -11
- package/lib/esm/nest/graph/GraphExecutorRegistryFactory.js.map +1 -0
- package/lib/esm/nest/graph/index.js +1 -1
- package/lib/esm/nest/graph/index.js.map +1 -0
- package/lib/esm/nest/graph/main.js +27 -0
- package/lib/esm/nest/graph/main.js.map +1 -0
- package/lib/esm/nest/index.js +1 -1
- package/lib/esm/nest/index.js.map +1 -0
- package/lib/esm/nest/keycloakAuthHandler.js +1 -1
- package/lib/esm/nest/keycloakAuthHandler.js.map +1 -0
- package/lib/esm/nest/keycloakModule.js +1 -1
- package/lib/esm/nest/keycloakModule.js.map +1 -0
- package/lib/esm/nest/logging.js +1 -1
- package/lib/esm/nest/logging.js.map +1 -0
- package/lib/esm/nest/types.js +1 -1
- package/lib/esm/nest/types.js.map +1 -0
- package/lib/esm/nest/utils.js +1 -1
- package/lib/esm/nest/utils.js.map +1 -0
- package/lib/esm/secrets/aws/AwsSecretService.js +1 -1
- package/lib/esm/secrets/aws/AwsSecretService.js.map +1 -0
- package/lib/esm/secrets/aws/AwsSecretServiceConfig.js +1 -1
- package/lib/esm/secrets/aws/AwsSecretServiceConfig.js.map +1 -0
- package/lib/esm/secrets/aws/index.js +1 -1
- package/lib/esm/secrets/aws/index.js.map +1 -0
- package/lib/esm/secrets/azure/AzureKeyVaultSecretService.js +1 -1
- package/lib/esm/secrets/azure/AzureKeyVaultSecretService.js.map +1 -0
- package/lib/esm/secrets/azure/AzureKeyVaultSecretServiceConfig.js +1 -1
- package/lib/esm/secrets/azure/AzureKeyVaultSecretServiceConfig.js.map +1 -0
- package/lib/esm/secrets/azure/index.js +1 -1
- package/lib/esm/secrets/azure/index.js.map +1 -0
- package/lib/esm/secrets/core/SecretErrors.js +1 -1
- package/lib/esm/secrets/core/SecretErrors.js.map +1 -0
- package/lib/esm/secrets/core/SecretName.js +1 -1
- package/lib/esm/secrets/core/SecretName.js.map +1 -0
- package/lib/esm/secrets/core/SecretReference.js +1 -1
- package/lib/esm/secrets/core/SecretReference.js.map +1 -0
- package/lib/esm/secrets/core/SecretSerialization.js +1 -1
- package/lib/esm/secrets/core/SecretSerialization.js.map +1 -0
- package/lib/esm/secrets/core/SecretService.js +1 -1
- package/lib/esm/secrets/core/SecretService.js.map +1 -0
- package/lib/esm/secrets/core/SecretTypes.js +1 -1
- package/lib/esm/secrets/core/SecretTypes.js.map +1 -0
- package/lib/esm/secrets/core/index.js +1 -1
- package/lib/esm/secrets/core/index.js.map +1 -0
- package/lib/esm/secrets/gcp/GcpSecretManagerService.js +1 -1
- package/lib/esm/secrets/gcp/GcpSecretManagerService.js.map +1 -0
- package/lib/esm/secrets/gcp/GcpSecretManagerServiceConfig.js +1 -1
- package/lib/esm/secrets/gcp/GcpSecretManagerServiceConfig.js.map +1 -0
- package/lib/esm/secrets/gcp/index.js +1 -1
- package/lib/esm/secrets/gcp/index.js.map +1 -0
- package/lib/esm/secrets/index.js +1 -1
- package/lib/esm/secrets/index.js.map +1 -0
- package/lib/esm/secrets/model/ModelSecretCrypto.js +1 -1
- package/lib/esm/secrets/model/ModelSecretCrypto.js.map +1 -0
- package/lib/esm/secrets/model/ModelSecretService.js +1 -1
- package/lib/esm/secrets/model/ModelSecretService.js.map +1 -0
- package/lib/esm/secrets/model/ModelSecretServiceConfig.js +1 -1
- package/lib/esm/secrets/model/ModelSecretServiceConfig.js.map +1 -0
- package/lib/esm/secrets/model/Secret.js +1 -1
- package/lib/esm/secrets/model/Secret.js.map +1 -0
- package/lib/esm/secrets/model/index.js +1 -1
- package/lib/esm/secrets/model/index.js.map +1 -0
- package/lib/esm/secrets/onepassword/OnePasswordSecretService.js +1 -1
- package/lib/esm/secrets/onepassword/OnePasswordSecretService.js.map +1 -0
- package/lib/esm/secrets/onepassword/OnePasswordSecretServiceConfig.js +1 -1
- package/lib/esm/secrets/onepassword/OnePasswordSecretServiceConfig.js.map +1 -0
- package/lib/esm/secrets/onepassword/index.js +1 -1
- package/lib/esm/secrets/onepassword/index.js.map +1 -0
- package/lib/esm/secrets/vault/VaultSecretService.js +1 -1
- package/lib/esm/secrets/vault/VaultSecretService.js.map +1 -0
- package/lib/esm/secrets/vault/VaultSecretServiceConfig.js +1 -1
- package/lib/esm/secrets/vault/VaultSecretServiceConfig.js.map +1 -0
- package/lib/esm/secrets/vault/index.js +1 -1
- package/lib/esm/secrets/vault/index.js.map +1 -0
- package/lib/esm/shared/runtime.js +1 -1
- package/lib/esm/shared/runtime.js.map +1 -0
- package/lib/esm/utils.js +1 -1
- package/lib/esm/utils.js.map +1 -0
- package/lib/types/graph/engine/constants.d.cts +59 -0
- package/lib/types/graph/engine/constants.d.mts +59 -0
- package/lib/types/graph/{execution → engine/execution}/GraphExecutionResult.d.cts +1 -1
- package/lib/types/graph/{execution → engine/execution}/GraphExecutionResult.d.mts +1 -1
- package/lib/types/graph/engine/index.d.cts +61 -0
- package/lib/types/graph/engine/index.d.mts +61 -0
- package/lib/types/graph/{loops → engine/loops}/ConditionExpressionEvaluator.d.cts +1 -1
- package/lib/types/graph/{loops → engine/loops}/ConditionExpressionEvaluator.d.mts +1 -1
- package/lib/types/graph/{loops → engine/loops}/GraphConditionEvaluator.d.cts +2 -1
- package/lib/types/graph/{loops → engine/loops}/GraphConditionEvaluator.d.mts +2 -1
- package/lib/types/graph/{types.d.cts → engine/types.d.cts} +12 -148
- package/lib/types/graph/{types.d.mts → engine/types.d.mts} +12 -148
- package/lib/types/graph/index.d.cts +8 -53
- package/lib/types/graph/index.d.mts +8 -53
- package/lib/types/graph/shared/constants.d.cts +53 -0
- package/lib/types/graph/shared/constants.d.mts +53 -0
- package/lib/types/graph/shared/index.d.cts +18 -0
- package/lib/types/graph/shared/index.d.mts +18 -0
- package/lib/types/graph/shared/types.d.cts +162 -0
- package/lib/types/graph/shared/types.d.mts +162 -0
- package/lib/types/index.d.cts +2 -2
- package/lib/types/index.d.mts +2 -2
- package/lib/types/nest/graph/GraphExecutorRegistryFactory.d.cts +33 -5
- package/lib/types/nest/graph/GraphExecutorRegistryFactory.d.mts +33 -5
- package/lib/types/nest/graph/main.d.cts +1 -0
- package/lib/types/nest/graph/main.d.mts +1 -0
- package/package.json +19 -8
- package/lib/cjs/graph/constants.cjs +0 -94
- package/lib/cjs/graph/decorators.cjs +0 -4
- package/lib/cjs/graph/errors/GraphCycleError.cjs +0 -20
- package/lib/cjs/graph/errors/GraphExecutionError.cjs +0 -27
- package/lib/cjs/graph/errors/GraphInputError.cjs +0 -20
- package/lib/cjs/graph/errors/GraphLoopLimitError.cjs +0 -20
- package/lib/cjs/graph/errors/GraphPinningError.cjs +0 -20
- package/lib/cjs/graph/errors/GraphPortError.cjs +0 -20
- package/lib/cjs/graph/errors/GraphStoreError.cjs +0 -20
- package/lib/cjs/graph/errors/GraphTopologyError.cjs +0 -20
- package/lib/cjs/graph/errors/index.cjs +0 -31
- package/lib/cjs/graph/events/GraphExecutionEvent.cjs +0 -4
- package/lib/cjs/graph/events/GraphExecutionEventEmitter.cjs +0 -40
- package/lib/cjs/graph/events/GraphExecutionEventFactory.cjs +0 -37
- package/lib/cjs/graph/events/GraphExecutionObserver.cjs +0 -4
- package/lib/cjs/graph/events/index.cjs +0 -27
- package/lib/cjs/graph/execution/CodeSandboxEvaluator.cjs +0 -4
- package/lib/cjs/graph/execution/GraphExecutionContext.cjs +0 -79
- package/lib/cjs/graph/execution/GraphExecutionEngine.cjs +0 -407
- package/lib/cjs/graph/execution/GraphExecutionFrame.cjs +0 -32
- package/lib/cjs/graph/execution/GraphExecutionResult.cjs +0 -30
- package/lib/cjs/graph/execution/GraphNodeExecutor.cjs +0 -4
- package/lib/cjs/graph/execution/SwitchGraphNodeExecutor.cjs +0 -103
- package/lib/cjs/graph/execution/index.cjs +0 -30
- package/lib/cjs/graph/loops/ConditionExpressionEvaluator.cjs +0 -87
- package/lib/cjs/graph/loops/ForeachGraphNodeExecutor.cjs +0 -84
- package/lib/cjs/graph/loops/GraphConditionEvaluator.cjs +0 -85
- package/lib/cjs/graph/loops/GraphLoopExecutionContext.cjs +0 -16
- package/lib/cjs/graph/loops/UntilGraphNodeExecutor.cjs +0 -76
- package/lib/cjs/graph/loops/WhileGraphNodeExecutor.cjs +0 -77
- package/lib/cjs/graph/loops/index.cjs +0 -29
- package/lib/cjs/graph/nodes/agent.cjs +0 -110
- package/lib/cjs/graph/nodes/base.cjs +0 -35
- package/lib/cjs/graph/nodes/category-styles.cjs +0 -38
- package/lib/cjs/graph/nodes/flow-control.cjs +0 -464
- package/lib/cjs/graph/nodes/index.cjs +0 -35
- package/lib/cjs/graph/nodes/triggers.cjs +0 -250
- package/lib/cjs/graph/pinning/GraphPinningDependencyResolver.cjs +0 -28
- package/lib/cjs/graph/pinning/GraphPinningMetadata.cjs +0 -20
- package/lib/cjs/graph/pinning/GraphPinningPolicy.cjs +0 -34
- package/lib/cjs/graph/pinning/GraphPinningService.cjs +0 -191
- package/lib/cjs/graph/pinning/index.cjs +0 -27
- package/lib/cjs/graph/planning/GraphExecutionPlan.cjs +0 -4
- package/lib/cjs/graph/planning/GraphExecutionPlanEdge.cjs +0 -4
- package/lib/cjs/graph/planning/GraphExecutionPlanLayer.cjs +0 -4
- package/lib/cjs/graph/planning/GraphExecutionPlanNode.cjs +0 -4
- package/lib/cjs/graph/planning/GraphExecutionPlanner.cjs +0 -197
- package/lib/cjs/graph/planning/GraphRelationResolver.cjs +0 -172
- package/lib/cjs/graph/planning/GraphTopology.cjs +0 -57
- package/lib/cjs/graph/planning/index.cjs +0 -30
- package/lib/cjs/graph/registry/GraphNodeExecutorRegistry.cjs +0 -44
- package/lib/cjs/graph/registry/GraphNodeExecutorResolver.cjs +0 -27
- package/lib/cjs/graph/registry/index.cjs +0 -25
- package/lib/cjs/graph/snapshots/GraphExecutionSnapshotMapper.cjs +0 -53
- package/lib/cjs/graph/snapshots/index.cjs +0 -24
- package/lib/cjs/graph/store/GraphCachedValue.cjs +0 -4
- package/lib/cjs/graph/store/GraphValueKey.cjs +0 -4
- package/lib/cjs/graph/store/GraphValueStore.cjs +0 -76
- package/lib/cjs/graph/store/GraphValueStoreAdapter.cjs +0 -4
- package/lib/cjs/graph/store/InMemoryGraphValueStoreAdapter.cjs +0 -69
- package/lib/cjs/graph/store/index.cjs +0 -28
- package/lib/cjs/graph/types.cjs +0 -4
- package/lib/cjs/graph/validation/GraphDefinitionValidator.cjs +0 -33
- package/lib/cjs/graph/validation/GraphPortSchemaResolver.cjs +0 -58
- package/lib/cjs/graph/validation/GraphValueValidator.cjs +0 -52
- package/lib/cjs/graph/validation/index.cjs +0 -26
- package/lib/esm/graph/constants.js +0 -106
- package/lib/esm/graph/decorators.js +0 -2
- package/lib/esm/graph/errors/GraphCycleError.js +0 -15
- package/lib/esm/graph/errors/GraphExecutionError.js +0 -22
- package/lib/esm/graph/errors/GraphInputError.js +0 -15
- package/lib/esm/graph/errors/GraphLoopLimitError.js +0 -15
- package/lib/esm/graph/errors/GraphPinningError.js +0 -15
- package/lib/esm/graph/errors/GraphPortError.js +0 -15
- package/lib/esm/graph/errors/GraphStoreError.js +0 -15
- package/lib/esm/graph/errors/GraphTopologyError.js +0 -15
- package/lib/esm/graph/errors/index.js +0 -14
- package/lib/esm/graph/events/GraphExecutionEvent.js +0 -2
- package/lib/esm/graph/events/GraphExecutionEventEmitter.js +0 -35
- package/lib/esm/graph/events/GraphExecutionEventFactory.js +0 -32
- package/lib/esm/graph/events/GraphExecutionObserver.js +0 -2
- package/lib/esm/graph/events/index.js +0 -10
- package/lib/esm/graph/execution/CodeSandboxEvaluator.js +0 -18
- package/lib/esm/graph/execution/GraphExecutionContext.js +0 -74
- package/lib/esm/graph/execution/GraphExecutionEngine.js +0 -402
- package/lib/esm/graph/execution/GraphExecutionFrame.js +0 -27
- package/lib/esm/graph/execution/GraphExecutionResult.js +0 -26
- package/lib/esm/graph/execution/GraphNodeExecutor.js +0 -2
- package/lib/esm/graph/execution/SwitchGraphNodeExecutor.js +0 -98
- package/lib/esm/graph/execution/index.js +0 -13
- package/lib/esm/graph/loops/ConditionExpressionEvaluator.js +0 -82
- package/lib/esm/graph/loops/ForeachGraphNodeExecutor.js +0 -79
- package/lib/esm/graph/loops/GraphConditionEvaluator.js +0 -80
- package/lib/esm/graph/loops/GraphLoopExecutionContext.js +0 -11
- package/lib/esm/graph/loops/UntilGraphNodeExecutor.js +0 -71
- package/lib/esm/graph/loops/WhileGraphNodeExecutor.js +0 -72
- package/lib/esm/graph/loops/index.js +0 -12
- package/lib/esm/graph/nodes/agent.js +0 -101
- package/lib/esm/graph/nodes/base.js +0 -30
- package/lib/esm/graph/nodes/category-styles.js +0 -34
- package/lib/esm/graph/nodes/flow-control.js +0 -455
- package/lib/esm/graph/nodes/index.js +0 -18
- package/lib/esm/graph/nodes/triggers.js +0 -241
- package/lib/esm/graph/pinning/GraphPinningDependencyResolver.js +0 -23
- package/lib/esm/graph/pinning/GraphPinningMetadata.js +0 -15
- package/lib/esm/graph/pinning/GraphPinningPolicy.js +0 -29
- package/lib/esm/graph/pinning/GraphPinningService.js +0 -186
- package/lib/esm/graph/pinning/index.js +0 -10
- package/lib/esm/graph/planning/GraphExecutionPlan.js +0 -2
- package/lib/esm/graph/planning/GraphExecutionPlanEdge.js +0 -7
- package/lib/esm/graph/planning/GraphExecutionPlanLayer.js +0 -2
- package/lib/esm/graph/planning/GraphExecutionPlanNode.js +0 -2
- package/lib/esm/graph/planning/GraphExecutionPlanner.js +0 -192
- package/lib/esm/graph/planning/GraphRelationResolver.js +0 -167
- package/lib/esm/graph/planning/GraphTopology.js +0 -52
- package/lib/esm/graph/planning/index.js +0 -13
- package/lib/esm/graph/registry/GraphNodeExecutorRegistry.js +0 -39
- package/lib/esm/graph/registry/GraphNodeExecutorResolver.js +0 -22
- package/lib/esm/graph/registry/index.js +0 -8
- package/lib/esm/graph/snapshots/GraphExecutionSnapshotMapper.js +0 -48
- package/lib/esm/graph/snapshots/index.js +0 -7
- package/lib/esm/graph/store/GraphCachedValue.js +0 -2
- package/lib/esm/graph/store/GraphValueKey.js +0 -7
- package/lib/esm/graph/store/GraphValueStore.js +0 -71
- package/lib/esm/graph/store/GraphValueStoreAdapter.js +0 -2
- package/lib/esm/graph/store/InMemoryGraphValueStoreAdapter.js +0 -64
- package/lib/esm/graph/store/index.js +0 -11
- package/lib/esm/graph/types.js +0 -2
- package/lib/esm/graph/validation/GraphDefinitionValidator.js +0 -28
- package/lib/esm/graph/validation/GraphPortSchemaResolver.js +0 -53
- package/lib/esm/graph/validation/GraphValueValidator.js +0 -47
- package/lib/esm/graph/validation/index.js +0 -9
- package/lib/types/graph/constants.d.cts +0 -101
- package/lib/types/graph/constants.d.mts +0 -101
- /package/lib/types/graph/{decorators.d.cts → engine/decorators.d.cts} +0 -0
- /package/lib/types/graph/{decorators.d.mts → engine/decorators.d.mts} +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphCycleError.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphCycleError.d.mts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphExecutionError.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphExecutionError.d.mts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphInputError.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphInputError.d.mts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphLoopLimitError.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphLoopLimitError.d.mts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphPinningError.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphPinningError.d.mts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphPortError.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphPortError.d.mts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphStoreError.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphStoreError.d.mts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphTopologyError.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphTopologyError.d.mts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/index.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/index.d.mts +0 -0
- /package/lib/types/graph/{events → engine/events}/GraphExecutionEvent.d.cts +0 -0
- /package/lib/types/graph/{events → engine/events}/GraphExecutionEvent.d.mts +0 -0
- /package/lib/types/graph/{events → engine/events}/GraphExecutionEventEmitter.d.cts +0 -0
- /package/lib/types/graph/{events → engine/events}/GraphExecutionEventEmitter.d.mts +0 -0
- /package/lib/types/graph/{events → engine/events}/GraphExecutionEventFactory.d.cts +0 -0
- /package/lib/types/graph/{events → engine/events}/GraphExecutionEventFactory.d.mts +0 -0
- /package/lib/types/graph/{events → engine/events}/GraphExecutionObserver.d.cts +0 -0
- /package/lib/types/graph/{events → engine/events}/GraphExecutionObserver.d.mts +0 -0
- /package/lib/types/graph/{events → engine/events}/index.d.cts +0 -0
- /package/lib/types/graph/{events → engine/events}/index.d.mts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/CodeSandboxEvaluator.d.cts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/CodeSandboxEvaluator.d.mts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/GraphExecutionContext.d.cts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/GraphExecutionContext.d.mts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/GraphExecutionEngine.d.cts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/GraphExecutionEngine.d.mts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/GraphExecutionFrame.d.cts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/GraphExecutionFrame.d.mts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/GraphNodeExecutor.d.cts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/GraphNodeExecutor.d.mts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/SwitchGraphNodeExecutor.d.cts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/SwitchGraphNodeExecutor.d.mts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/index.d.cts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/index.d.mts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/ForeachGraphNodeExecutor.d.cts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/ForeachGraphNodeExecutor.d.mts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/GraphLoopExecutionContext.d.cts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/GraphLoopExecutionContext.d.mts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/UntilGraphNodeExecutor.d.cts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/UntilGraphNodeExecutor.d.mts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/WhileGraphNodeExecutor.d.cts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/WhileGraphNodeExecutor.d.mts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/index.d.cts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/index.d.mts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningDependencyResolver.d.cts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningDependencyResolver.d.mts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningMetadata.d.cts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningMetadata.d.mts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningPolicy.d.cts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningPolicy.d.mts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningService.d.cts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningService.d.mts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/index.d.cts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/index.d.mts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlan.d.cts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlan.d.mts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanEdge.d.cts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanEdge.d.mts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanLayer.d.cts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanLayer.d.mts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanNode.d.cts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanNode.d.mts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanner.d.cts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanner.d.mts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphRelationResolver.d.cts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphRelationResolver.d.mts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphTopology.d.cts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphTopology.d.mts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/index.d.cts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/index.d.mts +0 -0
- /package/lib/types/graph/{registry → engine/registry}/GraphNodeExecutorRegistry.d.cts +0 -0
- /package/lib/types/graph/{registry → engine/registry}/GraphNodeExecutorRegistry.d.mts +0 -0
- /package/lib/types/graph/{registry → engine/registry}/GraphNodeExecutorResolver.d.cts +0 -0
- /package/lib/types/graph/{registry → engine/registry}/GraphNodeExecutorResolver.d.mts +0 -0
- /package/lib/types/graph/{registry → engine/registry}/index.d.cts +0 -0
- /package/lib/types/graph/{registry → engine/registry}/index.d.mts +0 -0
- /package/lib/types/graph/{snapshots → engine/snapshots}/GraphExecutionSnapshotMapper.d.cts +0 -0
- /package/lib/types/graph/{snapshots → engine/snapshots}/GraphExecutionSnapshotMapper.d.mts +0 -0
- /package/lib/types/graph/{snapshots → engine/snapshots}/index.d.cts +0 -0
- /package/lib/types/graph/{snapshots → engine/snapshots}/index.d.mts +0 -0
- /package/lib/types/graph/{store → engine/store}/GraphCachedValue.d.cts +0 -0
- /package/lib/types/graph/{store → engine/store}/GraphCachedValue.d.mts +0 -0
- /package/lib/types/graph/{store → engine/store}/GraphValueKey.d.cts +0 -0
- /package/lib/types/graph/{store → engine/store}/GraphValueKey.d.mts +0 -0
- /package/lib/types/graph/{store → engine/store}/GraphValueStore.d.cts +0 -0
- /package/lib/types/graph/{store → engine/store}/GraphValueStore.d.mts +0 -0
- /package/lib/types/graph/{store → engine/store}/GraphValueStoreAdapter.d.cts +0 -0
- /package/lib/types/graph/{store → engine/store}/GraphValueStoreAdapter.d.mts +0 -0
- /package/lib/types/graph/{store → engine/store}/InMemoryGraphValueStoreAdapter.d.cts +0 -0
- /package/lib/types/graph/{store → engine/store}/InMemoryGraphValueStoreAdapter.d.mts +0 -0
- /package/lib/types/graph/{store → engine/store}/index.d.cts +0 -0
- /package/lib/types/graph/{store → engine/store}/index.d.mts +0 -0
- /package/lib/types/graph/{validation → engine/validation}/GraphDefinitionValidator.d.cts +0 -0
- /package/lib/types/graph/{validation → engine/validation}/GraphDefinitionValidator.d.mts +0 -0
- /package/lib/types/graph/{validation → engine/validation}/GraphPortSchemaResolver.d.cts +0 -0
- /package/lib/types/graph/{validation → engine/validation}/GraphPortSchemaResolver.d.mts +0 -0
- /package/lib/types/graph/{validation → engine/validation}/GraphValueValidator.d.cts +0 -0
- /package/lib/types/graph/{validation → engine/validation}/GraphValueValidator.d.mts +0 -0
- /package/lib/types/graph/{validation → engine/validation}/index.d.cts +0 -0
- /package/lib/types/graph/{validation → engine/validation}/index.d.mts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/agent.d.cts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/agent.d.mts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/base.d.cts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/base.d.mts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/category-styles.d.cts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/category-styles.d.mts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/flow-control.d.cts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/flow-control.d.mts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/index.d.cts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/index.d.mts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/triggers.d.cts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/triggers.d.mts +0 -0
|
@@ -1,197 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.GraphExecutionPlanner = void 0;
|
|
4
|
-
const graph_1 = require("@decaf-ts/ui-decorators/graph");
|
|
5
|
-
const constants_js_1 = require("./../constants.cjs");
|
|
6
|
-
const GraphCycleError_js_1 = require("./../errors/GraphCycleError.cjs");
|
|
7
|
-
const GraphTopologyError_js_1 = require("./../errors/GraphTopologyError.cjs");
|
|
8
|
-
const GraphRelationResolver_js_1 = require("./GraphRelationResolver.cjs");
|
|
9
|
-
/**
|
|
10
|
-
* Planner that turns a {@link GraphWorkflowDefinition} into a
|
|
11
|
-
* {@link GraphExecutionPlan} with topological layers.
|
|
12
|
-
*/
|
|
13
|
-
class GraphExecutionPlanner {
|
|
14
|
-
constructor(resolver) {
|
|
15
|
-
this.resolver = resolver ?? new GraphRelationResolver_js_1.GraphRelationResolver();
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Plans a workflow for execution.
|
|
19
|
-
*
|
|
20
|
-
* @param workflow - The workflow definition to plan.
|
|
21
|
-
* @returns The execution plan with nodes, edges, layers, and maps.
|
|
22
|
-
* @throws {GraphTopologyError} when node IDs are not unique.
|
|
23
|
-
* @throws {GraphCycleError} when the workflow contains an unsupported cycle.
|
|
24
|
-
*/
|
|
25
|
-
plan(workflow) {
|
|
26
|
-
this.validateUniqueNodeIds(workflow);
|
|
27
|
-
const nodes = this.resolveNodes(workflow);
|
|
28
|
-
const edges = this.resolver.resolve(workflow);
|
|
29
|
-
const incomingByNode = this.buildIncomingMap(edges);
|
|
30
|
-
const outgoingByNode = this.buildOutgoingMap(edges);
|
|
31
|
-
const layers = this.topologicalLayers(nodes, edges);
|
|
32
|
-
return {
|
|
33
|
-
workflow,
|
|
34
|
-
workflowId: workflow.name,
|
|
35
|
-
nodes,
|
|
36
|
-
edges,
|
|
37
|
-
layers,
|
|
38
|
-
incomingByNode,
|
|
39
|
-
outgoingByNode,
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Validates that all workflow node IDs are unique.
|
|
44
|
-
*/
|
|
45
|
-
validateUniqueNodeIds(workflow) {
|
|
46
|
-
const seen = new Set();
|
|
47
|
-
for (const node of workflow.nodes ?? []) {
|
|
48
|
-
if (seen.has(node.id)) {
|
|
49
|
-
throw new GraphTopologyError_js_1.GraphTopologyError(`Duplicate node id '${node.id}' in workflow '${workflow.name}'`, { nodeId: node.id, workflowId: workflow.name });
|
|
50
|
-
}
|
|
51
|
-
seen.add(node.id);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Resolves workflow node metadata into plan nodes with full definitions.
|
|
56
|
-
*/
|
|
57
|
-
resolveNodes(workflow) {
|
|
58
|
-
const result = [];
|
|
59
|
-
for (const nodeMeta of workflow.nodes ?? []) {
|
|
60
|
-
const definition = this.resolveDefinition(nodeMeta);
|
|
61
|
-
const inputPorts = (definition.ports ?? [])
|
|
62
|
-
.filter((p) => p.direction === "input")
|
|
63
|
-
.map((p) => p.name);
|
|
64
|
-
const outputPorts = (definition.ports ?? [])
|
|
65
|
-
.filter((p) => p.direction === "output")
|
|
66
|
-
.map((p) => p.name);
|
|
67
|
-
result.push({
|
|
68
|
-
id: nodeMeta.id,
|
|
69
|
-
kind: nodeMeta.kind ?? definition.kind ?? nodeMeta.id,
|
|
70
|
-
label: nodeMeta.label,
|
|
71
|
-
source: nodeMeta,
|
|
72
|
-
definition,
|
|
73
|
-
inputPorts,
|
|
74
|
-
outputPorts,
|
|
75
|
-
metadata: nodeMeta.metadata,
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
return result;
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Attempts to resolve the full graph node definition from metadata.
|
|
82
|
-
*
|
|
83
|
-
* Accepts either a decorated Model class/instance (resolved via
|
|
84
|
-
* `graphDefinitionOf`) or a plain `GraphNodeDefinition`-shaped object
|
|
85
|
-
* (useful for serialized workflows that inline node definitions).
|
|
86
|
-
*/
|
|
87
|
-
resolveDefinition(nodeMeta) {
|
|
88
|
-
if (nodeMeta.node) {
|
|
89
|
-
if (this.isRawDefinition(nodeMeta.node)) {
|
|
90
|
-
return nodeMeta.node;
|
|
91
|
-
}
|
|
92
|
-
try {
|
|
93
|
-
return (0, graph_1.graphDefinitionOf)(nodeMeta.node);
|
|
94
|
-
}
|
|
95
|
-
catch {
|
|
96
|
-
// fall through to stub
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
// Return a minimal stub definition so planning can proceed
|
|
100
|
-
return {
|
|
101
|
-
name: nodeMeta.id,
|
|
102
|
-
tag: nodeMeta.id,
|
|
103
|
-
kind: nodeMeta.kind ?? nodeMeta.id,
|
|
104
|
-
labels: [],
|
|
105
|
-
ports: [],
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Returns `true` when a value looks like a raw {@link GraphNodeDefinition}
|
|
110
|
-
* (a plain object with a `ports` array and a `name` string).
|
|
111
|
-
*/
|
|
112
|
-
isRawDefinition(value) {
|
|
113
|
-
return (typeof value === "object" &&
|
|
114
|
-
value !== null &&
|
|
115
|
-
!Array.isArray(value) &&
|
|
116
|
-
typeof value.name === "string" &&
|
|
117
|
-
Array.isArray(value.ports));
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* Builds a map of node id -> incoming edges.
|
|
121
|
-
*/
|
|
122
|
-
buildIncomingMap(edges) {
|
|
123
|
-
const map = new Map();
|
|
124
|
-
for (const edge of edges) {
|
|
125
|
-
const list = map.get(edge.targetNodeId) ?? [];
|
|
126
|
-
list.push(edge);
|
|
127
|
-
map.set(edge.targetNodeId, list);
|
|
128
|
-
}
|
|
129
|
-
return map;
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* Builds a map of node id -> outgoing edges.
|
|
133
|
-
*/
|
|
134
|
-
buildOutgoingMap(edges) {
|
|
135
|
-
const map = new Map();
|
|
136
|
-
for (const edge of edges) {
|
|
137
|
-
const list = map.get(edge.sourceNodeId) ?? [];
|
|
138
|
-
list.push(edge);
|
|
139
|
-
map.set(edge.sourceNodeId, list);
|
|
140
|
-
}
|
|
141
|
-
return map;
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* Produces topological layers using Kahn's algorithm.
|
|
145
|
-
*
|
|
146
|
-
* Workflow boundary edges do not count as executable-node dependencies.
|
|
147
|
-
*/
|
|
148
|
-
topologicalLayers(nodes, edges) {
|
|
149
|
-
const executableNodes = nodes.filter((n) => n.id !== constants_js_1.GRAPH_WORKFLOW_BOUNDARY);
|
|
150
|
-
const nodeIds = new Set(executableNodes.map((n) => n.id));
|
|
151
|
-
// Only edges between two executable nodes count as dependencies
|
|
152
|
-
const execEdges = edges.filter((e) => nodeIds.has(e.sourceNodeId) && nodeIds.has(e.targetNodeId));
|
|
153
|
-
// Compute in-degree
|
|
154
|
-
const indegree = new Map();
|
|
155
|
-
for (const node of executableNodes)
|
|
156
|
-
indegree.set(node.id, 0);
|
|
157
|
-
for (const edge of execEdges) {
|
|
158
|
-
indegree.set(edge.targetNodeId, (indegree.get(edge.targetNodeId) ?? 0) + 1);
|
|
159
|
-
}
|
|
160
|
-
const layers = [];
|
|
161
|
-
const planned = new Set();
|
|
162
|
-
let ready = executableNodes.filter((n) => (indegree.get(n.id) ?? 0) === 0);
|
|
163
|
-
let layerIndex = 0;
|
|
164
|
-
while (ready.length > 0) {
|
|
165
|
-
const layer = { index: layerIndex++, nodes: ready };
|
|
166
|
-
layers.push(layer);
|
|
167
|
-
const nextReady = [];
|
|
168
|
-
for (const node of ready) {
|
|
169
|
-
planned.add(node.id);
|
|
170
|
-
const outgoing = execEdges.filter((e) => e.sourceNodeId === node.id);
|
|
171
|
-
for (const edge of outgoing) {
|
|
172
|
-
const deg = (indegree.get(edge.targetNodeId) ?? 1) - 1;
|
|
173
|
-
indegree.set(edge.targetNodeId, deg);
|
|
174
|
-
if (deg === 0 && !planned.has(edge.targetNodeId)) {
|
|
175
|
-
const next = executableNodes.find((n) => n.id === edge.targetNodeId);
|
|
176
|
-
if (next)
|
|
177
|
-
nextReady.push(next);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
ready = nextReady;
|
|
182
|
-
}
|
|
183
|
-
if (planned.size !== executableNodes.length) {
|
|
184
|
-
const unplanned = executableNodes
|
|
185
|
-
.filter((n) => !planned.has(n.id))
|
|
186
|
-
.map((n) => n.id);
|
|
187
|
-
throw new GraphCycleError_js_1.GraphCycleError({
|
|
188
|
-
unplannedNodes: unplanned,
|
|
189
|
-
workflowId: nodes[0]?.definition?.name,
|
|
190
|
-
});
|
|
191
|
-
}
|
|
192
|
-
return layers;
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
exports.GraphExecutionPlanner = GraphExecutionPlanner;
|
|
196
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGhFeGVjdXRpb25QbGFubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2dyYXBoL3BsYW5uaW5nL0dyYXBoRXhlY3V0aW9uUGxhbm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFTQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVsRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsMEJBQXFCO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsdUNBQWtDO0FBQzVELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSwwQ0FBcUM7QUFLbEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLG1DQUFnQztBQUVoRTs7O0dBR0c7QUFDSCxNQUFNLE9BQU8scUJBQXFCO0lBR2hDLFlBQVksUUFBZ0M7UUFDMUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLElBQUksSUFBSSxxQkFBcUIsRUFBRSxDQUFDO0lBQzFELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsSUFBSSxDQUFDLFFBQWlDO1FBQ3BDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVyQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTlDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFcEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVwRCxPQUFPO1lBQ0wsUUFBUTtZQUNSLFVBQVUsRUFBRSxRQUFRLENBQUMsSUFBSTtZQUN6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TSxJQUFJLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7d0JBQ3JFLElBQUksSUFBSTs0QkFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNqQyxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBQ0QsS0FBSyxHQUFHLFNBQVMsQ0FBQztRQUNwQixDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM1QyxNQUFNLFNBQVMsR0FBRyxlQUFlO2lCQUM5QixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7aUJBQ2pDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxlQUFlLENBQUM7Z0JBQ3hCLGNBQWMsRUFBRSxTQUFTO2dCQUN6QixVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJO2FBQ3ZDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtb2R1bGUgaW50ZWdyYXRpb25zL2dyYXBoL3BsYW5uaW5nL0dyYXBoRXhlY3V0aW9uUGxhbm5lclxuICogQHN1bW1hcnkgVG9wb2xvZ2ljYWwgcGxhbm5lciBmb3IgZ3JhcGggd29ya2Zsb3dzLlxuICogQGRlc2NyaXB0aW9uIFJlc29sdmVzIHdvcmtmbG93IG5vZGVzIGFuZCByZWxhdGlvbnMsIHZhbGlkYXRlcyB0b3BvbG9neSwgZGV0ZWN0cyBjeWNsZXMsIGFuZCBwcm9kdWNlcyB0b3BvbG9naWNhbCBleGVjdXRpb24gbGF5ZXJzIHVzaW5nIEthaG4ncyBhbGdvcml0aG0uXG4gKi9cbmltcG9ydCB0eXBlIHtcbiAgR3JhcGhOb2RlRGVmaW5pdGlvbixcbiAgR3JhcGhXb3JrZmxvd0RlZmluaXRpb24sXG59IGZyb20gXCJAZGVjYWYtdHMvdWktZGVjb3JhdG9ycy9ncmFwaFwiO1xuaW1wb3J0IHsgZ3JhcGhEZWZpbml0aW9uT2YgfSBmcm9tIFwiQGRlY2FmLXRzL3VpLWRlY29yYXRvcnMvZ3JhcGhcIjtcblxuaW1wb3J0IHsgR1JBUEhfV09SS0ZMT1dfQk9VTkRBUlkgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBHcmFwaEN5Y2xlRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzL0dyYXBoQ3ljbGVFcnJvclwiO1xuaW1wb3J0IHsgR3JhcGhUb3BvbG9neUVycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy9HcmFwaFRvcG9sb2d5RXJyb3JcIjtcbmltcG9ydCB0eXBlIHsgR3JhcGhFeGVjdXRpb25QbGFuIH0gZnJvbSBcIi4vR3JhcGhFeGVjdXRpb25QbGFuXCI7XG5pbXBvcnQgdHlwZSB7IEdyYXBoRXhlY3V0aW9uUGxhbk5vZGUgfSBmcm9tIFwiLi9HcmFwaEV4ZWN1dGlvblBsYW5Ob2RlXCI7XG5pbXBvcnQgdHlwZSB7IEdyYXBoRXhlY3V0aW9uUGxhbkVkZ2UgfSBmcm9tIFwiLi9HcmFwaEV4ZWN1dGlvblBsYW5FZGdlXCI7XG5pbXBvcnQgdHlwZSB7IEdyYXBoRXhlY3V0aW9uUGxhbkxheWVyIH0gZnJvbSBcIi4vR3JhcGhFeGVjdXRpb25QbGFuTGF5ZXJcIjtcbmltcG9ydCB7IEdyYXBoUmVsYXRpb25SZXNvbHZlciB9IGZyb20gXCIuL0dyYXBoUmVsYXRpb25SZXNvbHZlclwiO1xuXG4vKipcbiAqIFBsYW5uZXIgdGhhdCB0dXJucyBhIHtAbGluayBHcmFwaFdvcmtmbG93RGVmaW5pdGlvbn0gaW50byBhXG4gKiB7QGxpbmsgR3JhcGhFeGVjdXRpb25QbGFufSB3aXRoIHRvcG9sb2dpY2FsIGxheWVycy5cbiAqL1xuZXhwb3J0IGNsYXNzIEdyYXBoRXhlY3V0aW9uUGxhbm5lciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZXI6IEdyYXBoUmVsYXRpb25SZXNvbHZlcjtcblxuICBjb25zdHJ1Y3RvcihyZXNvbHZlcj86IEdyYXBoUmVsYXRpb25SZXNvbHZlcikge1xuICAgIHRoaXMucmVzb2x2ZXIgPSByZXNvbHZlciA/PyBuZXcgR3JhcGhSZWxhdGlvblJlc29sdmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogUGxhbnMgYSB3b3JrZmxvdyBmb3IgZXhlY3V0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gd29ya2Zsb3cgLSBUaGUgd29ya2Zsb3cgZGVmaW5pdGlvbiB0byBwbGFuLlxuICAgKiBAcmV0dXJucyBUaGUgZXhlY3V0aW9uIHBsYW4gd2l0aCBub2RlcywgZWRnZXMsIGxheWVycywgYW5kIG1hcHMuXG4gICAqIEB0aHJvd3Mge0dyYXBoVG9wb2xvZ3lFcnJvcn0gd2hlbiBub2RlIElEcyBhcmUgbm90IHVuaXF1ZS5cbiAgICogQHRocm93cyB7R3JhcGhDeWNsZUVycm9yfSB3aGVuIHRoZSB3b3JrZmxvdyBjb250YWlucyBhbiB1bnN1cHBvcnRlZCBjeWNsZS5cbiAgICovXG4gIHBsYW4od29ya2Zsb3c6IEdyYXBoV29ya2Zsb3dEZWZpbml0aW9uKTogR3JhcGhFeGVjdXRpb25QbGFuIHtcbiAgICB0aGlzLnZhbGlkYXRlVW5pcXVlTm9kZUlkcyh3b3JrZmxvdyk7XG5cbiAgICBjb25zdCBub2RlcyA9IHRoaXMucmVzb2x2ZU5vZGVzKHdvcmtmbG93KTtcbiAgICBjb25zdCBlZGdlcyA9IHRoaXMucmVzb2x2ZXIucmVzb2x2ZSh3b3JrZmxvdyk7XG5cbiAgICBjb25zdCBpbmNvbWluZ0J5Tm9kZSA9IHRoaXMuYnVpbGRJbmNvbWluZ01hcChlZGdlcyk7XG4gICAgY29uc3Qgb3V0Z29pbmdCeU5vZGUgPSB0aGlzLmJ1aWxkT3V0Z29pbmdNYXAoZWRnZXMpO1xuXG4gICAgY29uc3QgbGF5ZXJzID0gdGhpcy50b3BvbG9naWNhbExheWVycyhub2RlcywgZWRnZXMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHdvcmtmbG93LFxuICAgICAgd29ya2Zsb3dJZDogd29ya2Zsb3cubmFtZSxcbiAgICAgIG5vZGVzLFxuICAgICAgZWRnZXMsXG4gICAgICBsYXllcnMsXG4gICAgICBpbmNvbWluZ0J5Tm9kZSxcbiAgICAgIG91dGdvaW5nQnlOb2RlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoYXQgYWxsIHdvcmtmbG93IG5vZGUgSURzIGFyZSB1bmlxdWUuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlVW5pcXVlTm9kZUlkcyh3b3JrZmxvdzogR3JhcGhXb3JrZmxvd0RlZmluaXRpb24pOiB2b2lkIHtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBub2RlIG9mIHdvcmtmbG93Lm5vZGVzID8/IFtdKSB7XG4gICAgICBpZiAoc2Vlbi5oYXMobm9kZS5pZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEdyYXBoVG9wb2xvZ3lFcnJvcihcbiAgICAgICAgICBgRHVwbGljYXRlIG5vZGUgaWQgJyR7bm9kZS5pZH0nIGluIHdvcmtmbG93ICcke3dvcmtmbG93Lm5hbWV9J2AsXG4gICAgICAgICAgeyBub2RlSWQ6IG5vZGUuaWQsIHdvcmtmbG93SWQ6IHdvcmtmbG93Lm5hbWUgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgc2Vlbi5hZGQobm9kZS5pZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHdvcmtmbG93IG5vZGUgbWV0YWRhdGEgaW50byBwbGFuIG5vZGVzIHdpdGggZnVsbCBkZWZpbml0aW9ucy5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZU5vZGVzKFxuICAgIHdvcmtmbG93OiBHcmFwaFdvcmtmbG93RGVmaW5pdGlvblxuICApOiBHcmFwaEV4ZWN1dGlvblBsYW5Ob2RlW10ge1xuICAgIGNvbnN0IHJlc3VsdDogR3JhcGhFeGVjdXRpb25QbGFuTm9kZVtdID0gW107XG4gICAgZm9yIChjb25zdCBub2RlTWV0YSBvZiB3b3JrZmxvdy5ub2RlcyA/PyBbXSkge1xuICAgICAgY29uc3QgZGVmaW5pdGlvbiA9IHRoaXMucmVzb2x2ZURlZmluaXRpb24obm9kZU1ldGEpO1xuICAgICAgY29uc3QgaW5wdXRQb3J0cyA9IChkZWZpbml0aW9uLnBvcnRzID8/IFtdKVxuICAgICAgICAuZmlsdGVyKChwKSA9PiBwLmRpcmVjdGlvbiA9PT0gXCJpbnB1dFwiKVxuICAgICAgICAubWFwKChwKSA9PiBwLm5hbWUpO1xuICAgICAgY29uc3Qgb3V0cHV0UG9ydHMgPSAoZGVmaW5pdGlvbi5wb3J0cyA/PyBbXSlcbiAgICAgICAgLmZpbHRlcigocCkgPT4gcC5kaXJlY3Rpb24gPT09IFwib3V0cHV0XCIpXG4gICAgICAgIC5tYXAoKHApID0+IHAubmFtZSk7XG4gICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgIGlkOiBub2RlTWV0YS5pZCxcbiAgICAgICAga2luZDogbm9kZU1ldGEua2luZCA/PyBkZWZpbml0aW9uLmtpbmQgPz8gbm9kZU1ldGEuaWQsXG4gICAgICAgIGxhYmVsOiBub2RlTWV0YS5sYWJlbCxcbiAgICAgICAgc291cmNlOiBub2RlTWV0YSxcbiAgICAgICAgZGVmaW5pdGlvbixcbiAgICAgICAgaW5wdXRQb3J0cyxcbiAgICAgICAgb3V0cHV0UG9ydHMsXG4gICAgICAgIG1ldGFkYXRhOiBub2RlTWV0YS5tZXRhZGF0YSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHRzIHRvIHJlc29sdmUgdGhlIGZ1bGwgZ3JhcGggbm9kZSBkZWZpbml0aW9uIGZyb20gbWV0YWRhdGEuXG4gICAqXG4gICAqIEFjY2VwdHMgZWl0aGVyIGEgZGVjb3JhdGVkIE1vZGVsIGNsYXNzL2luc3RhbmNlIChyZXNvbHZlZCB2aWFcbiAgICogYGdyYXBoRGVmaW5pdGlvbk9mYCkgb3IgYSBwbGFpbiBgR3JhcGhOb2RlRGVmaW5pdGlvbmAtc2hhcGVkIG9iamVjdFxuICAgKiAodXNlZnVsIGZvciBzZXJpYWxpemVkIHdvcmtmbG93cyB0aGF0IGlubGluZSBub2RlIGRlZmluaXRpb25zKS5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZURlZmluaXRpb24obm9kZU1ldGE6IHtcbiAgICBub2RlPzogdW5rbm93bjtcbiAgICBraW5kPzogc3RyaW5nO1xuICAgIGlkOiBzdHJpbmc7XG4gIH0pOiBHcmFwaE5vZGVEZWZpbml0aW9uIHtcbiAgICBpZiAobm9kZU1ldGEubm9kZSkge1xuICAgICAgaWYgKHRoaXMuaXNSYXdEZWZpbml0aW9uKG5vZGVNZXRhLm5vZGUpKSB7XG4gICAgICAgIHJldHVybiBub2RlTWV0YS5ub2RlIGFzIEdyYXBoTm9kZURlZmluaXRpb247XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZ3JhcGhEZWZpbml0aW9uT2Yobm9kZU1ldGEubm9kZSBhcyBhbnkpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGZhbGwgdGhyb3VnaCB0byBzdHViXG4gICAgICB9XG4gICAgfVxuICAgIC8vIFJldHVybiBhIG1pbmltYWwgc3R1YiBkZWZpbml0aW9uIHNvIHBsYW5uaW5nIGNhbiBwcm9jZWVkXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IG5vZGVNZXRhLmlkLFxuICAgICAgdGFnOiBub2RlTWV0YS5pZCxcbiAgICAgIGtpbmQ6IG5vZGVNZXRhLmtpbmQgPz8gbm9kZU1ldGEuaWQsXG4gICAgICBsYWJlbHM6IFtdLFxuICAgICAgcG9ydHM6IFtdLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAgd2hlbiBhIHZhbHVlIGxvb2tzIGxpa2UgYSByYXcge0BsaW5rIEdyYXBoTm9kZURlZmluaXRpb259XG4gICAqIChhIHBsYWluIG9iamVjdCB3aXRoIGEgYHBvcnRzYCBhcnJheSBhbmQgYSBgbmFtZWAgc3RyaW5nKS5cbiAgICovXG4gIHByaXZhdGUgaXNSYXdEZWZpbml0aW9uKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICAgICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJlxuICAgICAgdHlwZW9mICh2YWx1ZSBhcyB7IG5hbWU/OiB1bmtub3duIH0pLm5hbWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkoKHZhbHVlIGFzIHsgcG9ydHM/OiB1bmtub3duIH0pLnBvcnRzKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgbWFwIG9mIG5vZGUgaWQgLT4gaW5jb21pbmcgZWRnZXMuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkSW5jb21pbmdNYXAoXG4gICAgZWRnZXM6IEdyYXBoRXhlY3V0aW9uUGxhbkVkZ2VbXVxuICApOiBNYXA8c3RyaW5nLCBHcmFwaEV4ZWN1dGlvblBsYW5FZGdlW10+IHtcbiAgICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgR3JhcGhFeGVjdXRpb25QbGFuRWRnZVtdPigpO1xuICAgIGZvciAoY29uc3QgZWRnZSBvZiBlZGdlcykge1xuICAgICAgY29uc3QgbGlzdCA9IG1hcC5nZXQoZWRnZS50YXJnZXROb2RlSWQpID8/IFtdO1xuICAgICAgbGlzdC5wdXNoKGVkZ2UpO1xuICAgICAgbWFwLnNldChlZGdlLnRhcmdldE5vZGVJZCwgbGlzdCk7XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgbWFwIG9mIG5vZGUgaWQgLT4gb3V0Z29pbmcgZWRnZXMuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkT3V0Z29pbmdNYXAoXG4gICAgZWRnZXM6IEdyYXBoRXhlY3V0aW9uUGxhbkVkZ2VbXVxuICApOiBNYXA8c3RyaW5nLCBHcmFwaEV4ZWN1dGlvblBsYW5FZGdlW10+IHtcbiAgICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgR3JhcGhFeGVjdXRpb25QbGFuRWRnZVtdPigpO1xuICAgIGZvciAoY29uc3QgZWRnZSBvZiBlZGdlcykge1xuICAgICAgY29uc3QgbGlzdCA9IG1hcC5nZXQoZWRnZS5zb3VyY2VOb2RlSWQpID8/IFtdO1xuICAgICAgbGlzdC5wdXNoKGVkZ2UpO1xuICAgICAgbWFwLnNldChlZGdlLnNvdXJjZU5vZGVJZCwgbGlzdCk7XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICAvKipcbiAgICogUHJvZHVjZXMgdG9wb2xvZ2ljYWwgbGF5ZXJzIHVzaW5nIEthaG4ncyBhbGdvcml0aG0uXG4gICAqXG4gICAqIFdvcmtmbG93IGJvdW5kYXJ5IGVkZ2VzIGRvIG5vdCBjb3VudCBhcyBleGVjdXRhYmxlLW5vZGUgZGVwZW5kZW5jaWVzLlxuICAgKi9cbiAgcHJpdmF0ZSB0b3BvbG9naWNhbExheWVycyhcbiAgICBub2RlczogR3JhcGhFeGVjdXRpb25QbGFuTm9kZVtdLFxuICAgIGVkZ2VzOiBHcmFwaEV4ZWN1dGlvblBsYW5FZGdlW11cbiAgKTogR3JhcGhFeGVjdXRpb25QbGFuTGF5ZXJbXSB7XG4gICAgY29uc3QgZXhlY3V0YWJsZU5vZGVzID0gbm9kZXMuZmlsdGVyKFxuICAgICAgKG4pID0+IG4uaWQgIT09IEdSQVBIX1dPUktGTE9XX0JPVU5EQVJZXG4gICAgKTtcbiAgICBjb25zdCBub2RlSWRzID0gbmV3IFNldChleGVjdXRhYmxlTm9kZXMubWFwKChuKSA9PiBuLmlkKSk7XG5cbiAgICAvLyBPbmx5IGVkZ2VzIGJldHdlZW4gdHdvIGV4ZWN1dGFibGUgbm9kZXMgY291bnQgYXMgZGVwZW5kZW5jaWVzXG4gICAgY29uc3QgZXhlY0VkZ2VzID0gZWRnZXMuZmlsdGVyKFxuICAgICAgKGUpID0+IG5vZGVJZHMuaGFzKGUuc291cmNlTm9kZUlkKSAmJiBub2RlSWRzLmhhcyhlLnRhcmdldE5vZGVJZClcbiAgICApO1xuXG4gICAgLy8gQ29tcHV0ZSBpbi1kZWdyZWVcbiAgICBjb25zdCBpbmRlZ3JlZSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgZm9yIChjb25zdCBub2RlIG9mIGV4ZWN1dGFibGVOb2RlcykgaW5kZWdyZWUuc2V0KG5vZGUuaWQsIDApO1xuICAgIGZvciAoY29uc3QgZWRnZSBvZiBleGVjRWRnZXMpIHtcbiAgICAgIGluZGVncmVlLnNldChlZGdlLnRhcmdldE5vZGVJZCwgKGluZGVncmVlLmdldChlZGdlLnRhcmdldE5vZGVJZCkgPz8gMCkgKyAxKTtcbiAgICB9XG5cbiAgICBjb25zdCBsYXllcnM6IEdyYXBoRXhlY3V0aW9uUGxhbkxheWVyW10gPSBbXTtcbiAgICBjb25zdCBwbGFubmVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgbGV0IHJlYWR5ID0gZXhlY3V0YWJsZU5vZGVzLmZpbHRlcigobikgPT4gKGluZGVncmVlLmdldChuLmlkKSA/PyAwKSA9PT0gMCk7XG4gICAgbGV0IGxheWVySW5kZXggPSAwO1xuXG4gICAgd2hpbGUgKHJlYWR5Lmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGxheWVyOiBHcmFwaEV4ZWN1dGlvblBsYW5MYXllciA9IHsgaW5kZXg6IGxheWVySW5kZXgrKywgbm9kZXM6IHJlYWR5IH07XG4gICAgICBsYXllcnMucHVzaChsYXllcik7XG4gICAgICBjb25zdCBuZXh0UmVhZHk6IEdyYXBoRXhlY3V0aW9uUGxhbk5vZGVbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBub2RlIG9mIHJlYWR5KSB7XG4gICAgICAgIHBsYW5uZWQuYWRkKG5vZGUuaWQpO1xuICAgICAgICBjb25zdCBvdXRnb2luZyA9IGV4ZWNFZGdlcy5maWx0ZXIoKGUpID0+IGUuc291cmNlTm9kZUlkID09PSBub2RlLmlkKTtcbiAgICAgICAgZm9yIChjb25zdCBlZGdlIG9mIG91dGdvaW5nKSB7XG4gICAgICAgICAgY29uc3QgZGVnID0gKGluZGVncmVlLmdldChlZGdlLnRhcmdldE5vZGVJZCkgPz8gMSkgLSAxO1xuICAgICAgICAgIGluZGVncmVlLnNldChlZGdlLnRhcmdldE5vZGVJZCwgZGVnKTtcbiAgICAgICAgICBpZiAoZGVnID09PSAwICYmICFwbGFubmVkLmhhcyhlZGdlLnRhcmdldE5vZGVJZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBleGVjdXRhYmxlTm9kZXMuZmluZCgobikgPT4gbi5pZCA9PT0gZWRnZS50YXJnZXROb2RlSWQpO1xuICAgICAgICAgICAgaWYgKG5leHQpIG5leHRSZWFkeS5wdXNoKG5leHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVhZHkgPSBuZXh0UmVhZHk7XG4gICAgfVxuXG4gICAgaWYgKHBsYW5uZWQuc2l6ZSAhPT0gZXhlY3V0YWJsZU5vZGVzLmxlbmd0aCkge1xuICAgICAgY29uc3QgdW5wbGFubmVkID0gZXhlY3V0YWJsZU5vZGVzXG4gICAgICAgIC5maWx0ZXIoKG4pID0+ICFwbGFubmVkLmhhcyhuLmlkKSlcbiAgICAgICAgLm1hcCgobikgPT4gbi5pZCk7XG4gICAgICB0aHJvdyBuZXcgR3JhcGhDeWNsZUVycm9yKHtcbiAgICAgICAgdW5wbGFubmVkTm9kZXM6IHVucGxhbm5lZCxcbiAgICAgICAgd29ya2Zsb3dJZDogbm9kZXNbMF0/LmRlZmluaXRpb24/Lm5hbWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGF5ZXJzO1xuICB9XG59XG4iXX0=
|
|
197
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGhFeGVjdXRpb25QbGFubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiR3JhcGhFeGVjdXRpb25QbGFubmVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlEQUFrRTtBQUNsRSxvREFBNEQ7QUFDNUQsdUVBQWlFO0FBQ2pFLDZFQUF1RTtBQUN2RSx5RUFBbUU7QUFDbkU7OztHQUdHO0FBQ0gsTUFBYSxxQkFBcUI7SUFDOUIsWUFBWSxRQUFRO1FBQ2hCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxJQUFJLElBQUksZ0RBQXFCLEVBQUUsQ0FBQztJQUM1RCxDQUFDO0lBQ0Q7Ozs7Ozs7T0FPRztJQUNILElBQUksQ0FBQyxRQUFRO1FBQ1QsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3BELE9BQU87WUFDSCxRQUFRO1lBQ1IsVUFBVSxFQUFFLFFBQVEsQ0FBQyxJQUFJO1lBQ3pCLEtBQUs7WUFDTCxLQUFLO1lBQ0wsTUFBTTtZQUNOLGNBQWM7WUFDZCxjQUFjO1NBQ2pCLENBQUM7SUFDTixDQUFDO0lBQ0Q7O09BRUc7SUFDSCxxQkFBcUIsQ0FBQyxRQUFRO1FBQzFCLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDdkIsS0FBSyxN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Z0JBQ0wsQ0FBQztZQUNMLENBQUM7WUFDRCxLQUFLLEdBQUcsU0FBUyxDQUFDO1FBQ3RCLENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzFDLE1BQU0sU0FBUyxHQUFHLGVBQWU7aUJBQzVCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDakMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdEIsTUFBTSxJQUFJLG9DQUFlLENBQUM7Z0JBQ3RCLGNBQWMsRUFBRSxTQUFTO2dCQUN6QixVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJO2FBQ3pDLENBQUMsQ0FBQztRQUNQLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0NBQ0o7QUFyTEQsc0RBcUxDO0FBQ0QsMGhsQkFBMGhsQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdyYXBoRGVmaW5pdGlvbk9mIH0gZnJvbSBcIkBkZWNhZi10cy91aS1kZWNvcmF0b3JzL2dyYXBoXCI7XG5pbXBvcnQgeyBHUkFQSF9XT1JLRkxPV19CT1VOREFSWSB9IGZyb20gXCIuLy4uL2NvbnN0YW50cy5qc1wiO1xuaW1wb3J0IHsgR3JhcGhDeWNsZUVycm9yIH0gZnJvbSBcIi4vLi4vZXJyb3JzL0dyYXBoQ3ljbGVFcnJvci5qc1wiO1xuaW1wb3J0IHsgR3JhcGhUb3BvbG9neUVycm9yIH0gZnJvbSBcIi4vLi4vZXJyb3JzL0dyYXBoVG9wb2xvZ3lFcnJvci5qc1wiO1xuaW1wb3J0IHsgR3JhcGhSZWxhdGlvblJlc29sdmVyIH0gZnJvbSBcIi4vR3JhcGhSZWxhdGlvblJlc29sdmVyLmpzXCI7XG4vKipcbiAqIFBsYW5uZXIgdGhhdCB0dXJucyBhIHtAbGluayBHcmFwaFdvcmtmbG93RGVmaW5pdGlvbn0gaW50byBhXG4gKiB7QGxpbmsgR3JhcGhFeGVjdXRpb25QbGFufSB3aXRoIHRvcG9sb2dpY2FsIGxheWVycy5cbiAqL1xuZXhwb3J0IGNsYXNzIEdyYXBoRXhlY3V0aW9uUGxhbm5lciB7XG4gICAgY29uc3RydWN0b3IocmVzb2x2ZXIpIHtcbiAgICAgICAgdGhpcy5yZXNvbHZlciA9IHJlc29sdmVyID8/IG5ldyBHcmFwaFJlbGF0aW9uUmVzb2x2ZXIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGxhbnMgYSB3b3JrZmxvdyBmb3IgZXhlY3V0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHdvcmtmbG93IC0gVGhlIHdvcmtmbG93IGRlZmluaXRpb24gdG8gcGxhbi5cbiAgICAgKiBAcmV0dXJucyBUaGUgZXhlY3V0aW9uIHBsYW4gd2l0aCBub2RlcywgZWRnZXMsIGxheWVycywgYW5kIG1hcHMuXG4gICAgICogQHRocm93cyB7R3JhcGhUb3BvbG9neUVycm9yfSB3aGVuIG5vZGUgSURzIGFyZSBub3QgdW5pcXVlLlxuICAgICAqIEB0aHJvd3Mge0dyYXBoQ3ljbGVFcnJvcn0gd2hlbiB0aGUgd29ya2Zsb3cgY29udGFpbnMgYW4gdW5zdXBwb3J0ZWQgY3ljbGUuXG4gICAgICovXG4gICAgcGxhbih3b3JrZmxvdykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVW5pcXVlTm9kZUlkcyh3b3JrZmxvdyk7XG4gICAgICAgIGNvbnN0IG5vZGVzID0gdGhpcy5yZXNvbHZlTm9kZXMod29ya2Zsb3cpO1xuICAgICAgICBjb25zdCBlZGdlcyA9IHRoaXMucmVzb2x2ZXIucmVzb2x2ZSh3b3JrZmxvdyk7XG4gICAgICAgIGNvbnN0IGluY29taW5nQnlOb2RlID0gdGhpcy5idWlsZEluY29taW5nTWFwKGVkZ2VzKTtcbiAgICAgICAgY29uc3Qgb3V0Z29pbmdCeU5vZGUgPSB0aGlzLmJ1aWxkT3V0Z29pbmdNYXAoZWRnZXMpO1xuICAgICAgICBjb25zdCBsYXllcnMgPSB0aGlzLnRvcG9sb2dpY2FsTGF5ZXJzKG5vZGVzLCBlZGdlcyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3b3JrZmxvdyxcbiAgICAgICAgICAgIHdvcmtmbG93SWQ6IHdvcmtmbG93Lm5hbWUsXG4gICAgICAgICAgICBub2RlcyxcbiAgICAgICAgICAgIGVkZ2VzLFxuICAgICAgICAgICAgbGF5ZXJzLFxuICAgICAgICAgICAgaW5jb21pbmdCeU5vZGUsXG4gICAgICAgICAgICBvdXRnb2luZ0J5Tm9kZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVmFsaWRhdGVzIHRoYXQgYWxsIHdvcmtmbG93IG5vZGUgSURzIGFyZSB1bmlxdWUuXG4gICAgICovXG4gICAgdmFsaWRhdGVVbmlxdWVOb2RlSWRzKHdvcmtmbG93KSB7XG4gICAgICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0KCk7XG4gICAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiB3b3JrZmxvdy5ub2RlcyA/PyBbXSkge1xuICAgICAgICAgICAgaWYgKHNlZW4uaGFzKG5vZGUuaWQpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyYXBoVG9wb2xvZ3lFcnJvcihgRHVwbGljYXRlIG5vZGUgaWQgJyR7bm9kZS5pZH0nIGluIHdvcmtmbG93ICcke3dvcmtmbG93Lm5hbWV9J2AsIHsgbm9kZUlkOiBub2RlLmlkLCB3b3JrZmxvd0lkOiB3b3JrZmxvdy5uYW1lIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2Vlbi5hZGQobm9kZS5pZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzb2x2ZXMgd29ya2Zsb3cgbm9kZSBtZXRhZGF0YSBpbnRvIHBsYW4gbm9kZXMgd2l0aCBmdWxsIGRlZmluaXRpb25zLlxuICAgICAqL1xuICAgIHJlc29sdmVOb2Rlcyh3b3JrZmxvdykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBub2RlTWV0YSBvZiB3b3JrZmxvdy5ub2RlcyA/PyBbXSkge1xuICAgICAgICAgICAgY29uc3QgZGVmaW5pdGlvbiA9IHRoaXMucmVzb2x2ZURlZmluaXRpb24obm9kZU1ldGEpO1xuICAgICAgICAgICAgY29uc3QgaW5wdXRQb3J0cyA9IChkZWZpbml0aW9uLnBvcnRzID8/IFtdKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKHApID0+IHAuZGlyZWN0aW9uID09PSBcImlucHV0XCIpXG4gICAgICAgICAgICAgICAgLm1hcCgocCkgPT4gcC5uYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dFBvcnRzID0gKGRlZmluaXRpb24ucG9ydHMgPz8gW10pXG4gICAgICAgICAgICAgICAgLmZpbHRlcigocCkgPT4gcC5kaXJlY3Rpb24gPT09IFwib3V0cHV0XCIpXG4gICAgICAgICAgICAgICAgLm1hcCgocCkgPT4gcC5uYW1lKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgICAgICBpZDogbm9kZU1ldGEuaWQsXG4gICAgICAgICAgICAgICAga2luZDogbm9kZU1ldGEua2luZCA/PyBkZWZpbml0aW9uLmtpbmQgPz8gbm9kZU1ldGEuaWQsXG4gICAgICAgICAgICAgICAgbGFiZWw6IG5vZGVNZXRhLmxhYmVsLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogbm9kZU1ldGEsXG4gICAgICAgICAgICAgICAgZGVmaW5pdGlvbixcbiAgICAgICAgICAgICAgICBpbnB1dFBvcnRzLFxuICAgICAgICAgICAgICAgIG91dHB1dFBvcnRzLFxuICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBub2RlTWV0YS5tZXRhZGF0YSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEF0dGVtcHRzIHRvIHJlc29sdmUgdGhlIGZ1bGwgZ3JhcGggbm9kZSBkZWZpbml0aW9uIGZyb20gbWV0YWRhdGEuXG4gICAgICpcbiAgICAgKiBBY2NlcHRzIGVpdGhlciBhIGRlY29yYXRlZCBNb2RlbCBjbGFzcy9pbnN0YW5jZSAocmVzb2x2ZWQgdmlhXG4gICAgICogYGdyYXBoRGVmaW5pdGlvbk9mYCkgb3IgYSBwbGFpbiBgR3JhcGhOb2RlRGVmaW5pdGlvbmAtc2hhcGVkIG9iamVjdFxuICAgICAqICh1c2VmdWwgZm9yIHNlcmlhbGl6ZWQgd29ya2Zsb3dzIHRoYXQgaW5saW5lIG5vZGUgZGVmaW5pdGlvbnMpLlxuICAgICAqL1xuICAgIHJlc29sdmVEZWZpbml0aW9uKG5vZGVNZXRhKSB7XG4gICAgICAgIGlmIChub2RlTWV0YS5ub2RlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1Jhd0RlZmluaXRpb24obm9kZU1ldGEubm9kZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZU1ldGEubm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdyYXBoRGVmaW5pdGlvbk9mKG5vZGVNZXRhLm5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCB0byBzdHViXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmV0dXJuIGEgbWluaW1hbCBzdHViIGRlZmluaXRpb24gc28gcGxhbm5pbmcgY2FuIHByb2NlZWRcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IG5vZGVNZXRhLmlkLFxuICAgICAgICAgICAgdGFnOiBub2RlTWV0YS5pZCxcbiAgICAgICAgICAgIGtpbmQ6IG5vZGVNZXRhLmtpbmQgPz8gbm9kZU1ldGEuaWQsXG4gICAgICAgICAgICBsYWJlbHM6IFtdLFxuICAgICAgICAgICAgcG9ydHM6IFtdLFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCB3aGVuIGEgdmFsdWUgbG9va3MgbGlrZSBhIHJhdyB7QGxpbmsgR3JhcGhOb2RlRGVmaW5pdGlvbn1cbiAgICAgKiAoYSBwbGFpbiBvYmplY3Qgd2l0aCBhIGBwb3J0c2AgYXJyYXkgYW5kIGEgYG5hbWVgIHN0cmluZykuXG4gICAgICovXG4gICAgaXNSYXdEZWZpbml0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUubmFtZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZS5wb3J0cykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBCdWlsZHMgYSBtYXAgb2Ygbm9kZSBpZCAtPiBpbmNvbWluZyBlZGdlcy5cbiAgICAgKi9cbiAgICBidWlsZEluY29taW5nTWFwKGVkZ2VzKSB7XG4gICAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgZm9yIChjb25zdCBlZGdlIG9mIGVkZ2VzKSB7XG4gICAgICAgICAgICBjb25zdCBsaXN0ID0gbWFwLmdldChlZGdlLnRhcmdldE5vZGVJZCkgPz8gW107XG4gICAgICAgICAgICBsaXN0LnB1c2goZWRnZSk7XG4gICAgICAgICAgICBtYXAuc2V0KGVkZ2UudGFyZ2V0Tm9kZUlkLCBsaXN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBCdWlsZHMgYSBtYXAgb2Ygbm9kZSBpZCAtPiBvdXRnb2luZyBlZGdlcy5cbiAgICAgKi9cbiAgICBidWlsZE91dGdvaW5nTWFwKGVkZ2VzKSB7XG4gICAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgZm9yIChjb25zdCBlZGdlIG9mIGVkZ2VzKSB7XG4gICAgICAgICAgICBjb25zdCBsaXN0ID0gbWFwLmdldChlZGdlLnNvdXJjZU5vZGVJZCkgPz8gW107XG4gICAgICAgICAgICBsaXN0LnB1c2goZWRnZSk7XG4gICAgICAgICAgICBtYXAuc2V0KGVkZ2Uuc291cmNlTm9kZUlkLCBsaXN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9kdWNlcyB0b3BvbG9naWNhbCBsYXllcnMgdXNpbmcgS2FobidzIGFsZ29yaXRobS5cbiAgICAgKlxuICAgICAqIFdvcmtmbG93IGJvdW5kYXJ5IGVkZ2VzIGRvIG5vdCBjb3VudCBhcyBleGVjdXRhYmxlLW5vZGUgZGVwZW5kZW5jaWVzLlxuICAgICAqL1xuICAgIHRvcG9sb2dpY2FsTGF5ZXJzKG5vZGVzLCBlZGdlcykge1xuICAgICAgICBjb25zdCBleGVjdXRhYmxlTm9kZXMgPSBub2Rlcy5maWx0ZXIoKG4pID0+IG4uaWQgIT09IEdSQVBIX1dPUktGTE9XX0JPVU5EQVJZKTtcbiAgICAgICAgY29uc3Qgbm9kZUlkcyA9IG5ldyBTZXQoZXhlY3V0YWJsZU5vZGVzLm1hcCgobikgPT4gbi5pZCkpO1xuICAgICAgICAvLyBPbmx5IGVkZ2VzIGJldHdlZW4gdHdvIGV4ZWN1dGFibGUgbm9kZXMgY291bnQgYXMgZGVwZW5kZW5jaWVzXG4gICAgICAgIGNvbnN0IGV4ZWNFZGdlcyA9IGVkZ2VzLmZpbHRlcigoZSkgPT4gbm9kZUlkcy5oYXMoZS5zb3VyY2VOb2RlSWQpICYmIG5vZGVJZHMuaGFzKGUudGFyZ2V0Tm9kZUlkKSk7XG4gICAgICAgIC8vIENvbXB1dGUgaW4tZGVncmVlXG4gICAgICAgIGNvbnN0IGluZGVncmVlID0gbmV3IE1hcCgpO1xuICAgICAgICBmb3IgKGNvbnN0IG5vZGUgb2YgZXhlY3V0YWJsZU5vZGVzKVxuICAgICAgICAgICAgaW5kZWdyZWUuc2V0KG5vZGUuaWQsIDApO1xuICAgICAgICBmb3IgKGNvbnN0IGVkZ2Ugb2YgZXhlY0VkZ2VzKSB7XG4gICAgICAgICAgICBpbmRlZ3JlZS5zZXQoZWRnZS50YXJnZXROb2RlSWQsIChpbmRlZ3JlZS5nZXQoZWRnZS50YXJnZXROb2RlSWQpID8/IDApICsgMSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGF5ZXJzID0gW107XG4gICAgICAgIGNvbnN0IHBsYW5uZWQgPSBuZXcgU2V0KCk7XG4gICAgICAgIGxldCByZWFkeSA9IGV4ZWN1dGFibGVOb2Rlcy5maWx0ZXIoKG4pID0+IChpbmRlZ3JlZS5nZXQobi5pZCkgPz8gMCkgPT09IDApO1xuICAgICAgICBsZXQgbGF5ZXJJbmRleCA9IDA7XG4gICAgICAgIHdoaWxlIChyZWFkeS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBsYXllciA9IHsgaW5kZXg6IGxheWVySW5kZXgrKywgbm9kZXM6IHJlYWR5IH07XG4gICAgICAgICAgICBsYXllcnMucHVzaChsYXllcik7XG4gICAgICAgICAgICBjb25zdCBuZXh0UmVhZHkgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiByZWFkeSkge1xuICAgICAgICAgICAgICAgIHBsYW5uZWQuYWRkKG5vZGUuaWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG91dGdvaW5nID0gZXhlY0VkZ2VzLmZpbHRlcigoZSkgPT4gZS5zb3VyY2VOb2RlSWQgPT09IG5vZGUuaWQpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZWRnZSBvZiBvdXRnb2luZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWcgPSAoaW5kZWdyZWUuZ2V0KGVkZ2UudGFyZ2V0Tm9kZUlkKSA/PyAxKSAtIDE7XG4gICAgICAgICAgICAgICAgICAgIGluZGVncmVlLnNldChlZGdlLnRhcmdldE5vZGVJZCwgZGVnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlZyA9PT0gMCAmJiAhcGxhbm5lZC5oYXMoZWRnZS50YXJnZXROb2RlSWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gZXhlY3V0YWJsZU5vZGVzLmZpbmQoKG4pID0+IG4uaWQgPT09IGVkZ2UudGFyZ2V0Tm9kZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRSZWFkeS5wdXNoKG5leHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVhZHkgPSBuZXh0UmVhZHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBsYW5uZWQuc2l6ZSAhPT0gZXhlY3V0YWJsZU5vZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgdW5wbGFubmVkID0gZXhlY3V0YWJsZU5vZGVzXG4gICAgICAgICAgICAgICAgLmZpbHRlcigobikgPT4gIXBsYW5uZWQuaGFzKG4uaWQpKVxuICAgICAgICAgICAgICAgIC5tYXAoKG4pID0+IG4uaWQpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEdyYXBoQ3ljbGVFcnJvcih7XG4gICAgICAgICAgICAgICAgdW5wbGFubmVkTm9kZXM6IHVucGxhbm5lZCxcbiAgICAgICAgICAgICAgICB3b3JrZmxvd0lkOiBub2Rlc1swXT8uZGVmaW5pdGlvbj8ubmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYXllcnM7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pUjNKaGNHaEZlR1ZqZFhScGIyNVFiR0Z1Ym1WeUxtcHpJaXdpYzI5MWNtTmxVbTl2ZENJNklpSXNJbk52ZFhKalpYTWlPbHNpTGk0dkxpNHZMaTR2TGk0dmMzSmpMMmR5WVhCb0wzQnNZVzV1YVc1bkwwZHlZWEJvUlhobFkzVjBhVzl1VUd4aGJtNWxjaTUwY3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pUVVGVFFTeFBRVUZQTEVWQlFVVXNhVUpCUVdsQ0xFVkJRVVVzVFVGQlRTd3JRa0ZCSzBJc1EwRkJRenRCUVVWc1JTeFBRVUZQTEVWQlFVVXNkVUpCUVhWQ0xFVkJRVVVzTUVKQlFYRkNPMEZCUTNaRUxFOUJRVThzUlVGQlJTeGxRVUZsTEVWQlFVVXNkVU5CUVd0RE8wRkJRelZFTEU5QlFVOHNSVUZCUlN4clFrRkJhMElzUlVGQlJTd3dRMEZCY1VNN1FVRkxiRVVzVDBGQlR5eEZRVUZGTEhGQ1FVRnhRaXhGUVVGRkxHMURRVUZuUXp0QlFVVm9SVHM3TzBkQlIwYzdRVUZEU0N4TlFVRk5MRTlCUVU4c2NVSkJRWEZDTzBsQlIyaERMRmxCUVZrc1VVRkJaME03VVVGRE1VTXNTVUZCU1N4RFFVRkRMRkZCUVZFc1IwRkJSeXhSUVVGUkxFbEJRVWtzU1VGQlNTeHhRa0ZCY1VJc1JVRkJSU3hEUVVGRE8wbEJRekZFTEVOQlFVTTdTVUZGUkRzN096czdPenRQUVU5SE8wbEJRMGdzU1VGQlNTeERRVUZETEZGQlFXbERPMUZCUTNCRExFbEJRVWtzUTBGQlF5eHhRa0ZCY1VJc1EwRkJReXhSUVVGUkxFTkJRVU1zUTBGQlF6dFJRVVZ5UXl4TlFVRk5MRXRCUVVzc1IwRkJSeXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRkRPMUZCUXpGRExFMUJRVTBzUzBGQlN5eEhRVUZITEVsQlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1QwRkJUeXhEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZETzFGQlJUbERMRTFCUVUwc1kwRkJZeXhIUVVGSExFbEJRVWtzUTBGQlF5eG5Ra0ZCWjBJc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF6dFJRVU53UkN4TlFVRk5MR05CUVdNc1IwRkJSeXhKUVVGSkxFTkJRVU1zWjBKQlFXZENMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU03VVVGRmNFUXNUVUZCVFN4TlFVRk5MRWRCUVVjc1NVRkJTU3hEUVVGRExHbENRVUZwUWl4RFFVRkRMRXRCUVVzc1JVRkJSU3hMUVVGTExFTkJRVU1zUTBGQlF6dFJRVVZ3UkN4UFFVRlBPMWxCUTB3c1VVRkJVVHRaUVVOU0xGVkJRVlVzUlVGQlJTeFJRVUZSTEVOQlFVTXNTVUZCU1R0WlFVTjZRaXhMUVVGTE8xbEJRMHdzUzBGQlN6dFpRVU5NTEUxQlFVMDdXVUZEVGl4alFVRmpPMWxCUTJRc1kwRkJZenRUUVVObUxFTkJRVU03U1VGRFNpeERRVUZETzBsQlJVUTdPMDlCUlVjN1NVRkRTeXh4UWtGQmNVSXNRMEZCUXl4UlFVRnBRenRSUVVNM1JDeE5RVUZOTEVsQlFVa3NSMEZCUnl4SlFVRkpMRWRCUVVjc1JVRkJWU3hEUVVGRE8xRkJReTlDTEV0QlFVc3NUVUZCVFN4SlFVRkpMRWxCUVVrc1VVRkJVU3hEUVVGRExFdEJRVXNzU1VGQlNTeEZRVUZGTEVWQlFVVXNRMEZCUXp0WlFVTjRReXhKUVVGSkxFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNTVUZCU1N4RFFVRkRMRVZCUVVVc1EwRkJReXhGUVVGRkxFTkJRVU03WjBKQlEzUkNMRTFCUVUwc1NVRkJTU3hyUWtGQmEwSXNRMEZETVVJc2MwSkJRWE5DTEVsQlFVa3NRMEZCUXl4RlFVRkZMR3RDUVVGclFpeFJRVUZSTEVOQlFVTXNTVUZCU1N4SFFVRkhMRVZCUXk5RUxFVkJRVVVzVFVGQlRTeEZRVUZGTEVsQlFVa3NRMEZCUXl4RlFVRkZMRVZCUVVVc1ZVRkJWU3hGUVVGRkxGRkJRVkVzUTBGQlF5eEpRVUZKTEVWQlFVVXNRMEZETDBNc1EwRkJRenRaUVVOS0xFTkJRVU03V1VGRFJDeEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWxCUVVrc1EwRkJReXhGUVVGRkxFTkJRVU1zUTBGQlF6dFJRVU53UWl4RFFVRkRPMGxCUTBnc1EwRkJRenRKUVVWRU96dFBRVVZITzBsQlEwc3NXVUZCV1N4RFFVTnNRaXhSUVVGcFF6dFJRVVZxUXl4TlFVRk5MRTFCUVUwc1IwRkJOa0lzUlVGQlJTeERRVUZETzFGQlF6VkRMRXRCUVVzc1RVRkJUU3hSUVVGUkxFbEJRVWtzVVVGQlVTeERRVUZETEV0QlFVc3NTVUZCU1N4RlFVRkZMRVZCUVVVc1EwRkJRenRaUVVNMVF5eE5RVUZOTEZWQlFWVXNSMEZCUnl4SlFVRkpMRU5CUVVNc2FVSkJRV2xDTEVOQlFVTXNVVUZCVVN4RFFVRkRMRU5CUVVNN1dVRkRjRVFzVFVGQlRTeFZRVUZWTEVkQlFVY3NRMEZCUXl4VlFVRlZMRU5CUVVNc1MwRkJTeXhKUVVGSkxFVkJRVVVzUTBGQlF6dHBRa0ZEZUVNc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eEZRVUZGTEVWQlFVVXNRMEZCUXl4RFFVRkRMRU5CUVVNc1UwRkJVeXhMUVVGTExFOUJRVThzUTBGQlF6dHBRa0ZEZEVNc1IwRkJSeXhEUVVGRExFTkJRVU1zUTBGQlF5eEZRVUZGTEVWQlFVVXNRMEZCUXl4RFFVRkRMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU03V1VGRGRFSXNUVUZCVFN4WFFVRlhMRWRCUVVjc1EwRkJReXhWUVVGVkxFTkJRVU1zUzBGQlN5eEpRVUZKTEVWQlFVVXNRMEZCUXp0cFFrRkRla01zVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkZMRVZCUVVVc1EwRkJReXhEUVVGRExFTkJRVU1zVTBGQlV5eExRVUZMTEZGQlFWRXNRMEZCUXp0cFFrRkRka01zUjBGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkZMRVZCUVVVc1EwRkJReXhEUVVGRExFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTTdXVUZEZEVJc1RVRkJUU3hEUVVGRExFbEJRVWtzUTBGQlF6dG5Ra0ZEVml4RlFVRkZMRVZCUVVVc1VVRkJVU3hEUVVGRExFVkJRVVU3WjBKQlEyWXNTVUZCU1N4RlFVRkZMRkZCUVZFc1EwRkJReXhKUVVGSkxFbEJRVWtzVlVGQlZTeERRVUZETEVsQlFVa3NTVUZCU1N4UlFVRlJMRU5CUVVNc1JVRkJSVHRuUWtGRGNrUXNTMEZCU3l4RlFVRkZMRkZCUVZFc1EwRkJReXhMUVVGTE8yZENRVU55UWl4TlFVRk5MRVZCUVVVc1VVRkJVVHRuUWtGRGFFSXNWVUZCVlR0blFrRkRWaXhWUVVGVk8yZENRVU5XTEZkQlFWYzdaMEpCUTFnc1VVRkJVU3hGUVVGRkxGRkJRVkVzUTBGQlF5eFJRVUZSTzJGQlF6VkNMRU5CUVVNc1EwRkJRenRSUVVOTUxFTkJRVU03VVVGRFJDeFBRVUZQTEUxQlFVMHNRMEZCUXp0SlFVTm9RaXhEUVVGRE8wbEJSVVE3T3pzN096dFBRVTFITzBsQlEwc3NhVUpCUVdsQ0xFTkJRVU1zVVVGSmVrSTdVVUZEUXl4SlFVRkpMRkZCUVZFc1EwRkJReXhKUVVGSkxFVkJRVVVzUTBGQlF6dFpRVU5zUWl4SlFVRkpMRWxCUVVrc1EwRkJReXhsUVVGbExFTkJRVU1zVVVGQlVTeERRVUZETEVsQlFVa3NRMEZCUXl4RlFVRkZMRU5CUVVNN1owSkJRM2hETEU5QlFVOHNVVUZCVVN4RFFVRkRMRWxCUVRKQ0xFTkJRVU03V1VGRE9VTXNRMEZCUXp0WlFVTkVMRWxCUVVrc1EwRkJRenRuUWtGRFNDeFBRVUZQTEdsQ1FVRnBRaXhEUVVGRExGRkJRVkVzUTBGQlF5eEpRVUZYTEVOQlFVTXNRMEZCUXp0WlFVTnFSQ3hEUVVGRE8xbEJRVU1zVFVGQlRTeERRVUZETzJkQ1FVTlFMSFZDUVVGMVFqdFpRVU42UWl4RFFVRkRPMUZCUTBnc1EwRkJRenRSUVVORUxESkVRVUV5UkR0UlFVTXpSQ3hQUVVGUE8xbEJRMHdzU1VGQlNTeEZRVUZGTEZGQlFWRXNRMEZCUXl4RlFVRkZPMWxCUTJwQ0xFZEJRVWNzUlVGQlJTeFJRVUZSTEVOQlFVTXNSVUZCUlR0WlFVTm9RaXhKUVVGSkxFVkJRVVVzVVVGQlVTeERRVUZETEVsQlFVa3NTVUZCU1N4UlFVRlJMRU5CUVVNc1JVRkJSVHRaUVVOc1F5eE5RVUZOTEVWQlFVVXNSVUZCUlR0WlFVTldMRXRCUVVzc1JVRkJSU3hGUVVGRk8xTkJRMVlzUTBGQlF6dEpRVU5LTEVOQlFVTTdTVUZGUkRzN08wOUJSMGM3U1VGRFN5eGxRVUZsTEVOQlFVTXNTMEZCWXp0UlFVTndReXhQUVVGUExFTkJRMHdzVDBGQlR5eExRVUZMTEV0QlFVc3NVVUZCVVR0WlFVTjZRaXhMUVVGTExFdEJRVXNzU1VGQlNUdFpRVU5rTEVOQlFVTXNTMEZCU3l4RFFVRkRMRTlCUVU4c1EwRkJReXhMUVVGTExFTkJRVU03V1VGRGNrSXNUMEZCVVN4TFFVRTBRaXhEUVVGRExFbEJRVWtzUzBGQlN5eFJRVUZSTzFsQlEzUkVMRXRCUVVzc1EwRkJReXhQUVVGUExFTkJRVVVzUzBGQk5rSXNRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkRjRVFzUTBGQlF6dEpRVU5LTEVOQlFVTTdTVUZGUkRzN1QwRkZSenRKUVVOTExHZENRVUZuUWl4RFFVTjBRaXhMUVVFclFqdFJRVVV2UWl4TlFVRk5MRWRCUVVjc1IwRkJSeXhKUVVGSkxFZEJRVWNzUlVGQmIwTXNRMEZCUXp0UlFVTjRSQ3hMUVVGTExFMUJRVTBzU1VGQlNTeEpRVUZKTEV0QlFVc3NSVUZCUlN4RFFVRkRPMWxCUTNwQ0xFMUJRVTBzU1VGQlNTeEhRVUZITEVkQlFVY3NRMEZCUXl4SFFVRkhMRU5CUVVNc1NVRkJTU3hEUVVGRExGbEJRVmtzUTBGQlF5eEpRVUZKTEVWQlFVVXNRMEZCUXp0WlFVTTVReXhKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRPMWxCUTJoQ0xFZEJRVWNzUTBGQlF5eEhRVUZITEVOQlFVTXNTVUZCU1N4RFFVRkRMRmxCUVZrc1JVRkJSU3hKUVVGSkxFTkJRVU1zUTBGQlF6dFJRVU51UXl4RFFVRkRPMUZCUTBRc1QwRkJUeXhIUVVGSExFTkJRVU03U1VGRFlpeERRVUZETzBsQlJVUTdPMDlCUlVjN1NVRkRTeXhuUWtGQlowSXNRMEZEZEVJc1MwRkJLMEk3VVVGRkwwSXNUVUZCVFN4SFFVRkhMRWRCUVVjc1NVRkJTU3hIUVVGSExFVkJRVzlETEVOQlFVTTdVVUZEZUVRc1MwRkJTeXhOUVVGTkxFbEJRVWtzU1VGQlNTeExRVUZMTEVWQlFVVXNRMEZCUXp0WlFVTjZRaXhOUVVGTkxFbEJRVWtzUjBGQlJ5eEhRVUZITEVOQlFVTXNSMEZCUnl4RFFVRkRMRWxCUVVrc1EwRkJReXhaUVVGWkxFTkJRVU1zU1VGQlNTeEZRVUZGTEVOQlFVTTdXVUZET1VNc1NVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXp0WlFVTm9RaXhIUVVGSExFTkJRVU1zUjBGQlJ5eERRVUZETEVsQlFVa3NRMEZCUXl4WlFVRlpMRVZCUVVVc1NVRkJTU3hEUVVGRExFTkJRVU03VVVGRGJrTXNRMEZCUXp0UlFVTkVMRTlCUVU4c1IwRkJSeXhEUVVGRE8wbEJRMklzUTBGQlF6dEpRVVZFT3pzN08wOUJTVWM3U1VGRFN5eHBRa0ZCYVVJc1EwRkRka0lzUzBGQkswSXNSVUZETDBJc1MwRkJLMEk3VVVGRkwwSXNUVUZCVFN4bFFVRmxMRWRCUVVjc1MwRkJTeXhEUVVGRExFMUJRVTBzUTBGRGJFTXNRMEZCUXl4RFFVRkRMRVZCUVVVc1JVRkJSU3hEUVVGRExFTkJRVU1zUTBGQlF5eEZRVUZGTEV0QlFVc3NkVUpCUVhWQ0xFTkJRM2hETEVOQlFVTTdVVUZEUml4TlFVRk5MRTlCUVU4c1IwRkJSeXhKUVVGSkxFZEJRVWNzUTBGQlF5eGxRVUZsTEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNc1EwRkJReXhGUVVGRkxFVkJRVVVzUTBGQlF5eERRVUZETEVOQlFVTXNSVUZCUlN4RFFVRkRMRU5CUVVNc1EwRkJRenRSUVVVeFJDeG5SVUZCWjBVN1VVRkRhRVVzVFVGQlRTeFRRVUZUTEVkQlFVY3NTMEZCU3l4RFFVRkRMRTFCUVUwc1EwRkROVUlzUTBGQlF5eERRVUZETEVWQlFVVXNSVUZCUlN4RFFVRkRMRTlCUVU4c1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eERRVUZETEZsQlFWa3NRMEZCUXl4SlFVRkpMRTlCUVU4c1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eERRVUZETEZsQlFWa3NRMEZCUXl4RFFVTnNSU3hEUVVGRE8xRkJSVVlzYjBKQlFXOUNPMUZCUTNCQ0xFMUJRVTBzVVVGQlVTeEhRVUZITEVsQlFVa3NSMEZCUnl4RlFVRnJRaXhEUVVGRE8xRkJRek5ETEV0QlFVc3NUVUZCVFN4SlFVRkpMRWxCUVVrc1pVRkJaVHRaUVVGRkxGRkJRVkVzUTBGQlF5eEhRVUZITEVOQlFVTXNTVUZCU1N4RFFVRkRMRVZCUVVVc1JVRkJSU3hEUVVGRExFTkJRVU1zUTBGQlF6dFJRVU0zUkN4TFFVRkxMRTFCUVUwc1NVRkJTU3hKUVVGSkxGTkJRVk1zUlVGQlJTeERRVUZETzFsQlF6ZENMRkZCUVZFc1EwRkJReXhIUVVGSExFTkJRVU1zU1VGQlNTeERRVUZETEZsQlFWa3NSVUZCUlN4RFFVRkRMRkZCUVZFc1EwRkJReXhIUVVGSExFTkJRVU1zU1VGQlNTeERRVUZETEZsQlFWa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eERRVUZETzFGQlF6bEZMRU5CUVVNN1VVRkZSQ3hOUVVGTkxFMUJRVTBzUjBGQk9FSXNSVUZCUlN4RFFVRkRPMUZCUXpkRExFMUJRVTBzVDBGQlR5eEhRVUZITEVsQlFVa3NSMEZCUnl4RlFVRlZMRU5CUVVNN1VVRkRiRU1zU1VGQlNTeExRVUZMTEVkQlFVY3NaVUZCWlN4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU1zUlVGQlJTeEZRVUZGTEVOQlFVTXNRMEZCUXl4UlFVRlJMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU1zUTBGQlF5eEZRVUZGTEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU1zUTBGQlF6dFJRVU16UlN4SlFVRkpMRlZCUVZVc1IwRkJSeXhEUVVGRExFTkJRVU03VVVGRmJrSXNUMEZCVHl4TFFVRkxMRU5CUVVNc1RVRkJUU3hIUVVGSExFTkJRVU1zUlVGQlJTeERRVUZETzFsQlEzaENMRTFCUVUwc1MwRkJTeXhIUVVFMFFpeEZRVUZGTEV0QlFVc3NSVUZCUlN4VlFVRlZMRVZCUVVVc1JVRkJSU3hMUVVGTExFVkJRVVVzUzBGQlN5eEZRVUZGTEVOQlFVTTdXVUZETjBVc1RVRkJUU3hEUVVGRExFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXp0WlFVTnVRaXhOUVVGTkxGTkJRVk1zUjBGQk5rSXNSVUZCUlN4RFFVRkRPMWxCUXk5RExFdEJRVXNzVFVGQlRTeEpRVUZKTEVsQlFVa3NTMEZCU3l4RlFVRkZMRU5CUVVNN1owSkJRM3BDTEU5QlFVOHNRMEZCUXl4SFFVRkhMRU5CUVVNc1NVRkJTU3hEUVVGRExFVkJRVVVzUTBGQlF5eERRVUZETzJkQ1FVTnlRaXhOUVVGTkxGRkJRVkVzUjBGQlJ5eFRRVUZUTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNc1EwRkJReXhGUVVGRkxFVkJRVVVzUTBGQlF5eERRVUZETEVOQlFVTXNXVUZCV1N4TFFVRkxMRWxCUVVrc1EwRkJReXhGUVVGRkxFTkJRVU1zUTBGQlF6dG5Ra0ZEY2tVc1MwRkJTeXhOUVVGTkxFbEJRVWtzU1VGQlNTeFJRVUZSTEVWQlFVVXNRMEZCUXp0dlFrRkROVUlzVFVGQlRTeEhRVUZITEVkQlFVY3NRMEZCUXl4UlFVRlJMRU5CUVVNc1IwRkJSeXhEUVVGRExFbEJRVWtzUTBGQlF5eFpRVUZaTEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU03YjBKQlEzWkVMRkZCUVZFc1EwRkJReXhIUVVGSExFTkJRVU1zU1VGQlNTeERRVUZETEZsQlFWa3NSVUZCUlN4SFFVRkhMRU5CUVVNc1EwRkJRenR2UWtGRGNrTXNTVUZCU1N4SFFVRkhMRXRCUVVzc1EwRkJReXhKUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEVkQlFVY3NRMEZCUXl4SlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRExFVkJRVVVzUTBGQlF6dDNRa0ZEYWtRc1RVRkJUU3hKUVVGSkxFZEJRVWNzWlVGQlpTeERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1JVRkJSU3hGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETEVWQlFVVXNTMEZCU3l4SlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRExFTkJRVU03ZDBKQlEzSkZMRWxCUVVrc1NVRkJTVHMwUWtGQlJTeFRRVUZUTEVOQlFVTXNTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRE8yOUNRVU5xUXl4RFFVRkRPMmRDUVVOSUxFTkJRVU03V1VGRFNDeERRVUZETzFsQlEwUXNTMEZCU3l4SFFVRkhMRk5CUVZNc1EwRkJRenRSUVVOd1FpeERRVUZETzFGQlJVUXNTVUZCU1N4UFFVRlBMRU5CUVVNc1NVRkJTU3hMUVVGTExHVkJRV1VzUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXp0WlFVTTFReXhOUVVGTkxGTkJRVk1zUjBGQlJ5eGxRVUZsTzJsQ1FVTTVRaXhOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZETEVWQlFVVXNSVUZCUlN4RFFVRkRMRU5CUVVNc1QwRkJUeXhEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETEVOQlFVTXNSVUZCUlN4RFFVRkRMRU5CUVVNN2FVSkJRMnBETEVkQlFVY3NRMEZCUXl4RFFVRkRMRU5CUVVNc1JVRkJSU3hGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETEVWQlFVVXNRMEZCUXl4RFFVRkRPMWxCUTNCQ0xFMUJRVTBzU1VGQlNTeGxRVUZsTEVOQlFVTTdaMEpCUTNoQ0xHTkJRV01zUlVGQlJTeFRRVUZUTzJkQ1FVTjZRaXhWUVVGVkxFVkJRVVVzUzBGQlN5eERRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkZMRlZCUVZVc1JVRkJSU3hKUVVGSk8yRkJRM1pETEVOQlFVTXNRMEZCUXp0UlFVTk1MRU5CUVVNN1VVRkZSQ3hQUVVGUExFMUJRVTBzUTBGQlF6dEpRVU5vUWl4RFFVRkRPME5CUTBZaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SXZLaXBjYmlBcUlFQnRiMlIxYkdVZ2FXNTBaV2R5WVhScGIyNXpMMmR5WVhCb0wzQnNZVzV1YVc1bkwwZHlZWEJvUlhobFkzVjBhVzl1VUd4aGJtNWxjbHh1SUNvZ1FITjFiVzFoY25rZ1ZHOXdiMnh2WjJsallXd2djR3hoYm01bGNpQm1iM0lnWjNKaGNHZ2dkMjl5YTJac2IzZHpMbHh1SUNvZ1FHUmxjMk55YVhCMGFXOXVJRkpsYzI5c2RtVnpJSGR2Y210bWJHOTNJRzV2WkdWeklHRnVaQ0J5Wld4aGRHbHZibk1zSUhaaGJHbGtZWFJsY3lCMGIzQnZiRzluZVN3Z1pHVjBaV04wY3lCamVXTnNaWE1zSUdGdVpDQndjbTlrZFdObGN5QjBiM0J2Ykc5bmFXTmhiQ0JsZUdWamRYUnBiMjRnYkdGNVpYSnpJSFZ6YVc1bklFdGhhRzRuY3lCaGJHZHZjbWwwYUcwdVhHNGdLaTljYm1sdGNHOXlkQ0IwZVhCbElIdGNiaUFnUjNKaGNHaE9iMlJsUkdWbWFXNXBkR2x2Yml4Y2JpQWdSM0poY0doWGIzSnJabXh2ZDBSbFptbHVhWFJwYjI0c1hHNTlJR1p5YjIwZ1hDSkFaR1ZqWVdZdGRITXZkV2t0WkdWamIzSmhkRzl5Y3k5bmNtRndhRndpTzF4dWFXMXdiM0owSUhzZ1ozSmhjR2hFWldacGJtbDBhVzl1VDJZZ2ZTQm1jbTl0SUZ3aVFHUmxZMkZtTFhSekwzVnBMV1JsWTI5eVlYUnZjbk12WjNKaGNHaGNJanRjYmx4dWFXMXdiM0owSUhzZ1IxSkJVRWhmVjA5U1MwWk1UMWRmUWs5VlRrUkJVbGtnZlNCbWNtOXRJRndpTGk0dlkyOXVjM1JoYm5SelhDSTdYRzVwYlhCdmNuUWdleUJIY21Gd2FFTjVZMnhsUlhKeWIzSWdmU0JtY205dElGd2lMaTR2WlhKeWIzSnpMMGR5WVhCb1EzbGpiR1ZGY25KdmNsd2lPMXh1YVcxd2IzSjBJSHNnUjNKaGNHaFViM0J2Ykc5bmVVVnljbTl5SUgwZ1puSnZiU0JjSWk0dUwyVnljbTl5Y3k5SGNtRndhRlJ2Y0c5c2IyZDVSWEp5YjNKY0lqdGNibWx0Y0c5eWRDQjBlWEJsSUhzZ1IzSmhjR2hGZUdWamRYUnBiMjVRYkdGdUlIMGdabkp2YlNCY0lpNHZSM0poY0doRmVHVmpkWFJwYjI1UWJHRnVYQ0k3WEc1cGJYQnZjblFnZEhsd1pTQjdJRWR5WVhCb1JYaGxZM1YwYVc5dVVHeGhiazV2WkdVZ2ZTQm1jbTl0SUZ3aUxpOUhjbUZ3YUVWNFpXTjFkR2x2YmxCc1lXNU9iMlJsWENJN1hHNXBiWEJ2Y25RZ2RIbHdaU0I3SUVkeVlYQm9SWGhsWTNWMGFXOXVVR3hoYmtWa1oyVWdmU0JtY205dElGd2lMaTlIY21Gd2FFVjRaV04xZEdsdmJsQnNZVzVGWkdkbFhDSTdYRzVwYlhCdmNuUWdkSGx3WlNCN0lFZHlZWEJvUlhobFkzVjBhVzl1VUd4aGJreGhlV1Z5SUgwZ1puSnZiU0JjSWk0dlIzSmhjR2hGZUdWamRYUnBiMjVRYkdGdVRHRjVaWEpjSWp0Y2JtbHRjRzl5ZENCN0lFZHlZWEJvVW1Wc1lYUnBiMjVTWlhOdmJIWmxjaUI5SUdaeWIyMGdYQ0l1TDBkeVlYQm9VbVZzWVhScGIyNVNaWE52YkhabGNsd2lPMXh1WEc0dktpcGNiaUFxSUZCc1lXNXVaWElnZEdoaGRDQjBkWEp1Y3lCaElIdEFiR2x1YXlCSGNtRndhRmR2Y210bWJHOTNSR1ZtYVc1cGRHbHZibjBnYVc1MGJ5QmhYRzRnS2lCN1FHeHBibXNnUjNKaGNHaEZlR1ZqZFhScGIyNVFiR0Z1ZlNCM2FYUm9JSFJ2Y0c5c2IyZHBZMkZzSUd4aGVXVnljeTVjYmlBcUwxeHVaWGh3YjNKMElHTnNZWE56SUVkeVlYQm9SWGhsWTNWMGFXOXVVR3hoYm01bGNpQjdYRzRnSUhCeWFYWmhkR1VnY21WaFpHOXViSGtnY21WemIyeDJaWEk2SUVkeVlYQm9VbVZzWVhScGIyNVNaWE52YkhabGNqdGNibHh1SUNCamIyNXpkSEoxWTNSdmNpaHlaWE52YkhabGNqODZJRWR5WVhCb1VtVnNZWFJwYjI1U1pYTnZiSFpsY2lrZ2UxeHVJQ0FnSUhSb2FYTXVjbVZ6YjJ4MlpYSWdQU0J5WlhOdmJIWmxjaUEvUHlCdVpYY2dSM0poY0doU1pXeGhkR2x2YmxKbGMyOXNkbVZ5S0NrN1hHNGdJSDFjYmx4dUlDQXZLaXBjYmlBZ0lDb2dVR3hoYm5NZ1lTQjNiM0pyWm14dmR5Qm1iM0lnWlhobFkzVjBhVzl1TGx4dUlDQWdLbHh1SUNBZ0tpQkFjR0Z5WVcwZ2QyOXlhMlpzYjNjZ0xTQlVhR1VnZDI5eWEyWnNiM2NnWkdWbWFXNXBkR2x2YmlCMGJ5QndiR0Z1TGx4dUlDQWdLaUJBY21WMGRYSnVjeUJVYUdVZ1pYaGxZM1YwYVc5dUlIQnNZVzRnZDJsMGFDQnViMlJsY3l3Z1pXUm5aWE1zSUd4aGVXVnljeXdnWVc1a0lHMWhjSE11WEc0Z0lDQXFJRUIwYUhKdmQzTWdlMGR5WVhCb1ZHOXdiMnh2WjNsRmNuSnZjbjBnZDJobGJpQnViMlJsSUVsRWN5QmhjbVVnYm05MElIVnVhWEYxWlM1Y2JpQWdJQ29nUUhSb2NtOTNjeUI3UjNKaGNHaERlV05zWlVWeWNtOXlmU0IzYUdWdUlIUm9aU0IzYjNKclpteHZkeUJqYjI1MFlXbHVjeUJoYmlCMWJuTjFjSEJ2Y25SbFpDQmplV05zWlM1Y2JpQWdJQ292WEc0Z0lIQnNZVzRvZDI5eWEyWnNiM2M2SUVkeVlYQm9WMjl5YTJac2IzZEVaV1pwYm1sMGFXOXVLVG9nUjNKaGNHaEZlR1ZqZFhScGIyNVFiR0Z1SUh0Y2JpQWdJQ0IwYUdsekxuWmhiR2xrWVhSbFZXNXBjWFZsVG05a1pVbGtjeWgzYjNKclpteHZkeWs3WEc1Y2JpQWdJQ0JqYjI1emRDQnViMlJsY3lBOUlIUm9hWE11Y21WemIyeDJaVTV2WkdWektIZHZjbXRtYkc5M0tUdGNiaUFnSUNCamIyNXpkQ0JsWkdkbGN5QTlJSFJvYVhNdWNtVnpiMngyWlhJdWNtVnpiMngyWlNoM2IzSnJabXh2ZHlrN1hHNWNiaUFnSUNCamIyNXpkQ0JwYm1OdmJXbHVaMEo1VG05a1pTQTlJSFJvYVhNdVluVnBiR1JKYm1OdmJXbHVaMDFoY0NobFpHZGxjeWs3WEc0Z0lDQWdZMjl1YzNRZ2IzVjBaMjlwYm1kQ2VVNXZaR1VnUFNCMGFHbHpMbUoxYVd4a1QzVjBaMjlwYm1kTllYQW9aV1JuWlhNcE8xeHVYRzRnSUNBZ1kyOXVjM1FnYkdGNVpYSnpJRDBnZEdocGN5NTBiM0J2Ykc5bmFXTmhiRXhoZVdWeWN5aHViMlJsY3l3Z1pXUm5aWE1wTzF4dVhHNGdJQ0FnY21WMGRYSnVJSHRjYmlBZ0lDQWdJSGR2Y210bWJHOTNMRnh1SUNBZ0lDQWdkMjl5YTJac2IzZEpaRG9nZDI5eWEyWnNiM2N1Ym1GdFpTeGNiaUFnSUNBZ0lHNXZaR1Z6TEZ4dUlDQWdJQ0FnWldSblpYTXNYRzRnSUNBZ0lDQnNZWGxsY25Nc1hHNGdJQ0FnSUNCcGJtTnZiV2x1WjBKNVRtOWtaU3hjYmlBZ0lDQWdJRzkxZEdkdmFXNW5RbmxPYjJSbExGeHVJQ0FnSUgwN1hHNGdJSDFjYmx4dUlDQXZLaXBjYmlBZ0lDb2dWbUZzYVdSaGRHVnpJSFJvWVhRZ1lXeHNJSGR2Y210bWJHOTNJRzV2WkdVZ1NVUnpJR0Z5WlNCMWJtbHhkV1V1WEc0Z0lDQXFMMXh1SUNCd2NtbDJZWFJsSUhaaGJHbGtZWFJsVlc1cGNYVmxUbTlrWlVsa2N5aDNiM0pyWm14dmR6b2dSM0poY0doWGIzSnJabXh2ZDBSbFptbHVhWFJwYjI0cE9pQjJiMmxrSUh0Y2JpQWdJQ0JqYjI1emRDQnpaV1Z1SUQwZ2JtVjNJRk5sZER4emRISnBibWMrS0NrN1hHNGdJQ0FnWm05eUlDaGpiMjV6ZENCdWIyUmxJRzltSUhkdmNtdG1iRzkzTG01dlpHVnpJRDgvSUZ0ZEtTQjdYRzRnSUNBZ0lDQnBaaUFvYzJWbGJpNW9ZWE1vYm05a1pTNXBaQ2twSUh0Y2JpQWdJQ0FnSUNBZ2RHaHliM2NnYm1WM0lFZHlZWEJvVkc5d2IyeHZaM2xGY25KdmNpaGNiaUFnSUNBZ0lDQWdJQ0JnUkhWd2JHbGpZWFJsSUc1dlpHVWdhV1FnSnlSN2JtOWtaUzVwWkgwbklHbHVJSGR2Y210bWJHOTNJQ2NrZTNkdmNtdG1iRzkzTG01aGJXVjlKMkFzWEc0Z0lDQWdJQ0FnSUNBZ2V5QnViMlJsU1dRNklHNXZaR1V1YVdRc0lIZHZjbXRtYkc5M1NXUTZJSGR2Y210bWJHOTNMbTVoYldVZ2ZWeHVJQ0FnSUNBZ0lDQXBPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lDQWdjMlZsYmk1aFpHUW9ibTlrWlM1cFpDazdYRzRnSUNBZ2ZWeHVJQ0I5WEc1Y2JpQWdMeW9xWEc0Z0lDQXFJRkpsYzI5c2RtVnpJSGR2Y210bWJHOTNJRzV2WkdVZ2JXVjBZV1JoZEdFZ2FXNTBieUJ3YkdGdUlHNXZaR1Z6SUhkcGRHZ2dablZzYkNCa1pXWnBibWwwYVc5dWN5NWNiaUFnSUNvdlhHNGdJSEJ5YVhaaGRHVWdjbVZ6YjJ4MlpVNXZaR1Z6S0Z4dUlDQWdJSGR2Y210bWJHOTNPaUJIY21Gd2FGZHZjbXRtYkc5M1JHVm1hVzVwZEdsdmJseHVJQ0FwT2lCSGNtRndhRVY0WldOMWRHbHZibEJzWVc1T2IyUmxXMTBnZTF4dUlDQWdJR052Ym5OMElISmxjM1ZzZERvZ1IzSmhjR2hGZUdWamRYUnBiMjVRYkdGdVRtOWtaVnRkSUQwZ1cxMDdYRzRnSUNBZ1ptOXlJQ2hqYjI1emRDQnViMlJsVFdWMFlTQnZaaUIzYjNKclpteHZkeTV1YjJSbGN5QS9QeUJiWFNrZ2UxeHVJQ0FnSUNBZ1kyOXVjM1FnWkdWbWFXNXBkR2x2YmlBOUlIUm9hWE11Y21WemIyeDJaVVJsWm1sdWFYUnBiMjRvYm05a1pVMWxkR0VwTzF4dUlDQWdJQ0FnWTI5dWMzUWdhVzV3ZFhSUWIzSjBjeUE5SUNoa1pXWnBibWwwYVc5dUxuQnZjblJ6SUQ4L0lGdGRLVnh1SUNBZ0lDQWdJQ0F1Wm1sc2RHVnlLQ2h3S1NBOVBpQndMbVJwY21WamRHbHZiaUE5UFQwZ1hDSnBibkIxZEZ3aUtWeHVJQ0FnSUNBZ0lDQXViV0Z3S0Nod0tTQTlQaUJ3TG01aGJXVXBPMXh1SUNBZ0lDQWdZMjl1YzNRZ2IzVjBjSFYwVUc5eWRITWdQU0FvWkdWbWFXNXBkR2x2Ymk1d2IzSjBjeUEvUHlCYlhTbGNiaUFnSUNBZ0lDQWdMbVpwYkhSbGNpZ29jQ2tnUFQ0Z2NDNWthWEpsWTNScGIyNGdQVDA5SUZ3aWIzVjBjSFYwWENJcFhHNGdJQ0FnSUNBZ0lDNXRZWEFvS0hBcElEMCtJSEF1Ym1GdFpTazdYRzRnSUNBZ0lDQnlaWE4xYkhRdWNIVnphQ2g3WEc0Z0lDQWdJQ0FnSUdsa09pQnViMlJsVFdWMFlTNXBaQ3hjYmlBZ0lDQWdJQ0FnYTJsdVpEb2dibTlrWlUxbGRHRXVhMmx1WkNBL1B5QmtaV1pwYm1sMGFXOXVMbXRwYm1RZ1B6OGdibTlrWlUxbGRHRXVhV1FzWEc0Z0lDQWdJQ0FnSUd4aFltVnNPaUJ1YjJSbFRXVjBZUzVzWVdKbGJDeGNiaUFnSUNBZ0lDQWdjMjkxY21ObE9pQnViMlJsVFdWMFlTeGNiaUFnSUNBZ0lDQWdaR1ZtYVc1cGRHbHZiaXhjYmlBZ0lDQWdJQ0FnYVc1d2RYUlFiM0owY3l4Y2JpQWdJQ0FnSUNBZ2IzVjBjSFYwVUc5eWRITXNYRzRnSUNBZ0lDQWdJRzFsZEdGa1lYUmhPaUJ1YjJSbFRXVjBZUzV0WlhSaFpHRjBZU3hjYmlBZ0lDQWdJSDBwTzF4dUlDQWdJSDFjYmlBZ0lDQnlaWFIxY200Z2NtVnpkV3gwTzF4dUlDQjlYRzVjYmlBZ0x5b3FYRzRnSUNBcUlFRjBkR1Z0Y0hSeklIUnZJSEpsYzI5c2RtVWdkR2hsSUdaMWJHd2daM0poY0dnZ2JtOWtaU0JrWldacGJtbDBhVzl1SUdaeWIyMGdiV1YwWVdSaGRHRXVYRzRnSUNBcVhHNGdJQ0FxSUVGalkyVndkSE1nWldsMGFHVnlJR0VnWkdWamIzSmhkR1ZrSUUxdlpHVnNJR05zWVhOekwybHVjM1JoYm1ObElDaHlaWE52YkhabFpDQjJhV0ZjYmlBZ0lDb2dZR2R5WVhCb1JHVm1hVzVwZEdsdmJrOW1ZQ2tnYjNJZ1lTQndiR0ZwYmlCZ1IzSmhjR2hPYjJSbFJHVm1hVzVwZEdsdmJtQXRjMmhoY0dWa0lHOWlhbVZqZEZ4dUlDQWdLaUFvZFhObFpuVnNJR1p2Y2lCelpYSnBZV3hwZW1Wa0lIZHZjbXRtYkc5M2N5QjBhR0YwSUdsdWJHbHVaU0J1YjJSbElHUmxabWx1YVhScGIyNXpLUzVjYmlBZ0lDb3ZYRzRnSUhCeWFYWmhkR1VnY21WemIyeDJaVVJsWm1sdWFYUnBiMjRvYm05a1pVMWxkR0U2SUh0Y2JpQWdJQ0J1YjJSbFB6b2dkVzVyYm05M2JqdGNiaUFnSUNCcmFXNWtQem9nYzNSeWFXNW5PMXh1SUNBZ0lHbGtPaUJ6ZEhKcGJtYzdYRzRnSUgwcE9pQkhjbUZ3YUU1dlpHVkVaV1pwYm1sMGFXOXVJSHRjYmlBZ0lDQnBaaUFvYm05a1pVMWxkR0V1Ym05a1pTa2dlMXh1SUNBZ0lDQWdhV1lnS0hSb2FYTXVhWE5TWVhkRVpXWnBibWwwYVc5dUtHNXZaR1ZOWlhSaExtNXZaR1VwS1NCN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCdWIyUmxUV1YwWVM1dWIyUmxJR0Z6SUVkeVlYQm9UbTlrWlVSbFptbHVhWFJwYjI0N1hHNGdJQ0FnSUNCOVhHNGdJQ0FnSUNCMGNua2dlMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdaM0poY0doRVpXWnBibWwwYVc5dVQyWW9ibTlrWlUxbGRHRXVibTlrWlNCaGN5QmhibmtwTzF4dUlDQWdJQ0FnZlNCallYUmphQ0I3WEc0Z0lDQWdJQ0FnSUM4dklHWmhiR3dnZEdoeWIzVm5hQ0IwYnlCemRIVmlYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVJQ0FnSUM4dklGSmxkSFZ5YmlCaElHMXBibWx0WVd3Z2MzUjFZaUJrWldacGJtbDBhVzl1SUhOdklIQnNZVzV1YVc1bklHTmhiaUJ3Y205alpXVmtYRzRnSUNBZ2NtVjBkWEp1SUh0Y2JpQWdJQ0FnSUc1aGJXVTZJRzV2WkdWTlpYUmhMbWxrTEZ4dUlDQWdJQ0FnZEdGbk9pQnViMlJsVFdWMFlTNXBaQ3hjYmlBZ0lDQWdJR3RwYm1RNklHNXZaR1ZOWlhSaExtdHBibVFnUHo4Z2JtOWtaVTFsZEdFdWFXUXNYRzRnSUNBZ0lDQnNZV0psYkhNNklGdGRMRnh1SUNBZ0lDQWdjRzl5ZEhNNklGdGRMRnh1SUNBZ0lIMDdYRzRnSUgxY2JseHVJQ0F2S2lwY2JpQWdJQ29nVW1WMGRYSnVjeUJnZEhKMVpXQWdkMmhsYmlCaElIWmhiSFZsSUd4dmIydHpJR3hwYTJVZ1lTQnlZWGNnZTBCc2FXNXJJRWR5WVhCb1RtOWtaVVJsWm1sdWFYUnBiMjU5WEc0Z0lDQXFJQ2hoSUhCc1lXbHVJRzlpYW1WamRDQjNhWFJvSUdFZ1lIQnZjblJ6WUNCaGNuSmhlU0JoYm1RZ1lTQmdibUZ0WldBZ2MzUnlhVzVuS1M1Y2JpQWdJQ292WEc0Z0lIQnlhWFpoZEdVZ2FYTlNZWGRFWldacGJtbDBhVzl1S0haaGJIVmxPaUIxYm10dWIzZHVLVG9nWW05dmJHVmhiaUI3WEc0Z0lDQWdjbVYwZFhKdUlDaGNiaUFnSUNBZ0lIUjVjR1Z2WmlCMllXeDFaU0E5UFQwZ1hDSnZZbXBsWTNSY0lpQW1KbHh1SUNBZ0lDQWdkbUZzZFdVZ0lUMDlJRzUxYkd3Z0ppWmNiaUFnSUNBZ0lDRkJjbkpoZVM1cGMwRnljbUY1S0haaGJIVmxLU0FtSmx4dUlDQWdJQ0FnZEhsd1pXOW1JQ2gyWVd4MVpTQmhjeUI3SUc1aGJXVS9PaUIxYm10dWIzZHVJSDBwTG01aGJXVWdQVDA5SUZ3aWMzUnlhVzVuWENJZ0ppWmNiaUFnSUNBZ0lFRnljbUY1TG1selFYSnlZWGtvS0haaGJIVmxJR0Z6SUhzZ2NHOXlkSE0vT2lCMWJtdHViM2R1SUgwcExuQnZjblJ6S1Z4dUlDQWdJQ2s3WEc0Z0lIMWNibHh1SUNBdktpcGNiaUFnSUNvZ1FuVnBiR1J6SUdFZ2JXRndJRzltSUc1dlpHVWdhV1FnTFQ0Z2FXNWpiMjFwYm1jZ1pXUm5aWE11WEc0Z0lDQXFMMXh1SUNCd2NtbDJZWFJsSUdKMWFXeGtTVzVqYjIxcGJtZE5ZWEFvWEc0Z0lDQWdaV1JuWlhNNklFZHlZWEJvUlhobFkzVjBhVzl1VUd4aGJrVmtaMlZiWFZ4dUlDQXBPaUJOWVhBOGMzUnlhVzVuTENCSGNtRndhRVY0WldOMWRHbHZibEJzWVc1RlpHZGxXMTArSUh0Y2JpQWdJQ0JqYjI1emRDQnRZWEFnUFNCdVpYY2dUV0Z3UEhOMGNtbHVaeXdnUjNKaGNHaEZlR1ZqZFhScGIyNVFiR0Z1UldSblpWdGRQaWdwTzF4dUlDQWdJR1p2Y2lBb1kyOXVjM1FnWldSblpTQnZaaUJsWkdkbGN5a2dlMXh1SUNBZ0lDQWdZMjl1YzNRZ2JHbHpkQ0E5SUcxaGNDNW5aWFFvWldSblpTNTBZWEpuWlhST2IyUmxTV1FwSUQ4L0lGdGRPMXh1SUNBZ0lDQWdiR2x6ZEM1d2RYTm9LR1ZrWjJVcE8xeHVJQ0FnSUNBZ2JXRndMbk5sZENobFpHZGxMblJoY21kbGRFNXZaR1ZKWkN3Z2JHbHpkQ2s3WEc0Z0lDQWdmVnh1SUNBZ0lISmxkSFZ5YmlCdFlYQTdYRzRnSUgxY2JseHVJQ0F2S2lwY2JpQWdJQ29nUW5WcGJHUnpJR0VnYldGd0lHOW1JRzV2WkdVZ2FXUWdMVDRnYjNWMFoyOXBibWNnWldSblpYTXVYRzRnSUNBcUwxeHVJQ0J3Y21sMllYUmxJR0oxYVd4a1QzVjBaMjlwYm1kTllYQW9YRzRnSUNBZ1pXUm5aWE02SUVkeVlYQm9SWGhsWTNWMGFXOXVVR3hoYmtWa1oyVmJYVnh1SUNBcE9pQk5ZWEE4YzNSeWFXNW5MQ0JIY21Gd2FFVjRaV04xZEdsdmJsQnNZVzVGWkdkbFcxMCtJSHRjYmlBZ0lDQmpiMjV6ZENCdFlYQWdQU0J1WlhjZ1RXRndQSE4wY21sdVp5d2dSM0poY0doRmVHVmpkWFJwYjI1UWJHRnVSV1JuWlZ0ZFBpZ3BPMXh1SUNBZ0lHWnZjaUFvWTI5dWMzUWdaV1JuWlNCdlppQmxaR2RsY3lrZ2UxeHVJQ0FnSUNBZ1kyOXVjM1FnYkdsemRDQTlJRzFoY0M1blpYUW9aV1JuWlM1emIzVnlZMlZPYjJSbFNXUXBJRDgvSUZ0ZE8xeHVJQ0FnSUNBZ2JHbHpkQzV3ZFhOb0tHVmtaMlVwTzF4dUlDQWdJQ0FnYldGd0xuTmxkQ2hsWkdkbExuTnZkWEpqWlU1dlpHVkpaQ3dnYkdsemRDazdYRzRnSUNBZ2ZWeHVJQ0FnSUhKbGRIVnliaUJ0WVhBN1hHNGdJSDFjYmx4dUlDQXZLaXBjYmlBZ0lDb2dVSEp2WkhWalpYTWdkRzl3YjJ4dloybGpZV3dnYkdGNVpYSnpJSFZ6YVc1bklFdGhhRzRuY3lCaGJHZHZjbWwwYUcwdVhHNGdJQ0FxWEc0Z0lDQXFJRmR2Y210bWJHOTNJR0p2ZFc1a1lYSjVJR1ZrWjJWeklHUnZJRzV2ZENCamIzVnVkQ0JoY3lCbGVHVmpkWFJoWW14bExXNXZaR1VnWkdWd1pXNWtaVzVqYVdWekxseHVJQ0FnS2k5Y2JpQWdjSEpwZG1GMFpTQjBiM0J2Ykc5bmFXTmhiRXhoZVdWeWN5aGNiaUFnSUNCdWIyUmxjem9nUjNKaGNHaEZlR1ZqZFhScGIyNVFiR0Z1VG05a1pWdGRMRnh1SUNBZ0lHVmtaMlZ6T2lCSGNtRndhRVY0WldOMWRHbHZibEJzWVc1RlpHZGxXMTFjYmlBZ0tUb2dSM0poY0doRmVHVmpkWFJwYjI1UWJHRnVUR0Y1WlhKYlhTQjdYRzRnSUNBZ1kyOXVjM1FnWlhobFkzVjBZV0pzWlU1dlpHVnpJRDBnYm05a1pYTXVabWxzZEdWeUtGeHVJQ0FnSUNBZ0tHNHBJRDArSUc0dWFXUWdJVDA5SUVkU1FWQklYMWRQVWt0R1RFOVhYMEpQVlU1RVFWSlpYRzRnSUNBZ0tUdGNiaUFnSUNCamIyNXpkQ0J1YjJSbFNXUnpJRDBnYm1WM0lGTmxkQ2hsZUdWamRYUmhZbXhsVG05a1pYTXViV0Z3S0NodUtTQTlQaUJ1TG1sa0tTazdYRzVjYmlBZ0lDQXZMeUJQYm14NUlHVmtaMlZ6SUdKbGRIZGxaVzRnZEhkdklHVjRaV04xZEdGaWJHVWdibTlrWlhNZ1kyOTFiblFnWVhNZ1pHVndaVzVrWlc1amFXVnpYRzRnSUNBZ1kyOXVjM1FnWlhobFkwVmtaMlZ6SUQwZ1pXUm5aWE11Wm1sc2RHVnlLRnh1SUNBZ0lDQWdLR1VwSUQwK0lHNXZaR1ZKWkhNdWFHRnpLR1V1YzI5MWNtTmxUbTlrWlVsa0tTQW1KaUJ1YjJSbFNXUnpMbWhoY3lobExuUmhjbWRsZEU1dlpHVkpaQ2xjYmlBZ0lDQXBPMXh1WEc0Z0lDQWdMeThnUTI5dGNIVjBaU0JwYmkxa1pXZHlaV1ZjYmlBZ0lDQmpiMjV6ZENCcGJtUmxaM0psWlNBOUlHNWxkeUJOWVhBOGMzUnlhVzVuTENCdWRXMWlaWEkrS0NrN1hHNGdJQ0FnWm05eUlDaGpiMjV6ZENCdWIyUmxJRzltSUdWNFpXTjFkR0ZpYkdWT2IyUmxjeWtnYVc1a1pXZHlaV1V1YzJWMEtHNXZaR1V1YVdRc0lEQXBPMXh1SUNBZ0lHWnZjaUFvWTI5dWMzUWdaV1JuWlNCdlppQmxlR1ZqUldSblpYTXBJSHRjYmlBZ0lDQWdJR2x1WkdWbmNtVmxMbk5sZENobFpHZGxMblJoY21kbGRFNXZaR1ZKWkN3Z0tHbHVaR1ZuY21WbExtZGxkQ2hsWkdkbExuUmhjbWRsZEU1dlpHVkpaQ2tnUHo4Z01Da2dLeUF4S1R0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0JqYjI1emRDQnNZWGxsY25NNklFZHlZWEJvUlhobFkzVjBhVzl1VUd4aGJreGhlV1Z5VzEwZ1BTQmJYVHRjYmlBZ0lDQmpiMjV6ZENCd2JHRnVibVZrSUQwZ2JtVjNJRk5sZER4emRISnBibWMrS0NrN1hHNGdJQ0FnYkdWMElISmxZV1I1SUQwZ1pYaGxZM1YwWVdKc1pVNXZaR1Z6TG1acGJIUmxjaWdvYmlrZ1BUNGdLR2x1WkdWbmNtVmxMbWRsZENodUxtbGtLU0EvUHlBd0tTQTlQVDBnTUNrN1hHNGdJQ0FnYkdWMElHeGhlV1Z5U1c1a1pYZ2dQU0F3TzF4dVhHNGdJQ0FnZDJocGJHVWdLSEpsWVdSNUxteGxibWQwYUNBK0lEQXBJSHRjYmlBZ0lDQWdJR052Ym5OMElHeGhlV1Z5T2lCSGNtRndhRVY0WldOMWRHbHZibEJzWVc1TVlYbGxjaUE5SUhzZ2FXNWtaWGc2SUd4aGVXVnlTVzVrWlhnckt5d2dibTlrWlhNNklISmxZV1I1SUgwN1hHNGdJQ0FnSUNCc1lYbGxjbk11Y0hWemFDaHNZWGxsY2lrN1hHNGdJQ0FnSUNCamIyNXpkQ0J1WlhoMFVtVmhaSGs2SUVkeVlYQm9SWGhsWTNWMGFXOXVVR3hoYms1dlpHVmJYU0E5SUZ0ZE8xeHVJQ0FnSUNBZ1ptOXlJQ2hqYjI1emRDQnViMlJsSUc5bUlISmxZV1I1S1NCN1hHNGdJQ0FnSUNBZ0lIQnNZVzV1WldRdVlXUmtLRzV2WkdVdWFXUXBPMXh1SUNBZ0lDQWdJQ0JqYjI1emRDQnZkWFJuYjJsdVp5QTlJR1Y0WldORlpHZGxjeTVtYVd4MFpYSW9LR1VwSUQwK0lHVXVjMjkxY21ObFRtOWtaVWxrSUQwOVBTQnViMlJsTG1sa0tUdGNiaUFnSUNBZ0lDQWdabTl5SUNoamIyNXpkQ0JsWkdkbElHOW1JRzkxZEdkdmFXNW5LU0I3WEc0Z0lDQWdJQ0FnSUNBZ1kyOXVjM1FnWkdWbklEMGdLR2x1WkdWbmNtVmxMbWRsZENobFpHZGxMblJoY21kbGRFNXZaR1ZKWkNrZ1B6OGdNU2tnTFNBeE8xeHVJQ0FnSUNBZ0lDQWdJR2x1WkdWbmNtVmxMbk5sZENobFpHZGxMblJoY21kbGRFNXZaR1ZKWkN3Z1pHVm5LVHRjYmlBZ0lDQWdJQ0FnSUNCcFppQW9aR1ZuSUQwOVBTQXdJQ1ltSUNGd2JHRnVibVZrTG1oaGN5aGxaR2RsTG5SaGNtZGxkRTV2WkdWSlpDa3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHTnZibk4wSUc1bGVIUWdQU0JsZUdWamRYUmhZbXhsVG05a1pYTXVabWx1WkNnb2Jpa2dQVDRnYmk1cFpDQTlQVDBnWldSblpTNTBZWEpuWlhST2IyUmxTV1FwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0c1bGVIUXBJRzVsZUhSU1pXRmtlUzV3ZFhOb0tHNWxlSFFwTzF4dUlDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdmVnh1SUNBZ0lDQWdjbVZoWkhrZ1BTQnVaWGgwVW1WaFpIazdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2FXWWdLSEJzWVc1dVpXUXVjMmw2WlNBaFBUMGdaWGhsWTNWMFlXSnNaVTV2WkdWekxteGxibWQwYUNrZ2UxeHVJQ0FnSUNBZ1kyOXVjM1FnZFc1d2JHRnVibVZrSUQwZ1pYaGxZM1YwWVdKc1pVNXZaR1Z6WEc0Z0lDQWdJQ0FnSUM1bWFXeDBaWElvS0c0cElEMCtJQ0Z3YkdGdWJtVmtMbWhoY3lodUxtbGtLU2xjYmlBZ0lDQWdJQ0FnTG0xaGNDZ29iaWtnUFQ0Z2JpNXBaQ2s3WEc0Z0lDQWdJQ0IwYUhKdmR5QnVaWGNnUjNKaGNHaERlV05zWlVWeWNtOXlLSHRjYmlBZ0lDQWdJQ0FnZFc1d2JHRnVibVZrVG05a1pYTTZJSFZ1Y0d4aGJtNWxaQ3hjYmlBZ0lDQWdJQ0FnZDI5eWEyWnNiM2RKWkRvZ2JtOWtaWE5iTUYwL0xtUmxabWx1YVhScGIyNC9MbTVoYldVc1hHNGdJQ0FnSUNCOUtUdGNiaUFnSUNCOVhHNWNiaUFnSUNCeVpYUjFjbTRnYkdGNVpYSnpPMXh1SUNCOVhHNTlYRzRpWFgwPSJdfQ==
|
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.GraphRelationResolver = void 0;
|
|
4
|
-
const graph_1 = require("@decaf-ts/ui-decorators/graph");
|
|
5
|
-
const constants_js_1 = require("./../constants.cjs");
|
|
6
|
-
const GraphPortError_js_1 = require("./../errors/GraphPortError.cjs");
|
|
7
|
-
const GraphTopologyError_js_1 = require("./../errors/GraphTopologyError.cjs");
|
|
8
|
-
/**
|
|
9
|
-
* Resolves raw workflow relation metadata into normalized execution edges.
|
|
10
|
-
*/
|
|
11
|
-
class GraphRelationResolver {
|
|
12
|
-
/**
|
|
13
|
-
* Resolves all relations of a workflow into execution edges.
|
|
14
|
-
*
|
|
15
|
-
* @param workflow - The workflow definition.
|
|
16
|
-
* @returns Array of normalized edges.
|
|
17
|
-
* @throws {GraphTopologyError} when an endpoint is unknown or ambiguous.
|
|
18
|
-
* @throws {GraphPortError} when a referenced port is missing or unknown.
|
|
19
|
-
*/
|
|
20
|
-
resolve(workflow) {
|
|
21
|
-
const nodeIds = new Set(workflow.nodes.map((n) => n.id));
|
|
22
|
-
const boundaryAliases = this.boundaryAliases(workflow);
|
|
23
|
-
const inputPorts = this.portNames(workflow.inputs);
|
|
24
|
-
const outputPorts = this.portNames(workflow.outputs);
|
|
25
|
-
const nodePortMap = this.buildNodePortMap(workflow);
|
|
26
|
-
const edges = [];
|
|
27
|
-
for (const relation of workflow.relations ?? []) {
|
|
28
|
-
const edge = this.resolveRelation(relation, nodeIds, boundaryAliases, inputPorts, outputPorts, nodePortMap);
|
|
29
|
-
edges.push(edge);
|
|
30
|
-
}
|
|
31
|
-
return edges;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Resolves a single relation into an edge.
|
|
35
|
-
*/
|
|
36
|
-
resolveRelation(relation, nodeIds, boundaryAliases, inputPorts, outputPorts, nodePortMap) {
|
|
37
|
-
const sourceNodeId = this.resolveEndpoint(relation.source, nodeIds, boundaryAliases);
|
|
38
|
-
const targetNodeId = this.resolveEndpoint(relation.target, nodeIds, boundaryAliases);
|
|
39
|
-
const sourcePort = relation.sourcePort;
|
|
40
|
-
const targetPort = relation.targetPort;
|
|
41
|
-
if (!sourcePort) {
|
|
42
|
-
throw new GraphPortError_js_1.GraphPortError(`Relation is missing sourcePort (source: ${String(relation.source)}, target: ${String(relation.target)})`, { relation });
|
|
43
|
-
}
|
|
44
|
-
if (!targetPort) {
|
|
45
|
-
throw new GraphPortError_js_1.GraphPortError(`Relation is missing targetPort (source: ${String(relation.source)}, target: ${String(relation.target)})`, { relation });
|
|
46
|
-
}
|
|
47
|
-
this.validatePort(sourceNodeId, sourcePort, true, boundaryAliases, inputPorts, outputPorts, nodePortMap);
|
|
48
|
-
this.validatePort(targetNodeId, targetPort, false, boundaryAliases, inputPorts, outputPorts, nodePortMap);
|
|
49
|
-
return {
|
|
50
|
-
id: this.createEdgeId(sourceNodeId, sourcePort, targetNodeId, targetPort),
|
|
51
|
-
sourceNodeId,
|
|
52
|
-
sourcePort,
|
|
53
|
-
targetNodeId,
|
|
54
|
-
targetPort,
|
|
55
|
-
label: relation.label,
|
|
56
|
-
metadata: relation.metadata,
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Resolves an endpoint (source or target) to a node id or the workflow boundary.
|
|
61
|
-
*/
|
|
62
|
-
resolveEndpoint(endpoint, nodeIds, boundaryAliases) {
|
|
63
|
-
const name = String(endpoint);
|
|
64
|
-
if (boundaryAliases.has(name))
|
|
65
|
-
return constants_js_1.GRAPH_WORKFLOW_BOUNDARY;
|
|
66
|
-
if (nodeIds.has(name))
|
|
67
|
-
return name;
|
|
68
|
-
throw new GraphTopologyError_js_1.GraphTopologyError(`Unknown endpoint '${name}'`, { endpoint: name, knownNodes: Array.from(nodeIds) });
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Validates that a port exists on the given node or boundary.
|
|
72
|
-
*/
|
|
73
|
-
validatePort(nodeId, port, isSource, boundaryAliases, inputPorts, outputPorts, nodePortMap) {
|
|
74
|
-
if (nodeId === constants_js_1.GRAPH_WORKFLOW_BOUNDARY) {
|
|
75
|
-
const ports = isSource ? inputPorts : outputPorts;
|
|
76
|
-
if (!ports.has(port)) {
|
|
77
|
-
throw new GraphPortError_js_1.GraphPortError(`Unknown ${isSource ? "input" : "output"} port '${port}' on workflow boundary`, { nodeId, port, isSource, available: Array.from(ports) });
|
|
78
|
-
}
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
const nodePorts = nodePortMap.get(nodeId);
|
|
82
|
-
if (!nodePorts) {
|
|
83
|
-
throw new GraphTopologyError_js_1.GraphTopologyError(`No port map for node '${nodeId}'`, {
|
|
84
|
-
nodeId,
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
const ports = isSource ? nodePorts.output : nodePorts.input;
|
|
88
|
-
if (!ports.has(port)) {
|
|
89
|
-
throw new GraphPortError_js_1.GraphPortError(`Unknown ${isSource ? "output" : "input"} port '${port}' on node '${nodeId}'`, { nodeId, port, isSource, available: Array.from(ports) });
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Builds the set of boundary aliases for a workflow.
|
|
94
|
-
*/
|
|
95
|
-
boundaryAliases(workflow) {
|
|
96
|
-
return new Set([
|
|
97
|
-
constants_js_1.GRAPH_WORKFLOW_BOUNDARY,
|
|
98
|
-
"workflow",
|
|
99
|
-
"graph",
|
|
100
|
-
workflow.name,
|
|
101
|
-
]);
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Extracts port names from a list of port definitions.
|
|
105
|
-
*/
|
|
106
|
-
portNames(ports) {
|
|
107
|
-
return new Set((ports ?? []).map((p) => p.name));
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Builds a map of node id -> { input ports, output ports }.
|
|
111
|
-
*/
|
|
112
|
-
buildNodePortMap(workflow) {
|
|
113
|
-
const map = new Map();
|
|
114
|
-
for (const nodeMeta of workflow.nodes ?? []) {
|
|
115
|
-
const input = new Set();
|
|
116
|
-
const output = new Set();
|
|
117
|
-
const def = this.resolveNodeDefinition(nodeMeta);
|
|
118
|
-
if (def) {
|
|
119
|
-
for (const port of def.ports ?? []) {
|
|
120
|
-
if (port.direction === "input")
|
|
121
|
-
input.add(port.name);
|
|
122
|
-
else
|
|
123
|
-
output.add(port.name);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
map.set(nodeMeta.id, { input, output });
|
|
127
|
-
}
|
|
128
|
-
return map;
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Attempts to resolve a node's full definition from its metadata.
|
|
132
|
-
*
|
|
133
|
-
* Accepts either a decorated Model class/instance (resolved via
|
|
134
|
-
* `graphDefinitionOf`) or a plain `GraphNodeDefinition`-shaped object
|
|
135
|
-
* (useful for serialized workflows that inline node definitions).
|
|
136
|
-
*/
|
|
137
|
-
resolveNodeDefinition(nodeMeta) {
|
|
138
|
-
if (nodeMeta.node) {
|
|
139
|
-
if (this.isRawDefinition(nodeMeta.node)) {
|
|
140
|
-
return nodeMeta.node;
|
|
141
|
-
}
|
|
142
|
-
try {
|
|
143
|
-
const def = (0, graph_1.graphDefinitionOf)(nodeMeta.node);
|
|
144
|
-
return def;
|
|
145
|
-
}
|
|
146
|
-
catch {
|
|
147
|
-
return undefined;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
return undefined;
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Returns `true` when a value looks like a raw {@link GraphNodeDefinition}
|
|
154
|
-
* (a plain object with a `ports` array and a `name` string).
|
|
155
|
-
*/
|
|
156
|
-
isRawDefinition(value) {
|
|
157
|
-
return (typeof value === "object" &&
|
|
158
|
-
value !== null &&
|
|
159
|
-
!Array.isArray(value) &&
|
|
160
|
-
typeof value.name === "string" &&
|
|
161
|
-
Array.isArray(value.ports));
|
|
162
|
-
}
|
|
163
|
-
/**
|
|
164
|
-
* Creates a stable edge id from its endpoints and ports.
|
|
165
|
-
*/
|
|
166
|
-
createEdgeId(sourceNodeId, sourcePort, targetNodeId, targetPort) {
|
|
167
|
-
return `${sourceNodeId}:${sourcePort}->${targetNodeId}:${targetPort}`;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
exports.GraphRelationResolver = GraphRelationResolver;
|
|
171
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGhSZWxhdGlvblJlc29sdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2dyYXBoL3BsYW5uaW5nL0dyYXBoUmVsYXRpb25SZXNvbHZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFVQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVsRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsMEJBQXFCO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsc0NBQWlDO0FBQzFELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSwwQ0FBcUM7QUFHbEU7O0dBRUc7QUFDSCxNQUFNLE9BQU8scUJBQXFCO0lBQ2hDOzs7Ozs7O09BT0c7SUFDSCxPQUFPLENBQUMsUUFBaUM7UUFDdkMsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXBELE1BQU0sS0FBSyxHQUE2QixFQUFFLENBQUM7UUFFM0MsS0FBSyxNQUFNLFFBQVEsSUFBSSxRQUFRLENBQUMsU0FBUyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ2hELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQy9CLFFBQVEsRUFDUixPQUFPLEVBQ1AsZUFB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QixDQUMzQixRQUEyQztRQUUzQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsQixJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3hDLE9BQU8sUUFBUSxDQUFDLElBRWYsQ0FBQztZQUNKLENBQUM7WUFDRCxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxHQUFHLEdBQUcsaUJBQWlCLENBQUMsUUFBUSxDQUFDLElBQVcsQ0FBQyxDQUFDO2dCQUNwRCxPQUFPLEdBQVUsQ0FBQztZQUNwQixDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLE9BQU8sU0FBUyxDQUFDO1lBQ25CLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGVBQWUsQ0FBQyxLQUFjO1FBQ3BDLE9BQU8sQ0FDTCxPQUFPLEtBQUssS0FBSyxRQUFRO1lBQ3pCLEtBQUssS0FBSyxJQUFJO1lBQ2QsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUNyQixPQUFRLEtBQTRCLENBQUMsSUFBSSxLQUFLLFFBQVE7WUFDdEQsS0FBSyxDQUFDLE9BQU8sQ0FBRSxLQUE2QixDQUFDLEtBQUssQ0FBQyxDQUNwRCxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0ssWUFBWSxDQUNsQixZQUFvQixFQUNwQixVQUFrQixFQUNsQixZQUFvQixFQUNwQixVQUFrQjtRQUVsQixPQUFPLEdBQUcsWUFBWSxJQUFJLFVBQVUsS0FBSyxZQUFZLElBQUksVUFBVSxFQUFFLENBQUM7SUFDeEUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbW9kdWxlIGludGVncmF0aW9ucy9ncmFwaC9wbGFubmluZy9HcmFwaFJlbGF0aW9uUmVzb2x2ZXJcbiAqIEBzdW1tYXJ5IE5vcm1hbGl6ZXMgd29ya2Zsb3cgcmVsYXRpb25zIGludG8gZXhlY3V0aW9uIGVkZ2VzLlxuICogQGRlc2NyaXB0aW9uIFJlc29sdmVzIHdvcmtmbG93IGJvdW5kYXJ5IGFsaWFzZXMsIHZhbGlkYXRlcyBlbmRwb2ludHMgYW5kIHBvcnRzLCBhbmQgcHJvZHVjZXMgc3RhYmxlIGVkZ2UgSURzLlxuICovXG5pbXBvcnQgdHlwZSB7XG4gIEdyYXBoUG9ydERlZmluaXRpb24sXG4gIEdyYXBoV29ya2Zsb3dEZWZpbml0aW9uLFxuICBHcmFwaFdvcmtmbG93UmVsYXRpb25NZXRhZGF0YSxcbn0gZnJvbSBcIkBkZWNhZi10cy91aS1kZWNvcmF0b3JzL2dyYXBoXCI7XG5pbXBvcnQgeyBncmFwaERlZmluaXRpb25PZiB9IGZyb20gXCJAZGVjYWYtdHMvdWktZGVjb3JhdG9ycy9ncmFwaFwiO1xuXG5pbXBvcnQgeyBHUkFQSF9XT1JLRkxPV19CT1VOREFSWSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IEdyYXBoUG9ydEVycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy9HcmFwaFBvcnRFcnJvclwiO1xuaW1wb3J0IHsgR3JhcGhUb3BvbG9neUVycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy9HcmFwaFRvcG9sb2d5RXJyb3JcIjtcbmltcG9ydCB0eXBlIHsgR3JhcGhFeGVjdXRpb25QbGFuRWRnZSB9IGZyb20gXCIuL0dyYXBoRXhlY3V0aW9uUGxhbkVkZ2VcIjtcblxuLyoqXG4gKiBSZXNvbHZlcyByYXcgd29ya2Zsb3cgcmVsYXRpb24gbWV0YWRhdGEgaW50byBub3JtYWxpemVkIGV4ZWN1dGlvbiBlZGdlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEdyYXBoUmVsYXRpb25SZXNvbHZlciB7XG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhbGwgcmVsYXRpb25zIG9mIGEgd29ya2Zsb3cgaW50byBleGVjdXRpb24gZWRnZXMuXG4gICAqXG4gICAqIEBwYXJhbSB3b3JrZmxvdyAtIFRoZSB3b3JrZmxvdyBkZWZpbml0aW9uLlxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBub3JtYWxpemVkIGVkZ2VzLlxuICAgKiBAdGhyb3dzIHtHcmFwaFRvcG9sb2d5RXJyb3J9IHdoZW4gYW4gZW5kcG9pbnQgaXMgdW5rbm93biBvciBhbWJpZ3VvdXMuXG4gICAqIEB0aHJvd3Mge0dyYXBoUG9ydEVycm9yfSB3aGVuIGEgcmVmZXJlbmNlZCBwb3J0IGlzIG1pc3Npbmcgb3IgdW5rbm93bi5cbiAgICovXG4gIHJlc29sdmUod29ya2Zsb3c6IEdyYXBoV29ya2Zsb3dEZWZpbml0aW9uKTogR3JhcGhFeGVjdXRpb25QbGFuRWRnZVtdIHtcbiAgICBjb25zdCBub2RlSWRzID0gbmV3IFNldCh3b3JrZmxvdy5ub2Rlcy5tYXAoKG4pID0+IG4uaWQpKTtcbiAgICBjb25zdCBib3VuZGFyeUFsaWFzZXMgPSB0aGlzLmJvdW5kYXJ5QWxpYXNlcyh3b3JrZmxvdyk7XG4gICAgY29uc3QgaW5wdXRQb3J0cyA9IHRoaXMucG9ydE5hbWVzKHdvcmtmbG93LmlucHV0cyk7XG4gICAgY29uc3Qgb3V0cHV0UG9ydHMgPSB0aGlzLnBvcnROYW1lcyh3b3JrZmxvdy5vdXRwdXRzKTtcbiAgICBjb25zdCBub2RlUG9ydE1hcCA9IHRoaXMuYnVpbGROb2RlUG9ydE1hcCh3b3JrZmxvdyk7XG5cbiAgICBjb25zdCBlZGdlczogR3JhcGhFeGVjdXRpb25QbGFuRWRnZVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHJlbGF0aW9uIG9mIHdvcmtmbG93LnJlbGF0aW9ucyA/PyBbXSkge1xuICAgICAgY29uc3QgZWRnZSA9IHRoaXMucmVzb2x2ZVJlbGF0aW9uKFxuICAgICAgICByZWxhdGlvbixcbiAgICAgICAgbm9kZUlkcyxcbiAgICAgICAgYm91bmRhcnlBbGlhc2VzLFxuICAgICAgICBpbnB1dFBvcnRzLFxuICAgICAgICBvdXRwdXRQb3J0cyxcbiAgICAgICAgbm9kZVBvcnRNYXBcbiAgICAgICk7XG4gICAgICBlZGdlcy5wdXNoKGVkZ2UpO1xuICAgIH1cblxuICAgIHJldHVybiBlZGdlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhIHNpbmdsZSByZWxhdGlvbiBpbnRvIGFuIGVkZ2UuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVSZWxhdGlvbihcbiAgICByZWxhdGlvbjogR3JhcGhXb3JrZmxvd1JlbGF0aW9uTWV0YWRhdGEsXG4gICAgbm9kZUlkczogU2V0PHN0cmluZz4sXG4gICAgYm91bmRhcnlBbGlhc2VzOiBTZXQ8c3RyaW5nPixcbiAgICBpbnB1dFBvcnRzOiBTZXQ8c3RyaW5nPixcbiAgICBvdXRwdXRQb3J0czogU2V0PHN0cmluZz4sXG4gICAgbm9kZVBvcnRNYXA6IE1hcDxzdHJpbmcsIHsgaW5wdXQ6IFNldDxzdHJpbmc+OyBvdXRwdXQ6IFNldDxzdHJpbmc+IH0+XG4gICk6IEdyYXBoRXhlY3V0aW9uUGxhbkVkZ2Uge1xuICAgIGNvbnN0IHNvdXJjZU5vZGVJZCA9IHRoaXMucmVzb2x2ZUVuZHBvaW50KFxuICAgICAgcmVsYXRpb24uc291cmNlLFxuICAgICAgbm9kZUlkcyxcbiAgICAgIGJvdW5kYXJ5QWxpYXNlc1xuICAgICk7XG4gICAgY29uc3QgdGFyZ2V0Tm9kZUlkID0gdGhpcy5yZXNvbHZlRW5kcG9pbnQoXG4gICAgICByZWxhdGlvbi50YXJnZXQsXG4gICAgICBub2RlSWRzLFxuICAgICAgYm91bmRhcnlBbGlhc2VzXG4gICAgKTtcblxuICAgIGNvbnN0IHNvdXJjZVBvcnQgPSByZWxhdGlvbi5zb3VyY2VQb3J0O1xuICAgIGNvbnN0IHRhcmdldFBvcnQgPSByZWxhdGlvbi50YXJnZXRQb3J0O1xuXG4gICAgaWYgKCFzb3VyY2VQb3J0KSB7XG4gICAgICB0aHJvdyBuZXcgR3JhcGhQb3J0RXJyb3IoXG4gICAgICAgIGBSZWxhdGlvbiBpcyBtaXNzaW5nIHNvdXJjZVBvcnQgKHNvdXJjZTogJHtTdHJpbmcocmVsYXRpb24uc291cmNlKX0sIHRhcmdldDogJHtTdHJpbmcocmVsYXRpb24udGFyZ2V0KX0pYCxcbiAgICAgICAgeyByZWxhdGlvbiB9XG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXRhcmdldFBvcnQpIHtcbiAgICAgIHRocm93IG5ldyBHcmFwaFBvcnRFcnJvcihcbiAgICAgICAgYFJlbGF0aW9uIGlzIG1pc3NpbmcgdGFyZ2V0UG9ydCAoc291cmNlOiAke1N0cmluZyhyZWxhdGlvbi5zb3VyY2UpfSwgdGFyZ2V0OiAke1N0cmluZyhyZWxhdGlvbi50YXJnZXQpfSlgLFxuICAgICAgICB7IHJlbGF0aW9uIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy52YWxpZGF0ZVBvcnQoXG4gICAgICBzb3VyY2VOb2RlSWQsXG4gICAgICBzb3VyY2VQb3J0LFxuICAgICAgdHJ1ZSxcbiAgICAgIGJvdW5kYXJ5QWxpYXNlcyxcbiAgICAgIGlucHV0UG9ydHMsXG4gICAgICBvdXRwdXRQb3J0cyxcbiAgICAgIG5vZGVQb3J0TWFwXG4gICAgKTtcbiAgICB0aGlzLnZhbGlkYXRlUG9ydChcbiAgICAgIHRhcmdldE5vZGVJZCxcbiAgICAgIHRhcmdldFBvcnQsXG4gICAgICBmYWxzZSxcbiAgICAgIGJvdW5kYXJ5QWxpYXNlcyxcbiAgICAgIGlucHV0UG9ydHMsXG4gICAgICBvdXRwdXRQb3J0cyxcbiAgICAgIG5vZGVQb3J0TWFwXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBpZDogdGhpcy5jcmVhdGVFZGdlSWQoc291cmNlTm9kZUlkLCBzb3VyY2VQb3J0LCB0YXJnZXROb2RlSWQsIHRhcmdldFBvcnQpLFxuICAgICAgc291cmNlTm9kZUlkLFxuICAgICAgc291cmNlUG9ydCxcbiAgICAgIHRhcmdldE5vZGVJZCxcbiAgICAgIHRhcmdldFBvcnQsXG4gICAgICBsYWJlbDogcmVsYXRpb24ubGFiZWwsXG4gICAgICBtZXRhZGF0YTogcmVsYXRpb24ubWV0YWRhdGEsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhbiBlbmRwb2ludCAoc291cmNlIG9yIHRhcmdldCkgdG8gYSBub2RlIGlkIG9yIHRoZSB3b3JrZmxvdyBib3VuZGFyeS5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUVuZHBvaW50KFxuICAgIGVuZHBvaW50OiBzdHJpbmcgfCB1bmtub3duLFxuICAgIG5vZGVJZHM6IFNldDxzdHJpbmc+LFxuICAgIGJvdW5kYXJ5QWxpYXNlczogU2V0PHN0cmluZz5cbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gU3RyaW5nKGVuZHBvaW50KTtcbiAgICBpZiAoYm91bmRhcnlBbGlhc2VzLmhhcyhuYW1lKSkgcmV0dXJuIEdSQVBIX1dPUktGTE9XX0JPVU5EQVJZO1xuICAgIGlmIChub2RlSWRzLmhhcyhuYW1lKSkgcmV0dXJuIG5hbWU7XG4gICAgdGhyb3cgbmV3IEdyYXBoVG9wb2xvZ3lFcnJvcihcbiAgICAgIGBVbmtub3duIGVuZHBvaW50ICcke25hbWV9J2AsXG4gICAgICB7IGVuZHBvaW50OiBuYW1lLCBrbm93bk5vZGVzOiBBcnJheS5mcm9tKG5vZGVJZHMpIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGF0IGEgcG9ydCBleGlzdHMgb24gdGhlIGdpdmVuIG5vZGUgb3IgYm91bmRhcnkuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlUG9ydChcbiAgICBub2RlSWQ6IHN0cmluZyxcbiAgICBwb3J0OiBzdHJpbmcsXG4gICAgaXNTb3VyY2U6IGJvb2xlYW4sXG4gICAgYm91bmRhcnlBbGlhc2VzOiBTZXQ8c3RyaW5nPixcbiAgICBpbnB1dFBvcnRzOiBTZXQ8c3RyaW5nPixcbiAgICBvdXRwdXRQb3J0czogU2V0PHN0cmluZz4sXG4gICAgbm9kZVBvcnRNYXA6IE1hcDxzdHJpbmcsIHsgaW5wdXQ6IFNldDxzdHJpbmc+OyBvdXRwdXQ6IFNldDxzdHJpbmc+IH0+XG4gICk6IHZvaWQge1xuICAgIGlmIChub2RlSWQgPT09IEdSQVBIX1dPUktGTE9XX0JPVU5EQVJZKSB7XG4gICAgICBjb25zdCBwb3J0cyA9IGlzU291cmNlID8gaW5wdXRQb3J0cyA6IG91dHB1dFBvcnRzO1xuICAgICAgaWYgKCFwb3J0cy5oYXMocG9ydCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEdyYXBoUG9ydEVycm9yKFxuICAgICAgICAgIGBVbmtub3duICR7aXNTb3VyY2UgPyBcImlucHV0XCIgOiBcIm91dHB1dFwifSBwb3J0ICcke3BvcnR9JyBvbiB3b3JrZmxvdyBib3VuZGFyeWAsXG4gICAgICAgICAgeyBub2RlSWQsIHBvcnQsIGlzU291cmNlLCBhdmFpbGFibGU6IEFycmF5LmZyb20ocG9ydHMpIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBub2RlUG9ydHMgPSBub2RlUG9ydE1hcC5nZXQobm9kZUlkKTtcbiAgICBpZiAoIW5vZGVQb3J0cykge1xuICAgICAgdGhyb3cgbmV3IEdyYXBoVG9wb2xvZ3lFcnJvcihgTm8gcG9ydCBtYXAgZm9yIG5vZGUgJyR7bm9kZUlkfSdgLCB7XG4gICAgICAgIG5vZGVJZCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHBvcnRzID0gaXNTb3VyY2UgPyBub2RlUG9ydHMub3V0cHV0IDogbm9kZVBvcnRzLmlucHV0O1xuICAgIGlmICghcG9ydHMuaGFzKHBvcnQpKSB7XG4gICAgICB0aHJvdyBuZXcgR3JhcGhQb3J0RXJyb3IoXG4gICAgICAgIGBVbmtub3duICR7aXNTb3VyY2UgPyBcIm91dHB1dFwiIDogXCJpbnB1dFwifSBwb3J0ICcke3BvcnR9JyBvbiBub2RlICcke25vZGVJZH0nYCxcbiAgICAgICAgeyBub2RlSWQsIHBvcnQsIGlzU291cmNlLCBhdmFpbGFibGU6IEFycmF5LmZyb20ocG9ydHMpIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgc2V0IG9mIGJvdW5kYXJ5IGFsaWFzZXMgZm9yIGEgd29ya2Zsb3cuXG4gICAqL1xuICBwcml2YXRlIGJvdW5kYXJ5QWxpYXNlcyh3b3JrZmxvdzogR3JhcGhXb3JrZmxvd0RlZmluaXRpb24pOiBTZXQ8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBTZXQoW1xuICAgICAgR1JBUEhfV09SS0ZMT1dfQk9VTkRBUlksXG4gICAgICBcIndvcmtmbG93XCIsXG4gICAgICBcImdyYXBoXCIsXG4gICAgICB3b3JrZmxvdy5uYW1lLFxuICAgIF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3RzIHBvcnQgbmFtZXMgZnJvbSBhIGxpc3Qgb2YgcG9ydCBkZWZpbml0aW9ucy5cbiAgICovXG4gIHByaXZhdGUgcG9ydE5hbWVzKHBvcnRzOiBHcmFwaFBvcnREZWZpbml0aW9uW10gfCB1bmRlZmluZWQpOiBTZXQ8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBTZXQoKHBvcnRzID8/IFtdKS5tYXAoKHApID0+IHAubmFtZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIG1hcCBvZiBub2RlIGlkIC0+IHsgaW5wdXQgcG9ydHMsIG91dHB1dCBwb3J0cyB9LlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZE5vZGVQb3J0TWFwKFxuICAgIHdvcmtmbG93OiBHcmFwaFdvcmtmbG93RGVmaW5pdGlvblxuICApOiBNYXA8c3RyaW5nLCB7IGlucHV0OiBTZXQ8c3RyaW5nPjsgb3V0cHV0OiBTZXQ8c3RyaW5nPiB9PiB7XG4gICAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIHsgaW5wdXQ6IFNldDxzdHJpbmc+OyBvdXRwdXQ6IFNldDxzdHJpbmc+IH0+KCk7XG4gICAgZm9yIChjb25zdCBub2RlTWV0YSBvZiB3b3JrZmxvdy5ub2RlcyA/PyBbXSkge1xuICAgICAgY29uc3QgaW5wdXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGNvbnN0IG91dHB1dCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgY29uc3QgZGVmID0gdGhpcy5yZXNvbHZlTm9kZURlZmluaXRpb24obm9kZU1ldGEpO1xuICAgICAgaWYgKGRlZikge1xuICAgICAgICBmb3IgKGNvbnN0IHBvcnQgb2YgZGVmLnBvcnRzID8/IFtdKSB7XG4gICAgICAgICAgaWYgKHBvcnQuZGlyZWN0aW9uID09PSBcImlucHV0XCIpIGlucHV0LmFkZChwb3J0Lm5hbWUpO1xuICAgICAgICAgIGVsc2Ugb3V0cHV0LmFkZChwb3J0Lm5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBtYXAuc2V0KG5vZGVNZXRhLmlkLCB7IGlucHV0LCBvdXRwdXQgfSk7XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICAvKipcbiAgICogQXR0ZW1wdHMgdG8gcmVzb2x2ZSBhIG5vZGUncyBmdWxsIGRlZmluaXRpb24gZnJvbSBpdHMgbWV0YWRhdGEuXG4gICAqXG4gICAqIEFjY2VwdHMgZWl0aGVyIGEgZGVjb3JhdGVkIE1vZGVsIGNsYXNzL2luc3RhbmNlIChyZXNvbHZlZCB2aWFcbiAgICogYGdyYXBoRGVmaW5pdGlvbk9mYCkgb3IgYSBwbGFpbiBgR3JhcGhOb2RlRGVmaW5pdGlvbmAtc2hhcGVkIG9iamVjdFxuICAgKiAodXNlZnVsIGZvciBzZXJpYWxpemVkIHdvcmtmbG93cyB0aGF0IGlubGluZSBub2RlIGRlZmluaXRpb25zKS5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZU5vZGVEZWZpbml0aW9uKFxuICAgIG5vZGVNZXRhOiB7IG5vZGU/OiB1bmtub3duOyBraW5kPzogc3RyaW5nIH1cbiAgKTogeyBwb3J0czogeyBkaXJlY3Rpb246IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSB9IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAobm9kZU1ldGEubm9kZSkge1xuICAgICAgaWYgKHRoaXMuaXNSYXdEZWZpbml0aW9uKG5vZGVNZXRhLm5vZGUpKSB7XG4gICAgICAgIHJldHVybiBub2RlTWV0YS5ub2RlIGFzIHtcbiAgICAgICAgICBwb3J0czogeyBkaXJlY3Rpb246IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRlZiA9IGdyYXBoRGVmaW5pdGlvbk9mKG5vZGVNZXRhLm5vZGUgYXMgYW55KTtcbiAgICAgICAgcmV0dXJuIGRlZiBhcyBhbnk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCB3aGVuIGEgdmFsdWUgbG9va3MgbGlrZSBhIHJhdyB7QGxpbmsgR3JhcGhOb2RlRGVmaW5pdGlvbn1cbiAgICogKGEgcGxhaW4gb2JqZWN0IHdpdGggYSBgcG9ydHNgIGFycmF5IGFuZCBhIGBuYW1lYCBzdHJpbmcpLlxuICAgKi9cbiAgcHJpdmF0ZSBpc1Jhd0RlZmluaXRpb24odmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgICB0eXBlb2YgKHZhbHVlIGFzIHsgbmFtZT86IHVua25vd24gfSkubmFtZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgQXJyYXkuaXNBcnJheSgodmFsdWUgYXMgeyBwb3J0cz86IHVua25vd24gfSkucG9ydHMpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgc3RhYmxlIGVkZ2UgaWQgZnJvbSBpdHMgZW5kcG9pbnRzIGFuZCBwb3J0cy5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRWRnZUlkKFxuICAgIHNvdXJjZU5vZGVJZDogc3RyaW5nLFxuICAgIHNvdXJjZVBvcnQ6IHN0cmluZyxcbiAgICB0YXJnZXROb2RlSWQ6IHN0cmluZyxcbiAgICB0YXJnZXRQb3J0OiBzdHJpbmdcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7c291cmNlTm9kZUlkfToke3NvdXJjZVBvcnR9LT4ke3RhcmdldE5vZGVJZH06JHt0YXJnZXRQb3J0fWA7XG4gIH1cbn1cbiJdfQ==
|
|
172
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGhSZWxhdGlvblJlc29sdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiR3JhcGhSZWxhdGlvblJlc29sdmVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlEQUFrRTtBQUNsRSxvREFBNEQ7QUFDNUQscUVBQStEO0FBQy9ELDZFQUF1RTtBQUN2RTs7R0FFRztBQUNILE1BQWEscUJBQXFCO0lBQzlCOzs7Ozs7O09BT0c7SUFDSCxPQUFPLENBQUMsUUFBUTtRQUNaLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6RCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwRCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDakIsS0FBSyxNQUFNLFFBQVEsSUFBSSxRQUFRLENBQUMsU0FBUyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQzlDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUM1RyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBQ0Q7O09B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Z0JBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBQSx5QkFBaUIsRUFBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzdDLE9BQU8sR0FBRyxDQUFDO1lBQ2YsQ0FBQztZQUNELE1BQU0sQ0FBQztnQkFDSCxPQUFPLFNBQVMsQ0FBQztZQUNyQixDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFDRDs7O09BR0c7SUFDSCxlQUFlLENBQUMsS0FBSztRQUNqQixPQUFPLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUTtZQUM3QixLQUFLLEtBQUssSUFBSTtZQUNkLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDckIsT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVE7WUFDOUIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBQ0Q7O09BRUc7SUFDSCxZQUFZLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsVUFBVTtRQUMzRCxPQUFPLEdBQUcsWUFBWSxJQUFJLFVBQVUsS0FBSyxZQUFZLElBQUksVUFBVSxFQUFFLENBQUM7SUFDMUUsQ0FBQztDQUNKO0FBOUpELHNEQThKQztBQUNELDhsakJBQThsakIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBncmFwaERlZmluaXRpb25PZiB9IGZyb20gXCJAZGVjYWYtdHMvdWktZGVjb3JhdG9ycy9ncmFwaFwiO1xuaW1wb3J0IHsgR1JBUEhfV09SS0ZMT1dfQk9VTkRBUlkgfSBmcm9tIFwiLi8uLi9jb25zdGFudHMuanNcIjtcbmltcG9ydCB7IEdyYXBoUG9ydEVycm9yIH0gZnJvbSBcIi4vLi4vZXJyb3JzL0dyYXBoUG9ydEVycm9yLmpzXCI7XG5pbXBvcnQgeyBHcmFwaFRvcG9sb2d5RXJyb3IgfSBmcm9tIFwiLi8uLi9lcnJvcnMvR3JhcGhUb3BvbG9neUVycm9yLmpzXCI7XG4vKipcbiAqIFJlc29sdmVzIHJhdyB3b3JrZmxvdyByZWxhdGlvbiBtZXRhZGF0YSBpbnRvIG5vcm1hbGl6ZWQgZXhlY3V0aW9uIGVkZ2VzLlxuICovXG5leHBvcnQgY2xhc3MgR3JhcGhSZWxhdGlvblJlc29sdmVyIHtcbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyBhbGwgcmVsYXRpb25zIG9mIGEgd29ya2Zsb3cgaW50byBleGVjdXRpb24gZWRnZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gd29ya2Zsb3cgLSBUaGUgd29ya2Zsb3cgZGVmaW5pdGlvbi5cbiAgICAgKiBAcmV0dXJucyBBcnJheSBvZiBub3JtYWxpemVkIGVkZ2VzLlxuICAgICAqIEB0aHJvd3Mge0dyYXBoVG9wb2xvZ3lFcnJvcn0gd2hlbiBhbiBlbmRwb2ludCBpcyB1bmtub3duIG9yIGFtYmlndW91cy5cbiAgICAgKiBAdGhyb3dzIHtHcmFwaFBvcnRFcnJvcn0gd2hlbiBhIHJlZmVyZW5jZWQgcG9ydCBpcyBtaXNzaW5nIG9yIHVua25vd24uXG4gICAgICovXG4gICAgcmVzb2x2ZSh3b3JrZmxvdykge1xuICAgICAgICBjb25zdCBub2RlSWRzID0gbmV3IFNldCh3b3JrZmxvdy5ub2Rlcy5tYXAoKG4pID0+IG4uaWQpKTtcbiAgICAgICAgY29uc3QgYm91bmRhcnlBbGlhc2VzID0gdGhpcy5ib3VuZGFyeUFsaWFzZXMod29ya2Zsb3cpO1xuICAgICAgICBjb25zdCBpbnB1dFBvcnRzID0gdGhpcy5wb3J0TmFtZXMod29ya2Zsb3cuaW5wdXRzKTtcbiAgICAgICAgY29uc3Qgb3V0cHV0UG9ydHMgPSB0aGlzLnBvcnROYW1lcyh3b3JrZmxvdy5vdXRwdXRzKTtcbiAgICAgICAgY29uc3Qgbm9kZVBvcnRNYXAgPSB0aGlzLmJ1aWxkTm9kZVBvcnRNYXAod29ya2Zsb3cpO1xuICAgICAgICBjb25zdCBlZGdlcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJlbGF0aW9uIG9mIHdvcmtmbG93LnJlbGF0aW9ucyA/PyBbXSkge1xuICAgICAgICAgICAgY29uc3QgZWRnZSA9IHRoaXMucmVzb2x2ZVJlbGF0aW9uKHJlbGF0aW9uLCBub2RlSWRzLCBib3VuZGFyeUFsaWFzZXMsIGlucHV0UG9ydHMsIG91dHB1dFBvcnRzLCBub2RlUG9ydE1hcCk7XG4gICAgICAgICAgICBlZGdlcy5wdXNoKGVkZ2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlZGdlcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzb2x2ZXMgYSBzaW5nbGUgcmVsYXRpb24gaW50byBhbiBlZGdlLlxuICAgICAqL1xuICAgIHJlc29sdmVSZWxhdGlvbihyZWxhdGlvbiwgbm9kZUlkcywgYm91bmRhcnlBbGlhc2VzLCBpbnB1dFBvcnRzLCBvdXRwdXRQb3J0cywgbm9kZVBvcnRNYXApIHtcbiAgICAgICAgY29uc3Qgc291cmNlTm9kZUlkID0gdGhpcy5yZXNvbHZlRW5kcG9pbnQocmVsYXRpb24uc291cmNlLCBub2RlSWRzLCBib3VuZGFyeUFsaWFzZXMpO1xuICAgICAgICBjb25zdCB0YXJnZXROb2RlSWQgPSB0aGlzLnJlc29sdmVFbmRwb2ludChyZWxhdGlvbi50YXJnZXQsIG5vZGVJZHMsIGJvdW5kYXJ5QWxpYXNlcyk7XG4gICAgICAgIGNvbnN0IHNvdXJjZVBvcnQgPSByZWxhdGlvbi5zb3VyY2VQb3J0O1xuICAgICAgICBjb25zdCB0YXJnZXRQb3J0ID0gcmVsYXRpb24udGFyZ2V0UG9ydDtcbiAgICAgICAgaWYgKCFzb3VyY2VQb3J0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgR3JhcGhQb3J0RXJyb3IoYFJlbGF0aW9uIGlzIG1pc3Npbmcgc291cmNlUG9ydCAoc291cmNlOiAke1N0cmluZyhyZWxhdGlvbi5zb3VyY2UpfSwgdGFyZ2V0OiAke1N0cmluZyhyZWxhdGlvbi50YXJnZXQpfSlgLCB7IHJlbGF0aW9uIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGFyZ2V0UG9ydCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEdyYXBoUG9ydEVycm9yKGBSZWxhdGlvbiBpcyBtaXNzaW5nIHRhcmdldFBvcnQgKHNvdXJjZTogJHtTdHJpbmcocmVsYXRpb24uc291cmNlKX0sIHRhcmdldDogJHtTdHJpbmcocmVsYXRpb24udGFyZ2V0KX0pYCwgeyByZWxhdGlvbiB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbGlkYXRlUG9ydChzb3VyY2VOb2RlSWQsIHNvdXJjZVBvcnQsIHRydWUsIGJvdW5kYXJ5QWxpYXNlcywgaW5wdXRQb3J0cywgb3V0cHV0UG9ydHMsIG5vZGVQb3J0TWFwKTtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVBvcnQodGFyZ2V0Tm9kZUlkLCB0YXJnZXRQb3J0LCBmYWxzZSwgYm91bmRhcnlBbGlhc2VzLCBpbnB1dFBvcnRzLCBvdXRwdXRQb3J0cywgbm9kZVBvcnRNYXApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IHRoaXMuY3JlYXRlRWRnZUlkKHNvdXJjZU5vZGVJZCwgc291cmNlUG9ydCwgdGFyZ2V0Tm9kZUlkLCB0YXJnZXRQb3J0KSxcbiAgICAgICAgICAgIHNvdXJjZU5vZGVJZCxcbiAgICAgICAgICAgIHNvdXJjZVBvcnQsXG4gICAgICAgICAgICB0YXJnZXROb2RlSWQsXG4gICAgICAgICAgICB0YXJnZXRQb3J0LFxuICAgICAgICAgICAgbGFiZWw6IHJlbGF0aW9uLmxhYmVsLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHJlbGF0aW9uLm1ldGFkYXRhLFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyBhbiBlbmRwb2ludCAoc291cmNlIG9yIHRhcmdldCkgdG8gYSBub2RlIGlkIG9yIHRoZSB3b3JrZmxvdyBib3VuZGFyeS5cbiAgICAgKi9cbiAgICByZXNvbHZlRW5kcG9pbnQoZW5kcG9pbnQsIG5vZGVJZHMsIGJvdW5kYXJ5QWxpYXNlcykge1xuICAgICAgICBjb25zdCBuYW1lID0gU3RyaW5nKGVuZHBvaW50KTtcbiAgICAgICAgaWYgKGJvdW5kYXJ5QWxpYXNlcy5oYXMobmFtZSkpXG4gICAgICAgICAgICByZXR1cm4gR1JBUEhfV09SS0ZMT1dfQk9VTkRBUlk7XG4gICAgICAgIGlmIChub2RlSWRzLmhhcyhuYW1lKSlcbiAgICAgICAgICAgIHJldHVybiBuYW1lO1xuICAgICAgICB0aHJvdyBuZXcgR3JhcGhUb3BvbG9neUVycm9yKGBVbmtub3duIGVuZHBvaW50ICcke25hbWV9J2AsIHsgZW5kcG9pbnQ6IG5hbWUsIGtub3duTm9kZXM6IEFycmF5LmZyb20obm9kZUlkcykgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlcyB0aGF0IGEgcG9ydCBleGlzdHMgb24gdGhlIGdpdmVuIG5vZGUgb3IgYm91bmRhcnkuXG4gICAgICovXG4gICAgdmFsaWRhdGVQb3J0KG5vZGVJZCwgcG9ydCwgaXNTb3VyY2UsIGJvdW5kYXJ5QWxpYXNlcywgaW5wdXRQb3J0cywgb3V0cHV0UG9ydHMsIG5vZGVQb3J0TWFwKSB7XG4gICAgICAgIGlmIChub2RlSWQgPT09IEdSQVBIX1dPUktGTE9XX0JPVU5EQVJZKSB7XG4gICAgICAgICAgICBjb25zdCBwb3J0cyA9IGlzU291cmNlID8gaW5wdXRQb3J0cyA6IG91dHB1dFBvcnRzO1xuICAgICAgICAgICAgaWYgKCFwb3J0cy5oYXMocG9ydCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR3JhcGhQb3J0RXJyb3IoYFVua25vd24gJHtpc1NvdXJjZSA/IFwiaW5wdXRcIiA6IFwib3V0cHV0XCJ9IHBvcnQgJyR7cG9ydH0nIG9uIHdvcmtmbG93IGJvdW5kYXJ5YCwgeyBub2RlSWQsIHBvcnQsIGlzU291cmNlLCBhdmFpbGFibGU6IEFycmF5LmZyb20ocG9ydHMpIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5vZGVQb3J0cyA9IG5vZGVQb3J0TWFwLmdldChub2RlSWQpO1xuICAgICAgICBpZiAoIW5vZGVQb3J0cykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEdyYXBoVG9wb2xvZ3lFcnJvcihgTm8gcG9ydCBtYXAgZm9yIG5vZGUgJyR7bm9kZUlkfSdgLCB7XG4gICAgICAgICAgICAgICAgbm9kZUlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcG9ydHMgPSBpc1NvdXJjZSA/IG5vZGVQb3J0cy5vdXRwdXQgOiBub2RlUG9ydHMuaW5wdXQ7XG4gICAgICAgIGlmICghcG9ydHMuaGFzKHBvcnQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgR3JhcGhQb3J0RXJyb3IoYFVua25vd24gJHtpc1NvdXJjZSA/IFwib3V0cHV0XCIgOiBcImlucHV0XCJ9IHBvcnQgJyR7cG9ydH0nIG9uIG5vZGUgJyR7bm9kZUlkfSdgLCB7IG5vZGVJZCwgcG9ydCwgaXNTb3VyY2UsIGF2YWlsYWJsZTogQXJyYXkuZnJvbShwb3J0cykgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQnVpbGRzIHRoZSBzZXQgb2YgYm91bmRhcnkgYWxpYXNlcyBmb3IgYSB3b3JrZmxvdy5cbiAgICAgKi9cbiAgICBib3VuZGFyeUFsaWFzZXMod29ya2Zsb3cpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXQoW1xuICAgICAgICAgICAgR1JBUEhfV09SS0ZMT1dfQk9VTkRBUlksXG4gICAgICAgICAgICBcIndvcmtmbG93XCIsXG4gICAgICAgICAgICBcImdyYXBoXCIsXG4gICAgICAgICAgICB3b3JrZmxvdy5uYW1lLFxuICAgICAgICBdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXh0cmFjdHMgcG9ydCBuYW1lcyBmcm9tIGEgbGlzdCBvZiBwb3J0IGRlZmluaXRpb25zLlxuICAgICAqL1xuICAgIHBvcnROYW1lcyhwb3J0cykge1xuICAgICAgICByZXR1cm4gbmV3IFNldCgocG9ydHMgPz8gW10pLm1hcCgocCkgPT4gcC5uYW1lKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBhIG1hcCBvZiBub2RlIGlkIC0+IHsgaW5wdXQgcG9ydHMsIG91dHB1dCBwb3J0cyB9LlxuICAgICAqL1xuICAgIGJ1aWxkTm9kZVBvcnRNYXAod29ya2Zsb3cpIHtcbiAgICAgICAgY29uc3QgbWFwID0gbmV3IE1hcCgpO1xuICAgICAgICBmb3IgKGNvbnN0IG5vZGVNZXRhIG9mIHdvcmtmbG93Lm5vZGVzID8/IFtdKSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIGNvbnN0IGRlZiA9IHRoaXMucmVzb2x2ZU5vZGVEZWZpbml0aW9uKG5vZGVNZXRhKTtcbiAgICAgICAgICAgIGlmIChkZWYpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBvcnQgb2YgZGVmLnBvcnRzID8/IFtdKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3J0LmRpcmVjdGlvbiA9PT0gXCJpbnB1dFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuYWRkKHBvcnQubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5hZGQocG9ydC5uYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtYXAuc2V0KG5vZGVNZXRhLmlkLCB7IGlucHV0LCBvdXRwdXQgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXR0ZW1wdHMgdG8gcmVzb2x2ZSBhIG5vZGUncyBmdWxsIGRlZmluaXRpb24gZnJvbSBpdHMgbWV0YWRhdGEuXG4gICAgICpcbiAgICAgKiBBY2NlcHRzIGVpdGhlciBhIGRlY29yYXRlZCBNb2RlbCBjbGFzcy9pbnN0YW5jZSAocmVzb2x2ZWQgdmlhXG4gICAgICogYGdyYXBoRGVmaW5pdGlvbk9mYCkgb3IgYSBwbGFpbiBgR3JhcGhOb2RlRGVmaW5pdGlvbmAtc2hhcGVkIG9iamVjdFxuICAgICAqICh1c2VmdWwgZm9yIHNlcmlhbGl6ZWQgd29ya2Zsb3dzIHRoYXQgaW5saW5lIG5vZGUgZGVmaW5pdGlvbnMpLlxuICAgICAqL1xuICAgIHJlc29sdmVOb2RlRGVmaW5pdGlvbihub2RlTWV0YSkge1xuICAgICAgICBpZiAobm9kZU1ldGEubm9kZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNSYXdEZWZpbml0aW9uKG5vZGVNZXRhLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGVNZXRhLm5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlZiA9IGdyYXBoRGVmaW5pdGlvbk9mKG5vZGVNZXRhLm5vZGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCB3aGVuIGEgdmFsdWUgbG9va3MgbGlrZSBhIHJhdyB7QGxpbmsgR3JhcGhOb2RlRGVmaW5pdGlvbn1cbiAgICAgKiAoYSBwbGFpbiBvYmplY3Qgd2l0aCBhIGBwb3J0c2AgYXJyYXkgYW5kIGEgYG5hbWVgIHN0cmluZykuXG4gICAgICovXG4gICAgaXNSYXdEZWZpbml0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUubmFtZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZS5wb3J0cykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc3RhYmxlIGVkZ2UgaWQgZnJvbSBpdHMgZW5kcG9pbnRzIGFuZCBwb3J0cy5cbiAgICAgKi9cbiAgICBjcmVhdGVFZGdlSWQoc291cmNlTm9kZUlkLCBzb3VyY2VQb3J0LCB0YXJnZXROb2RlSWQsIHRhcmdldFBvcnQpIHtcbiAgICAgICAgcmV0dXJuIGAke3NvdXJjZU5vZGVJZH06JHtzb3VyY2VQb3J0fS0+JHt0YXJnZXROb2RlSWR9OiR7dGFyZ2V0UG9ydH1gO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSm1hV3hsSWpvaVIzSmhjR2hTWld4aGRHbHZibEpsYzI5c2RtVnlMbXB6SWl3aWMyOTFjbU5sVW05dmRDSTZJaUlzSW5OdmRYSmpaWE1pT2xzaUxpNHZMaTR2TGk0dkxpNHZjM0pqTDJkeVlYQm9MM0JzWVc1dWFXNW5MMGR5WVhCb1VtVnNZWFJwYjI1U1pYTnZiSFpsY2k1MGN5SmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaVFVRlZRU3hQUVVGUExFVkJRVVVzYVVKQlFXbENMRVZCUVVVc1RVRkJUU3dyUWtGQkswSXNRMEZCUXp0QlFVVnNSU3hQUVVGUExFVkJRVVVzZFVKQlFYVkNMRVZCUVVVc01FSkJRWEZDTzBGQlEzWkVMRTlCUVU4c1JVRkJSU3hqUVVGakxFVkJRVVVzYzBOQlFXbERPMEZCUXpGRUxFOUJRVThzUlVGQlJTeHJRa0ZCYTBJc1JVRkJSU3d3UTBGQmNVTTdRVUZIYkVVN08wZEJSVWM3UVVGRFNDeE5RVUZOTEU5QlFVOHNjVUpCUVhGQ08wbEJRMmhET3pzN096czdPMDlCVDBjN1NVRkRTQ3hQUVVGUExFTkJRVU1zVVVGQmFVTTdVVUZEZGtNc1RVRkJUU3hQUVVGUExFZEJRVWNzU1VGQlNTeEhRVUZITEVOQlFVTXNVVUZCVVN4RFFVRkRMRXRCUVVzc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eERRVUZETEVWQlFVVXNSVUZCUlN4RFFVRkRMRU5CUVVNc1EwRkJReXhGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETzFGQlEzcEVMRTFCUVUwc1pVRkJaU3hIUVVGSExFbEJRVWtzUTBGQlF5eGxRVUZsTEVOQlFVTXNVVUZCVVN4RFFVRkRMRU5CUVVNN1VVRkRka1FzVFVGQlRTeFZRVUZWTEVkQlFVY3NTVUZCU1N4RFFVRkRMRk5CUVZNc1EwRkJReXhSUVVGUkxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTTdVVUZEYmtRc1RVRkJUU3hYUVVGWExFZEJRVWNzU1VGQlNTeERRVUZETEZOQlFWTXNRMEZCUXl4UlFVRlJMRU5CUVVNc1QwRkJUeXhEUVVGRExFTkJRVU03VVVGRGNrUXNUVUZCVFN4WFFVRlhMRWRCUVVjc1NVRkJTU3hEUVVGRExHZENRVUZuUWl4RFFVRkRMRkZCUVZFc1EwRkJReXhEUVVGRE8xRkJSWEJFTEUxQlFVMHNTMEZCU3l4SFFVRTJRaXhGUVVGRkxFTkJRVU03VVVGRk0wTXNTMEZCU3l4TlFVRk5MRkZCUVZFc1NVRkJTU3hSUVVGUkxFTkJRVU1zVTBGQlV5eEpRVUZKTEVWQlFVVXNSVUZCUlN4RFFVRkRPMWxCUTJoRUxFMUJRVTBzU1VGQlNTeEhRVUZITEVsQlFVa3NRMEZCUXl4bFFVRmxMRU5CUXk5Q0xGRkJRVkVzUlVGRFVpeFBRVUZQTEVWQlExQXNaVUZCWlN4RlFVTm1MRlZCUVZVc1JVRkRWaXhYUVVGWExFVkJRMWdzVjBGQlZ5eERRVU5hTEVOQlFVTTdXVUZEUml4TFFVRkxMRU5CUVVNc1NVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETzFGQlEyNUNMRU5CUVVNN1VVRkZSQ3hQUVVGUExFdEJRVXNzUTBGQlF6dEpRVU5tTEVOQlFVTTdTVUZGUkRzN1QwRkZSenRKUVVOTExHVkJRV1VzUTBGRGNrSXNVVUZCZFVNc1JVRkRka01zVDBGQmIwSXNSVUZEY0VJc1pVRkJORUlzUlVGRE5VSXNWVUZCZFVJc1JVRkRka0lzVjBGQmQwSXNSVUZEZUVJc1YwRkJjVVU3VVVGRmNrVXNUVUZCVFN4WlFVRlpMRWRCUVVjc1NVRkJTU3hEUVVGRExHVkJRV1VzUTBGRGRrTXNVVUZCVVN4RFFVRkRMRTFCUVUwc1JVRkRaaXhQUVVGUExFVkJRMUFzWlVGQlpTeERRVU5vUWl4RFFVRkRPMUZCUTBZc1RVRkJUU3haUVVGWkxFZEJRVWNzU1VGQlNTeERRVUZETEdWQlFXVXNRMEZEZGtNc1VVRkJVU3hEUVVGRExFMUJRVTBzUlVGRFppeFBRVUZQTEVWQlExQXNaVUZCWlN4RFFVTm9RaXhEUVVGRE8xRkJSVVlzVFVGQlRTeFZRVUZWTEVkQlFVY3NVVUZCVVN4RFFVRkRMRlZCUVZVc1EwRkJRenRSUVVOMlF5eE5RVUZOTEZWQlFWVXNSMEZCUnl4UlFVRlJMRU5CUVVNc1ZVRkJWU3hEUVVGRE8xRkJSWFpETEVsQlFVa3NRMEZCUXl4VlFVRlZMRVZCUVVVc1EwRkJRenRaUVVOb1FpeE5RVUZOTEVsQlFVa3NZMEZCWXl4RFFVTjBRaXd5UTBGQk1rTXNUVUZCVFN4RFFVRkRMRkZCUVZFc1EwRkJReXhOUVVGTkxFTkJRVU1zWVVGQllTeE5RVUZOTEVOQlFVTXNVVUZCVVN4RFFVRkRMRTFCUVUwc1EwRkJReXhIUVVGSExFVkJRM3BITEVWQlFVVXNVVUZCVVN4RlFVRkZMRU5CUTJJc1EwRkJRenRSUVVOS0xFTkJRVU03VVVGRFJDeEpRVUZKTEVOQlFVTXNWVUZCVlN4RlFVRkZMRU5CUVVNN1dVRkRhRUlzVFVGQlRTeEpRVUZKTEdOQlFXTXNRMEZEZEVJc01rTkJRVEpETEUxQlFVMHNRMEZCUXl4UlFVRlJMRU5CUVVNc1RVRkJUU3hEUVVGRExHRkJRV0VzVFVGQlRTeERRVUZETEZGQlFWRXNRMEZCUXl4TlFVRk5MRU5CUVVNc1IwRkJSeXhGUVVONlJ5eEZRVUZGTEZGQlFWRXNSVUZCUlN4RFFVTmlMRU5CUVVNN1VVRkRTaXhEUVVGRE8xRkJSVVFzU1VGQlNTeERRVUZETEZsQlFWa3NRMEZEWml4WlFVRlpMRVZCUTFvc1ZVRkJWU3hGUVVOV0xFbEJRVWtzUlVGRFNpeGxRVUZsTEVWQlEyWXNWVUZCVlN4RlFVTldMRmRCUVZjc1JVRkRXQ3hYUVVGWExFTkJRMW9zUTBGQlF6dFJRVU5HTEVsQlFVa3NRMEZCUXl4WlFVRlpMRU5CUTJZc1dVRkJXU3hGUVVOYUxGVkJRVlVzUlVGRFZpeExRVUZMTEVWQlEwd3NaVUZCWlN4RlFVTm1MRlZCUVZVc1JVRkRWaXhYUVVGWExFVkJRMWdzVjBGQlZ5eERRVU5hTEVOQlFVTTdVVUZGUml4UFFVRlBPMWxCUTB3c1JVRkJSU3hGUVVGRkxFbEJRVWtzUTBGQlF5eFpRVUZaTEVOQlFVTXNXVUZCV1N4RlFVRkZMRlZCUVZVc1JVRkJSU3haUVVGWkxFVkJRVVVzVlVGQlZTeERRVUZETzFsQlEzcEZMRmxCUVZrN1dVRkRXaXhWUVVGVk8xbEJRMVlzV1VGQldUdFpRVU5hTEZWQlFWVTdXVUZEVml4TFFVRkxMRVZCUVVVc1VVRkJVU3hEUVVGRExFdEJRVXM3V1VGRGNrSXNVVUZCVVN4RlFVRkZMRkZCUVZFc1EwRkJReXhSUVVGUk8xTkJRelZDTEVOQlFVTTdTVUZEU2l4RFFVRkRPMGxCUlVRN08wOUJSVWM3U1VGRFN5eGxRVUZsTEVOQlEzSkNMRkZCUVRCQ0xFVkJRekZDTEU5QlFXOUNMRVZCUTNCQ0xHVkJRVFJDTzFGQlJUVkNMRTFCUVUwc1NVRkJTU3hIUVVGSExFMUJRVTBzUTBGQlF5eFJRVUZSTEVOQlFVTXNRMEZCUXp0UlFVTTVRaXhKUVVGSkxHVkJRV1VzUTBGQlF5eEhRVUZITEVOQlFVTXNTVUZCU1N4RFFVRkRPMWxCUVVVc1QwRkJUeXgxUWtGQmRVSXNRMEZCUXp0UlFVTTVSQ3hKUVVGSkxFOUJRVThzUTBGQlF5eEhRVUZITEVOQlFVTXNTVUZCU1N4RFFVRkRPMWxCUVVVc1QwRkJUeXhKUVVGSkxFTkJRVU03VVVGRGJrTXNUVUZCVFN4SlFVRkpMR3RDUVVGclFpeERRVU14UWl4eFFrRkJjVUlzU1VGQlNTeEhRVUZITEVWQlF6VkNMRVZCUVVVc1VVRkJVU3hGUVVGRkxFbEJRVWtzUlVGQlJTeFZRVUZWTEVWQlFVVXNTMEZCU3l4RFFVRkRMRWxCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zUlVGQlJTeERRVU53UkN4RFFVRkRPMGxCUTBvc1EwRkJRenRKUVVWRU96dFBRVVZITzBsQlEwc3NXVUZCV1N4RFFVTnNRaXhOUVVGakxFVkJRMlFzU1VGQldTeEZRVU5hTEZGQlFXbENMRVZCUTJwQ0xHVkJRVFJDTEVWQlF6VkNMRlZCUVhWQ0xFVkJRM1pDTEZkQlFYZENMRVZCUTNoQ0xGZEJRWEZGTzFGQlJYSkZMRWxCUVVrc1RVRkJUU3hMUVVGTExIVkNRVUYxUWl4RlFVRkZMRU5CUVVNN1dVRkRka01zVFVGQlRTeExRVUZMTEVkQlFVY3NVVUZCVVN4RFFVRkRMRU5CUVVNc1EwRkJReXhWUVVGVkxFTkJRVU1zUTBGQlF5eERRVUZETEZkQlFWY3NRMEZCUXp0WlFVTnNSQ3hKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEVkQlFVY3NRMEZCUXl4SlFVRkpMRU5CUVVNc1JVRkJSU3hEUVVGRE8yZENRVU55UWl4TlFVRk5MRWxCUVVrc1kwRkJZeXhEUVVOMFFpeFhRVUZYTEZGQlFWRXNRMEZCUXl4RFFVRkRMRU5CUVVNc1QwRkJUeXhEUVVGRExFTkJRVU1zUTBGQlF5eFJRVUZSTEZWQlFWVXNTVUZCU1N4M1FrRkJkMElzUlVGRE9VVXNSVUZCUlN4TlFVRk5MRVZCUVVVc1NVRkJTU3hGUVVGRkxGRkJRVkVzUlVGQlJTeFRRVUZUTEVWQlFVVXNTMEZCU3l4RFFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zUlVGQlJTeERRVU42UkN4RFFVRkRPMWxCUTBvc1EwRkJRenRaUVVORUxFOUJRVTg3VVVGRFZDeERRVUZETzFGQlJVUXNUVUZCVFN4VFFVRlRMRWRCUVVjc1YwRkJWeXhEUVVGRExFZEJRVWNzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXp0UlFVTXhReXhKUVVGSkxFTkJRVU1zVTBGQlV5eEZRVUZGTEVOQlFVTTdXVUZEWml4TlFVRk5MRWxCUVVrc2EwSkJRV3RDTEVOQlFVTXNlVUpCUVhsQ0xFMUJRVTBzUjBGQlJ5eEZRVUZGTzJkQ1FVTXZSQ3hOUVVGTk8yRkJRMUFzUTBGQlF5eERRVUZETzFGQlEwd3NRMEZCUXp0UlFVVkVMRTFCUVUwc1MwRkJTeXhIUVVGSExGRkJRVkVzUTBGQlF5eERRVUZETEVOQlFVTXNVMEZCVXl4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU1zVTBGQlV5eERRVUZETEV0QlFVc3NRMEZCUXp0UlFVTTFSQ3hKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEVkQlFVY3NRMEZCUXl4SlFVRkpMRU5CUVVNc1JVRkJSU3hEUVVGRE8xbEJRM0pDTEUxQlFVMHNTVUZCU1N4alFVRmpMRU5CUTNSQ0xGZEJRVmNzVVVGQlVTeERRVUZETEVOQlFVTXNRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJReXhEUVVGRExFOUJRVThzVlVGQlZTeEpRVUZKTEdOQlFXTXNUVUZCVFN4SFFVRkhMRVZCUXpkRkxFVkJRVVVzVFVGQlRTeEZRVUZGTEVsQlFVa3NSVUZCUlN4UlFVRlJMRVZCUVVVc1UwRkJVeXhGUVVGRkxFdEJRVXNzUTBGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRVZCUVVVc1EwRkRla1FzUTBGQlF6dFJRVU5LTEVOQlFVTTdTVUZEU0N4RFFVRkRPMGxCUlVRN08wOUJSVWM3U1VGRFN5eGxRVUZsTEVOQlFVTXNVVUZCYVVNN1VVRkRka1FzVDBGQlR5eEpRVUZKTEVkQlFVY3NRMEZCUXp0WlFVTmlMSFZDUVVGMVFqdFpRVU4yUWl4VlFVRlZPMWxCUTFZc1QwRkJUenRaUVVOUUxGRkJRVkVzUTBGQlF5eEpRVUZKTzFOQlEyUXNRMEZCUXl4RFFVRkRPMGxCUTB3c1EwRkJRenRKUVVWRU96dFBRVVZITzBsQlEwc3NVMEZCVXl4RFFVRkRMRXRCUVhkRE8xRkJRM2hFTEU5QlFVOHNTVUZCU1N4SFFVRkhMRU5CUVVNc1EwRkJReXhMUVVGTExFbEJRVWtzUlVGQlJTeERRVUZETEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNc1EwRkJReXhGUVVGRkxFVkJRVVVzUTBGQlF5eERRVUZETEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNc1EwRkJRenRKUVVOdVJDeERRVUZETzBsQlJVUTdPMDlCUlVjN1NVRkRTeXhuUWtGQlowSXNRMEZEZEVJc1VVRkJhVU03VVVGRmFrTXNUVUZCVFN4SFFVRkhMRWRCUVVjc1NVRkJTU3hIUVVGSExFVkJRWFZFTEVOQlFVTTdVVUZETTBVc1MwRkJTeXhOUVVGTkxGRkJRVkVzU1VGQlNTeFJRVUZSTEVOQlFVTXNTMEZCU3l4SlFVRkpMRVZCUVVVc1JVRkJSU3hEUVVGRE8xbEJRelZETEUxQlFVMHNTMEZCU3l4SFFVRkhMRWxCUVVrc1IwRkJSeXhGUVVGVkxFTkJRVU03V1VGRGFFTXNUVUZCVFN4TlFVRk5MRWRCUVVjc1NVRkJTU3hIUVVGSExFVkJRVlVzUTBGQlF6dFpRVU5xUXl4TlFVRk5MRWRCUVVjc1IwRkJSeXhKUVVGSkxFTkJRVU1zY1VKQlFYRkNMRU5CUVVNc1VVRkJVU3hEUVVGRExFTkJRVU03V1VGRGFrUXNTVUZCU1N4SFFVRkhMRVZCUVVVc1EwRkJRenRuUWtGRFVpeExRVUZMTEUxQlFVMHNTVUZCU1N4SlFVRkpMRWRCUVVjc1EwRkJReXhMUVVGTExFbEJRVWtzUlVGQlJTeEZRVUZGTEVOQlFVTTdiMEpCUTI1RExFbEJRVWtzU1VGQlNTeERRVUZETEZOQlFWTXNTMEZCU3l4UFFVRlBPM2RDUVVGRkxFdEJRVXNzUTBGQlF5eEhRVUZITEVOQlFVTXNTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRE96dDNRa0ZEYUVRc1RVRkJUU3hEUVVGRExFZEJRVWNzUTBGQlF5eEpRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNN1owSkJRemRDTEVOQlFVTTdXVUZEU0N4RFFVRkRPMWxCUTBRc1IwRkJSeXhEUVVGRExFZEJRVWNzUTBGQlF5eFJRVUZSTEVOQlFVTXNSVUZCUlN4RlFVRkZMRVZCUVVVc1MwRkJTeXhGUVVGRkxFMUJRVTBzUlVGQlJTeERRVUZETEVOQlFVTTdVVUZETVVNc1EwRkJRenRSUVVORUxFOUJRVThzUjBGQlJ5eERRVUZETzBsQlEySXNRMEZCUXp0SlFVVkVPenM3T3pzN1QwRk5SenRKUVVOTExIRkNRVUZ4UWl4RFFVTXpRaXhSUVVFeVF6dFJRVVV6UXl4SlFVRkpMRkZCUVZFc1EwRkJReXhKUVVGSkxFVkJRVVVzUTBGQlF6dFpRVU5zUWl4SlFVRkpMRWxCUVVrc1EwRkJReXhsUVVGbExFTkJRVU1zVVVGQlVTeERRVUZETEVsQlFVa3NRMEZCUXl4RlFVRkZMRU5CUVVNN1owSkJRM2hETEU5QlFVOHNVVUZCVVN4RFFVRkRMRWxCUldZc1EwRkJRenRaUVVOS0xFTkJRVU03V1VGRFJDeEpRVUZKTEVOQlFVTTdaMEpCUTBnc1RVRkJUU3hIUVVGSExFZEJRVWNzYVVKQlFXbENMRU5CUVVNc1VVRkJVU3hEUVVGRExFbEJRVmNzUTBGQlF5eERRVUZETzJkQ1FVTndSQ3hQUVVGUExFZEJRVlVzUTBGQlF6dFpRVU53UWl4RFFVRkRPMWxCUVVNc1RVRkJUU3hEUVVGRE8yZENRVU5RTEU5QlFVOHNVMEZCVXl4RFFVRkRPMWxCUTI1Q0xFTkJRVU03VVVGRFNDeERRVUZETzFGQlEwUXNUMEZCVHl4VFFVRlRMRU5CUVVNN1NVRkRia0lzUTBGQlF6dEpRVVZFT3pzN1QwRkhSenRKUVVOTExHVkJRV1VzUTBGQlF5eExRVUZqTzFGQlEzQkRMRTlCUVU4c1EwRkRUQ3hQUVVGUExFdEJRVXNzUzBGQlN5eFJRVUZSTzFsQlEzcENMRXRCUVVzc1MwRkJTeXhKUVVGSk8xbEJRMlFzUTBGQlF5eExRVUZMTEVOQlFVTXNUMEZCVHl4RFFVRkRMRXRCUVVzc1EwRkJRenRaUVVOeVFpeFBRVUZSTEV0QlFUUkNMRU5CUVVNc1NVRkJTU3hMUVVGTExGRkJRVkU3V1VGRGRFUXNTMEZCU3l4RFFVRkRMRTlCUVU4c1EwRkJSU3hMUVVFMlFpeERRVUZETEV0QlFVc3NRMEZCUXl4RFFVTndSQ3hEUVVGRE8wbEJRMG9zUTBGQlF6dEpRVVZFT3p0UFFVVkhPMGxCUTBzc1dVRkJXU3hEUVVOc1FpeFpRVUZ2UWl4RlFVTndRaXhWUVVGclFpeEZRVU5zUWl4WlFVRnZRaXhGUVVOd1FpeFZRVUZyUWp0UlFVVnNRaXhQUVVGUExFZEJRVWNzV1VGQldTeEpRVUZKTEZWQlFWVXNTMEZCU3l4WlFVRlpMRWxCUVVrc1ZVRkJWU3hGUVVGRkxFTkJRVU03U1VGRGVFVXNRMEZCUXp0RFFVTkdJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpTHlvcVhHNGdLaUJBYlc5a2RXeGxJR2x1ZEdWbmNtRjBhVzl1Y3k5bmNtRndhQzl3YkdGdWJtbHVaeTlIY21Gd2FGSmxiR0YwYVc5dVVtVnpiMngyWlhKY2JpQXFJRUJ6ZFcxdFlYSjVJRTV2Y20xaGJHbDZaWE1nZDI5eWEyWnNiM2NnY21Wc1lYUnBiMjV6SUdsdWRHOGdaWGhsWTNWMGFXOXVJR1ZrWjJWekxseHVJQ29nUUdSbGMyTnlhWEIwYVc5dUlGSmxjMjlzZG1WeklIZHZjbXRtYkc5M0lHSnZkVzVrWVhKNUlHRnNhV0Z6WlhNc0lIWmhiR2xrWVhSbGN5QmxibVJ3YjJsdWRITWdZVzVrSUhCdmNuUnpMQ0JoYm1RZ2NISnZaSFZqWlhNZ2MzUmhZbXhsSUdWa1oyVWdTVVJ6TGx4dUlDb3ZYRzVwYlhCdmNuUWdkSGx3WlNCN1hHNGdJRWR5WVhCb1VHOXlkRVJsWm1sdWFYUnBiMjRzWEc0Z0lFZHlZWEJvVjI5eWEyWnNiM2RFWldacGJtbDBhVzl1TEZ4dUlDQkhjbUZ3YUZkdmNtdG1iRzkzVW1Wc1lYUnBiMjVOWlhSaFpHRjBZU3hjYm4wZ1puSnZiU0JjSWtCa1pXTmhaaTEwY3k5MWFTMWtaV052Y21GMGIzSnpMMmR5WVhCb1hDSTdYRzVwYlhCdmNuUWdleUJuY21Gd2FFUmxabWx1YVhScGIyNVBaaUI5SUdaeWIyMGdYQ0pBWkdWallXWXRkSE12ZFdrdFpHVmpiM0poZEc5eWN5OW5jbUZ3YUZ3aU8xeHVYRzVwYlhCdmNuUWdleUJIVWtGUVNGOVhUMUpMUmt4UFYxOUNUMVZPUkVGU1dTQjlJR1p5YjIwZ1hDSXVMaTlqYjI1emRHRnVkSE5jSWp0Y2JtbHRjRzl5ZENCN0lFZHlZWEJvVUc5eWRFVnljbTl5SUgwZ1puSnZiU0JjSWk0dUwyVnljbTl5Y3k5SGNtRndhRkJ2Y25SRmNuSnZjbHdpTzF4dWFXMXdiM0owSUhzZ1IzSmhjR2hVYjNCdmJHOW5lVVZ5Y205eUlIMGdabkp2YlNCY0lpNHVMMlZ5Y205eWN5OUhjbUZ3YUZSdmNHOXNiMmQ1UlhKeWIzSmNJanRjYm1sdGNHOXlkQ0IwZVhCbElIc2dSM0poY0doRmVHVmpkWFJwYjI1UWJHRnVSV1JuWlNCOUlHWnliMjBnWENJdUwwZHlZWEJvUlhobFkzVjBhVzl1VUd4aGJrVmtaMlZjSWp0Y2JseHVMeW9xWEc0Z0tpQlNaWE52YkhabGN5QnlZWGNnZDI5eWEyWnNiM2NnY21Wc1lYUnBiMjRnYldWMFlXUmhkR0VnYVc1MGJ5QnViM0p0WVd4cGVtVmtJR1Y0WldOMWRHbHZiaUJsWkdkbGN5NWNiaUFxTDF4dVpYaHdiM0owSUdOc1lYTnpJRWR5WVhCb1VtVnNZWFJwYjI1U1pYTnZiSFpsY2lCN1hHNGdJQzhxS2x4dUlDQWdLaUJTWlhOdmJIWmxjeUJoYkd3Z2NtVnNZWFJwYjI1eklHOW1JR0VnZDI5eWEyWnNiM2NnYVc1MGJ5QmxlR1ZqZFhScGIyNGdaV1JuWlhNdVhHNGdJQ0FxWEc0Z0lDQXFJRUJ3WVhKaGJTQjNiM0pyWm14dmR5QXRJRlJvWlNCM2IzSnJabXh2ZHlCa1pXWnBibWwwYVc5dUxseHVJQ0FnS2lCQWNtVjBkWEp1Y3lCQmNuSmhlU0J2WmlCdWIzSnRZV3hwZW1Wa0lHVmtaMlZ6TGx4dUlDQWdLaUJBZEdoeWIzZHpJSHRIY21Gd2FGUnZjRzlzYjJkNVJYSnliM0o5SUhkb1pXNGdZVzRnWlc1a2NHOXBiblFnYVhNZ2RXNXJibTkzYmlCdmNpQmhiV0pwWjNWdmRYTXVYRzRnSUNBcUlFQjBhSEp2ZDNNZ2UwZHlZWEJvVUc5eWRFVnljbTl5ZlNCM2FHVnVJR0VnY21WbVpYSmxibU5sWkNCd2IzSjBJR2x6SUcxcGMzTnBibWNnYjNJZ2RXNXJibTkzYmk1Y2JpQWdJQ292WEc0Z0lISmxjMjlzZG1Vb2QyOXlhMlpzYjNjNklFZHlZWEJvVjI5eWEyWnNiM2RFWldacGJtbDBhVzl1S1RvZ1IzSmhjR2hGZUdWamRYUnBiMjVRYkdGdVJXUm5aVnRkSUh0Y2JpQWdJQ0JqYjI1emRDQnViMlJsU1dSeklEMGdibVYzSUZObGRDaDNiM0pyWm14dmR5NXViMlJsY3k1dFlYQW9LRzRwSUQwK0lHNHVhV1FwS1R0Y2JpQWdJQ0JqYjI1emRDQmliM1Z1WkdGeWVVRnNhV0Z6WlhNZ1BTQjBhR2x6TG1KdmRXNWtZWEo1UVd4cFlYTmxjeWgzYjNKclpteHZkeWs3WEc0Z0lDQWdZMjl1YzNRZ2FXNXdkWFJRYjNKMGN5QTlJSFJvYVhNdWNHOXlkRTVoYldWektIZHZjbXRtYkc5M0xtbHVjSFYwY3lrN1hHNGdJQ0FnWTI5dWMzUWdiM1YwY0hWMFVHOXlkSE1nUFNCMGFHbHpMbkJ2Y25ST1lXMWxjeWgzYjNKclpteHZkeTV2ZFhSd2RYUnpLVHRjYmlBZ0lDQmpiMjV6ZENCdWIyUmxVRzl5ZEUxaGNDQTlJSFJvYVhNdVluVnBiR1JPYjJSbFVHOXlkRTFoY0NoM2IzSnJabXh2ZHlrN1hHNWNiaUFnSUNCamIyNXpkQ0JsWkdkbGN6b2dSM0poY0doRmVHVmpkWFJwYjI1UWJHRnVSV1JuWlZ0ZElEMGdXMTA3WEc1Y2JpQWdJQ0JtYjNJZ0tHTnZibk4wSUhKbGJHRjBhVzl1SUc5bUlIZHZjbXRtYkc5M0xuSmxiR0YwYVc5dWN5QS9QeUJiWFNrZ2UxeHVJQ0FnSUNBZ1kyOXVjM1FnWldSblpTQTlJSFJvYVhNdWNtVnpiMngyWlZKbGJHRjBhVzl1S0Z4dUlDQWdJQ0FnSUNCeVpXeGhkR2x2Yml4Y2JpQWdJQ0FnSUNBZ2JtOWtaVWxrY3l4Y2JpQWdJQ0FnSUNBZ1ltOTFibVJoY25sQmJHbGhjMlZ6TEZ4dUlDQWdJQ0FnSUNCcGJuQjFkRkJ2Y25SekxGeHVJQ0FnSUNBZ0lDQnZkWFJ3ZFhSUWIzSjBjeXhjYmlBZ0lDQWdJQ0FnYm05a1pWQnZjblJOWVhCY2JpQWdJQ0FnSUNrN1hHNGdJQ0FnSUNCbFpHZGxjeTV3ZFhOb0tHVmtaMlVwTzF4dUlDQWdJSDFjYmx4dUlDQWdJSEpsZEhWeWJpQmxaR2RsY3p0Y2JpQWdmVnh1WEc0Z0lDOHFLbHh1SUNBZ0tpQlNaWE52YkhabGN5QmhJSE5wYm1kc1pTQnlaV3hoZEdsdmJpQnBiblJ2SUdGdUlHVmtaMlV1WEc0Z0lDQXFMMXh1SUNCd2NtbDJZWFJsSUhKbGMyOXNkbVZTWld4aGRHbHZiaWhjYmlBZ0lDQnlaV3hoZEdsdmJqb2dSM0poY0doWGIzSnJabXh2ZDFKbGJHRjBhVzl1VFdWMFlXUmhkR0VzWEc0Z0lDQWdibTlrWlVsa2N6b2dVMlYwUEhOMGNtbHVaejRzWEc0Z0lDQWdZbTkxYm1SaGNubEJiR2xoYzJWek9pQlRaWFE4YzNSeWFXNW5QaXhjYmlBZ0lDQnBibkIxZEZCdmNuUnpPaUJUWlhROGMzUnlhVzVuUGl4Y2JpQWdJQ0J2ZFhSd2RYUlFiM0owY3pvZ1UyVjBQSE4wY21sdVp6NHNYRzRnSUNBZ2JtOWtaVkJ2Y25STllYQTZJRTFoY0R4emRISnBibWNzSUhzZ2FXNXdkWFE2SUZObGREeHpkSEpwYm1jK095QnZkWFJ3ZFhRNklGTmxkRHh6ZEhKcGJtYytJSDArWEc0Z0lDazZJRWR5WVhCb1JYaGxZM1YwYVc5dVVHeGhia1ZrWjJVZ2UxeHVJQ0FnSUdOdmJuTjBJSE52ZFhKalpVNXZaR1ZKWkNBOUlIUm9hWE11Y21WemIyeDJaVVZ1WkhCdmFXNTBLRnh1SUNBZ0lDQWdjbVZzWVhScGIyNHVjMjkxY21ObExGeHVJQ0FnSUNBZ2JtOWtaVWxrY3l4Y2JpQWdJQ0FnSUdKdmRXNWtZWEo1UVd4cFlYTmxjMXh1SUNBZ0lDazdYRzRnSUNBZ1kyOXVjM1FnZEdGeVoyVjBUbTlrWlVsa0lEMGdkR2hwY3k1eVpYTnZiSFpsUlc1a2NHOXBiblFvWEc0Z0lDQWdJQ0J5Wld4aGRHbHZiaTUwWVhKblpYUXNYRzRnSUNBZ0lDQnViMlJsU1dSekxGeHVJQ0FnSUNBZ1ltOTFibVJoY25sQmJHbGhjMlZ6WEc0Z0lDQWdLVHRjYmx4dUlDQWdJR052Ym5OMElITnZkWEpqWlZCdmNuUWdQU0J5Wld4aGRHbHZiaTV6YjNWeVkyVlFiM0owTzF4dUlDQWdJR052Ym5OMElIUmhjbWRsZEZCdmNuUWdQU0J5Wld4aGRHbHZiaTUwWVhKblpYUlFiM0owTzF4dVhHNGdJQ0FnYVdZZ0tDRnpiM1Z5WTJWUWIzSjBLU0I3WEc0Z0lDQWdJQ0IwYUhKdmR5QnVaWGNnUjNKaGNHaFFiM0owUlhKeWIzSW9YRzRnSUNBZ0lDQWdJR0JTWld4aGRHbHZiaUJwY3lCdGFYTnphVzVuSUhOdmRYSmpaVkJ2Y25RZ0tITnZkWEpqWlRvZ0pIdFRkSEpwYm1jb2NtVnNZWFJwYjI0dWMyOTFjbU5sS1gwc0lIUmhjbWRsZERvZ0pIdFRkSEpwYm1jb2NtVnNZWFJwYjI0dWRHRnlaMlYwS1gwcFlDeGNiaUFnSUNBZ0lDQWdleUJ5Wld4aGRHbHZiaUI5WEc0Z0lDQWdJQ0FwTzF4dUlDQWdJSDFjYmlBZ0lDQnBaaUFvSVhSaGNtZGxkRkJ2Y25RcElIdGNiaUFnSUNBZ0lIUm9jbTkzSUc1bGR5QkhjbUZ3YUZCdmNuUkZjbkp2Y2loY2JpQWdJQ0FnSUNBZ1lGSmxiR0YwYVc5dUlHbHpJRzFwYzNOcGJtY2dkR0Z5WjJWMFVHOXlkQ0FvYzI5MWNtTmxPaUFrZTFOMGNtbHVaeWh5Wld4aGRHbHZiaTV6YjNWeVkyVXBmU3dnZEdGeVoyVjBPaUFrZTFOMGNtbHVaeWh5Wld4aGRHbHZiaTUwWVhKblpYUXBmU2xnTEZ4dUlDQWdJQ0FnSUNCN0lISmxiR0YwYVc5dUlIMWNiaUFnSUNBZ0lDazdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2RHaHBjeTUyWVd4cFpHRjBaVkJ2Y25Rb1hHNGdJQ0FnSUNCemIzVnlZMlZPYjJSbFNXUXNYRzRnSUNBZ0lDQnpiM1Z5WTJWUWIzSjBMRnh1SUNBZ0lDQWdkSEoxWlN4Y2JpQWdJQ0FnSUdKdmRXNWtZWEo1UVd4cFlYTmxjeXhjYmlBZ0lDQWdJR2x1Y0hWMFVHOXlkSE1zWEc0Z0lDQWdJQ0J2ZFhSd2RYUlFiM0owY3l4Y2JpQWdJQ0FnSUc1dlpHVlFiM0owVFdGd1hHNGdJQ0FnS1R0Y2JpQWdJQ0IwYUdsekxuWmhiR2xrWVhSbFVHOXlkQ2hjYmlBZ0lDQWdJSFJoY21kbGRFNXZaR1ZKWkN4Y2JpQWdJQ0FnSUhSaGNtZGxkRkJ2Y25Rc1hHNGdJQ0FnSUNCbVlXeHpaU3hjYmlBZ0lDQWdJR0p2ZFc1a1lYSjVRV3hwWVhObGN5eGNiaUFnSUNBZ0lHbHVjSFYwVUc5eWRITXNYRzRnSUNBZ0lDQnZkWFJ3ZFhSUWIzSjBjeXhjYmlBZ0lDQWdJRzV2WkdWUWIzSjBUV0Z3WEc0Z0lDQWdLVHRjYmx4dUlDQWdJSEpsZEhWeWJpQjdYRzRnSUNBZ0lDQnBaRG9nZEdocGN5NWpjbVZoZEdWRlpHZGxTV1FvYzI5MWNtTmxUbTlrWlVsa0xDQnpiM1Z5WTJWUWIzSjBMQ0IwWVhKblpYUk9iMlJsU1dRc0lIUmhjbWRsZEZCdmNuUXBMRnh1SUNBZ0lDQWdjMjkxY21ObFRtOWtaVWxrTEZ4dUlDQWdJQ0FnYzI5MWNtTmxVRzl5ZEN4Y2JpQWdJQ0FnSUhSaGNtZGxkRTV2WkdWSlpDeGNiaUFnSUNBZ0lIUmhjbWRsZEZCdmNuUXNYRzRnSUNBZ0lDQnNZV0psYkRvZ2NtVnNZWFJwYjI0dWJHRmlaV3dzWEc0Z0lDQWdJQ0J0WlhSaFpHRjBZVG9nY21Wc1lYUnBiMjR1YldWMFlXUmhkR0VzWEc0Z0lDQWdmVHRjYmlBZ2ZWeHVYRzRnSUM4cUtseHVJQ0FnS2lCU1pYTnZiSFpsY3lCaGJpQmxibVJ3YjJsdWRDQW9jMjkxY21ObElHOXlJSFJoY21kbGRDa2dkRzhnWVNCdWIyUmxJR2xrSUc5eUlIUm9aU0IzYjNKclpteHZkeUJpYjNWdVpHRnllUzVjYmlBZ0lDb3ZYRzRnSUhCeWFYWmhkR1VnY21WemIyeDJaVVZ1WkhCdmFXNTBLRnh1SUNBZ0lHVnVaSEJ2YVc1ME9pQnpkSEpwYm1jZ2ZDQjFibXR1YjNkdUxGeHVJQ0FnSUc1dlpHVkpaSE02SUZObGREeHpkSEpwYm1jK0xGeHVJQ0FnSUdKdmRXNWtZWEo1UVd4cFlYTmxjem9nVTJWMFBITjBjbWx1Wno1Y2JpQWdLVG9nYzNSeWFXNW5JSHRjYmlBZ0lDQmpiMjV6ZENCdVlXMWxJRDBnVTNSeWFXNW5LR1Z1WkhCdmFXNTBLVHRjYmlBZ0lDQnBaaUFvWW05MWJtUmhjbmxCYkdsaGMyVnpMbWhoY3lodVlXMWxLU2tnY21WMGRYSnVJRWRTUVZCSVgxZFBVa3RHVEU5WFgwSlBWVTVFUVZKWk8xeHVJQ0FnSUdsbUlDaHViMlJsU1dSekxtaGhjeWh1WVcxbEtTa2djbVYwZFhKdUlHNWhiV1U3WEc0Z0lDQWdkR2h5YjNjZ2JtVjNJRWR5WVhCb1ZHOXdiMnh2WjNsRmNuSnZjaWhjYmlBZ0lDQWdJR0JWYm10dWIzZHVJR1Z1WkhCdmFXNTBJQ2NrZTI1aGJXVjlKMkFzWEc0Z0lDQWdJQ0I3SUdWdVpIQnZhVzUwT2lCdVlXMWxMQ0JyYm05M2JrNXZaR1Z6T2lCQmNuSmhlUzVtY205dEtHNXZaR1ZKWkhNcElIMWNiaUFnSUNBcE8xeHVJQ0I5WEc1Y2JpQWdMeW9xWEc0Z0lDQXFJRlpoYkdsa1lYUmxjeUIwYUdGMElHRWdjRzl5ZENCbGVHbHpkSE1nYjI0Z2RHaGxJR2RwZG1WdUlHNXZaR1VnYjNJZ1ltOTFibVJoY25rdVhHNGdJQ0FxTDF4dUlDQndjbWwyWVhSbElIWmhiR2xrWVhSbFVHOXlkQ2hjYmlBZ0lDQnViMlJsU1dRNklITjBjbWx1Wnl4Y2JpQWdJQ0J3YjNKME9pQnpkSEpwYm1jc1hHNGdJQ0FnYVhOVGIzVnlZMlU2SUdKdmIyeGxZVzRzWEc0Z0lDQWdZbTkxYm1SaGNubEJiR2xoYzJWek9pQlRaWFE4YzNSeWFXNW5QaXhjYmlBZ0lDQnBibkIxZEZCdmNuUnpPaUJUWlhROGMzUnlhVzVuUGl4Y2JpQWdJQ0J2ZFhSd2RYUlFiM0owY3pvZ1UyVjBQSE4wY21sdVp6NHNYRzRnSUNBZ2JtOWtaVkJ2Y25STllYQTZJRTFoY0R4emRISnBibWNzSUhzZ2FXNXdkWFE2SUZObGREeHpkSEpwYm1jK095QnZkWFJ3ZFhRNklGTmxkRHh6ZEhKcGJtYytJSDArWEc0Z0lDazZJSFp2YVdRZ2UxeHVJQ0FnSUdsbUlDaHViMlJsU1dRZ1BUMDlJRWRTUVZCSVgxZFBVa3RHVEU5WFgwSlBWVTVFUVZKWktTQjdYRzRnSUNBZ0lDQmpiMjV6ZENCd2IzSjBjeUE5SUdselUyOTFjbU5sSUQ4Z2FXNXdkWFJRYjNKMGN5QTZJRzkxZEhCMWRGQnZjblJ6TzF4dUlDQWdJQ0FnYVdZZ0tDRndiM0owY3k1b1lYTW9jRzl5ZENrcElIdGNiaUFnSUNBZ0lDQWdkR2h5YjNjZ2JtVjNJRWR5WVhCb1VHOXlkRVZ5Y205eUtGeHVJQ0FnSUNBZ0lDQWdJR0JWYm10dWIzZHVJQ1I3YVhOVGIzVnlZMlVnUHlCY0ltbHVjSFYwWENJZ09pQmNJbTkxZEhCMWRGd2lmU0J3YjNKMElDY2tlM0J2Y25SOUp5QnZiaUIzYjNKclpteHZkeUJpYjNWdVpHRnllV0FzWEc0Z0lDQWdJQ0FnSUNBZ2V5QnViMlJsU1dRc0lIQnZjblFzSUdselUyOTFjbU5sTENCaGRtRnBiR0ZpYkdVNklFRnljbUY1TG1aeWIyMG9jRzl5ZEhNcElIMWNiaUFnSUNBZ0lDQWdLVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQWdJSEpsZEhWeWJqdGNiaUFnSUNCOVhHNWNiaUFnSUNCamIyNXpkQ0J1YjJSbFVHOXlkSE1nUFNCdWIyUmxVRzl5ZEUxaGNDNW5aWFFvYm05a1pVbGtLVHRjYmlBZ0lDQnBaaUFvSVc1dlpHVlFiM0owY3lrZ2UxeHVJQ0FnSUNBZ2RHaHliM2NnYm1WM0lFZHlZWEJvVkc5d2IyeHZaM2xGY25KdmNpaGdUbThnY0c5eWRDQnRZWEFnWm05eUlHNXZaR1VnSnlSN2JtOWtaVWxrZlNkZ0xDQjdYRzRnSUNBZ0lDQWdJRzV2WkdWSlpDeGNiaUFnSUNBZ0lIMHBPMXh1SUNBZ0lIMWNibHh1SUNBZ0lHTnZibk4wSUhCdmNuUnpJRDBnYVhOVGIzVnlZMlVnUHlCdWIyUmxVRzl5ZEhNdWIzVjBjSFYwSURvZ2JtOWtaVkJ2Y25SekxtbHVjSFYwTzF4dUlDQWdJR2xtSUNnaGNHOXlkSE11YUdGektIQnZjblFwS1NCN1hHNGdJQ0FnSUNCMGFISnZkeUJ1WlhjZ1IzSmhjR2hRYjNKMFJYSnliM0lvWEc0Z0lDQWdJQ0FnSUdCVmJtdHViM2R1SUNSN2FYTlRiM1Z5WTJVZ1B5QmNJbTkxZEhCMWRGd2lJRG9nWENKcGJuQjFkRndpZlNCd2IzSjBJQ2NrZTNCdmNuUjlKeUJ2YmlCdWIyUmxJQ2NrZTI1dlpHVkpaSDBuWUN4Y2JpQWdJQ0FnSUNBZ2V5QnViMlJsU1dRc0lIQnZjblFzSUdselUyOTFjbU5sTENCaGRtRnBiR0ZpYkdVNklFRnljbUY1TG1aeWIyMG9jRzl5ZEhNcElIMWNiaUFnSUNBZ0lDazdYRzRnSUNBZ2ZWeHVJQ0I5WEc1Y2JpQWdMeW9xWEc0Z0lDQXFJRUoxYVd4a2N5QjBhR1VnYzJWMElHOW1JR0p2ZFc1a1lYSjVJR0ZzYVdGelpYTWdabTl5SUdFZ2QyOXlhMlpzYjNjdVhHNGdJQ0FxTDF4dUlDQndjbWwyWVhSbElHSnZkVzVrWVhKNVFXeHBZWE5sY3loM2IzSnJabXh2ZHpvZ1IzSmhjR2hYYjNKclpteHZkMFJsWm1sdWFYUnBiMjRwT2lCVFpYUThjM1J5YVc1blBpQjdYRzRnSUNBZ2NtVjBkWEp1SUc1bGR5QlRaWFFvVzF4dUlDQWdJQ0FnUjFKQlVFaGZWMDlTUzBaTVQxZGZRazlWVGtSQlVsa3NYRzRnSUNBZ0lDQmNJbmR2Y210bWJHOTNYQ0lzWEc0Z0lDQWdJQ0JjSW1keVlYQm9YQ0lzWEc0Z0lDQWdJQ0IzYjNKclpteHZkeTV1WVcxbExGeHVJQ0FnSUYwcE8xeHVJQ0I5WEc1Y2JpQWdMeW9xWEc0Z0lDQXFJRVY0ZEhKaFkzUnpJSEJ2Y25RZ2JtRnRaWE1nWm5KdmJTQmhJR3hwYzNRZ2IyWWdjRzl5ZENCa1pXWnBibWwwYVc5dWN5NWNiaUFnSUNvdlhHNGdJSEJ5YVhaaGRHVWdjRzl5ZEU1aGJXVnpLSEJ2Y25Sek9pQkhjbUZ3YUZCdmNuUkVaV1pwYm1sMGFXOXVXMTBnZkNCMWJtUmxabWx1WldRcE9pQlRaWFE4YzNSeWFXNW5QaUI3WEc0Z0lDQWdjbVYwZFhKdUlHNWxkeUJUWlhRb0tIQnZjblJ6SUQ4L0lGdGRLUzV0WVhBb0tIQXBJRDArSUhBdWJtRnRaU2twTzF4dUlDQjlYRzVjYmlBZ0x5b3FYRzRnSUNBcUlFSjFhV3hrY3lCaElHMWhjQ0J2WmlCdWIyUmxJR2xrSUMwK0lIc2dhVzV3ZFhRZ2NHOXlkSE1zSUc5MWRIQjFkQ0J3YjNKMGN5QjlMbHh1SUNBZ0tpOWNiaUFnY0hKcGRtRjBaU0JpZFdsc1pFNXZaR1ZRYjNKMFRXRndLRnh1SUNBZ0lIZHZjbXRtYkc5M09pQkhjbUZ3YUZkdmNtdG1iRzkzUkdWbWFXNXBkR2x2Ymx4dUlDQXBPaUJOWVhBOGMzUnlhVzVuTENCN0lHbHVjSFYwT2lCVFpYUThjM1J5YVc1blBqc2diM1YwY0hWME9pQlRaWFE4YzNSeWFXNW5QaUI5UGlCN1hHNGdJQ0FnWTI5dWMzUWdiV0Z3SUQwZ2JtVjNJRTFoY0R4emRISnBibWNzSUhzZ2FXNXdkWFE2SUZObGREeHpkSEpwYm1jK095QnZkWFJ3ZFhRNklGTmxkRHh6ZEhKcGJtYytJSDArS0NrN1hHNGdJQ0FnWm05eUlDaGpiMjV6ZENCdWIyUmxUV1YwWVNCdlppQjNiM0pyWm14dmR5NXViMlJsY3lBL1B5QmJYU2tnZTF4dUlDQWdJQ0FnWTI5dWMzUWdhVzV3ZFhRZ1BTQnVaWGNnVTJWMFBITjBjbWx1Wno0b0tUdGNiaUFnSUNBZ0lHTnZibk4wSUc5MWRIQjFkQ0E5SUc1bGR5QlRaWFE4YzNSeWFXNW5QaWdwTzF4dUlDQWdJQ0FnWTI5dWMzUWdaR1ZtSUQwZ2RHaHBjeTV5WlhOdmJIWmxUbTlrWlVSbFptbHVhWFJwYjI0b2JtOWtaVTFsZEdFcE8xeHVJQ0FnSUNBZ2FXWWdLR1JsWmlrZ2UxeHVJQ0FnSUNBZ0lDQm1iM0lnS0dOdmJuTjBJSEJ2Y25RZ2IyWWdaR1ZtTG5CdmNuUnpJRDgvSUZ0ZEtTQjdYRzRnSUNBZ0lDQWdJQ0FnYVdZZ0tIQnZjblF1WkdseVpXTjBhVzl1SUQwOVBTQmNJbWx1Y0hWMFhDSXBJR2x1Y0hWMExtRmtaQ2h3YjNKMExtNWhiV1VwTzF4dUlDQWdJQ0FnSUNBZ0lHVnNjMlVnYjNWMGNIVjBMbUZrWkNod2IzSjBMbTVoYldVcE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQjlYRzRnSUNBZ0lDQnRZWEF1YzJWMEtHNXZaR1ZOWlhSaExtbGtMQ0I3SUdsdWNIVjBMQ0J2ZFhSd2RYUWdmU2s3WEc0Z0lDQWdmVnh1SUNBZ0lISmxkSFZ5YmlCdFlYQTdYRzRnSUgxY2JseHVJQ0F2S2lwY2JpQWdJQ29nUVhSMFpXMXdkSE1nZEc4Z2NtVnpiMngyWlNCaElHNXZaR1VuY3lCbWRXeHNJR1JsWm1sdWFYUnBiMjRnWm5KdmJTQnBkSE1nYldWMFlXUmhkR0V1WEc0Z0lDQXFYRzRnSUNBcUlFRmpZMlZ3ZEhNZ1pXbDBhR1Z5SUdFZ1pHVmpiM0poZEdWa0lFMXZaR1ZzSUdOc1lYTnpMMmx1YzNSaGJtTmxJQ2h5WlhOdmJIWmxaQ0IyYVdGY2JpQWdJQ29nWUdkeVlYQm9SR1ZtYVc1cGRHbHZiazltWUNrZ2IzSWdZU0J3YkdGcGJpQmdSM0poY0doT2IyUmxSR1ZtYVc1cGRHbHZibUF0YzJoaGNHVmtJRzlpYW1WamRGeHVJQ0FnS2lBb2RYTmxablZzSUdadmNpQnpaWEpwWVd4cGVtVmtJSGR2Y210bWJHOTNjeUIwYUdGMElHbHViR2x1WlNCdWIyUmxJR1JsWm1sdWFYUnBiMjV6S1M1Y2JpQWdJQ292WEc0Z0lIQnlhWFpoZEdVZ2NtVnpiMngyWlU1dlpHVkVaV1pwYm1sMGFXOXVLRnh1SUNBZ0lHNXZaR1ZOWlhSaE9pQjdJRzV2WkdVL09pQjFibXR1YjNkdU95QnJhVzVrUHpvZ2MzUnlhVzVuSUgxY2JpQWdLVG9nZXlCd2IzSjBjem9nZXlCa2FYSmxZM1JwYjI0NklITjBjbWx1WnpzZ2JtRnRaVG9nYzNSeWFXNW5JSDFiWFNCOUlId2dkVzVrWldacGJtVmtJSHRjYmlBZ0lDQnBaaUFvYm05a1pVMWxkR0V1Ym05a1pTa2dlMXh1SUNBZ0lDQWdhV1lnS0hSb2FYTXVhWE5TWVhkRVpXWnBibWwwYVc5dUtHNXZaR1ZOWlhSaExtNXZaR1VwS1NCN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCdWIyUmxUV1YwWVM1dWIyUmxJR0Z6SUh0Y2JpQWdJQ0FnSUNBZ0lDQndiM0owY3pvZ2V5QmthWEpsWTNScGIyNDZJSE4wY21sdVp6c2dibUZ0WlRvZ2MzUnlhVzVuSUgxYlhUdGNiaUFnSUNBZ0lDQWdmVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQWdJSFJ5ZVNCN1hHNGdJQ0FnSUNBZ0lHTnZibk4wSUdSbFppQTlJR2R5WVhCb1JHVm1hVzVwZEdsdmJrOW1LRzV2WkdWTlpYUmhMbTV2WkdVZ1lYTWdZVzU1S1R0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUdSbFppQmhjeUJoYm5rN1hHNGdJQ0FnSUNCOUlHTmhkR05vSUh0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhWdVpHVm1hVzVsWkR0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc0Z0lDQWdjbVYwZFhKdUlIVnVaR1ZtYVc1bFpEdGNiaUFnZlZ4dVhHNGdJQzhxS2x4dUlDQWdLaUJTWlhSMWNtNXpJR0IwY25WbFlDQjNhR1Z1SUdFZ2RtRnNkV1VnYkc5dmEzTWdiR2xyWlNCaElISmhkeUI3UUd4cGJtc2dSM0poY0doT2IyUmxSR1ZtYVc1cGRHbHZibjFjYmlBZ0lDb2dLR0VnY0d4aGFXNGdiMkpxWldOMElIZHBkR2dnWVNCZ2NHOXlkSE5nSUdGeWNtRjVJR0Z1WkNCaElHQnVZVzFsWUNCemRISnBibWNwTGx4dUlDQWdLaTljYmlBZ2NISnBkbUYwWlNCcGMxSmhkMFJsWm1sdWFYUnBiMjRvZG1Gc2RXVTZJSFZ1YTI1dmQyNHBPaUJpYjI5c1pXRnVJSHRjYmlBZ0lDQnlaWFIxY200Z0tGeHVJQ0FnSUNBZ2RIbHdaVzltSUhaaGJIVmxJRDA5UFNCY0ltOWlhbVZqZEZ3aUlDWW1YRzRnSUNBZ0lDQjJZV3gxWlNBaFBUMGdiblZzYkNBbUpseHVJQ0FnSUNBZ0lVRnljbUY1TG1selFYSnlZWGtvZG1Gc2RXVXBJQ1ltWEc0Z0lDQWdJQ0IwZVhCbGIyWWdLSFpoYkhWbElHRnpJSHNnYm1GdFpUODZJSFZ1YTI1dmQyNGdmU2t1Ym1GdFpTQTlQVDBnWENKemRISnBibWRjSWlBbUpseHVJQ0FnSUNBZ1FYSnlZWGt1YVhOQmNuSmhlU2dvZG1Gc2RXVWdZWE1nZXlCd2IzSjBjejg2SUhWdWEyNXZkMjRnZlNrdWNHOXlkSE1wWEc0Z0lDQWdLVHRjYmlBZ2ZWeHVYRzRnSUM4cUtseHVJQ0FnS2lCRGNtVmhkR1Z6SUdFZ2MzUmhZbXhsSUdWa1oyVWdhV1FnWm5KdmJTQnBkSE1nWlc1a2NHOXBiblJ6SUdGdVpDQndiM0owY3k1Y2JpQWdJQ292WEc0Z0lIQnlhWFpoZEdVZ1kzSmxZWFJsUldSblpVbGtLRnh1SUNBZ0lITnZkWEpqWlU1dlpHVkpaRG9nYzNSeWFXNW5MRnh1SUNBZ0lITnZkWEpqWlZCdmNuUTZJSE4wY21sdVp5eGNiaUFnSUNCMFlYSm5aWFJPYjJSbFNXUTZJSE4wY21sdVp5eGNiaUFnSUNCMFlYSm5aWFJRYjNKME9pQnpkSEpwYm1kY2JpQWdLVG9nYzNSeWFXNW5JSHRjYmlBZ0lDQnlaWFIxY200Z1lDUjdjMjkxY21ObFRtOWtaVWxrZlRva2UzTnZkWEpqWlZCdmNuUjlMVDRrZTNSaGNtZGxkRTV2WkdWSlpIMDZKSHQwWVhKblpYUlFiM0owZldBN1hHNGdJSDFjYm4xY2JpSmRmUT09Il19
|