terraconstructs 0.2.3 → 0.2.5
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/.jsii +3475 -3110
- package/CLAUDE.md +6 -6
- package/README.md +1 -1
- package/lib/asset-staging.js +3 -3
- package/lib/aws/arn.js +5 -5
- package/lib/aws/aws-asset-manager.js +9 -9
- package/lib/aws/aws-construct.js +1 -1
- package/lib/aws/aws-stack.d.ts +18 -2
- package/lib/aws/aws-stack.js +21 -9
- package/lib/aws/aws-tags.d.ts +1 -1
- package/lib/aws/aws-tags.js +5 -5
- package/lib/aws/cloudwatch/actions/appscaling.js +1 -1
- package/lib/aws/cloudwatch/actions/ec2.js +1 -1
- package/lib/aws/cloudwatch/actions/lambda.js +2 -2
- package/lib/aws/cloudwatch/actions/sns.js +1 -1
- package/lib/aws/cloudwatch/actions/ssm.js +2 -2
- package/lib/aws/cloudwatch/alarm-base.js +1 -1
- package/lib/aws/cloudwatch/alarm-rule.js +1 -1
- package/lib/aws/cloudwatch/alarm-status-widget.js +1 -1
- package/lib/aws/cloudwatch/alarm.d.ts +1 -1
- package/lib/aws/cloudwatch/alarm.js +10 -10
- package/lib/aws/cloudwatch/composite-alarm.d.ts +1 -1
- package/lib/aws/cloudwatch/composite-alarm.js +7 -7
- package/lib/aws/cloudwatch/dashboard.d.ts +1 -1
- package/lib/aws/cloudwatch/dashboard.js +7 -7
- package/lib/aws/cloudwatch/data-protection-policy.d.ts +1 -1
- package/lib/aws/cloudwatch/data-protection-policy.js +5 -5
- package/lib/aws/cloudwatch/graph.js +8 -8
- package/lib/aws/cloudwatch/layout.js +3 -3
- package/lib/aws/cloudwatch/log-destinations/kinesis.js +1 -1
- package/lib/aws/cloudwatch/log-destinations/lambda.js +1 -1
- package/lib/aws/cloudwatch/log-group.d.ts +1 -1
- package/lib/aws/cloudwatch/log-group.js +7 -7
- package/lib/aws/cloudwatch/log-query.js +1 -1
- package/lib/aws/cloudwatch/log-stream.d.ts +1 -1
- package/lib/aws/cloudwatch/log-stream.js +3 -3
- package/lib/aws/cloudwatch/metric-filter.d.ts +1 -1
- package/lib/aws/cloudwatch/metric-filter.js +3 -3
- package/lib/aws/cloudwatch/metric.js +6 -6
- package/lib/aws/cloudwatch/pattern.js +3 -3
- package/lib/aws/cloudwatch/policy.d.ts +1 -1
- package/lib/aws/cloudwatch/policy.js +3 -3
- package/lib/aws/cloudwatch/private/drop-empty-object-at-the-end-of-an-array-token.d.ts +1 -1
- package/lib/aws/cloudwatch/private/drop-empty-object-at-the-end-of-an-array-token.js +1 -1
- package/lib/aws/cloudwatch/private/env-tokens.js +6 -6
- package/lib/aws/cloudwatch/query-definition.d.ts +1 -1
- package/lib/aws/cloudwatch/query-definition.js +4 -4
- package/lib/aws/cloudwatch/stats.js +1 -1
- package/lib/aws/cloudwatch/subscription-filter.d.ts +1 -1
- package/lib/aws/cloudwatch/subscription-filter.js +6 -6
- package/lib/aws/cloudwatch/text.js +1 -1
- package/lib/aws/cloudwatch/variable.js +3 -3
- package/lib/aws/cloudwatch/widget.js +1 -1
- package/lib/aws/compute/access-log.d.ts +1 -1
- package/lib/aws/compute/access-log.js +5 -5
- package/lib/aws/compute/activity.d.ts +1 -1
- package/lib/aws/compute/activity.js +5 -5
- package/lib/aws/compute/alb/application-listener-action.d.ts +1 -1
- package/lib/aws/compute/alb/application-listener-action.js +5 -5
- package/lib/aws/compute/alb/application-listener-certificate.js +3 -3
- package/lib/aws/compute/alb/application-listener-rule.js +9 -9
- package/lib/aws/compute/alb/application-listener.js +5 -5
- package/lib/aws/compute/alb/application-load-balancer.js +8 -8
- package/lib/aws/compute/alb/application-target-group.js +7 -7
- package/lib/aws/compute/alb/conditions.js +3 -3
- package/lib/aws/compute/alb/trust-store-revocation.js +3 -3
- package/lib/aws/compute/alb/trust-store.js +7 -7
- package/lib/aws/compute/api-definition.js +9 -9
- package/lib/aws/compute/api-key.js +6 -6
- package/lib/aws/compute/architecture.js +1 -1
- package/lib/aws/compute/aspects/require-imdsv2-aspect.d.ts +1 -1
- package/lib/aws/compute/aspects/require-imdsv2-aspect.js +6 -6
- package/lib/aws/compute/authorizer.js +1 -1
- package/lib/aws/compute/authorizers/identity-source.js +1 -1
- package/lib/aws/compute/authorizers/lambda.d.ts +1 -1
- package/lib/aws/compute/authorizers/lambda.js +6 -6
- package/lib/aws/compute/base-path-mapping.js +5 -5
- package/lib/aws/compute/base-scalable-attribute.js +1 -1
- package/lib/aws/compute/bastion-host.js +4 -4
- package/lib/aws/compute/chain.js +1 -1
- package/lib/aws/compute/client-vpn-authorization-rule.js +3 -3
- package/lib/aws/compute/client-vpn-endpoint.d.ts +1 -1
- package/lib/aws/compute/client-vpn-endpoint.js +9 -9
- package/lib/aws/compute/client-vpn-route.d.ts +1 -1
- package/lib/aws/compute/client-vpn-route.js +4 -4
- package/lib/aws/compute/code.d.ts +3 -3
- package/lib/aws/compute/code.js +15 -15
- package/lib/aws/compute/condition.js +1 -1
- package/lib/aws/compute/connections.js +1 -1
- package/lib/aws/compute/cors.js +1 -1
- package/lib/aws/compute/deployment.js +5 -5
- package/lib/aws/compute/domain-name.js +5 -5
- package/lib/aws/compute/event-invoke-config.d.ts +1 -1
- package/lib/aws/compute/event-invoke-config.js +3 -3
- package/lib/aws/compute/event-source-filter.js +2 -2
- package/lib/aws/compute/event-source-mapping.js +7 -7
- package/lib/aws/compute/event-sources/s3-onfailure-destination.js +1 -1
- package/lib/aws/compute/event-sources/s3.js +1 -1
- package/lib/aws/compute/event-sources/sqs-dlq.js +1 -1
- package/lib/aws/compute/event-sources/sqs.js +5 -5
- package/lib/aws/compute/fields.d.ts +1 -1
- package/lib/aws/compute/fields.js +12 -12
- package/lib/aws/compute/function-alias.d.ts +1 -1
- package/lib/aws/compute/function-alias.js +3 -3
- package/lib/aws/compute/function-base.d.ts +1 -1
- package/lib/aws/compute/function-base.js +10 -9
- package/lib/aws/compute/function-destinations/event-bridge.js +1 -1
- package/lib/aws/compute/function-destinations/function.js +1 -1
- package/lib/aws/compute/function-destinations/sqs.js +1 -1
- package/lib/aws/compute/function-nodejs/bundling.js +6 -6
- package/lib/aws/compute/function-nodejs/function.js +4 -4
- package/lib/aws/compute/function-url.d.ts +1 -1
- package/lib/aws/compute/function-url.js +3 -3
- package/lib/aws/compute/function-vpc-config.generated.d.ts +5 -5
- package/lib/aws/compute/function-vpc-config.generated.js +1 -1
- package/lib/aws/compute/function.d.ts +2 -2
- package/lib/aws/compute/function.js +9 -9
- package/lib/aws/compute/gateway-response.d.ts +1 -1
- package/lib/aws/compute/gateway-response.js +4 -4
- package/lib/aws/compute/handler.js +1 -1
- package/lib/aws/compute/instance-types.js +1 -1
- package/lib/aws/compute/instance.d.ts +1 -1
- package/lib/aws/compute/instance.js +9 -9
- package/lib/aws/compute/integration.js +4 -4
- package/lib/aws/compute/integrations/aws.js +3 -3
- package/lib/aws/compute/integrations/http.js +1 -1
- package/lib/aws/compute/integrations/lambda.js +5 -5
- package/lib/aws/compute/integrations/mock.js +1 -1
- package/lib/aws/compute/integrations/stepfunctions.js +4 -4
- package/lib/aws/compute/ip-addresses.d.ts +1 -1
- package/lib/aws/compute/ip-addresses.js +10 -10
- package/lib/aws/compute/ipam.d.ts +1 -1
- package/lib/aws/compute/ipam.js +5 -5
- package/lib/aws/compute/key-pair.d.ts +1 -1
- package/lib/aws/compute/key-pair.js +6 -6
- package/lib/aws/compute/lambda-api.js +1 -1
- package/lib/aws/compute/launch-template.d.ts +1 -1
- package/lib/aws/compute/launch-template.js +12 -12
- package/lib/aws/compute/lb-shared/base-listener.js +9 -9
- package/lib/aws/compute/lb-shared/base-load-balancer.d.ts +2 -2
- package/lib/aws/compute/lb-shared/base-load-balancer.js +12 -12
- package/lib/aws/compute/lb-shared/base-target-group.d.ts +1 -1
- package/lib/aws/compute/lb-shared/base-target-group.js +15 -15
- package/lib/aws/compute/lb-shared/lb-listener-config.generated.d.ts +34 -34
- package/lib/aws/compute/lb-shared/lb-listener-config.generated.js +1 -1
- package/lib/aws/compute/lb-shared/lb-target-group-attachment-config.generated.d.ts +11 -6
- package/lib/aws/compute/lb-shared/lb-target-group-attachment-config.generated.js +1 -1
- package/lib/aws/compute/lb-shared/listener-action.d.ts +1 -1
- package/lib/aws/compute/lb-shared/listener-action.js +1 -1
- package/lib/aws/compute/lb-shared/listener-certificate.js +1 -1
- package/lib/aws/compute/lb-shared/load-balancer-targets.js +2 -2
- package/lib/aws/compute/lb-shared/util.js +5 -5
- package/lib/aws/compute/lb-targets/alb-target.js +3 -3
- package/lib/aws/compute/lb-targets/instance-target.js +2 -2
- package/lib/aws/compute/lb-targets/ip-target.js +1 -1
- package/lib/aws/compute/lb-targets/lambda-target.js +1 -1
- package/lib/aws/compute/load-balancer.d.ts +1 -1
- package/lib/aws/compute/load-balancer.js +8 -8
- package/lib/aws/compute/machine-image/amazon-linux-2022.js +2 -2
- package/lib/aws/compute/machine-image/amazon-linux-2023.js +2 -2
- package/lib/aws/compute/machine-image/amazon-linux2.js +2 -2
- package/lib/aws/compute/machine-image/common.js +1 -1
- package/lib/aws/compute/machine-image/machine-image.js +10 -10
- package/lib/aws/compute/method.js +6 -6
- package/lib/aws/compute/model.js +5 -5
- package/lib/aws/compute/nat.js +10 -10
- package/lib/aws/compute/network-acl-types.js +2 -2
- package/lib/aws/compute/network-acl.d.ts +1 -1
- package/lib/aws/compute/network-acl.js +5 -5
- package/lib/aws/compute/nlb/network-listener-action.d.ts +1 -1
- package/lib/aws/compute/nlb/network-listener-action.js +2 -2
- package/lib/aws/compute/nlb/network-listener-certificate.js +2 -2
- package/lib/aws/compute/nlb/network-listener.js +5 -5
- package/lib/aws/compute/nlb/network-load-balancer.js +6 -6
- package/lib/aws/compute/nlb/network-target-group.js +4 -4
- package/lib/aws/compute/peer.js +7 -7
- package/lib/aws/compute/placement-group.d.ts +1 -1
- package/lib/aws/compute/placement-group.js +3 -3
- package/lib/aws/compute/port.js +5 -5
- package/lib/aws/compute/prefix-list.d.ts +1 -1
- package/lib/aws/compute/prefix-list.js +5 -5
- package/lib/aws/compute/private/context-stub.js +7 -7
- package/lib/aws/compute/private/ebs-util.d.ts +1 -1
- package/lib/aws/compute/private/ebs-util.js +3 -3
- package/lib/aws/compute/private/json-path.d.ts +1 -1
- package/lib/aws/compute/private/json-path.js +8 -8
- package/lib/aws/compute/requestvalidator.js +3 -3
- package/lib/aws/compute/resource.js +5 -5
- package/lib/aws/compute/restapi.d.ts +1 -1
- package/lib/aws/compute/restapi.js +11 -11
- package/lib/aws/compute/route.d.ts +1 -1
- package/lib/aws/compute/route.js +13 -12
- package/lib/aws/compute/runtime.js +3 -3
- package/lib/aws/compute/scalable-target.d.ts +1 -1
- package/lib/aws/compute/scalable-target.js +3 -3
- package/lib/aws/compute/schedule.js +4 -4
- package/lib/aws/compute/security-group.js +47 -21
- package/lib/aws/compute/stage.d.ts +1 -1
- package/lib/aws/compute/stage.js +6 -6
- package/lib/aws/compute/state-graph.js +1 -1
- package/lib/aws/compute/state-machine-fragment.js +1 -1
- package/lib/aws/compute/state-machine.d.ts +2 -2
- package/lib/aws/compute/state-machine.js +8 -8
- package/lib/aws/compute/states/choice.js +1 -1
- package/lib/aws/compute/states/custom-state.js +5 -5
- package/lib/aws/compute/states/distributed-map/item-batcher.js +1 -1
- package/lib/aws/compute/states/distributed-map/item-reader.js +5 -5
- package/lib/aws/compute/states/distributed-map/result-writer.js +1 -1
- package/lib/aws/compute/states/distributed-map.js +4 -4
- package/lib/aws/compute/states/fail.js +4 -4
- package/lib/aws/compute/states/map-base.js +4 -4
- package/lib/aws/compute/states/map.js +1 -1
- package/lib/aws/compute/states/parallel.js +1 -1
- package/lib/aws/compute/states/pass.js +2 -2
- package/lib/aws/compute/states/state.js +4 -4
- package/lib/aws/compute/states/succeed.js +1 -1
- package/lib/aws/compute/states/task-base.js +2 -2
- package/lib/aws/compute/states/task.js +1 -1
- package/lib/aws/compute/states/wait.js +2 -2
- package/lib/aws/compute/step-scaling-action.js +5 -5
- package/lib/aws/compute/step-scaling-policy.js +7 -7
- package/lib/aws/compute/stepfunctions-api.js +2 -2
- package/lib/aws/compute/subnet-v2.d.ts +1 -1
- package/lib/aws/compute/subnet-v2.js +5 -5
- package/lib/aws/compute/subnet.js +4 -4
- package/lib/aws/compute/target-tracking-scaling-policy.js +3 -3
- package/lib/aws/compute/task-credentials.js +1 -1
- package/lib/aws/compute/task-input.js +1 -1
- package/lib/aws/compute/tasks/aws-sdk/call-aws-service.js +5 -5
- package/lib/aws/compute/tasks/eventbridge/put-events.js +1 -1
- package/lib/aws/compute/tasks/http/invoke.js +1 -1
- package/lib/aws/compute/tasks/lambda/invoke.js +1 -1
- package/lib/aws/compute/tasks/sqs/send-message.js +1 -1
- package/lib/aws/compute/tasks/stepfunctions/invoke-activity.js +1 -1
- package/lib/aws/compute/tasks/stepfunctions/start-execution.js +1 -1
- package/lib/aws/compute/types.js +1 -1
- package/lib/aws/compute/usage-plan.js +5 -5
- package/lib/aws/compute/user-data.d.ts +2 -2
- package/lib/aws/compute/user-data.js +10 -10
- package/lib/aws/compute/volume.d.ts +1 -1
- package/lib/aws/compute/volume.js +7 -7
- package/lib/aws/compute/vpc-endpoint-service.js +3 -3
- package/lib/aws/compute/vpc-endpoint.d.ts +1 -1
- package/lib/aws/compute/vpc-endpoint.js +13 -13
- package/lib/aws/compute/vpc-flow-logs.d.ts +1 -1
- package/lib/aws/compute/vpc-flow-logs.js +8 -8
- package/lib/aws/compute/vpc-link.js +5 -5
- package/lib/aws/compute/vpc-v2-base.js +6 -6
- package/lib/aws/compute/vpc-v2.d.ts +2 -2
- package/lib/aws/compute/vpc-v2.js +4 -4
- package/lib/aws/compute/vpc.d.ts +48 -5
- package/lib/aws/compute/vpc.js +316 -160
- package/lib/aws/compute/vpn.js +8 -8
- package/lib/aws/context-provider.d.ts +117 -0
- package/lib/aws/context-provider.js +141 -0
- package/lib/aws/cx-api.d.ts +171 -0
- package/lib/aws/cx-api.js +23 -3
- package/lib/aws/edge/certificate.d.ts +1 -1
- package/lib/aws/edge/certificate.js +6 -6
- package/lib/aws/edge/distribution.d.ts +1 -1
- package/lib/aws/edge/distribution.js +9 -9
- package/lib/aws/edge/dns-alias-record-targets.d.ts +1 -1
- package/lib/aws/edge/dns-alias-record-targets.js +7 -7
- package/lib/aws/edge/dns-record.d.ts +1 -1
- package/lib/aws/edge/dns-record.js +19 -19
- package/lib/aws/edge/dns-zone.d.ts +2 -2
- package/lib/aws/edge/dns-zone.js +5 -5
- package/lib/aws/edge/function.d.ts +1 -1
- package/lib/aws/edge/function.js +4 -4
- package/lib/aws/edge/key-value-store.d.ts +1 -1
- package/lib/aws/edge/key-value-store.js +6 -6
- package/lib/aws/edge/origin.d.ts +1 -1
- package/lib/aws/edge/origin.js +6 -6
- package/lib/aws/edge/response-headers-policy.d.ts +1 -1
- package/lib/aws/edge/response-headers-policy.js +6 -6
- package/lib/aws/encryption/alias.d.ts +1 -1
- package/lib/aws/encryption/alias.js +8 -8
- package/lib/aws/encryption/key.d.ts +1 -1
- package/lib/aws/encryption/key.js +6 -6
- package/lib/aws/encryption/via-service-principal.js +1 -1
- package/lib/aws/iam/grant.js +3 -3
- package/lib/aws/iam/group.js +5 -5
- package/lib/aws/iam/instance-profile.d.ts +1 -1
- package/lib/aws/iam/instance-profile.js +3 -3
- package/lib/aws/iam/managed-policy.d.ts +1 -1
- package/lib/aws/iam/managed-policy.js +3 -3
- package/lib/aws/iam/oidc-provider.d.ts +1 -1
- package/lib/aws/iam/oidc-provider.js +3 -3
- package/lib/aws/iam/policy-document-config.generated.d.ts +9 -9
- package/lib/aws/iam/policy-document-config.generated.js +1 -1
- package/lib/aws/iam/policy-document.d.ts +1 -1
- package/lib/aws/iam/policy-document.js +5 -5
- package/lib/aws/iam/policy-statement-props.generated.d.ts +8 -8
- package/lib/aws/iam/policy-statement-props.generated.js +1 -1
- package/lib/aws/iam/policy-statement.d.ts +1 -1
- package/lib/aws/iam/policy-statement.js +8 -8
- package/lib/aws/iam/policy.js +3 -3
- package/lib/aws/iam/principals.js +25 -25
- package/lib/aws/iam/private/imported-role.js +3 -3
- package/lib/aws/iam/private/postprocess-policy-document.d.ts +1 -1
- package/lib/aws/iam/private/postprocess-policy-document.js +1 -1
- package/lib/aws/iam/private/util.d.ts +1 -1
- package/lib/aws/iam/private/util.js +5 -5
- package/lib/aws/iam/role.d.ts +1 -1
- package/lib/aws/iam/role.js +6 -6
- package/lib/aws/iam/saml-provider.d.ts +1 -1
- package/lib/aws/iam/saml-provider.js +6 -6
- package/lib/aws/iam/unknown-principal.js +4 -4
- package/lib/aws/iam/user.js +3 -3
- package/lib/aws/network/network.d.ts +1 -1
- package/lib/aws/network/network.js +1 -1
- package/lib/aws/network/simple-ipv4-vpc.js +12 -12
- package/lib/aws/network/subnet-group.d.ts +1 -1
- package/lib/aws/network/subnet-group.js +5 -5
- package/lib/aws/network/subnet.d.ts +1 -1
- package/lib/aws/network/subnet.js +6 -6
- package/lib/aws/notify/archive.d.ts +1 -1
- package/lib/aws/notify/archive.js +3 -3
- package/lib/aws/notify/connection.d.ts +1 -1
- package/lib/aws/notify/connection.js +5 -5
- package/lib/aws/notify/event-bus.d.ts +1 -1
- package/lib/aws/notify/event-bus.js +10 -10
- package/lib/aws/notify/event-pattern.d.ts +1 -1
- package/lib/aws/notify/event-pattern.js +5 -5
- package/lib/aws/notify/input.d.ts +1 -1
- package/lib/aws/notify/input.js +12 -12
- package/lib/aws/notify/kinesis-stream.d.ts +1 -1
- package/lib/aws/notify/kinesis-stream.js +7 -7
- package/lib/aws/notify/notification-rule.js +8 -8
- package/lib/aws/notify/policy.js +3 -3
- package/lib/aws/notify/queue-base.js +1 -1
- package/lib/aws/notify/queue-policy.js +3 -3
- package/lib/aws/notify/queue.d.ts +1 -1
- package/lib/aws/notify/queue.js +8 -8
- package/lib/aws/notify/resource-policy.js +3 -3
- package/lib/aws/notify/rule.d.ts +1 -1
- package/lib/aws/notify/rule.js +6 -6
- package/lib/aws/notify/schedule.js +4 -4
- package/lib/aws/notify/sns-grants.generated.js +1 -1
- package/lib/aws/notify/sqs-grants.generated.js +1 -1
- package/lib/aws/notify/subscription-filter.js +1 -1
- package/lib/aws/notify/subscription.js +6 -6
- package/lib/aws/notify/subscriptions/email.js +1 -1
- package/lib/aws/notify/subscriptions/lambda.js +4 -4
- package/lib/aws/notify/subscriptions/sms.js +1 -1
- package/lib/aws/notify/subscriptions/sqs.js +4 -4
- package/lib/aws/notify/subscriptions/url.js +4 -4
- package/lib/aws/notify/target.d.ts +1 -1
- package/lib/aws/notify/target.js +1 -1
- package/lib/aws/notify/targets/event-bus.js +1 -1
- package/lib/aws/notify/targets/function.js +1 -1
- package/lib/aws/notify/targets/log-group.js +2 -2
- package/lib/aws/notify/targets/sqs.js +1 -1
- package/lib/aws/notify/targets/state-machine.js +1 -1
- package/lib/aws/notify/targets/util.js +3 -3
- package/lib/aws/notify/topic-base.js +4 -4
- package/lib/aws/notify/topic.js +7 -7
- package/lib/aws/provider-config.generated.d.ts +42 -36
- package/lib/aws/provider-config.generated.js +1 -1
- package/lib/aws/region-lookup.js +4 -4
- package/lib/aws/storage/assets/image-asset.js +8 -8
- package/lib/aws/storage/assets/s3.js +1 -1
- package/lib/aws/storage/auth-token.js +2 -2
- package/lib/aws/storage/billing.js +1 -1
- package/lib/aws/storage/bucket-notifications.d.ts +1 -1
- package/lib/aws/storage/bucket-notifications.js +8 -8
- package/lib/aws/storage/bucket-policy.d.ts +1 -1
- package/lib/aws/storage/bucket-policy.js +3 -3
- package/lib/aws/storage/bucket-source.d.ts +1 -1
- package/lib/aws/storage/bucket-source.js +7 -7
- package/lib/aws/storage/bucket.d.ts +1 -1
- package/lib/aws/storage/bucket.js +8 -8
- package/lib/aws/storage/capacity.js +1 -1
- package/lib/aws/storage/cors-config.generated.d.ts +5 -5
- package/lib/aws/storage/cors-config.generated.js +1 -1
- package/lib/aws/storage/cors-rule-config.generated.d.ts +5 -5
- package/lib/aws/storage/cors-rule-config.generated.js +1 -1
- package/lib/aws/storage/ecr-repository.js +11 -11
- package/lib/aws/storage/encryption.d.ts +1 -1
- package/lib/aws/storage/encryption.js +5 -5
- package/lib/aws/storage/lifecycle-config.generated.d.ts +9 -9
- package/lib/aws/storage/lifecycle-config.generated.js +1 -1
- package/lib/aws/storage/notification-targets/function.js +2 -2
- package/lib/aws/storage/notification-targets/queue.js +4 -4
- package/lib/aws/storage/origin-access-identity.d.ts +2 -2
- package/lib/aws/storage/origin-access-identity.js +3 -3
- package/lib/aws/storage/parameter-util.js +5 -5
- package/lib/aws/storage/parameter.d.ts +2 -2
- package/lib/aws/storage/parameter.js +16 -16
- package/lib/aws/storage/stream-grants.js +1 -1
- package/lib/aws/storage/table-grants.js +1 -1
- package/lib/aws/storage/table.d.ts +1 -1
- package/lib/aws/storage/table.js +10 -10
- package/lib/aws/storage/website-config.generated.d.ts +8 -8
- package/lib/aws/storage/website-config.generated.js +1 -1
- package/lib/bundling.js +5 -5
- package/lib/construct-base.d.ts +1 -1
- package/lib/construct-base.js +10 -10
- package/lib/duration.js +9 -9
- package/lib/errors.js +1 -1
- package/lib/expiration.js +1 -1
- package/lib/fs/ignore.js +4 -4
- package/lib/fs/index.js +1 -1
- package/lib/private/terraform-dependables-aspect.d.ts +1 -1
- package/lib/private/terraform-dependables-aspect.js +6 -6
- package/lib/private/unique-resource-name.js +3 -3
- package/lib/size.js +6 -6
- package/lib/stack-base.d.ts +2 -2
- package/lib/stack-base.js +16 -16
- package/lib/terra-func.d.ts +1 -1
- package/lib/terra-func.js +18 -18
- package/lib/time-zone.js +1 -1
- package/lib/token.js +5 -5
- package/package.json +19 -17
- package/setup.js +2 -2
|
@@ -7,7 +7,7 @@ exports.toPrincipalJson = toPrincipalJson;
|
|
|
7
7
|
exports.defaultAddPrincipalToAssumeRole = defaultAddPrincipalToAssumeRole;
|
|
8
8
|
exports.mergePrincipal = mergePrincipal;
|
|
9
9
|
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
10
|
-
const
|
|
10
|
+
const cdktn_1 = require("cdktn");
|
|
11
11
|
const aws_stack_1 = require("../aws-stack");
|
|
12
12
|
const policy_statement_1 = require("./policy-statement");
|
|
13
13
|
var PrincipalType;
|
|
@@ -74,7 +74,7 @@ class PrincipalPolicyFragment {
|
|
|
74
74
|
}
|
|
75
75
|
exports.PrincipalPolicyFragment = PrincipalPolicyFragment;
|
|
76
76
|
_a = JSII_RTTI_SYMBOL_1;
|
|
77
|
-
PrincipalPolicyFragment[_a] = { fqn: "terraconstructs.aws.iam.PrincipalPolicyFragment", version: "0.2.
|
|
77
|
+
PrincipalPolicyFragment[_a] = { fqn: "terraconstructs.aws.iam.PrincipalPolicyFragment", version: "0.2.5" };
|
|
78
78
|
/**
|
|
79
79
|
* Read from AWS Principal JSON to Terraform principals block(s)
|
|
80
80
|
*
|
|
@@ -193,7 +193,7 @@ class PrincipalBase {
|
|
|
193
193
|
}
|
|
194
194
|
exports.PrincipalBase = PrincipalBase;
|
|
195
195
|
_b = JSII_RTTI_SYMBOL_1;
|
|
196
|
-
PrincipalBase[_b] = { fqn: "terraconstructs.aws.iam.PrincipalBase", version: "0.2.
|
|
196
|
+
PrincipalBase[_b] = { fqn: "terraconstructs.aws.iam.PrincipalBase", version: "0.2.5" };
|
|
197
197
|
/**
|
|
198
198
|
* Specify a principal by the Amazon Resource Name (ARN).
|
|
199
199
|
* You can specify AWS accounts, IAM users, Federated SAML users, IAM roles, and specific assumed-role sessions.
|
|
@@ -238,7 +238,7 @@ class ArnPrincipal extends PrincipalBase {
|
|
|
238
238
|
}
|
|
239
239
|
exports.ArnPrincipal = ArnPrincipal;
|
|
240
240
|
_c = JSII_RTTI_SYMBOL_1;
|
|
241
|
-
ArnPrincipal[_c] = { fqn: "terraconstructs.aws.iam.ArnPrincipal", version: "0.2.
|
|
241
|
+
ArnPrincipal[_c] = { fqn: "terraconstructs.aws.iam.ArnPrincipal", version: "0.2.5" };
|
|
242
242
|
/**
|
|
243
243
|
* Specify AWS account ID as the principal entity in a policy to delegate authority to the account.
|
|
244
244
|
*/
|
|
@@ -250,7 +250,7 @@ class AccountPrincipal extends ArnPrincipal {
|
|
|
250
250
|
constructor(accountId) {
|
|
251
251
|
super(new AwsStackDependentToken((awsStack) => `arn:${awsStack.partition}:iam::${accountId}:root`).toString());
|
|
252
252
|
this.accountId = accountId;
|
|
253
|
-
if (!
|
|
253
|
+
if (!cdktn_1.Token.isUnresolved(accountId) && typeof accountId !== "string") {
|
|
254
254
|
throw new Error("accountId should be of type string");
|
|
255
255
|
}
|
|
256
256
|
this.principalAccount = accountId;
|
|
@@ -261,7 +261,7 @@ class AccountPrincipal extends ArnPrincipal {
|
|
|
261
261
|
}
|
|
262
262
|
exports.AccountPrincipal = AccountPrincipal;
|
|
263
263
|
_d = JSII_RTTI_SYMBOL_1;
|
|
264
|
-
AccountPrincipal[_d] = { fqn: "terraconstructs.aws.iam.AccountPrincipal", version: "0.2.
|
|
264
|
+
AccountPrincipal[_d] = { fqn: "terraconstructs.aws.iam.AccountPrincipal", version: "0.2.5" };
|
|
265
265
|
/**
|
|
266
266
|
* An IAM principal that represents an AWS service (i.e. `sqs.amazonaws.com`).
|
|
267
267
|
*/
|
|
@@ -318,7 +318,7 @@ class ServicePrincipal extends PrincipalBase {
|
|
|
318
318
|
}
|
|
319
319
|
exports.ServicePrincipal = ServicePrincipal;
|
|
320
320
|
_e = JSII_RTTI_SYMBOL_1;
|
|
321
|
-
ServicePrincipal[_e] = { fqn: "terraconstructs.aws.iam.ServicePrincipal", version: "0.2.
|
|
321
|
+
ServicePrincipal[_e] = { fqn: "terraconstructs.aws.iam.ServicePrincipal", version: "0.2.5" };
|
|
322
322
|
/**
|
|
323
323
|
* A principal that represents an AWS Organization
|
|
324
324
|
*/
|
|
@@ -349,7 +349,7 @@ class OrganizationPrincipal extends PrincipalBase {
|
|
|
349
349
|
}
|
|
350
350
|
exports.OrganizationPrincipal = OrganizationPrincipal;
|
|
351
351
|
_f = JSII_RTTI_SYMBOL_1;
|
|
352
|
-
OrganizationPrincipal[_f] = { fqn: "terraconstructs.aws.iam.OrganizationPrincipal", version: "0.2.
|
|
352
|
+
OrganizationPrincipal[_f] = { fqn: "terraconstructs.aws.iam.OrganizationPrincipal", version: "0.2.5" };
|
|
353
353
|
/**
|
|
354
354
|
* A policy principal for canonicalUserIds - useful for S3 bucket policies that use
|
|
355
355
|
* Origin Access identities.
|
|
@@ -391,7 +391,7 @@ class CanonicalUserPrincipal extends PrincipalBase {
|
|
|
391
391
|
}
|
|
392
392
|
exports.CanonicalUserPrincipal = CanonicalUserPrincipal;
|
|
393
393
|
_g = JSII_RTTI_SYMBOL_1;
|
|
394
|
-
CanonicalUserPrincipal[_g] = { fqn: "terraconstructs.aws.iam.CanonicalUserPrincipal", version: "0.2.
|
|
394
|
+
CanonicalUserPrincipal[_g] = { fqn: "terraconstructs.aws.iam.CanonicalUserPrincipal", version: "0.2.5" };
|
|
395
395
|
/**
|
|
396
396
|
* Principal entity that represents a federated identity provider such as Amazon Cognito,
|
|
397
397
|
* that can be used to provide temporary security credentials to users who have been authenticated.
|
|
@@ -424,7 +424,7 @@ class FederatedPrincipal extends PrincipalBase {
|
|
|
424
424
|
}
|
|
425
425
|
exports.FederatedPrincipal = FederatedPrincipal;
|
|
426
426
|
_h = JSII_RTTI_SYMBOL_1;
|
|
427
|
-
FederatedPrincipal[_h] = { fqn: "terraconstructs.aws.iam.FederatedPrincipal", version: "0.2.
|
|
427
|
+
FederatedPrincipal[_h] = { fqn: "terraconstructs.aws.iam.FederatedPrincipal", version: "0.2.5" };
|
|
428
428
|
/**
|
|
429
429
|
* A principal that represents a federated identity provider as Web Identity such as Cognito, Amazon,
|
|
430
430
|
* Facebook, Google, etc.
|
|
@@ -449,7 +449,7 @@ class WebIdentityPrincipal extends FederatedPrincipal {
|
|
|
449
449
|
}
|
|
450
450
|
exports.WebIdentityPrincipal = WebIdentityPrincipal;
|
|
451
451
|
_j = JSII_RTTI_SYMBOL_1;
|
|
452
|
-
WebIdentityPrincipal[_j] = { fqn: "terraconstructs.aws.iam.WebIdentityPrincipal", version: "0.2.
|
|
452
|
+
WebIdentityPrincipal[_j] = { fqn: "terraconstructs.aws.iam.WebIdentityPrincipal", version: "0.2.5" };
|
|
453
453
|
/**
|
|
454
454
|
* A principal that represents a federated identity provider as from a OpenID Connect provider.
|
|
455
455
|
*/
|
|
@@ -472,7 +472,7 @@ class OpenIdConnectPrincipal extends WebIdentityPrincipal {
|
|
|
472
472
|
}
|
|
473
473
|
exports.OpenIdConnectPrincipal = OpenIdConnectPrincipal;
|
|
474
474
|
_k = JSII_RTTI_SYMBOL_1;
|
|
475
|
-
OpenIdConnectPrincipal[_k] = { fqn: "terraconstructs.aws.iam.OpenIdConnectPrincipal", version: "0.2.
|
|
475
|
+
OpenIdConnectPrincipal[_k] = { fqn: "terraconstructs.aws.iam.OpenIdConnectPrincipal", version: "0.2.5" };
|
|
476
476
|
/**
|
|
477
477
|
* Principal entity that represents a SAML federated identity provider
|
|
478
478
|
*/
|
|
@@ -486,7 +486,7 @@ class SamlPrincipal extends FederatedPrincipal {
|
|
|
486
486
|
}
|
|
487
487
|
exports.SamlPrincipal = SamlPrincipal;
|
|
488
488
|
_l = JSII_RTTI_SYMBOL_1;
|
|
489
|
-
SamlPrincipal[_l] = { fqn: "terraconstructs.aws.iam.SamlPrincipal", version: "0.2.
|
|
489
|
+
SamlPrincipal[_l] = { fqn: "terraconstructs.aws.iam.SamlPrincipal", version: "0.2.5" };
|
|
490
490
|
/**
|
|
491
491
|
* Principal entity that represents a SAML federated identity provider for
|
|
492
492
|
* programmatic and AWS Management Console access.
|
|
@@ -529,7 +529,7 @@ class SamlConsolePrincipal extends SamlPrincipal {
|
|
|
529
529
|
}
|
|
530
530
|
exports.SamlConsolePrincipal = SamlConsolePrincipal;
|
|
531
531
|
_m = JSII_RTTI_SYMBOL_1;
|
|
532
|
-
SamlConsolePrincipal[_m] = { fqn: "terraconstructs.aws.iam.SamlConsolePrincipal", version: "0.2.
|
|
532
|
+
SamlConsolePrincipal[_m] = { fqn: "terraconstructs.aws.iam.SamlConsolePrincipal", version: "0.2.5" };
|
|
533
533
|
/**
|
|
534
534
|
* Use the AWS account into which a stack is deployed as the principal entity in a policy
|
|
535
535
|
*/
|
|
@@ -543,7 +543,7 @@ class AccountRootPrincipal extends AccountPrincipal {
|
|
|
543
543
|
}
|
|
544
544
|
exports.AccountRootPrincipal = AccountRootPrincipal;
|
|
545
545
|
_o = JSII_RTTI_SYMBOL_1;
|
|
546
|
-
AccountRootPrincipal[_o] = { fqn: "terraconstructs.aws.iam.AccountRootPrincipal", version: "0.2.
|
|
546
|
+
AccountRootPrincipal[_o] = { fqn: "terraconstructs.aws.iam.AccountRootPrincipal", version: "0.2.5" };
|
|
547
547
|
/**
|
|
548
548
|
* A principal representing all AWS identities in all accounts
|
|
549
549
|
*
|
|
@@ -564,7 +564,7 @@ class AnyPrincipal extends ArnPrincipal {
|
|
|
564
564
|
}
|
|
565
565
|
exports.AnyPrincipal = AnyPrincipal;
|
|
566
566
|
_p = JSII_RTTI_SYMBOL_1;
|
|
567
|
-
AnyPrincipal[_p] = { fqn: "terraconstructs.aws.iam.AnyPrincipal", version: "0.2.
|
|
567
|
+
AnyPrincipal[_p] = { fqn: "terraconstructs.aws.iam.AnyPrincipal", version: "0.2.5" };
|
|
568
568
|
/**
|
|
569
569
|
* A principal representing all identities in all accounts
|
|
570
570
|
* @deprecated use `AnyPrincipal`
|
|
@@ -573,7 +573,7 @@ class Anyone extends AnyPrincipal {
|
|
|
573
573
|
}
|
|
574
574
|
exports.Anyone = Anyone;
|
|
575
575
|
_q = JSII_RTTI_SYMBOL_1;
|
|
576
|
-
Anyone[_q] = { fqn: "terraconstructs.aws.iam.Anyone", version: "0.2.
|
|
576
|
+
Anyone[_q] = { fqn: "terraconstructs.aws.iam.Anyone", version: "0.2.5" };
|
|
577
577
|
/**
|
|
578
578
|
* A principal that uses a literal '*' in the IAM JSON language
|
|
579
579
|
*
|
|
@@ -602,7 +602,7 @@ class StarPrincipal extends PrincipalBase {
|
|
|
602
602
|
}
|
|
603
603
|
exports.StarPrincipal = StarPrincipal;
|
|
604
604
|
_r = JSII_RTTI_SYMBOL_1;
|
|
605
|
-
StarPrincipal[_r] = { fqn: "terraconstructs.aws.iam.StarPrincipal", version: "0.2.
|
|
605
|
+
StarPrincipal[_r] = { fqn: "terraconstructs.aws.iam.StarPrincipal", version: "0.2.5" };
|
|
606
606
|
/**
|
|
607
607
|
* Represents a principal that has multiple types of principals. A composite principal cannot
|
|
608
608
|
* have conditions. i.e. multiple ServicePrincipals that form a composite principal
|
|
@@ -667,7 +667,7 @@ class CompositePrincipal extends PrincipalBase {
|
|
|
667
667
|
}
|
|
668
668
|
exports.CompositePrincipal = CompositePrincipal;
|
|
669
669
|
_s = JSII_RTTI_SYMBOL_1;
|
|
670
|
-
CompositePrincipal[_s] = { fqn: "terraconstructs.aws.iam.CompositePrincipal", version: "0.2.
|
|
670
|
+
CompositePrincipal[_s] = { fqn: "terraconstructs.aws.iam.CompositePrincipal", version: "0.2.5" };
|
|
671
671
|
/**
|
|
672
672
|
* Base class for Principals that wrap other principals
|
|
673
673
|
*/
|
|
@@ -715,7 +715,7 @@ class ComparablePrincipal {
|
|
|
715
715
|
}
|
|
716
716
|
exports.ComparablePrincipal = ComparablePrincipal;
|
|
717
717
|
_t = JSII_RTTI_SYMBOL_1;
|
|
718
|
-
ComparablePrincipal[_t] = { fqn: "terraconstructs.aws.iam.ComparablePrincipal", version: "0.2.
|
|
718
|
+
ComparablePrincipal[_t] = { fqn: "terraconstructs.aws.iam.ComparablePrincipal", version: "0.2.5" };
|
|
719
719
|
/**
|
|
720
720
|
* An IAM principal with additional conditions specifying when the policy is in effect.
|
|
721
721
|
*
|
|
@@ -870,7 +870,7 @@ class PrincipalWithConditions extends PrincipalAdapter {
|
|
|
870
870
|
}
|
|
871
871
|
exports.PrincipalWithConditions = PrincipalWithConditions;
|
|
872
872
|
_u = JSII_RTTI_SYMBOL_1;
|
|
873
|
-
PrincipalWithConditions[_u] = { fqn: "terraconstructs.aws.iam.PrincipalWithConditions", version: "0.2.
|
|
873
|
+
PrincipalWithConditions[_u] = { fqn: "terraconstructs.aws.iam.PrincipalWithConditions", version: "0.2.5" };
|
|
874
874
|
/**
|
|
875
875
|
* Enables session tags on role assumptions from a principal
|
|
876
876
|
*
|
|
@@ -897,7 +897,7 @@ class SessionTagsPrincipal extends PrincipalAdapter {
|
|
|
897
897
|
}
|
|
898
898
|
exports.SessionTagsPrincipal = SessionTagsPrincipal;
|
|
899
899
|
_v = JSII_RTTI_SYMBOL_1;
|
|
900
|
-
SessionTagsPrincipal[_v] = { fqn: "terraconstructs.aws.iam.SessionTagsPrincipal", version: "0.2.
|
|
900
|
+
SessionTagsPrincipal[_v] = { fqn: "terraconstructs.aws.iam.SessionTagsPrincipal", version: "0.2.5" };
|
|
901
901
|
/**
|
|
902
902
|
* Add a principal to an AssumeRolePolicyDocument in the right way
|
|
903
903
|
*
|
|
@@ -934,7 +934,7 @@ class AwsStackDependentToken {
|
|
|
934
934
|
return this.fn(aws_stack_1.AwsStack.ofAwsConstruct(context.scope));
|
|
935
935
|
}
|
|
936
936
|
toString() {
|
|
937
|
-
return
|
|
937
|
+
return cdktn_1.Token.asString(this);
|
|
938
938
|
}
|
|
939
939
|
/**
|
|
940
940
|
* JSON-ify the token
|
|
@@ -961,7 +961,7 @@ class ServicePrincipalToken {
|
|
|
961
961
|
return awsStack.servicePrincipalName(this.service, this.opts.region);
|
|
962
962
|
}
|
|
963
963
|
toString() {
|
|
964
|
-
return
|
|
964
|
+
return cdktn_1.Token.asString(this, {
|
|
965
965
|
displayHint: this.service,
|
|
966
966
|
});
|
|
967
967
|
}
|
|
@@ -1029,4 +1029,4 @@ function hasStarPrincipal(principals) {
|
|
|
1029
1029
|
}
|
|
1030
1030
|
return false;
|
|
1031
1031
|
}
|
|
1032
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbmNpcGFscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hd3MvaWFtL3ByaW5jaXBhbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQXNNQSw4Q0EyQkM7QUFLRCwwQ0FtQkM7QUE4N0JELDBFQWdCQztBQThFRCx3Q0F5Q0M7O0FBOXpDRCxpQ0FBNEQ7QUFFNUQsNENBQXdDO0FBR3hDLHlEQVU0QjtBQWlDNUIsSUFBWSxhQU1YO0FBTkQsV0FBWSxhQUFhO0lBQ3ZCLDRCQUFXLENBQUE7SUFDWCx3Q0FBdUIsQ0FBQTtJQUN2QixvQ0FBbUIsQ0FBQTtJQUNuQixnREFBK0IsQ0FBQTtJQUMvQiwwQkFBUyxDQUFBO0FBQ1gsQ0FBQyxFQU5XLGFBQWEsNkJBQWIsYUFBYSxRQU14QjtBQUVELFNBQVMsb0JBQW9CLENBQUMsS0FBYTtJQUN6QyxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDM0MsT0FBTyxjQUFjLElBQUksYUFBYSxDQUFDO0FBQ3pDLENBQUM7QUFpRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQWEsdUJBQXVCO0lBQ2xDOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsUUFBUSxDQUNwQixhQUFrQixFQUNsQixpQkFBeUMsRUFBRTtRQUUzQyxPQUFPLElBQUksdUJBQXVCLENBQ2hDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxFQUNoQyxJQUFBLG9DQUFpQixFQUFDLGNBQWMsQ0FBQyxDQUNsQyxDQUFDO0lBQ0osQ0FBQztJQUVELCtDQUErQztJQUMvQyxJQUFXLGFBQWE7UUFDdEIsT0FBTyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUNELElBQVcsY0FBYztRQUN2QixPQUFPLElBQUEsa0NBQWUsRUFBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFlBQ2tCLFVBQWlDO0lBQ2pEOzs7T0FHRztJQUNhLGFBQXlCLEVBQUU7UUFMM0IsZUFBVSxHQUFWLFVBQVUsQ0FBdUI7UUFLakMsZUFBVSxHQUFWLFVBQVUsQ0FBaUI7SUFDMUMsQ0FBQzs7QUFwQ04sMERBcUNDOzs7QUFPRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQUMsZ0JBQXFCLEVBQUU7SUFDdkQsSUFBSSxPQUFPLGFBQWEsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN0QyxJQUFJLGFBQWEsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUMxQixPQUFPLENBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxDQUFDLEdBQUcsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0QsQ0FBQzthQUFNLENBQUM7WUFDTiwwREFBMEQ7WUFDMUQsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUM5RCxDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksT0FBTyxhQUFhLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDdEMsTUFBTSxJQUFJLEtBQUssQ0FDYiwrQ0FBK0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUMvRSxDQUFDO0lBQ0osQ0FBQztJQUNELE1BQU0sTUFBTSxHQUFHLElBQUksS0FBSyxFQUFrQixDQUFDO0lBQzNDLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7UUFDL0QsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FDYiwyQkFBMkIsR0FBRyx1QkFBdUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUNwRixDQUFDO1FBQ0osQ0FBQztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDVixXQUFXLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztZQUNyRSxJQUFJLEVBQUUsR0FBb0I7U0FDM0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLGVBQWUsQ0FDN0IsR0FBRyxjQUFnQztJQUVuQyxJQUNFLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUMzQixjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxHQUFHO1FBQzVDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUM7UUFDMUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHO1FBRXhDLE9BQU8sR0FBRyxDQUFDO0lBRWIsTUFBTSxNQUFNLEdBQXlDLEVBQUUsQ0FBQztJQUN4RCxLQUFLLE1BQU0sU0FBUyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO1lBQ3BCLFNBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUM7Z0JBQ2hDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDMUIsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUM7SUFDOUIsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUF1Q0Q7O0dBRUc7QUFDSCxNQUFzQixhQUFhO0lBQW5DO1FBQ2tCLG1CQUFjLEdBQWUsSUFBSSxDQUFDO1FBQ2xDLHFCQUFnQixHQUF1QixTQUFTLENBQUM7UUFPakU7O1dBRUc7UUFDYSxxQkFBZ0IsR0FBVyxnQkFBZ0IsQ0FBQztLQWtFN0Q7SUFoRVEsV0FBVyxDQUFDLFNBQTBCO1FBQzNDLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztJQUM3RCxDQUFDO0lBRU0sb0JBQW9CLENBQ3pCLFVBQTJCO1FBRTNCLG9FQUFvRTtRQUNwRSxtQ0FBbUM7UUFDbkMsT0FBTyxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRU0scUJBQXFCLENBQUMsUUFBeUI7UUFDcEQsMENBQTBDO1FBQzFDLFFBQVEsQ0FBQyxhQUFhLENBQ3BCLElBQUksa0NBQWUsQ0FBQztZQUNsQixPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7WUFDaEMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDO1NBQ25CLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVNLFFBQVE7UUFDYiwwRUFBMEU7UUFDMUUsaUNBQWlDO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTTtRQUNYLGtGQUFrRjtRQUNsRixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDO0lBQzNDLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNJLGNBQWMsQ0FBQyxHQUFHLFVBQXNCO1FBQzdDLE9BQU8sSUFBSSx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxlQUFlO1FBQ3BCLE9BQU8sSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QyxDQUFDOztBQXhFSCxzQ0E4RUM7OztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQWEsWUFBYSxTQUFRLGFBQWE7SUFDN0M7OztPQUdHO0lBQ0gsWUFBNEIsR0FBVztRQUNyQyxLQUFLLEVBQUUsQ0FBQztRQURrQixRQUFHLEdBQUgsR0FBRyxDQUFRO0lBRXZDLENBQUM7SUFFRCxJQUFXLGNBQWM7UUFDdkIsT0FBTyxJQUFJLHVCQUF1QixDQUFDO1lBQ2pDO2dCQUNFLElBQUksRUFBRSxhQUFhLENBQUMsR0FBRztnQkFDdkIsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQzthQUN4QjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxRQUFRO1FBQ2IsT0FBTyxnQkFBZ0IsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7O09BR0c7SUFDSSxjQUFjLENBQUMsY0FBc0I7UUFDMUMsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQ3pCLElBQUksRUFBRSxjQUFjO1lBQ3BCLFFBQVEsRUFBRSxvQkFBb0I7WUFDOUIsTUFBTSxFQUFFLENBQUMsY0FBYyxDQUFDO1NBQ3pCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxZQUFZO1FBQ2pCLE9BQU8sZ0JBQWdCLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNwQyxDQUFDOztBQXBDSCxvQ0FxQ0M7OztBQUVEOztHQUVHO0FBQ0gsTUFBYSxnQkFBaUIsU0FBUSxZQUFZO0lBR2hEOzs7T0FHRztJQUNILFlBQTRCLFNBQWM7UUFDeEMsS0FBSyxDQUNILElBQUksc0JBQXNCLENBQ3hCLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxPQUFPLFFBQVEsQ0FBQyxTQUFTLFNBQVMsU0FBUyxPQUFPLENBQ2pFLENBQUMsUUFBUSxFQUFFLENBQ2IsQ0FBQztRQUx3QixjQUFTLEdBQVQsU0FBUyxDQUFLO1FBTXhDLElBQUksQ0FBQyxhQUFLLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3BFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFNBQVMsQ0FBQztJQUNwQyxDQUFDO0lBRU0sUUFBUTtRQUNiLE9BQU8sb0JBQW9CLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQztJQUMvQyxDQUFDOztBQXJCSCw0Q0FzQkM7OztBQTRCRDs7R0FFRztBQUNILE1BQWEsZ0JBQWlCLFNBQVEsYUFBYTtJQUNqRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQW1CRztJQUNJLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxPQUFlO1FBQ2hELE9BQU8sSUFBSSxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxZQUNrQixPQUFlLEVBQ2QsT0FBNkIsRUFBRTtRQUVoRCxLQUFLLEVBQUUsQ0FBQztRQUhRLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDZCxTQUFJLEdBQUosSUFBSSxDQUEyQjtJQUdsRCxDQUFDO0lBRUQsSUFBVyxjQUFjO1FBQ3ZCLE9BQU8sSUFBSSx1QkFBdUIsQ0FDaEM7WUFDRTtnQkFDRSxJQUFJLEVBQUUsYUFBYSxDQUFDLE9BQU87Z0JBQzNCLFdBQVcsRUFBRTtvQkFDWCxJQUFJLHFCQUFxQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRTtpQkFDOUQ7YUFDRjtTQUNGLEVBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQ3JCLENBQUM7SUFDSixDQUFDO0lBRU0sUUFBUTtRQUNiLE9BQU8sb0JBQW9CLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQztJQUM3QyxDQUFDO0lBRU0sWUFBWTtRQUNqQixPQUFPLG9CQUFvQixJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDekUsQ0FBQzs7QUF6REgsNENBMERDOzs7QUFFRDs7R0FFRztBQUNILE1BQWEscUJBQXNCLFNBQVEsYUFBYTtJQUN0RDs7O09BR0c7SUFDSCxZQUE0QixjQUFzQjtRQUNoRCxLQUFLLEVBQUUsQ0FBQztRQURrQixtQkFBYyxHQUFkLGNBQWMsQ0FBUTtJQUVsRCxDQUFDO0lBRUQsSUFBVyxjQUFjO1FBQ3ZCLE9BQU8sSUFBSSx1QkFBdUIsQ0FDaEMsQ0FBQyxFQUFFLElBQUksRUFBRSxhQUFhLENBQUMsR0FBRyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFDakQ7WUFDRTtnQkFDRSxJQUFJLEVBQUUsY0FBYztnQkFDcEIsUUFBUSxFQUFFLG9CQUFvQjtnQkFDOUIsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQzthQUM5QjtTQUNGLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTSxRQUFRO1FBQ2IsT0FBTyx5QkFBeUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDO0lBQ3pELENBQUM7SUFFTSxZQUFZO1FBQ2pCLE9BQU8seUJBQXlCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4RCxDQUFDOztBQTVCSCxzREE2QkM7OztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQWEsc0JBQXVCLFNBQVEsYUFBYTtJQUN2RDs7Ozs7T0FLRztJQUNILFlBQTRCLGVBQXVCO1FBQ2pELEtBQUssRUFBRSxDQUFDO1FBRGtCLG9CQUFlLEdBQWYsZUFBZSxDQUFRO0lBRW5ELENBQUM7SUFFRCxJQUFXLGNBQWM7UUFDdkIsT0FBTyxJQUFJLHVCQUF1QixDQUFDO1lBQ2pDO2dCQUNFLElBQUksRUFBRSxhQUFhLENBQUMsYUFBYTtnQkFDakMsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQzthQUNwQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxRQUFRO1FBQ2IsT0FBTywwQkFBMEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDO0lBQzNELENBQUM7SUFFTSxZQUFZO1FBQ2pCLE9BQU8sMEJBQTBCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUMxRCxDQUFDOztBQTFCSCx3REEyQkM7OztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFhLGtCQUFtQixTQUFRLGFBQWE7SUFTbkQ7Ozs7T0FJRztJQUNILFlBQ2tCLFNBQWlCLEVBQ2pDLGFBQXlCLEVBQUUsRUFDM0IsbUJBQTJCLGdCQUFnQjtRQUUzQyxLQUFLLEVBQUUsQ0FBQztRQUpRLGNBQVMsR0FBVCxTQUFTLENBQVE7UUFNakMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0lBQzNDLENBQUM7SUFFRCxJQUFXLGNBQWM7UUFDdkIsT0FBTyxJQUFJLHVCQUF1QixDQUNoQyxDQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFDbEUsSUFBSSxDQUFDLFVBQVUsQ0FDaEIsQ0FBQztJQUNKLENBQUM7SUFFTSxRQUFRO1FBQ2IsT0FBTyxzQkFBc0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDO0lBQ2pELENBQUM7SUFFTSxZQUFZO1FBQ2pCLE9BQU8sc0JBQXNCLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7SUFDNUcsQ0FBQzs7QUF0Q0gsZ0RBdUNDOzs7QUFFRDs7O0dBR0c7QUFDSCxNQUFhLG9CQUFxQixTQUFRLGtCQUFrQjtJQUMxRDs7Ozs7O09BTUc7SUFDSCxZQUFZLGdCQUF3QixFQUFFLGFBQXlCLEVBQUU7UUFDL0QsS0FBSyxDQUFDLGdCQUFnQixFQUFFLFVBQVUsSUFBSSxFQUFFLEVBQUUsK0JBQStCLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQsSUFBVyxjQUFjO1FBQ3ZCLE9BQU8sSUFBSSx1QkFBdUIsQ0FDaEMsQ0FBQyxFQUFFLElBQUksRUFBRSxhQUFhLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQ2xFLElBQUksQ0FBQyxVQUFVLENBQ2hCLENBQUM7SUFDSixDQUFDO0lBRU0sUUFBUTtRQUNiLE9BQU8sd0JBQXdCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQztJQUNuRCxDQUFDOztBQXJCSCxvREFzQkM7OztBQUVEOztHQUVHO0FBQ0gsTUFBYSxzQkFBdUIsU0FBUSxvQkFBb0I7SUFDOUQ7Ozs7O09BS0c7SUFDSCxZQUNFLHFCQUE2QyxFQUM3QyxhQUF5QixFQUFFO1FBRTNCLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyx3QkFBd0IsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQsSUFBVyxjQUFjO1FBQ3ZCLE9BQU8sSUFBSSx1QkFBdUIsQ0FDaEMsQ0FBQyxFQUFFLElBQUksRUFBRSxhQUFhLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQ2xFLElBQUksQ0FBQyxVQUFVLENBQ2hCLENBQUM7SUFDSixDQUFDO0lBRU0sUUFBUTtRQUNiLE9BQU8sMEJBQTBCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQztJQUNyRCxDQUFDOztBQXZCSCx3REF3QkM7OztBQUVEOztHQUVHO0FBQ0gsTUFBYSxhQUFjLFNBQVEsa0JBQWtCO0lBQ25ELFlBQVksWUFBMkIsRUFBRSxVQUFzQjtRQUM3RCxLQUFLLENBQUMsWUFBWSxDQUFDLGVBQWUsRUFBRSxVQUFVLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRU0sUUFBUTtRQUNiLE9BQU8saUJBQWlCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQztJQUM1QyxDQUFDOztBQVBILHNDQVFDOzs7QUFFRDs7O0dBR0c7QUFDSCxNQUFhLG9CQUFxQixTQUFRLGFBQWE7SUFDckQ7Ozs7Ozs7Ozs7Ozs7Ozs7T0FnQkc7SUFFSDs7T0FFRztJQUNILFlBQVksWUFBMkIsRUFBRSxhQUF5QixFQUFFO1FBQ2xFLEtBQUssQ0FBQyxZQUFZLEVBQUU7WUFDbEIsR0FBRyxVQUFVO1lBQ2IseUNBQXlDO1lBQ3pDO2dCQUNFLElBQUksRUFBRSxjQUFjO2dCQUNwQixRQUFRLEVBQUUsVUFBVTtnQkFDcEIsTUFBTSxFQUFFLENBQUMsb0NBQW9DLENBQUM7YUFDL0M7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sUUFBUTtRQUNiLE9BQU8sd0JBQXdCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQztJQUNuRCxDQUFDOztBQXBDSCxvREFxQ0M7OztBQUVEOztHQUVHO0FBQ0gsTUFBYSxvQkFBcUIsU0FBUSxnQkFBZ0I7SUFDeEQ7UUFDRSxLQUFLLENBQ0gsSUFBSSxzQkFBc0IsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUN0RSxDQUFDO0lBQ0osQ0FBQztJQUVNLFFBQVE7UUFDYixPQUFPLHdCQUF3QixDQUFDO0lBQ2xDLENBQUM7O0FBVEgsb0RBVUM7OztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQWEsWUFBYSxTQUFRLFlBQVk7SUFDNUM7UUFDRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDYixDQUFDO0lBRU0sUUFBUTtRQUNiLE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQzs7QUFQSCxvQ0FRQzs7O0FBRUQ7OztHQUdHO0FBQ0gsTUFBYSxNQUFPLFNBQVEsWUFBWTs7QUFBeEMsd0JBQTJDOzs7QUFFM0M7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFhLGFBQWMsU0FBUSxhQUFhO0lBQWhEOztRQUNrQixtQkFBYyxHQUM1QixJQUFJLHVCQUF1QixDQUFDO1lBQzFCO2dCQUNFLElBQUksRUFBRSxhQUFhLENBQUMsR0FBRztnQkFDdkIsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDO2FBQ25CO1NBQ0YsQ0FBQyxDQUFDO0tBU047SUFQUSxRQUFRO1FBQ2IsT0FBTyxpQkFBaUIsQ0FBQztJQUMzQixDQUFDO0lBRU0sWUFBWTtRQUNqQixPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDOztBQWZILHNDQWdCQzs7O0FBRUQ7OztHQUdHO0FBQ0gsTUFBYSxrQkFBbUIsU0FBUSxhQUFhO0lBSW5ELFlBQVksR0FBRyxVQUF3QjtRQUNyQyxLQUFLLEVBQUUsQ0FBQztRQUhPLGdCQUFXLEdBQUcsSUFBSSxLQUFLLEVBQWMsQ0FBQztRQUlyRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FDYix5RkFBeUYsQ0FDMUYsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDO1FBQ3ZELElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxhQUFhLENBQUMsR0FBRyxVQUF3QjtRQUM5QyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDO1FBQ3JDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVNLHFCQUFxQixDQUFDLEdBQW9CO1FBQy9DLEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pDLCtCQUErQixDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxQyxDQUFDO0lBQ0gsQ0FBQztJQUVELElBQVcsY0FBYztRQUN2Qiw4RUFBOEU7UUFDOUUsdUZBQXVGO1FBQ3ZGLEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxjQUFjLENBQUM7WUFDbEMsSUFBSSxRQUFRLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMxRCxNQUFNLElBQUksS0FBSyxDQUNiLCtEQUErRDtvQkFDN0Qsd0NBQXdDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FDckUsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxLQUFLLEVBQWtCLENBQUM7UUFDL0MsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakMsY0FBYyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzFELENBQUM7UUFDRCxPQUFPLElBQUksdUJBQXVCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVNLFFBQVE7UUFDYixPQUFPLHNCQUFzQixJQUFJLENBQUMsV0FBVyxHQUFHLENBQUM7SUFDbkQsQ0FBQztJQUVNLFlBQVk7UUFDakIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDeEUsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBQ0QsT0FBTyxzQkFBc0IsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQzs7QUFyRUgsZ0RBc0VDOzs7QUFFRDs7R0FFRztBQUNILE1BQWUsZ0JBQWlCLFNBQVEsYUFBYTtJQUluRCxZQUErQixPQUFtQjtRQUNoRCxLQUFLLEVBQUUsQ0FBQztRQURxQixZQUFPLEdBQVAsT0FBTyxDQUFZO1FBSGxDLHFCQUFnQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUM7UUFDakQscUJBQWdCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztJQUlqRSxDQUFDO0lBRUQsSUFBVyxjQUFjO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUM7SUFDckMsQ0FBQztJQUVNLG9CQUFvQixDQUN6QixTQUEwQjtRQUUxQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVEOztPQUVHO0lBQ08sWUFBWSxDQUFDLE1BQWM7UUFDbkMsTUFBTSxLQUFLLEdBQUcsbUJBQW1CLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoRSxPQUFPLEtBQUssS0FBSyxTQUFTO1lBQ3hCLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLEtBQUssSUFBSSxNQUFNLEVBQUU7WUFDL0MsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNoQixDQUFDO0NBQ0Y7QUFnQkQ7O0dBRUc7QUFDSCxNQUFhLG1CQUFtQjtJQUM5Qjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxxQkFBcUIsQ0FDakMsQ0FBYTtRQUViLE9BQU8sY0FBYyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsZUFBZSxDQUFDLENBQWE7UUFDekMsT0FBTyxtQkFBbUIsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7WUFDakQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUU7WUFDbEIsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNoQixDQUFDOztBQWpCSCxrREFrQkM7OztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBYSx1QkFBd0IsU0FBUSxnQkFBZ0I7SUFHM0QsWUFBWSxTQUFxQixFQUFFLFVBQXNCO1FBQ3ZELEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUhYLHlCQUFvQixHQUFpQixFQUFFLENBQUM7UUFJOUMsS0FBSyxNQUFNLENBQUMsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7SUFDSCxDQUFDO0lBRUQsNkhBQTZIO0lBQ3RILHFCQUFxQixDQUFDLEdBQW9CO1FBQy9DLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDakMsTUFBTSxJQUFJLEtBQUssQ0FDYixnRUFBZ0UsQ0FDakUsQ0FBQztRQUNKLENBQUM7UUFDRCxtRUFBbUU7UUFFbkUsaUVBQWlFO1FBQ2pFLE1BQU0sT0FBTyxHQUF1QyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNqRiwrQkFBK0IsQ0FDN0IsSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUMzRCxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzVDLFNBQVMsQ0FBQyxhQUFhLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDNUMsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNJLFlBQVksQ0FBQyxTQUFvQjtRQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2pELENBQUM7UUFFRCxNQUFNLGlCQUFpQixHQUNyQixJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRSxJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUc7Z0JBQzlELEdBQUcsaUJBQWlCO2dCQUNwQixHQUFHLFNBQVM7YUFDYixDQUFDO1FBQ0osQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxTQUFTLENBQUM7UUFDNUUsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSSxrQkFBa0IsQ0FBQyxHQUFXLEVBQUUsS0FBYztRQUNuRCxJQUFBLDBDQUF1QixFQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLElBQUEsMkNBQXdCLEVBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDakMsTUFBTSxJQUFJLEtBQUssQ0FDYiw4REFBOEQsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUMvRSxDQUFDO1lBQ0osQ0FBQztZQUNELElBQUksQ0FBQyxZQUFZLENBQUM7Z0JBQ2hCLElBQUksRUFBRSxHQUFHO2dCQUNULFFBQVEsRUFBRSxDQUFDO2dCQUNYLE1BQU0sRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ25DLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxhQUFhLENBQUMsVUFBc0I7UUFDekMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxtQkFBbUIsQ0FBQyxVQUFzQztRQUMvRCxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ3RELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFXLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUN6QixJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQ3RDLElBQUksQ0FBQyxvQkFBb0IsQ0FDMUIsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFXLGNBQWM7UUFDdkIsT0FBTyxJQUFJLHVCQUF1QixDQUNoQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQ3RDLElBQUksQ0FBQyxVQUFVLENBQ2hCLENBQUM7SUFDSixDQUFDO0lBRU0sUUFBUTtRQUNiLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU07UUFDWCxrRkFBa0Y7UUFDbEYsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQztJQUMzQyxDQUFDO0lBRU0sWUFBWTtRQUNqQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRU8sZUFBZSxDQUNyQixtQkFBK0IsRUFDL0Isb0JBQWtDO1FBRWxDLE1BQU0sZ0JBQWdCLEdBQWlCLEVBQUUsQ0FBQztRQUMxQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNoQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQzlCLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDaEMsQ0FBQztZQUNELGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxFQUFFLEVBQUU7WUFDakUsbUVBQW1FO1lBQ25FLHVFQUF1RTtZQUN2RSxtQkFBbUI7WUFDbkIsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNkLGdCQUFnQixDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQztnQkFDbkMsT0FBTyxDQUFDLFdBQVc7WUFDckIsQ0FBQztZQUVELHVDQUF1QztZQUN2Qyx3RUFBd0U7WUFDeEUsb0VBQW9FO1lBQ3BFLHVFQUF1RTtZQUN2RSxxQkFBcUI7WUFDckIsb0dBQW9HO1lBQ3BHLE9BQU87WUFDUCxJQUFJO1lBRUosNEJBQTRCO1lBQzVCLHFDQUFxQztZQUNyQyxzQ0FBc0M7WUFFdEMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFFBQVEsRUFBRSxHQUFHLFNBQVMsRUFBRSxDQUFDO1FBQ3pELENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFBLCtCQUFZLEVBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN4QyxDQUFDOztBQWxMSCwwREFtTEM7OztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBYSxvQkFBcUIsU0FBUSxnQkFBZ0I7SUFDeEQsWUFBWSxTQUFxQjtRQUMvQixLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbkIsQ0FBQztJQUVELDZIQUE2SDtJQUN0SCxxQkFBcUIsQ0FBQyxHQUFvQjtRQUMvQyxtRUFBbUU7UUFFbkUsaUVBQWlFO1FBQ2pFLE1BQU0sT0FBTyxHQUF1QyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNqRiwrQkFBK0IsQ0FDN0IsSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUMzRCxTQUFTLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDdkMsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFTSxZQUFZO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMvQixDQUFDOztBQXRCSCxvREF1QkM7OztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQiwrQkFBK0IsQ0FDN0MsU0FBcUIsRUFDckIsR0FBb0I7SUFFcEIsSUFBSSxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQ3JDLG9DQUFvQztRQUNwQyxTQUFTLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkMsQ0FBQztTQUFNLENBQUM7UUFDTixnREFBZ0Q7UUFDaEQsR0FBRyxDQUFDLGFBQWEsQ0FDZixJQUFJLGtDQUFlLENBQUM7WUFDbEIsT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDO1lBQ3JDLFVBQVUsRUFBRSxDQUFDLFNBQVMsQ0FBQztTQUN4QixDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxxQkFBcUIsQ0FDNUIsU0FBcUI7SUFFckIsT0FBTyxDQUFDLENBQUUsU0FBa0MsQ0FBQyxxQkFBcUIsQ0FBQztBQUNyRSxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLHNCQUFzQjtJQUUxQixZQUE2QixFQUEyQjtRQUEzQixPQUFFLEdBQUYsRUFBRSxDQUF5QjtRQUN0RCwrQkFBK0I7UUFDL0IsbUhBQW1IO1FBQ25ILHFHQUFxRztRQUNyRyxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRU0sT0FBTyxDQUFDLE9BQXdCO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxvQkFBUSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRU0sUUFBUTtRQUNiLE9BQU8sYUFBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU07UUFDWCxPQUFPLG9CQUFvQixDQUFDO0lBQzlCLENBQUM7Q0FDRjtBQUVELE1BQU0scUJBQXFCO0lBRXpCLFlBQ21CLE9BQWUsRUFDZixJQUEwQjtRQUQxQixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQ2YsU0FBSSxHQUFKLElBQUksQ0FBc0I7UUFFM0MsK0JBQStCO1FBQy9CLG1IQUFtSDtRQUNuSCxxR0FBcUc7UUFDckcsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVNLE9BQU8sQ0FBQyxHQUFvQjtRQUNqQyxNQUFNLFFBQVEsR0FBRyxvQkFBUSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEQsNENBQTRDO1FBQzVDLHdHQUF3RztRQUN4RyxPQUFPLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVNLFFBQVE7UUFDYixPQUFPLGFBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFO1lBQzFCLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTztTQUMxQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU07UUFDWCxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDO0lBQzdCLENBQUM7Q0FDRjtBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixjQUFjLENBQzVCLE1BQXdCLEVBQ3hCLE1BQXdCO0lBRXhCLGtFQUFrRTtJQUNsRSxJQUNFLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDL0MsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUMvQyxDQUFDO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FDYiwyQkFBMkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxzRUFBc0UsQ0FDdEosQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBdUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNoRSxLQUFLLE1BQU0sU0FBUyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQy9CLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsS0FBSyxNQUFNLGVBQWUsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNyQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxHQUFHLGVBQWUsQ0FBQztRQUNqRSxJQUFJLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN4QixNQUFNLG9CQUFvQixHQUFHLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFFLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDdkUsS0FBSyxNQUFNLEVBQUUsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO2dCQUNuQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDL0IsQ0FBQztZQUNELHlDQUF5QztZQUN6QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO1lBQ3ZFLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pCLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRztvQkFDZCxJQUFJO29CQUNKLFdBQVcsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDO2lCQUM5QyxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDVixJQUFJO2dCQUNKLFdBQVcsRUFBRSxDQUFDLEdBQUcsaUJBQWlCLENBQUM7YUFDcEMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxVQUE0QjtJQUNwRCwwRkFBMEY7SUFDMUYsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUN2RCxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEMsSUFDRSxTQUFTLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxHQUFHO1lBQ3BDLFNBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDbEMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQ2hDLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVG9rZW4sIElSZXNvbHZhYmxlLCBJUmVzb2x2ZUNvbnRleHQgfSBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7IElEZXBlbmRhYmxlIH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IEF3c1N0YWNrIH0gZnJvbSBcIi4uL2F3cy1zdGFja1wiO1xuaW1wb3J0IHsgSU9wZW5JZENvbm5lY3RQcm92aWRlciB9IGZyb20gXCIuL29pZGMtcHJvdmlkZXJcIjtcbmltcG9ydCB7IElQb2xpY3lEb2N1bWVudCB9IGZyb20gXCIuL3BvbGljeS1kb2N1bWVudFwiO1xuaW1wb3J0IHtcbiAgUG9saWN5U3RhdGVtZW50LFxuICBDb25kaXRpb24sXG4gIENvbmRpdGlvbnMsXG4gIGlzU3RyaW5nT3JBcnJheU9mU3RyaW5ncyxcbiAgdG9Db25kaXRpb25Kc29uLFxuICBmcm9tQ29uZGl0aW9uSnNvbixcbiAgdmFsaWRhdGVDb25kaXRpb25PYmplY3QsXG4gIENvbmRpdGlvbk1hcCxcbiAgdG9Db25kaXRpb25zLFxufSBmcm9tIFwiLi9wb2xpY3ktc3RhdGVtZW50XCI7XG5pbXBvcnQgeyBJU2FtbFByb3ZpZGVyIH0gZnJvbSBcIi4vc2FtbC1wcm92aWRlclwiO1xuLyoqXG4gKiBUZXJyYWZvcm0gUHJpbmNpcGFsIFByb3BzXG4gKlxuICogVGhlIGBwcmluY2lwYWxzYCBhbmQgYG5vdF9wcmluY2lwYWxzYCBibG9ja3Mgb2YgYSBwb2xpY3kgc3RhdGVtZW50XG4gKlxuICogUmVmOiBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy9sYXRlc3QvZG9jcy9kYXRhLXNvdXJjZXMvaWFtX3BvbGljeV9kb2N1bWVudCNwcmluY2lwYWxzLWFuZC1ub3RfcHJpbmNpcGFsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByaW5jaXBhbFByb3BzIHtcbiAgLyoqXG4gICAqIExpc3Qgb2YgaWRlbnRpZmllcnMgZm9yIHByaW5jaXBhbHMuXG4gICAqXG4gICAqIFdoZW4gdHlwZSBpcyBBV1MsIHRoZXNlIGFyZSBJQU0gcHJpbmNpcGFsIEFSTnMsIGUuZy4sIGFybjphd3M6aWFtOjoxMjM0NTY3ODkwMTpyb2xlL3lhay1yb2xlLlxuICAgKlxuICAgKiBXaGVuIHR5cGUgaXMgU2VydmljZSwgdGhlc2UgYXJlIEFXUyBTZXJ2aWNlIHJvbGVzLCBlLmcuLCBsYW1iZGEuYW1hem9uYXdzLmNvbS5cbiAgICpcbiAgICogV2hlbiB0eXBlIGlzIEZlZGVyYXRlZCwgdGhlc2UgYXJlIHdlYiBpZGVudGl0eSB1c2VycyBvciBTQU1MIHByb3ZpZGVyIEFSTnMsXG4gICAqIGUuZy4sIGFjY291bnRzLmdvb2dsZS5jb20gb3IgYXJuOmF3czppYW06OjEyMzQ1Njc4OTAxOnNhbWwtcHJvdmlkZXIveWFrLXNhbWwtcHJvdmlkZXIuXG4gICAqXG4gICAqIFdoZW4gdHlwZSBpcyBDYW5vbmljYWxVc2VyLCB0aGVzZSBhcmUgY2Fub25pY2FsIHVzZXIgSURzLFxuICAgKiBlLmcuLCA3OWE1OWRmOTAwYjk0OWU1NWQ5NmExZTY5OGZiYWNlZGZkNmUwOWQ5OGVhY2Y4ZjhkNTIxOGU3Y2Q0N2VmMmJlLlxuICAgKlxuICAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuNjguMC9kb2NzL2RhdGEtc291cmNlcy9pYW1fcG9saWN5X2RvY3VtZW50I2lkZW50aWZpZXJzIERhdGFBd3NJYW1Qb2xpY3lEb2N1bWVudCNpZGVudGlmaWVyc31cbiAgICovXG4gIHJlYWRvbmx5IGlkZW50aWZpZXJzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFR5cGUgb2YgcHJpbmNpcGFsLlxuICAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuNjguMC9kb2NzL2RhdGEtc291cmNlcy9pYW1fcG9saWN5X2RvY3VtZW50I3R5cGUgRGF0YUF3c0lhbVBvbGljeURvY3VtZW50I3R5cGV9XG4gICAqL1xuICByZWFkb25seSB0eXBlOiBQcmluY2lwYWxUeXBlO1xufVxuXG5leHBvcnQgZW51bSBQcmluY2lwYWxUeXBlIHtcbiAgQVdTID0gXCJBV1NcIixcbiAgRkVERVJBVEVEID0gXCJGZWRlcmF0ZWRcIixcbiAgU0VSVklDRSA9IFwiU2VydmljZVwiLFxuICBDQU5PTklDQUxVU0VSID0gXCJDYW5vbmljYWxVc2VyXCIsXG4gIEFOWSA9IFwiKlwiLFxufVxuXG5mdW5jdGlvbiBpc1ZhbGlkUHJpbmNpcGFsVHlwZSh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHVwcGVyQ2FzZVZhbHVlID0gdmFsdWUudG9VcHBlckNhc2UoKTtcbiAgcmV0dXJuIHVwcGVyQ2FzZVZhbHVlIGluIFByaW5jaXBhbFR5cGU7XG59XG5cbi8qKlxuICogQW55IG9iamVjdCB0aGF0IGhhcyBhbiBhc3NvY2lhdGVkIHByaW5jaXBhbCB0aGF0IGEgcGVybWlzc2lvbiBjYW4gYmUgZ3JhbnRlZCB0b1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElHcmFudGFibGUge1xuICAvKipcbiAgICogVGhlIHByaW5jaXBhbCB0byBncmFudCBwZXJtaXNzaW9ucyB0b1xuICAgKi9cbiAgcmVhZG9ubHkgZ3JhbnRQcmluY2lwYWw6IElQcmluY2lwYWw7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGxvZ2ljYWwgSUFNIHByaW5jaXBhbC5cbiAqXG4gKiBBbiBJUHJpbmNpcGFsIGRlc2NyaWJlcyBhIGxvZ2ljYWwgZW50aXR5IHRoYXQgY2FuIHBlcmZvcm0gQVdTIEFQSSBjYWxsc1xuICogYWdhaW5zdCBzZXRzIG9mIHJlc291cmNlcywgb3B0aW9uYWxseSB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnMuXG4gKlxuICogRXhhbXBsZXMgb2Ygc2ltcGxlIHByaW5jaXBhbHMgYXJlIElBTSBvYmplY3RzIHRoYXQgeW91IGNyZWF0ZSwgc3VjaFxuICogYXMgVXNlcnMgb3IgUm9sZXMuXG4gKlxuICogQW4gZXhhbXBsZSBvZiBhIG1vcmUgY29tcGxleCBwcmluY2lwYWxzIGlzIGEgYFNlcnZpY2VQcmluY2lwYWxgIChzdWNoIGFzXG4gKiBgbmV3IFNlcnZpY2VQcmluY2lwYWwoXCJzbnMuYW1hem9uYXdzLmNvbVwiKWAsIHdoaWNoIHJlcHJlc2VudHMgdGhlIFNpbXBsZVxuICogTm90aWZpY2F0aW9ucyBTZXJ2aWNlKS5cbiAqXG4gKiBBIHNpbmdsZSBsb2dpY2FsIFByaW5jaXBhbCBtYXkgYWxzbyBtYXAgdG8gYSBzZXQgb2YgcGh5c2ljYWwgcHJpbmNpcGFscy5cbiAqIEZvciBleGFtcGxlLCBgbmV3IE9yZ2FuaXphdGlvblByaW5jaXBhbCgnby0xMjM0JylgIHJlcHJlc2VudHMgYWxsXG4gKiBpZGVudGl0aWVzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIGdpdmVuIEFXUyBPcmdhbml6YXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVByaW5jaXBhbCBleHRlbmRzIElHcmFudGFibGUge1xuICAvKipcbiAgICogV2hlbiB0aGlzIFByaW5jaXBhbCBpcyB1c2VkIGluIGFuIEFzc3VtZVJvbGUgcG9saWN5LCB0aGUgYWN0aW9uIHRvIHVzZS5cbiAgICovXG4gIHJlYWRvbmx5IGFzc3VtZVJvbGVBY3Rpb246IHN0cmluZztcblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBwb2xpY3kgZnJhZ21lbnQgdGhhdCBpZGVudGlmaWVzIHRoaXMgcHJpbmNpcGFsIGluIGEgUG9saWN5LlxuICAgKi9cbiAgcmVhZG9ubHkgcG9saWN5RnJhZ21lbnQ6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgQVdTIGFjY291bnQgSUQgb2YgdGhpcyBwcmluY2lwYWwuXG4gICAqIENhbiBiZSB1bmRlZmluZWQgd2hlbiB0aGUgYWNjb3VudCBpcyBub3Qga25vd25cbiAgICogKGZvciBleGFtcGxlLCBmb3Igc2VydmljZSBwcmluY2lwYWxzKS5cbiAgICogQ2FuIGJlIGEgVG9rZW4gLSBpbiB0aGF0IGNhc2UsXG4gICAqIGl0J3MgYXNzdW1lZCB0byBiZSBhIHJlZmVyZW5jZSB0byB0aGUgRGF0YUF3c0NhbGxlcklkZW50aXR5XG4gICAqL1xuICByZWFkb25seSBwcmluY2lwYWxBY2NvdW50Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGQgdG8gdGhlIHBvbGljeSBvZiB0aGlzIHByaW5jaXBhbC5cbiAgICpcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgc3RhdGVtZW50IHdhcyBhZGRlZCwgZmFsc2UgaWYgdGhlIHByaW5jaXBhbCBpblxuICAgKiBxdWVzdGlvbiBkb2VzIG5vdCBoYXZlIGEgcG9saWN5IGRvY3VtZW50IHRvIGFkZCB0aGUgc3RhdGVtZW50IHRvLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYGFkZFRvUHJpbmNpcGFsUG9saWN5YCBpbnN0ZWFkLlxuICAgKi9cbiAgYWRkVG9Qb2xpY3koc3RhdGVtZW50OiBQb2xpY3lTdGF0ZW1lbnQpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBZGQgdG8gdGhlIHBvbGljeSBvZiB0aGlzIHByaW5jaXBhbC5cbiAgICovXG4gIGFkZFRvUHJpbmNpcGFsUG9saWN5KHN0YXRlbWVudDogUG9saWN5U3RhdGVtZW50KTogQWRkVG9QcmluY2lwYWxQb2xpY3lSZXN1bHQ7XG59XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHRoZSBmaWVsZHMgaW4gYSBQb2xpY3lTdGF0ZW1lbnQgdGhhdCBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSBhIHByaW5jaXBhbC5cbiAqXG4gKiBUaGlzIGNvbnNpc3RzIG9mIHRoZSBUZXJyYWZvcm0gUHJpbmNpcGFsUHJvcHMgcmVwcmVzZW50aW5nIHRoZVxuICogYHByaW5jaXBhbHNgIGJsb2NrKHMpIGluIGEgcG9saWN5IHN0YXRlbWVudC5cbiAqXG4gKiBHZW5lcmFsbHksIEFXUyBwcmluY2lwYWwgSlNPTiBsb29rcyBsaWtlOlxuICpcbiAqICAgICB7ICc8VFlQRT4nOiBbJ0lEJywgJ0lEJywgLi4uXSB9XG4gKlxuICogQW5kIHRoaXMgaXMgYWxzbyB0aGUgdHlwZSBvZiB0aGUgZmllbGQgYHByaW5jaXBhbEpzb25gLlxuICpcbiAqIEhvd2V2ZXIsIHRoZXJlIGlzIGEgc3BlY2lhbCB0eXBlIG9mIHByaW5jaXBhbCB0aGF0IGlzIGp1c3QgdGhlIHN0cmluZyAnKicsXG4gKiB3aGljaCBpcyB0cmVhdGVkIGRpZmZlcmVudGx5IGJ5IHNvbWUgc2VydmljZXMuXG4gKlxuICogVG8gcmVwcmVzZW50IHRoYXQgcHJpbmNpcGFsLCBgcHJpbmNpcGFsSnNvbmAgc2hvdWxkIGNvbnRhaW4gYCpgLlxuICogVG8gcmVwcmVzZW50IHRoYXQgcHJpbmNpcGFsIGluIFRlcnJhZm9ybSBwcmluY2lwYWxzIGJsb2NrKHMpLCB0aGVcbiAqIHR5cGUgc2hvdWxkIGJlIGBQcmluY2lwYWxUeXBlLkFOWWAgYW5kIHRoZSBpZGVudGlmaWVycyBzaG91bGQgYmUgYFsnKiddYC5cbiAqL1xuZXhwb3J0IGNsYXNzIFByaW5jaXBhbFBvbGljeUZyYWdtZW50IHtcbiAgLyoqXG4gICAqIFBhcnNlcyBhIEpTT04gb2JqZWN0IHdpdGggdGhlIEFXUyBJQU0gUHJpbmNpcGFsIHN0cnVjdHVyZVxuICAgKlxuICAgKiBSZWZlciB0byB0aGUgYGZyb21QcmluY2lwYWxKc29uYCBhbmQgYGZyb21Db25kaXRpb25Kc29uYCBmdW5jdGlvbnMgZm9yIG1vcmUgaW5mb3JtYXRpb25cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUpzb24oXG4gICAgcHJpbmNpcGFsSnNvbjogYW55LFxuICAgIGNvbmRpdGlvbnNKc29uOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge30sXG4gICk6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50IHtcbiAgICByZXR1cm4gbmV3IFByaW5jaXBhbFBvbGljeUZyYWdtZW50KFxuICAgICAgZnJvbVByaW5jaXBhbEpzb24ocHJpbmNpcGFsSnNvbiksXG4gICAgICBmcm9tQ29uZGl0aW9uSnNvbihjb25kaXRpb25zSnNvbiksXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRPRE86IFNob3VsZCB0aGlzIGFjdHVhbGx5IGJlIHVzZWQgYW55d2hlcmU/XG4gIHB1YmxpYyBnZXQgcHJpbmNpcGFsSnNvbigpOiBBd3NQcmluY2lwYWxKc29uIHtcbiAgICByZXR1cm4gdG9QcmluY2lwYWxKc29uKC4uLnRoaXMucHJpbmNpcGFscyk7XG4gIH1cbiAgcHVibGljIGdldCBjb25kaXRpb25zSnNvbigpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHtcbiAgICByZXR1cm4gdG9Db25kaXRpb25Kc29uKC4uLnRoaXMuY29uZGl0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHByaW5jaXBhbHMgQXJyYXkgb2YgXCJwcmluY2lwYWxzXCIgYmxvY2sgaW4gYSBwb2xpY3kgc3RhdGVtZW50XG4gICAqIEBwYXJhbSBjb25kaXRpb25zIGNvbmRpdGlvbnMgdGhhdCBuZWVkIHRvIGJlIGFwcGxpZWQgdG8gdGhpcyBwb2xpY3lcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBwcmluY2lwYWxzOiBBcnJheTxQcmluY2lwYWxQcm9wcz4sXG4gICAgLyoqXG4gICAgICogVGhlIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggdGhlIHBvbGljeSBpcyBpbiBlZmZlY3QuXG4gICAgICogU2VlIFt0aGUgSUFNIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uLmh0bWwpLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBjb25kaXRpb25zOiBDb25kaXRpb25zID0gW10sXG4gICkge31cbn1cblxuLyoqXG4gKiBUeXBlZCByZXByZXNlbnRhdGlvbiBvZiBBV1MgUHJpbmNpcGFsIEpTT05cbiAqL1xuZXhwb3J0IHR5cGUgQXdzUHJpbmNpcGFsSnNvbiA9IHN0cmluZyB8IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW10gfTtcblxuLyoqXG4gKiBSZWFkIGZyb20gQVdTIFByaW5jaXBhbCBKU09OIHRvIFRlcnJhZm9ybSBwcmluY2lwYWxzIGJsb2NrKHMpXG4gKlxuICogSGFuZGxlcyBzcGVjaWFsIGNhc2U6IGlmIHByaW5jaXBhbCBpcyBcIipcIiBhbmQgdHVybnMgaXQgaW50byB0aGUgYFN0YXJQcmluY2lwYWxgLFxuICpcbiAqIEV2ZW4gdGhvdWdoIHRoZSBJQU0gRG9jdW1lbnRhdGlvbiBzdGF0ZXMgdGhhdCBcIlByaW5jaXBhbFwiOiBcIipcIiBhbmQgXCJQcmluY2lwYWxcIjoge1wiQVdTXCI6IFwiKlwifSBhcmUgZXF1aXZhbGVudCxcbiAqIHRob3NlIHByaW5jaXBhbCBlbGVtZW50cyBoYXZlIGRpZmZlcmVudCBiZWhhdmlvciBpbiBzb21lIHNpdHVhdGlvbnMsIGUuZy4sIElBTSBSb2xlIFRydXN0IFBvbGljeS5cbiAqXG4gKiBUbyBoYXZlIFRlcnJhZm9ybSByZW5kZXIgSlNPTiBjb250YWluaW5nIFwiUHJpbmNpcGFsXCI6IFwiKlwiLCB1c2UgdHlwZSA9IFwiKlwiIGFuZCBpZGVudGlmaWVycyA9IFtcIipcIl0uXG4gKiBUbyBoYXZlIFRlcnJhZm9ybSByZW5kZXIgSlNPTiBjb250YWluaW5nIFwiUHJpbmNpcGFsXCI6IHtcIkFXU1wiOiBcIipcIn0sIHVzZSB0eXBlID0gXCJBV1NcIiBhbmQgaWRlbnRpZmllcnMgPSBbXCIqXCJdLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbVByaW5jaXBhbEpzb24ocHJpbmNpcGFsSnNvbjogYW55ID0ge30pOiBQcmluY2lwYWxQcm9wc1tdIHtcbiAgaWYgKHR5cGVvZiBwcmluY2lwYWxKc29uID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKHByaW5jaXBhbEpzb24gPT09IFwiKlwiKSB7XG4gICAgICByZXR1cm4gW3sgdHlwZTogUHJpbmNpcGFsVHlwZS5BTlksIGlkZW50aWZpZXJzOiBbXCIqXCJdIH1dO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUT0RPOiBTaG91bGQgdGhpcyBoYW5kbGUgb3RoZXIgc2NlbmFyaW9zIChpLmUuIFRva2Vucz8pXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHJpbmNpcGFsIHR5cGU6ICR7cHJpbmNpcGFsSnNvbn1gKTtcbiAgICB9XG4gIH1cbiAgaWYgKHR5cGVvZiBwcmluY2lwYWxKc29uICE9PSBcIm9iamVjdFwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEpTT04gSUFNIHByaW5jaXBhbCBzaG91bGQgYmUgYW4gb2JqZWN0LCBnb3QgJHtKU09OLnN0cmluZ2lmeShwcmluY2lwYWxKc29uKX1gLFxuICAgICk7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PFByaW5jaXBhbFByb3BzPigpO1xuICBmb3IgKGNvbnN0IFtrZXksIGlkZW50aWZpZXJzXSBvZiBPYmplY3QuZW50cmllcyhwcmluY2lwYWxKc29uKSkge1xuICAgIGlmICghaXNWYWxpZFByaW5jaXBhbFR5cGUoa2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBwcmluY2lwYWwgdHlwZTogJHtrZXl9LCB2YWxpZCB2YWx1ZXMgYXJlOiAke09iamVjdC52YWx1ZXMoUHJpbmNpcGFsVHlwZSl9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgIGlkZW50aWZpZXJzOiBBcnJheS5pc0FycmF5KGlkZW50aWZpZXJzKSA/IGlkZW50aWZpZXJzIDogW2lkZW50aWZpZXJzXSxcbiAgICAgIHR5cGU6IGtleSBhcyBQcmluY2lwYWxUeXBlLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ29udmVydCBUZXJyYWZvcm0gcHJpbmNpcGFscyBibG9ja3MgYmFjayB0byBBV1MgUHJpbmNpcGFsIEpTT05cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUHJpbmNpcGFsSnNvbihcbiAgLi4ucHJpbmNpcGFsUHJvcHM6IFByaW5jaXBhbFByb3BzW11cbik6IEF3c1ByaW5jaXBhbEpzb24ge1xuICBpZiAoXG4gICAgcHJpbmNpcGFsUHJvcHMubGVuZ3RoID09PSAxICYmXG4gICAgcHJpbmNpcGFsUHJvcHNbMF0udHlwZSA9PT0gUHJpbmNpcGFsVHlwZS5BTlkgJiZcbiAgICBwcmluY2lwYWxQcm9wc1swXS5pZGVudGlmaWVycy5sZW5ndGggPT09IDEgJiZcbiAgICBwcmluY2lwYWxQcm9wc1swXS5pZGVudGlmaWVyc1swXSA9PT0gXCIqXCJcbiAgKVxuICAgIHJldHVybiBcIipcIjtcblxuICBjb25zdCByZXN1bHQ6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW10gfSA9IHt9O1xuICBmb3IgKGNvbnN0IHByaW5jaXBhbCBvZiBwcmluY2lwYWxQcm9wcykge1xuICAgIHJlc3VsdFtwcmluY2lwYWwudHlwZV0gPVxuICAgICAgcHJpbmNpcGFsLmlkZW50aWZpZXJzLmxlbmd0aCA9PT0gMVxuICAgICAgICA/IHByaW5jaXBhbC5pZGVudGlmaWVyc1swXVxuICAgICAgICA6IHByaW5jaXBhbC5pZGVudGlmaWVycztcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEEgdHlwZSBvZiBwcmluY2lwYWwgdGhhdCBoYXMgbW9yZSBjb250cm9sIG92ZXIgaXRzIG93biByZXByZXNlbnRhdGlvbiBpbiBBc3N1bWVSb2xlUG9saWN5RG9jdW1lbnRzXG4gKlxuICogTW9yZSBjb21wbGV4IHR5cGVzIG9mIGlkZW50aXR5IHByb3ZpZGVycyBuZWVkIG1vcmUgY29udHJvbCBvdmVyIFJvbGUncyBwb2xpY3kgZG9jdW1lbnRzXG4gKiB0aGFuIHNpbXBseSBgeyBFZmZlY3Q6ICdBbGxvdycsIEFjdGlvbjogJ0Fzc3VtZVJvbGUnLCBQcmluY2lwYWw6IDxXaGF0ZXZlcj4gfWAuXG4gKlxuICogSWYgdGhhdCBjb250cm9sIGlzIG5lY2Vzc2FyeSwgdGhleSBjYW4gaW1wbGVtZW50IGBJQXNzdW1lUm9sZVByaW5jaXBhbGAgdG8gZ2V0IGZ1bGxcbiAqIGFjY2VzcyB0byBhIFJvbGUncyBBc3N1bWVSb2xlUG9saWN5RG9jdW1lbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUFzc3VtZVJvbGVQcmluY2lwYWwgZXh0ZW5kcyBJUHJpbmNpcGFsIHtcbiAgLyoqXG4gICAqIEFkZCB0aGUgcHJpbmNpcGFsIHRvIHRoZSBBc3N1bWVSb2xlUG9saWN5RG9jdW1lbnRcbiAgICpcbiAgICogQWRkIHRoZSBzdGF0ZW1lbnRzIHRvIHRoZSBBc3N1bWVSb2xlUG9saWN5RG9jdW1lbnQgbmVjZXNzYXJ5IHRvIGdpdmUgdGhpcyBwcmluY2lwYWxcbiAgICogcGVybWlzc2lvbnMgdG8gYXNzdW1lIHRoZSBnaXZlbiByb2xlLlxuICAgKi9cbiAgYWRkVG9Bc3N1bWVSb2xlUG9saWN5KGRvY3VtZW50OiBJUG9saWN5RG9jdW1lbnQpOiB2b2lkO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBjYWxsaW5nIGBhZGRUb1ByaW5jaXBhbFBvbGljeWBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGRUb1ByaW5jaXBhbFBvbGljeVJlc3VsdCB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBzdGF0ZW1lbnQgd2FzIGFkZGVkIHRvIHRoZSBpZGVudGl0eSdzIHBvbGljaWVzLlxuICAgKlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGVtZW50QWRkZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERlcGVuZGFibGUgd2hpY2ggYWxsb3dzIGRlcGVuZGluZyBvbiB0aGUgcG9saWN5IGNoYW5nZSBiZWluZyBhcHBsaWVkXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gUmVxdWlyZWQgaWYgYHN0YXRlbWVudEFkZGVkYCBpcyB0cnVlLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9saWN5RGVwZW5kYWJsZT86IElEZXBlbmRhYmxlO1xufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIHBvbGljeSBwcmluY2lwYWxzXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQcmluY2lwYWxCYXNlIGltcGxlbWVudHMgSUFzc3VtZVJvbGVQcmluY2lwYWwge1xuICBwdWJsaWMgcmVhZG9ubHkgZ3JhbnRQcmluY2lwYWw6IElQcmluY2lwYWwgPSB0aGlzO1xuICBwdWJsaWMgcmVhZG9ubHkgcHJpbmNpcGFsQWNjb3VudDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHBvbGljeSBmcmFnbWVudCB0aGF0IGlkZW50aWZpZXMgdGhpcyBwcmluY2lwYWwgaW4gYSBQb2xpY3kuXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgcG9saWN5RnJhZ21lbnQ6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50O1xuXG4gIC8qKlxuICAgKiBXaGVuIHRoaXMgUHJpbmNpcGFsIGlzIHVzZWQgaW4gYW4gQXNzdW1lUm9sZSBwb2xpY3ksIHRoZSBhY3Rpb24gdG8gdXNlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFzc3VtZVJvbGVBY3Rpb246IHN0cmluZyA9IFwic3RzOkFzc3VtZVJvbGVcIjtcblxuICBwdWJsaWMgYWRkVG9Qb2xpY3koc3RhdGVtZW50OiBQb2xpY3lTdGF0ZW1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hZGRUb1ByaW5jaXBhbFBvbGljeShzdGF0ZW1lbnQpLnN0YXRlbWVudEFkZGVkO1xuICB9XG5cbiAgcHVibGljIGFkZFRvUHJpbmNpcGFsUG9saWN5KFxuICAgIF9zdGF0ZW1lbnQ6IFBvbGljeVN0YXRlbWVudCxcbiAgKTogQWRkVG9QcmluY2lwYWxQb2xpY3lSZXN1bHQge1xuICAgIC8vIFRoaXMgYmFzZSBjbGFzcyBpcyB1c2VkIGZvciBub24taWRlbnRpdHkgcHJpbmNpcGFscy4gTm9uZSBvZiB0aGVtXG4gICAgLy8gaGF2ZSBhIFBvbGljeURvY3VtZW50IHRvIGFkZCB0by5cbiAgICByZXR1cm4geyBzdGF0ZW1lbnRBZGRlZDogZmFsc2UgfTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRUb0Fzc3VtZVJvbGVQb2xpY3koZG9jdW1lbnQ6IElQb2xpY3lEb2N1bWVudCk6IHZvaWQge1xuICAgIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBwcm90b2NvbFxuICAgIGRvY3VtZW50LmFkZFN0YXRlbWVudHMoXG4gICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgYWN0aW9uczogW3RoaXMuYXNzdW1lUm9sZUFjdGlvbl0sXG4gICAgICAgIHByaW5jaXBhbHM6IFt0aGlzXSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgLy8gVGhpcyBpcyBhIGZpcnN0IHBhc3MgdG8gbWFrZSB0aGUgb2JqZWN0IHJlYWRhYmxlLiBEZXNjZW5kYW50IHByaW5jaXBhbHNcbiAgICAvLyBzaG91bGQgcmV0dXJuIHNvbWV0aGluZyBuaWNlci5cbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5wb2xpY3lGcmFnbWVudC5wcmluY2lwYWxKc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBKU09OLWlmeSB0aGUgcHJpbmNpcGFsXG4gICAqXG4gICAqIFVzZWQgd2hlbiBKU09OLnN0cmluZ2lmeSgpIGlzIGNhbGxlZFxuICAgKi9cbiAgcHVibGljIHRvSlNPTigpIHtcbiAgICAvLyBIYXZlIHRvIGltcGxlbWVudCB0b0pTT04oKSBiZWNhdXNlIHRoZSBkZWZhdWx0IHdpbGwgbGVhZCB0byBpbmZpbml0ZSByZWN1cnNpb24uXG4gICAgcmV0dXJuIHRoaXMucG9saWN5RnJhZ21lbnQucHJpbmNpcGFsSnNvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbmV3IFByaW5jaXBhbFdpdGhDb25kaXRpb25zIHVzaW5nIHRoaXMgcHJpbmNpcGFsIGFzIHRoZSBiYXNlLCB3aXRoIHRoZVxuICAgKiBwYXNzZWQgY29uZGl0aW9ucyBhZGRlZC5cbiAgICpcbiAgICogV2hlbiB0aGVyZSBpcyBhIHZhbHVlIGZvciB0aGUgc2FtZSBvcGVyYXRvciBhbmQga2V5IGluIGJvdGggdGhlIHByaW5jaXBhbCBhbmQgdGhlXG4gICAqIGNvbmRpdGlvbnMgcGFyYW1ldGVyLCB0aGUgdmFsdWUgZnJvbSB0aGUgY29uZGl0aW9ucyBwYXJhbWV0ZXIgd2lsbCBiZSB1c2VkLlxuICAgKlxuICAgKiBAcmV0dXJucyBhIG5ldyBQcmluY2lwYWxXaXRoQ29uZGl0aW9ucyBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgd2l0aENvbmRpdGlvbnMoLi4uY29uZGl0aW9uczogQ29uZGl0aW9ucyk6IFByaW5jaXBhbEJhc2Uge1xuICAgIHJldHVybiBuZXcgUHJpbmNpcGFsV2l0aENvbmRpdGlvbnModGhpcywgY29uZGl0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIG5ldyBwcmluY2lwYWwgdXNpbmcgdGhpcyBwcmluY2lwYWwgYXMgdGhlIGJhc2UsIHdpdGggc2Vzc2lvbiB0YWdzIGVuYWJsZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIGEgbmV3IFNlc3Npb25UYWdzUHJpbmNpcGFsIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyB3aXRoU2Vzc2lvblRhZ3MoKTogUHJpbmNpcGFsQmFzZSB7XG4gICAgcmV0dXJuIG5ldyBTZXNzaW9uVGFnc1ByaW5jaXBhbCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciBvciBub3QgdGhpcyBwcmluY2lwYWwgaXMgZXF1YWwgdG8gdGhlIGdpdmVuIHByaW5jaXBhbFxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IGRlZHVwZVN0cmluZygpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogU3BlY2lmeSBhIHByaW5jaXBhbCBieSB0aGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikuXG4gKiBZb3UgY2FuIHNwZWNpZnkgQVdTIGFjY291bnRzLCBJQU0gdXNlcnMsIEZlZGVyYXRlZCBTQU1MIHVzZXJzLCBJQU0gcm9sZXMsIGFuZCBzcGVjaWZpYyBhc3N1bWVkLXJvbGUgc2Vzc2lvbnMuXG4gKiBZb3UgY2Fubm90IHNwZWNpZnkgSUFNIGdyb3VwcyBvciBpbnN0YW5jZSBwcm9maWxlcyBhcyBwcmluY2lwYWxzXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX3ByaW5jaXBhbC5odG1sXG4gKi9cbmV4cG9ydCBjbGFzcyBBcm5QcmluY2lwYWwgZXh0ZW5kcyBQcmluY2lwYWxCYXNlIHtcbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBhcm4gQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIHByaW5jaXBhbCBlbnRpdHkgKGkuZS4gYXJuOmF3czppYW06OjEyMzQ1Njc4OTAxMjp1c2VyL3VzZXItbmFtZSlcbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBhcm46IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvbGljeUZyYWdtZW50KCk6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50IHtcbiAgICByZXR1cm4gbmV3IFByaW5jaXBhbFBvbGljeUZyYWdtZW50KFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogUHJpbmNpcGFsVHlwZS5BV1MsXG4gICAgICAgIGlkZW50aWZpZXJzOiBbdGhpcy5hcm5dLFxuICAgICAgfSxcbiAgICBdKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYEFyblByaW5jaXBhbCgke3RoaXMuYXJufSlgO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBhZGRpbmcgYSBjb25kaXRpb24gdGhhdCB0aGUgcHJpbmNpcGFsIGlzIHBhcnQgb2YgdGhlIHNwZWNpZmllZFxuICAgKiBBV1MgT3JnYW5pemF0aW9uLlxuICAgKi9cbiAgcHVibGljIGluT3JnYW5pemF0aW9uKG9yZ2FuaXphdGlvbklkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy53aXRoQ29uZGl0aW9ucyh7XG4gICAgICB0ZXN0OiBcIlN0cmluZ0VxdWFsc1wiLFxuICAgICAgdmFyaWFibGU6IFwiYXdzOlByaW5jaXBhbE9yZ0lEXCIsXG4gICAgICB2YWx1ZXM6IFtvcmdhbml6YXRpb25JZF0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZGVkdXBlU3RyaW5nKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGBBcm5QcmluY2lwYWw6JHt0aGlzLmFybn1gO1xuICB9XG59XG5cbi8qKlxuICogU3BlY2lmeSBBV1MgYWNjb3VudCBJRCBhcyB0aGUgcHJpbmNpcGFsIGVudGl0eSBpbiBhIHBvbGljeSB0byBkZWxlZ2F0ZSBhdXRob3JpdHkgdG8gdGhlIGFjY291bnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBBY2NvdW50UHJpbmNpcGFsIGV4dGVuZHMgQXJuUHJpbmNpcGFsIHtcbiAgcHVibGljIHJlYWRvbmx5IHByaW5jaXBhbEFjY291bnQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGFjY291bnRJZCBBV1MgYWNjb3VudCBJRCAoaS5lLiAnMTIzNDU2Nzg5MDEyJylcbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBhY2NvdW50SWQ6IGFueSkge1xuICAgIHN1cGVyKFxuICAgICAgbmV3IEF3c1N0YWNrRGVwZW5kZW50VG9rZW4oXG4gICAgICAgIChhd3NTdGFjaykgPT4gYGFybjoke2F3c1N0YWNrLnBhcnRpdGlvbn06aWFtOjoke2FjY291bnRJZH06cm9vdGAsXG4gICAgICApLnRvU3RyaW5nKCksXG4gICAgKTtcbiAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChhY2NvdW50SWQpICYmIHR5cGVvZiBhY2NvdW50SWQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImFjY291bnRJZCBzaG91bGQgYmUgb2YgdHlwZSBzdHJpbmdcIik7XG4gICAgfVxuICAgIHRoaXMucHJpbmNpcGFsQWNjb3VudCA9IGFjY291bnRJZDtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYEFjY291bnRQcmluY2lwYWwoJHt0aGlzLmFjY291bnRJZH0pYDtcbiAgfVxufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGEgc2VydmljZSBwcmluY2lwYWwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZVByaW5jaXBhbE9wdHMge1xuICAvKipcbiAgICogVGhlIHJlZ2lvbiBpbiB3aGljaCB5b3Ugd2FudCB0byByZWZlcmVuY2UgdGhlIHNlcnZpY2VcbiAgICpcbiAgICogVGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBmb3IgKmNyb3NzLXJlZ2lvbiogcmVmZXJlbmNlcy5cbiAgICpcbiAgICogTm90ZTogV2UgYWx3YXlzIHJldHVybiB0aGUgZnVsbCBzZXJ2aWNlIHByaW5jaXBhbCBuYW1lLCBpbmNsdWRpbmcgdGhlIHJlZ2lvbi5cbiAgICogTm9ybWFsbHksIHRoZSByZWdpb24gaXMgb25seSByZXF1aXJlZCBmb3IgKm9wdC1pbiogcmVnaW9ucy4gSW4gdGhvc2VcbiAgICogY2FzZXMsIHRoZSByZWdpb24gbmFtZSBuZWVkcyB0byBiZSBpbmNsdWRlZCB0byByZWZlcmVuY2UgdGhlIGNvcnJlY3Qgc2VydmljZSBwcmluY2lwYWwuXG4gICAqIEluIGFsbCBvdGhlciBjYXNlcywgdGhlIGdsb2JhbCBzZXJ2aWNlIHByaW5jaXBhbCBuYW1lIGlzIHN1ZmZpY2llbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIHJlc29sdmluZyBTdGFjaydzIHJlZ2lvbi5cbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBjb25kaXRpb25zIHRvIGFkZCB0byB0aGUgU2VydmljZSBQcmluY2lwYWxcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBjb25kaXRpb25zXG4gICAqL1xuICByZWFkb25seSBjb25kaXRpb25zPzogQ29uZGl0aW9ucztcbn1cblxuLyoqXG4gKiBBbiBJQU0gcHJpbmNpcGFsIHRoYXQgcmVwcmVzZW50cyBhbiBBV1Mgc2VydmljZSAoaS5lLiBgc3FzLmFtYXpvbmF3cy5jb21gKS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlcnZpY2VQcmluY2lwYWwgZXh0ZW5kcyBQcmluY2lwYWxCYXNlIHtcbiAgLyoqXG4gICAqIFJldHVybiB0aGUgc2VydmljZSBwcmluY2lwYWwgbmFtZSBiYXNlZCBvbiB0aGUgcmVnaW9uIGl0J3MgdXNlZCBpbi5cbiAgICpcbiAgICogU29tZSBzZXJ2aWNlIHByaW5jaXBhbCBuYW1lcyB1c2VkIHRvIGJlIGRpZmZlcmVudCBmb3IgZGlmZmVyZW50IHBhcnRpdGlvbnMsXG4gICAqIGFuZCBzb21lIHdlcmUgbm90LlxuICAgKlxuICAgKiBUaGVzZSBkYXlzIGFsbCBzZXJ2aWNlIHByaW5jaXBhbCBuYW1lcyBhcmUgc3RhbmRhcmRpemVkLCBhbmQgdGhleSBhcmUgYWxsXG4gICAqIG9mIHRoZSBmb3JtIGA8c2VydmljZW5hbWU+LmFtYXpvbmF3cy5jb21gLlxuICAgKlxuICAgKiBUbyBhdm9pZCBicmVha2luZyBjaGFuZ2VzLCBoYW5kbGluZyBpcyBwcm92aWRlZCBmb3Igc2VydmljZXMgYWRkZWQgd2l0aCB0aGUgZm9ybWF0cyBiZWxvdyxcbiAgICogaG93ZXZlciwgbm8gYWRkaXRpb25hbCBoYW5kbGluZyB3aWxsIGJlIGFkZGVkIGZvciBuZXcgcmVnaW9ucyBvciBwYXJ0aXRpb25zLlxuICAgKiAgIC0gczNcbiAgICogICAtIHMzLmFtYXpvbmF3cy5jb21cbiAgICogICAtIHMzLmFtYXpvbmF3cy5jb20uY25cbiAgICogICAtIHMzLmMycy5pYy5nb3ZcbiAgICogICAtIHMzLnNjMnMuc2dvdi5nb3ZcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgcHJpbmNpcGFsTmFtZSA9IGlhbS5TZXJ2aWNlUHJpbmNpcGFsLnNlcnZpY2VQcmluY2lwYWxOYW1lKCdlYzInKTtcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2VydmljZVByaW5jaXBhbE5hbWUoc2VydmljZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmV3IFNlcnZpY2VQcmluY2lwYWxUb2tlbihzZXJ2aWNlLCB7fSkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZlcmVuY2UgYW4gQVdTIHNlcnZpY2UsIG9wdGlvbmFsbHkgaW4gYSBnaXZlbiByZWdpb25cbiAgICpcbiAgICogQHBhcmFtIHNlcnZpY2UgQVdTIHNlcnZpY2UgKGkuZS4gc3FzLmFtYXpvbmF3cy5jb20pXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgc2VydmljZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0czogU2VydmljZVByaW5jaXBhbE9wdHMgPSB7fSxcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcG9saWN5RnJhZ21lbnQoKTogUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQge1xuICAgIHJldHVybiBuZXcgUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQoXG4gICAgICBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBQcmluY2lwYWxUeXBlLlNFUlZJQ0UsXG4gICAgICAgICAgaWRlbnRpZmllcnM6IFtcbiAgICAgICAgICAgIG5ldyBTZXJ2aWNlUHJpbmNpcGFsVG9rZW4odGhpcy5zZXJ2aWNlLCB0aGlzLm9wdHMpLnRvU3RyaW5nKCksXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICB0aGlzLm9wdHMuY29uZGl0aW9ucyxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBgU2VydmljZVByaW5jaXBhbCgke3RoaXMuc2VydmljZX0pYDtcbiAgfVxuXG4gIHB1YmxpYyBkZWR1cGVTdHJpbmcoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gYFNlcnZpY2VQcmluY2lwYWw6JHt0aGlzLnNlcnZpY2V9OiR7SlNPTi5zdHJpbmdpZnkodGhpcy5vcHRzKX1gO1xuICB9XG59XG5cbi8qKlxuICogQSBwcmluY2lwYWwgdGhhdCByZXByZXNlbnRzIGFuIEFXUyBPcmdhbml6YXRpb25cbiAqL1xuZXhwb3J0IGNsYXNzIE9yZ2FuaXphdGlvblByaW5jaXBhbCBleHRlbmRzIFByaW5jaXBhbEJhc2Uge1xuICAvKipcbiAgICpcbiAgICogQHBhcmFtIG9yZ2FuaXphdGlvbklkIFRoZSB1bmlxdWUgaWRlbnRpZmllciAoSUQpIG9mIGFuIG9yZ2FuaXphdGlvbiAoaS5lLiBvLTEyMzQ1YWJjZGUpXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgb3JnYW5pemF0aW9uSWQ6IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvbGljeUZyYWdtZW50KCk6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50IHtcbiAgICByZXR1cm4gbmV3IFByaW5jaXBhbFBvbGljeUZyYWdtZW50KFxuICAgICAgW3sgdHlwZTogUHJpbmNpcGFsVHlwZS5BV1MsIGlkZW50aWZpZXJzOiBbXCIqXCJdIH1dLFxuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgdGVzdDogXCJTdHJpbmdFcXVhbHNcIixcbiAgICAgICAgICB2YXJpYWJsZTogXCJhd3M6UHJpbmNpcGFsT3JnSURcIixcbiAgICAgICAgICB2YWx1ZXM6IFt0aGlzLm9yZ2FuaXphdGlvbklkXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYE9yZ2FuaXphdGlvblByaW5jaXBhbCgke3RoaXMub3JnYW5pemF0aW9uSWR9KWA7XG4gIH1cblxuICBwdWJsaWMgZGVkdXBlU3RyaW5nKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGBPcmdhbml6YXRpb25QcmluY2lwYWw6JHt0aGlzLm9yZ2FuaXphdGlvbklkfWA7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHBvbGljeSBwcmluY2lwYWwgZm9yIGNhbm9uaWNhbFVzZXJJZHMgLSB1c2VmdWwgZm9yIFMzIGJ1Y2tldCBwb2xpY2llcyB0aGF0IHVzZVxuICogT3JpZ2luIEFjY2VzcyBpZGVudGl0aWVzLlxuICpcbiAqIFNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2VuZXJhbC9sYXRlc3QvZ3IvYWNjdC1pZGVudGlmaWVycy5odG1sXG4gKlxuICogYW5kXG4gKlxuICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL3ByaXZhdGUtY29udGVudC1yZXN0cmljdGluZy1hY2Nlc3MtdG8tczMuaHRtbFxuICpcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICovXG5leHBvcnQgY2xhc3MgQ2Fub25pY2FsVXNlclByaW5jaXBhbCBleHRlbmRzIFByaW5jaXBhbEJhc2Uge1xuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGNhbm9uaWNhbFVzZXJJZCB1bmlxdWUgaWRlbnRpZmllciBhc3NpZ25lZCBieSBBV1MgZm9yIGV2ZXJ5IGFjY291bnQuXG4gICAqICAgcm9vdCB1c2VyIGFuZCBJQU0gdXNlcnMgZm9yIGFuIGFjY291bnQgYWxsIHNlZSB0aGUgc2FtZSBJRC5cbiAgICogICAoaS5lLiA3OWE1OWRmOTAwYjk0OWU1NWQ5NmExZTY5OGZiYWNlZGZkNmUwOWQ5OGVhY2Y4ZjhkNTIxOGU3Y2Q0N2VmMmJlKVxuICAgKi9cbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGNhbm9uaWNhbFVzZXJJZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcG9saWN5RnJhZ21lbnQoKTogUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQge1xuICAgIHJldHVybiBuZXcgUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQoW1xuICAgICAge1xuICAgICAgICB0eXBlOiBQcmluY2lwYWxUeXBlLkNBTk9OSUNBTFVTRVIsXG4gICAgICAgIGlkZW50aWZpZXJzOiBbdGhpcy5jYW5vbmljYWxVc2VySWRdLFxuICAgICAgfSxcbiAgICBdKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYENhbm9uaWNhbFVzZXJQcmluY2lwYWwoJHt0aGlzLmNhbm9uaWNhbFVzZXJJZH0pYDtcbiAgfVxuXG4gIHB1YmxpYyBkZWR1cGVTdHJpbmcoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gYENhbm9uaWNhbFVzZXJQcmluY2lwYWw6JHt0aGlzLmNhbm9uaWNhbFVzZXJJZH1gO1xuICB9XG59XG5cbi8qKlxuICogUHJpbmNpcGFsIGVudGl0eSB0aGF0IHJlcHJlc2VudHMgYSBmZWRlcmF0ZWQgaWRlbnRpdHkgcHJvdmlkZXIgc3VjaCBhcyBBbWF6b24gQ29nbml0byxcbiAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSB0ZW1wb3Jhcnkgc2VjdXJpdHkgY3JlZGVudGlhbHMgdG8gdXNlcnMgd2hvIGhhdmUgYmVlbiBhdXRoZW50aWNhdGVkLlxuICogQWRkaXRpb25hbCBjb25kaXRpb24ga2V5cyBhcmUgYXZhaWxhYmxlIHdoZW4gdGhlIHRlbXBvcmFyeSBzZWN1cml0eSBjcmVkZW50aWFscyBhcmUgdXNlZCB0byBtYWtlIGEgcmVxdWVzdC5cbiAqIFlvdSBjYW4gdXNlIHRoZXNlIGtleXMgdG8gd3JpdGUgcG9saWNpZXMgdGhhdCBsaW1pdCB0aGUgYWNjZXNzIG9mIGZlZGVyYXRlZCB1c2Vycy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfaWFtLWNvbmRpdGlvbi1rZXlzLmh0bWwjY29uZGl0aW9uLWtleXMtd2lmXG4gKi9cbmV4cG9ydCBjbGFzcyBGZWRlcmF0ZWRQcmluY2lwYWwgZXh0ZW5kcyBQcmluY2lwYWxCYXNlIHtcbiAgcHVibGljIHJlYWRvbmx5IGFzc3VtZVJvbGVBY3Rpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggdGhlIHBvbGljeSBpcyBpbiBlZmZlY3QuXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbmRpdGlvbnM6IENvbmRpdGlvbnM7XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBmZWRlcmF0ZWQgZmVkZXJhdGVkIGlkZW50aXR5IHByb3ZpZGVyIChpLmUuICdjb2duaXRvLWlkZW50aXR5LmFtYXpvbmF3cy5jb20nIGZvciB1c2VycyBhdXRoZW50aWNhdGVkIHRocm91Z2ggQ29nbml0bylcbiAgICogQHBhcmFtIHNlc3Npb25UYWdzIFdoZXRoZXIgdG8gZW5hYmxlIHNlc3Npb24gdGFnZ2luZyAoc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9pZF9zZXNzaW9uLXRhZ3MuaHRtbClcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBmZWRlcmF0ZWQ6IHN0cmluZyxcbiAgICBjb25kaXRpb25zOiBDb25kaXRpb25zID0gW10sXG4gICAgYXNzdW1lUm9sZUFjdGlvbjogc3RyaW5nID0gXCJzdHM6QXNzdW1lUm9sZVwiLFxuICApIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5jb25kaXRpb25zID0gY29uZGl0aW9ucztcbiAgICB0aGlzLmFzc3VtZVJvbGVBY3Rpb24gPSBhc3N1bWVSb2xlQWN0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBwb2xpY3lGcmFnbWVudCgpOiBQcmluY2lwYWxQb2xpY3lGcmFnbWVudCB7XG4gICAgcmV0dXJuIG5ldyBQcmluY2lwYWxQb2xpY3lGcmFnbWVudChcbiAgICAgIFt7IHR5cGU6IFByaW5jaXBhbFR5cGUuRkVERVJBVEVELCBpZGVudGlmaWVyczogW3RoaXMuZmVkZXJhdGVkXSB9XSxcbiAgICAgIHRoaXMuY29uZGl0aW9ucyxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBgRmVkZXJhdGVkUHJpbmNpcGFsKCR7dGhpcy5mZWRlcmF0ZWR9KWA7XG4gIH1cblxuICBwdWJsaWMgZGVkdXBlU3RyaW5nKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGBGZWRlcmF0ZWRQcmluY2lwYWw6JHt0aGlzLmZlZGVyYXRlZH06JHt0aGlzLmFzc3VtZVJvbGVBY3Rpb259OiR7SlNPTi5zdHJpbmdpZnkodGhpcy5jb25kaXRpb25zKX1gO1xuICB9XG59XG5cbi8qKlxuICogQSBwcmluY2lwYWwgdGhhdCByZXByZXNlbnRzIGEgZmVkZXJhdGVkIGlkZW50aXR5IHByb3ZpZGVyIGFzIFdlYiBJZGVudGl0eSBzdWNoIGFzIENvZ25pdG8sIEFtYXpvbixcbiAqIEZhY2Vib29rLCBHb29nbGUsIGV0Yy5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYklkZW50aXR5UHJpbmNpcGFsIGV4dGVuZHMgRmVkZXJhdGVkUHJpbmNpcGFsIHtcbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGl0eVByb3ZpZGVyIGlkZW50aXR5IHByb3ZpZGVyIChpLmUuICdjb2duaXRvLWlkZW50aXR5LmFtYXpvbmF3cy5jb20nIGZvciB1c2VycyBhdXRoZW50aWNhdGVkIHRocm91Z2ggQ29nbml0bylcbiAgICogQHBhcmFtIGNvbmRpdGlvbnMgVGhlIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggdGhlIHBvbGljeSBpcyBpbiBlZmZlY3QuXG4gICAqICAgU2VlIFt0aGUgSUFNIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uLmh0bWwpLlxuICAgKiBAcGFyYW0gc2Vzc2lvblRhZ3MgV2hldGhlciB0byBlbmFibGUgc2Vzc2lvbiB0YWdnaW5nIChzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL2lkX3Nlc3Npb24tdGFncy5odG1sKVxuICAgKi9cbiAgY29uc3RydWN0b3IoaWRlbnRpdHlQcm92aWRlcjogc3RyaW5nLCBjb25kaXRpb25zOiBDb25kaXRpb25zID0gW10pIHtcbiAgICBzdXBlcihpZGVudGl0eVByb3ZpZGVyLCBjb25kaXRpb25zID8/IHt9LCBcInN0czpBc3N1bWVSb2xlV2l0aFdlYklkZW50aXR5XCIpO1xuICB9XG5cbiAgcHVibGljIGdldCBwb2xpY3lGcmFnbWVudCgpOiBQcmluY2lwYWxQb2xpY3lGcmFnbWVudCB7XG4gICAgcmV0dXJuIG5ldyBQcmluY2lwYWxQb2xpY3lGcmFnbWVudChcbiAgICAgIFt7IHR5cGU6IFByaW5jaXBhbFR5cGUuRkVERVJBVEVELCBpZGVudGlmaWVyczogW3RoaXMuZmVkZXJhdGVkXSB9XSxcbiAgICAgIHRoaXMuY29uZGl0aW9ucyxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBgV2ViSWRlbnRpdHlQcmluY2lwYWwoJHt0aGlzLmZlZGVyYXRlZH0pYDtcbiAgfVxufVxuXG4vKipcbiAqIEEgcHJpbmNpcGFsIHRoYXQgcmVwcmVzZW50cyBhIGZlZGVyYXRlZCBpZGVudGl0eSBwcm92aWRlciBhcyBmcm9tIGEgT3BlbklEIENvbm5lY3QgcHJvdmlkZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBPcGVuSWRDb25uZWN0UHJpbmNpcGFsIGV4dGVuZHMgV2ViSWRlbnRpdHlQcmluY2lwYWwge1xuICAvKipcbiAgICpcbiAgICogQHBhcmFtIG9wZW5JZENvbm5lY3RQcm92aWRlciBPcGVuSUQgQ29ubmVjdCBwcm92aWRlclxuICAgKiBAcGFyYW0gY29uZGl0aW9ucyBUaGUgY29uZGl0aW9ucyB1bmRlciB3aGljaCB0aGUgcG9saWN5IGlzIGluIGVmZmVjdC5cbiAgICogICBTZWUgW3RoZSBJQU0gZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb24uaHRtbCkuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBvcGVuSWRDb25uZWN0UHJvdmlkZXI6IElPcGVuSWRDb25uZWN0UHJvdmlkZXIsXG4gICAgY29uZGl0aW9uczogQ29uZGl0aW9ucyA9IFtdLFxuICApIHtcbiAgICBzdXBlcihvcGVuSWRDb25uZWN0UHJvdmlkZXIub3BlbklkQ29ubmVjdFByb3ZpZGVyQXJuLCBjb25kaXRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcG9saWN5RnJhZ21lbnQoKTogUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQge1xuICAgIHJldHVybiBuZXcgUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQoXG4gICAgICBbeyB0eXBlOiBQcmluY2lwYWxUeXBlLkZFREVSQVRFRCwgaWRlbnRpZmllcnM6IFt0aGlzLmZlZGVyYXRlZF0gfV0sXG4gICAgICB0aGlzLmNvbmRpdGlvbnMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYE9wZW5JZENvbm5lY3RQcmluY2lwYWwoJHt0aGlzLmZlZGVyYXRlZH0pYDtcbiAgfVxufVxuXG4vKipcbiAqIFByaW5jaXBhbCBlbnRpdHkgdGhhdCByZXByZXNlbnRzIGEgU0FNTCBmZWRlcmF0ZWQgaWRlbnRpdHkgcHJvdmlkZXJcbiAqL1xuZXhwb3J0IGNsYXNzIFNhbWxQcmluY2lwYWwgZXh0ZW5kcyBGZWRlcmF0ZWRQcmluY2lwYWwge1xuICBjb25zdHJ1Y3RvcihzYW1sUHJvdmlkZXI6IElTYW1sUHJvdmlkZXIsIGNvbmRpdGlvbnM6IENvbmRpdGlvbnMpIHtcbiAgICBzdXBlcihzYW1sUHJvdmlkZXIuc2FtbFByb3ZpZGVyQXJuLCBjb25kaXRpb25zLCBcInN0czpBc3N1bWVSb2xlV2l0aFNBTUxcIik7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGBTYW1sUHJpbmNpcGFsKCR7dGhpcy5mZWRlcmF0ZWR9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBQcmluY2lwYWwgZW50aXR5IHRoYXQgcmVwcmVzZW50cyBhIFNBTUwgZmVkZXJhdGVkIGlkZW50aXR5IHByb3ZpZGVyIGZvclxuICogcHJvZ3JhbW1hdGljIGFuZCBBV1MgTWFuYWdlbWVudCBDb25zb2xlIGFjY2Vzcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNhbWxDb25zb2xlUHJpbmNpcGFsIGV4dGVuZHMgU2FtbFByaW5jaXBhbCB7XG4gIC8qKlxuICAgKiBlbnVtIFBhcnRpdGlvbiB7XG4gICAqICAgRGVmYXVsdCA9ICdhd3MnLFxuICAgKiAgIENuID0gJ2F3cy1jbicsXG4gICAqICAgVXNHb3YgPSAnYXdzLXVzLWdvdicsXG4gICAqICAgVXNJc28gPSAnYXdzLWlzbycsXG4gICAqICAgVXNJc29CID0gJ2F3cy1pc28tYicsXG4gICAqICAgVXNJc29GID0gJ2F3cy1pc28tZicsXG4gICAqICAgRXVJc29FID0gJ2F3cy1pc28tZScsXG4gICAqIH1cbiAgICogU0FNTCBTaWduIE9uIHVybHMgY291bGQgYmUuLi5cbiAgICogW1BhcnRpdGlvbi5EZWZhdWx0XTogJ2h0dHBzOi8vc2lnbmluLmF3cy5hbWF6b24uY29tL3NhbWwnLFxuICAgKiBbUGFydGl0aW9uLkNuXTogJ2h0dHBzOi8vc2lnbmluLmFtYXpvbmF3cy5jbi9zYW1sJyxcbiAgICogW1BhcnRpdGlvbi5Vc0dvdl06ICdodHRwczovL3NpZ25pbi5hbWF6b25hd3MtdXMtZ292LmNvbS9zYW1sJyxcbiAgICogW1BhcnRpdGlvbi5Vc0lzb106ICdodHRwczovL3NpZ25pbi5jMnNob21lLmljLmdvdi9zYW1sJyxcbiAgICogW1BhcnRpdGlvbi5Vc0lzb0JdOiAnaHR0cHM6Ly9zaWduaW4uc2Myc2hvbWUuc2dvdi5nb3Yvc2FtbCcsXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gc2FtbFByb3ZpZGVyIFRoZSBTQU1MIHByb3ZpZGVyXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzYW1sUHJvdmlkZXI6IElTYW1sUHJvdmlkZXIsIGNvbmRpdGlvbnM6IENvbmRpdGlvbnMgPSBbXSkge1xuICAgIHN1cGVyKHNhbWxQcm92aWRlciwgW1xuICAgICAgLi4uY29uZGl0aW9ucyxcbiAgICAgIC8vIFRPRE86IGhhbmRsZSBjb2xsaXNpb25zIG9uIFwiU0FNTDphdWRcIj9cbiAgICAgIHtcbiAgICAgICAgdGVzdDogXCJTdHJpbmdFcXVhbHNcIixcbiAgICAgICAgdmFyaWFibGU6IFwiU0FNTDphdWRcIixcbiAgICAgICAgdmFsdWVzOiBbXCJodHRwczovL3NpZ25pbi5hd3MuYW1hem9uLmNvbS9zYW1sXCJdLFxuICAgICAgfSxcbiAgICBdKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYFNhbWxDb25zb2xlUHJpbmNpcGFsKCR7dGhpcy5mZWRlcmF0ZWR9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBVc2UgdGhlIEFXUyBhY2NvdW50IGludG8gd2hpY2ggYSBzdGFjayBpcyBkZXBsb3llZCBhcyB0aGUgcHJpbmNpcGFsIGVudGl0eSBpbiBhIHBvbGljeVxuICovXG5leHBvcnQgY2xhc3MgQWNjb3VudFJvb3RQcmluY2lwYWwgZXh0ZW5kcyBBY2NvdW50UHJpbmNpcGFsIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXG4gICAgICBuZXcgQXdzU3RhY2tEZXBlbmRlbnRUb2tlbigoYXdzU3RhY2spID0+IGF3c1N0YWNrLmFjY291bnQpLnRvU3RyaW5nKCksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gXCJBY2NvdW50Um9vdFByaW5jaXBhbCgpXCI7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHByaW5jaXBhbCByZXByZXNlbnRpbmcgYWxsIEFXUyBpZGVudGl0aWVzIGluIGFsbCBhY2NvdW50c1xuICpcbiAqIFNvbWUgc2VydmljZXMgYmVoYXZlIGRpZmZlcmVudGx5IHdoZW4geW91IHNwZWNpZnkgYFByaW5jaXBhbDogJyonYFxuICogb3IgYFByaW5jaXBhbDogeyBBV1M6IFwiKlwiIH1gIGluIHRoZWlyIHJlc291cmNlIHBvbGljeS5cbiAqXG4gKiBgQW55UHJpbmNpcGFsYCByZW5kZXJzIHRvIGBQcmluY2lwYWw6IHsgQVdTOiBcIipcIiB9YC4gVGhpcyBpcyBjb3JyZWN0XG4gKiBtb3N0IG9mIHRoZSB0aW1lLCBidXQgaW4gY2FzZXMgd2hlcmUgeW91IG5lZWQgdGhlIG90aGVyIHByaW5jaXBhbCxcbiAqIHVzZSBgU3RhclByaW5jaXBhbGAgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEFueVByaW5jaXBhbCBleHRlbmRzIEFyblByaW5jaXBhbCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiKlwiKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gXCJBbnlQcmluY2lwYWwoKVwiO1xuICB9XG59XG5cbi8qKlxuICogQSBwcmluY2lwYWwgcmVwcmVzZW50aW5nIGFsbCBpZGVudGl0aWVzIGluIGFsbCBhY2NvdW50c1xuICogQGRlcHJlY2F0ZWQgdXNlIGBBbnlQcmluY2lwYWxgXG4gKi9cbmV4cG9ydCBjbGFzcyBBbnlvbmUgZXh0ZW5kcyBBbnlQcmluY2lwYWwge31cblxuLyoqXG4gKiBBIHByaW5jaXBhbCB0aGF0IHVzZXMgYSBsaXRlcmFsICcqJyBpbiB0aGUgSUFNIEpTT04gbGFuZ3VhZ2VcbiAqXG4gKiBTb21lIHNlcnZpY2VzIGJlaGF2ZSBkaWZmZXJlbnRseSB3aGVuIHlvdSBzcGVjaWZ5IGBQcmluY2lwYWw6IFwiKlwiYFxuICogb3IgYFByaW5jaXBhbDogeyBBV1M6IFwiKlwiIH1gIGluIHRoZWlyIHJlc291cmNlIHBvbGljeS5cbiAqXG4gKiBgU3RhclByaW5jaXBhbGAgcmVuZGVycyB0byBgUHJpbmNpcGFsOiAqYC4gTW9zdCBvZiB0aGUgdGltZSwgeW91XG4gKiBzaG91bGQgdXNlIGBBbnlQcmluY2lwYWxgIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdGFyUHJpbmNpcGFsIGV4dGVuZHMgUHJpbmNpcGFsQmFzZSB7XG4gIHB1YmxpYyByZWFkb25seSBwb2xpY3lGcmFnbWVudDogUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQgPVxuICAgIG5ldyBQcmluY2lwYWxQb2xpY3lGcmFnbWVudChbXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFByaW5jaXBhbFR5cGUuQU5ZLFxuICAgICAgICBpZGVudGlmaWVyczogW1wiKlwiXSxcbiAgICAgIH0sXG4gICAgXSk7XG5cbiAgcHVibGljIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBcIlN0YXJQcmluY2lwYWwoKVwiO1xuICB9XG5cbiAgcHVibGljIGRlZHVwZVN0cmluZygpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBcIlN0YXJQcmluY2lwYWxcIjtcbiAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBwcmluY2lwYWwgdGhhdCBoYXMgbXVsdGlwbGUgdHlwZXMgb2YgcHJpbmNpcGFscy4gQSBjb21wb3NpdGUgcHJpbmNpcGFsIGNhbm5vdFxuICogaGF2ZSBjb25kaXRpb25zLiBpLmUuIG11bHRpcGxlIFNlcnZpY2VQcmluY2lwYWxzIHRoYXQgZm9ybSBhIGNvbXBvc2l0ZSBwcmluY2lwYWxcbiAqL1xuZXhwb3J0IGNsYXNzIENvbXBvc2l0ZVByaW5jaXBhbCBleHRlbmRzIFByaW5jaXBhbEJhc2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgYXNzdW1lUm9sZUFjdGlvbjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IF9wcmluY2lwYWxzID0gbmV3IEFycmF5PElQcmluY2lwYWw+KCk7XG5cbiAgY29uc3RydWN0b3IoLi4ucHJpbmNpcGFsczogSVByaW5jaXBhbFtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAocHJpbmNpcGFscy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJDb21wb3NpdGVQcmluY2lwYWxzIG11c3QgYmUgY29uc3RydWN0ZWQgd2l0aCBhdCBsZWFzdCAxIFByaW5jaXBhbCBidXQgbm9uZSB3ZXJlIHBhc3NlZC5cIixcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuYXNzdW1lUm9sZUFjdGlvbiA9IHByaW5jaXBhbHNbMF0uYXNzdW1lUm9sZUFjdGlvbjtcbiAgICB0aGlzLmFkZFByaW5jaXBhbHMoLi4ucHJpbmNpcGFscyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBJQU0gcHJpbmNpcGFscyB0byB0aGUgY29tcG9zaXRlIHByaW5jaXBhbC4gQ29tcG9zaXRlIHByaW5jaXBhbHMgY2Fubm90IGhhdmVcbiAgICogY29uZGl0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHByaW5jaXBhbHMgSUFNIHByaW5jaXBhbHMgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBjb21wb3NpdGUgcHJpbmNpcGFsXG4gICAqL1xuICBwdWJsaWMgYWRkUHJpbmNpcGFscyguLi5wcmluY2lwYWxzOiBJUHJpbmNpcGFsW10pOiB0aGlzIHtcbiAgICB0aGlzLl9wcmluY2lwYWxzLnB1c2goLi4ucHJpbmNpcGFscyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgYWRkVG9Bc3N1bWVSb2xlUG9saWN5KGRvYzogSVBvbGljeURvY3VtZW50KSB7XG4gICAgZm9yIChjb25zdCBwIG9mIHRoaXMuX3ByaW5jaXBhbHMpIHtcbiAgICAgIGRlZmF1bHRBZGRQcmluY2lwYWxUb0Fzc3VtZVJvbGUocCwgZG9jKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvbGljeUZyYWdtZW50KCk6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50IHtcbiAgICAvLyBXZSBvbmx5IGhhdmUgYSBwcm9ibGVtIHdpdGggY29uZGl0aW9ucyBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHJlbmRlciBjb21wb3NpdGVcbiAgICAvLyBwcmluY2lwYWxzIGludG8gYSBzaW5nbGUgc3RhdGVtZW50ICh3aGljaCBpcyB3aGVuIGBwb2xpY3lGcmFnbWVudGAgd291bGQgZ2V0IGNhbGxlZClcbiAgICBmb3IgKGNvbnN0IHAgb2YgdGhpcy5fcHJpbmNpcGFscykge1xuICAgICAgY29uc3QgZnJhZ21lbnQgPSBwLnBvbGljeUZyYWdtZW50O1xuICAgICAgaWYgKGZyYWdtZW50LmNvbmRpdGlvbnMgJiYgZnJhZ21lbnQuY29uZGl0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIkNvbXBvbmVudHMgb2YgYSBDb21wb3NpdGVQcmluY2lwYWwgbXVzdCBub3QgaGF2ZSBjb25kaXRpb25zLiBcIiArXG4gICAgICAgICAgICBgVHJpZWQgdG8gYWRkIHRoZSBmb2xsb3dpbmcgZnJhZ21lbnQ6ICR7SlNPTi5zdHJpbmdpZnkoZnJhZ21lbnQpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHJpbmNpcGFscyA9IG5ldyBBcnJheTxQcmluY2lwYWxQcm9wcz4oKTtcbiAgICBmb3IgKGNvbnN0IHAgb2YgdGhpcy5fcHJpbmNpcGFscykge1xuICAgICAgbWVyZ2VQcmluY2lwYWwocHJpbmNpcGFscywgcC5wb2xpY3lGcmFnbWVudC5wcmluY2lwYWxzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcmluY2lwYWxQb2xpY3lGcmFnbWVudChwcmluY2lwYWxzKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYENvbXBvc2l0ZVByaW5jaXBhbCgke3RoaXMuX3ByaW5jaXBhbHN9KWA7XG4gIH1cblxuICBwdWJsaWMgZGVkdXBlU3RyaW5nKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaW5uZXIgPSB0aGlzLl9wcmluY2lwYWxzLm1hcChDb21wYXJhYmxlUHJpbmNpcGFsLmRlZHVwZVN0cmluZ0Zvcik7XG4gICAgaWYgKGlubmVyLnNvbWUoKHgpID0+IHggPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBgQ29tcG9zaXRlUHJpbmNpcGFsWyR7aW5uZXIuam9pbihcIixcIil9XWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcHJpbmNpcGFscyB0aGF0IG1ha2UgdXAgdGhlIENvbXBvc2l0ZVByaW5jaXBhbFxuICAgKi9cbiAgcHVibGljIGdldCBwcmluY2lwYWxzKCk6IElQcmluY2lwYWxbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaW5jaXBhbHM7XG4gIH1cbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBQcmluY2lwYWxzIHRoYXQgd3JhcCBvdGhlciBwcmluY2lwYWxzXG4gKi9cbmFic3RyYWN0IGNsYXNzIFByaW5jaXBhbEFkYXB0ZXIgZXh0ZW5kcyBQcmluY2lwYWxCYXNlIHtcbiAgcHVibGljIHJlYWRvbmx5IGFzc3VtZVJvbGVBY3Rpb24gPSB0aGlzLndyYXBwZWQuYXNzdW1lUm9sZUFjdGlvbjtcbiAgcHVibGljIHJlYWRvbmx5IHByaW5jaXBhbEFjY291bnQgPSB0aGlzLndyYXBwZWQucHJpbmNpcGFsQWNjb3VudDtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgd3JhcHBlZDogSVByaW5jaXBhbCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvbGljeUZyYWdtZW50KCk6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50IHtcbiAgICByZXR1cm4gdGhpcy53cmFwcGVkLnBvbGljeUZyYWdtZW50O1xuICB9XG5cbiAgcHVibGljIGFkZFRvUHJpbmNpcGFsUG9saWN5KFxuICAgIHN0YXRlbWVudDogUG9saWN5U3RhdGVtZW50LFxuICApOiBBZGRUb1ByaW5jaXBhbFBvbGljeVJlc3VsdCB7XG4gICAgcmV0dXJuIHRoaXMud3JhcHBlZC5hZGRUb1ByaW5jaXBhbFBvbGljeShzdGF0ZW1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZCB0aGUgZ2l2ZW4gc3RyaW5nIHRvIHRoZSB3cmFwcGVkIHByaW5jaXBhbCdzIGRlZHVwZSBzdHJpbmcgKGlmIGF2YWlsYWJsZSlcbiAgICovXG4gIHByb3RlY3RlZCBhcHBlbmREZWR1cGUoYXBwZW5kOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGlubmVyID0gQ29tcGFyYWJsZVByaW5jaXBhbC5kZWR1cGVTdHJpbmdGb3IodGhpcy53cmFwcGVkKTtcbiAgICByZXR1cm4gaW5uZXIgIT09IHVuZGVmaW5lZFxuICAgICAgPyBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9OiR7aW5uZXJ9OiR7YXBwZW5kfWBcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBwcmluY2lwYWxzIHRoYXQgY2FuIGJlIGNvbXBhcmVkLlxuICpcbiAqIFRoaXMgb25seSBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZCBmb3IgcHJpbmNpcGFscyB0aGF0IGNvdWxkIHBvdGVudGlhbGx5IGJlIHZhbHVlLWVxdWFsLlxuICogSWRlbnRpdHktZXF1YWwgcHJpbmNpcGFscyB3aWxsIGJlIGhhbmRsZWQgY29ycmVjdGx5IGJ5IGRlZmF1bHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBhcmFibGVQcmluY2lwYWwgZXh0ZW5kcyBJUHJpbmNpcGFsIHtcbiAgLyoqXG4gICAqIFJldHVybiBhIHN0cmluZyBmb3JtYXQgb2YgdGhpcyBwcmluY2lwYWwgd2hpY2ggc2hvdWxkIGJlIGlkZW50aWNhbCBpZiB0aGUgdHdvXG4gICAqIHByaW5jaXBhbHMgYXJlIHRoZSBzYW1lLlxuICAgKi9cbiAgZGVkdXBlU3RyaW5nKCk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBIZWxwZXIgY2xhc3MgZm9yIHdvcmtpbmcgd2l0aCBgSUNvbXBhcmFibGVQcmluY2lwYWxgc1xuICovXG5leHBvcnQgY2xhc3MgQ29tcGFyYWJsZVByaW5jaXBhbCB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gcHJpbmNpcGFsIGlzIGEgY29tcGFyYWJsZSBwcmluY2lwYWxcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaXNDb21wYXJhYmxlUHJpbmNpcGFsKFxuICAgIHg6IElQcmluY2lwYWwsXG4gICk6IHggaXMgSUNvbXBhcmFibGVQcmluY2lwYWwge1xuICAgIHJldHVybiBcImRlZHVwZVN0cmluZ1wiIGluIHg7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBkZWR1cGVTdHJpbmcgb2YgdGhlIGdpdmVuIHByaW5jaXBhbCwgaWYgYXZhaWxhYmxlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGRlZHVwZVN0cmluZ0Zvcih4OiBJUHJpbmNpcGFsKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gQ29tcGFyYWJsZVByaW5jaXBhbC5pc0NvbXBhcmFibGVQcmluY2lwYWwoeClcbiAgICAgID8geC5kZWR1cGVTdHJpbmcoKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBBbiBJQU0gcHJpbmNpcGFsIHdpdGggYWRkaXRpb25hbCBjb25kaXRpb25zIHNwZWNpZnlpbmcgd2hlbiB0aGUgcG9saWN5IGlzIGluIGVmZmVjdC5cbiAqXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBjb25kaXRpb25zLCBzZWU6XG4gKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbi5odG1sXG4gKi9cbmV4cG9ydCBjbGFzcyBQcmluY2lwYWxXaXRoQ29uZGl0aW9ucyBleHRlbmRzIFByaW5jaXBhbEFkYXB0ZXIge1xuICBwcml2YXRlIGFkZGl0aW9uYWxDb25kaXRpb25zOiBDb25kaXRpb25NYXAgPSB7fTtcblxuICBjb25zdHJ1Y3RvcihwcmluY2lwYWw6IElQcmluY2lwYWwsIGNvbmRpdGlvbnM6IENvbmRpdGlvbnMpIHtcbiAgICBzdXBlcihwcmluY2lwYWwpO1xuICAgIGZvciAoY29uc3QgYyBvZiBjb25kaXRpb25zKSB7XG4gICAgICB0aGlzLmFkZENvbmRpdGlvbihjKTtcbiAgICB9XG4gIH1cblxuICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9wdWxsLzI4NTEwL2ZpbGVzI2RpZmYtNTAyNDhmNjcxZTliMTNhOWNiMzVhNjI0NDFkNzI4MzJkY2E4OWI2YzdhZDRhODhhYTRmYjJlYzhlNjc2YjdjZFxuICBwdWJsaWMgYWRkVG9Bc3N1bWVSb2xlUG9saWN5KGRvYzogSVBvbGljeURvY3VtZW50KSB7XG4gICAgaWYgKGRvYy5ub2RlLnNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJDYW5ub3QgYWRkIGEgY29uZGl0aW9uIHRvIGEgcHJpbmNpcGFsIG91dHNpZGUgb2YgYSBzdGFjayBzY29wZVwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gTGF6eSBpbXBvcnQgdG8gYXZvaWQgY2lyY3VsYXIgaW1wb3J0IGRlcGVuZGVuY2llcyBkdXJpbmcgc3RhcnR1cFxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICBjb25zdCBhZGFwdGVyOiB0eXBlb2YgaW1wb3J0KFwiLi9wcml2YXRlL2FkYXB0ZXJcIikgPSByZXF1aXJlKFwiLi9wcml2YXRlL2FkYXB0ZXJcIik7XG4gICAgZGVmYXVsdEFkZFByaW5jaXBhbFRvQXNzdW1lUm9sZShcbiAgICAgIHRoaXMud3JhcHBlZCxcbiAgICAgIG5ldyBhZGFwdGVyLk11dGF0aW5nUG9saWN5RG9jdW1lbnRBZGFwdGVyKGRvYywgKHN0YXRlbWVudCkgPT4ge1xuICAgICAgICBzdGF0ZW1lbnQuYWRkQWN0aW9ucyh0aGlzLmFzc3VtZVJvbGVBY3Rpb24pO1xuICAgICAgICBzdGF0ZW1lbnQuYWRkQ29uZGl0aW9ucyguLi50aGlzLmNvbmRpdGlvbnMpO1xuICAgICAgICByZXR1cm4gc3RhdGVtZW50O1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBjb25kaXRpb24gdG8gdGhlIHByaW5jaXBhbFxuICAgKi9cbiAgcHVibGljIGFkZENvbmRpdGlvbihjb25kaXRpb246IENvbmRpdGlvbikge1xuICAgIGlmICghdGhpcy5hZGRpdGlvbmFsQ29uZGl0aW9uc1tjb25kaXRpb24udGVzdF0pIHtcbiAgICAgIHRoaXMuYWRkaXRpb25hbENvbmRpdGlvbnNbY29uZGl0aW9uLnRlc3RdID0ge307XG4gICAgfVxuXG4gICAgY29uc3QgZXhpc3RpbmdDb25kaXRpb24gPVxuICAgICAgdGhpcy5hZGRpdGlvbmFsQ29uZGl0aW9uc1tjb25kaXRpb24udGVzdF1bY29uZGl0aW9uLnZhcmlhYmxlXTtcbiAgICBpZiAoZXhpc3RpbmdDb25kaXRpb24pIHtcbiAgICAgIHRoaXMuYWRkaXRpb25hbENvbmRpdGlvbnNbY29uZGl0aW9uLnRlc3RdW2NvbmRpdGlvbi52YXJpYWJsZV0gPSB7XG4gICAgICAgIC4uLmV4aXN0aW5nQ29uZGl0aW9uLFxuICAgICAgICAuLi5jb25kaXRpb24sXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZGl0aW9uYWxDb25kaXRpb25zW2NvbmRpdGlvbi50ZXN0XVtjb25kaXRpb24udmFyaWFibGVdID0gY29uZGl0aW9uO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBjb25kaXRpb25PYmplY3QgdG8gdGhlIHByaW5jaXBhbFxuICAgKlxuICAgKiBBIGNvbmRpdGlvbk9iamVjdCBoYXMgdGhlIGZvcm1hdCBvZiB0ZXN0OiB7IHZhcmlhYmxlOiB2YWx1ZSB8IHZhbHVlc1tdIH1cbiAgICpcbiAgICogRm9yIGV4YW1wbGU6XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIGNvbnN0IGNvbmRpdGlvbjEgPSB7J1N0cmluZ0VxdWFscycsIHsgJ2F3czpTb21lRmllbGQnOiAnMScgfX07XG4gICAqIC8vIG9yXG4gICAqIGNvbnN0IGNvbmRpdGlvbjIgPSB7J1N0cmluZ0VxdWFscycsIHsgJ2F3czpTb21lRmllbGQnOiBbJzEnLCAnMiddIH19O1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBhZGRDb25kaXRpb25PYmplY3Qoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdmFsaWRhdGVDb25kaXRpb25PYmplY3QodmFsdWUpO1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgICAgaWYgKCFpc1N0cmluZ09yQXJyYXlPZlN0cmluZ3ModikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBGaWVsZHMgbXVzdCBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2Ygc3RyaW5ncy4gR290ICR7dn0gZm9yIGtleSAke2t9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYWRkQ29uZGl0aW9uKHtcbiAgICAgICAgdGVzdDoga2V5LFxuICAgICAgICB2YXJpYWJsZTogayxcbiAgICAgICAgdmFsdWVzOiBBcnJheS5pc0FycmF5KHYpID8gdiA6IFt2XSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIG11bHRpcGxlIGNvbmRpdGlvbnMgdG8gdGhlIHByaW5jaXBhbFxuICAgKlxuICAgKiBWYWx1ZXMgZnJvbSB0aGUgY29uZGl0aW9ucyBwYXJhbWV0ZXIgd2lsbCBvdmVyd3JpdGUgZXhpc3RpbmcgdmFsdWVzIHdpdGggdGhlIHNhbWUgb3BlcmF0b3JcbiAgICogYW5kIGtleS5cbiAgICovXG4gIHB1YmxpYyBhZGRDb25kaXRpb25zKGNvbmRpdGlvbnM6IENvbmRpdGlvbnMpIHtcbiAgICBjb25kaXRpb25zLm1hcCgoYykgPT4ge1xuICAgICAgdGhpcy5hZGRDb25kaXRpb24oYyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBtdWx0aXBsZSBjb25kaXRpb25PYmplY3RzIHRvIHRoZSBwcmluY2lwYWxcbiAgICpcbiAgICogVmFsdWVzIGZyb20gdGhlIGNvbmRpdGlvbnMgcGFyYW1ldGVyIHdpbGwgb3ZlcndyaXRlIGV4aXN0aW5nIHZhbHVlcyB3aXRoIHRoZSBzYW1lIG9wZXJhdG9yXG4gICAqIGFuZCBrZXkuXG4gICAqL1xuICBwdWJsaWMgYWRkQ29uZGl0aW9uT2JqZWN0cyhjb25kaXRpb25zOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSkge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmRpdGlvbnMpKSB7XG4gICAgICB0aGlzLmFkZENvbmRpdGlvbk9iamVjdChrZXksIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggdGhlIHBvbGljeSBpcyBpbiBlZmZlY3QuXG4gICAqIFNlZSBbdGhlIElBTSBkb2N1bWVudGF0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbi5odG1sKS5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29uZGl0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5tZXJnZUNvbmRpdGlvbnMoXG4gICAgICB0aGlzLndyYXBwZWQucG9saWN5RnJhZ21lbnQuY29uZGl0aW9ucyxcbiAgICAgIHRoaXMuYWRkaXRpb25hbENvbmRpdGlvbnMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcG9saWN5RnJhZ21lbnQoKTogUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQge1xuICAgIHJldHVybiBuZXcgUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQoXG4gICAgICB0aGlzLndyYXBwZWQucG9saWN5RnJhZ21lbnQucHJpbmNpcGFscyxcbiAgICAgIHRoaXMuY29uZGl0aW9ucyxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLndyYXBwZWQudG9TdHJpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBKU09OLWlmeSB0aGUgcHJpbmNpcGFsXG4gICAqXG4gICAqIFVzZWQgd2hlbiBKU09OLnN0cmluZ2lmeSgpIGlzIGNhbGxlZFxuICAgKi9cbiAgcHVibGljIHRvSlNPTigpIHtcbiAgICAvLyBIYXZlIHRvIGltcGxlbWVudCB0b0pTT04oKSBiZWNhdXNlIHRoZSBkZWZhdWx0IHdpbGwgbGVhZCB0byBpbmZpbml0ZSByZWN1cnNpb24uXG4gICAgcmV0dXJuIHRoaXMucG9saWN5RnJhZ21lbnQucHJpbmNpcGFsSnNvbjtcbiAgfVxuXG4gIHB1YmxpYyBkZWR1cGVTdHJpbmcoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5hcHBlbmREZWR1cGUoSlNPTi5zdHJpbmdpZnkodGhpcy5jb25kaXRpb25zKSk7XG4gIH1cblxuICBwcml2YXRlIG1lcmdlQ29uZGl0aW9ucyhcbiAgICBwcmluY2lwYWxDb25kaXRpb25zOiBDb25kaXRpb25zLFxuICAgIGFkZGl0aW9uYWxDb25kaXRpb25zOiBDb25kaXRpb25NYXAsXG4gICk6IENvbmRpdGlvbnMge1xuICAgIGNvbnN0IG1lcmdlZENvbmRpdGlvbnM6IENvbmRpdGlvbk1hcCA9IHt9O1xuICAgIHByaW5jaXBhbENvbmRpdGlvbnMuZm9yRWFjaCgoYykgPT4ge1xuICAgICAgaWYgKCFtZXJnZWRDb25kaXRpb25zW2MudGVzdF0pIHtcbiAgICAgICAgbWVyZ2VkQ29uZGl0aW9uc1tjLnRlc3RdID0ge307XG4gICAgICB9XG4gICAgICBtZXJnZWRDb25kaXRpb25zW2MudGVzdF1bYy52YXJpYWJsZV0gPSBjO1xuICAgIH0pO1xuXG4gICAgT2JqZWN0LmVudHJpZXMoYWRkaXRpb25hbENvbmRpdGlvbnMpLmZvckVhY2goKFt0ZXN0LCBjb25kaXRpb25dKSA9PiB7XG4gICAgICAvLyBtZXJnZSB0aGUgY29uZGl0aW9ucyBpZiBvbmUgb2YgdGhlIGFkZGl0aW9uYWwgY29uZGl0aW9ucyB1c2VzIGFuXG4gICAgICAvLyBvcGVyYXRvciB0aGF0J3MgYWxyZWFkeSB1c2VkIGJ5IHRoZSBwcmluY2lwYWwncyBjb25kaXRpb25zIG1lcmdlIHRoZVxuICAgICAgLy8gaW5uZXIgc3RydWN0dXJlLlxuICAgICAgY29uc3QgZXhpc3RpbmcgPSBtZXJnZWRDb25kaXRpb25zW3Rlc3RdO1xuICAgICAgaWYgKCFleGlzdGluZykge1xuICAgICAgICBtZXJnZWRDb25kaXRpb25zW3Rlc3RdID0gY29uZGl0aW9uO1xuICAgICAgICByZXR1cm47IC8vIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE86IFN1cHBvcnQgSVJlc29sdmFibGUgQ29uZGl0aW9uP1xuICAgICAgLy8gLy8gaWYgZWl0aGVyIHRoZSBleGlzdGluZyBjb25kaXRpb24gb3IgdGhlIG5ldyBvbmUgY29udGFpbiB1bnJlc29sdmVkXG4gICAgICAvLyAvLyB0b2tlbnMsIGZhaWwgdGhlIG1lcmdlLiB0aGlzIGlzIGFzIGZhciBhcyB3ZSBnbyBhdCB0aGlzIHBvaW50LlxuICAgICAgLy8gaWYgKFRva2VuLmlzVW5yZXNvbHZlZChjb25kaXRpb24pIHx8IFRva2VuLmlzVW5yZXNvbHZlZChleGlzdGluZykpIHtcbiAgICAgIC8vICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgLy8gICAgIGBtdWx0aXBsZSBcIiR7dGVzdH1cIiBjb25kaXRpb25zIGNhbm5vdCBiZSBtZXJnZWQgaWYgb25lIG9mIHRoZW0gY29udGFpbnMgYW4gdW5yZXNvbHZlZCB0b2tlbmAsXG4gICAgICAvLyAgICk7XG4gICAgICAvLyB9XG5cbiAgICAgIC8vIFRPRE86IFZhbGlkYXRlIGNvbmRpdGlvbj9cbiAgICAgIC8vIHZhbGlkYXRlQ29uZGl0aW9uT2JqZWN0KGV4aXN0aW5nKTtcbiAgICAgIC8vIHZhbGlkYXRlQ29uZGl0aW9uT2JqZWN0KGNvbmRpdGlvbik7XG5cbiAgICAgIG1lcmdlZENvbmRpdGlvbnNbdGVzdF0gPSB7IC4uLmV4aXN0aW5nLCAuLi5jb25kaXRpb24gfTtcbiAgICB9KTtcbiAgICByZXR1cm4gdG9Db25kaXRpb25zKG1lcmdlZENvbmRpdGlvbnMpO1xuICB9XG59XG5cbi8qKlxuICogRW5hYmxlcyBzZXNzaW9uIHRhZ3Mgb24gcm9sZSBhc3N1bXB0aW9ucyBmcm9tIGEgcHJpbmNpcGFsXG4gKlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gc2Vzc2lvbiB0YWdzLCBzZWU6XG4gKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvaWRfc2Vzc2lvbi10YWdzLmh0bWxcbiAqL1xuZXhwb3J0IGNsYXNzIFNlc3Npb25UYWdzUHJpbmNpcGFsIGV4dGVuZHMgUHJpbmNpcGFsQWRhcHRlciB7XG4gIGNvbnN0cnVjdG9yKHByaW5jaXBhbDogSVByaW5jaXBhbCkge1xuICAgIHN1cGVyKHByaW5jaXBhbCk7XG4gIH1cblxuICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9wdWxsLzI4NTEwL2ZpbGVzI2RpZmYtNTAyNDhmNjcxZTliMTNhOWNiMzVhNjI0NDFkNzI4MzJkY2E4OWI2YzdhZDRhODhhYTRmYjJlYzhlNjc2YjdjZFxuICBwdWJsaWMgYWRkVG9Bc3N1bWVSb2xlUG9saWN5KGRvYzogSVBvbGljeURvY3VtZW50KSB7XG4gICAgLy8gTGF6eSBpbXBvcnQgdG8gYXZvaWQgY2lyY3VsYXIgaW1wb3J0IGRlcGVuZGVuY2llcyBkdXJpbmcgc3RhcnR1cFxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICBjb25zdCBhZGFwdGVyOiB0eXBlb2YgaW1wb3J0KFwiLi9wcml2YXRlL2FkYXB0ZXJcIikgPSByZXF1aXJlKFwiLi9wcml2YXRlL2FkYXB0ZXJcIik7XG4gICAgZGVmYXVsdEFkZFByaW5jaXBhbFRvQXNzdW1lUm9sZShcbiAgICAgIHRoaXMud3JhcHBlZCxcbiAgICAgIG5ldyBhZGFwdGVyLk11dGF0aW5nUG9saWN5RG9jdW1lbnRBZGFwdGVyKGRvYywgKHN0YXRlbWVudCkgPT4ge1xuICAgICAgICBzdGF0ZW1lbnQuYWRkQWN0aW9ucyhcInN0czpUYWdTZXNzaW9uXCIpO1xuICAgICAgICByZXR1cm4gc3RhdGVtZW50O1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBkZWR1cGVTdHJpbmcoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5hcHBlbmREZWR1cGUoXCJcIik7XG4gIH1cbn1cblxuLyoqXG4gKiBBZGQgYSBwcmluY2lwYWwgdG8gYW4gQXNzdW1lUm9sZVBvbGljeURvY3VtZW50IGluIHRoZSByaWdodCB3YXlcbiAqXG4gKiBEZWxlZ2F0ZSB0byB0aGUgcHJpbmNpcGFsIGlmIGl0IGNhbiBkbyB0aGUgam9iIGl0c2VsZiwgZG8gYSBkZWZhdWx0IGpvYiBpZiBpdCBjYW4ndC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRBZGRQcmluY2lwYWxUb0Fzc3VtZVJvbGUoXG4gIHByaW5jaXBhbDogSVByaW5jaXBhbCxcbiAgZG9jOiBJUG9saWN5RG9jdW1lbnQsXG4pIHtcbiAgaWYgKGlzQXNzdW1lUm9sZVByaW5jaXBhbChwcmluY2lwYWwpKSB7XG4gICAgLy8gUHJpbmNpcGFsIGtub3dzIGhvdyB0byBhZGQgaXRzZWxmXG4gICAgcHJpbmNpcGFsLmFkZFRvQXNzdW1lUm9sZVBvbGljeShkb2MpO1xuICB9IGVsc2Uge1xuICAgIC8vIFByaW5jaXBhbCBjYW4ndCBhZGQgaXRzZWxmLCB3ZSBkbyBpdCBmb3IgdGhlbVxuICAgIGRvYy5hZGRTdGF0ZW1lbnRzKFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFtwcmluY2lwYWwuYXNzdW1lUm9sZUFjdGlvbl0sXG4gICAgICAgIHByaW5jaXBhbHM6IFtwcmluY2lwYWxdLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0Fzc3VtZVJvbGVQcmluY2lwYWwoXG4gIHByaW5jaXBhbDogSVByaW5jaXBhbCxcbik6IHByaW5jaXBhbCBpcyBJQXNzdW1lUm9sZVByaW5jaXBhbCB7XG4gIHJldHVybiAhIShwcmluY2lwYWwgYXMgSUFzc3VtZVJvbGVQcmluY2lwYWwpLmFkZFRvQXNzdW1lUm9sZVBvbGljeTtcbn1cblxuLyoqXG4gKiBBIGxhenkgdG9rZW4gdGhhdCByZXF1aXJlcyBhbiBpbnN0YW5jZSBvZiBTdGFjayB0byBldmFsdWF0ZVxuICovXG5jbGFzcyBBd3NTdGFja0RlcGVuZGVudFRva2VuIGltcGxlbWVudHMgSVJlc29sdmFibGUge1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRpb25TdGFjazogc3RyaW5nW107XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZm46IChzcGVjOiBBd3NTdGFjaykgPT4gYW55KSB7XG4gICAgLy8gVE9ETzogSW1wbGVtZW50IHN0YWNrIHRyYWNlc1xuICAgIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2hhc2hpY29ycC90ZXJyYWZvcm0tY2RrL2Jsb2IvdjAuMjAuOS9wYWNrYWdlcy9jZGt0Zi9saWIvdG9rZW5zL3ByaXZhdGUvc3RhY2stdHJhY2UudHMjTDlcbiAgICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE2MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2NvcmUvbGliL3N0YWNrLXRyYWNlLnRzI0wyMlxuICAgIHRoaXMuY3JlYXRpb25TdGFjayA9IFtcInN0YWNrIHRyYWNlcyBkaXNhYmxlZFwiXTtcbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlKGNvbnRleHQ6IElSZXNvbHZlQ29udGV4dCkge1xuICAgIHJldHVybiB0aGlzLmZuKEF3c1N0YWNrLm9mQXdzQ29uc3RydWN0KGNvbnRleHQuc2NvcGUpKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gVG9rZW4uYXNTdHJpbmcodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogSlNPTi1pZnkgdGhlIHRva2VuXG4gICAqXG4gICAqIFVzZWQgd2hlbiBKU09OLnN0cmluZ2lmeSgpIGlzIGNhbGxlZFxuICAgKi9cbiAgcHVibGljIHRvSlNPTigpIHtcbiAgICByZXR1cm4gXCI8dW5yZXNvbHZlZC10b2tlbj5cIjtcbiAgfVxufVxuXG5jbGFzcyBTZXJ2aWNlUHJpbmNpcGFsVG9rZW4gaW1wbGVtZW50cyBJUmVzb2x2YWJsZSB7XG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGlvblN0YWNrOiBzdHJpbmdbXTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBzZXJ2aWNlOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRzOiBTZXJ2aWNlUHJpbmNpcGFsT3B0cyxcbiAgKSB7XG4gICAgLy8gVE9ETzogSW1wbGVtZW50IHN0YWNrIHRyYWNlc1xuICAgIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2hhc2hpY29ycC90ZXJyYWZvcm0tY2RrL2Jsb2IvdjAuMjAuOS9wYWNrYWdlcy9jZGt0Zi9saWIvdG9rZW5zL3ByaXZhdGUvc3RhY2stdHJhY2UudHMjTDlcbiAgICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE2MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2NvcmUvbGliL3N0YWNrLXRyYWNlLnRzI0wyMlxuICAgIHRoaXMuY3JlYXRpb25TdGFjayA9IFtcInN0YWNrIHRyYWNlcyBkaXNhYmxlZFwiXTtcbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlKGN0eDogSVJlc29sdmVDb250ZXh0KSB7XG4gICAgY29uc3QgYXdzU3RhY2sgPSBBd3NTdGFjay5vZkF3c0NvbnN0cnVjdChjdHguc2NvcGUpO1xuICAgIC8vIFRPRE86IERvZXMgdGhpcyB3b3JrIGZvciBPcHQtSW4gcmVnaW9ucz8/XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTYwLjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLWlhbS9saWIvcHJpbmNpcGFscy50cyNMNTA2LUw1MTBcbiAgICByZXR1cm4gYXdzU3RhY2suc2VydmljZVByaW5jaXBhbE5hbWUodGhpcy5zZXJ2aWNlLCB0aGlzLm9wdHMucmVnaW9uKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gVG9rZW4uYXNTdHJpbmcodGhpcywge1xuICAgICAgZGlzcGxheUhpbnQ6IHRoaXMuc2VydmljZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBKU09OLWlmeSB0aGUgdG9rZW5cbiAgICpcbiAgICogVXNlZCB3aGVuIEpTT04uc3RyaW5naWZ5KCkgaXMgY2FsbGVkXG4gICAqL1xuICBwdWJsaWMgdG9KU09OKCkge1xuICAgIHJldHVybiBgPCR7dGhpcy5zZXJ2aWNlfT5gO1xuICB9XG59XG5cbi8qKlxuICogTWVyZ2UgdHdvIGFycmF5cyB0aGF0IHJlcHJlc2VudCBJQU0gcHJpbmNpcGFsc1xuICpcbiAqIERvZXMgYW4gaW4tcGxhY2UgbWVyZ2UgaW50byB0YXJnZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVByaW5jaXBhbChcbiAgdGFyZ2V0OiBQcmluY2lwYWxQcm9wc1tdLFxuICBzb3VyY2U6IFByaW5jaXBhbFByb3BzW10sXG4pIHtcbiAgLy8gaWYgb25lIHJlcHJlc2VudHMgdGhlIHN0YXJQcmluY2lwYWwgdGhlIG90aGVyIG9uZSBtdXN0IGJlIGVtcHR5XG4gIGlmIChcbiAgICAoaGFzU3RhclByaW5jaXBhbCh0YXJnZXQpICYmIHNvdXJjZS5sZW5ndGggPiAwKSB8fFxuICAgIChoYXNTdGFyUHJpbmNpcGFsKHNvdXJjZSkgJiYgdGFyZ2V0Lmxlbmd0aCA+IDApXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDYW5ub3QgbWVyZ2UgcHJpbmNpcGFscyAke0pTT04uc3RyaW5naWZ5KHRhcmdldCl9IGFuZCAke0pTT04uc3RyaW5naWZ5KHNvdXJjZSl9OyBpZiBvbmUgdXNlcyBhIHRoZSBTdGFyUHJpbmNpcGFsIHN0cmluZyB0aGUgb3RoZXIgb25lIG11c3QgYmUgZW1wdHlgLFxuICAgICk7XG4gIH1cblxuICBjb25zdCB0YXJnZXRNYXA6IE1hcDxQcmluY2lwYWxUeXBlLCBQcmluY2lwYWxQcm9wcz4gPSBuZXcgTWFwKCk7XG4gIGZvciAoY29uc3QgcHJpbmNpcGFsIG9mIHRhcmdldCkge1xuICAgIHRhcmdldE1hcC5zZXQocHJpbmNpcGFsLnR5cGUsIHByaW5jaXBhbCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHNvdXJjZVByaW5jaXBhbCBvZiBzb3VyY2UpIHtcbiAgICBjb25zdCB7IHR5cGUsIGlkZW50aWZpZXJzOiBzb3VyY2VJZGVudGlmaWVycyB9ID0gc291cmNlUHJpbmNpcGFsO1xuICAgIGlmICh0YXJnZXRNYXAuaGFzKHR5cGUpKSB7XG4gICAgICBjb25zdCB0YXJnZXRJbmRlbnRpZmllclNldCA9IG5ldyBTZXQodGFyZ2V0TWFwLmdldCh0eXBlKSEuaWRlbnRpZmllcnMpO1xuICAgICAgZm9yIChjb25zdCBpZCBvZiBzb3VyY2VJZGVudGlmaWVycykge1xuICAgICAgICB0YXJnZXRJbmRlbnRpZmllclNldC5hZGQoaWQpO1xuICAgICAgfVxuICAgICAgLy8gVXBkYXRlIHRoZSB0YXJnZXQgaWRlbnRpZmllcnMgaW4tcGxhY2VcbiAgICAgIGNvbnN0IGluZGV4ID0gdGFyZ2V0LmZpbmRJbmRleCgocHJpbmNpcGFsKSA9PiBwcmluY2lwYWwudHlwZSA9PT0gdHlwZSk7XG4gICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgIHRhcmdldFtpbmRleF0gPSB7XG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICBpZGVudGlmaWVyczogQXJyYXkuZnJvbSh0YXJnZXRJbmRlbnRpZmllclNldCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldC5wdXNoKHtcbiAgICAgICAgdHlwZSxcbiAgICAgICAgaWRlbnRpZmllcnM6IFsuLi5zb3VyY2VJZGVudGlmaWVyc10sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBEZXRlY3QgaWYgdGhlIFByaW5jaXBhbFByb3BzIGFycmF5IGNvbnRhaW5zIHRoZSBTdGFyUHJpbmNpcGFsOlxuICogdHlwZSA9IFByaW5jaXBhbFR5cGUuQU5ZIGFuZCBpZGVudGlmaWVycyA9IFtcIipcIl1cbiAqL1xuZnVuY3Rpb24gaGFzU3RhclByaW5jaXBhbChwcmluY2lwYWxzOiBQcmluY2lwYWxQcm9wc1tdKSB7XG4gIC8vIFRPRE86IERvZXMgaGF2aW5nIG1vcmUgdGhhbiAxIHByaW5jaXBhbCBtYWtlIHNlbnNlIGlmIG9uZSBvZiB0aGVtIGlzIHRoZSBTdGFyUHJpbmNpcGFsP1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcHJpbmNpcGFscy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBwcmluY2lwYWwgPSBwcmluY2lwYWxzW2luZGV4XTtcbiAgICBpZiAoXG4gICAgICBwcmluY2lwYWwudHlwZSA9PT0gUHJpbmNpcGFsVHlwZS5BTlkgJiZcbiAgICAgIHByaW5jaXBhbC5pZGVudGlmaWVycy5sZW5ndGggPT09IDEgJiZcbiAgICAgIHByaW5jaXBhbC5pZGVudGlmaWVyc1swXSA9PT0gXCIqXCJcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG4iXX0=
|
|
1032
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbmNpcGFscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hd3MvaWFtL3ByaW5jaXBhbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQXNNQSw4Q0EyQkM7QUFLRCwwQ0FtQkM7QUE4N0JELDBFQWdCQztBQThFRCx3Q0F5Q0M7O0FBOXpDRCxpQ0FBNEQ7QUFFNUQsNENBQXdDO0FBR3hDLHlEQVU0QjtBQWlDNUIsSUFBWSxhQU1YO0FBTkQsV0FBWSxhQUFhO0lBQ3ZCLDRCQUFXLENBQUE7SUFDWCx3Q0FBdUIsQ0FBQTtJQUN2QixvQ0FBbUIsQ0FBQTtJQUNuQixnREFBK0IsQ0FBQTtJQUMvQiwwQkFBUyxDQUFBO0FBQ1gsQ0FBQyxFQU5XLGFBQWEsNkJBQWIsYUFBYSxRQU14QjtBQUVELFNBQVMsb0JBQW9CLENBQUMsS0FBYTtJQUN6QyxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDM0MsT0FBTyxjQUFjLElBQUksYUFBYSxDQUFDO0FBQ3pDLENBQUM7QUFpRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQWEsdUJBQXVCO0lBQ2xDOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsUUFBUSxDQUNwQixhQUFrQixFQUNsQixpQkFBeUMsRUFBRTtRQUUzQyxPQUFPLElBQUksdUJBQXVCLENBQ2hDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxFQUNoQyxJQUFBLG9DQUFpQixFQUFDLGNBQWMsQ0FBQyxDQUNsQyxDQUFDO0lBQ0osQ0FBQztJQUVELCtDQUErQztJQUMvQyxJQUFXLGFBQWE7UUFDdEIsT0FBTyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUNELElBQVcsY0FBYztRQUN2QixPQUFPLElBQUEsa0NBQWUsRUFBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFlB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O2dCQUNKLFdBQVcsRUFBRSxDQUFDLEdBQUcsaUJBQWlCLENBQUM7YUFDcEMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxVQUE0QjtJQUNwRCwwRkFBMEY7SUFDMUYsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUN2RCxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEMsSUFDRSxTQUFTLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxHQUFHO1lBQ3BDLFNBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDbEMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQ2hDLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVG9rZW4sIElSZXNvbHZhYmxlLCBJUmVzb2x2ZUNvbnRleHQgfSBmcm9tIFwiY2RrdG5cIjtcbmltcG9ydCB7IElEZXBlbmRhYmxlIH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IEF3c1N0YWNrIH0gZnJvbSBcIi4uL2F3cy1zdGFja1wiO1xuaW1wb3J0IHsgSU9wZW5JZENvbm5lY3RQcm92aWRlciB9IGZyb20gXCIuL29pZGMtcHJvdmlkZXJcIjtcbmltcG9ydCB7IElQb2xpY3lEb2N1bWVudCB9IGZyb20gXCIuL3BvbGljeS1kb2N1bWVudFwiO1xuaW1wb3J0IHtcbiAgUG9saWN5U3RhdGVtZW50LFxuICBDb25kaXRpb24sXG4gIENvbmRpdGlvbnMsXG4gIGlzU3RyaW5nT3JBcnJheU9mU3RyaW5ncyxcbiAgdG9Db25kaXRpb25Kc29uLFxuICBmcm9tQ29uZGl0aW9uSnNvbixcbiAgdmFsaWRhdGVDb25kaXRpb25PYmplY3QsXG4gIENvbmRpdGlvbk1hcCxcbiAgdG9Db25kaXRpb25zLFxufSBmcm9tIFwiLi9wb2xpY3ktc3RhdGVtZW50XCI7XG5pbXBvcnQgeyBJU2FtbFByb3ZpZGVyIH0gZnJvbSBcIi4vc2FtbC1wcm92aWRlclwiO1xuLyoqXG4gKiBUZXJyYWZvcm0gUHJpbmNpcGFsIFByb3BzXG4gKlxuICogVGhlIGBwcmluY2lwYWxzYCBhbmQgYG5vdF9wcmluY2lwYWxzYCBibG9ja3Mgb2YgYSBwb2xpY3kgc3RhdGVtZW50XG4gKlxuICogUmVmOiBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy9sYXRlc3QvZG9jcy9kYXRhLXNvdXJjZXMvaWFtX3BvbGljeV9kb2N1bWVudCNwcmluY2lwYWxzLWFuZC1ub3RfcHJpbmNpcGFsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByaW5jaXBhbFByb3BzIHtcbiAgLyoqXG4gICAqIExpc3Qgb2YgaWRlbnRpZmllcnMgZm9yIHByaW5jaXBhbHMuXG4gICAqXG4gICAqIFdoZW4gdHlwZSBpcyBBV1MsIHRoZXNlIGFyZSBJQU0gcHJpbmNpcGFsIEFSTnMsIGUuZy4sIGFybjphd3M6aWFtOjoxMjM0NTY3ODkwMTpyb2xlL3lhay1yb2xlLlxuICAgKlxuICAgKiBXaGVuIHR5cGUgaXMgU2VydmljZSwgdGhlc2UgYXJlIEFXUyBTZXJ2aWNlIHJvbGVzLCBlLmcuLCBsYW1iZGEuYW1hem9uYXdzLmNvbS5cbiAgICpcbiAgICogV2hlbiB0eXBlIGlzIEZlZGVyYXRlZCwgdGhlc2UgYXJlIHdlYiBpZGVudGl0eSB1c2VycyBvciBTQU1MIHByb3ZpZGVyIEFSTnMsXG4gICAqIGUuZy4sIGFjY291bnRzLmdvb2dsZS5jb20gb3IgYXJuOmF3czppYW06OjEyMzQ1Njc4OTAxOnNhbWwtcHJvdmlkZXIveWFrLXNhbWwtcHJvdmlkZXIuXG4gICAqXG4gICAqIFdoZW4gdHlwZSBpcyBDYW5vbmljYWxVc2VyLCB0aGVzZSBhcmUgY2Fub25pY2FsIHVzZXIgSURzLFxuICAgKiBlLmcuLCA3OWE1OWRmOTAwYjk0OWU1NWQ5NmExZTY5OGZiYWNlZGZkNmUwOWQ5OGVhY2Y4ZjhkNTIxOGU3Y2Q0N2VmMmJlLlxuICAgKlxuICAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuNjguMC9kb2NzL2RhdGEtc291cmNlcy9pYW1fcG9saWN5X2RvY3VtZW50I2lkZW50aWZpZXJzIERhdGFBd3NJYW1Qb2xpY3lEb2N1bWVudCNpZGVudGlmaWVyc31cbiAgICovXG4gIHJlYWRvbmx5IGlkZW50aWZpZXJzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFR5cGUgb2YgcHJpbmNpcGFsLlxuICAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuNjguMC9kb2NzL2RhdGEtc291cmNlcy9pYW1fcG9saWN5X2RvY3VtZW50I3R5cGUgRGF0YUF3c0lhbVBvbGljeURvY3VtZW50I3R5cGV9XG4gICAqL1xuICByZWFkb25seSB0eXBlOiBQcmluY2lwYWxUeXBlO1xufVxuXG5leHBvcnQgZW51bSBQcmluY2lwYWxUeXBlIHtcbiAgQVdTID0gXCJBV1NcIixcbiAgRkVERVJBVEVEID0gXCJGZWRlcmF0ZWRcIixcbiAgU0VSVklDRSA9IFwiU2VydmljZVwiLFxuICBDQU5PTklDQUxVU0VSID0gXCJDYW5vbmljYWxVc2VyXCIsXG4gIEFOWSA9IFwiKlwiLFxufVxuXG5mdW5jdGlvbiBpc1ZhbGlkUHJpbmNpcGFsVHlwZSh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHVwcGVyQ2FzZVZhbHVlID0gdmFsdWUudG9VcHBlckNhc2UoKTtcbiAgcmV0dXJuIHVwcGVyQ2FzZVZhbHVlIGluIFByaW5jaXBhbFR5cGU7XG59XG5cbi8qKlxuICogQW55IG9iamVjdCB0aGF0IGhhcyBhbiBhc3NvY2lhdGVkIHByaW5jaXBhbCB0aGF0IGEgcGVybWlzc2lvbiBjYW4gYmUgZ3JhbnRlZCB0b1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElHcmFudGFibGUge1xuICAvKipcbiAgICogVGhlIHByaW5jaXBhbCB0byBncmFudCBwZXJtaXNzaW9ucyB0b1xuICAgKi9cbiAgcmVhZG9ubHkgZ3JhbnRQcmluY2lwYWw6IElQcmluY2lwYWw7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGxvZ2ljYWwgSUFNIHByaW5jaXBhbC5cbiAqXG4gKiBBbiBJUHJpbmNpcGFsIGRlc2NyaWJlcyBhIGxvZ2ljYWwgZW50aXR5IHRoYXQgY2FuIHBlcmZvcm0gQVdTIEFQSSBjYWxsc1xuICogYWdhaW5zdCBzZXRzIG9mIHJlc291cmNlcywgb3B0aW9uYWxseSB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnMuXG4gKlxuICogRXhhbXBsZXMgb2Ygc2ltcGxlIHByaW5jaXBhbHMgYXJlIElBTSBvYmplY3RzIHRoYXQgeW91IGNyZWF0ZSwgc3VjaFxuICogYXMgVXNlcnMgb3IgUm9sZXMuXG4gKlxuICogQW4gZXhhbXBsZSBvZiBhIG1vcmUgY29tcGxleCBwcmluY2lwYWxzIGlzIGEgYFNlcnZpY2VQcmluY2lwYWxgIChzdWNoIGFzXG4gKiBgbmV3IFNlcnZpY2VQcmluY2lwYWwoXCJzbnMuYW1hem9uYXdzLmNvbVwiKWAsIHdoaWNoIHJlcHJlc2VudHMgdGhlIFNpbXBsZVxuICogTm90aWZpY2F0aW9ucyBTZXJ2aWNlKS5cbiAqXG4gKiBBIHNpbmdsZSBsb2dpY2FsIFByaW5jaXBhbCBtYXkgYWxzbyBtYXAgdG8gYSBzZXQgb2YgcGh5c2ljYWwgcHJpbmNpcGFscy5cbiAqIEZvciBleGFtcGxlLCBgbmV3IE9yZ2FuaXphdGlvblByaW5jaXBhbCgnby0xMjM0JylgIHJlcHJlc2VudHMgYWxsXG4gKiBpZGVudGl0aWVzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIGdpdmVuIEFXUyBPcmdhbml6YXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVByaW5jaXBhbCBleHRlbmRzIElHcmFudGFibGUge1xuICAvKipcbiAgICogV2hlbiB0aGlzIFByaW5jaXBhbCBpcyB1c2VkIGluIGFuIEFzc3VtZVJvbGUgcG9saWN5LCB0aGUgYWN0aW9uIHRvIHVzZS5cbiAgICovXG4gIHJlYWRvbmx5IGFzc3VtZVJvbGVBY3Rpb246IHN0cmluZztcblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBwb2xpY3kgZnJhZ21lbnQgdGhhdCBpZGVudGlmaWVzIHRoaXMgcHJpbmNpcGFsIGluIGEgUG9saWN5LlxuICAgKi9cbiAgcmVhZG9ubHkgcG9saWN5RnJhZ21lbnQ6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgQVdTIGFjY291bnQgSUQgb2YgdGhpcyBwcmluY2lwYWwuXG4gICAqIENhbiBiZSB1bmRlZmluZWQgd2hlbiB0aGUgYWNjb3VudCBpcyBub3Qga25vd25cbiAgICogKGZvciBleGFtcGxlLCBmb3Igc2VydmljZSBwcmluY2lwYWxzKS5cbiAgICogQ2FuIGJlIGEgVG9rZW4gLSBpbiB0aGF0IGNhc2UsXG4gICAqIGl0J3MgYXNzdW1lZCB0byBiZSBhIHJlZmVyZW5jZSB0byB0aGUgRGF0YUF3c0NhbGxlcklkZW50aXR5XG4gICAqL1xuICByZWFkb25seSBwcmluY2lwYWxBY2NvdW50Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGQgdG8gdGhlIHBvbGljeSBvZiB0aGlzIHByaW5jaXBhbC5cbiAgICpcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgc3RhdGVtZW50IHdhcyBhZGRlZCwgZmFsc2UgaWYgdGhlIHByaW5jaXBhbCBpblxuICAgKiBxdWVzdGlvbiBkb2VzIG5vdCBoYXZlIGEgcG9saWN5IGRvY3VtZW50IHRvIGFkZCB0aGUgc3RhdGVtZW50IHRvLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYGFkZFRvUHJpbmNpcGFsUG9saWN5YCBpbnN0ZWFkLlxuICAgKi9cbiAgYWRkVG9Qb2xpY3koc3RhdGVtZW50OiBQb2xpY3lTdGF0ZW1lbnQpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBZGQgdG8gdGhlIHBvbGljeSBvZiB0aGlzIHByaW5jaXBhbC5cbiAgICovXG4gIGFkZFRvUHJpbmNpcGFsUG9saWN5KHN0YXRlbWVudDogUG9saWN5U3RhdGVtZW50KTogQWRkVG9QcmluY2lwYWxQb2xpY3lSZXN1bHQ7XG59XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHRoZSBmaWVsZHMgaW4gYSBQb2xpY3lTdGF0ZW1lbnQgdGhhdCBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSBhIHByaW5jaXBhbC5cbiAqXG4gKiBUaGlzIGNvbnNpc3RzIG9mIHRoZSBUZXJyYWZvcm0gUHJpbmNpcGFsUHJvcHMgcmVwcmVzZW50aW5nIHRoZVxuICogYHByaW5jaXBhbHNgIGJsb2NrKHMpIGluIGEgcG9saWN5IHN0YXRlbWVudC5cbiAqXG4gKiBHZW5lcmFsbHksIEFXUyBwcmluY2lwYWwgSlNPTiBsb29rcyBsaWtlOlxuICpcbiAqICAgICB7ICc8VFlQRT4nOiBbJ0lEJywgJ0lEJywgLi4uXSB9XG4gKlxuICogQW5kIHRoaXMgaXMgYWxzbyB0aGUgdHlwZSBvZiB0aGUgZmllbGQgYHByaW5jaXBhbEpzb25gLlxuICpcbiAqIEhvd2V2ZXIsIHRoZXJlIGlzIGEgc3BlY2lhbCB0eXBlIG9mIHByaW5jaXBhbCB0aGF0IGlzIGp1c3QgdGhlIHN0cmluZyAnKicsXG4gKiB3aGljaCBpcyB0cmVhdGVkIGRpZmZlcmVudGx5IGJ5IHNvbWUgc2VydmljZXMuXG4gKlxuICogVG8gcmVwcmVzZW50IHRoYXQgcHJpbmNpcGFsLCBgcHJpbmNpcGFsSnNvbmAgc2hvdWxkIGNvbnRhaW4gYCpgLlxuICogVG8gcmVwcmVzZW50IHRoYXQgcHJpbmNpcGFsIGluIFRlcnJhZm9ybSBwcmluY2lwYWxzIGJsb2NrKHMpLCB0aGVcbiAqIHR5cGUgc2hvdWxkIGJlIGBQcmluY2lwYWxUeXBlLkFOWWAgYW5kIHRoZSBpZGVudGlmaWVycyBzaG91bGQgYmUgYFsnKiddYC5cbiAqL1xuZXhwb3J0IGNsYXNzIFByaW5jaXBhbFBvbGljeUZyYWdtZW50IHtcbiAgLyoqXG4gICAqIFBhcnNlcyBhIEpTT04gb2JqZWN0IHdpdGggdGhlIEFXUyBJQU0gUHJpbmNpcGFsIHN0cnVjdHVyZVxuICAgKlxuICAgKiBSZWZlciB0byB0aGUgYGZyb21QcmluY2lwYWxKc29uYCBhbmQgYGZyb21Db25kaXRpb25Kc29uYCBmdW5jdGlvbnMgZm9yIG1vcmUgaW5mb3JtYXRpb25cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUpzb24oXG4gICAgcHJpbmNpcGFsSnNvbjogYW55LFxuICAgIGNvbmRpdGlvbnNKc29uOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge30sXG4gICk6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50IHtcbiAgICByZXR1cm4gbmV3IFByaW5jaXBhbFBvbGljeUZyYWdtZW50KFxuICAgICAgZnJvbVByaW5jaXBhbEpzb24ocHJpbmNpcGFsSnNvbiksXG4gICAgICBmcm9tQ29uZGl0aW9uSnNvbihjb25kaXRpb25zSnNvbiksXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRPRE86IFNob3VsZCB0aGlzIGFjdHVhbGx5IGJlIHVzZWQgYW55d2hlcmU/XG4gIHB1YmxpYyBnZXQgcHJpbmNpcGFsSnNvbigpOiBBd3NQcmluY2lwYWxKc29uIHtcbiAgICByZXR1cm4gdG9QcmluY2lwYWxKc29uKC4uLnRoaXMucHJpbmNpcGFscyk7XG4gIH1cbiAgcHVibGljIGdldCBjb25kaXRpb25zSnNvbigpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHtcbiAgICByZXR1cm4gdG9Db25kaXRpb25Kc29uKC4uLnRoaXMuY29uZGl0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHByaW5jaXBhbHMgQXJyYXkgb2YgXCJwcmluY2lwYWxzXCIgYmxvY2sgaW4gYSBwb2xpY3kgc3RhdGVtZW50XG4gICAqIEBwYXJhbSBjb25kaXRpb25zIGNvbmRpdGlvbnMgdGhhdCBuZWVkIHRvIGJlIGFwcGxpZWQgdG8gdGhpcyBwb2xpY3lcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBwcmluY2lwYWxzOiBBcnJheTxQcmluY2lwYWxQcm9wcz4sXG4gICAgLyoqXG4gICAgICogVGhlIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggdGhlIHBvbGljeSBpcyBpbiBlZmZlY3QuXG4gICAgICogU2VlIFt0aGUgSUFNIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uLmh0bWwpLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBjb25kaXRpb25zOiBDb25kaXRpb25zID0gW10sXG4gICkge31cbn1cblxuLyoqXG4gKiBUeXBlZCByZXByZXNlbnRhdGlvbiBvZiBBV1MgUHJpbmNpcGFsIEpTT05cbiAqL1xuZXhwb3J0IHR5cGUgQXdzUHJpbmNpcGFsSnNvbiA9IHN0cmluZyB8IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW10gfTtcblxuLyoqXG4gKiBSZWFkIGZyb20gQVdTIFByaW5jaXBhbCBKU09OIHRvIFRlcnJhZm9ybSBwcmluY2lwYWxzIGJsb2NrKHMpXG4gKlxuICogSGFuZGxlcyBzcGVjaWFsIGNhc2U6IGlmIHByaW5jaXBhbCBpcyBcIipcIiBhbmQgdHVybnMgaXQgaW50byB0aGUgYFN0YXJQcmluY2lwYWxgLFxuICpcbiAqIEV2ZW4gdGhvdWdoIHRoZSBJQU0gRG9jdW1lbnRhdGlvbiBzdGF0ZXMgdGhhdCBcIlByaW5jaXBhbFwiOiBcIipcIiBhbmQgXCJQcmluY2lwYWxcIjoge1wiQVdTXCI6IFwiKlwifSBhcmUgZXF1aXZhbGVudCxcbiAqIHRob3NlIHByaW5jaXBhbCBlbGVtZW50cyBoYXZlIGRpZmZlcmVudCBiZWhhdmlvciBpbiBzb21lIHNpdHVhdGlvbnMsIGUuZy4sIElBTSBSb2xlIFRydXN0IFBvbGljeS5cbiAqXG4gKiBUbyBoYXZlIFRlcnJhZm9ybSByZW5kZXIgSlNPTiBjb250YWluaW5nIFwiUHJpbmNpcGFsXCI6IFwiKlwiLCB1c2UgdHlwZSA9IFwiKlwiIGFuZCBpZGVudGlmaWVycyA9IFtcIipcIl0uXG4gKiBUbyBoYXZlIFRlcnJhZm9ybSByZW5kZXIgSlNPTiBjb250YWluaW5nIFwiUHJpbmNpcGFsXCI6IHtcIkFXU1wiOiBcIipcIn0sIHVzZSB0eXBlID0gXCJBV1NcIiBhbmQgaWRlbnRpZmllcnMgPSBbXCIqXCJdLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbVByaW5jaXBhbEpzb24ocHJpbmNpcGFsSnNvbjogYW55ID0ge30pOiBQcmluY2lwYWxQcm9wc1tdIHtcbiAgaWYgKHR5cGVvZiBwcmluY2lwYWxKc29uID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKHByaW5jaXBhbEpzb24gPT09IFwiKlwiKSB7XG4gICAgICByZXR1cm4gW3sgdHlwZTogUHJpbmNpcGFsVHlwZS5BTlksIGlkZW50aWZpZXJzOiBbXCIqXCJdIH1dO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUT0RPOiBTaG91bGQgdGhpcyBoYW5kbGUgb3RoZXIgc2NlbmFyaW9zIChpLmUuIFRva2Vucz8pXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHJpbmNpcGFsIHR5cGU6ICR7cHJpbmNpcGFsSnNvbn1gKTtcbiAgICB9XG4gIH1cbiAgaWYgKHR5cGVvZiBwcmluY2lwYWxKc29uICE9PSBcIm9iamVjdFwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEpTT04gSUFNIHByaW5jaXBhbCBzaG91bGQgYmUgYW4gb2JqZWN0LCBnb3QgJHtKU09OLnN0cmluZ2lmeShwcmluY2lwYWxKc29uKX1gLFxuICAgICk7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PFByaW5jaXBhbFByb3BzPigpO1xuICBmb3IgKGNvbnN0IFtrZXksIGlkZW50aWZpZXJzXSBvZiBPYmplY3QuZW50cmllcyhwcmluY2lwYWxKc29uKSkge1xuICAgIGlmICghaXNWYWxpZFByaW5jaXBhbFR5cGUoa2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBwcmluY2lwYWwgdHlwZTogJHtrZXl9LCB2YWxpZCB2YWx1ZXMgYXJlOiAke09iamVjdC52YWx1ZXMoUHJpbmNpcGFsVHlwZSl9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgIGlkZW50aWZpZXJzOiBBcnJheS5pc0FycmF5KGlkZW50aWZpZXJzKSA/IGlkZW50aWZpZXJzIDogW2lkZW50aWZpZXJzXSxcbiAgICAgIHR5cGU6IGtleSBhcyBQcmluY2lwYWxUeXBlLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ29udmVydCBUZXJyYWZvcm0gcHJpbmNpcGFscyBibG9ja3MgYmFjayB0byBBV1MgUHJpbmNpcGFsIEpTT05cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUHJpbmNpcGFsSnNvbihcbiAgLi4ucHJpbmNpcGFsUHJvcHM6IFByaW5jaXBhbFByb3BzW11cbik6IEF3c1ByaW5jaXBhbEpzb24ge1xuICBpZiAoXG4gICAgcHJpbmNpcGFsUHJvcHMubGVuZ3RoID09PSAxICYmXG4gICAgcHJpbmNpcGFsUHJvcHNbMF0udHlwZSA9PT0gUHJpbmNpcGFsVHlwZS5BTlkgJiZcbiAgICBwcmluY2lwYWxQcm9wc1swXS5pZGVudGlmaWVycy5sZW5ndGggPT09IDEgJiZcbiAgICBwcmluY2lwYWxQcm9wc1swXS5pZGVudGlmaWVyc1swXSA9PT0gXCIqXCJcbiAgKVxuICAgIHJldHVybiBcIipcIjtcblxuICBjb25zdCByZXN1bHQ6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW10gfSA9IHt9O1xuICBmb3IgKGNvbnN0IHByaW5jaXBhbCBvZiBwcmluY2lwYWxQcm9wcykge1xuICAgIHJlc3VsdFtwcmluY2lwYWwudHlwZV0gPVxuICAgICAgcHJpbmNpcGFsLmlkZW50aWZpZXJzLmxlbmd0aCA9PT0gMVxuICAgICAgICA/IHByaW5jaXBhbC5pZGVudGlmaWVyc1swXVxuICAgICAgICA6IHByaW5jaXBhbC5pZGVudGlmaWVycztcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEEgdHlwZSBvZiBwcmluY2lwYWwgdGhhdCBoYXMgbW9yZSBjb250cm9sIG92ZXIgaXRzIG93biByZXByZXNlbnRhdGlvbiBpbiBBc3N1bWVSb2xlUG9saWN5RG9jdW1lbnRzXG4gKlxuICogTW9yZSBjb21wbGV4IHR5cGVzIG9mIGlkZW50aXR5IHByb3ZpZGVycyBuZWVkIG1vcmUgY29udHJvbCBvdmVyIFJvbGUncyBwb2xpY3kgZG9jdW1lbnRzXG4gKiB0aGFuIHNpbXBseSBgeyBFZmZlY3Q6ICdBbGxvdycsIEFjdGlvbjogJ0Fzc3VtZVJvbGUnLCBQcmluY2lwYWw6IDxXaGF0ZXZlcj4gfWAuXG4gKlxuICogSWYgdGhhdCBjb250cm9sIGlzIG5lY2Vzc2FyeSwgdGhleSBjYW4gaW1wbGVtZW50IGBJQXNzdW1lUm9sZVByaW5jaXBhbGAgdG8gZ2V0IGZ1bGxcbiAqIGFjY2VzcyB0byBhIFJvbGUncyBBc3N1bWVSb2xlUG9saWN5RG9jdW1lbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUFzc3VtZVJvbGVQcmluY2lwYWwgZXh0ZW5kcyBJUHJpbmNpcGFsIHtcbiAgLyoqXG4gICAqIEFkZCB0aGUgcHJpbmNpcGFsIHRvIHRoZSBBc3N1bWVSb2xlUG9saWN5RG9jdW1lbnRcbiAgICpcbiAgICogQWRkIHRoZSBzdGF0ZW1lbnRzIHRvIHRoZSBBc3N1bWVSb2xlUG9saWN5RG9jdW1lbnQgbmVjZXNzYXJ5IHRvIGdpdmUgdGhpcyBwcmluY2lwYWxcbiAgICogcGVybWlzc2lvbnMgdG8gYXNzdW1lIHRoZSBnaXZlbiByb2xlLlxuICAgKi9cbiAgYWRkVG9Bc3N1bWVSb2xlUG9saWN5KGRvY3VtZW50OiBJUG9saWN5RG9jdW1lbnQpOiB2b2lkO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBjYWxsaW5nIGBhZGRUb1ByaW5jaXBhbFBvbGljeWBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGRUb1ByaW5jaXBhbFBvbGljeVJlc3VsdCB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBzdGF0ZW1lbnQgd2FzIGFkZGVkIHRvIHRoZSBpZGVudGl0eSdzIHBvbGljaWVzLlxuICAgKlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGVtZW50QWRkZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERlcGVuZGFibGUgd2hpY2ggYWxsb3dzIGRlcGVuZGluZyBvbiB0aGUgcG9saWN5IGNoYW5nZSBiZWluZyBhcHBsaWVkXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gUmVxdWlyZWQgaWYgYHN0YXRlbWVudEFkZGVkYCBpcyB0cnVlLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9saWN5RGVwZW5kYWJsZT86IElEZXBlbmRhYmxlO1xufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIHBvbGljeSBwcmluY2lwYWxzXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQcmluY2lwYWxCYXNlIGltcGxlbWVudHMgSUFzc3VtZVJvbGVQcmluY2lwYWwge1xuICBwdWJsaWMgcmVhZG9ubHkgZ3JhbnRQcmluY2lwYWw6IElQcmluY2lwYWwgPSB0aGlzO1xuICBwdWJsaWMgcmVhZG9ubHkgcHJpbmNpcGFsQWNjb3VudDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHBvbGljeSBmcmFnbWVudCB0aGF0IGlkZW50aWZpZXMgdGhpcyBwcmluY2lwYWwgaW4gYSBQb2xpY3kuXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgcG9saWN5RnJhZ21lbnQ6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50O1xuXG4gIC8qKlxuICAgKiBXaGVuIHRoaXMgUHJpbmNpcGFsIGlzIHVzZWQgaW4gYW4gQXNzdW1lUm9sZSBwb2xpY3ksIHRoZSBhY3Rpb24gdG8gdXNlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFzc3VtZVJvbGVBY3Rpb246IHN0cmluZyA9IFwic3RzOkFzc3VtZVJvbGVcIjtcblxuICBwdWJsaWMgYWRkVG9Qb2xpY3koc3RhdGVtZW50OiBQb2xpY3lTdGF0ZW1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hZGRUb1ByaW5jaXBhbFBvbGljeShzdGF0ZW1lbnQpLnN0YXRlbWVudEFkZGVkO1xuICB9XG5cbiAgcHVibGljIGFkZFRvUHJpbmNpcGFsUG9saWN5KFxuICAgIF9zdGF0ZW1lbnQ6IFBvbGljeVN0YXRlbWVudCxcbiAgKTogQWRkVG9QcmluY2lwYWxQb2xpY3lSZXN1bHQge1xuICAgIC8vIFRoaXMgYmFzZSBjbGFzcyBpcyB1c2VkIGZvciBub24taWRlbnRpdHkgcHJpbmNpcGFscy4gTm9uZSBvZiB0aGVtXG4gICAgLy8gaGF2ZSBhIFBvbGljeURvY3VtZW50IHRvIGFkZCB0by5cbiAgICByZXR1cm4geyBzdGF0ZW1lbnRBZGRlZDogZmFsc2UgfTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRUb0Fzc3VtZVJvbGVQb2xpY3koZG9jdW1lbnQ6IElQb2xpY3lEb2N1bWVudCk6IHZvaWQge1xuICAgIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBwcm90b2NvbFxuICAgIGRvY3VtZW50LmFkZFN0YXRlbWVudHMoXG4gICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgYWN0aW9uczogW3RoaXMuYXNzdW1lUm9sZUFjdGlvbl0sXG4gICAgICAgIHByaW5jaXBhbHM6IFt0aGlzXSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgLy8gVGhpcyBpcyBhIGZpcnN0IHBhc3MgdG8gbWFrZSB0aGUgb2JqZWN0IHJlYWRhYmxlLiBEZXNjZW5kYW50IHByaW5jaXBhbHNcbiAgICAvLyBzaG91bGQgcmV0dXJuIHNvbWV0aGluZyBuaWNlci5cbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5wb2xpY3lGcmFnbWVudC5wcmluY2lwYWxKc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBKU09OLWlmeSB0aGUgcHJpbmNpcGFsXG4gICAqXG4gICAqIFVzZWQgd2hlbiBKU09OLnN0cmluZ2lmeSgpIGlzIGNhbGxlZFxuICAgKi9cbiAgcHVibGljIHRvSlNPTigpIHtcbiAgICAvLyBIYXZlIHRvIGltcGxlbWVudCB0b0pTT04oKSBiZWNhdXNlIHRoZSBkZWZhdWx0IHdpbGwgbGVhZCB0byBpbmZpbml0ZSByZWN1cnNpb24uXG4gICAgcmV0dXJuIHRoaXMucG9saWN5RnJhZ21lbnQucHJpbmNpcGFsSnNvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbmV3IFByaW5jaXBhbFdpdGhDb25kaXRpb25zIHVzaW5nIHRoaXMgcHJpbmNpcGFsIGFzIHRoZSBiYXNlLCB3aXRoIHRoZVxuICAgKiBwYXNzZWQgY29uZGl0aW9ucyBhZGRlZC5cbiAgICpcbiAgICogV2hlbiB0aGVyZSBpcyBhIHZhbHVlIGZvciB0aGUgc2FtZSBvcGVyYXRvciBhbmQga2V5IGluIGJvdGggdGhlIHByaW5jaXBhbCBhbmQgdGhlXG4gICAqIGNvbmRpdGlvbnMgcGFyYW1ldGVyLCB0aGUgdmFsdWUgZnJvbSB0aGUgY29uZGl0aW9ucyBwYXJhbWV0ZXIgd2lsbCBiZSB1c2VkLlxuICAgKlxuICAgKiBAcmV0dXJucyBhIG5ldyBQcmluY2lwYWxXaXRoQ29uZGl0aW9ucyBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgd2l0aENvbmRpdGlvbnMoLi4uY29uZGl0aW9uczogQ29uZGl0aW9ucyk6IFByaW5jaXBhbEJhc2Uge1xuICAgIHJldHVybiBuZXcgUHJpbmNpcGFsV2l0aENvbmRpdGlvbnModGhpcywgY29uZGl0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIG5ldyBwcmluY2lwYWwgdXNpbmcgdGhpcyBwcmluY2lwYWwgYXMgdGhlIGJhc2UsIHdpdGggc2Vzc2lvbiB0YWdzIGVuYWJsZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIGEgbmV3IFNlc3Npb25UYWdzUHJpbmNpcGFsIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyB3aXRoU2Vzc2lvblRhZ3MoKTogUHJpbmNpcGFsQmFzZSB7XG4gICAgcmV0dXJuIG5ldyBTZXNzaW9uVGFnc1ByaW5jaXBhbCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciBvciBub3QgdGhpcyBwcmluY2lwYWwgaXMgZXF1YWwgdG8gdGhlIGdpdmVuIHByaW5jaXBhbFxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IGRlZHVwZVN0cmluZygpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogU3BlY2lmeSBhIHByaW5jaXBhbCBieSB0aGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikuXG4gKiBZb3UgY2FuIHNwZWNpZnkgQVdTIGFjY291bnRzLCBJQU0gdXNlcnMsIEZlZGVyYXRlZCBTQU1MIHVzZXJzLCBJQU0gcm9sZXMsIGFuZCBzcGVjaWZpYyBhc3N1bWVkLXJvbGUgc2Vzc2lvbnMuXG4gKiBZb3UgY2Fubm90IHNwZWNpZnkgSUFNIGdyb3VwcyBvciBpbnN0YW5jZSBwcm9maWxlcyBhcyBwcmluY2lwYWxzXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX3ByaW5jaXBhbC5odG1sXG4gKi9cbmV4cG9ydCBjbGFzcyBBcm5QcmluY2lwYWwgZXh0ZW5kcyBQcmluY2lwYWxCYXNlIHtcbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBhcm4gQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIHByaW5jaXBhbCBlbnRpdHkgKGkuZS4gYXJuOmF3czppYW06OjEyMzQ1Njc4OTAxMjp1c2VyL3VzZXItbmFtZSlcbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBhcm46IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvbGljeUZyYWdtZW50KCk6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50IHtcbiAgICByZXR1cm4gbmV3IFByaW5jaXBhbFBvbGljeUZyYWdtZW50KFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogUHJpbmNpcGFsVHlwZS5BV1MsXG4gICAgICAgIGlkZW50aWZpZXJzOiBbdGhpcy5hcm5dLFxuICAgICAgfSxcbiAgICBdKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYEFyblByaW5jaXBhbCgke3RoaXMuYXJufSlgO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBhZGRpbmcgYSBjb25kaXRpb24gdGhhdCB0aGUgcHJpbmNpcGFsIGlzIHBhcnQgb2YgdGhlIHNwZWNpZmllZFxuICAgKiBBV1MgT3JnYW5pemF0aW9uLlxuICAgKi9cbiAgcHVibGljIGluT3JnYW5pemF0aW9uKG9yZ2FuaXphdGlvbklkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy53aXRoQ29uZGl0aW9ucyh7XG4gICAgICB0ZXN0OiBcIlN0cmluZ0VxdWFsc1wiLFxuICAgICAgdmFyaWFibGU6IFwiYXdzOlByaW5jaXBhbE9yZ0lEXCIsXG4gICAgICB2YWx1ZXM6IFtvcmdhbml6YXRpb25JZF0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZGVkdXBlU3RyaW5nKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGBBcm5QcmluY2lwYWw6JHt0aGlzLmFybn1gO1xuICB9XG59XG5cbi8qKlxuICogU3BlY2lmeSBBV1MgYWNjb3VudCBJRCBhcyB0aGUgcHJpbmNpcGFsIGVudGl0eSBpbiBhIHBvbGljeSB0byBkZWxlZ2F0ZSBhdXRob3JpdHkgdG8gdGhlIGFjY291bnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBBY2NvdW50UHJpbmNpcGFsIGV4dGVuZHMgQXJuUHJpbmNpcGFsIHtcbiAgcHVibGljIHJlYWRvbmx5IHByaW5jaXBhbEFjY291bnQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGFjY291bnRJZCBBV1MgYWNjb3VudCBJRCAoaS5lLiAnMTIzNDU2Nzg5MDEyJylcbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBhY2NvdW50SWQ6IGFueSkge1xuICAgIHN1cGVyKFxuICAgICAgbmV3IEF3c1N0YWNrRGVwZW5kZW50VG9rZW4oXG4gICAgICAgIChhd3NTdGFjaykgPT4gYGFybjoke2F3c1N0YWNrLnBhcnRpdGlvbn06aWFtOjoke2FjY291bnRJZH06cm9vdGAsXG4gICAgICApLnRvU3RyaW5nKCksXG4gICAgKTtcbiAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChhY2NvdW50SWQpICYmIHR5cGVvZiBhY2NvdW50SWQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImFjY291bnRJZCBzaG91bGQgYmUgb2YgdHlwZSBzdHJpbmdcIik7XG4gICAgfVxuICAgIHRoaXMucHJpbmNpcGFsQWNjb3VudCA9IGFjY291bnRJZDtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYEFjY291bnRQcmluY2lwYWwoJHt0aGlzLmFjY291bnRJZH0pYDtcbiAgfVxufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGEgc2VydmljZSBwcmluY2lwYWwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZVByaW5jaXBhbE9wdHMge1xuICAvKipcbiAgICogVGhlIHJlZ2lvbiBpbiB3aGljaCB5b3Ugd2FudCB0byByZWZlcmVuY2UgdGhlIHNlcnZpY2VcbiAgICpcbiAgICogVGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBmb3IgKmNyb3NzLXJlZ2lvbiogcmVmZXJlbmNlcy5cbiAgICpcbiAgICogTm90ZTogV2UgYWx3YXlzIHJldHVybiB0aGUgZnVsbCBzZXJ2aWNlIHByaW5jaXBhbCBuYW1lLCBpbmNsdWRpbmcgdGhlIHJlZ2lvbi5cbiAgICogTm9ybWFsbHksIHRoZSByZWdpb24gaXMgb25seSByZXF1aXJlZCBmb3IgKm9wdC1pbiogcmVnaW9ucy4gSW4gdGhvc2VcbiAgICogY2FzZXMsIHRoZSByZWdpb24gbmFtZSBuZWVkcyB0byBiZSBpbmNsdWRlZCB0byByZWZlcmVuY2UgdGhlIGNvcnJlY3Qgc2VydmljZSBwcmluY2lwYWwuXG4gICAqIEluIGFsbCBvdGhlciBjYXNlcywgdGhlIGdsb2JhbCBzZXJ2aWNlIHByaW5jaXBhbCBuYW1lIGlzIHN1ZmZpY2llbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIHJlc29sdmluZyBTdGFjaydzIHJlZ2lvbi5cbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBjb25kaXRpb25zIHRvIGFkZCB0byB0aGUgU2VydmljZSBQcmluY2lwYWxcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBjb25kaXRpb25zXG4gICAqL1xuICByZWFkb25seSBjb25kaXRpb25zPzogQ29uZGl0aW9ucztcbn1cblxuLyoqXG4gKiBBbiBJQU0gcHJpbmNpcGFsIHRoYXQgcmVwcmVzZW50cyBhbiBBV1Mgc2VydmljZSAoaS5lLiBgc3FzLmFtYXpvbmF3cy5jb21gKS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlcnZpY2VQcmluY2lwYWwgZXh0ZW5kcyBQcmluY2lwYWxCYXNlIHtcbiAgLyoqXG4gICAqIFJldHVybiB0aGUgc2VydmljZSBwcmluY2lwYWwgbmFtZSBiYXNlZCBvbiB0aGUgcmVnaW9uIGl0J3MgdXNlZCBpbi5cbiAgICpcbiAgICogU29tZSBzZXJ2aWNlIHByaW5jaXBhbCBuYW1lcyB1c2VkIHRvIGJlIGRpZmZlcmVudCBmb3IgZGlmZmVyZW50IHBhcnRpdGlvbnMsXG4gICAqIGFuZCBzb21lIHdlcmUgbm90LlxuICAgKlxuICAgKiBUaGVzZSBkYXlzIGFsbCBzZXJ2aWNlIHByaW5jaXBhbCBuYW1lcyBhcmUgc3RhbmRhcmRpemVkLCBhbmQgdGhleSBhcmUgYWxsXG4gICAqIG9mIHRoZSBmb3JtIGA8c2VydmljZW5hbWU+LmFtYXpvbmF3cy5jb21gLlxuICAgKlxuICAgKiBUbyBhdm9pZCBicmVha2luZyBjaGFuZ2VzLCBoYW5kbGluZyBpcyBwcm92aWRlZCBmb3Igc2VydmljZXMgYWRkZWQgd2l0aCB0aGUgZm9ybWF0cyBiZWxvdyxcbiAgICogaG93ZXZlciwgbm8gYWRkaXRpb25hbCBoYW5kbGluZyB3aWxsIGJlIGFkZGVkIGZvciBuZXcgcmVnaW9ucyBvciBwYXJ0aXRpb25zLlxuICAgKiAgIC0gczNcbiAgICogICAtIHMzLmFtYXpvbmF3cy5jb21cbiAgICogICAtIHMzLmFtYXpvbmF3cy5jb20uY25cbiAgICogICAtIHMzLmMycy5pYy5nb3ZcbiAgICogICAtIHMzLnNjMnMuc2dvdi5nb3ZcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgcHJpbmNpcGFsTmFtZSA9IGlhbS5TZXJ2aWNlUHJpbmNpcGFsLnNlcnZpY2VQcmluY2lwYWxOYW1lKCdlYzInKTtcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2VydmljZVByaW5jaXBhbE5hbWUoc2VydmljZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmV3IFNlcnZpY2VQcmluY2lwYWxUb2tlbihzZXJ2aWNlLCB7fSkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZlcmVuY2UgYW4gQVdTIHNlcnZpY2UsIG9wdGlvbmFsbHkgaW4gYSBnaXZlbiByZWdpb25cbiAgICpcbiAgICogQHBhcmFtIHNlcnZpY2UgQVdTIHNlcnZpY2UgKGkuZS4gc3FzLmFtYXpvbmF3cy5jb20pXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgc2VydmljZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0czogU2VydmljZVByaW5jaXBhbE9wdHMgPSB7fSxcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcG9saWN5RnJhZ21lbnQoKTogUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQge1xuICAgIHJldHVybiBuZXcgUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQoXG4gICAgICBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBQcmluY2lwYWxUeXBlLlNFUlZJQ0UsXG4gICAgICAgICAgaWRlbnRpZmllcnM6IFtcbiAgICAgICAgICAgIG5ldyBTZXJ2aWNlUHJpbmNpcGFsVG9rZW4odGhpcy5zZXJ2aWNlLCB0aGlzLm9wdHMpLnRvU3RyaW5nKCksXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICB0aGlzLm9wdHMuY29uZGl0aW9ucyxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBgU2VydmljZVByaW5jaXBhbCgke3RoaXMuc2VydmljZX0pYDtcbiAgfVxuXG4gIHB1YmxpYyBkZWR1cGVTdHJpbmcoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gYFNlcnZpY2VQcmluY2lwYWw6JHt0aGlzLnNlcnZpY2V9OiR7SlNPTi5zdHJpbmdpZnkodGhpcy5vcHRzKX1gO1xuICB9XG59XG5cbi8qKlxuICogQSBwcmluY2lwYWwgdGhhdCByZXByZXNlbnRzIGFuIEFXUyBPcmdhbml6YXRpb25cbiAqL1xuZXhwb3J0IGNsYXNzIE9yZ2FuaXphdGlvblByaW5jaXBhbCBleHRlbmRzIFByaW5jaXBhbEJhc2Uge1xuICAvKipcbiAgICpcbiAgICogQHBhcmFtIG9yZ2FuaXphdGlvbklkIFRoZSB1bmlxdWUgaWRlbnRpZmllciAoSUQpIG9mIGFuIG9yZ2FuaXphdGlvbiAoaS5lLiBvLTEyMzQ1YWJjZGUpXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgb3JnYW5pemF0aW9uSWQ6IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvbGljeUZyYWdtZW50KCk6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50IHtcbiAgICByZXR1cm4gbmV3IFByaW5jaXBhbFBvbGljeUZyYWdtZW50KFxuICAgICAgW3sgdHlwZTogUHJpbmNpcGFsVHlwZS5BV1MsIGlkZW50aWZpZXJzOiBbXCIqXCJdIH1dLFxuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgdGVzdDogXCJTdHJpbmdFcXVhbHNcIixcbiAgICAgICAgICB2YXJpYWJsZTogXCJhd3M6UHJpbmNpcGFsT3JnSURcIixcbiAgICAgICAgICB2YWx1ZXM6IFt0aGlzLm9yZ2FuaXphdGlvbklkXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYE9yZ2FuaXphdGlvblByaW5jaXBhbCgke3RoaXMub3JnYW5pemF0aW9uSWR9KWA7XG4gIH1cblxuICBwdWJsaWMgZGVkdXBlU3RyaW5nKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGBPcmdhbml6YXRpb25QcmluY2lwYWw6JHt0aGlzLm9yZ2FuaXphdGlvbklkfWA7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHBvbGljeSBwcmluY2lwYWwgZm9yIGNhbm9uaWNhbFVzZXJJZHMgLSB1c2VmdWwgZm9yIFMzIGJ1Y2tldCBwb2xpY2llcyB0aGF0IHVzZVxuICogT3JpZ2luIEFjY2VzcyBpZGVudGl0aWVzLlxuICpcbiAqIFNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2VuZXJhbC9sYXRlc3QvZ3IvYWNjdC1pZGVudGlmaWVycy5odG1sXG4gKlxuICogYW5kXG4gKlxuICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL3ByaXZhdGUtY29udGVudC1yZXN0cmljdGluZy1hY2Nlc3MtdG8tczMuaHRtbFxuICpcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICovXG5leHBvcnQgY2xhc3MgQ2Fub25pY2FsVXNlclByaW5jaXBhbCBleHRlbmRzIFByaW5jaXBhbEJhc2Uge1xuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGNhbm9uaWNhbFVzZXJJZCB1bmlxdWUgaWRlbnRpZmllciBhc3NpZ25lZCBieSBBV1MgZm9yIGV2ZXJ5IGFjY291bnQuXG4gICAqICAgcm9vdCB1c2VyIGFuZCBJQU0gdXNlcnMgZm9yIGFuIGFjY291bnQgYWxsIHNlZSB0aGUgc2FtZSBJRC5cbiAgICogICAoaS5lLiA3OWE1OWRmOTAwYjk0OWU1NWQ5NmExZTY5OGZiYWNlZGZkNmUwOWQ5OGVhY2Y4ZjhkNTIxOGU3Y2Q0N2VmMmJlKVxuICAgKi9cbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGNhbm9uaWNhbFVzZXJJZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcG9saWN5RnJhZ21lbnQoKTogUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQge1xuICAgIHJldHVybiBuZXcgUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQoW1xuICAgICAge1xuICAgICAgICB0eXBlOiBQcmluY2lwYWxUeXBlLkNBTk9OSUNBTFVTRVIsXG4gICAgICAgIGlkZW50aWZpZXJzOiBbdGhpcy5jYW5vbmljYWxVc2VySWRdLFxuICAgICAgfSxcbiAgICBdKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYENhbm9uaWNhbFVzZXJQcmluY2lwYWwoJHt0aGlzLmNhbm9uaWNhbFVzZXJJZH0pYDtcbiAgfVxuXG4gIHB1YmxpYyBkZWR1cGVTdHJpbmcoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gYENhbm9uaWNhbFVzZXJQcmluY2lwYWw6JHt0aGlzLmNhbm9uaWNhbFVzZXJJZH1gO1xuICB9XG59XG5cbi8qKlxuICogUHJpbmNpcGFsIGVudGl0eSB0aGF0IHJlcHJlc2VudHMgYSBmZWRlcmF0ZWQgaWRlbnRpdHkgcHJvdmlkZXIgc3VjaCBhcyBBbWF6b24gQ29nbml0byxcbiAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSB0ZW1wb3Jhcnkgc2VjdXJpdHkgY3JlZGVudGlhbHMgdG8gdXNlcnMgd2hvIGhhdmUgYmVlbiBhdXRoZW50aWNhdGVkLlxuICogQWRkaXRpb25hbCBjb25kaXRpb24ga2V5cyBhcmUgYXZhaWxhYmxlIHdoZW4gdGhlIHRlbXBvcmFyeSBzZWN1cml0eSBjcmVkZW50aWFscyBhcmUgdXNlZCB0byBtYWtlIGEgcmVxdWVzdC5cbiAqIFlvdSBjYW4gdXNlIHRoZXNlIGtleXMgdG8gd3JpdGUgcG9saWNpZXMgdGhhdCBsaW1pdCB0aGUgYWNjZXNzIG9mIGZlZGVyYXRlZCB1c2Vycy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfaWFtLWNvbmRpdGlvbi1rZXlzLmh0bWwjY29uZGl0aW9uLWtleXMtd2lmXG4gKi9cbmV4cG9ydCBjbGFzcyBGZWRlcmF0ZWRQcmluY2lwYWwgZXh0ZW5kcyBQcmluY2lwYWxCYXNlIHtcbiAgcHVibGljIHJlYWRvbmx5IGFzc3VtZVJvbGVBY3Rpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggdGhlIHBvbGljeSBpcyBpbiBlZmZlY3QuXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbmRpdGlvbnM6IENvbmRpdGlvbnM7XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBmZWRlcmF0ZWQgZmVkZXJhdGVkIGlkZW50aXR5IHByb3ZpZGVyIChpLmUuICdjb2duaXRvLWlkZW50aXR5LmFtYXpvbmF3cy5jb20nIGZvciB1c2VycyBhdXRoZW50aWNhdGVkIHRocm91Z2ggQ29nbml0bylcbiAgICogQHBhcmFtIHNlc3Npb25UYWdzIFdoZXRoZXIgdG8gZW5hYmxlIHNlc3Npb24gdGFnZ2luZyAoc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9pZF9zZXNzaW9uLXRhZ3MuaHRtbClcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBmZWRlcmF0ZWQ6IHN0cmluZyxcbiAgICBjb25kaXRpb25zOiBDb25kaXRpb25zID0gW10sXG4gICAgYXNzdW1lUm9sZUFjdGlvbjogc3RyaW5nID0gXCJzdHM6QXNzdW1lUm9sZVwiLFxuICApIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5jb25kaXRpb25zID0gY29uZGl0aW9ucztcbiAgICB0aGlzLmFzc3VtZVJvbGVBY3Rpb24gPSBhc3N1bWVSb2xlQWN0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBwb2xpY3lGcmFnbWVudCgpOiBQcmluY2lwYWxQb2xpY3lGcmFnbWVudCB7XG4gICAgcmV0dXJuIG5ldyBQcmluY2lwYWxQb2xpY3lGcmFnbWVudChcbiAgICAgIFt7IHR5cGU6IFByaW5jaXBhbFR5cGUuRkVERVJBVEVELCBpZGVudGlmaWVyczogW3RoaXMuZmVkZXJhdGVkXSB9XSxcbiAgICAgIHRoaXMuY29uZGl0aW9ucyxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBgRmVkZXJhdGVkUHJpbmNpcGFsKCR7dGhpcy5mZWRlcmF0ZWR9KWA7XG4gIH1cblxuICBwdWJsaWMgZGVkdXBlU3RyaW5nKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGBGZWRlcmF0ZWRQcmluY2lwYWw6JHt0aGlzLmZlZGVyYXRlZH06JHt0aGlzLmFzc3VtZVJvbGVBY3Rpb259OiR7SlNPTi5zdHJpbmdpZnkodGhpcy5jb25kaXRpb25zKX1gO1xuICB9XG59XG5cbi8qKlxuICogQSBwcmluY2lwYWwgdGhhdCByZXByZXNlbnRzIGEgZmVkZXJhdGVkIGlkZW50aXR5IHByb3ZpZGVyIGFzIFdlYiBJZGVudGl0eSBzdWNoIGFzIENvZ25pdG8sIEFtYXpvbixcbiAqIEZhY2Vib29rLCBHb29nbGUsIGV0Yy5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYklkZW50aXR5UHJpbmNpcGFsIGV4dGVuZHMgRmVkZXJhdGVkUHJpbmNpcGFsIHtcbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGl0eVByb3ZpZGVyIGlkZW50aXR5IHByb3ZpZGVyIChpLmUuICdjb2duaXRvLWlkZW50aXR5LmFtYXpvbmF3cy5jb20nIGZvciB1c2VycyBhdXRoZW50aWNhdGVkIHRocm91Z2ggQ29nbml0bylcbiAgICogQHBhcmFtIGNvbmRpdGlvbnMgVGhlIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggdGhlIHBvbGljeSBpcyBpbiBlZmZlY3QuXG4gICAqICAgU2VlIFt0aGUgSUFNIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uLmh0bWwpLlxuICAgKiBAcGFyYW0gc2Vzc2lvblRhZ3MgV2hldGhlciB0byBlbmFibGUgc2Vzc2lvbiB0YWdnaW5nIChzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL2lkX3Nlc3Npb24tdGFncy5odG1sKVxuICAgKi9cbiAgY29uc3RydWN0b3IoaWRlbnRpdHlQcm92aWRlcjogc3RyaW5nLCBjb25kaXRpb25zOiBDb25kaXRpb25zID0gW10pIHtcbiAgICBzdXBlcihpZGVudGl0eVByb3ZpZGVyLCBjb25kaXRpb25zID8/IHt9LCBcInN0czpBc3N1bWVSb2xlV2l0aFdlYklkZW50aXR5XCIpO1xuICB9XG5cbiAgcHVibGljIGdldCBwb2xpY3lGcmFnbWVudCgpOiBQcmluY2lwYWxQb2xpY3lGcmFnbWVudCB7XG4gICAgcmV0dXJuIG5ldyBQcmluY2lwYWxQb2xpY3lGcmFnbWVudChcbiAgICAgIFt7IHR5cGU6IFByaW5jaXBhbFR5cGUuRkVERVJBVEVELCBpZGVudGlmaWVyczogW3RoaXMuZmVkZXJhdGVkXSB9XSxcbiAgICAgIHRoaXMuY29uZGl0aW9ucyxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBgV2ViSWRlbnRpdHlQcmluY2lwYWwoJHt0aGlzLmZlZGVyYXRlZH0pYDtcbiAgfVxufVxuXG4vKipcbiAqIEEgcHJpbmNpcGFsIHRoYXQgcmVwcmVzZW50cyBhIGZlZGVyYXRlZCBpZGVudGl0eSBwcm92aWRlciBhcyBmcm9tIGEgT3BlbklEIENvbm5lY3QgcHJvdmlkZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBPcGVuSWRDb25uZWN0UHJpbmNpcGFsIGV4dGVuZHMgV2ViSWRlbnRpdHlQcmluY2lwYWwge1xuICAvKipcbiAgICpcbiAgICogQHBhcmFtIG9wZW5JZENvbm5lY3RQcm92aWRlciBPcGVuSUQgQ29ubmVjdCBwcm92aWRlclxuICAgKiBAcGFyYW0gY29uZGl0aW9ucyBUaGUgY29uZGl0aW9ucyB1bmRlciB3aGljaCB0aGUgcG9saWN5IGlzIGluIGVmZmVjdC5cbiAgICogICBTZWUgW3RoZSBJQU0gZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb24uaHRtbCkuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBvcGVuSWRDb25uZWN0UHJvdmlkZXI6IElPcGVuSWRDb25uZWN0UHJvdmlkZXIsXG4gICAgY29uZGl0aW9uczogQ29uZGl0aW9ucyA9IFtdLFxuICApIHtcbiAgICBzdXBlcihvcGVuSWRDb25uZWN0UHJvdmlkZXIub3BlbklkQ29ubmVjdFByb3ZpZGVyQXJuLCBjb25kaXRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcG9saWN5RnJhZ21lbnQoKTogUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQge1xuICAgIHJldHVybiBuZXcgUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQoXG4gICAgICBbeyB0eXBlOiBQcmluY2lwYWxUeXBlLkZFREVSQVRFRCwgaWRlbnRpZmllcnM6IFt0aGlzLmZlZGVyYXRlZF0gfV0sXG4gICAgICB0aGlzLmNvbmRpdGlvbnMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYE9wZW5JZENvbm5lY3RQcmluY2lwYWwoJHt0aGlzLmZlZGVyYXRlZH0pYDtcbiAgfVxufVxuXG4vKipcbiAqIFByaW5jaXBhbCBlbnRpdHkgdGhhdCByZXByZXNlbnRzIGEgU0FNTCBmZWRlcmF0ZWQgaWRlbnRpdHkgcHJvdmlkZXJcbiAqL1xuZXhwb3J0IGNsYXNzIFNhbWxQcmluY2lwYWwgZXh0ZW5kcyBGZWRlcmF0ZWRQcmluY2lwYWwge1xuICBjb25zdHJ1Y3RvcihzYW1sUHJvdmlkZXI6IElTYW1sUHJvdmlkZXIsIGNvbmRpdGlvbnM6IENvbmRpdGlvbnMpIHtcbiAgICBzdXBlcihzYW1sUHJvdmlkZXIuc2FtbFByb3ZpZGVyQXJuLCBjb25kaXRpb25zLCBcInN0czpBc3N1bWVSb2xlV2l0aFNBTUxcIik7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGBTYW1sUHJpbmNpcGFsKCR7dGhpcy5mZWRlcmF0ZWR9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBQcmluY2lwYWwgZW50aXR5IHRoYXQgcmVwcmVzZW50cyBhIFNBTUwgZmVkZXJhdGVkIGlkZW50aXR5IHByb3ZpZGVyIGZvclxuICogcHJvZ3JhbW1hdGljIGFuZCBBV1MgTWFuYWdlbWVudCBDb25zb2xlIGFjY2Vzcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNhbWxDb25zb2xlUHJpbmNpcGFsIGV4dGVuZHMgU2FtbFByaW5jaXBhbCB7XG4gIC8qKlxuICAgKiBlbnVtIFBhcnRpdGlvbiB7XG4gICAqICAgRGVmYXVsdCA9ICdhd3MnLFxuICAgKiAgIENuID0gJ2F3cy1jbicsXG4gICAqICAgVXNHb3YgPSAnYXdzLXVzLWdvdicsXG4gICAqICAgVXNJc28gPSAnYXdzLWlzbycsXG4gICAqICAgVXNJc29CID0gJ2F3cy1pc28tYicsXG4gICAqICAgVXNJc29GID0gJ2F3cy1pc28tZicsXG4gICAqICAgRXVJc29FID0gJ2F3cy1pc28tZScsXG4gICAqIH1cbiAgICogU0FNTCBTaWduIE9uIHVybHMgY291bGQgYmUuLi5cbiAgICogW1BhcnRpdGlvbi5EZWZhdWx0XTogJ2h0dHBzOi8vc2lnbmluLmF3cy5hbWF6b24uY29tL3NhbWwnLFxuICAgKiBbUGFydGl0aW9uLkNuXTogJ2h0dHBzOi8vc2lnbmluLmFtYXpvbmF3cy5jbi9zYW1sJyxcbiAgICogW1BhcnRpdGlvbi5Vc0dvdl06ICdodHRwczovL3NpZ25pbi5hbWF6b25hd3MtdXMtZ292LmNvbS9zYW1sJyxcbiAgICogW1BhcnRpdGlvbi5Vc0lzb106ICdodHRwczovL3NpZ25pbi5jMnNob21lLmljLmdvdi9zYW1sJyxcbiAgICogW1BhcnRpdGlvbi5Vc0lzb0JdOiAnaHR0cHM6Ly9zaWduaW4uc2Myc2hvbWUuc2dvdi5nb3Yvc2FtbCcsXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gc2FtbFByb3ZpZGVyIFRoZSBTQU1MIHByb3ZpZGVyXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzYW1sUHJvdmlkZXI6IElTYW1sUHJvdmlkZXIsIGNvbmRpdGlvbnM6IENvbmRpdGlvbnMgPSBbXSkge1xuICAgIHN1cGVyKHNhbWxQcm92aWRlciwgW1xuICAgICAgLi4uY29uZGl0aW9ucyxcbiAgICAgIC8vIFRPRE86IGhhbmRsZSBjb2xsaXNpb25zIG9uIFwiU0FNTDphdWRcIj9cbiAgICAgIHtcbiAgICAgICAgdGVzdDogXCJTdHJpbmdFcXVhbHNcIixcbiAgICAgICAgdmFyaWFibGU6IFwiU0FNTDphdWRcIixcbiAgICAgICAgdmFsdWVzOiBbXCJodHRwczovL3NpZ25pbi5hd3MuYW1hem9uLmNvbS9zYW1sXCJdLFxuICAgICAgfSxcbiAgICBdKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYFNhbWxDb25zb2xlUHJpbmNpcGFsKCR7dGhpcy5mZWRlcmF0ZWR9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBVc2UgdGhlIEFXUyBhY2NvdW50IGludG8gd2hpY2ggYSBzdGFjayBpcyBkZXBsb3llZCBhcyB0aGUgcHJpbmNpcGFsIGVudGl0eSBpbiBhIHBvbGljeVxuICovXG5leHBvcnQgY2xhc3MgQWNjb3VudFJvb3RQcmluY2lwYWwgZXh0ZW5kcyBBY2NvdW50UHJpbmNpcGFsIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXG4gICAgICBuZXcgQXdzU3RhY2tEZXBlbmRlbnRUb2tlbigoYXdzU3RhY2spID0+IGF3c1N0YWNrLmFjY291bnQpLnRvU3RyaW5nKCksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gXCJBY2NvdW50Um9vdFByaW5jaXBhbCgpXCI7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHByaW5jaXBhbCByZXByZXNlbnRpbmcgYWxsIEFXUyBpZGVudGl0aWVzIGluIGFsbCBhY2NvdW50c1xuICpcbiAqIFNvbWUgc2VydmljZXMgYmVoYXZlIGRpZmZlcmVudGx5IHdoZW4geW91IHNwZWNpZnkgYFByaW5jaXBhbDogJyonYFxuICogb3IgYFByaW5jaXBhbDogeyBBV1M6IFwiKlwiIH1gIGluIHRoZWlyIHJlc291cmNlIHBvbGljeS5cbiAqXG4gKiBgQW55UHJpbmNpcGFsYCByZW5kZXJzIHRvIGBQcmluY2lwYWw6IHsgQVdTOiBcIipcIiB9YC4gVGhpcyBpcyBjb3JyZWN0XG4gKiBtb3N0IG9mIHRoZSB0aW1lLCBidXQgaW4gY2FzZXMgd2hlcmUgeW91IG5lZWQgdGhlIG90aGVyIHByaW5jaXBhbCxcbiAqIHVzZSBgU3RhclByaW5jaXBhbGAgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEFueVByaW5jaXBhbCBleHRlbmRzIEFyblByaW5jaXBhbCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiKlwiKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gXCJBbnlQcmluY2lwYWwoKVwiO1xuICB9XG59XG5cbi8qKlxuICogQSBwcmluY2lwYWwgcmVwcmVzZW50aW5nIGFsbCBpZGVudGl0aWVzIGluIGFsbCBhY2NvdW50c1xuICogQGRlcHJlY2F0ZWQgdXNlIGBBbnlQcmluY2lwYWxgXG4gKi9cbmV4cG9ydCBjbGFzcyBBbnlvbmUgZXh0ZW5kcyBBbnlQcmluY2lwYWwge31cblxuLyoqXG4gKiBBIHByaW5jaXBhbCB0aGF0IHVzZXMgYSBsaXRlcmFsICcqJyBpbiB0aGUgSUFNIEpTT04gbGFuZ3VhZ2VcbiAqXG4gKiBTb21lIHNlcnZpY2VzIGJlaGF2ZSBkaWZmZXJlbnRseSB3aGVuIHlvdSBzcGVjaWZ5IGBQcmluY2lwYWw6IFwiKlwiYFxuICogb3IgYFByaW5jaXBhbDogeyBBV1M6IFwiKlwiIH1gIGluIHRoZWlyIHJlc291cmNlIHBvbGljeS5cbiAqXG4gKiBgU3RhclByaW5jaXBhbGAgcmVuZGVycyB0byBgUHJpbmNpcGFsOiAqYC4gTW9zdCBvZiB0aGUgdGltZSwgeW91XG4gKiBzaG91bGQgdXNlIGBBbnlQcmluY2lwYWxgIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdGFyUHJpbmNpcGFsIGV4dGVuZHMgUHJpbmNpcGFsQmFzZSB7XG4gIHB1YmxpYyByZWFkb25seSBwb2xpY3lGcmFnbWVudDogUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQgPVxuICAgIG5ldyBQcmluY2lwYWxQb2xpY3lGcmFnbWVudChbXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFByaW5jaXBhbFR5cGUuQU5ZLFxuICAgICAgICBpZGVudGlmaWVyczogW1wiKlwiXSxcbiAgICAgIH0sXG4gICAgXSk7XG5cbiAgcHVibGljIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBcIlN0YXJQcmluY2lwYWwoKVwiO1xuICB9XG5cbiAgcHVibGljIGRlZHVwZVN0cmluZygpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBcIlN0YXJQcmluY2lwYWxcIjtcbiAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBwcmluY2lwYWwgdGhhdCBoYXMgbXVsdGlwbGUgdHlwZXMgb2YgcHJpbmNpcGFscy4gQSBjb21wb3NpdGUgcHJpbmNpcGFsIGNhbm5vdFxuICogaGF2ZSBjb25kaXRpb25zLiBpLmUuIG11bHRpcGxlIFNlcnZpY2VQcmluY2lwYWxzIHRoYXQgZm9ybSBhIGNvbXBvc2l0ZSBwcmluY2lwYWxcbiAqL1xuZXhwb3J0IGNsYXNzIENvbXBvc2l0ZVByaW5jaXBhbCBleHRlbmRzIFByaW5jaXBhbEJhc2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgYXNzdW1lUm9sZUFjdGlvbjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IF9wcmluY2lwYWxzID0gbmV3IEFycmF5PElQcmluY2lwYWw+KCk7XG5cbiAgY29uc3RydWN0b3IoLi4ucHJpbmNpcGFsczogSVByaW5jaXBhbFtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAocHJpbmNpcGFscy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJDb21wb3NpdGVQcmluY2lwYWxzIG11c3QgYmUgY29uc3RydWN0ZWQgd2l0aCBhdCBsZWFzdCAxIFByaW5jaXBhbCBidXQgbm9uZSB3ZXJlIHBhc3NlZC5cIixcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuYXNzdW1lUm9sZUFjdGlvbiA9IHByaW5jaXBhbHNbMF0uYXNzdW1lUm9sZUFjdGlvbjtcbiAgICB0aGlzLmFkZFByaW5jaXBhbHMoLi4ucHJpbmNpcGFscyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBJQU0gcHJpbmNpcGFscyB0byB0aGUgY29tcG9zaXRlIHByaW5jaXBhbC4gQ29tcG9zaXRlIHByaW5jaXBhbHMgY2Fubm90IGhhdmVcbiAgICogY29uZGl0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHByaW5jaXBhbHMgSUFNIHByaW5jaXBhbHMgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBjb21wb3NpdGUgcHJpbmNpcGFsXG4gICAqL1xuICBwdWJsaWMgYWRkUHJpbmNpcGFscyguLi5wcmluY2lwYWxzOiBJUHJpbmNpcGFsW10pOiB0aGlzIHtcbiAgICB0aGlzLl9wcmluY2lwYWxzLnB1c2goLi4ucHJpbmNpcGFscyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgYWRkVG9Bc3N1bWVSb2xlUG9saWN5KGRvYzogSVBvbGljeURvY3VtZW50KSB7XG4gICAgZm9yIChjb25zdCBwIG9mIHRoaXMuX3ByaW5jaXBhbHMpIHtcbiAgICAgIGRlZmF1bHRBZGRQcmluY2lwYWxUb0Fzc3VtZVJvbGUocCwgZG9jKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvbGljeUZyYWdtZW50KCk6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50IHtcbiAgICAvLyBXZSBvbmx5IGhhdmUgYSBwcm9ibGVtIHdpdGggY29uZGl0aW9ucyBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHJlbmRlciBjb21wb3NpdGVcbiAgICAvLyBwcmluY2lwYWxzIGludG8gYSBzaW5nbGUgc3RhdGVtZW50ICh3aGljaCBpcyB3aGVuIGBwb2xpY3lGcmFnbWVudGAgd291bGQgZ2V0IGNhbGxlZClcbiAgICBmb3IgKGNvbnN0IHAgb2YgdGhpcy5fcHJpbmNpcGFscykge1xuICAgICAgY29uc3QgZnJhZ21lbnQgPSBwLnBvbGljeUZyYWdtZW50O1xuICAgICAgaWYgKGZyYWdtZW50LmNvbmRpdGlvbnMgJiYgZnJhZ21lbnQuY29uZGl0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIkNvbXBvbmVudHMgb2YgYSBDb21wb3NpdGVQcmluY2lwYWwgbXVzdCBub3QgaGF2ZSBjb25kaXRpb25zLiBcIiArXG4gICAgICAgICAgICBgVHJpZWQgdG8gYWRkIHRoZSBmb2xsb3dpbmcgZnJhZ21lbnQ6ICR7SlNPTi5zdHJpbmdpZnkoZnJhZ21lbnQpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHJpbmNpcGFscyA9IG5ldyBBcnJheTxQcmluY2lwYWxQcm9wcz4oKTtcbiAgICBmb3IgKGNvbnN0IHAgb2YgdGhpcy5fcHJpbmNpcGFscykge1xuICAgICAgbWVyZ2VQcmluY2lwYWwocHJpbmNpcGFscywgcC5wb2xpY3lGcmFnbWVudC5wcmluY2lwYWxzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcmluY2lwYWxQb2xpY3lGcmFnbWVudChwcmluY2lwYWxzKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYENvbXBvc2l0ZVByaW5jaXBhbCgke3RoaXMuX3ByaW5jaXBhbHN9KWA7XG4gIH1cblxuICBwdWJsaWMgZGVkdXBlU3RyaW5nKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaW5uZXIgPSB0aGlzLl9wcmluY2lwYWxzLm1hcChDb21wYXJhYmxlUHJpbmNpcGFsLmRlZHVwZVN0cmluZ0Zvcik7XG4gICAgaWYgKGlubmVyLnNvbWUoKHgpID0+IHggPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBgQ29tcG9zaXRlUHJpbmNpcGFsWyR7aW5uZXIuam9pbihcIixcIil9XWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcHJpbmNpcGFscyB0aGF0IG1ha2UgdXAgdGhlIENvbXBvc2l0ZVByaW5jaXBhbFxuICAgKi9cbiAgcHVibGljIGdldCBwcmluY2lwYWxzKCk6IElQcmluY2lwYWxbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaW5jaXBhbHM7XG4gIH1cbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBQcmluY2lwYWxzIHRoYXQgd3JhcCBvdGhlciBwcmluY2lwYWxzXG4gKi9cbmFic3RyYWN0IGNsYXNzIFByaW5jaXBhbEFkYXB0ZXIgZXh0ZW5kcyBQcmluY2lwYWxCYXNlIHtcbiAgcHVibGljIHJlYWRvbmx5IGFzc3VtZVJvbGVBY3Rpb24gPSB0aGlzLndyYXBwZWQuYXNzdW1lUm9sZUFjdGlvbjtcbiAgcHVibGljIHJlYWRvbmx5IHByaW5jaXBhbEFjY291bnQgPSB0aGlzLndyYXBwZWQucHJpbmNpcGFsQWNjb3VudDtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgd3JhcHBlZDogSVByaW5jaXBhbCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvbGljeUZyYWdtZW50KCk6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50IHtcbiAgICByZXR1cm4gdGhpcy53cmFwcGVkLnBvbGljeUZyYWdtZW50O1xuICB9XG5cbiAgcHVibGljIGFkZFRvUHJpbmNpcGFsUG9saWN5KFxuICAgIHN0YXRlbWVudDogUG9saWN5U3RhdGVtZW50LFxuICApOiBBZGRUb1ByaW5jaXBhbFBvbGljeVJlc3VsdCB7XG4gICAgcmV0dXJuIHRoaXMud3JhcHBlZC5hZGRUb1ByaW5jaXBhbFBvbGljeShzdGF0ZW1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZCB0aGUgZ2l2ZW4gc3RyaW5nIHRvIHRoZSB3cmFwcGVkIHByaW5jaXBhbCdzIGRlZHVwZSBzdHJpbmcgKGlmIGF2YWlsYWJsZSlcbiAgICovXG4gIHByb3RlY3RlZCBhcHBlbmREZWR1cGUoYXBwZW5kOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGlubmVyID0gQ29tcGFyYWJsZVByaW5jaXBhbC5kZWR1cGVTdHJpbmdGb3IodGhpcy53cmFwcGVkKTtcbiAgICByZXR1cm4gaW5uZXIgIT09IHVuZGVmaW5lZFxuICAgICAgPyBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9OiR7aW5uZXJ9OiR7YXBwZW5kfWBcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBwcmluY2lwYWxzIHRoYXQgY2FuIGJlIGNvbXBhcmVkLlxuICpcbiAqIFRoaXMgb25seSBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZCBmb3IgcHJpbmNpcGFscyB0aGF0IGNvdWxkIHBvdGVudGlhbGx5IGJlIHZhbHVlLWVxdWFsLlxuICogSWRlbnRpdHktZXF1YWwgcHJpbmNpcGFscyB3aWxsIGJlIGhhbmRsZWQgY29ycmVjdGx5IGJ5IGRlZmF1bHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBhcmFibGVQcmluY2lwYWwgZXh0ZW5kcyBJUHJpbmNpcGFsIHtcbiAgLyoqXG4gICAqIFJldHVybiBhIHN0cmluZyBmb3JtYXQgb2YgdGhpcyBwcmluY2lwYWwgd2hpY2ggc2hvdWxkIGJlIGlkZW50aWNhbCBpZiB0aGUgdHdvXG4gICAqIHByaW5jaXBhbHMgYXJlIHRoZSBzYW1lLlxuICAgKi9cbiAgZGVkdXBlU3RyaW5nKCk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBIZWxwZXIgY2xhc3MgZm9yIHdvcmtpbmcgd2l0aCBgSUNvbXBhcmFibGVQcmluY2lwYWxgc1xuICovXG5leHBvcnQgY2xhc3MgQ29tcGFyYWJsZVByaW5jaXBhbCB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gcHJpbmNpcGFsIGlzIGEgY29tcGFyYWJsZSBwcmluY2lwYWxcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaXNDb21wYXJhYmxlUHJpbmNpcGFsKFxuICAgIHg6IElQcmluY2lwYWwsXG4gICk6IHggaXMgSUNvbXBhcmFibGVQcmluY2lwYWwge1xuICAgIHJldHVybiBcImRlZHVwZVN0cmluZ1wiIGluIHg7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBkZWR1cGVTdHJpbmcgb2YgdGhlIGdpdmVuIHByaW5jaXBhbCwgaWYgYXZhaWxhYmxlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGRlZHVwZVN0cmluZ0Zvcih4OiBJUHJpbmNpcGFsKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gQ29tcGFyYWJsZVByaW5jaXBhbC5pc0NvbXBhcmFibGVQcmluY2lwYWwoeClcbiAgICAgID8geC5kZWR1cGVTdHJpbmcoKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBBbiBJQU0gcHJpbmNpcGFsIHdpdGggYWRkaXRpb25hbCBjb25kaXRpb25zIHNwZWNpZnlpbmcgd2hlbiB0aGUgcG9saWN5IGlzIGluIGVmZmVjdC5cbiAqXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBjb25kaXRpb25zLCBzZWU6XG4gKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbi5odG1sXG4gKi9cbmV4cG9ydCBjbGFzcyBQcmluY2lwYWxXaXRoQ29uZGl0aW9ucyBleHRlbmRzIFByaW5jaXBhbEFkYXB0ZXIge1xuICBwcml2YXRlIGFkZGl0aW9uYWxDb25kaXRpb25zOiBDb25kaXRpb25NYXAgPSB7fTtcblxuICBjb25zdHJ1Y3RvcihwcmluY2lwYWw6IElQcmluY2lwYWwsIGNvbmRpdGlvbnM6IENvbmRpdGlvbnMpIHtcbiAgICBzdXBlcihwcmluY2lwYWwpO1xuICAgIGZvciAoY29uc3QgYyBvZiBjb25kaXRpb25zKSB7XG4gICAgICB0aGlzLmFkZENvbmRpdGlvbihjKTtcbiAgICB9XG4gIH1cblxuICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9wdWxsLzI4NTEwL2ZpbGVzI2RpZmYtNTAyNDhmNjcxZTliMTNhOWNiMzVhNjI0NDFkNzI4MzJkY2E4OWI2YzdhZDRhODhhYTRmYjJlYzhlNjc2YjdjZFxuICBwdWJsaWMgYWRkVG9Bc3N1bWVSb2xlUG9saWN5KGRvYzogSVBvbGljeURvY3VtZW50KSB7XG4gICAgaWYgKGRvYy5ub2RlLnNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJDYW5ub3QgYWRkIGEgY29uZGl0aW9uIHRvIGEgcHJpbmNpcGFsIG91dHNpZGUgb2YgYSBzdGFjayBzY29wZVwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gTGF6eSBpbXBvcnQgdG8gYXZvaWQgY2lyY3VsYXIgaW1wb3J0IGRlcGVuZGVuY2llcyBkdXJpbmcgc3RhcnR1cFxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICBjb25zdCBhZGFwdGVyOiB0eXBlb2YgaW1wb3J0KFwiLi9wcml2YXRlL2FkYXB0ZXJcIikgPSByZXF1aXJlKFwiLi9wcml2YXRlL2FkYXB0ZXJcIik7XG4gICAgZGVmYXVsdEFkZFByaW5jaXBhbFRvQXNzdW1lUm9sZShcbiAgICAgIHRoaXMud3JhcHBlZCxcbiAgICAgIG5ldyBhZGFwdGVyLk11dGF0aW5nUG9saWN5RG9jdW1lbnRBZGFwdGVyKGRvYywgKHN0YXRlbWVudCkgPT4ge1xuICAgICAgICBzdGF0ZW1lbnQuYWRkQWN0aW9ucyh0aGlzLmFzc3VtZVJvbGVBY3Rpb24pO1xuICAgICAgICBzdGF0ZW1lbnQuYWRkQ29uZGl0aW9ucyguLi50aGlzLmNvbmRpdGlvbnMpO1xuICAgICAgICByZXR1cm4gc3RhdGVtZW50O1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBjb25kaXRpb24gdG8gdGhlIHByaW5jaXBhbFxuICAgKi9cbiAgcHVibGljIGFkZENvbmRpdGlvbihjb25kaXRpb246IENvbmRpdGlvbikge1xuICAgIGlmICghdGhpcy5hZGRpdGlvbmFsQ29uZGl0aW9uc1tjb25kaXRpb24udGVzdF0pIHtcbiAgICAgIHRoaXMuYWRkaXRpb25hbENvbmRpdGlvbnNbY29uZGl0aW9uLnRlc3RdID0ge307XG4gICAgfVxuXG4gICAgY29uc3QgZXhpc3RpbmdDb25kaXRpb24gPVxuICAgICAgdGhpcy5hZGRpdGlvbmFsQ29uZGl0aW9uc1tjb25kaXRpb24udGVzdF1bY29uZGl0aW9uLnZhcmlhYmxlXTtcbiAgICBpZiAoZXhpc3RpbmdDb25kaXRpb24pIHtcbiAgICAgIHRoaXMuYWRkaXRpb25hbENvbmRpdGlvbnNbY29uZGl0aW9uLnRlc3RdW2NvbmRpdGlvbi52YXJpYWJsZV0gPSB7XG4gICAgICAgIC4uLmV4aXN0aW5nQ29uZGl0aW9uLFxuICAgICAgICAuLi5jb25kaXRpb24sXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZGl0aW9uYWxDb25kaXRpb25zW2NvbmRpdGlvbi50ZXN0XVtjb25kaXRpb24udmFyaWFibGVdID0gY29uZGl0aW9uO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBjb25kaXRpb25PYmplY3QgdG8gdGhlIHByaW5jaXBhbFxuICAgKlxuICAgKiBBIGNvbmRpdGlvbk9iamVjdCBoYXMgdGhlIGZvcm1hdCBvZiB0ZXN0OiB7IHZhcmlhYmxlOiB2YWx1ZSB8IHZhbHVlc1tdIH1cbiAgICpcbiAgICogRm9yIGV4YW1wbGU6XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIGNvbnN0IGNvbmRpdGlvbjEgPSB7J1N0cmluZ0VxdWFscycsIHsgJ2F3czpTb21lRmllbGQnOiAnMScgfX07XG4gICAqIC8vIG9yXG4gICAqIGNvbnN0IGNvbmRpdGlvbjIgPSB7J1N0cmluZ0VxdWFscycsIHsgJ2F3czpTb21lRmllbGQnOiBbJzEnLCAnMiddIH19O1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBhZGRDb25kaXRpb25PYmplY3Qoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdmFsaWRhdGVDb25kaXRpb25PYmplY3QodmFsdWUpO1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgICAgaWYgKCFpc1N0cmluZ09yQXJyYXlPZlN0cmluZ3ModikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBGaWVsZHMgbXVzdCBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2Ygc3RyaW5ncy4gR290ICR7dn0gZm9yIGtleSAke2t9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYWRkQ29uZGl0aW9uKHtcbiAgICAgICAgdGVzdDoga2V5LFxuICAgICAgICB2YXJpYWJsZTogayxcbiAgICAgICAgdmFsdWVzOiBBcnJheS5pc0FycmF5KHYpID8gdiA6IFt2XSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIG11bHRpcGxlIGNvbmRpdGlvbnMgdG8gdGhlIHByaW5jaXBhbFxuICAgKlxuICAgKiBWYWx1ZXMgZnJvbSB0aGUgY29uZGl0aW9ucyBwYXJhbWV0ZXIgd2lsbCBvdmVyd3JpdGUgZXhpc3RpbmcgdmFsdWVzIHdpdGggdGhlIHNhbWUgb3BlcmF0b3JcbiAgICogYW5kIGtleS5cbiAgICovXG4gIHB1YmxpYyBhZGRDb25kaXRpb25zKGNvbmRpdGlvbnM6IENvbmRpdGlvbnMpIHtcbiAgICBjb25kaXRpb25zLm1hcCgoYykgPT4ge1xuICAgICAgdGhpcy5hZGRDb25kaXRpb24oYyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBtdWx0aXBsZSBjb25kaXRpb25PYmplY3RzIHRvIHRoZSBwcmluY2lwYWxcbiAgICpcbiAgICogVmFsdWVzIGZyb20gdGhlIGNvbmRpdGlvbnMgcGFyYW1ldGVyIHdpbGwgb3ZlcndyaXRlIGV4aXN0aW5nIHZhbHVlcyB3aXRoIHRoZSBzYW1lIG9wZXJhdG9yXG4gICAqIGFuZCBrZXkuXG4gICAqL1xuICBwdWJsaWMgYWRkQ29uZGl0aW9uT2JqZWN0cyhjb25kaXRpb25zOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSkge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmRpdGlvbnMpKSB7XG4gICAgICB0aGlzLmFkZENvbmRpdGlvbk9iamVjdChrZXksIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggdGhlIHBvbGljeSBpcyBpbiBlZmZlY3QuXG4gICAqIFNlZSBbdGhlIElBTSBkb2N1bWVudGF0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbi5odG1sKS5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29uZGl0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5tZXJnZUNvbmRpdGlvbnMoXG4gICAgICB0aGlzLndyYXBwZWQucG9saWN5RnJhZ21lbnQuY29uZGl0aW9ucyxcbiAgICAgIHRoaXMuYWRkaXRpb25hbENvbmRpdGlvbnMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcG9saWN5RnJhZ21lbnQoKTogUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQge1xuICAgIHJldHVybiBuZXcgUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQoXG4gICAgICB0aGlzLndyYXBwZWQucG9saWN5RnJhZ21lbnQucHJpbmNpcGFscyxcbiAgICAgIHRoaXMuY29uZGl0aW9ucyxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLndyYXBwZWQudG9TdHJpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBKU09OLWlmeSB0aGUgcHJpbmNpcGFsXG4gICAqXG4gICAqIFVzZWQgd2hlbiBKU09OLnN0cmluZ2lmeSgpIGlzIGNhbGxlZFxuICAgKi9cbiAgcHVibGljIHRvSlNPTigpIHtcbiAgICAvLyBIYXZlIHRvIGltcGxlbWVudCB0b0pTT04oKSBiZWNhdXNlIHRoZSBkZWZhdWx0IHdpbGwgbGVhZCB0byBpbmZpbml0ZSByZWN1cnNpb24uXG4gICAgcmV0dXJuIHRoaXMucG9saWN5RnJhZ21lbnQucHJpbmNpcGFsSnNvbjtcbiAgfVxuXG4gIHB1YmxpYyBkZWR1cGVTdHJpbmcoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5hcHBlbmREZWR1cGUoSlNPTi5zdHJpbmdpZnkodGhpcy5jb25kaXRpb25zKSk7XG4gIH1cblxuICBwcml2YXRlIG1lcmdlQ29uZGl0aW9ucyhcbiAgICBwcmluY2lwYWxDb25kaXRpb25zOiBDb25kaXRpb25zLFxuICAgIGFkZGl0aW9uYWxDb25kaXRpb25zOiBDb25kaXRpb25NYXAsXG4gICk6IENvbmRpdGlvbnMge1xuICAgIGNvbnN0IG1lcmdlZENvbmRpdGlvbnM6IENvbmRpdGlvbk1hcCA9IHt9O1xuICAgIHByaW5jaXBhbENvbmRpdGlvbnMuZm9yRWFjaCgoYykgPT4ge1xuICAgICAgaWYgKCFtZXJnZWRDb25kaXRpb25zW2MudGVzdF0pIHtcbiAgICAgICAgbWVyZ2VkQ29uZGl0aW9uc1tjLnRlc3RdID0ge307XG4gICAgICB9XG4gICAgICBtZXJnZWRDb25kaXRpb25zW2MudGVzdF1bYy52YXJpYWJsZV0gPSBjO1xuICAgIH0pO1xuXG4gICAgT2JqZWN0LmVudHJpZXMoYWRkaXRpb25hbENvbmRpdGlvbnMpLmZvckVhY2goKFt0ZXN0LCBjb25kaXRpb25dKSA9PiB7XG4gICAgICAvLyBtZXJnZSB0aGUgY29uZGl0aW9ucyBpZiBvbmUgb2YgdGhlIGFkZGl0aW9uYWwgY29uZGl0aW9ucyB1c2VzIGFuXG4gICAgICAvLyBvcGVyYXRvciB0aGF0J3MgYWxyZWFkeSB1c2VkIGJ5IHRoZSBwcmluY2lwYWwncyBjb25kaXRpb25zIG1lcmdlIHRoZVxuICAgICAgLy8gaW5uZXIgc3RydWN0dXJlLlxuICAgICAgY29uc3QgZXhpc3RpbmcgPSBtZXJnZWRDb25kaXRpb25zW3Rlc3RdO1xuICAgICAgaWYgKCFleGlzdGluZykge1xuICAgICAgICBtZXJnZWRDb25kaXRpb25zW3Rlc3RdID0gY29uZGl0aW9uO1xuICAgICAgICByZXR1cm47IC8vIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE86IFN1cHBvcnQgSVJlc29sdmFibGUgQ29uZGl0aW9uP1xuICAgICAgLy8gLy8gaWYgZWl0aGVyIHRoZSBleGlzdGluZyBjb25kaXRpb24gb3IgdGhlIG5ldyBvbmUgY29udGFpbiB1bnJlc29sdmVkXG4gICAgICAvLyAvLyB0b2tlbnMsIGZhaWwgdGhlIG1lcmdlLiB0aGlzIGlzIGFzIGZhciBhcyB3ZSBnbyBhdCB0aGlzIHBvaW50LlxuICAgICAgLy8gaWYgKFRva2VuLmlzVW5yZXNvbHZlZChjb25kaXRpb24pIHx8IFRva2VuLmlzVW5yZXNvbHZlZChleGlzdGluZykpIHtcbiAgICAgIC8vICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgLy8gICAgIGBtdWx0aXBsZSBcIiR7dGVzdH1cIiBjb25kaXRpb25zIGNhbm5vdCBiZSBtZXJnZWQgaWYgb25lIG9mIHRoZW0gY29udGFpbnMgYW4gdW5yZXNvbHZlZCB0b2tlbmAsXG4gICAgICAvLyAgICk7XG4gICAgICAvLyB9XG5cbiAgICAgIC8vIFRPRE86IFZhbGlkYXRlIGNvbmRpdGlvbj9cbiAgICAgIC8vIHZhbGlkYXRlQ29uZGl0aW9uT2JqZWN0KGV4aXN0aW5nKTtcbiAgICAgIC8vIHZhbGlkYXRlQ29uZGl0aW9uT2JqZWN0KGNvbmRpdGlvbik7XG5cbiAgICAgIG1lcmdlZENvbmRpdGlvbnNbdGVzdF0gPSB7IC4uLmV4aXN0aW5nLCAuLi5jb25kaXRpb24gfTtcbiAgICB9KTtcbiAgICByZXR1cm4gdG9Db25kaXRpb25zKG1lcmdlZENvbmRpdGlvbnMpO1xuICB9XG59XG5cbi8qKlxuICogRW5hYmxlcyBzZXNzaW9uIHRhZ3Mgb24gcm9sZSBhc3N1bXB0aW9ucyBmcm9tIGEgcHJpbmNpcGFsXG4gKlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gc2Vzc2lvbiB0YWdzLCBzZWU6XG4gKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvaWRfc2Vzc2lvbi10YWdzLmh0bWxcbiAqL1xuZXhwb3J0IGNsYXNzIFNlc3Npb25UYWdzUHJpbmNpcGFsIGV4dGVuZHMgUHJpbmNpcGFsQWRhcHRlciB7XG4gIGNvbnN0cnVjdG9yKHByaW5jaXBhbDogSVByaW5jaXBhbCkge1xuICAgIHN1cGVyKHByaW5jaXBhbCk7XG4gIH1cblxuICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9wdWxsLzI4NTEwL2ZpbGVzI2RpZmYtNTAyNDhmNjcxZTliMTNhOWNiMzVhNjI0NDFkNzI4MzJkY2E4OWI2YzdhZDRhODhhYTRmYjJlYzhlNjc2YjdjZFxuICBwdWJsaWMgYWRkVG9Bc3N1bWVSb2xlUG9saWN5KGRvYzogSVBvbGljeURvY3VtZW50KSB7XG4gICAgLy8gTGF6eSBpbXBvcnQgdG8gYXZvaWQgY2lyY3VsYXIgaW1wb3J0IGRlcGVuZGVuY2llcyBkdXJpbmcgc3RhcnR1cFxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICBjb25zdCBhZGFwdGVyOiB0eXBlb2YgaW1wb3J0KFwiLi9wcml2YXRlL2FkYXB0ZXJcIikgPSByZXF1aXJlKFwiLi9wcml2YXRlL2FkYXB0ZXJcIik7XG4gICAgZGVmYXVsdEFkZFByaW5jaXBhbFRvQXNzdW1lUm9sZShcbiAgICAgIHRoaXMud3JhcHBlZCxcbiAgICAgIG5ldyBhZGFwdGVyLk11dGF0aW5nUG9saWN5RG9jdW1lbnRBZGFwdGVyKGRvYywgKHN0YXRlbWVudCkgPT4ge1xuICAgICAgICBzdGF0ZW1lbnQuYWRkQWN0aW9ucyhcInN0czpUYWdTZXNzaW9uXCIpO1xuICAgICAgICByZXR1cm4gc3RhdGVtZW50O1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBkZWR1cGVTdHJpbmcoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5hcHBlbmREZWR1cGUoXCJcIik7XG4gIH1cbn1cblxuLyoqXG4gKiBBZGQgYSBwcmluY2lwYWwgdG8gYW4gQXNzdW1lUm9sZVBvbGljeURvY3VtZW50IGluIHRoZSByaWdodCB3YXlcbiAqXG4gKiBEZWxlZ2F0ZSB0byB0aGUgcHJpbmNpcGFsIGlmIGl0IGNhbiBkbyB0aGUgam9iIGl0c2VsZiwgZG8gYSBkZWZhdWx0IGpvYiBpZiBpdCBjYW4ndC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRBZGRQcmluY2lwYWxUb0Fzc3VtZVJvbGUoXG4gIHByaW5jaXBhbDogSVByaW5jaXBhbCxcbiAgZG9jOiBJUG9saWN5RG9jdW1lbnQsXG4pIHtcbiAgaWYgKGlzQXNzdW1lUm9sZVByaW5jaXBhbChwcmluY2lwYWwpKSB7XG4gICAgLy8gUHJpbmNpcGFsIGtub3dzIGhvdyB0byBhZGQgaXRzZWxmXG4gICAgcHJpbmNpcGFsLmFkZFRvQXNzdW1lUm9sZVBvbGljeShkb2MpO1xuICB9IGVsc2Uge1xuICAgIC8vIFByaW5jaXBhbCBjYW4ndCBhZGQgaXRzZWxmLCB3ZSBkbyBpdCBmb3IgdGhlbVxuICAgIGRvYy5hZGRTdGF0ZW1lbnRzKFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFtwcmluY2lwYWwuYXNzdW1lUm9sZUFjdGlvbl0sXG4gICAgICAgIHByaW5jaXBhbHM6IFtwcmluY2lwYWxdLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0Fzc3VtZVJvbGVQcmluY2lwYWwoXG4gIHByaW5jaXBhbDogSVByaW5jaXBhbCxcbik6IHByaW5jaXBhbCBpcyBJQXNzdW1lUm9sZVByaW5jaXBhbCB7XG4gIHJldHVybiAhIShwcmluY2lwYWwgYXMgSUFzc3VtZVJvbGVQcmluY2lwYWwpLmFkZFRvQXNzdW1lUm9sZVBvbGljeTtcbn1cblxuLyoqXG4gKiBBIGxhenkgdG9rZW4gdGhhdCByZXF1aXJlcyBhbiBpbnN0YW5jZSBvZiBTdGFjayB0byBldmFsdWF0ZVxuICovXG5jbGFzcyBBd3NTdGFja0RlcGVuZGVudFRva2VuIGltcGxlbWVudHMgSVJlc29sdmFibGUge1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRpb25TdGFjazogc3RyaW5nW107XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZm46IChzcGVjOiBBd3NTdGFjaykgPT4gYW55KSB7XG4gICAgLy8gVE9ETzogSW1wbGVtZW50IHN0YWNrIHRyYWNlc1xuICAgIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2hhc2hpY29ycC90ZXJyYWZvcm0tY2RrL2Jsb2IvdjAuMjAuOS9wYWNrYWdlcy9jZGt0Zi9saWIvdG9rZW5zL3ByaXZhdGUvc3RhY2stdHJhY2UudHMjTDlcbiAgICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE2MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2NvcmUvbGliL3N0YWNrLXRyYWNlLnRzI0wyMlxuICAgIHRoaXMuY3JlYXRpb25TdGFjayA9IFtcInN0YWNrIHRyYWNlcyBkaXNhYmxlZFwiXTtcbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlKGNvbnRleHQ6IElSZXNvbHZlQ29udGV4dCkge1xuICAgIHJldHVybiB0aGlzLmZuKEF3c1N0YWNrLm9mQXdzQ29uc3RydWN0KGNvbnRleHQuc2NvcGUpKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gVG9rZW4uYXNTdHJpbmcodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogSlNPTi1pZnkgdGhlIHRva2VuXG4gICAqXG4gICAqIFVzZWQgd2hlbiBKU09OLnN0cmluZ2lmeSgpIGlzIGNhbGxlZFxuICAgKi9cbiAgcHVibGljIHRvSlNPTigpIHtcbiAgICByZXR1cm4gXCI8dW5yZXNvbHZlZC10b2tlbj5cIjtcbiAgfVxufVxuXG5jbGFzcyBTZXJ2aWNlUHJpbmNpcGFsVG9rZW4gaW1wbGVtZW50cyBJUmVzb2x2YWJsZSB7XG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGlvblN0YWNrOiBzdHJpbmdbXTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBzZXJ2aWNlOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRzOiBTZXJ2aWNlUHJpbmNpcGFsT3B0cyxcbiAgKSB7XG4gICAgLy8gVE9ETzogSW1wbGVtZW50IHN0YWNrIHRyYWNlc1xuICAgIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2hhc2hpY29ycC90ZXJyYWZvcm0tY2RrL2Jsb2IvdjAuMjAuOS9wYWNrYWdlcy9jZGt0Zi9saWIvdG9rZW5zL3ByaXZhdGUvc3RhY2stdHJhY2UudHMjTDlcbiAgICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE2MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2NvcmUvbGliL3N0YWNrLXRyYWNlLnRzI0wyMlxuICAgIHRoaXMuY3JlYXRpb25TdGFjayA9IFtcInN0YWNrIHRyYWNlcyBkaXNhYmxlZFwiXTtcbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlKGN0eDogSVJlc29sdmVDb250ZXh0KSB7XG4gICAgY29uc3QgYXdzU3RhY2sgPSBBd3NTdGFjay5vZkF3c0NvbnN0cnVjdChjdHguc2NvcGUpO1xuICAgIC8vIFRPRE86IERvZXMgdGhpcyB3b3JrIGZvciBPcHQtSW4gcmVnaW9ucz8/XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTYwLjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLWlhbS9saWIvcHJpbmNpcGFscy50cyNMNTA2LUw1MTBcbiAgICByZXR1cm4gYXdzU3RhY2suc2VydmljZVByaW5jaXBhbE5hbWUodGhpcy5zZXJ2aWNlLCB0aGlzLm9wdHMucmVnaW9uKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gVG9rZW4uYXNTdHJpbmcodGhpcywge1xuICAgICAgZGlzcGxheUhpbnQ6IHRoaXMuc2VydmljZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBKU09OLWlmeSB0aGUgdG9rZW5cbiAgICpcbiAgICogVXNlZCB3aGVuIEpTT04uc3RyaW5naWZ5KCkgaXMgY2FsbGVkXG4gICAqL1xuICBwdWJsaWMgdG9KU09OKCkge1xuICAgIHJldHVybiBgPCR7dGhpcy5zZXJ2aWNlfT5gO1xuICB9XG59XG5cbi8qKlxuICogTWVyZ2UgdHdvIGFycmF5cyB0aGF0IHJlcHJlc2VudCBJQU0gcHJpbmNpcGFsc1xuICpcbiAqIERvZXMgYW4gaW4tcGxhY2UgbWVyZ2UgaW50byB0YXJnZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVByaW5jaXBhbChcbiAgdGFyZ2V0OiBQcmluY2lwYWxQcm9wc1tdLFxuICBzb3VyY2U6IFByaW5jaXBhbFByb3BzW10sXG4pIHtcbiAgLy8gaWYgb25lIHJlcHJlc2VudHMgdGhlIHN0YXJQcmluY2lwYWwgdGhlIG90aGVyIG9uZSBtdXN0IGJlIGVtcHR5XG4gIGlmIChcbiAgICAoaGFzU3RhclByaW5jaXBhbCh0YXJnZXQpICYmIHNvdXJjZS5sZW5ndGggPiAwKSB8fFxuICAgIChoYXNTdGFyUHJpbmNpcGFsKHNvdXJjZSkgJiYgdGFyZ2V0Lmxlbmd0aCA+IDApXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDYW5ub3QgbWVyZ2UgcHJpbmNpcGFscyAke0pTT04uc3RyaW5naWZ5KHRhcmdldCl9IGFuZCAke0pTT04uc3RyaW5naWZ5KHNvdXJjZSl9OyBpZiBvbmUgdXNlcyBhIHRoZSBTdGFyUHJpbmNpcGFsIHN0cmluZyB0aGUgb3RoZXIgb25lIG11c3QgYmUgZW1wdHlgLFxuICAgICk7XG4gIH1cblxuICBjb25zdCB0YXJnZXRNYXA6IE1hcDxQcmluY2lwYWxUeXBlLCBQcmluY2lwYWxQcm9wcz4gPSBuZXcgTWFwKCk7XG4gIGZvciAoY29uc3QgcHJpbmNpcGFsIG9mIHRhcmdldCkge1xuICAgIHRhcmdldE1hcC5zZXQocHJpbmNpcGFsLnR5cGUsIHByaW5jaXBhbCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHNvdXJjZVByaW5jaXBhbCBvZiBzb3VyY2UpIHtcbiAgICBjb25zdCB7IHR5cGUsIGlkZW50aWZpZXJzOiBzb3VyY2VJZGVudGlmaWVycyB9ID0gc291cmNlUHJpbmNpcGFsO1xuICAgIGlmICh0YXJnZXRNYXAuaGFzKHR5cGUpKSB7XG4gICAgICBjb25zdCB0YXJnZXRJbmRlbnRpZmllclNldCA9IG5ldyBTZXQodGFyZ2V0TWFwLmdldCh0eXBlKSEuaWRlbnRpZmllcnMpO1xuICAgICAgZm9yIChjb25zdCBpZCBvZiBzb3VyY2VJZGVudGlmaWVycykge1xuICAgICAgICB0YXJnZXRJbmRlbnRpZmllclNldC5hZGQoaWQpO1xuICAgICAgfVxuICAgICAgLy8gVXBkYXRlIHRoZSB0YXJnZXQgaWRlbnRpZmllcnMgaW4tcGxhY2VcbiAgICAgIGNvbnN0IGluZGV4ID0gdGFyZ2V0LmZpbmRJbmRleCgocHJpbmNpcGFsKSA9PiBwcmluY2lwYWwudHlwZSA9PT0gdHlwZSk7XG4gICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgIHRhcmdldFtpbmRleF0gPSB7XG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICBpZGVudGlmaWVyczogQXJyYXkuZnJvbSh0YXJnZXRJbmRlbnRpZmllclNldCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldC5wdXNoKHtcbiAgICAgICAgdHlwZSxcbiAgICAgICAgaWRlbnRpZmllcnM6IFsuLi5zb3VyY2VJZGVudGlmaWVyc10sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBEZXRlY3QgaWYgdGhlIFByaW5jaXBhbFByb3BzIGFycmF5IGNvbnRhaW5zIHRoZSBTdGFyUHJpbmNpcGFsOlxuICogdHlwZSA9IFByaW5jaXBhbFR5cGUuQU5ZIGFuZCBpZGVudGlmaWVycyA9IFtcIipcIl1cbiAqL1xuZnVuY3Rpb24gaGFzU3RhclByaW5jaXBhbChwcmluY2lwYWxzOiBQcmluY2lwYWxQcm9wc1tdKSB7XG4gIC8vIFRPRE86IERvZXMgaGF2aW5nIG1vcmUgdGhhbiAxIHByaW5jaXBhbCBtYWtlIHNlbnNlIGlmIG9uZSBvZiB0aGVtIGlzIHRoZSBTdGFyUHJpbmNpcGFsP1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcHJpbmNpcGFscy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBwcmluY2lwYWwgPSBwcmluY2lwYWxzW2luZGV4XTtcbiAgICBpZiAoXG4gICAgICBwcmluY2lwYWwudHlwZSA9PT0gUHJpbmNpcGFsVHlwZS5BTlkgJiZcbiAgICAgIHByaW5jaXBhbC5pZGVudGlmaWVycy5sZW5ndGggPT09IDEgJiZcbiAgICAgIHByaW5jaXBhbC5pZGVudGlmaWVyc1swXSA9PT0gXCIqXCJcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG4iXX0=
|