From 0c26d315231f7b7957835e0fee43a662d4790869 Mon Sep 17 00:00:00 2001 From: Wilson Rivera Date: Tue, 30 Jun 2026 13:31:06 -0400 Subject: [PATCH 01/15] feat: decouple feature flag composition when split config is enabled --- .../proto/wg/cosmo/platform/v1/platform.pb.go | 25 +- .../src/wg/cosmo/platform/v1/platform_pb.ts | 12 + .../migrations/0145_wild_lady_bullseye.sql | 4 + .../migrations/meta/0145_snapshot.json | 9684 +++++++++++++++++ controlplane/migrations/meta/_journal.json | 7 + controlplane/src/bin/cleanup-old-data.ts | 4 +- controlplane/src/core/composition/composer.ts | 3 + .../repositories/FederatedGraphRepository.ts | 5 +- .../GraphCompositionRepository.ts | 243 +- .../core/repositories/SubgraphRepository.ts | 1 + .../src/core/services/CompositionService.ts | 39 +- controlplane/src/db/schema.ts | 15 +- controlplane/src/types/index.ts | 2 + proto/wg/cosmo/platform/v1/platform.proto | 2 + .../compositions/[compositionId]/index.tsx | 5 +- .../graph/[slug]/compositions/index.tsx | 21 +- 16 files changed, 9992 insertions(+), 80 deletions(-) create mode 100644 controlplane/migrations/0145_wild_lady_bullseye.sql create mode 100644 controlplane/migrations/meta/0145_snapshot.json diff --git a/connect-go/gen/proto/wg/cosmo/platform/v1/platform.pb.go b/connect-go/gen/proto/wg/cosmo/platform/v1/platform.pb.go index 771dec50e1..8c788f6b20 100644 --- a/connect-go/gen/proto/wg/cosmo/platform/v1/platform.pb.go +++ b/connect-go/gen/proto/wg/cosmo/platform/v1/platform.pb.go @@ -18311,6 +18311,8 @@ type GraphComposition struct { TriggeredBySubgraphName *string `protobuf:"bytes,12,opt,name=triggeredBySubgraphName,proto3,oneof" json:"triggeredBySubgraphName,omitempty"` CompositionWarnings *string `protobuf:"bytes,13,opt,name=compositionWarnings,proto3,oneof" json:"compositionWarnings,omitempty"` RouterCompatibilityVersion string `protobuf:"bytes,14,opt,name=router_compatibility_version,json=routerCompatibilityVersion,proto3" json:"router_compatibility_version,omitempty"` + IsFeatureFlagComposition bool `protobuf:"varint,15,opt,name=isFeatureFlagComposition,proto3" json:"isFeatureFlagComposition,omitempty"` + FeatureFlagName *string `protobuf:"bytes,16,opt,name=featureFlagName,proto3,oneof" json:"featureFlagName,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -18443,6 +18445,20 @@ func (x *GraphComposition) GetRouterCompatibilityVersion() string { return "" } +func (x *GraphComposition) GetIsFeatureFlagComposition() bool { + if x != nil { + return x.IsFeatureFlagComposition + } + return false +} + +func (x *GraphComposition) GetFeatureFlagName() string { + if x != nil && x.FeatureFlagName != nil { + return *x.FeatureFlagName + } + return "" +} + type GraphCompositionSubgraph struct { state protoimpl.MessageState `protogen:"open.v1"` Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` @@ -35166,7 +35182,7 @@ const file_wg_cosmo_platform_v1_platform_proto_rawDesc = "" + "\x0eorganizationId\x18\x01 \x01(\tR\x0eorganizationId\x12\x16\n" + "\x06accept\x18\x02 \x01(\bR\x06accept\"_\n" + "!AcceptOrDeclineInvitationResponse\x12:\n" + - "\bresponse\x18\x01 \x01(\v2\x1e.wg.cosmo.platform.v1.ResponseR\bresponse\"\xd9\x06\n" + + "\bresponse\x18\x01 \x01(\v2\x1e.wg.cosmo.platform.v1.ResponseR\bresponse\"\xd8\a\n" + "\x10GraphComposition\x12\x0e\n" + "\x02id\x18\x01 \x01(\tR\x02id\x12(\n" + "\x0fschemaVersionId\x18\x02 \x01(\tR\x0fschemaVersionId\x12\x1c\n" + @@ -35182,7 +35198,9 @@ const file_wg_cosmo_platform_v1_platform_proto_rawDesc = "" + "\x1bhasMultipleChangedSubgraphs\x18\v \x01(\bH\x05R\x1bhasMultipleChangedSubgraphs\x88\x01\x01\x12=\n" + "\x17triggeredBySubgraphName\x18\f \x01(\tH\x06R\x17triggeredBySubgraphName\x88\x01\x01\x125\n" + "\x13compositionWarnings\x18\r \x01(\tH\aR\x13compositionWarnings\x88\x01\x01\x12@\n" + - "\x1crouter_compatibility_version\x18\x0e \x01(\tR\x1arouterCompatibilityVersionB\x14\n" + + "\x1crouter_compatibility_version\x18\x0e \x01(\tR\x1arouterCompatibilityVersion\x12:\n" + + "\x18isFeatureFlagComposition\x18\x0f \x01(\bR\x18isFeatureFlagComposition\x12-\n" + + "\x0ffeatureFlagName\x18\x10 \x01(\tH\bR\x0ffeatureFlagName\x88\x01\x01B\x14\n" + "\x12_compositionErrorsB\f\n" + "\n" + "_createdByB\x18\n" + @@ -35191,7 +35209,8 @@ const file_wg_cosmo_platform_v1_platform_proto_rawDesc = "" + "\x10_deploymentErrorB\x1e\n" + "\x1c_hasMultipleChangedSubgraphsB\x1a\n" + "\x18_triggeredBySubgraphNameB\x16\n" + - "\x14_compositionWarnings\"\x9b\x02\n" + + "\x14_compositionWarningsB\x12\n" + + "\x10_featureFlagName\"\x9b\x02\n" + "\x18GraphCompositionSubgraph\x12\x0e\n" + "\x02id\x18\x01 \x01(\tR\x02id\x12(\n" + "\x0fschemaVersionId\x18\x02 \x01(\tR\x0fschemaVersionId\x12\x12\n" + diff --git a/connect/src/wg/cosmo/platform/v1/platform_pb.ts b/connect/src/wg/cosmo/platform/v1/platform_pb.ts index 73ebb2a473..d3b7e96d38 100644 --- a/connect/src/wg/cosmo/platform/v1/platform_pb.ts +++ b/connect/src/wg/cosmo/platform/v1/platform_pb.ts @@ -15883,6 +15883,16 @@ export class GraphComposition extends Message { */ routerCompatibilityVersion = ""; + /** + * @generated from field: bool isFeatureFlagComposition = 15; + */ + isFeatureFlagComposition = false; + + /** + * @generated from field: optional string featureFlagName = 16; + */ + featureFlagName?: string; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -15905,6 +15915,8 @@ export class GraphComposition extends Message { { no: 12, name: "triggeredBySubgraphName", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, { no: 13, name: "compositionWarnings", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, { no: 14, name: "router_compatibility_version", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 15, name: "isFeatureFlagComposition", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, + { no: 16, name: "featureFlagName", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): GraphComposition { diff --git a/controlplane/migrations/0145_wild_lady_bullseye.sql b/controlplane/migrations/0145_wild_lady_bullseye.sql new file mode 100644 index 0000000000..67cdd382d5 --- /dev/null +++ b/controlplane/migrations/0145_wild_lady_bullseye.sql @@ -0,0 +1,4 @@ +ALTER TABLE "federated_graphs_to_feature_flag_schema_versions" DROP CONSTRAINT "federated_graphs_to_feature_flag_schema_versions_federated_graph_id_base_composition_schema_version_id_composed_schema_version_id_pk";--> statement-breakpoint +ALTER TABLE "federated_graphs_to_feature_flag_schema_versions" ALTER COLUMN "base_composition_schema_version_id" DROP NOT NULL;--> statement-breakpoint +ALTER TABLE "federated_graphs_to_feature_flag_schema_versions" ADD CONSTRAINT "federated_graphs_to_feature_flag_schema_versions_federated_graph_id_composed_schema_version_id_pk" PRIMARY KEY("federated_graph_id","composed_schema_version_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "fgffsv_composite_idx" ON "federated_graphs_to_feature_flag_schema_versions" USING btree ("federated_graph_id","base_composition_schema_version_id","composed_schema_version_id"); \ No newline at end of file diff --git a/controlplane/migrations/meta/0145_snapshot.json b/controlplane/migrations/meta/0145_snapshot.json new file mode 100644 index 0000000000..4da9ed7e26 --- /dev/null +++ b/controlplane/migrations/meta/0145_snapshot.json @@ -0,0 +1,9684 @@ +{ + "id": "16f1bac1-27db-4fc3-8ee2-7e64c9fcacb7", + "prevId": "1e0902c5-abeb-4414-bf17-803341238eab", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.api_key_permissions": { + "name": "api_key_permissions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "api_key_id": { + "name": "api_key_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "permission": { + "name": "permission", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "akp_api_key_id_idx": { + "name": "akp_api_key_id_idx", + "columns": [ + { + "expression": "api_key_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "api_key_permissions_api_key_id_api_keys_id_fk": { + "name": "api_key_permissions_api_key_id_api_keys_id_fk", + "tableFrom": "api_key_permissions", + "tableTo": "api_keys", + "columnsFrom": [ + "api_key_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.api_key_resources": { + "name": "api_key_resources", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "api_key_id": { + "name": "api_key_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "target_id": { + "name": "target_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "akr_api_key_id_idx": { + "name": "akr_api_key_id_idx", + "columns": [ + { + "expression": "api_key_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "akr_target_id_idx": { + "name": "akr_target_id_idx", + "columns": [ + { + "expression": "target_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "api_key_resources_api_key_id_api_keys_id_fk": { + "name": "api_key_resources_api_key_id_api_keys_id_fk", + "tableFrom": "api_key_resources", + "tableTo": "api_keys", + "columnsFrom": [ + "api_key_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "api_key_resources_target_id_targets_id_fk": { + "name": "api_key_resources_target_id_targets_id_fk", + "tableFrom": "api_key_resources", + "tableTo": "targets", + "columnsFrom": [ + "target_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.api_keys": { + "name": "api_keys", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "group_id": { + "name": "group_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "external": { + "name": "external", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "last_used_at": { + "name": "last_used_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "apikey_name_idx": { + "name": "apikey_name_idx", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ak_user_id_idx": { + "name": "ak_user_id_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ak_organization_id_idx": { + "name": "ak_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "api_keys_user_id_users_id_fk": { + "name": "api_keys_user_id_users_id_fk", + "tableFrom": "api_keys", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "api_keys_organization_id_organizations_id_fk": { + "name": "api_keys_organization_id_organizations_id_fk", + "tableFrom": "api_keys", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "api_keys_group_id_organization_groups_id_fk": { + "name": "api_keys_group_id_organization_groups_id_fk", + "tableFrom": "api_keys", + "tableTo": "organization_groups", + "columnsFrom": [ + "group_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "api_keys_key_unique": { + "name": "api_keys_key_unique", + "nullsNotDistinct": false, + "columns": [ + "key" + ] + } + }, + "checkConstraints": {} + }, + "public.audit_logs": { + "name": "audit_logs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "organization_slug": { + "name": "organization_slug", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "action": { + "name": "action", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "audit_action": { + "name": "audit_action", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "auditable_type": { + "name": "auditable_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "auditable_display_name": { + "name": "auditable_display_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "target_id": { + "name": "target_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "target_type": { + "name": "target_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "target_display_name": { + "name": "target_display_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "target_namespace_id": { + "name": "target_namespace_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "target_namespace": { + "name": "target_namespace", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "actor_id": { + "name": "actor_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "actor_display_name": { + "name": "actor_display_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "actor_type": { + "name": "actor_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "api_key_name": { + "name": "api_key_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "auditlogs_organization_idx": { + "name": "auditlogs_organization_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "auditlogs_created_at_idx": { + "name": "auditlogs_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.batch_publish_job_details": { + "name": "batch_publish_job_details", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "status": { + "name": "status", + "type": "batch_publish_job_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "failure_reason": { + "name": "failure_reason", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composition_result": { + "name": "composition_result", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "batch_publish_job_details_organization_id_organizations_id_fk": { + "name": "batch_publish_job_details_organization_id_organizations_id_fk", + "tableFrom": "batch_publish_job_details", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.billing_plans": { + "name": "billing_plans", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "active": { + "name": "active", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "price": { + "name": "price", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "features": { + "name": "features", + "type": "json", + "primaryKey": false, + "notNull": true + }, + "stripe_price_id": { + "name": "stripe_price_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "weight": { + "name": "weight", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.billing_subscriptions": { + "name": "billing_subscriptions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "metadata": { + "name": "metadata", + "type": "json", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "price_id": { + "name": "price_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "quantity": { + "name": "quantity", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "cancel_at_period_end": { + "name": "cancel_at_period_end", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "cancel_at": { + "name": "cancel_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "canceled_at": { + "name": "canceled_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "current_period_start": { + "name": "current_period_start", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "current_period_end": { + "name": "current_period_end", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "ended_at": { + "name": "ended_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "trial_start": { + "name": "trial_start", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "trial_end": { + "name": "trial_end", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "billsubs_organization_id_idx": { + "name": "billsubs_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "billing_subscriptions_organization_id_organizations_id_fk": { + "name": "billing_subscriptions_organization_id_organizations_id_fk", + "tableFrom": "billing_subscriptions", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.cache_warmer_operations": { + "name": "cache_warmer_operations", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "operation_content": { + "name": "operation_content", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "operation_hash": { + "name": "operation_hash", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "operation_persisted_id": { + "name": "operation_persisted_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "operation_name": { + "name": "operation_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "client_name": { + "name": "client_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "client_version": { + "name": "client_version", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "planning_time": { + "name": "planning_time", + "type": "real", + "primaryKey": false, + "notNull": false + }, + "is_manually_added": { + "name": "is_manually_added", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_by_id": { + "name": "created_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "cwo_organization_id_idx": { + "name": "cwo_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "cwo_federated_graph_id_idx": { + "name": "cwo_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "cwo_created_by_id_idx": { + "name": "cwo_created_by_id_idx", + "columns": [ + { + "expression": "created_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "cache_warmer_operations_organization_id_organizations_id_fk": { + "name": "cache_warmer_operations_organization_id_organizations_id_fk", + "tableFrom": "cache_warmer_operations", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "cache_warmer_operations_federated_graph_id_federated_graphs_id_fk": { + "name": "cache_warmer_operations_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "cache_warmer_operations", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "cache_warmer_operations_created_by_id_users_id_fk": { + "name": "cache_warmer_operations_created_by_id_users_id_fk", + "tableFrom": "cache_warmer_operations", + "tableTo": "users", + "columnsFrom": [ + "created_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.contracts": { + "name": "contracts", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "source_federated_graph_id": { + "name": "source_federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "downstream_federated_graph_id": { + "name": "downstream_federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "exclude_tags": { + "name": "exclude_tags", + "type": "text[]", + "primaryKey": false, + "notNull": true + }, + "include_tags": { + "name": "include_tags", + "type": "text[]", + "primaryKey": false, + "notNull": true, + "default": "'{}'::text[]" + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created_by_id": { + "name": "created_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "updated_by_id": { + "name": "updated_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "contracts_created_by_id_idx": { + "name": "contracts_created_by_id_idx", + "columns": [ + { + "expression": "created_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "contracts_updated_by_id_idx": { + "name": "contracts_updated_by_id_idx", + "columns": [ + { + "expression": "updated_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "contracts_downstream_federated_graph_id_idx": { + "name": "contracts_downstream_federated_graph_id_idx", + "columns": [ + { + "expression": "downstream_federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "contracts_source_federated_graph_id_federated_graphs_id_fk": { + "name": "contracts_source_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "contracts", + "tableTo": "federated_graphs", + "columnsFrom": [ + "source_federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "contracts_downstream_federated_graph_id_federated_graphs_id_fk": { + "name": "contracts_downstream_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "contracts", + "tableTo": "federated_graphs", + "columnsFrom": [ + "downstream_federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "contracts_created_by_id_users_id_fk": { + "name": "contracts_created_by_id_users_id_fk", + "tableFrom": "contracts", + "tableTo": "users", + "columnsFrom": [ + "created_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "contracts_updated_by_id_users_id_fk": { + "name": "contracts_updated_by_id_users_id_fk", + "tableFrom": "contracts", + "tableTo": "users", + "columnsFrom": [ + "updated_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "federated_graph_source_downstream_id": { + "name": "federated_graph_source_downstream_id", + "nullsNotDistinct": false, + "columns": [ + "source_federated_graph_id", + "downstream_federated_graph_id" + ] + } + }, + "checkConstraints": {} + }, + "public.feature_flags_to_feature_subgraphs": { + "name": "feature_flags_to_feature_subgraphs", + "schema": "", + "columns": { + "feature_flag_id": { + "name": "feature_flag_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "feature_subgraph_id": { + "name": "feature_subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "fffs_feature_flag_id_idx": { + "name": "fffs_feature_flag_id_idx", + "columns": [ + { + "expression": "feature_flag_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fffs_feature_subgraph_id_idx": { + "name": "fffs_feature_subgraph_id_idx", + "columns": [ + { + "expression": "feature_subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "feature_flags_to_feature_subgraphs_feature_flag_id_feature_flags_id_fk": { + "name": "feature_flags_to_feature_subgraphs_feature_flag_id_feature_flags_id_fk", + "tableFrom": "feature_flags_to_feature_subgraphs", + "tableTo": "feature_flags", + "columnsFrom": [ + "feature_flag_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "feature_flags_to_feature_subgraphs_feature_subgraph_id_subgraphs_id_fk": { + "name": "feature_flags_to_feature_subgraphs_feature_subgraph_id_subgraphs_id_fk", + "tableFrom": "feature_flags_to_feature_subgraphs", + "tableTo": "subgraphs", + "columnsFrom": [ + "feature_subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "feature_flags_to_feature_subgraphs_feature_flag_id_feature_subgraph_id_pk": { + "name": "feature_flags_to_feature_subgraphs_feature_flag_id_feature_subgraph_id_pk", + "columns": [ + "feature_flag_id", + "feature_subgraph_id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.feature_flags": { + "name": "feature_flags", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "namespace_id": { + "name": "namespace_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "labels": { + "name": "labels", + "type": "text[]", + "primaryKey": false, + "notNull": false + }, + "is_enabled": { + "name": "is_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created_by": { + "name": "created_by", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "ff_organization_id_idx": { + "name": "ff_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ff_namespace_id_idx": { + "name": "ff_namespace_id_idx", + "columns": [ + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ff_created_by_idx": { + "name": "ff_created_by_idx", + "columns": [ + { + "expression": "created_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "feature_flags_organization_id_organizations_id_fk": { + "name": "feature_flags_organization_id_organizations_id_fk", + "tableFrom": "feature_flags", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "feature_flags_namespace_id_namespaces_id_fk": { + "name": "feature_flags_namespace_id_namespaces_id_fk", + "tableFrom": "feature_flags", + "tableTo": "namespaces", + "columnsFrom": [ + "namespace_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "feature_flags_created_by_users_id_fk": { + "name": "feature_flags_created_by_users_id_fk", + "tableFrom": "feature_flags", + "tableTo": "users", + "columnsFrom": [ + "created_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.feature_subgraphs_to_base_subgraphs": { + "name": "feature_subgraphs_to_base_subgraphs", + "schema": "", + "columns": { + "feature_subgraph_id": { + "name": "feature_subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "base_subgraph_id": { + "name": "base_subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "fsbs_feature_subgraph_id_idx": { + "name": "fsbs_feature_subgraph_id_idx", + "columns": [ + { + "expression": "feature_subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fsbs_base_subgraph_id_idx": { + "name": "fsbs_base_subgraph_id_idx", + "columns": [ + { + "expression": "base_subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "feature_subgraphs_to_base_subgraphs_feature_subgraph_id_subgraphs_id_fk": { + "name": "feature_subgraphs_to_base_subgraphs_feature_subgraph_id_subgraphs_id_fk", + "tableFrom": "feature_subgraphs_to_base_subgraphs", + "tableTo": "subgraphs", + "columnsFrom": [ + "feature_subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "feature_subgraphs_to_base_subgraphs_base_subgraph_id_subgraphs_id_fk": { + "name": "feature_subgraphs_to_base_subgraphs_base_subgraph_id_subgraphs_id_fk", + "tableFrom": "feature_subgraphs_to_base_subgraphs", + "tableTo": "subgraphs", + "columnsFrom": [ + "base_subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "feature_subgraphs_to_base_subgraphs_feature_subgraph_id_base_subgraph_id_pk": { + "name": "feature_subgraphs_to_base_subgraphs_feature_subgraph_id_base_subgraph_id_pk", + "columns": [ + "feature_subgraph_id", + "base_subgraph_id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.federated_graph_clients": { + "name": "federated_graph_clients", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created_by_id": { + "name": "created_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "updated_by_id": { + "name": "updated_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "fgc_created_by_id_idx": { + "name": "fgc_created_by_id_idx", + "columns": [ + { + "expression": "created_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fgc_updated_by_id_idx": { + "name": "fgc_updated_by_id_idx", + "columns": [ + { + "expression": "updated_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "federated_graph_clients_federated_graph_id_federated_graphs_id_fk": { + "name": "federated_graph_clients_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "federated_graph_clients", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "federated_graph_clients_created_by_id_users_id_fk": { + "name": "federated_graph_clients_created_by_id_users_id_fk", + "tableFrom": "federated_graph_clients", + "tableTo": "users", + "columnsFrom": [ + "created_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "federated_graph_clients_updated_by_id_users_id_fk": { + "name": "federated_graph_clients_updated_by_id_users_id_fk", + "tableFrom": "federated_graph_clients", + "tableTo": "users", + "columnsFrom": [ + "updated_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "federated_graph_client_name": { + "name": "federated_graph_client_name", + "nullsNotDistinct": false, + "columns": [ + "federated_graph_id", + "name" + ] + } + }, + "checkConstraints": {} + }, + "public.federated_graph_persisted_operations": { + "name": "federated_graph_persisted_operations", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "client_id": { + "name": "client_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "operation_id": { + "name": "operation_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "hash": { + "name": "hash", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "file_path": { + "name": "file_path", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "operation_names": { + "name": "operation_names", + "type": "text[]", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "operation_content": { + "name": "operation_content", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_by_id": { + "name": "created_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "updated_by_id": { + "name": "updated_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "fgpo_created_by_id_idx": { + "name": "fgpo_created_by_id_idx", + "columns": [ + { + "expression": "created_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fgpo_updated_by_id_idx": { + "name": "fgpo_updated_by_id_idx", + "columns": [ + { + "expression": "updated_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fgpo_client_id_idx": { + "name": "fgpo_client_id_idx", + "columns": [ + { + "expression": "client_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "federated_graph_persisted_operations_federated_graph_id_federated_graphs_id_fk": { + "name": "federated_graph_persisted_operations_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "federated_graph_persisted_operations", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "federated_graph_persisted_operations_client_id_federated_graph_clients_id_fk": { + "name": "federated_graph_persisted_operations_client_id_federated_graph_clients_id_fk", + "tableFrom": "federated_graph_persisted_operations", + "tableTo": "federated_graph_clients", + "columnsFrom": [ + "client_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "federated_graph_persisted_operations_created_by_id_users_id_fk": { + "name": "federated_graph_persisted_operations_created_by_id_users_id_fk", + "tableFrom": "federated_graph_persisted_operations", + "tableTo": "users", + "columnsFrom": [ + "created_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "federated_graph_persisted_operations_updated_by_id_users_id_fk": { + "name": "federated_graph_persisted_operations_updated_by_id_users_id_fk", + "tableFrom": "federated_graph_persisted_operations", + "tableTo": "users", + "columnsFrom": [ + "updated_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "federated_graph_persisted_operations_file_path_unique": { + "name": "federated_graph_persisted_operations_file_path_unique", + "nullsNotDistinct": false, + "columns": [ + "file_path" + ] + }, + "federated_graph_operation_id": { + "name": "federated_graph_operation_id", + "nullsNotDistinct": false, + "columns": [ + "federated_graph_id", + "client_id", + "operation_id" + ] + } + }, + "checkConstraints": {} + }, + "public.federated_graphs": { + "name": "federated_graphs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "routing_url": { + "name": "routing_url", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "target_id": { + "name": "target_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "composed_schema_version_id": { + "name": "composed_schema_version_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "admission_webhook_url": { + "name": "admission_webhook_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "admission_webhook_secret": { + "name": "admission_webhook_secret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "supports_federation": { + "name": "supports_federation", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "router_compatibility_version": { + "name": "router_compatibility_version", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'1'" + } + }, + "indexes": { + "fgs_target_id_idx": { + "name": "fgs_target_id_idx", + "columns": [ + { + "expression": "target_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fgs_composed_schema_version_id_idx": { + "name": "fgs_composed_schema_version_id_idx", + "columns": [ + { + "expression": "composed_schema_version_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "federated_graphs_target_id_targets_id_fk": { + "name": "federated_graphs_target_id_targets_id_fk", + "tableFrom": "federated_graphs", + "tableTo": "targets", + "columnsFrom": [ + "target_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "federated_graphs_composed_schema_version_id_schema_versions_id_fk": { + "name": "federated_graphs_composed_schema_version_id_schema_versions_id_fk", + "tableFrom": "federated_graphs", + "tableTo": "schema_versions", + "columnsFrom": [ + "composed_schema_version_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.federated_graphs_to_feature_flag_schema_versions": { + "name": "federated_graphs_to_feature_flag_schema_versions", + "schema": "", + "columns": { + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "base_composition_schema_version_id": { + "name": "base_composition_schema_version_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "composed_schema_version_id": { + "name": "composed_schema_version_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "feature_flag_id": { + "name": "feature_flag_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "fgffsv_composite_idx": { + "name": "fgffsv_composite_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "base_composition_schema_version_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "composed_schema_version_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fgffsv_federated_graph_id_idx": { + "name": "fgffsv_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fgffsv_base_composition_schema_version_id_idx": { + "name": "fgffsv_base_composition_schema_version_id_idx", + "columns": [ + { + "expression": "base_composition_schema_version_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fgffsv_composed_schema_version_id_idx": { + "name": "fgffsv_composed_schema_version_id_idx", + "columns": [ + { + "expression": "composed_schema_version_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fgffsv_feature_flag_id_idx": { + "name": "fgffsv_feature_flag_id_idx", + "columns": [ + { + "expression": "feature_flag_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "federated_graphs_to_feature_flag_schema_versions_federated_graph_id_federated_graphs_id_fk": { + "name": "federated_graphs_to_feature_flag_schema_versions_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "federated_graphs_to_feature_flag_schema_versions", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "federated_graphs_to_feature_flag_schema_versions_base_composition_schema_version_id_schema_versions_id_fk": { + "name": "federated_graphs_to_feature_flag_schema_versions_base_composition_schema_version_id_schema_versions_id_fk", + "tableFrom": "federated_graphs_to_feature_flag_schema_versions", + "tableTo": "schema_versions", + "columnsFrom": [ + "base_composition_schema_version_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "federated_graphs_to_feature_flag_schema_versions_composed_schema_version_id_schema_versions_id_fk": { + "name": "federated_graphs_to_feature_flag_schema_versions_composed_schema_version_id_schema_versions_id_fk", + "tableFrom": "federated_graphs_to_feature_flag_schema_versions", + "tableTo": "schema_versions", + "columnsFrom": [ + "composed_schema_version_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "federated_graphs_to_feature_flag_schema_versions_feature_flag_id_feature_flags_id_fk": { + "name": "federated_graphs_to_feature_flag_schema_versions_feature_flag_id_feature_flags_id_fk", + "tableFrom": "federated_graphs_to_feature_flag_schema_versions", + "tableTo": "feature_flags", + "columnsFrom": [ + "feature_flag_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "federated_graphs_to_feature_flag_schema_versions_federated_graph_id_composed_schema_version_id_pk": { + "name": "federated_graphs_to_feature_flag_schema_versions_federated_graph_id_composed_schema_version_id_pk", + "columns": [ + "federated_graph_id", + "composed_schema_version_id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.field_grace_period": { + "name": "field_grace_period", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "subgraph_id": { + "name": "subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "namespace_id": { + "name": "namespace_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "path": { + "name": "path", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "is_deprecated": { + "name": "is_deprecated", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "unique_field_grace_period_idx": { + "name": "unique_field_grace_period_idx", + "columns": [ + { + "expression": "subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "path", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "is_deprecated", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fgp_subgraph_id_idx": { + "name": "fgp_subgraph_id_idx", + "columns": [ + { + "expression": "subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fgp_organization_id_idx": { + "name": "fgp_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fgp_namespace_id_idx": { + "name": "fgp_namespace_id_idx", + "columns": [ + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "field_grace_period_subgraph_id_subgraphs_id_fk": { + "name": "field_grace_period_subgraph_id_subgraphs_id_fk", + "tableFrom": "field_grace_period", + "tableTo": "subgraphs", + "columnsFrom": [ + "subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "field_grace_period_organization_id_organizations_id_fk": { + "name": "field_grace_period_organization_id_organizations_id_fk", + "tableFrom": "field_grace_period", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "field_grace_period_namespace_id_namespaces_id_fk": { + "name": "field_grace_period_namespace_id_namespaces_id_fk", + "tableFrom": "field_grace_period", + "tableTo": "namespaces", + "columnsFrom": [ + "namespace_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.git_installations": { + "name": "git_installations", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "slug": { + "name": "slug", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "git_installation_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "provider_account_id": { + "name": "provider_account_id", + "type": "bigint", + "primaryKey": false, + "notNull": true + }, + "provider_installation_id": { + "name": "provider_installation_id", + "type": "bigint", + "primaryKey": false, + "notNull": true + }, + "provider_name": { + "name": "provider_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "oauth_token": { + "name": "oauth_token", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.graph_api_tokens": { + "name": "graph_api_tokens", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_by": { + "name": "created_by", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "graphApiToken_name_idx": { + "name": "graphApiToken_name_idx", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "gat_organization_id_idx": { + "name": "gat_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "gat_federated_graph_id_idx": { + "name": "gat_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "gat_created_by_idx": { + "name": "gat_created_by_idx", + "columns": [ + { + "expression": "created_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "graph_api_tokens_organization_id_organizations_id_fk": { + "name": "graph_api_tokens_organization_id_organizations_id_fk", + "tableFrom": "graph_api_tokens", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "graph_api_tokens_federated_graph_id_federated_graphs_id_fk": { + "name": "graph_api_tokens_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "graph_api_tokens", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "graph_api_tokens_created_by_users_id_fk": { + "name": "graph_api_tokens_created_by_users_id_fk", + "tableFrom": "graph_api_tokens", + "tableTo": "users", + "columnsFrom": [ + "created_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "graph_api_tokens_token_unique": { + "name": "graph_api_tokens_token_unique", + "nullsNotDistinct": false, + "columns": [ + "token" + ] + } + }, + "checkConstraints": {} + }, + "public.graph_composition_subgraphs": { + "name": "graph_composition_subgraphs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "graph_composition_id": { + "name": "graph_composition_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "subgraph_id": { + "name": "subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "subgraph_target_id": { + "name": "subgraph_target_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "subgraph_name": { + "name": "subgraph_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "schema_version_id": { + "name": "schema_version_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "change_type": { + "name": "change_type", + "type": "graph_composition_subgraph_change_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'unchanged'" + }, + "is_feature_subgraph": { + "name": "is_feature_subgraph", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "graphcompsub_graph_composition_id_idx": { + "name": "graphcompsub_graph_composition_id_idx", + "columns": [ + { + "expression": "graph_composition_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "graphcompsub_schema_version_id_idx": { + "name": "graphcompsub_schema_version_id_idx", + "columns": [ + { + "expression": "schema_version_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "graph_composition_subgraphs_graph_composition_id_graph_compositions_id_fk": { + "name": "graph_composition_subgraphs_graph_composition_id_graph_compositions_id_fk", + "tableFrom": "graph_composition_subgraphs", + "tableTo": "graph_compositions", + "columnsFrom": [ + "graph_composition_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "graph_composition_subgraphs_schema_version_id_schema_versions_id_fk": { + "name": "graph_composition_subgraphs_schema_version_id_schema_versions_id_fk", + "tableFrom": "graph_composition_subgraphs", + "tableTo": "schema_versions", + "columnsFrom": [ + "schema_version_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.graph_compositions": { + "name": "graph_compositions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_version_id": { + "name": "schema_version_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "is_composable": { + "name": "is_composable", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "composition_errors": { + "name": "composition_errors", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composition_warnings": { + "name": "composition_warnings", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "router_config_signature": { + "name": "router_config_signature", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "deployment_error": { + "name": "deployment_error", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "admission_error": { + "name": "admission_error", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_by_id": { + "name": "created_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "created_by_email": { + "name": "created_by_email", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_feature_flag_composition": { + "name": "is_feature_flag_composition", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "router_compatibility_version": { + "name": "router_compatibility_version", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'1'" + } + }, + "indexes": { + "graphcomp_schema_version_id_idx": { + "name": "graphcomp_schema_version_id_idx", + "columns": [ + { + "expression": "schema_version_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "graphcomp_created_by_id_idx": { + "name": "graphcomp_created_by_id_idx", + "columns": [ + { + "expression": "created_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "graph_compositions_schema_version_id_schema_versions_id_fk": { + "name": "graph_compositions_schema_version_id_schema_versions_id_fk", + "tableFrom": "graph_compositions", + "tableTo": "schema_versions", + "columnsFrom": [ + "schema_version_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "graph_compositions_created_by_id_users_id_fk": { + "name": "graph_compositions_created_by_id_users_id_fk", + "tableFrom": "graph_compositions", + "tableTo": "users", + "columnsFrom": [ + "created_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.graph_request_keys": { + "name": "graph_request_keys", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "privateKey": { + "name": "privateKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "publicKey": { + "name": "publicKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "grk_organization_id_idx": { + "name": "grk_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "grk_federated_graph_id_idx": { + "name": "grk_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "graph_request_keys_organization_id_organizations_id_fk": { + "name": "graph_request_keys_organization_id_organizations_id_fk", + "tableFrom": "graph_request_keys", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "graph_request_keys_federated_graph_id_federated_graphs_id_fk": { + "name": "graph_request_keys_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "graph_request_keys", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "graph_request_keys_federated_graph_id_unique": { + "name": "graph_request_keys_federated_graph_id_unique", + "nullsNotDistinct": false, + "columns": [ + "federated_graph_id" + ] + }, + "graph_request_keys_privateKey_unique": { + "name": "graph_request_keys_privateKey_unique", + "nullsNotDistinct": false, + "columns": [ + "privateKey" + ] + }, + "graph_request_keys_publicKey_unique": { + "name": "graph_request_keys_publicKey_unique", + "nullsNotDistinct": false, + "columns": [ + "publicKey" + ] + } + }, + "checkConstraints": {} + }, + "public.linked_schema_checks": { + "name": "linked_schema_checks", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_check_id": { + "name": "schema_check_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "linked_schema_check_id": { + "name": "linked_schema_check_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "lsc_schema_check_id_linked_schema_check_id_unique": { + "name": "lsc_schema_check_id_linked_schema_check_id_unique", + "columns": [ + { + "expression": "schema_check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "linked_schema_check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "lsc_schema_check_id_idx": { + "name": "lsc_schema_check_id_idx", + "columns": [ + { + "expression": "schema_check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "lsc_linked_schema_check_id_idx": { + "name": "lsc_linked_schema_check_id_idx", + "columns": [ + { + "expression": "linked_schema_check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "linked_schema_checks_schema_check_id_schema_checks_id_fk": { + "name": "linked_schema_checks_schema_check_id_schema_checks_id_fk", + "tableFrom": "linked_schema_checks", + "tableTo": "schema_checks", + "columnsFrom": [ + "schema_check_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "linked_schema_checks_linked_schema_check_id_schema_checks_id_fk": { + "name": "linked_schema_checks_linked_schema_check_id_schema_checks_id_fk", + "tableFrom": "linked_schema_checks", + "tableTo": "schema_checks", + "columnsFrom": [ + "linked_schema_check_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.linked_subgraphs": { + "name": "linked_subgraphs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "source_subgraph_id": { + "name": "source_subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "target_subgraph_id": { + "name": "target_subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_by_id": { + "name": "created_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "ls_source_subgraph_id_idx": { + "name": "ls_source_subgraph_id_idx", + "columns": [ + { + "expression": "source_subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ls_target_subgraph_id_idx": { + "name": "ls_target_subgraph_id_idx", + "columns": [ + { + "expression": "target_subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ls_created_by_id_idx": { + "name": "ls_created_by_id_idx", + "columns": [ + { + "expression": "created_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "linked_subgraphs_source_subgraph_id_subgraphs_id_fk": { + "name": "linked_subgraphs_source_subgraph_id_subgraphs_id_fk", + "tableFrom": "linked_subgraphs", + "tableTo": "subgraphs", + "columnsFrom": [ + "source_subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "linked_subgraphs_target_subgraph_id_subgraphs_id_fk": { + "name": "linked_subgraphs_target_subgraph_id_subgraphs_id_fk", + "tableFrom": "linked_subgraphs", + "tableTo": "subgraphs", + "columnsFrom": [ + "target_subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "linked_subgraphs_created_by_id_users_id_fk": { + "name": "linked_subgraphs_created_by_id_users_id_fk", + "tableFrom": "linked_subgraphs", + "tableTo": "users", + "columnsFrom": [ + "created_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "linked_subgraphs_source_subgraph_id_unique": { + "name": "linked_subgraphs_source_subgraph_id_unique", + "nullsNotDistinct": false, + "columns": [ + "source_subgraph_id" + ] + } + }, + "checkConstraints": {} + }, + "public.namespace_cache_warmer_config": { + "name": "namespace_cache_warmer_config", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "namespace_id": { + "name": "namespace_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "max_operations_count": { + "name": "max_operations_count", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "nscwc_namespace_id_idx": { + "name": "nscwc_namespace_id_idx", + "columns": [ + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "namespace_cache_warmer_config_namespace_id_namespaces_id_fk": { + "name": "namespace_cache_warmer_config_namespace_id_namespaces_id_fk", + "tableFrom": "namespace_cache_warmer_config", + "tableTo": "namespaces", + "columnsFrom": [ + "namespace_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "namespace_cache_warmer_config_namespace_id_unique": { + "name": "namespace_cache_warmer_config_namespace_id_unique", + "nullsNotDistinct": false, + "columns": [ + "namespace_id" + ] + } + }, + "checkConstraints": {} + }, + "public.namespace_config": { + "name": "namespace_config", + "schema": "", + "columns": { + "namespace_id": { + "name": "namespace_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "enable_linting": { + "name": "enable_linting", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "enable_graph_pruning": { + "name": "enable_graph_pruning", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "enable_cache_warming": { + "name": "enable_cache_warming", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "checks_timeframe_in_days": { + "name": "checks_timeframe_in_days", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "enable_proposals": { + "name": "enable_proposals", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "enable_subgraph_check_extensions": { + "name": "enable_subgraph_check_extensions", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + } + }, + "indexes": {}, + "foreignKeys": { + "namespace_config_namespace_id_namespaces_id_fk": { + "name": "namespace_config_namespace_id_namespaces_id_fk", + "tableFrom": "namespace_config", + "tableTo": "namespaces", + "columnsFrom": [ + "namespace_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "unique_namespace": { + "name": "unique_namespace", + "nullsNotDistinct": false, + "columns": [ + "namespace_id" + ] + } + }, + "checkConstraints": {} + }, + "public.namespace_graph_pruning_check_config": { + "name": "namespace_graph_pruning_check_config", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "namespace_id": { + "name": "namespace_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "graph_pruning_rule": { + "name": "graph_pruning_rule", + "type": "graph_pruning_rules", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "severity_level": { + "name": "severity_level", + "type": "lint_severity", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "grace_period": { + "name": "grace_period", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "scheme_usage_check_period": { + "name": "scheme_usage_check_period", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "nsgpcc_namespace_id_idx": { + "name": "nsgpcc_namespace_id_idx", + "columns": [ + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "namespace_graph_pruning_check_config_namespace_id_namespaces_id_fk": { + "name": "namespace_graph_pruning_check_config_namespace_id_namespaces_id_fk", + "tableFrom": "namespace_graph_pruning_check_config", + "tableTo": "namespaces", + "columnsFrom": [ + "namespace_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.namespace_lint_check_config": { + "name": "namespace_lint_check_config", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "namespace_id": { + "name": "namespace_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "lint_rule": { + "name": "lint_rule", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "severity_level": { + "name": "severity_level", + "type": "lint_severity", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "nslcc_namespace_id_idx": { + "name": "nslcc_namespace_id_idx", + "columns": [ + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "namespace_lint_check_config_namespace_id_namespaces_id_fk": { + "name": "namespace_lint_check_config_namespace_id_namespaces_id_fk", + "tableFrom": "namespace_lint_check_config", + "tableTo": "namespaces", + "columnsFrom": [ + "namespace_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.namespace_login_methods": { + "name": "namespace_login_methods", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "namespace_id": { + "name": "namespace_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "sso_provider_id": { + "name": "sso_provider_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "is_password_login": { + "name": "is_password_login", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_google_login": { + "name": "is_google_login", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_github_login": { + "name": "is_github_login", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "nlm_namespace_id_idx": { + "name": "nlm_namespace_id_idx", + "columns": [ + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "nlm_sso_provider_id_idx": { + "name": "nlm_sso_provider_id_idx", + "columns": [ + { + "expression": "sso_provider_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "nlm_unique_sso": { + "name": "nlm_unique_sso", + "columns": [ + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "sso_provider_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "where": "\"namespace_login_methods\".\"sso_provider_id\" IS NOT NULL", + "concurrently": false, + "method": "btree", + "with": {} + }, + "nlm_unique_builtin": { + "name": "nlm_unique_builtin", + "columns": [ + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "where": "\"namespace_login_methods\".\"sso_provider_id\" IS NULL", + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "namespace_login_methods_namespace_id_namespaces_id_fk": { + "name": "namespace_login_methods_namespace_id_namespaces_id_fk", + "tableFrom": "namespace_login_methods", + "tableTo": "namespaces", + "columnsFrom": [ + "namespace_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "namespace_login_methods_sso_provider_id_oidc_providers_id_fk": { + "name": "namespace_login_methods_sso_provider_id_oidc_providers_id_fk", + "tableFrom": "namespace_login_methods", + "tableTo": "oidc_providers", + "columnsFrom": [ + "sso_provider_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": { + "nlm_builtin_xor_sso_check": { + "name": "nlm_builtin_xor_sso_check", + "value": "(\"namespace_login_methods\".\"sso_provider_id\" IS NOT NULL) <> (\"namespace_login_methods\".\"is_password_login\" OR \"namespace_login_methods\".\"is_google_login\" OR \"namespace_login_methods\".\"is_github_login\")" + } + } + }, + "public.namespace_proposal_config": { + "name": "namespace_proposal_config", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "namespace_id": { + "name": "namespace_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "check_severity_level": { + "name": "check_severity_level", + "type": "lint_severity", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "publish_severity_level": { + "name": "publish_severity_level", + "type": "lint_severity", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "namespace_proposal_config_namespace_id_namespaces_id_fk": { + "name": "namespace_proposal_config_namespace_id_namespaces_id_fk", + "tableFrom": "namespace_proposal_config", + "tableTo": "namespaces", + "columnsFrom": [ + "namespace_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "npc_namespace_id_idx": { + "name": "npc_namespace_id_idx", + "nullsNotDistinct": false, + "columns": [ + "namespace_id" + ] + } + }, + "checkConstraints": {} + }, + "public.namespace_subgraph_check_extensions_config": { + "name": "namespace_subgraph_check_extensions_config", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "namespace_id": { + "name": "namespace_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "endpoint": { + "name": "endpoint", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "secret_key": { + "name": "secret_key", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "include_composed_sdl": { + "name": "include_composed_sdl", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "include_linting_issues": { + "name": "include_linting_issues", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "include_pruning_issues": { + "name": "include_pruning_issues", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "include_schema_changes": { + "name": "include_schema_changes", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "include_affected_operations": { + "name": "include_affected_operations", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + } + }, + "indexes": { + "nsce_namespace_id_idx": { + "name": "nsce_namespace_id_idx", + "columns": [ + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "namespace_subgraph_check_extensions_config_namespace_id_namespaces_id_fk": { + "name": "namespace_subgraph_check_extensions_config_namespace_id_namespaces_id_fk", + "tableFrom": "namespace_subgraph_check_extensions_config", + "tableTo": "namespaces", + "columnsFrom": [ + "namespace_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "namespace_subgraph_check_extensions_config_namespace_id_unique": { + "name": "namespace_subgraph_check_extensions_config_namespace_id_unique", + "nullsNotDistinct": false, + "columns": [ + "namespace_id" + ] + } + }, + "checkConstraints": {} + }, + "public.namespaces": { + "name": "namespaces", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "created_by": { + "name": "created_by", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "ns_organization_id_idx": { + "name": "ns_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ns_created_by_idx": { + "name": "ns_created_by_idx", + "columns": [ + { + "expression": "created_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "namespaces_organization_id_organizations_id_fk": { + "name": "namespaces_organization_id_organizations_id_fk", + "tableFrom": "namespaces", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "namespaces_created_by_users_id_fk": { + "name": "namespaces_created_by_users_id_fk", + "tableFrom": "namespaces", + "tableTo": "users", + "columnsFrom": [ + "created_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "unique_name": { + "name": "unique_name", + "nullsNotDistinct": false, + "columns": [ + "name", + "organization_id" + ] + } + }, + "checkConstraints": {} + }, + "public.oidc_providers": { + "name": "oidc_providers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "alias": { + "name": "alias", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "endpoint": { + "name": "endpoint", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "oidcp_organization_id_idx": { + "name": "oidcp_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "oidc_providers_organization_id_organizations_id_fk": { + "name": "oidc_providers_organization_id_organizations_id_fk", + "tableFrom": "oidc_providers", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "oidc_providers_alias_unique": { + "name": "oidc_providers_alias_unique", + "nullsNotDistinct": false, + "columns": [ + "alias" + ] + } + }, + "checkConstraints": {} + }, + "public.onboarding": { + "name": "onboarding", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "finished_at": { + "name": "finished_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "version": { + "name": "version", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "slack": { + "name": "slack", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "email": { + "name": "email", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "onboarding_user_id_users_id_fk": { + "name": "onboarding_user_id_users_id_fk", + "tableFrom": "onboarding", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "onboarding_organization_id_organizations_id_fk": { + "name": "onboarding_organization_id_organizations_id_fk", + "tableFrom": "onboarding", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "onboarding_user_id_organization_id_version_unique": { + "name": "onboarding_user_id_organization_id_version_unique", + "nullsNotDistinct": false, + "columns": [ + "user_id", + "organization_id", + "version" + ] + } + }, + "checkConstraints": {} + }, + "public.operation_change_overrides": { + "name": "operation_change_overrides", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "hash": { + "name": "hash", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "namespace_id": { + "name": "namespace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "change_type": { + "name": "change_type", + "type": "schema_change_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "path": { + "name": "path", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_by": { + "name": "created_by", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "hash_change_idx": { + "name": "hash_change_idx", + "columns": [ + { + "expression": "hash", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "change_type", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "path", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "oco_created_by_idx": { + "name": "oco_created_by_idx", + "columns": [ + { + "expression": "created_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "operation_change_overrides_created_by_users_id_fk": { + "name": "operation_change_overrides_created_by_users_id_fk", + "tableFrom": "operation_change_overrides", + "tableTo": "users", + "columnsFrom": [ + "created_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.operation_ignore_all_overrides": { + "name": "operation_ignore_all_overrides", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "hash": { + "name": "hash", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "namespace_id": { + "name": "namespace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_by": { + "name": "created_by", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "hash_namespace_ignore_idx": { + "name": "hash_namespace_ignore_idx", + "columns": [ + { + "expression": "hash", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "oiao_created_by_idx": { + "name": "oiao_created_by_idx", + "columns": [ + { + "expression": "created_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "operation_ignore_all_overrides_created_by_users_id_fk": { + "name": "operation_ignore_all_overrides_created_by_users_id_fk", + "tableFrom": "operation_ignore_all_overrides", + "tableTo": "users", + "columnsFrom": [ + "created_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organization_billing": { + "name": "organization_billing", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "plan": { + "name": "plan", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "stripe_customer_id": { + "name": "stripe_customer_id", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "organization_billing_idx": { + "name": "organization_billing_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "organization_billing_stripe_idx": { + "name": "organization_billing_stripe_idx", + "columns": [ + { + "expression": "stripe_customer_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "organization_billing_organization_id_organizations_id_fk": { + "name": "organization_billing_organization_id_organizations_id_fk", + "tableFrom": "organization_billing", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organization_features": { + "name": "organization_features", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "feature": { + "name": "feature", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": true + }, + "limit": { + "name": "limit", + "type": "real", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "organization_feature_idx": { + "name": "organization_feature_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "feature", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "orgf_organization_id_idx": { + "name": "orgf_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "organization_features_organization_id_organizations_id_fk": { + "name": "organization_features_organization_id_organizations_id_fk", + "tableFrom": "organization_features", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organization_group_members": { + "name": "organization_group_members", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_member_id": { + "name": "organization_member_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "group_id": { + "name": "group_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "organization_member_group_idx": { + "name": "organization_member_group_idx", + "columns": [ + { + "expression": "organization_member_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "group_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "organization_group_members_organization_member_id_organization_members_id_fk": { + "name": "organization_group_members_organization_member_id_organization_members_id_fk", + "tableFrom": "organization_group_members", + "tableTo": "organization_members", + "columnsFrom": [ + "organization_member_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "organization_group_members_group_id_organization_groups_id_fk": { + "name": "organization_group_members_group_id_organization_groups_id_fk", + "tableFrom": "organization_group_members", + "tableTo": "organization_groups", + "columnsFrom": [ + "group_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organization_group_rule_namespaces": { + "name": "organization_group_rule_namespaces", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "rule_id": { + "name": "rule_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "namespace_id": { + "name": "namespace_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "organization_group_rule_namespaces_rule_id_organization_group_rules_id_fk": { + "name": "organization_group_rule_namespaces_rule_id_organization_group_rules_id_fk", + "tableFrom": "organization_group_rule_namespaces", + "tableTo": "organization_group_rules", + "columnsFrom": [ + "rule_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "organization_group_rule_namespaces_namespace_id_namespaces_id_fk": { + "name": "organization_group_rule_namespaces_namespace_id_namespaces_id_fk", + "tableFrom": "organization_group_rule_namespaces", + "tableTo": "namespaces", + "columnsFrom": [ + "namespace_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organization_group_rule_targets": { + "name": "organization_group_rule_targets", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "rule_id": { + "name": "rule_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "target_id": { + "name": "target_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "organization_group_rule_targets_rule_id_organization_group_rules_id_fk": { + "name": "organization_group_rule_targets_rule_id_organization_group_rules_id_fk", + "tableFrom": "organization_group_rule_targets", + "tableTo": "organization_group_rules", + "columnsFrom": [ + "rule_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "organization_group_rule_targets_target_id_targets_id_fk": { + "name": "organization_group_rule_targets_target_id_targets_id_fk", + "tableFrom": "organization_group_rule_targets", + "tableTo": "targets", + "columnsFrom": [ + "target_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organization_group_rules": { + "name": "organization_group_rules", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "group_id": { + "name": "group_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "organization_role", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "organization_group_rules_group_id_organization_groups_id_fk": { + "name": "organization_group_rules_group_id_organization_groups_id_fk", + "tableFrom": "organization_group_rules", + "tableTo": "organization_groups", + "columnsFrom": [ + "group_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organization_groups": { + "name": "organization_groups", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "builtin": { + "name": "builtin", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "kc_group_id": { + "name": "kc_group_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "organization_groups_organization_id_organizations_id_fk": { + "name": "organization_groups_organization_id_organizations_id_fk", + "tableFrom": "organization_groups", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "organization_groups_kc_group_id_unique": { + "name": "organization_groups_kc_group_id_unique", + "nullsNotDistinct": false, + "columns": [ + "kc_group_id" + ] + } + }, + "checkConstraints": {} + }, + "public.organization_integrations": { + "name": "organization_integrations", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "events": { + "name": "events", + "type": "text[]", + "primaryKey": false, + "notNull": false + }, + "type": { + "name": "type", + "type": "integration_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "organization_integration_idx": { + "name": "organization_integration_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "orgint_organization_id_idx": { + "name": "orgint_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "organization_integrations_organization_id_organizations_id_fk": { + "name": "organization_integrations_organization_id_organizations_id_fk", + "tableFrom": "organization_integrations", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organization_invitation_groups": { + "name": "organization_invitation_groups", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "invitation_id": { + "name": "invitation_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "group_id": { + "name": "group_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "org_inv_invitation_idx": { + "name": "org_inv_invitation_idx", + "columns": [ + { + "expression": "invitation_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "org_inv_group_id": { + "name": "org_inv_group_id", + "columns": [ + { + "expression": "group_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "organization_invitation_groups_invitation_id_organization_invitations_id_fk": { + "name": "organization_invitation_groups_invitation_id_organization_invitations_id_fk", + "tableFrom": "organization_invitation_groups", + "tableTo": "organization_invitations", + "columnsFrom": [ + "invitation_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "organization_invitation_groups_group_id_organization_groups_id_fk": { + "name": "organization_invitation_groups_group_id_organization_groups_id_fk", + "tableFrom": "organization_invitation_groups", + "tableTo": "organization_groups", + "columnsFrom": [ + "group_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organization_invitations": { + "name": "organization_invitations", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "invited_by": { + "name": "invited_by", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "accepted": { + "name": "accepted", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "last_sent_at": { + "name": "last_sent_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "orginv_organization_id_idx": { + "name": "orginv_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "orginv_user_id_idx": { + "name": "orginv_user_id_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "orginv_invited_by_idx": { + "name": "orginv_invited_by_idx", + "columns": [ + { + "expression": "invited_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "organization_invitations_organization_id_organizations_id_fk": { + "name": "organization_invitations_organization_id_organizations_id_fk", + "tableFrom": "organization_invitations", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "organization_invitations_user_id_users_id_fk": { + "name": "organization_invitations_user_id_users_id_fk", + "tableFrom": "organization_invitations", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "organization_invitations_invited_by_users_id_fk": { + "name": "organization_invitations_invited_by_users_id_fk", + "tableFrom": "organization_invitations", + "tableTo": "users", + "columnsFrom": [ + "invited_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organization_login_methods": { + "name": "organization_login_methods", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "sso_provider_id": { + "name": "sso_provider_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "is_password_login": { + "name": "is_password_login", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_google_login": { + "name": "is_google_login", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_github_login": { + "name": "is_github_login", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "olm_organization_id_idx": { + "name": "olm_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "olm_sso_provider_id_idx": { + "name": "olm_sso_provider_id_idx", + "columns": [ + { + "expression": "sso_provider_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "olm_unique_sso": { + "name": "olm_unique_sso", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "sso_provider_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "where": "\"organization_login_methods\".\"sso_provider_id\" IS NOT NULL", + "concurrently": false, + "method": "btree", + "with": {} + }, + "olm_unique_builtin": { + "name": "olm_unique_builtin", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "where": "\"organization_login_methods\".\"sso_provider_id\" IS NULL", + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "organization_login_methods_organization_id_organizations_id_fk": { + "name": "organization_login_methods_organization_id_organizations_id_fk", + "tableFrom": "organization_login_methods", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "organization_login_methods_sso_provider_id_oidc_providers_id_fk": { + "name": "organization_login_methods_sso_provider_id_oidc_providers_id_fk", + "tableFrom": "organization_login_methods", + "tableTo": "oidc_providers", + "columnsFrom": [ + "sso_provider_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": { + "olm_builtin_xor_sso_check": { + "name": "olm_builtin_xor_sso_check", + "value": "(\"organization_login_methods\".\"sso_provider_id\" IS NOT NULL) <> (\"organization_login_methods\".\"is_password_login\" OR \"organization_login_methods\".\"is_google_login\" OR \"organization_login_methods\".\"is_github_login\")" + } + } + }, + "public.organization_member_roles": { + "name": "organization_member_roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_member_id": { + "name": "organization_member_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "member_role", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "organization_member_role_idx": { + "name": "organization_member_role_idx", + "columns": [ + { + "expression": "organization_member_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "role", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "organization_member_roles_organization_member_id_organization_members_id_fk": { + "name": "organization_member_roles_organization_member_id_organization_members_id_fk", + "tableFrom": "organization_member_roles", + "tableTo": "organization_members", + "columnsFrom": [ + "organization_member_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organization_webhook_configs": { + "name": "organization_webhook_configs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "endpoint": { + "name": "endpoint", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "events": { + "name": "events", + "type": "text[]", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "orgwc_organization_id_idx": { + "name": "orgwc_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "organization_webhook_configs_organization_id_organizations_id_fk": { + "name": "organization_webhook_configs_organization_id_organizations_id_fk", + "tableFrom": "organization_webhook_configs", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organizations": { + "name": "organizations", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slug": { + "name": "slug", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "invite_code": { + "name": "invite_code", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "kc_group_id": { + "name": "kc_group_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "is_deactivated": { + "name": "is_deactivated", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "deactivation_reason": { + "name": "deactivation_reason", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "deactivated_at": { + "name": "deactivated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "queued_for_deletion_at": { + "name": "queued_for_deletion_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "queued_for_deletion_by": { + "name": "queued_for_deletion_by", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "orgs_created_by_idx": { + "name": "orgs_created_by_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "organizations_user_id_users_id_fk": { + "name": "organizations_user_id_users_id_fk", + "tableFrom": "organizations", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "organizations_slug_unique": { + "name": "organizations_slug_unique", + "nullsNotDistinct": false, + "columns": [ + "slug" + ] + }, + "organizations_kc_group_id_unique": { + "name": "organizations_kc_group_id_unique", + "nullsNotDistinct": false, + "columns": [ + "kc_group_id" + ] + } + }, + "checkConstraints": {} + }, + "public.organization_members": { + "name": "organization_members", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "active": { + "name": "active", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "organization_member_idx": { + "name": "organization_member_idx", + "columns": [ + { + "expression": "id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "unique_organization_member_idx": { + "name": "unique_organization_member_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "orgm_organization_id_idx": { + "name": "orgm_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "organization_members_user_id_users_id_fk": { + "name": "organization_members_user_id_users_id_fk", + "tableFrom": "organization_members", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "organization_members_organization_id_organizations_id_fk": { + "name": "organization_members_organization_id_organizations_id_fk", + "tableFrom": "organization_members", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.playground_scripts": { + "name": "playground_scripts", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_by_id": { + "name": "created_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "type": { + "name": "type", + "type": "playground_script_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + } + }, + "indexes": { + "ps_organization_id_idx": { + "name": "ps_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ps_created_by_id_idx": { + "name": "ps_created_by_id_idx", + "columns": [ + { + "expression": "created_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "playground_scripts_organization_id_organizations_id_fk": { + "name": "playground_scripts_organization_id_organizations_id_fk", + "tableFrom": "playground_scripts", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "playground_scripts_created_by_id_users_id_fk": { + "name": "playground_scripts_created_by_id_users_id_fk", + "tableFrom": "playground_scripts", + "tableTo": "users", + "columnsFrom": [ + "created_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.plugin_image_versions": { + "name": "plugin_image_versions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_version_id": { + "name": "schema_version_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "version": { + "name": "version", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "platform": { + "name": "platform", + "type": "text[]", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "plugin_image_versions_schema_version_id_schema_versions_id_fk": { + "name": "plugin_image_versions_schema_version_id_schema_versions_id_fk", + "tableFrom": "plugin_image_versions", + "tableTo": "schema_versions", + "columnsFrom": [ + "schema_version_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.proposal_checks": { + "name": "proposal_checks", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_check_id": { + "name": "schema_check_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "proposal_id": { + "name": "proposal_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "pc_check_id_proposal_id_idx": { + "name": "pc_check_id_proposal_id_idx", + "columns": [ + { + "expression": "schema_check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "proposal_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "proposal_checks_schema_check_id_schema_checks_id_fk": { + "name": "proposal_checks_schema_check_id_schema_checks_id_fk", + "tableFrom": "proposal_checks", + "tableTo": "schema_checks", + "columnsFrom": [ + "schema_check_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "proposal_checks_proposal_id_proposals_id_fk": { + "name": "proposal_checks_proposal_id_proposals_id_fk", + "tableFrom": "proposal_checks", + "tableTo": "proposals", + "columnsFrom": [ + "proposal_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.proposal_subgraphs": { + "name": "proposal_subgraphs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "proposal_id": { + "name": "proposal_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "subgraph_id": { + "name": "subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "subgraph_name": { + "name": "subgraph_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "schema_sdl": { + "name": "schema_sdl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_deleted": { + "name": "is_deleted", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_new": { + "name": "is_new", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "is_published": { + "name": "is_published", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "current_schema_version_id": { + "name": "current_schema_version_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "labels": { + "name": "labels", + "type": "text[]", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "proposal_subgraphs_proposal_id_proposals_id_fk": { + "name": "proposal_subgraphs_proposal_id_proposals_id_fk", + "tableFrom": "proposal_subgraphs", + "tableTo": "proposals", + "columnsFrom": [ + "proposal_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "proposal_subgraphs_subgraph_id_subgraphs_id_fk": { + "name": "proposal_subgraphs_subgraph_id_subgraphs_id_fk", + "tableFrom": "proposal_subgraphs", + "tableTo": "subgraphs", + "columnsFrom": [ + "subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "proposal_subgraphs_current_schema_version_id_schema_versions_id_fk": { + "name": "proposal_subgraphs_current_schema_version_id_schema_versions_id_fk", + "tableFrom": "proposal_subgraphs", + "tableTo": "schema_versions", + "columnsFrom": [ + "current_schema_version_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "proposal_subgraph": { + "name": "proposal_subgraph", + "nullsNotDistinct": false, + "columns": [ + "proposal_id", + "subgraph_name" + ] + } + }, + "checkConstraints": {} + }, + "public.proposals": { + "name": "proposals", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_by_id": { + "name": "created_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "state": { + "name": "state", + "type": "proposal_state", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "origin": { + "name": "origin", + "type": "proposal_origin", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'INTERNAL'" + } + }, + "indexes": { + "pr_created_by_id_idx": { + "name": "pr_created_by_id_idx", + "columns": [ + { + "expression": "created_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "pr_federated_graph_id_idx": { + "name": "pr_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "proposals_federated_graph_id_federated_graphs_id_fk": { + "name": "proposals_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "proposals", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "proposals_created_by_id_users_id_fk": { + "name": "proposals_created_by_id_users_id_fk", + "tableFrom": "proposals", + "tableTo": "users", + "columnsFrom": [ + "created_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "federated_graph_proposal_name": { + "name": "federated_graph_proposal_name", + "nullsNotDistinct": false, + "columns": [ + "federated_graph_id", + "name" + ] + } + }, + "checkConstraints": {} + }, + "public.protobuf_schema_versions": { + "name": "protobuf_schema_versions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_version_id": { + "name": "schema_version_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "proto_schema": { + "name": "proto_schema", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "proto_mappings": { + "name": "proto_mappings", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "proto_lock": { + "name": "proto_lock", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "protobuf_schema_versions_schema_version_id_schema_versions_id_fk": { + "name": "protobuf_schema_versions_schema_version_id_schema_versions_id_fk", + "tableFrom": "protobuf_schema_versions", + "tableTo": "schema_versions", + "columnsFrom": [ + "schema_version_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.router_config_hash": { + "name": "router_config_hash", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "feature_flag_id": { + "name": "feature_flag_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "hash": { + "name": "hash", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "router_config_hash_federated_graph_id_federated_graphs_id_fk": { + "name": "router_config_hash_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "router_config_hash", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "router_config_hash_feature_flag_id_feature_flags_id_fk": { + "name": "router_config_hash_feature_flag_id_feature_flags_id_fk", + "tableFrom": "router_config_hash", + "tableTo": "feature_flags", + "columnsFrom": [ + "feature_flag_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "fed_graph_feature_flag_idx": { + "name": "fed_graph_feature_flag_idx", + "nullsNotDistinct": true, + "columns": [ + "federated_graph_id", + "feature_flag_id" + ] + } + }, + "checkConstraints": {} + }, + "public.schema_check_change_action": { + "name": "schema_check_change_action", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_check_id": { + "name": "schema_check_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "change_type": { + "name": "change_type", + "type": "schema_change_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "change_message": { + "name": "change_message", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_breaking": { + "name": "is_breaking", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "path": { + "name": "path", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "schema_check_subgraph_id": { + "name": "schema_check_subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "is_fed_graph_change": { + "name": "is_fed_graph_change", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + } + }, + "indexes": { + "scca_schema_check_id_idx": { + "name": "scca_schema_check_id_idx", + "columns": [ + { + "expression": "schema_check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "scca_schema_check_subgraph_id_idx": { + "name": "scca_schema_check_subgraph_id_idx", + "columns": [ + { + "expression": "schema_check_subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_check_change_action_schema_check_id_schema_checks_id_fk": { + "name": "schema_check_change_action_schema_check_id_schema_checks_id_fk", + "tableFrom": "schema_check_change_action", + "tableTo": "schema_checks", + "columnsFrom": [ + "schema_check_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_check_change_action_schema_check_subgraph_id_schema_check_subgraphs_id_fk": { + "name": "schema_check_change_action_schema_check_subgraph_id_schema_check_subgraphs_id_fk", + "tableFrom": "schema_check_change_action", + "tableTo": "schema_check_subgraphs", + "columnsFrom": [ + "schema_check_subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.schema_check_change_operation_usage": { + "name": "schema_check_change_operation_usage", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_check_change_action_id": { + "name": "schema_check_change_action_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "hash": { + "name": "hash", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "first_seen_at": { + "name": "first_seen_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "last_seen_at": { + "name": "last_seen_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "is_safe_override": { + "name": "is_safe_override", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + } + }, + "indexes": { + "sccou_schema_check_change_action_id_idx": { + "name": "sccou_schema_check_change_action_id_idx", + "columns": [ + { + "expression": "schema_check_change_action_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "sccou_federated_graph_id_idx": { + "name": "sccou_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_check_change_operation_usage_schema_check_change_action_id_schema_check_change_action_id_fk": { + "name": "schema_check_change_operation_usage_schema_check_change_action_id_schema_check_change_action_id_fk", + "tableFrom": "schema_check_change_operation_usage", + "tableTo": "schema_check_change_action", + "columnsFrom": [ + "schema_check_change_action_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_check_change_operation_usage_federated_graph_id_federated_graphs_id_fk": { + "name": "schema_check_change_operation_usage_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "schema_check_change_operation_usage", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.schema_check_composition": { + "name": "schema_check_composition", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_check_id": { + "name": "schema_check_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "target_id": { + "name": "target_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "composition_errors": { + "name": "composition_errors", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composition_warnings": { + "name": "composition_warnings", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composed_schema_sdl": { + "name": "composed_schema_sdl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "client_schema": { + "name": "client_schema", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "scc_schema_check_id_idx": { + "name": "scc_schema_check_id_idx", + "columns": [ + { + "expression": "schema_check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "scc_target_id_idx": { + "name": "scc_target_id_idx", + "columns": [ + { + "expression": "target_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_check_composition_schema_check_id_schema_checks_id_fk": { + "name": "schema_check_composition_schema_check_id_schema_checks_id_fk", + "tableFrom": "schema_check_composition", + "tableTo": "schema_checks", + "columnsFrom": [ + "schema_check_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_check_composition_target_id_targets_id_fk": { + "name": "schema_check_composition_target_id_targets_id_fk", + "tableFrom": "schema_check_composition", + "tableTo": "targets", + "columnsFrom": [ + "target_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.schema_check_federated_graph_changes": { + "name": "schema_check_federated_graph_changes", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_check_federated_graph_id": { + "name": "schema_check_federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "schema_check_change_action_id": { + "name": "schema_check_change_action_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "scfgsc_schema_check_federated_graph_id_idx": { + "name": "scfgsc_schema_check_federated_graph_id_idx", + "columns": [ + { + "expression": "schema_check_federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "scfgsc_schema_check_change_action_id_idx": { + "name": "scfgsc_schema_check_change_action_id_idx", + "columns": [ + { + "expression": "schema_check_change_action_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "scfgc_fed_graph_change_action_unique": { + "name": "scfgc_fed_graph_change_action_unique", + "columns": [ + { + "expression": "schema_check_federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "schema_check_change_action_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_check_federated_graph_changes_schema_check_federated_graph_id_schema_check_federated_graphs_id_fk": { + "name": "schema_check_federated_graph_changes_schema_check_federated_graph_id_schema_check_federated_graphs_id_fk", + "tableFrom": "schema_check_federated_graph_changes", + "tableTo": "schema_check_federated_graphs", + "columnsFrom": [ + "schema_check_federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_check_federated_graph_changes_schema_check_change_action_id_schema_check_change_action_id_fk": { + "name": "schema_check_federated_graph_changes_schema_check_change_action_id_schema_check_change_action_id_fk", + "tableFrom": "schema_check_federated_graph_changes", + "tableTo": "schema_check_change_action", + "columnsFrom": [ + "schema_check_change_action_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.schema_check_federated_graphs": { + "name": "schema_check_federated_graphs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "check_id": { + "name": "check_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "traffic_check_days": { + "name": "traffic_check_days", + "type": "integer", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "scfg_check_id_idx": { + "name": "scfg_check_id_idx", + "columns": [ + { + "expression": "check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "scfg_federated_graph_id_idx": { + "name": "scfg_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_check_federated_graphs_check_id_schema_checks_id_fk": { + "name": "schema_check_federated_graphs_check_id_schema_checks_id_fk", + "tableFrom": "schema_check_federated_graphs", + "tableTo": "schema_checks", + "columnsFrom": [ + "check_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_check_federated_graphs_federated_graph_id_federated_graphs_id_fk": { + "name": "schema_check_federated_graphs_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "schema_check_federated_graphs", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.schema_check_graph_pruning_action": { + "name": "schema_check_graph_pruning_action", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_check_id": { + "name": "schema_check_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "graph_pruning_rule": { + "name": "graph_pruning_rule", + "type": "graph_pruning_rules", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "field_path": { + "name": "field_path", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "message": { + "name": "message", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_error": { + "name": "is_error", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "location": { + "name": "location", + "type": "json", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "schema_check_subgraph_id": { + "name": "schema_check_subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "scgpa_schema_check_id_idx": { + "name": "scgpa_schema_check_id_idx", + "columns": [ + { + "expression": "schema_check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "scgpa_federated_graph_id_idx": { + "name": "scgpa_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "scgpa_schema_check_subgraph_id_idx": { + "name": "scgpa_schema_check_subgraph_id_idx", + "columns": [ + { + "expression": "schema_check_subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_check_graph_pruning_action_schema_check_id_schema_checks_id_fk": { + "name": "schema_check_graph_pruning_action_schema_check_id_schema_checks_id_fk", + "tableFrom": "schema_check_graph_pruning_action", + "tableTo": "schema_checks", + "columnsFrom": [ + "schema_check_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_check_graph_pruning_action_federated_graph_id_federated_graphs_id_fk": { + "name": "schema_check_graph_pruning_action_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "schema_check_graph_pruning_action", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_check_graph_pruning_action_schema_check_subgraph_id_schema_check_subgraphs_id_fk": { + "name": "schema_check_graph_pruning_action_schema_check_subgraph_id_schema_check_subgraphs_id_fk", + "tableFrom": "schema_check_graph_pruning_action", + "tableTo": "schema_check_subgraphs", + "columnsFrom": [ + "schema_check_subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.schema_check_lint_action": { + "name": "schema_check_lint_action", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_check_id": { + "name": "schema_check_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "lint_rule_type": { + "name": "lint_rule_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "message": { + "name": "message", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_error": { + "name": "is_error", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "location": { + "name": "location", + "type": "json", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "schema_check_subgraph_id": { + "name": "schema_check_subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "sclact_schema_check_id_idx": { + "name": "sclact_schema_check_id_idx", + "columns": [ + { + "expression": "schema_check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "sclact_schema_check_subgraph_id_idx": { + "name": "sclact_schema_check_subgraph_id_idx", + "columns": [ + { + "expression": "schema_check_subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_check_lint_action_schema_check_id_schema_checks_id_fk": { + "name": "schema_check_lint_action_schema_check_id_schema_checks_id_fk", + "tableFrom": "schema_check_lint_action", + "tableTo": "schema_checks", + "columnsFrom": [ + "schema_check_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_check_lint_action_schema_check_subgraph_id_schema_check_subgraphs_id_fk": { + "name": "schema_check_lint_action_schema_check_subgraph_id_schema_check_subgraphs_id_fk", + "tableFrom": "schema_check_lint_action", + "tableTo": "schema_check_subgraphs", + "columnsFrom": [ + "schema_check_subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.schema_check_proposal_match": { + "name": "schema_check_proposal_match", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_check_id": { + "name": "schema_check_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "proposal_id": { + "name": "proposal_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "proposal_match": { + "name": "proposal_match", + "type": "boolean", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "scpm_schema_check_id_idx": { + "name": "scpm_schema_check_id_idx", + "columns": [ + { + "expression": "schema_check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "scpm_proposal_id_idx": { + "name": "scpm_proposal_id_idx", + "columns": [ + { + "expression": "proposal_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_check_proposal_match_schema_check_id_schema_checks_id_fk": { + "name": "schema_check_proposal_match_schema_check_id_schema_checks_id_fk", + "tableFrom": "schema_check_proposal_match", + "tableTo": "schema_checks", + "columnsFrom": [ + "schema_check_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_check_proposal_match_proposal_id_proposals_id_fk": { + "name": "schema_check_proposal_match_proposal_id_proposals_id_fk", + "tableFrom": "schema_check_proposal_match", + "tableTo": "proposals", + "columnsFrom": [ + "proposal_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "unique_schema_check_proposal_match": { + "name": "unique_schema_check_proposal_match", + "nullsNotDistinct": false, + "columns": [ + "schema_check_id", + "proposal_id" + ] + } + }, + "checkConstraints": {} + }, + "public.schema_check_subgraphs": { + "name": "schema_check_subgraphs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_check_id": { + "name": "schema_check_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "subgraph_id": { + "name": "subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "subgraph_name": { + "name": "subgraph_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "proposed_subgraph_schema_sdl": { + "name": "proposed_subgraph_schema_sdl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_deleted": { + "name": "is_deleted", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_new": { + "name": "is_new", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "namespace_id": { + "name": "namespace_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "labels": { + "name": "labels", + "type": "text[]", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "scs_schema_check_id_idx": { + "name": "scs_schema_check_id_idx", + "columns": [ + { + "expression": "schema_check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "scs_subgraph_id_idx": { + "name": "scs_subgraph_id_idx", + "columns": [ + { + "expression": "subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "scs_namespace_id_idx": { + "name": "scs_namespace_id_idx", + "columns": [ + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_check_subgraphs_schema_check_id_schema_checks_id_fk": { + "name": "schema_check_subgraphs_schema_check_id_schema_checks_id_fk", + "tableFrom": "schema_check_subgraphs", + "tableTo": "schema_checks", + "columnsFrom": [ + "schema_check_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_check_subgraphs_subgraph_id_subgraphs_id_fk": { + "name": "schema_check_subgraphs_subgraph_id_subgraphs_id_fk", + "tableFrom": "schema_check_subgraphs", + "tableTo": "subgraphs", + "columnsFrom": [ + "subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "schema_check_subgraphs_namespace_id_namespaces_id_fk": { + "name": "schema_check_subgraphs_namespace_id_namespaces_id_fk", + "tableFrom": "schema_check_subgraphs", + "tableTo": "namespaces", + "columnsFrom": [ + "namespace_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.schema_check_subgraphs_federated_graphs": { + "name": "schema_check_subgraphs_federated_graphs", + "schema": "", + "columns": { + "schema_check_federated_graph_id": { + "name": "schema_check_federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "schema_check_subgraph_id": { + "name": "schema_check_subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "scsfg_schema_check_subgraph_id_idx": { + "name": "scsfg_schema_check_subgraph_id_idx", + "columns": [ + { + "expression": "schema_check_subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "scsfg_schema_check_federated_graph_id_idx": { + "name": "scsfg_schema_check_federated_graph_id_idx", + "columns": [ + { + "expression": "schema_check_federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_check_subgraphs_federated_graphs_schema_check_federated_graph_id_schema_check_federated_graphs_id_fk": { + "name": "schema_check_subgraphs_federated_graphs_schema_check_federated_graph_id_schema_check_federated_graphs_id_fk", + "tableFrom": "schema_check_subgraphs_federated_graphs", + "tableTo": "schema_check_federated_graphs", + "columnsFrom": [ + "schema_check_federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_check_subgraphs_federated_graphs_schema_check_subgraph_id_schema_check_subgraphs_id_fk": { + "name": "schema_check_subgraphs_federated_graphs_schema_check_subgraph_id_schema_check_subgraphs_id_fk", + "tableFrom": "schema_check_subgraphs_federated_graphs", + "tableTo": "schema_check_subgraphs", + "columnsFrom": [ + "schema_check_subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.schema_checks": { + "name": "schema_checks", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "target_id": { + "name": "target_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "is_composable": { + "name": "is_composable", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "is_deleted": { + "name": "is_deleted", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "has_breaking_changes": { + "name": "has_breaking_changes", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "has_lint_errors": { + "name": "has_lint_errors", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "has_graph_pruning_errors": { + "name": "has_graph_pruning_errors", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "has_client_traffic": { + "name": "has_client_traffic", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "proposal_match": { + "name": "proposal_match", + "type": "proposal_match", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "client_traffic_check_skipped": { + "name": "client_traffic_check_skipped", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "lint_skipped": { + "name": "lint_skipped", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "graph_pruning_skipped": { + "name": "graph_pruning_skipped", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "composition_skipped": { + "name": "composition_skipped", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "breaking_changes_skipped": { + "name": "breaking_changes_skipped", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "proposed_subgraph_schema_sdl": { + "name": "proposed_subgraph_schema_sdl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "gh_details": { + "name": "gh_details", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "forced_success": { + "name": "forced_success", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "vcs_context": { + "name": "vcs_context", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "error_message": { + "name": "error_message", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "check_extension_delivery_id": { + "name": "check_extension_delivery_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "check_extension_error_message": { + "name": "check_extension_error_message", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "sc_target_id_idx": { + "name": "sc_target_id_idx", + "columns": [ + { + "expression": "target_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "sce_webhook_delivery_id_idx": { + "name": "sce_webhook_delivery_id_idx", + "columns": [ + { + "expression": "check_extension_delivery_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_checks_target_id_targets_id_fk": { + "name": "schema_checks_target_id_targets_id_fk", + "tableFrom": "schema_checks", + "tableTo": "targets", + "columnsFrom": [ + "target_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_checks_check_extension_delivery_id_webhook_deliveries_id_fk": { + "name": "schema_checks_check_extension_delivery_id_webhook_deliveries_id_fk", + "tableFrom": "schema_checks", + "tableTo": "webhook_deliveries", + "columnsFrom": [ + "check_extension_delivery_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.schema_versions": { + "name": "schema_versions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "target_id": { + "name": "target_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "schema_sdl": { + "name": "schema_sdl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "client_schema": { + "name": "client_schema", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "is_v2_graph": { + "name": "is_v2_graph", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "sv_organization_id_idx": { + "name": "sv_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "sv_target_id_idx": { + "name": "sv_target_id_idx", + "columns": [ + { + "expression": "target_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_versions_organization_id_organizations_id_fk": { + "name": "schema_versions_organization_id_organizations_id_fk", + "tableFrom": "schema_versions", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.schema_version_change_action": { + "name": "schema_version_change_action", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_version_id": { + "name": "schema_version_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "change_type": { + "name": "change_type", + "type": "schema_change_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "change_message": { + "name": "change_message", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "path": { + "name": "path", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "svca_schema_version_id_idx": { + "name": "svca_schema_version_id_idx", + "columns": [ + { + "expression": "schema_version_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_version_change_action_schema_version_id_schema_versions_id_fk": { + "name": "schema_version_change_action_schema_version_id_schema_versions_id_fk", + "tableFrom": "schema_version_change_action", + "tableTo": "schema_versions", + "columnsFrom": [ + "schema_version_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.sessions": { + "name": "sessions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "id_token": { + "name": "id_token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "idp_alias": { + "name": "idp_alias", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "sessions_user_id_idx": { + "name": "sessions_user_id_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "sessions_user_id_users_id_fk": { + "name": "sessions_user_id_users_id_fk", + "tableFrom": "sessions", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "sessions_user_id_unique": { + "name": "sessions_user_id_unique", + "nullsNotDistinct": false, + "columns": [ + "user_id" + ] + } + }, + "checkConstraints": {} + }, + "public.slack_installations": { + "name": "slack_installations", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "slack_organization_id": { + "name": "slack_organization_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slack_organization_name": { + "name": "slack_organization_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slack_channel_id": { + "name": "slack_channel_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slack_channel_name": { + "name": "slack_channel_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slack_user_id": { + "name": "slack_user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "slack_installations_idx": { + "name": "slack_installations_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "slack_organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "slack_channel_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "slackinst_organization_id_idx": { + "name": "slackinst_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "slack_installations_organization_id_organizations_id_fk": { + "name": "slack_installations_organization_id_organizations_id_fk", + "tableFrom": "slack_installations", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.slack_integration_configs": { + "name": "slack_integration_configs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "integration_id": { + "name": "integration_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "endpoint": { + "name": "endpoint", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "slackintconf_integration_id_idx": { + "name": "slackintconf_integration_id_idx", + "columns": [ + { + "expression": "integration_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "slack_integration_configs_integration_id_organization_integrations_id_fk": { + "name": "slack_integration_configs_integration_id_organization_integrations_id_fk", + "tableFrom": "slack_integration_configs", + "tableTo": "organization_integrations", + "columnsFrom": [ + "integration_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.slack_proposal_state_update": { + "name": "slack_proposal_state_update", + "schema": "", + "columns": { + "slack_integration_config_id": { + "name": "slack_integration_config_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "slackpsu_slack_integration_config_id_idx": { + "name": "slackpsu_slack_integration_config_id_idx", + "columns": [ + { + "expression": "slack_integration_config_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "slackpsu_federated_graph_id_idx": { + "name": "slackpsu_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "slack_proposal_state_update_slack_integration_config_id_slack_integration_configs_id_fk": { + "name": "slack_proposal_state_update_slack_integration_config_id_slack_integration_configs_id_fk", + "tableFrom": "slack_proposal_state_update", + "tableTo": "slack_integration_configs", + "columnsFrom": [ + "slack_integration_config_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "slack_proposal_state_update_federated_graph_id_federated_graphs_id_fk": { + "name": "slack_proposal_state_update_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "slack_proposal_state_update", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "slack_proposal_state_update_slack_integration_config_id_federated_graph_id_pk": { + "name": "slack_proposal_state_update_slack_integration_config_id_federated_graph_id_pk", + "columns": [ + "slack_integration_config_id", + "federated_graph_id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.slack_schema_update_event_configs": { + "name": "slack_schema_update_event_configs", + "schema": "", + "columns": { + "slack_integration_config_id": { + "name": "slack_integration_config_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "slacksuec_slack_integration_config_id_idx": { + "name": "slacksuec_slack_integration_config_id_idx", + "columns": [ + { + "expression": "slack_integration_config_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "slacksuec_federated_graph_id_idx": { + "name": "slacksuec_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "slack_schema_update_event_configs_slack_integration_config_id_slack_integration_configs_id_fk": { + "name": "slack_schema_update_event_configs_slack_integration_config_id_slack_integration_configs_id_fk", + "tableFrom": "slack_schema_update_event_configs", + "tableTo": "slack_integration_configs", + "columnsFrom": [ + "slack_integration_config_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "slack_schema_update_event_configs_federated_graph_id_federated_graphs_id_fk": { + "name": "slack_schema_update_event_configs_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "slack_schema_update_event_configs", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "slack_schema_update_event_configs_slack_integration_config_id_federated_graph_id_pk": { + "name": "slack_schema_update_event_configs_slack_integration_config_id_federated_graph_id_pk", + "columns": [ + "slack_integration_config_id", + "federated_graph_id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.subgraph_members": { + "name": "subgraph_members", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "subgraph_id": { + "name": "subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "unique_subgraph_member_idx": { + "name": "unique_subgraph_member_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "sm_user_id_idx": { + "name": "sm_user_id_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "sm_subgraph_id_idx": { + "name": "sm_subgraph_id_idx", + "columns": [ + { + "expression": "subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "subgraph_members_user_id_users_id_fk": { + "name": "subgraph_members_user_id_users_id_fk", + "tableFrom": "subgraph_members", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "subgraph_members_subgraph_id_subgraphs_id_fk": { + "name": "subgraph_members_subgraph_id_subgraphs_id_fk", + "tableFrom": "subgraph_members", + "tableTo": "subgraphs", + "columnsFrom": [ + "subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.subgraphs": { + "name": "subgraphs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "routing_url": { + "name": "routing_url", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "subscription_url": { + "name": "subscription_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "subscription_protocol": { + "name": "subscription_protocol", + "type": "subscription_protocol", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'ws'" + }, + "websocket_subprotocol": { + "name": "websocket_subprotocol", + "type": "websocket_subprotocol", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'auto'" + }, + "schema_version_id": { + "name": "schema_version_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "target_id": { + "name": "target_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "is_feature_subgraph": { + "name": "is_feature_subgraph", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_event_driven_graph": { + "name": "is_event_driven_graph", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "type": { + "name": "type", + "type": "subgraph_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'standard'" + } + }, + "indexes": { + "subgraphs_target_id_idx": { + "name": "subgraphs_target_id_idx", + "columns": [ + { + "expression": "target_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "subgraphs_schema_version_id_idx": { + "name": "subgraphs_schema_version_id_idx", + "columns": [ + { + "expression": "schema_version_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "subgraphs_schema_version_id_schema_versions_id_fk": { + "name": "subgraphs_schema_version_id_schema_versions_id_fk", + "tableFrom": "subgraphs", + "tableTo": "schema_versions", + "columnsFrom": [ + "schema_version_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "subgraphs_target_id_targets_id_fk": { + "name": "subgraphs_target_id_targets_id_fk", + "tableFrom": "subgraphs", + "tableTo": "targets", + "columnsFrom": [ + "target_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.federated_subgraphs": { + "name": "federated_subgraphs", + "schema": "", + "columns": { + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "subgraph_id": { + "name": "subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "fs_federated_graph_id_idx": { + "name": "fs_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fs_subgraph_id_idx": { + "name": "fs_subgraph_id_idx", + "columns": [ + { + "expression": "subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "federated_subgraphs_federated_graph_id_federated_graphs_id_fk": { + "name": "federated_subgraphs_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "federated_subgraphs", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "federated_subgraphs_subgraph_id_subgraphs_id_fk": { + "name": "federated_subgraphs_subgraph_id_subgraphs_id_fk", + "tableFrom": "federated_subgraphs", + "tableTo": "subgraphs", + "columnsFrom": [ + "subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "federated_subgraphs_federated_graph_id_subgraph_id_pk": { + "name": "federated_subgraphs_federated_graph_id_subgraph_id_pk", + "columns": [ + "federated_graph_id", + "subgraph_id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.target_label_matchers": { + "name": "target_label_matchers", + "schema": "", + "columns": { + "target_id": { + "name": "target_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "label_matcher": { + "name": "label_matcher", + "type": "text[]", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "tlm_target_id_idx": { + "name": "tlm_target_id_idx", + "columns": [ + { + "expression": "target_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "target_label_matchers_target_id_targets_id_fk": { + "name": "target_label_matchers_target_id_targets_id_fk", + "tableFrom": "target_label_matchers", + "tableTo": "targets", + "columnsFrom": [ + "target_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.targets": { + "name": "targets", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "target_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "labels": { + "name": "labels", + "type": "text[]", + "primaryKey": false, + "notNull": false + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "created_by": { + "name": "created_by", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "readme": { + "name": "readme", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "namespace_id": { + "name": "namespace_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "organization_name_idx": { + "name": "organization_name_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "type", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "targets_organization_id_idx": { + "name": "targets_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "targets_created_by_idx": { + "name": "targets_created_by_idx", + "columns": [ + { + "expression": "created_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "targets_namespace_id_idx": { + "name": "targets_namespace_id_idx", + "columns": [ + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "targets_organization_id_organizations_id_fk": { + "name": "targets_organization_id_organizations_id_fk", + "tableFrom": "targets", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "targets_created_by_users_id_fk": { + "name": "targets_created_by_users_id_fk", + "tableFrom": "targets", + "tableTo": "users", + "columnsFrom": [ + "created_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "targets_namespace_id_namespaces_id_fk": { + "name": "targets_namespace_id_namespaces_id_fk", + "tableFrom": "targets", + "tableTo": "namespaces", + "columnsFrom": [ + "namespace_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "active": { + "name": "active", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_email_unique": { + "name": "users_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + }, + "checkConstraints": {} + }, + "public.webhook_deliveries": { + "name": "webhook_deliveries", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_by_id": { + "name": "created_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "webhook_delivery_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "endpoint": { + "name": "endpoint", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "event_name": { + "name": "event_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "payload": { + "name": "payload", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "request_headers": { + "name": "request_headers", + "type": "json", + "primaryKey": false, + "notNull": true + }, + "response_headers": { + "name": "response_headers", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "response_status_code": { + "name": "response_status_code", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "response_error_code": { + "name": "response_error_code", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "error_message": { + "name": "error_message", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "response_body": { + "name": "response_body", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "retry_count": { + "name": "retry_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "duration": { + "name": "duration", + "type": "real", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "original_delivery_id": { + "name": "original_delivery_id", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "webhd_organization_id_idx": { + "name": "webhd_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "webhd_created_by_id_idx": { + "name": "webhd_created_by_id_idx", + "columns": [ + { + "expression": "created_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "webhook_deliveries_created_by_id_users_id_fk": { + "name": "webhook_deliveries_created_by_id_users_id_fk", + "tableFrom": "webhook_deliveries", + "tableTo": "users", + "columnsFrom": [ + "created_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "webhook_deliveries_organization_id_organizations_id_fk": { + "name": "webhook_deliveries_organization_id_organizations_id_fk", + "tableFrom": "webhook_deliveries", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.webhook_graph_schema_update": { + "name": "webhook_graph_schema_update", + "schema": "", + "columns": { + "webhook_id": { + "name": "webhook_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "wgsu_webhook_id_idx": { + "name": "wgsu_webhook_id_idx", + "columns": [ + { + "expression": "webhook_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "wgsu_federated_graph_id_idx": { + "name": "wgsu_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "webhook_graph_schema_update_webhook_id_organization_webhook_configs_id_fk": { + "name": "webhook_graph_schema_update_webhook_id_organization_webhook_configs_id_fk", + "tableFrom": "webhook_graph_schema_update", + "tableTo": "organization_webhook_configs", + "columnsFrom": [ + "webhook_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "webhook_graph_schema_update_federated_graph_id_federated_graphs_id_fk": { + "name": "webhook_graph_schema_update_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "webhook_graph_schema_update", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "webhook_graph_schema_update_webhook_id_federated_graph_id_pk": { + "name": "webhook_graph_schema_update_webhook_id_federated_graph_id_pk", + "columns": [ + "webhook_id", + "federated_graph_id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.webhook_proposal_state_update": { + "name": "webhook_proposal_state_update", + "schema": "", + "columns": { + "webhook_id": { + "name": "webhook_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "wpsu_webhook_id_idx": { + "name": "wpsu_webhook_id_idx", + "columns": [ + { + "expression": "webhook_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "wpsu_federated_graph_id_idx": { + "name": "wpsu_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "webhook_proposal_state_update_webhook_id_organization_webhook_configs_id_fk": { + "name": "webhook_proposal_state_update_webhook_id_organization_webhook_configs_id_fk", + "tableFrom": "webhook_proposal_state_update", + "tableTo": "organization_webhook_configs", + "columnsFrom": [ + "webhook_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "webhook_proposal_state_update_federated_graph_id_federated_graphs_id_fk": { + "name": "webhook_proposal_state_update_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "webhook_proposal_state_update", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "webhook_proposal_state_update_webhook_id_federated_graph_id_pk": { + "name": "webhook_proposal_state_update_webhook_id_federated_graph_id_pk", + "columns": [ + "webhook_id", + "federated_graph_id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + } + }, + "enums": { + "public.batch_publish_job_status": { + "name": "batch_publish_job_status", + "schema": "public", + "values": [ + "pending", + "processing", + "failed", + "completed" + ] + }, + "public.git_installation_type": { + "name": "git_installation_type", + "schema": "public", + "values": [ + "PERSONAL", + "ORGANIZATION" + ] + }, + "public.graph_composition_subgraph_change_type": { + "name": "graph_composition_subgraph_change_type", + "schema": "public", + "values": [ + "added", + "removed", + "updated", + "unchanged" + ] + }, + "public.graph_pruning_rules": { + "name": "graph_pruning_rules", + "schema": "public", + "values": [ + "UNUSED_FIELDS", + "DEPRECATED_FIELDS", + "REQUIRE_DEPRECATION_BEFORE_DELETION" + ] + }, + "public.integration_type": { + "name": "integration_type", + "schema": "public", + "values": [ + "slack" + ] + }, + "public.lint_severity": { + "name": "lint_severity", + "schema": "public", + "values": [ + "warn", + "error" + ] + }, + "public.member_role": { + "name": "member_role", + "schema": "public", + "values": [ + "admin", + "developer", + "viewer" + ] + }, + "public.organization_role": { + "name": "organization_role", + "schema": "public", + "values": [ + "organization-admin", + "organization-developer", + "organization-viewer", + "organization-apikey-manager", + "namespace-admin", + "namespace-viewer", + "graph-admin", + "graph-viewer", + "subgraph-admin", + "subgraph-publisher", + "subgraph-checker", + "subgraph-viewer" + ] + }, + "public.playground_script_type": { + "name": "playground_script_type", + "schema": "public", + "values": [ + "pre-flight", + "pre-operation", + "post-operation" + ] + }, + "public.proposal_match": { + "name": "proposal_match", + "schema": "public", + "values": [ + "success", + "warn", + "error" + ] + }, + "public.proposal_origin": { + "name": "proposal_origin", + "schema": "public", + "values": [ + "INTERNAL", + "EXTERNAL" + ] + }, + "public.proposal_state": { + "name": "proposal_state", + "schema": "public", + "values": [ + "DRAFT", + "APPROVED", + "PUBLISHED", + "CLOSED" + ] + }, + "public.schema_change_type": { + "name": "schema_change_type", + "schema": "public", + "values": [ + "FIELD_ARGUMENT_DESCRIPTION_CHANGED", + "FIELD_ARGUMENT_DEFAULT_CHANGED", + "FIELD_ARGUMENT_TYPE_CHANGED", + "DIRECTIVE_REMOVED", + "DIRECTIVE_ADDED", + "DIRECTIVE_DESCRIPTION_CHANGED", + "DIRECTIVE_LOCATION_ADDED", + "DIRECTIVE_LOCATION_REMOVED", + "DIRECTIVE_ARGUMENT_ADDED", + "DIRECTIVE_ARGUMENT_REMOVED", + "DIRECTIVE_ARGUMENT_DESCRIPTION_CHANGED", + "DIRECTIVE_ARGUMENT_DEFAULT_VALUE_CHANGED", + "DIRECTIVE_ARGUMENT_TYPE_CHANGED", + "ENUM_VALUE_REMOVED", + "ENUM_VALUE_ADDED", + "ENUM_VALUE_DESCRIPTION_CHANGED", + "ENUM_VALUE_DEPRECATION_REASON_CHANGED", + "ENUM_VALUE_DEPRECATION_REASON_ADDED", + "ENUM_VALUE_DEPRECATION_REASON_REMOVED", + "FIELD_REMOVED", + "FIELD_ADDED", + "FIELD_DESCRIPTION_CHANGED", + "FIELD_DESCRIPTION_ADDED", + "FIELD_DESCRIPTION_REMOVED", + "FIELD_DEPRECATION_ADDED", + "FIELD_DEPRECATION_REMOVED", + "FIELD_DEPRECATION_REASON_CHANGED", + "FIELD_DEPRECATION_REASON_ADDED", + "FIELD_DEPRECATION_REASON_REMOVED", + "FIELD_TYPE_CHANGED", + "FIELD_ARGUMENT_ADDED", + "FIELD_ARGUMENT_REMOVED", + "INPUT_FIELD_REMOVED", + "INPUT_FIELD_ADDED", + "INPUT_FIELD_DESCRIPTION_ADDED", + "INPUT_FIELD_DESCRIPTION_REMOVED", + "INPUT_FIELD_DESCRIPTION_CHANGED", + "INPUT_FIELD_DEFAULT_VALUE_CHANGED", + "INPUT_FIELD_TYPE_CHANGED", + "OBJECT_TYPE_INTERFACE_ADDED", + "OBJECT_TYPE_INTERFACE_REMOVED", + "SCHEMA_QUERY_TYPE_CHANGED", + "SCHEMA_MUTATION_TYPE_CHANGED", + "SCHEMA_SUBSCRIPTION_TYPE_CHANGED", + "TYPE_REMOVED", + "TYPE_ADDED", + "TYPE_KIND_CHANGED", + "TYPE_DESCRIPTION_CHANGED", + "TYPE_DESCRIPTION_REMOVED", + "TYPE_DESCRIPTION_ADDED", + "UNION_MEMBER_REMOVED", + "UNION_MEMBER_ADDED", + "DIRECTIVE_USAGE_UNION_MEMBER_ADDED", + "DIRECTIVE_USAGE_UNION_MEMBER_REMOVED", + "DIRECTIVE_USAGE_ENUM_ADDED", + "DIRECTIVE_USAGE_ENUM_REMOVED", + "DIRECTIVE_USAGE_ENUM_VALUE_ADDED", + "DIRECTIVE_USAGE_ENUM_VALUE_REMOVED", + "DIRECTIVE_USAGE_INPUT_OBJECT_ADDED", + "DIRECTIVE_USAGE_INPUT_OBJECT_REMOVED", + "DIRECTIVE_USAGE_FIELD_ADDED", + "DIRECTIVE_USAGE_FIELD_REMOVED", + "DIRECTIVE_USAGE_SCALAR_ADDED", + "DIRECTIVE_USAGE_SCALAR_REMOVED", + "DIRECTIVE_USAGE_OBJECT_ADDED", + "DIRECTIVE_USAGE_OBJECT_REMOVED", + "DIRECTIVE_USAGE_INTERFACE_ADDED", + "DIRECTIVE_USAGE_INTERFACE_REMOVED", + "DIRECTIVE_USAGE_ARGUMENT_DEFINITION_ADDED", + "DIRECTIVE_USAGE_ARGUMENT_DEFINITION_REMOVED", + "DIRECTIVE_USAGE_SCHEMA_ADDED", + "DIRECTIVE_USAGE_SCHEMA_REMOVED", + "DIRECTIVE_USAGE_FIELD_DEFINITION_ADDED", + "DIRECTIVE_USAGE_FIELD_DEFINITION_REMOVED", + "DIRECTIVE_USAGE_INPUT_FIELD_DEFINITION_ADDED", + "DIRECTIVE_USAGE_INPUT_FIELD_DEFINITION_REMOVED" + ] + }, + "public.subgraph_type": { + "name": "subgraph_type", + "schema": "public", + "values": [ + "standard", + "grpc_plugin", + "grpc_service" + ] + }, + "public.subscription_protocol": { + "name": "subscription_protocol", + "schema": "public", + "values": [ + "ws", + "sse", + "sse_post" + ] + }, + "public.status": { + "name": "status", + "schema": "public", + "values": [ + "incomplete", + "incomplete_expired", + "trialing", + "active", + "past_due", + "canceled", + "unpaid", + "paused" + ] + }, + "public.target_type": { + "name": "target_type", + "schema": "public", + "values": [ + "federated", + "subgraph" + ] + }, + "public.webhook_delivery_type": { + "name": "webhook_delivery_type", + "schema": "public", + "values": [ + "webhook", + "slack", + "admission", + "check-extension" + ] + }, + "public.websocket_subprotocol": { + "name": "websocket_subprotocol", + "schema": "public", + "values": [ + "auto", + "graphql-ws", + "graphql-transport-ws" + ] + } + }, + "schemas": {}, + "sequences": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/controlplane/migrations/meta/_journal.json b/controlplane/migrations/meta/_journal.json index 5e52edb70d..7dd9a08912 100644 --- a/controlplane/migrations/meta/_journal.json +++ b/controlplane/migrations/meta/_journal.json @@ -1016,6 +1016,13 @@ "when": 1781883363831, "tag": "0144_jittery_master_chief", "breakpoints": true + }, + { + "idx": 145, + "version": "7", + "when": 1782491464388, + "tag": "0145_wild_lady_bullseye", + "breakpoints": true } ] } \ No newline at end of file diff --git a/controlplane/src/bin/cleanup-old-data.ts b/controlplane/src/bin/cleanup-old-data.ts index 0accb93833..025d86a7af 100644 --- a/controlplane/src/bin/cleanup-old-data.ts +++ b/controlplane/src/bin/cleanup-old-data.ts @@ -49,7 +49,7 @@ try { // Delete schema versions deleteStart = performance.now(); console.log(`Deleting schema versions created before ${CUTOFF_DATE.toDateString()}...`); - const [schemaVersionsDeleted, idsOfSchemaVersionsToKeep] = await deleteOldSchemaVersions(db); + const [schemaVersionsDeleted] = await deleteOldSchemaVersions(db); deleteDurationInSeconds = (performance.now() - deleteStart) / 1000; console.log(` ${schemaVersionsDeleted} schema versions deleted in ${deleteDurationInSeconds.toFixed(3)} seconds`); @@ -162,7 +162,7 @@ async function getFederatedGraphsFlags(db: PostgresJsDatabase) { .execute(); return [ - ...rows.map((row) => row.baseCompositionSchemaVersionId!), + ...rows.filter((row) => row.baseCompositionSchemaVersionId).map((row) => row.baseCompositionSchemaVersionId!), ...rows.map((row) => row.composedSchemaVersionId!), ]; } diff --git a/controlplane/src/core/composition/composer.ts b/controlplane/src/core/composition/composer.ts index 24f5d5c8f8..2abd89cbae 100644 --- a/controlplane/src/core/composition/composer.ts +++ b/controlplane/src/core/composition/composer.ts @@ -443,6 +443,7 @@ export class Composer { federatedSchemaVersionId, routerExecutionConfig, featureFlagId, + splitConfigEnabled, }: { composedGraph: ComposedFederatedGraph; composedById: string; @@ -450,6 +451,7 @@ export class Composer { federatedSchemaVersionId: UUID; routerExecutionConfig?: RouterConfig; featureFlagId: string; + splitConfigEnabled: boolean; }): Promise { const prevValidFederatedSDL = await this.federatedGraphRepo.getLatestValidSchemaVersion({ targetId: composedGraph.targetID, @@ -466,6 +468,7 @@ export class Composer { schemaVersionId: federatedSchemaVersionId, isFeatureFlagComposition, featureFlagId, + splitConfigEnabled, }); // If the composed schema is invalid, or it is a feature flag composition, we do not create a changelog diff --git a/controlplane/src/core/repositories/FederatedGraphRepository.ts b/controlplane/src/core/repositories/FederatedGraphRepository.ts index d3945cf86f..dd734d006b 100644 --- a/controlplane/src/core/repositories/FederatedGraphRepository.ts +++ b/controlplane/src/core/repositories/FederatedGraphRepository.ts @@ -696,6 +696,7 @@ export class FederatedGraphRepository { schemaVersionId, isFeatureFlagComposition, featureFlagId, + splitConfigEnabled, }: { targetId: string; schemaVersionId: string; @@ -707,6 +708,7 @@ export class FederatedGraphRepository { composedById: string; isFeatureFlagComposition: boolean; featureFlagId: string; + splitConfigEnabled: boolean; }) { return this.db.transaction(async (tx) => { const compositionRepo = new GraphCompositionRepository(this.logger, tx); @@ -759,7 +761,7 @@ export class FederatedGraphRepository { await tx.insert(federatedGraphsToFeatureFlagSchemaVersions).values({ composedSchemaVersionId: schemaVersionId, federatedGraphId: federatedGraph.id, - baseCompositionSchemaVersionId: federatedGraph.composedSchemaVersionId!, + baseCompositionSchemaVersionId: splitConfigEnabled ? null : federatedGraph.composedSchemaVersionId!, featureFlagId, }); } else { @@ -780,6 +782,7 @@ export class FederatedGraphRepository { compositionWarningString, composedById, isFeatureFlagComposition, + featureFlagId, routerCompatibilityVersion: federatedGraph.routerCompatibilityVersion, }); diff --git a/controlplane/src/core/repositories/GraphCompositionRepository.ts b/controlplane/src/core/repositories/GraphCompositionRepository.ts index b7a0ee50cb..473b422697 100644 --- a/controlplane/src/core/repositories/GraphCompositionRepository.ts +++ b/controlplane/src/core/repositories/GraphCompositionRepository.ts @@ -1,8 +1,16 @@ import { PostgresJsDatabase } from 'drizzle-orm/postgres-js'; -import { SQL, and, count, desc, eq, gt, lt, not } from 'drizzle-orm'; +import { SQL, and, count, desc, eq, gt, lt, not, inArray, or, isNull } from 'drizzle-orm'; import { FastifyBaseLogger } from 'fastify'; import * as schema from '../../db/schema.js'; -import { graphCompositions, graphCompositionSubgraphs, schemaVersion, subgraphs, users } from '../../db/schema.js'; +import { + featureFlags, + federatedGraphsToFeatureFlagSchemaVersions, + graphCompositions, + graphCompositionSubgraphs, + schemaVersion, + subgraphs, + users, +} from '../../db/schema.js'; import { DateRange, GraphCompositionDTO } from '../../types/index.js'; import { CompositionSubgraphRecord } from '../composition/composer.js'; import { traced } from '../tracing.js'; @@ -26,6 +34,7 @@ export class GraphCompositionRepository { admissionErrorString, deploymentErrorString, isFeatureFlagComposition, + featureFlagId, routerCompatibilityVersion, }: { fedGraphTargetId: string; @@ -38,6 +47,7 @@ export class GraphCompositionRepository { admissionErrorString?: string; deploymentErrorString?: string; isFeatureFlagComposition: boolean; + featureFlagId: string; routerCompatibilityVersion: string; }) { await this.db.transaction(async (tx) => { @@ -49,18 +59,51 @@ export class GraphCompositionRepository { } const subgraphSchemaVersionIds = composedSubgraphs.map((subgraph) => subgraph.schemaVersionId); - const previousComposition = ( - await tx - .select({ - id: graphCompositions.id, - }) - .from(graphCompositions) - .innerJoin(schemaVersion, eq(schemaVersion.id, graphCompositions.schemaVersionId)) - .where(eq(schemaVersion.targetId, fedGraphTargetId)) - .orderBy(desc(graphCompositions.createdAt)) - .limit(1) - .execute() - )[0]; + + let previousCompositionId: string | undefined; + if (isFeatureFlagComposition) { + previousCompositionId = ( + await tx + .select({ id: graphCompositions.id }) + .from(graphCompositions) + .innerJoin( + schemaVersion, + and( + eq(schemaVersion.targetId, fedGraphTargetId), + eq(schemaVersion.id, graphCompositions.schemaVersionId), + ), + ) + .innerJoin( + federatedGraphsToFeatureFlagSchemaVersions, + and( + eq(federatedGraphsToFeatureFlagSchemaVersions.featureFlagId, featureFlagId), + eq( + federatedGraphsToFeatureFlagSchemaVersions.composedSchemaVersionId, + graphCompositions.schemaVersionId, + ), + ), + ) + .where(eq(graphCompositions.isFeatureFlagComposition, true)) + .orderBy(desc(graphCompositions.createdAt)) + .limit(1) + .execute() + )[0]?.id; + } else { + previousCompositionId = ( + await tx + .select({ + id: graphCompositions.id, + }) + .from(graphCompositions) + .innerJoin(schemaVersion, eq(schemaVersion.id, graphCompositions.schemaVersionId)) + .where( + and(eq(schemaVersion.targetId, fedGraphTargetId), eq(graphCompositions.isFeatureFlagComposition, false)), + ) + .orderBy(desc(graphCompositions.createdAt)) + .limit(1) + .execute() + )[0]?.id; + } const insertedComposition = await tx .insert(graphCompositions) @@ -88,7 +131,7 @@ export class GraphCompositionRepository { targetId: string; isFeatureSubgraph: boolean; }[] = []; - if (previousComposition) { + if (previousCompositionId) { const prevSubgraphs = await tx .select({ id: graphCompositionSubgraphs.subgraphId, @@ -100,7 +143,7 @@ export class GraphCompositionRepository { .from(graphCompositionSubgraphs) .where( and( - eq(graphCompositionSubgraphs.graphCompositionId, previousComposition.id), + eq(graphCompositionSubgraphs.graphCompositionId, previousCompositionId), not(eq(graphCompositionSubgraphs.changeType, 'removed')), ), ) @@ -108,29 +151,28 @@ export class GraphCompositionRepository { prevCompositionSubgraphs.push(...prevSubgraphs); } - const addedSubgraphs = composedSubgraphs.filter( - (subgraph) => !prevCompositionSubgraphs.some((prevSubgraph) => prevSubgraph.id === subgraph.id), - ); + const addedSubgraphs: CompositionSubgraphRecord[] = []; + const updatedSubgraphs: CompositionSubgraphRecord[] = []; + const unchangedSubgraphs: CompositionSubgraphRecord[] = []; + for (const subgraph of composedSubgraphs) { + const prevSubgraph = prevCompositionSubgraphs.find((ps) => ps.id === subgraph.id); + if (!prevSubgraph) { + addedSubgraphs.push(subgraph); + continue; + } + + if (prevSubgraph.schemaVersionId !== subgraphSchemaVersionIds[composedSubgraphs.indexOf(subgraph)]) { + updatedSubgraphs.push(subgraph); + continue; + } + + unchangedSubgraphs.push(subgraph); + } + const removedSubgraphs = prevCompositionSubgraphs.filter( (subgraph) => !composedSubgraphs.some((prevSubgraph) => prevSubgraph.id === subgraph.id), ); - const updatedSubgraphs = composedSubgraphs.filter((subgraph) => { - const prevSubgraph = prevCompositionSubgraphs.find((prevSubgraph) => prevSubgraph.id === subgraph.id); - return ( - prevSubgraph && - prevSubgraph.schemaVersionId !== subgraphSchemaVersionIds[composedSubgraphs.indexOf(subgraph)] - ); - }); - - const unchangedSubgraphs = composedSubgraphs.filter((subgraph) => - prevCompositionSubgraphs.some( - (prevSubgraph) => - prevSubgraph.id === subgraph.id && - prevSubgraph.schemaVersionId === subgraphSchemaVersionIds[composedSubgraphs.indexOf(subgraph)], - ), - ); - const insertValues: (typeof graphCompositionSubgraphs.$inferInsert)[] = [ ...addedSubgraphs, ...updatedSubgraphs, @@ -204,6 +246,7 @@ export class GraphCompositionRepository { admissionError: graphCompositions.admissionError, deploymentError: graphCompositions.deploymentError, routerCompatibilityVersion: graphCompositions.routerCompatibilityVersion, + isFeatureFlagComposition: graphCompositions.isFeatureFlagComposition, }) .from(graphCompositions) .innerJoin(schemaVersion, eq(schemaVersion.id, graphCompositions.schemaVersionId)) @@ -217,12 +260,18 @@ export class GraphCompositionRepository { } const composition = compositions[0]; - - const isCurrentDeployed = await fedRepo.isLatestValidSchemaVersion( - composition.targetId, - composition.schemaVersionId, + const featureFlagNamesBySchemaVersionId = await this.getFeatureFlagBySchemaVersionIds( + composition.isFeatureFlagComposition ? [composition.schemaVersionId] : [], ); + const featureFlagInfo = featureFlagNamesBySchemaVersionId.get(composition.schemaVersionId); + const isCurrentDeployed = await this.isLatestValidComposition({ + fedGraphRepo: fedRepo, + targetId: composition.targetId, + featureFlagId: featureFlagInfo?.id, + composition, + }); + return { id: composition.id, schemaVersionId: composition.schemaVersionId, @@ -237,6 +286,8 @@ export class GraphCompositionRepository { admissionError: composition.admissionError || undefined, deploymentError: composition.deploymentError || undefined, routerCompatibilityVersion: composition.routerCompatibilityVersion, + isFeatureFlagComposition: composition.isFeatureFlagComposition, + featureFlagName: featureFlagInfo?.name, }; } @@ -260,6 +311,7 @@ export class GraphCompositionRepository { admissionError: graphCompositions.admissionError, deploymentError: graphCompositions.deploymentError, routerCompatibilityVersion: graphCompositions.routerCompatibilityVersion, + isFeatureFlagComposition: graphCompositions.isFeatureFlagComposition, }) .from(graphCompositions) .innerJoin(schemaVersion, eq(schemaVersion.id, graphCompositions.schemaVersionId)) @@ -278,12 +330,18 @@ export class GraphCompositionRepository { } const composition = compositions[0]; - - const isCurrentDeployed = await fedRepo.isLatestValidSchemaVersion( - composition.targetId, - composition.schemaVersionId, + const featureFlagNamesBySchemaVersionId = await this.getFeatureFlagBySchemaVersionIds( + composition.isFeatureFlagComposition ? [composition.schemaVersionId] : [], ); + const featureFlagInfo = featureFlagNamesBySchemaVersionId.get(composition.schemaVersionId); + const isCurrentDeployed = await this.isLatestValidComposition({ + fedGraphRepo: fedRepo, + targetId: composition.targetId, + featureFlagId: featureFlagInfo?.id, + composition, + }); + return { id: composition.id, schemaVersionId: composition.schemaVersionId, @@ -297,11 +355,13 @@ export class GraphCompositionRepository { admissionError: composition.admissionError || undefined, deploymentError: composition.deploymentError || undefined, routerCompatibilityVersion: composition.routerCompatibilityVersion, + isFeatureFlagComposition: composition.isFeatureFlagComposition, + featureFlagName: featureFlagInfo?.name, }; } - public async getCompositionSubgraphs(input: { compositionId: string }) { - const res = await this.db + public getCompositionSubgraphs(input: { compositionId: string }) { + return this.db .select({ id: graphCompositionSubgraphs.subgraphId, schemaVersionId: graphCompositionSubgraphs.schemaVersionId, @@ -315,8 +375,6 @@ export class GraphCompositionRepository { .innerJoin(subgraphs, eq(graphCompositionSubgraphs.subgraphId, subgraphs.id)) .where(eq(graphCompositionSubgraphs.graphCompositionId, input.compositionId)) .execute(); - - return res; } public async getGraphCompositions({ @@ -359,6 +417,7 @@ export class GraphCompositionRepository { admissionError: graphCompositions.admissionError, deploymentError: graphCompositions.deploymentError, routerCompatibilityVersion: graphCompositions.routerCompatibilityVersion, + isFeatureFlagComposition: graphCompositions.isFeatureFlagComposition, }) .from(graphCompositions) .innerJoin(schemaVersion, eq(schemaVersion.id, graphCompositions.schemaVersionId)) @@ -375,6 +434,9 @@ export class GraphCompositionRepository { } const resp = await dbQuery.execute(); + const featureFlagNamesBySchemaVersionId = await this.getFeatureFlagBySchemaVersionIds( + resp.filter((r) => r.isFeatureFlagComposition).map((r) => r.schemaVersionId), + ); const compositions: (GraphCompositionDTO & { hasMultipleChangedSubgraphs: boolean; @@ -382,9 +444,14 @@ export class GraphCompositionRepository { })[] = []; for (const r of resp) { - const isCurrentDeployed = await fedRepo.isLatestValidSchemaVersion(fedGraphTargetId, r.schemaVersionId); - const compositionSubgraphs = await this.getCompositionSubgraphs({ compositionId: r.id }); + const featureFlagInfo = featureFlagNamesBySchemaVersionId.get(r.schemaVersionId); + const isCurrentDeployed = await this.isLatestValidComposition({ + fedGraphRepo: fedRepo, + targetId: fedGraphTargetId, + featureFlagId: featureFlagInfo?.id, + composition: r, + }); compositions.push({ id: r.id, @@ -401,6 +468,8 @@ export class GraphCompositionRepository { hasMultipleChangedSubgraphs: compositionSubgraphs.filter((s) => s.changeType !== 'unchanged').length > 1, triggeredBySubgraphName: compositionSubgraphs.find((s) => s.changeType !== 'unchanged')?.name || '', routerCompatibilityVersion: r.routerCompatibilityVersion, + isFeatureFlagComposition: r.isFeatureFlagComposition, + featureFlagName: featureFlagInfo?.name, }); } @@ -442,4 +511,80 @@ export class GraphCompositionRepository { return compositionsCount[0].count; } + + private async isLatestValidComposition({ + fedGraphRepo, + targetId, + featureFlagId, + composition: { schemaVersionId, isFeatureFlagComposition }, + }: { + fedGraphRepo: FederatedGraphRepository; + targetId: string; + featureFlagId: string | undefined; + composition: { schemaVersionId: string; isFeatureFlagComposition: boolean }; + }) { + if (!isFeatureFlagComposition) { + return await fedGraphRepo.isLatestValidSchemaVersion(targetId, schemaVersionId); + } + + if (!featureFlagId) { + return false; + } + + const latestValidFeatureFlagVersion = await this.db + .select({ + id: schemaVersion.id, + }) + .from(schemaVersion) + .innerJoin(graphCompositions, eq(schemaVersion.id, graphCompositions.schemaVersionId)) + .innerJoin( + federatedGraphsToFeatureFlagSchemaVersions, + eq(federatedGraphsToFeatureFlagSchemaVersions.composedSchemaVersionId, schemaVersion.id), + ) + .where( + and( + eq(schemaVersion.targetId, targetId), + eq(federatedGraphsToFeatureFlagSchemaVersions.featureFlagId, featureFlagId), + eq(graphCompositions.isFeatureFlagComposition, true), + eq(graphCompositions.isComposable, true), + or(isNull(graphCompositions.deploymentError), eq(graphCompositions.deploymentError, '')), + or(isNull(graphCompositions.admissionError), eq(graphCompositions.admissionError, '')), + ), + ) + .orderBy(desc(schemaVersion.createdAt)) + .limit(1) + .execute(); + + return latestValidFeatureFlagVersion?.[0]?.id === schemaVersionId; + } + + private async getFeatureFlagBySchemaVersionIds( + composedSchemaVersionIds: string[], + ): Promise> { + const metaBySchemaVersionId = new Map(); + if (composedSchemaVersionIds.length === 0) { + return metaBySchemaVersionId; + } + + const rows = await this.db + .selectDistinct({ + composedSchemaVersionId: federatedGraphsToFeatureFlagSchemaVersions.composedSchemaVersionId, + featureFlagId: federatedGraphsToFeatureFlagSchemaVersions.featureFlagId, + featureFlagName: featureFlags.name, + }) + .from(federatedGraphsToFeatureFlagSchemaVersions) + .innerJoin(featureFlags, eq(featureFlags.id, federatedGraphsToFeatureFlagSchemaVersions.featureFlagId)) + .where(inArray(federatedGraphsToFeatureFlagSchemaVersions.composedSchemaVersionId, composedSchemaVersionIds)) + .execute(); + + for (const row of rows) { + if (!row.featureFlagId) { + continue; + } + + metaBySchemaVersionId.set(row.composedSchemaVersionId, { id: row.featureFlagId, name: row.featureFlagName }); + } + + return metaBySchemaVersionId; + } } diff --git a/controlplane/src/core/repositories/SubgraphRepository.ts b/controlplane/src/core/repositories/SubgraphRepository.ts index 981980fd8c..3148b55ce0 100644 --- a/controlplane/src/core/repositories/SubgraphRepository.ts +++ b/controlplane/src/core/repositories/SubgraphRepository.ts @@ -571,6 +571,7 @@ export class SubgraphRepository { const federatedGraphDTOs = await fedGraphRepo.bySubgraphLabels({ labels: baseSubgraph[0].labels?.map?.((l) => splitLabel(l)) ?? [], namespaceId: data.namespaceId, + excludeContracts: true, }); for (const federatedGraphDTO of federatedGraphDTOs) { diff --git a/controlplane/src/core/services/CompositionService.ts b/controlplane/src/core/services/CompositionService.ts index 07cf224b75..a9b847ae16 100644 --- a/controlplane/src/core/services/CompositionService.ts +++ b/controlplane/src/core/services/CompositionService.ts @@ -139,7 +139,7 @@ export class CompositionService { actorId, graphAndCompositionResults: [{ federatedGraph, results }], result, - splitConfig: true, + splitConfigEnabled: true, }); return result; @@ -273,7 +273,7 @@ export class CompositionService { graphAndCompositionResults, result, isFeatureFlagComposition: true, - splitConfig: true, + splitConfigEnabled: true, }); return result; @@ -456,6 +456,7 @@ export class CompositionService { composer, limit, touchedGraphIds, + splitConfigEnabled: true, }); } @@ -472,6 +473,7 @@ export class CompositionService { composer, limit, touchedGraphIds, + splitConfigEnabled: true, }); } @@ -617,6 +619,7 @@ export class CompositionService { composer, limit, touchedGraphIds, + splitConfigEnabled, }: { actorId: string; items: FederatedGraphAndCompositionResults[]; @@ -625,6 +628,7 @@ export class CompositionService { composer: Composer; limit: ReturnType; touchedGraphIds: Set; + splitConfigEnabled: boolean; }): Promise { const fedGraphRepo = new FederatedGraphRepository(this.logger, this.db, this.organizationId); const uploadTasks: Array<() => Promise> = []; @@ -644,6 +648,7 @@ export class CompositionService { result, composer, baseCompositionData, + splitConfigEnabled, }); if (baseCompositionFailed) { @@ -707,6 +712,7 @@ export class CompositionService { federatedSchemaVersionId: contractSchemaVersionId, routerExecutionConfig: contractRouterExecutionConfig, featureFlagId: compositionResult.featureFlagId, + splitConfigEnabled: true, }); if (!artifact.success || !contractComposition.schemaVersionId) { @@ -1173,6 +1179,7 @@ export class CompositionService { result, composer, baseCompositionData, + splitConfigEnabled, }: { actorId: string; federatedGraph: FederatedGraphDTO; @@ -1180,6 +1187,7 @@ export class CompositionService { result: ComposeAndDeployResult; composer: Composer; baseCompositionData: BaseCompositionData; + splitConfigEnabled: boolean; }): Promise<{ baseCompositionFailed: boolean; federatedSchemaVersionId: string; @@ -1236,6 +1244,7 @@ export class CompositionService { federatedSchemaVersionId, routerExecutionConfig, featureFlagId: compositionResult.featureFlagId, + splitConfigEnabled, }); if (!compositionResult.base.success || !baseComposition.schemaVersionId) { @@ -1290,13 +1299,13 @@ export class CompositionService { graphAndCompositionResults, result, isFeatureFlagComposition = false, - splitConfig = false, + splitConfigEnabled = false, }: { actorId: string; graphAndCompositionResults: FederatedGraphAndCompositionResults[]; result: ComposeAndDeployResult; isFeatureFlagComposition?: boolean; - splitConfig?: boolean; + splitConfigEnabled?: boolean; }): Promise { const fedGraphRepo = new FederatedGraphRepository(this.logger, this.db, this.organizationId); const composer = new Composer( @@ -1333,6 +1342,7 @@ export class CompositionService { result, composer, baseCompositionData, + splitConfigEnabled, }); if (baseCompositionFailed) { @@ -1397,6 +1407,7 @@ export class CompositionService { federatedSchemaVersionId: contractSchemaVersionId, routerExecutionConfig: contractRouterExecutionConfig, featureFlagId: compositionResult.featureFlagId, + splitConfigEnabled, }); if (!artifact.success || !contractComposition.schemaVersionId) { @@ -1482,11 +1493,11 @@ export class CompositionService { baseCompositionData.featureFlagRouterExecutionConfigByFeatureFlagName, composer, result, - splitConfig, + splitConfigEnabled, }); } - if (splitConfig) { + if (splitConfigEnabled) { await this.updateMapperForFederatedGraph(federatedGraph.id); } @@ -1508,10 +1519,10 @@ export class CompositionService { featureFlagRouterExecutionConfigByFeatureFlagName, composer, result, - splitConfig, + splitConfigEnabled, }); - if (splitConfig) { + if (splitConfigEnabled) { await this.updateMapperForFederatedGraph(contractDTO.id); } } @@ -1526,7 +1537,7 @@ export class CompositionService { featureFlagRouterExecutionConfigByFeatureFlagName, composer, result, - splitConfig, + splitConfigEnabled, }: { actorId: string; routerExecutionConfig: RouterConfig; @@ -1535,7 +1546,7 @@ export class CompositionService { featureFlagRouterExecutionConfigByFeatureFlagName: Map; composer: Composer; result: ComposeAndDeployResult; - splitConfig: boolean; + splitConfigEnabled: boolean; }) { const manifestBasePath = this.getManifestBasePath(graph.id); const readyPathOverride = this.getLatestPath(graph); @@ -1548,7 +1559,7 @@ export class CompositionService { baseCompositionRouterExecutionConfig: routerExecutionConfig, baseCompositionSchemaVersionId: schemaVersionId, blobStorage: this.blobStorage, - featureFlagRouterExecutionConfigByFeatureFlagName: splitConfig + featureFlagRouterExecutionConfigByFeatureFlagName: splitConfigEnabled ? new Map() // Do not populate feature flags when the router config is being split : featureFlagRouterExecutionConfigByFeatureFlagName, federatedGraphId: graph.id, @@ -1556,7 +1567,7 @@ export class CompositionService { federatedGraphAdmissionWebhookURL: graph.admissionWebhookURL, federatedGraphAdmissionWebhookSecret: graph.admissionWebhookSecret, actorId, - pathOverride: splitConfig + pathOverride: splitConfigEnabled ? { ready: `${manifestBasePath}/${readyPathOverride}`, draft: `${manifestBasePath}/draft.json`, @@ -1564,7 +1575,7 @@ export class CompositionService { : undefined, }); - if (splitConfig) { + if (splitConfigEnabled) { await this.saveRouterConfigHash(graph.id, undefined, routerExecutionConfig); } @@ -1585,7 +1596,7 @@ export class CompositionService { }); } - if (splitConfig && featureFlagRouterExecutionConfigByFeatureFlagName.size > 0) { + if (splitConfigEnabled && featureFlagRouterExecutionConfigByFeatureFlagName.size > 0) { await this.deployFeatureFlags( actorId, graph, diff --git a/controlplane/src/db/schema.ts b/controlplane/src/db/schema.ts index a21f9a6a20..d79805983f 100644 --- a/controlplane/src/db/schema.ts +++ b/controlplane/src/db/schema.ts @@ -389,11 +389,9 @@ export const federatedGraphsToFeatureFlagSchemaVersions = pgTable( .references(() => federatedGraphs.id, { onDelete: 'cascade', }), - baseCompositionSchemaVersionId: uuid('base_composition_schema_version_id') - .notNull() - .references(() => schemaVersion.id, { - onDelete: 'cascade', - }), + baseCompositionSchemaVersionId: uuid('base_composition_schema_version_id').references(() => schemaVersion.id, { + onDelete: 'cascade', + }), composedSchemaVersionId: uuid('composed_schema_version_id') .notNull() .references(() => schemaVersion.id, { @@ -405,7 +403,12 @@ export const federatedGraphsToFeatureFlagSchemaVersions = pgTable( }, (t) => { return { - pk: primaryKey({ columns: [t.federatedGraphId, t.baseCompositionSchemaVersionId, t.composedSchemaVersionId] }), + pk: primaryKey({ columns: [t.federatedGraphId, t.composedSchemaVersionId] }), + compositeIdx: index('fgffsv_composite_idx').on( + t.federatedGraphId, + t.baseCompositionSchemaVersionId, + t.composedSchemaVersionId, + ), federatedGraphIdIndex: index('fgffsv_federated_graph_id_idx').on(t.federatedGraphId), baseCompositionSchemaVersionIdIndex: index('fgffsv_base_composition_schema_version_id_idx').on( t.baseCompositionSchemaVersionId, diff --git a/controlplane/src/types/index.ts b/controlplane/src/types/index.ts index bff1ab04e0..84e62bf9a9 100644 --- a/controlplane/src/types/index.ts +++ b/controlplane/src/types/index.ts @@ -633,6 +633,8 @@ export interface GraphCompositionDTO { admissionError?: string; deploymentError?: string; routerCompatibilityVersion: string; + isFeatureFlagComposition: boolean; + featureFlagName?: string; } export interface FeatureFlagCompositionDTO { diff --git a/proto/wg/cosmo/platform/v1/platform.proto b/proto/wg/cosmo/platform/v1/platform.proto index fb1f6baffd..c9e508364d 100644 --- a/proto/wg/cosmo/platform/v1/platform.proto +++ b/proto/wg/cosmo/platform/v1/platform.proto @@ -2066,6 +2066,8 @@ message GraphComposition { optional string triggeredBySubgraphName = 12; optional string compositionWarnings = 13; string router_compatibility_version = 14; + bool isFeatureFlagComposition = 15; + optional string featureFlagName = 16; } message GraphCompositionSubgraph { diff --git a/studio/src/pages/[organizationSlug]/[namespace]/graph/[slug]/compositions/[compositionId]/index.tsx b/studio/src/pages/[organizationSlug]/[namespace]/graph/[slug]/compositions/[compositionId]/index.tsx index 9c186a689f..256f5f7157 100644 --- a/studio/src/pages/[organizationSlug]/[namespace]/graph/[slug]/compositions/[compositionId]/index.tsx +++ b/studio/src/pages/[organizationSlug]/[namespace]/graph/[slug]/compositions/[compositionId]/index.tsx @@ -627,6 +627,7 @@ const CompositionDetailsPage: NextPageWithLayout = () => { ); const { composition, changeCounts, compositionSubgraphs, featureFlagCompositions } = data; + const isFeatureFlagComposition = composition.isFeatureFlagComposition; return ( { composition={composition} changeCounts={changeCounts} compositionSubgraphs={compositionSubgraphs} - featureFlagCompositions={featureFlagCompositions} - isFeatureFlagComposition={false} + featureFlagCompositions={isFeatureFlagComposition ? undefined : featureFlagCompositions} + isFeatureFlagComposition={isFeatureFlagComposition} /> ); diff --git a/studio/src/pages/[organizationSlug]/[namespace]/graph/[slug]/compositions/index.tsx b/studio/src/pages/[organizationSlug]/[namespace]/graph/[slug]/compositions/index.tsx index 6884ace94e..6ac4562b72 100644 --- a/studio/src/pages/[organizationSlug]/[namespace]/graph/[slug]/compositions/index.tsx +++ b/studio/src/pages/[organizationSlug]/[namespace]/graph/[slug]/compositions/index.tsx @@ -26,6 +26,7 @@ import Link from 'next/link'; import { useRouter } from 'next/router'; import { MdNearbyError, MdVerifiedUser } from 'react-icons/md'; import { useWorkspace } from '@/hooks/use-workspace'; +import { useFeature } from '@/hooks/use-feature'; const CompositionsPage: NextPageWithLayout = () => { const router = useRouter(); @@ -41,6 +42,7 @@ const CompositionsPage: NextPageWithLayout = () => { range, } = useDateRangeQueryState(); + const splitConfigLoadingEnabled = useFeature('split-config-loading')?.enabled ?? false; const startDate = range ? createDateRange(range).start : start; const endDate = range ? createDateRange(range).end : end; @@ -53,7 +55,7 @@ const CompositionsPage: NextPageWithLayout = () => { offset: (pageNumber - 1) * limit, startDate: formatISO(startDate), endDate: formatISO(endDate), - excludeFeatureFlagCompositions: true, + excludeFeatureFlagCompositions: !splitConfigLoadingEnabled, }, { placeholderData: (prev) => prev, @@ -81,6 +83,7 @@ const CompositionsPage: NextPageWithLayout = () => { Id + {splitConfigLoadingEnabled && Feature Flag} Triggered By Subgraph Actor @@ -106,9 +109,10 @@ const CompositionsPage: NextPageWithLayout = () => { isLatestValid, admissionError, routerConfigSignature, - deploymentError, hasMultipleChangedSubgraphs, triggeredBySubgraphName, + isFeatureFlagComposition, + featureFlagName, }) => { const path = `${router.asPath.split('?')[0]}/${id}`; return ( @@ -134,6 +138,17 @@ const CompositionsPage: NextPageWithLayout = () => { + {splitConfigLoadingEnabled && ( + + {isFeatureFlagComposition && featureFlagName ? ( + + {featureFlagName} + + ) : ( + '—' + )} + + )} { ) ) : ( - + No results. From b3c32ccc67df81a6effdbf0377dd1e48271837e7 Mon Sep 17 00:00:00 2001 From: Wilson Rivera Date: Tue, 30 Jun 2026 13:52:15 -0400 Subject: [PATCH 02/15] chore: prevent rendering feature flags for feature flag compositions --- .../graph/[slug]/compositions/[compositionId]/index.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/studio/src/pages/[organizationSlug]/[namespace]/graph/[slug]/compositions/[compositionId]/index.tsx b/studio/src/pages/[organizationSlug]/[namespace]/graph/[slug]/compositions/[compositionId]/index.tsx index 256f5f7157..b146b39823 100644 --- a/studio/src/pages/[organizationSlug]/[namespace]/graph/[slug]/compositions/[compositionId]/index.tsx +++ b/studio/src/pages/[organizationSlug]/[namespace]/graph/[slug]/compositions/[compositionId]/index.tsx @@ -206,9 +206,11 @@ export const CompositionDetails = ({ } = useWorkspace(); const slug = router.query.slug as string; const id = router.query.compositionId as string; - const tab = router.query.tab as string; const subgraph = router.query.subgraph as string; + let tab = router.query.tab as string; + tab = isFeatureFlagComposition && tab === 'ffCompostions' ? 'output' : tab; + const graphData = useContext(GraphContext); const [schemaType, setSchemaType] = useState<'router' | 'client'>('client'); @@ -427,7 +429,7 @@ export const CompositionDetails = ({ Composition Warnings - {featureFlagCompositions && ( + {featureFlagCompositions && !isFeatureFlagComposition && ( Date: Tue, 30 Jun 2026 14:40:15 -0400 Subject: [PATCH 03/15] chore: `getCompositionSubgraphs` can now include feature subgraphs --- .../federated-graph/getCompositionDetails.ts | 3 +- .../GraphCompositionRepository.ts | 44 +++++++++++++++++-- .../graph/[slug]/compositions/index.tsx | 8 ++-- 3 files changed, 46 insertions(+), 9 deletions(-) diff --git a/controlplane/src/core/bufservices/federated-graph/getCompositionDetails.ts b/controlplane/src/core/bufservices/federated-graph/getCompositionDetails.ts index fda3ad03ad..a2cb21a24f 100644 --- a/controlplane/src/core/bufservices/federated-graph/getCompositionDetails.ts +++ b/controlplane/src/core/bufservices/federated-graph/getCompositionDetails.ts @@ -66,7 +66,8 @@ export function getCompositionDetails( } const compositionSubgraphs = await compositionRepo.getCompositionSubgraphs({ - compositionId: req.compositionId, + compositionId: composition.id, + schemaVersionId: composition.schemaVersionId, }); const changelogs = await fedRepo.fetchChangelogByVersion({ diff --git a/controlplane/src/core/repositories/GraphCompositionRepository.ts b/controlplane/src/core/repositories/GraphCompositionRepository.ts index 473b422697..7be2c883da 100644 --- a/controlplane/src/core/repositories/GraphCompositionRepository.ts +++ b/controlplane/src/core/repositories/GraphCompositionRepository.ts @@ -360,8 +360,12 @@ export class GraphCompositionRepository { }; } - public getCompositionSubgraphs(input: { compositionId: string }) { - return this.db + public async getCompositionSubgraphs(input: { + compositionId: string; + schemaVersionId: string; + includeChildCompositionSubgraphs?: boolean; + }) { + const compositionSubgraphs = await this.db .select({ id: graphCompositionSubgraphs.subgraphId, schemaVersionId: graphCompositionSubgraphs.schemaVersionId, @@ -375,6 +379,35 @@ export class GraphCompositionRepository { .innerJoin(subgraphs, eq(graphCompositionSubgraphs.subgraphId, subgraphs.id)) .where(eq(graphCompositionSubgraphs.graphCompositionId, input.compositionId)) .execute(); + + if (!input.includeChildCompositionSubgraphs) { + return compositionSubgraphs; + } + + const childCompositionSubgraphs = await this.db + .select({ + id: graphCompositionSubgraphs.subgraphId, + schemaVersionId: graphCompositionSubgraphs.schemaVersionId, + name: graphCompositionSubgraphs.subgraphName, + targetId: graphCompositionSubgraphs.subgraphTargetId, + isFeatureSubgraph: graphCompositionSubgraphs.isFeatureSubgraph, + changeType: graphCompositionSubgraphs.changeType, + subgraphType: subgraphs.type, + }) + .from(graphCompositionSubgraphs) + .innerJoin( + subgraphs, + and(eq(graphCompositionSubgraphs.subgraphId, subgraphs.id), eq(subgraphs.isFeatureSubgraph, true)), + ) + .innerJoin(graphCompositions, eq(graphCompositions.id, graphCompositionSubgraphs.graphCompositionId)) + .innerJoin( + federatedGraphsToFeatureFlagSchemaVersions, + eq(federatedGraphsToFeatureFlagSchemaVersions.composedSchemaVersionId, graphCompositions.schemaVersionId), + ) + .where(eq(federatedGraphsToFeatureFlagSchemaVersions.baseCompositionSchemaVersionId, input.schemaVersionId)) + .execute(); + + return [...compositionSubgraphs, ...childCompositionSubgraphs]; } public async getGraphCompositions({ @@ -444,7 +477,12 @@ export class GraphCompositionRepository { })[] = []; for (const r of resp) { - const compositionSubgraphs = await this.getCompositionSubgraphs({ compositionId: r.id }); + const compositionSubgraphs = await this.getCompositionSubgraphs({ + compositionId: r.id, + schemaVersionId: r.schemaVersionId, + includeChildCompositionSubgraphs: !r.isFeatureFlagComposition, + }); + const featureFlagInfo = featureFlagNamesBySchemaVersionId.get(r.schemaVersionId); const isCurrentDeployed = await this.isLatestValidComposition({ fedGraphRepo: fedRepo, diff --git a/studio/src/pages/[organizationSlug]/[namespace]/graph/[slug]/compositions/index.tsx b/studio/src/pages/[organizationSlug]/[namespace]/graph/[slug]/compositions/index.tsx index 6ac4562b72..8a617f0603 100644 --- a/studio/src/pages/[organizationSlug]/[namespace]/graph/[slug]/compositions/index.tsx +++ b/studio/src/pages/[organizationSlug]/[namespace]/graph/[slug]/compositions/index.tsx @@ -141,11 +141,9 @@ const CompositionsPage: NextPageWithLayout = () => { {splitConfigLoadingEnabled && ( {isFeatureFlagComposition && featureFlagName ? ( - - {featureFlagName} - + <>{featureFlagName} ) : ( - '—' + '-' )} )} @@ -154,7 +152,7 @@ const CompositionsPage: NextPageWithLayout = () => { italic: hasMultipleChangedSubgraphs, })} > - {hasMultipleChangedSubgraphs ? 'Multiple Subgraphs' : triggeredBySubgraphName} + {hasMultipleChangedSubgraphs ? 'Multiple Subgraphs' : triggeredBySubgraphName || '-'} {createdBy} From 6b60575721e2c1cff7655729728967327bad0401 Mon Sep 17 00:00:00 2001 From: Wilson Rivera Date: Tue, 30 Jun 2026 15:54:41 -0400 Subject: [PATCH 04/15] chore: take into account split config when retrieving the last feature flag schema --- .../core/repositories/FeatureFlagRepository.ts | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/controlplane/src/core/repositories/FeatureFlagRepository.ts b/controlplane/src/core/repositories/FeatureFlagRepository.ts index fedda0d486..57aef1f3c3 100644 --- a/controlplane/src/core/repositories/FeatureFlagRepository.ts +++ b/controlplane/src/core/repositories/FeatureFlagRepository.ts @@ -37,6 +37,7 @@ import { traced } from '../tracing.js'; import { FederatedGraphRepository } from './FederatedGraphRepository.js'; import { SubgraphRepository } from './SubgraphRepository.js'; import { UserRepository } from './UserRepository.js'; +import { OrganizationRepository } from './OrganizationRepository.js'; export interface FeatureFlagWithFeatureSubgraphs { id: string; @@ -1377,6 +1378,12 @@ export class FeatureFlagRepository { baseSchemaVersionId: string; featureFlagId: string; }) { + const orgRepo = new OrganizationRepository(this.logger, this.db); + const splitConfigFeature = await orgRepo.getFeature({ + organizationId: this.organizationId, + featureId: 'split-config-loading', + }); + const schemaVersions = await this.db .select({ id: federatedGraphsToFeatureFlagSchemaVersions.composedSchemaVersionId, @@ -1387,10 +1394,12 @@ export class FeatureFlagRepository { eq(schemaVersion.id, federatedGraphsToFeatureFlagSchemaVersions.composedSchemaVersionId), ) .where( - and( - eq(federatedGraphsToFeatureFlagSchemaVersions.baseCompositionSchemaVersionId, baseSchemaVersionId), - eq(federatedGraphsToFeatureFlagSchemaVersions.featureFlagId, featureFlagId), - ), + splitConfigFeature?.enabled + ? eq(federatedGraphsToFeatureFlagSchemaVersions.featureFlagId, featureFlagId) + : and( + eq(federatedGraphsToFeatureFlagSchemaVersions.baseCompositionSchemaVersionId, baseSchemaVersionId), + eq(federatedGraphsToFeatureFlagSchemaVersions.featureFlagId, featureFlagId), + ), ) .orderBy(desc(schemaVersion.createdAt)) .limit(1) From edccc3ccd77e7e6a6f8cf116ad97fd11307e9f72 Mon Sep 17 00:00:00 2001 From: Wilson Rivera Date: Tue, 30 Jun 2026 15:55:03 -0400 Subject: [PATCH 05/15] chore: fix test --- ...est-composition-by-federated-graph.test.ts | 28 +++++++------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/controlplane/test/feature-flag/get-feature-flags-in-latest-composition-by-federated-graph.test.ts b/controlplane/test/feature-flag/get-feature-flags-in-latest-composition-by-federated-graph.test.ts index fb925a7e73..d235d67bf9 100644 --- a/controlplane/test/feature-flag/get-feature-flags-in-latest-composition-by-federated-graph.test.ts +++ b/controlplane/test/feature-flag/get-feature-flags-in-latest-composition-by-federated-graph.test.ts @@ -68,7 +68,7 @@ describe('GetFeatureFlagsInLatestCompositionByFederatedGraph', () => { expect(resp.featureFlags.some((f) => f.name === flagName)).toBe(true); }); - test('Should return each feature flag only once when it has multiple compositions against the same base', async (testContext) => { + test('that feature flag compositions are decoupled when split config loading is enabled', async (testContext) => { const { client, server } = await SetupTest({ dbname, enabledFeatures: ['split-config-loading'] }); testContext.onTestFinished(() => server.close()); @@ -115,9 +115,7 @@ describe('GetFeatureFlagsInLatestCompositionByFederatedGraph', () => { }); expect(resp.response?.code).toBe(EnumStatusCode.OK); - // Despite multiple accumulated composition rows, the flag must appear exactly once. - expect(resp.featureFlags).toStrictEqual(expect.arrayContaining([expect.objectContaining({ name: flagName })])); - expect(resp.featureFlags).toHaveLength(1); + expect(resp.featureFlags).toHaveLength(0); // Create a second, enabled feature flag. It is composed into the latest composition, so it shows up too. const secondFlagName = genID('flag'); @@ -128,25 +126,19 @@ describe('GetFeatureFlagsInLatestCompositionByFederatedGraph', () => { namespace: 'default', }); expect(withSecondFlag.response?.code).toBe(EnumStatusCode.OK); - expect(withSecondFlag.featureFlags).toStrictEqual( + expect(withSecondFlag.featureFlags).toHaveLength(0); + + // Feature flag compositions should show up in the composition list + const compositionsResp = await client.getCompositions({}); + + expect(compositionsResp.response?.code).toBe(EnumStatusCode.OK); + expect(compositionsResp.compositions).toHaveLength(3); + expect(compositionsResp.compositions).toStrictEqual( expect.arrayContaining([ expect.objectContaining({ name: flagName }), expect.objectContaining({ name: secondFlagName }), ]), ); - expect(withSecondFlag.featureFlags).toHaveLength(2); - - await toggleFeatureFlag(client, secondFlagName, false, 'default'); - - const afterDisable = await client.getFeatureFlagsInLatestCompositionByFederatedGraph({ - federatedGraphName, - namespace: 'default', - }); - expect(afterDisable.response?.code).toBe(EnumStatusCode.OK); - expect(afterDisable.featureFlags).toHaveLength(1); - expect(afterDisable.featureFlags).toStrictEqual( - expect.arrayContaining([expect.objectContaining({ name: flagName })]), - ); }); test('Should return empty list when no feature flags exist', async (testContext) => { From 7a8396ba7e077e0fbd04dd3bb8a2fee4cee1275d Mon Sep 17 00:00:00 2001 From: Wilson Rivera Date: Tue, 30 Jun 2026 16:23:05 -0400 Subject: [PATCH 06/15] chore: linting --- .../[namespace]/graph/[slug]/compositions/index.tsx | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/studio/src/pages/[organizationSlug]/[namespace]/graph/[slug]/compositions/index.tsx b/studio/src/pages/[organizationSlug]/[namespace]/graph/[slug]/compositions/index.tsx index 8a617f0603..1986e3f9c0 100644 --- a/studio/src/pages/[organizationSlug]/[namespace]/graph/[slug]/compositions/index.tsx +++ b/studio/src/pages/[organizationSlug]/[namespace]/graph/[slug]/compositions/index.tsx @@ -140,11 +140,7 @@ const CompositionsPage: NextPageWithLayout = () => { {splitConfigLoadingEnabled && ( - {isFeatureFlagComposition && featureFlagName ? ( - <>{featureFlagName} - ) : ( - '-' - )} + {isFeatureFlagComposition && featureFlagName ? <>{featureFlagName} : '-'} )} Date: Tue, 30 Jun 2026 16:32:12 -0400 Subject: [PATCH 07/15] chore: fix test --- ...est-composition-by-federated-graph.test.ts | 55 ++++++++++++++----- 1 file changed, 40 insertions(+), 15 deletions(-) diff --git a/controlplane/test/feature-flag/get-feature-flags-in-latest-composition-by-federated-graph.test.ts b/controlplane/test/feature-flag/get-feature-flags-in-latest-composition-by-federated-graph.test.ts index d235d67bf9..68e30aa828 100644 --- a/controlplane/test/feature-flag/get-feature-flags-in-latest-composition-by-federated-graph.test.ts +++ b/controlplane/test/feature-flag/get-feature-flags-in-latest-composition-by-federated-graph.test.ts @@ -1,18 +1,18 @@ import fs from 'node:fs'; import { join } from 'node:path'; import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb'; -import { formatISO } from 'date-fns'; +import { addMinutes, formatISO, subDays } from 'date-fns'; import { afterAll, beforeAll, describe, expect, test } from 'vitest'; import { afterAllSetup, beforeAllSetup, genID, genUniqueLabel } from '../../src/core/test-util.js'; import { createAndPublishSubgraph, createFeatureFlag, createFederatedGraph, + createNamespace, createThenPublishFeatureSubgraph, DEFAULT_ROUTER_URL, DEFAULT_SUBGRAPH_URL_ONE, SetupTest, - toggleFeatureFlag, } from '../test-util.js'; let dbname = ''; @@ -72,13 +72,16 @@ describe('GetFeatureFlagsInLatestCompositionByFederatedGraph', () => { const { client, server } = await SetupTest({ dbname, enabledFeatures: ['split-config-loading'] }); testContext.onTestFinished(() => server.close()); + const namespace = genID('namespace').toLowerCase(); const labels = [genUniqueLabel()]; const federatedGraphName = genID('fedGraph'); + await createNamespace(client, namespace); + await createAndPublishSubgraph( client, 'users', - 'default', + namespace, fs.readFileSync(join(process.cwd(), 'test/test-data/feature-flags/users.graphql')).toString(), labels, DEFAULT_SUBGRAPH_URL_ONE, @@ -88,30 +91,30 @@ describe('GetFeatureFlagsInLatestCompositionByFederatedGraph', () => { client, 'users-feature', 'users', - 'default', + namespace, fs.readFileSync(join(process.cwd(), 'test/test-data/feature-flags/users-feature.graphql')).toString(), labels, 'http://localhost:4101', ); const federatedGraphLabels = labels.map(({ key, value }) => `${key}=${value}`); - await createFederatedGraph(client, federatedGraphName, 'default', federatedGraphLabels, DEFAULT_ROUTER_URL); + await createFederatedGraph(client, federatedGraphName, namespace, federatedGraphLabels, DEFAULT_ROUTER_URL); const flagName = genID('flag'); - await createFeatureFlag(client, flagName, labels, ['users-feature'], 'default', true); + await createFeatureFlag(client, flagName, labels, ['users-feature'], namespace, true); // recomposeFeatureFlag recomposes only the feature flag against the existing base composition (the base // schema version is unchanged). Each call creates another feature flag composition for the same\ // (base composition, feature flag) pair, which is the source of the duplicates in the dropdown. - const recomposeResp1 = await client.recomposeFeatureFlag({ name: flagName, namespace: 'default' }); + const recomposeResp1 = await client.recomposeFeatureFlag({ name: flagName, namespace }); expect(recomposeResp1.response?.code).toBe(EnumStatusCode.OK); - const recomposeResp2 = await client.recomposeFeatureFlag({ name: flagName, namespace: 'default' }); + const recomposeResp2 = await client.recomposeFeatureFlag({ name: flagName, namespace }); expect(recomposeResp2.response?.code).toBe(EnumStatusCode.OK); const resp = await client.getFeatureFlagsInLatestCompositionByFederatedGraph({ federatedGraphName, - namespace: 'default', + namespace, }); expect(resp.response?.code).toBe(EnumStatusCode.OK); @@ -119,24 +122,46 @@ describe('GetFeatureFlagsInLatestCompositionByFederatedGraph', () => { // Create a second, enabled feature flag. It is composed into the latest composition, so it shows up too. const secondFlagName = genID('flag'); - await createFeatureFlag(client, secondFlagName, labels, ['users-feature'], 'default', true); + await createFeatureFlag(client, secondFlagName, labels, ['users-feature'], namespace, true); const withSecondFlag = await client.getFeatureFlagsInLatestCompositionByFederatedGraph({ federatedGraphName, - namespace: 'default', + namespace, }); expect(withSecondFlag.response?.code).toBe(EnumStatusCode.OK); expect(withSecondFlag.featureFlags).toHaveLength(0); + // Only the base graph composition should show up when excluding feature flag compositions + let compositionsResp = await client.getCompositions({ + fedGraphName: federatedGraphName, + namespace, + startDate: formatISO(subDays(new Date(), 1)), + endDate: formatISO(addMinutes(new Date(), 1)), + excludeFeatureFlagCompositions: true, + }); + + expect(compositionsResp.response?.code).toBe(EnumStatusCode.OK); + expect(compositionsResp.compositions).toHaveLength(1); + expect(compositionsResp.compositions).toStrictEqual( + expect.arrayContaining([expect.objectContaining({ isFeatureFlagComposition: false })]), + ); + // Feature flag compositions should show up in the composition list - const compositionsResp = await client.getCompositions({}); + compositionsResp = await client.getCompositions({ + fedGraphName: federatedGraphName, + namespace, + startDate: formatISO(subDays(new Date(), 1)), + endDate: formatISO(addMinutes(new Date(), 1)), + }); expect(compositionsResp.response?.code).toBe(EnumStatusCode.OK); - expect(compositionsResp.compositions).toHaveLength(3); + expect(compositionsResp.compositions).toHaveLength(5); expect(compositionsResp.compositions).toStrictEqual( expect.arrayContaining([ - expect.objectContaining({ name: flagName }), - expect.objectContaining({ name: secondFlagName }), + expect.objectContaining({ featureFlagName: flagName, isFeatureFlagComposition: true }), + expect.objectContaining({ featureFlagName: flagName, isFeatureFlagComposition: true }), + expect.objectContaining({ featureFlagName: flagName, isFeatureFlagComposition: true }), + expect.objectContaining({ featureFlagName: secondFlagName, isFeatureFlagComposition: true }), ]), ); }); From 488d72c5d11176bb042e2c75f80c6b71ce265c63 Mon Sep 17 00:00:00 2001 From: Wilson Rivera Date: Tue, 30 Jun 2026 16:51:13 -0400 Subject: [PATCH 08/15] chore: improve queries --- .../src/core/repositories/FeatureFlagRepository.ts | 11 +++++++++-- .../core/repositories/GraphCompositionRepository.ts | 8 +++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/controlplane/src/core/repositories/FeatureFlagRepository.ts b/controlplane/src/core/repositories/FeatureFlagRepository.ts index 57aef1f3c3..fcfe78fd39 100644 --- a/controlplane/src/core/repositories/FeatureFlagRepository.ts +++ b/controlplane/src/core/repositories/FeatureFlagRepository.ts @@ -1,6 +1,6 @@ import { Subgraph } from '@wundergraph/composition'; import { joinLabel, splitLabel } from '@wundergraph/cosmo-shared'; -import { SQL, and, asc, count, desc, eq, inArray, like, or, sql, arrayOverlaps } from 'drizzle-orm'; +import { SQL, and, asc, count, desc, eq, inArray, like, or, sql, arrayOverlaps, isNull } from 'drizzle-orm'; import { PostgresJsDatabase } from 'drizzle-orm/postgres-js'; import { FastifyBaseLogger } from 'fastify'; import { validate as isValidUuid } from 'uuid'; @@ -1394,8 +1394,15 @@ export class FeatureFlagRepository { eq(schemaVersion.id, federatedGraphsToFeatureFlagSchemaVersions.composedSchemaVersionId), ) .where( + /** + * When split config is enabled, the feature flag composition will not be tied to the base schema version, so + * we need to check that the baseCompositionSchemaVersionId is null + */ splitConfigFeature?.enabled - ? eq(federatedGraphsToFeatureFlagSchemaVersions.featureFlagId, featureFlagId) + ? and( + isNull(federatedGraphsToFeatureFlagSchemaVersions.baseCompositionSchemaVersionId), + eq(federatedGraphsToFeatureFlagSchemaVersions.featureFlagId, featureFlagId), + ) : and( eq(federatedGraphsToFeatureFlagSchemaVersions.baseCompositionSchemaVersionId, baseSchemaVersionId), eq(federatedGraphsToFeatureFlagSchemaVersions.featureFlagId, featureFlagId), diff --git a/controlplane/src/core/repositories/GraphCompositionRepository.ts b/controlplane/src/core/repositories/GraphCompositionRepository.ts index 7be2c883da..dc4b882788 100644 --- a/controlplane/src/core/repositories/GraphCompositionRepository.ts +++ b/controlplane/src/core/repositories/GraphCompositionRepository.ts @@ -15,6 +15,7 @@ import { DateRange, GraphCompositionDTO } from '../../types/index.js'; import { CompositionSubgraphRecord } from '../composition/composer.js'; import { traced } from '../tracing.js'; import { FederatedGraphRepository } from './FederatedGraphRepository.js'; +import { OrganizationRepository } from './OrganizationRepository.js'; @traced export class GraphCompositionRepository { @@ -426,6 +427,7 @@ export class GraphCompositionRepository { excludeFeatureFlagCompositions: boolean; }) { const fedRepo = new FederatedGraphRepository(this.logger, this.db, organizationId); + const orgRepo = new OrganizationRepository(this.logger, this.db); const conditions: SQL[] = [ eq(schemaVersion.targetId, fedGraphTargetId), gt(graphCompositions.createdAt, new Date(dateRange.start)), @@ -476,11 +478,15 @@ export class GraphCompositionRepository { triggeredBySubgraphName: string; })[] = []; + const splitConfigFeature = await orgRepo.getFeature({ organizationId, featureId: 'split-config-loading' }); + const splitConfigLoadingEnabled = !!splitConfigFeature?.enabled; + for (const r of resp) { const compositionSubgraphs = await this.getCompositionSubgraphs({ compositionId: r.id, schemaVersionId: r.schemaVersionId, - includeChildCompositionSubgraphs: !r.isFeatureFlagComposition, + // We only want to include the feature flag subgraphs for legacy compositions + includeChildCompositionSubgraphs: !r.isFeatureFlagComposition && !splitConfigLoadingEnabled, }); const featureFlagInfo = featureFlagNamesBySchemaVersionId.get(r.schemaVersionId); From 14e9f44d328f3c2a2cde4e0ff913d0eb492296a7 Mon Sep 17 00:00:00 2001 From: Wilson Rivera Date: Tue, 30 Jun 2026 16:52:35 -0400 Subject: [PATCH 09/15] chore: fix comment --- ...ature-flags-in-latest-composition-by-federated-graph.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/controlplane/test/feature-flag/get-feature-flags-in-latest-composition-by-federated-graph.test.ts b/controlplane/test/feature-flag/get-feature-flags-in-latest-composition-by-federated-graph.test.ts index 68e30aa828..1f69621d50 100644 --- a/controlplane/test/feature-flag/get-feature-flags-in-latest-composition-by-federated-graph.test.ts +++ b/controlplane/test/feature-flag/get-feature-flags-in-latest-composition-by-federated-graph.test.ts @@ -120,7 +120,7 @@ describe('GetFeatureFlagsInLatestCompositionByFederatedGraph', () => { expect(resp.response?.code).toBe(EnumStatusCode.OK); expect(resp.featureFlags).toHaveLength(0); - // Create a second, enabled feature flag. It is composed into the latest composition, so it shows up too. + // Create a second, enabled feature flag const secondFlagName = genID('flag'); await createFeatureFlag(client, secondFlagName, labels, ['users-feature'], namespace, true); From e363e19e5d32091aaa48304f2329d4afca37c865 Mon Sep 17 00:00:00 2001 From: Wilson Rivera Date: Fri, 3 Jul 2026 11:52:26 -0400 Subject: [PATCH 10/15] chore: address comments and add tests --- .../repositories/FeatureFlagRepository.ts | 1 + .../test/composition/get-composition.test.ts | 179 ++++++++++++++++++ 2 files changed, 180 insertions(+) create mode 100644 controlplane/test/composition/get-composition.test.ts diff --git a/controlplane/src/core/repositories/FeatureFlagRepository.ts b/controlplane/src/core/repositories/FeatureFlagRepository.ts index fcfe78fd39..f4423bd7fd 100644 --- a/controlplane/src/core/repositories/FeatureFlagRepository.ts +++ b/controlplane/src/core/repositories/FeatureFlagRepository.ts @@ -1402,6 +1402,7 @@ export class FeatureFlagRepository { ? and( isNull(federatedGraphsToFeatureFlagSchemaVersions.baseCompositionSchemaVersionId), eq(federatedGraphsToFeatureFlagSchemaVersions.featureFlagId, featureFlagId), + eq(federatedGraphsToFeatureFlagSchemaVersions.featureFlagId, featureFlagId), ) : and( eq(federatedGraphsToFeatureFlagSchemaVersions.baseCompositionSchemaVersionId, baseSchemaVersionId), diff --git a/controlplane/test/composition/get-composition.test.ts b/controlplane/test/composition/get-composition.test.ts new file mode 100644 index 0000000000..3749ff7983 --- /dev/null +++ b/controlplane/test/composition/get-composition.test.ts @@ -0,0 +1,179 @@ +import fs from 'node:fs'; +import { join } from 'node:path'; +import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, test, vi } from 'vitest'; +import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb'; +import { eq } from 'drizzle-orm'; +import { addMinutes, formatISO, subDays } from 'date-fns'; +import { afterAllSetup, beforeAllSetup, genID } from '../../src/core/test-util.js'; +import { Label } from '../../src/types/index.js'; +import { unsuccessfulBaseCompositionError } from '../../src/core/errors/errors.js'; +import { + assertExecutionConfigSubgraphNames, + assertFeatureFlagExecutionConfig, + assertNumberOfCompositions, + createAndPublishSubgraph, + createFeatureFlag, + createFederatedGraph, + createNamespace, + createThenPublishFeatureSubgraph, + DEFAULT_ROUTER_URL, + DEFAULT_SUBGRAPH_URL_ONE, + DEFAULT_SUBGRAPH_URL_THREE, + DEFAULT_SUBGRAPH_URL_TWO, + deleteFeatureFlag, + featureFlagIntegrationTestSetUp, + getDebugTestOptions, + GraphNameAndKey, + SetupTest, + toggleFeatureFlag, +} from '../test-util.js'; +import { ClickHouseClient } from '../../src/core/clickhouse/index.js'; +import { graphCompositions } from '../../src/db/schema.js'; + +// Change to true to enable a longer timeout +const isDebugMode = false; +let dbname = ''; + +vi.mock('../src/core/clickhouse/index.js', () => { + const ClickHouseClient = vi.fn(); + ClickHouseClient.prototype.queryPromise = vi.fn(); + + return { ClickHouseClient }; +}); + +describe('getCompositions tests', () => { + let chClient: ClickHouseClient; + + beforeEach(() => { + chClient = new ClickHouseClient(); + }); + + afterEach(() => { + vi.clearAllMocks(); + }); + + beforeAll(async () => { + dbname = await beforeAllSetup(); + }); + + afterAll(async () => { + await afterAllSetup(dbname); + }); + + test( + 'that the name of the subgraph that triggered a composition is correct', + getDebugTestOptions(isDebugMode), + async (testContext) => { + const { client, server } = await SetupTest({ + dbname, + chClient, + }); + testContext.onTestFinished(() => server.close()); + + const namespace = genID('namespace').toLowerCase(); + const labels: Label[] = []; + const graphName = genID('federated-graph'); + + await createNamespace(client, namespace); + await featureFlagIntegrationTestSetUp( + client, + [{ name: 'users', hasFeatureSubgraph: false }], + graphName, + labels, + namespace, + ); + + const updateSubgraphResp = await client.publishFederatedSubgraph({ + name: 'users', + namespace, + schema: fs.readFileSync(join(process.cwd(), `test/test-data/feature-flags/users-update.graphql`)).toString(), + }); + + expect(updateSubgraphResp.response?.code).toBe(EnumStatusCode.OK); + + const compositionsResp = await client.getCompositions({ + fedGraphName: graphName, + namespace, + startDate: formatISO(subDays(new Date(), 1)), + endDate: formatISO(addMinutes(new Date(), 1)), + excludeFeatureFlagCompositions: true, + }); + + expect(compositionsResp.response?.code).toBe(EnumStatusCode.OK); + expect(compositionsResp.count).toBe(2); + expect(compositionsResp.compositions).toEqual([ + expect.objectContaining({ hasMultipleChangedSubgraphs: false, triggeredBySubgraphName: 'users' }), + expect.objectContaining({ hasMultipleChangedSubgraphs: false, triggeredBySubgraphName: 'users' }), + ]); + }, + ); + + test( + 'that the name of a feature subgraph that triggered a composition is correct', + getDebugTestOptions(isDebugMode), + async (testContext) => { + const { client, server } = await SetupTest({ + dbname, + chClient, + }); + testContext.onTestFinished(() => server.close()); + + const namespace = genID('namespace').toLowerCase(); + const labels: Label[] = []; + const baseGraphName = genID('baseFederatedGraphName'); + const ffName = genID('feature-flag'); + + await createNamespace(client, namespace); + await featureFlagIntegrationTestSetUp( + client, + [ + { name: 'users', hasFeatureSubgraph: true }, + { name: 'products-standalone', hasFeatureSubgraph: true }, + ], + baseGraphName, + labels, + namespace, + ); + + await createFeatureFlag(client, ffName, labels, ['products-standalone-feature'], namespace, true); + + const updateSubgraphResp = await client.publishFederatedSubgraph({ + name: 'products-standalone-feature', + namespace, + schema: fs + .readFileSync(join(process.cwd(), `test/test-data/feature-flags/products-standalone-update.graphql`)) + .toString(), + }); + + expect(updateSubgraphResp.response?.code).toBe(EnumStatusCode.OK); + + const compositionsResp = await client.getCompositions({ + fedGraphName: baseGraphName, + namespace, + startDate: formatISO(subDays(new Date(), 1)), + endDate: formatISO(addMinutes(new Date(), 1)), + excludeFeatureFlagCompositions: true, + }); + + /** + * We expect the base composition plus two new compositions: + * - The feature flag was created with the `products-standalone-feature` subgraph + * - The feature subgraph `products-standalone-feature` was updated + */ + expect(compositionsResp.response?.code).toBe(EnumStatusCode.OK); + expect(compositionsResp.count).toBe(3); + expect(compositionsResp.compositions).toEqual([ + expect.objectContaining({ + hasMultipleChangedSubgraphs: false, + triggeredBySubgraphName: 'products-standalone-feature', + }), + expect.objectContaining({ + hasMultipleChangedSubgraphs: false, + triggeredBySubgraphName: 'products-standalone-feature', + }), + // Base composition should have been triggered by multiple subgraphs: `users` and `products-standalone` + expect.objectContaining({ hasMultipleChangedSubgraphs: true }), + ]); + }, + ); +}); From d96b7a82bdfcc1cbbff4663ea35ebda07ceccea5 Mon Sep 17 00:00:00 2001 From: Wilson Rivera Date: Fri, 3 Jul 2026 12:14:52 -0400 Subject: [PATCH 11/15] chore: cleanup --- .../test/composition/get-composition.test.ts | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/controlplane/test/composition/get-composition.test.ts b/controlplane/test/composition/get-composition.test.ts index 3749ff7983..d890b6510c 100644 --- a/controlplane/test/composition/get-composition.test.ts +++ b/controlplane/test/composition/get-composition.test.ts @@ -2,33 +2,17 @@ import fs from 'node:fs'; import { join } from 'node:path'; import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, test, vi } from 'vitest'; import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb'; -import { eq } from 'drizzle-orm'; import { addMinutes, formatISO, subDays } from 'date-fns'; import { afterAllSetup, beforeAllSetup, genID } from '../../src/core/test-util.js'; import { Label } from '../../src/types/index.js'; -import { unsuccessfulBaseCompositionError } from '../../src/core/errors/errors.js'; import { - assertExecutionConfigSubgraphNames, - assertFeatureFlagExecutionConfig, - assertNumberOfCompositions, - createAndPublishSubgraph, createFeatureFlag, - createFederatedGraph, createNamespace, - createThenPublishFeatureSubgraph, - DEFAULT_ROUTER_URL, - DEFAULT_SUBGRAPH_URL_ONE, - DEFAULT_SUBGRAPH_URL_THREE, - DEFAULT_SUBGRAPH_URL_TWO, - deleteFeatureFlag, featureFlagIntegrationTestSetUp, getDebugTestOptions, - GraphNameAndKey, SetupTest, - toggleFeatureFlag, } from '../test-util.js'; import { ClickHouseClient } from '../../src/core/clickhouse/index.js'; -import { graphCompositions } from '../../src/db/schema.js'; // Change to true to enable a longer timeout const isDebugMode = false; From 18a13712d03c6a75988091992e7afe73fa6a4f06 Mon Sep 17 00:00:00 2001 From: Wilson Rivera Date: Fri, 3 Jul 2026 14:21:17 -0400 Subject: [PATCH 12/15] chore: correctly limit to federated graph --- .../bufservices/federated-graph/getFederatedGraphSDLByName.ts | 1 + controlplane/src/core/repositories/FeatureFlagRepository.ts | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/controlplane/src/core/bufservices/federated-graph/getFederatedGraphSDLByName.ts b/controlplane/src/core/bufservices/federated-graph/getFederatedGraphSDLByName.ts index 601e30e130..db2cd7e8de 100644 --- a/controlplane/src/core/bufservices/federated-graph/getFederatedGraphSDLByName.ts +++ b/controlplane/src/core/bufservices/federated-graph/getFederatedGraphSDLByName.ts @@ -79,6 +79,7 @@ export function getFederatedGraphSDLByName( const ffSchemaVersion = await featureFlagRepo.getFeatureFlagSchemaVersionByBaseSchemaVersion({ baseSchemaVersionId: schemaVersion.schemaVersionId, + federatedGraphId: federatedGraph.id, featureFlagId: featureFlag.id, }); if (!ffSchemaVersion || !ffSchemaVersion.schema) { diff --git a/controlplane/src/core/repositories/FeatureFlagRepository.ts b/controlplane/src/core/repositories/FeatureFlagRepository.ts index f4423bd7fd..60f175b2b6 100644 --- a/controlplane/src/core/repositories/FeatureFlagRepository.ts +++ b/controlplane/src/core/repositories/FeatureFlagRepository.ts @@ -1373,9 +1373,11 @@ export class FeatureFlagRepository { // input: base schema version id and feature flag id public async getFeatureFlagSchemaVersionByBaseSchemaVersion({ baseSchemaVersionId, + federatedGraphId, featureFlagId, }: { baseSchemaVersionId: string; + federatedGraphId: string; featureFlagId: string; }) { const orgRepo = new OrganizationRepository(this.logger, this.db); @@ -1402,7 +1404,7 @@ export class FeatureFlagRepository { ? and( isNull(federatedGraphsToFeatureFlagSchemaVersions.baseCompositionSchemaVersionId), eq(federatedGraphsToFeatureFlagSchemaVersions.featureFlagId, featureFlagId), - eq(federatedGraphsToFeatureFlagSchemaVersions.featureFlagId, featureFlagId), + eq(federatedGraphsToFeatureFlagSchemaVersions.featureFlagId, federatedGraphId), ) : and( eq(federatedGraphsToFeatureFlagSchemaVersions.baseCompositionSchemaVersionId, baseSchemaVersionId), From caa92ddbe31b5b1d3963c4ba8b282ad4fdc5172f Mon Sep 17 00:00:00 2001 From: Wilson Rivera Date: Fri, 3 Jul 2026 14:34:16 -0400 Subject: [PATCH 13/15] chore: fix column name --- controlplane/src/core/repositories/FeatureFlagRepository.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/controlplane/src/core/repositories/FeatureFlagRepository.ts b/controlplane/src/core/repositories/FeatureFlagRepository.ts index 60f175b2b6..942885b302 100644 --- a/controlplane/src/core/repositories/FeatureFlagRepository.ts +++ b/controlplane/src/core/repositories/FeatureFlagRepository.ts @@ -1404,7 +1404,7 @@ export class FeatureFlagRepository { ? and( isNull(federatedGraphsToFeatureFlagSchemaVersions.baseCompositionSchemaVersionId), eq(federatedGraphsToFeatureFlagSchemaVersions.featureFlagId, featureFlagId), - eq(federatedGraphsToFeatureFlagSchemaVersions.featureFlagId, federatedGraphId), + eq(federatedGraphsToFeatureFlagSchemaVersions.federatedGraphId, federatedGraphId), ) : and( eq(federatedGraphsToFeatureFlagSchemaVersions.baseCompositionSchemaVersionId, baseSchemaVersionId), From 753fd25cdffc9cf8085ee34a725709a1b14de1a8 Mon Sep 17 00:00:00 2001 From: Wilson Rivera Date: Fri, 3 Jul 2026 16:27:40 -0400 Subject: [PATCH 14/15] chore: add tests to verify composition subgraphs are correct --- .../test/composition/get-composition.test.ts | 29 +- .../composition/getCompositionDetails.test.ts | 371 +++++++++++++++++- 2 files changed, 373 insertions(+), 27 deletions(-) diff --git a/controlplane/test/composition/get-composition.test.ts b/controlplane/test/composition/get-composition.test.ts index d890b6510c..346b2e2305 100644 --- a/controlplane/test/composition/get-composition.test.ts +++ b/controlplane/test/composition/get-composition.test.ts @@ -1,6 +1,6 @@ import fs from 'node:fs'; import { join } from 'node:path'; -import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, test, vi } from 'vitest'; +import { afterAll, beforeAll, describe, expect, test, vi } from 'vitest'; import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb'; import { addMinutes, formatISO, subDays } from 'date-fns'; import { afterAllSetup, beforeAllSetup, genID } from '../../src/core/test-util.js'; @@ -18,24 +18,7 @@ import { ClickHouseClient } from '../../src/core/clickhouse/index.js'; const isDebugMode = false; let dbname = ''; -vi.mock('../src/core/clickhouse/index.js', () => { - const ClickHouseClient = vi.fn(); - ClickHouseClient.prototype.queryPromise = vi.fn(); - - return { ClickHouseClient }; -}); - describe('getCompositions tests', () => { - let chClient: ClickHouseClient; - - beforeEach(() => { - chClient = new ClickHouseClient(); - }); - - afterEach(() => { - vi.clearAllMocks(); - }); - beforeAll(async () => { dbname = await beforeAllSetup(); }); @@ -48,10 +31,7 @@ describe('getCompositions tests', () => { 'that the name of the subgraph that triggered a composition is correct', getDebugTestOptions(isDebugMode), async (testContext) => { - const { client, server } = await SetupTest({ - dbname, - chClient, - }); + const { client, server } = await SetupTest({ dbname }); testContext.onTestFinished(() => server.close()); const namespace = genID('namespace').toLowerCase(); @@ -96,10 +76,7 @@ describe('getCompositions tests', () => { 'that the name of a feature subgraph that triggered a composition is correct', getDebugTestOptions(isDebugMode), async (testContext) => { - const { client, server } = await SetupTest({ - dbname, - chClient, - }); + const { client, server } = await SetupTest({ dbname }); testContext.onTestFinished(() => server.close()); const namespace = genID('namespace').toLowerCase(); diff --git a/controlplane/test/composition/getCompositionDetails.test.ts b/controlplane/test/composition/getCompositionDetails.test.ts index c3a0028ca0..9a8bf6de87 100644 --- a/controlplane/test/composition/getCompositionDetails.test.ts +++ b/controlplane/test/composition/getCompositionDetails.test.ts @@ -1,12 +1,25 @@ import { randomUUID } from 'node:crypto'; +import fs from 'node:fs'; +import { join } from 'node:path'; import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb'; import { joinLabel } from '@wundergraph/cosmo-shared'; import { addMinutes, formatISO, subDays } from 'date-fns'; import { afterAll, beforeAll, describe, expect, test } from 'vitest'; import { afterAllSetup, beforeAllSetup, genID, genUniqueLabel } from '../../src/core/test-util.js'; -import { createFederatedGraph, createThenPublishSubgraph, DEFAULT_NAMESPACE, SetupTest } from '../test-util.js'; +import { + createFeatureFlag, + createFederatedGraph, + createNamespace, + createThenPublishSubgraph, + DEFAULT_NAMESPACE, + featureFlagIntegrationTestSetUp, + getDebugTestOptions, + SetupTest, +} from '../test-util.js'; +import { Label } from '../../src/types/index.js'; let dbname = ''; +const isDebugMode = false; describe('getCompositionDetails', () => { beforeAll(async () => { @@ -234,4 +247,360 @@ describe('getCompositionDetails', () => { expect(detailsRes.featureFlagCompositions).toBeDefined(); expect(detailsRes.featureFlagCompositions).toEqual([]); }); + + test( + 'that the correct subgraphs are marked as added and updated in composition details when split config loading is disabled', + getDebugTestOptions(isDebugMode), + async (testContext) => { + const { client, server } = await SetupTest({ dbname }); + testContext.onTestFinished(() => server.close()); + + const namespace = genID('namespace').toLowerCase(); + const labels: Label[] = []; + const graphName = genID('fed-graph'); + + await createNamespace(client, namespace); + await featureFlagIntegrationTestSetUp( + client, + [ + { name: 'users', hasFeatureSubgraph: false }, + { name: 'products-standalone', hasFeatureSubgraph: false }, + ], + graphName, + labels, + namespace, + ); + + const updateSubgraphResp = await client.publishFederatedSubgraph({ + name: 'products-standalone', + namespace, + schema: fs + .readFileSync(join(process.cwd(), `test/test-data/feature-flags/products-standalone-update.graphql`)) + .toString(), + }); + + expect(updateSubgraphResp.response?.code).toBe(EnumStatusCode.OK); + + const compositionsResp = await client.getCompositions({ + fedGraphName: graphName, + namespace, + startDate: formatISO(subDays(new Date(), 1)), + endDate: formatISO(addMinutes(new Date(), 1)), + excludeFeatureFlagCompositions: true, + }); + + expect(compositionsResp.response?.code).toBe(EnumStatusCode.OK); + expect(compositionsResp.compositions).toHaveLength(2); + + // Only the `products-standalone` subgraph should be updated on the latest composition + let compositionResp = await client.getCompositionDetails({ + compositionId: compositionsResp.compositions[0].id, + namespace, + }); + + expect(compositionResp.response?.code).toBe(EnumStatusCode.OK); + expect(compositionResp.composition).toBeDefined(); + expect(compositionResp.compositionSubgraphs).toHaveLength(2); + expect(compositionResp.featureFlagCompositions).toHaveLength(0); + expect(compositionResp.composition?.isFeatureFlagComposition).toBe(false); + + expect(compositionResp.compositionSubgraphs).toEqual([ + expect.objectContaining({ name: 'users', changeType: 'unchanged' }), + expect.objectContaining({ name: 'products-standalone', changeType: 'updated' }), + ]); + + // Both subgraphs should be added on the first composition + compositionResp = await client.getCompositionDetails({ + compositionId: compositionsResp.compositions[1].id, + namespace, + }); + + expect(compositionResp.response?.code).toBe(EnumStatusCode.OK); + expect(compositionResp.composition).toBeDefined(); + expect(compositionResp.compositionSubgraphs).toHaveLength(2); + expect(compositionResp.featureFlagCompositions).toHaveLength(0); + expect(compositionResp.composition?.isFeatureFlagComposition).toBe(false); + + expect(compositionResp.compositionSubgraphs).toEqual([ + expect.objectContaining({ name: 'users', changeType: 'added' }), + expect.objectContaining({ name: 'products-standalone', changeType: 'added' }), + ]); + }, + ); + + test( + 'that the correct feature subgraphs are marked as added and updated in composition details when split config loading is disabled', + getDebugTestOptions(isDebugMode), + async (testContext) => { + const { client, server } = await SetupTest({ dbname }); + testContext.onTestFinished(() => server.close()); + + const namespace = genID('namespace').toLowerCase(); + const labels: Label[] = []; + const baseGraphName = genID('baseFederatedGraphName'); + const ffName = genID('feature-flag'); + + await createNamespace(client, namespace); + await featureFlagIntegrationTestSetUp( + client, + [ + { name: 'users', hasFeatureSubgraph: true }, + { name: 'products-standalone', hasFeatureSubgraph: true }, + ], + baseGraphName, + labels, + namespace, + ); + + await createFeatureFlag(client, ffName, labels, ['products-standalone-feature'], namespace, true); + + const updateSubgraphResp = await client.publishFederatedSubgraph({ + name: 'products-standalone-feature', + namespace, + schema: fs + .readFileSync(join(process.cwd(), `test/test-data/feature-flags/products-standalone-update.graphql`)) + .toString(), + }); + + expect(updateSubgraphResp.response?.code).toBe(EnumStatusCode.OK); + + const compositionsResp = await client.getCompositions({ + fedGraphName: baseGraphName, + namespace, + startDate: formatISO(subDays(new Date(), 1)), + endDate: formatISO(addMinutes(new Date(), 1)), + excludeFeatureFlagCompositions: true, + }); + + expect(compositionsResp.response?.code).toBe(EnumStatusCode.OK); + expect(compositionsResp.compositions).toHaveLength(3); + + // The latest composition should not have any changed subgraph as a feature subgraph was updated instead + let compositionResp = await client.getCompositionDetails({ + compositionId: compositionsResp.compositions[0].id, + namespace, + }); + + expect(compositionResp.response?.code).toBe(EnumStatusCode.OK); + expect(compositionResp.composition).toBeDefined(); + expect(compositionResp.compositionSubgraphs).toHaveLength(2); + expect(compositionResp.featureFlagCompositions).toHaveLength(1); + expect(compositionResp.composition?.isFeatureFlagComposition).toBe(false); + + expect(compositionResp.compositionSubgraphs).toEqual([ + expect.objectContaining({ name: 'users', changeType: 'unchanged' }), + expect.objectContaining({ name: 'products-standalone', changeType: 'unchanged' }), + ]); + + // The feature flag composition should contain the updated feature subgraph plus the unchanged `users` subgraph + compositionResp = await client.getCompositionDetails({ + compositionId: compositionResp.featureFlagCompositions[0].id, + namespace, + }); + + expect(compositionResp.response?.code).toBe(EnumStatusCode.OK); + expect(compositionResp.composition).toBeDefined(); + expect(compositionResp.compositionSubgraphs).toHaveLength(2); + expect(compositionResp.featureFlagCompositions).toHaveLength(0); + expect(compositionResp.composition?.isFeatureFlagComposition).toBe(true); + + expect(compositionResp.compositionSubgraphs).toEqual([ + expect.objectContaining({ name: 'users', changeType: 'unchanged' }), + expect.objectContaining({ name: 'products-standalone-feature', changeType: 'updated' }), + ]); + }, + ); + + test( + 'that the correct subgraphs are marked as added and updated in composition details when split config loading is enabled', + getDebugTestOptions(isDebugMode), + async (testContext) => { + const { client, server } = await SetupTest({ dbname, enabledFeatures: ['split-config-loading'] }); + testContext.onTestFinished(() => server.close()); + + const namespace = genID('namespace').toLowerCase(); + const labels: Label[] = []; + const graphName = genID('fed-graph'); + + await createNamespace(client, namespace); + await featureFlagIntegrationTestSetUp( + client, + [ + { name: 'users', hasFeatureSubgraph: false }, + { name: 'products-standalone', hasFeatureSubgraph: false }, + ], + graphName, + labels, + namespace, + ); + + const updateSubgraphResp = await client.publishFederatedSubgraph({ + name: 'products-standalone', + namespace, + schema: fs + .readFileSync(join(process.cwd(), `test/test-data/feature-flags/products-standalone-update.graphql`)) + .toString(), + }); + + expect(updateSubgraphResp.response?.code).toBe(EnumStatusCode.OK); + + const compositionsResp = await client.getCompositions({ + fedGraphName: graphName, + namespace, + startDate: formatISO(subDays(new Date(), 1)), + endDate: formatISO(addMinutes(new Date(), 1)), + excludeFeatureFlagCompositions: false, + }); + + expect(compositionsResp.response?.code).toBe(EnumStatusCode.OK); + expect(compositionsResp.compositions).toEqual([ + expect.objectContaining({ isFeatureFlagComposition: false }), + expect.objectContaining({ isFeatureFlagComposition: false }), + ]); + + // Only the `products-standalone` subgraph should be updated on the latest composition + let compositionResp = await client.getCompositionDetails({ + compositionId: compositionsResp.compositions[0].id, + namespace, + }); + + expect(compositionResp.response?.code).toBe(EnumStatusCode.OK); + expect(compositionResp.composition).toBeDefined(); + expect(compositionResp.compositionSubgraphs).toHaveLength(2); + expect(compositionResp.featureFlagCompositions).toHaveLength(0); + expect(compositionResp.composition?.isFeatureFlagComposition).toBe(false); + + expect(compositionResp.compositionSubgraphs).toEqual([ + expect.objectContaining({ name: 'users', changeType: 'unchanged' }), + expect.objectContaining({ name: 'products-standalone', changeType: 'updated' }), + ]); + + // Both subgraphs should be added on the first composition + compositionResp = await client.getCompositionDetails({ + compositionId: compositionsResp.compositions[1].id, + namespace, + }); + + expect(compositionResp.response?.code).toBe(EnumStatusCode.OK); + expect(compositionResp.composition).toBeDefined(); + expect(compositionResp.compositionSubgraphs).toHaveLength(2); + expect(compositionResp.featureFlagCompositions).toHaveLength(0); + expect(compositionResp.composition?.isFeatureFlagComposition).toBe(false); + + expect(compositionResp.compositionSubgraphs).toEqual([ + expect.objectContaining({ name: 'users', changeType: 'added' }), + expect.objectContaining({ name: 'products-standalone', changeType: 'added' }), + ]); + }, + ); + + test( + 'that the correct feature subgraphs are marked as added and updated in composition details when split config loading is enabled', + getDebugTestOptions(isDebugMode), + async (testContext) => { + const { client, server } = await SetupTest({ dbname, enabledFeatures: ['split-config-loading'] }); + testContext.onTestFinished(() => server.close()); + + const namespace = genID('namespace').toLowerCase(); + const labels: Label[] = []; + const baseGraphName = genID('baseFederatedGraphName'); + const ffName = genID('feature-flag'); + + await createNamespace(client, namespace); + await featureFlagIntegrationTestSetUp( + client, + [ + { name: 'users', hasFeatureSubgraph: true }, + { name: 'products-standalone', hasFeatureSubgraph: true }, + ], + baseGraphName, + labels, + namespace, + ); + + await createFeatureFlag(client, ffName, labels, ['products-standalone-feature'], namespace, true); + + const updateSubgraphResp = await client.publishFederatedSubgraph({ + name: 'products-standalone-feature', + namespace, + schema: fs + .readFileSync(join(process.cwd(), `test/test-data/feature-flags/products-standalone-update.graphql`)) + .toString(), + }); + + expect(updateSubgraphResp.response?.code).toBe(EnumStatusCode.OK); + + const compositionsResp = await client.getCompositions({ + fedGraphName: baseGraphName, + namespace, + startDate: formatISO(subDays(new Date(), 1)), + endDate: formatISO(addMinutes(new Date(), 1)), + excludeFeatureFlagCompositions: false, + }); + + expect(compositionsResp.response?.code).toBe(EnumStatusCode.OK); + expect(compositionsResp.compositions).toEqual([ + expect.objectContaining({ isFeatureFlagComposition: true, featureFlagName: ffName }), + expect.objectContaining({ isFeatureFlagComposition: true, featureFlagName: ffName }), + expect.objectContaining({ isFeatureFlagComposition: false }), + ]); + + /** + * The latest composition should be a feature flag composition and be triggered because the updated + * feature subgraph + */ + let compositionResp = await client.getCompositionDetails({ + compositionId: compositionsResp.compositions[0].id, + namespace, + }); + + expect(compositionResp.response?.code).toBe(EnumStatusCode.OK); + expect(compositionResp.composition).toBeDefined(); + expect(compositionResp.compositionSubgraphs).toHaveLength(2); + expect(compositionResp.featureFlagCompositions).toHaveLength(0); + expect(compositionResp.composition?.isFeatureFlagComposition).toBe(true); + + expect(compositionResp.compositionSubgraphs).toEqual([ + expect.objectContaining({ name: 'users', changeType: 'unchanged' }), + expect.objectContaining({ name: 'products-standalone-feature', changeType: 'updated' }), + ]); + + /** + * The second composition is a feature flag composition due to the feature flag creation, so the feature + * subgraph and the users subgraph should have been added + */ + compositionResp = await client.getCompositionDetails({ + compositionId: compositionsResp.compositions[1].id, + namespace, + }); + + expect(compositionResp.response?.code).toBe(EnumStatusCode.OK); + expect(compositionResp.composition).toBeDefined(); + expect(compositionResp.compositionSubgraphs).toHaveLength(2); + expect(compositionResp.featureFlagCompositions).toHaveLength(0); + expect(compositionResp.composition?.isFeatureFlagComposition).toBe(true); + + expect(compositionResp.compositionSubgraphs).toEqual([ + expect.objectContaining({ name: 'users', changeType: 'added' }), + expect.objectContaining({ name: 'products-standalone-feature', changeType: 'added' }), + ]); + + // The first composition is the federated graph composition and both subgraphs should be added + compositionResp = await client.getCompositionDetails({ + compositionId: compositionsResp.compositions[2].id, + namespace, + }); + + expect(compositionResp.response?.code).toBe(EnumStatusCode.OK); + expect(compositionResp.composition).toBeDefined(); + expect(compositionResp.compositionSubgraphs).toHaveLength(2); + expect(compositionResp.featureFlagCompositions).toHaveLength(0); + expect(compositionResp.composition?.isFeatureFlagComposition).toBe(false); + + expect(compositionResp.compositionSubgraphs).toEqual([ + expect.objectContaining({ name: 'users', changeType: 'added' }), + expect.objectContaining({ name: 'products-standalone', changeType: 'added' }), + ]); + }, + ); }); From 27a6d53ae74d3babf4f58901f3c7096ee9621512 Mon Sep 17 00:00:00 2001 From: Wilson Rivera Date: Mon, 6 Jul 2026 09:44:13 -0400 Subject: [PATCH 15/15] chore: generate platform proto --- connect/src/wg/cosmo/platform/v1/platform_pb.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/connect/src/wg/cosmo/platform/v1/platform_pb.ts b/connect/src/wg/cosmo/platform/v1/platform_pb.ts index f7d2f60fa9..27d77ff4ba 100644 --- a/connect/src/wg/cosmo/platform/v1/platform_pb.ts +++ b/connect/src/wg/cosmo/platform/v1/platform_pb.ts @@ -16,7 +16,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file wg/cosmo/platform/v1/platform.proto. */ export const file_wg_cosmo_platform_v1_platform: GenFile = /*@__PURE__*/ - fileDesc("CiN3Zy9jb3Ntby9wbGF0Zm9ybS92MS9wbGF0Zm9ybS5wcm90bxIUd2cuY29zbW8ucGxhdGZvcm0udjEiIwoFTGFiZWwSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJIlsKCFJlc3BvbnNlEi0KBGNvZGUYASABKA4yHy53Zy5jb3Ntby5jb21tb24uRW51bVN0YXR1c0NvZGUSFAoHZGV0YWlscxgCIAEoCUgAiAEBQgoKCF9kZXRhaWxzIi8KDlJlc3BvbnNlU3RhdHVzEgwKBGNvZGUYASABKAUSDwoHbWVzc2FnZRgCIAEoCSJKChdQdWJsaXNoTW9ub2dyYXBoUmVxdWVzdBIMCgRuYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRIOCgZzY2hlbWEYAyABKAkilwIKGFB1Ymxpc2hNb25vZ3JhcGhSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkEKEWNvbXBvc2l0aW9uRXJyb3JzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchI/ChBkZXBsb3ltZW50RXJyb3JzGAMgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVwbG95bWVudEVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBCADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmciYAoKUHJvdG9JbnB1dBIOCgZzY2hlbWEYASABKAkSEAoIbWFwcGluZ3MYAiABKAkSDAoEbG9jaxgDIAEoCRIRCglwbGF0Zm9ybXMYBCADKAkSDwoHdmVyc2lvbhgFIAEoCSKZBgofUHVibGlzaEZlZGVyYXRlZFN1YmdyYXBoUmVxdWVzdBIMCgRuYW1lGAEgASgJEg4KBnNjaGVtYRgCIAEoCRIYCgtyb3V0aW5nX3VybBgDIAEoCUgAiAEBEisKBmxhYmVscxgEIAMoCzIbLndnLmNvc21vLnBsYXRmb3JtLnYxLkxhYmVsElAKFXN1YnNjcmlwdGlvbl9wcm90b2NvbBgGIAEoDjIsLndnLmNvc21vLmNvbW1vbi5HcmFwaFFMU3Vic2NyaXB0aW9uUHJvdG9jb2xIAYgBARIdChBzdWJzY3JpcHRpb25fdXJsGAcgASgJSAKIAQESEQoJbmFtZXNwYWNlGAggASgJElAKFXdlYnNvY2tldF9zdWJwcm90b2NvbBgJIAEoDjIsLndnLmNvc21vLmNvbW1vbi5HcmFwaFFMV2Vic29ja2V0U3VicHJvdG9jb2xIA4gBARIgChNpc19mZWF0dXJlX3N1YmdyYXBoGAogASgISASIAQESHwoSYmFzZV9zdWJncmFwaF9uYW1lGAsgASgJSAWIAQESLQogZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24YDCABKAhIBogBARI1CgR0eXBlGA0gASgOMiIud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGhUeXBlSAeIAQESNAoFcHJvdG8YDiABKAsyIC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Qcm90b0lucHV0SAiIAQESEgoFbGltaXQYDyABKAVICYgBAUIOCgxfcm91dGluZ191cmxCGAoWX3N1YnNjcmlwdGlvbl9wcm90b2NvbEITChFfc3Vic2NyaXB0aW9uX3VybEIYChZfd2Vic29ja2V0X3N1YnByb3RvY29sQhYKFF9pc19mZWF0dXJlX3N1YmdyYXBoQhUKE19iYXNlX3N1YmdyYXBoX25hbWVCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uQgcKBV90eXBlQggKBl9wcm90b0IICgZfbGltaXQizwMKIFB1Ymxpc2hGZWRlcmF0ZWRTdWJncmFwaFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQQoRY29tcG9zaXRpb25FcnJvcnMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEj8KEGRlcGxveW1lbnRFcnJvcnMYAyADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZXBsb3ltZW50RXJyb3ISFwoKaGFzQ2hhbmdlZBgEIAEoCEgAiAEBEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBSADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcSIQoUcHJvcG9zYWxNYXRjaE1lc3NhZ2UYBiABKAlIAYgBARI/CgZjb3VudHMYByABKAsyKi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TdWJncmFwaFB1Ymxpc2hTdGF0c0gCiAEBQg0KC19oYXNDaGFuZ2VkQhcKFV9wcm9wb3NhbE1hdGNoTWVzc2FnZUIJCgdfY291bnRzImgKFFN1YmdyYXBoUHVibGlzaFN0YXRzEhkKEWNvbXBvc2l0aW9uRXJyb3JzGAEgASgFEhsKE2NvbXBvc2l0aW9uV2FybmluZ3MYAiABKAUSGAoQZGVwbG95bWVudEVycm9ycxgDIAEoBSIvCg9QdWJsaXNoU3ViZ3JhcGgSDAoEbmFtZRgBIAEoCRIOCgZzY2hlbWEYAiABKAki/wEKIFB1Ymxpc2hGZWRlcmF0ZWRTdWJncmFwaHNSZXF1ZXN0EhEKCW5hbWVzcGFjZRgBIAEoCRI4CglzdWJncmFwaHMYAiADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QdWJsaXNoU3ViZ3JhcGgSLQogZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24YAyABKAhIAIgBARISCgVsaW1pdBgEIAEoBUgBiAEBEhIKBWFzeW5jGAUgASgISAKIAQFCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uQggKBl9saW1pdEIICgZfYXN5bmMiqAMKIVB1Ymxpc2hGZWRlcmF0ZWRTdWJncmFwaHNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkEKEWNvbXBvc2l0aW9uRXJyb3JzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchI/ChBkZXBsb3ltZW50RXJyb3JzGAMgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVwbG95bWVudEVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBCADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcSPwoGY291bnRzGAUgASgLMioud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGhQdWJsaXNoU3RhdHNIAIgBARIcChR1cGRhdGVkU3ViZ3JhcGhOYW1lcxgGIAMoCRISCgVqb2JJZBgHIAEoCUgBiAEBQgkKB19jb3VudHNCCAoGX2pvYklkIk4KH0dldEJhdGNoUHVibGlzaEpvYlN0YXR1c1JlcXVlc3QSDQoFam9iSWQYASABKAkSEgoFbGltaXQYAiABKAVIAIgBAUIICgZfbGltaXQihAQKIEdldEJhdGNoUHVibGlzaEpvYlN0YXR1c1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQAoGc3RhdHVzGAIgASgOMisud2cuY29zbW8ucGxhdGZvcm0udjEuQmF0Y2hQdWJsaXNoSm9iU3RhdHVzSACIAQESGgoNZmFpbHVyZVJlYXNvbhgDIAEoCUgBiAEBEkEKEWNvbXBvc2l0aW9uRXJyb3JzGAQgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchI/ChBkZXBsb3ltZW50RXJyb3JzGAUgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVwbG95bWVudEVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBiADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcSPwoGY291bnRzGAcgASgLMioud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGhQdWJsaXNoU3RhdHNIAogBARIcChR1cGRhdGVkU3ViZ3JhcGhOYW1lcxgIIAMoCUIJCgdfc3RhdHVzQhAKDl9mYWlsdXJlUmVhc29uQgkKB19jb3VudHMiXgoHR2l0SW5mbxISCgpjb21taXRfc2hhGAEgASgJEhIKCmFjY291bnRfaWQYAiABKAkSEgoKb3duZXJfc2x1ZxgDIAEoCRIXCg9yZXBvc2l0b3J5X3NsdWcYBCABKAkiQAoKVkNTQ29udGV4dBIOCgZhdXRob3IYASABKAkSEgoKY29tbWl0X3NoYRgCIAEoCRIOCgZicmFuY2gYAyABKAkixwMKGkNoZWNrU3ViZ3JhcGhTY2hlbWFSZXF1ZXN0EhUKDXN1YmdyYXBoX25hbWUYASABKAkSDgoGc2NoZW1hGAIgASgMEi4KB2dpdEluZm8YAyABKAsyHS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HaXRJbmZvEhMKBmRlbGV0ZRgEIAEoCEgAiAEBEhEKCW5hbWVzcGFjZRgFIAEoCRIfChJza2lwX3RyYWZmaWNfY2hlY2sYBiABKAhIAYgBARI5Cgp2Y3NDb250ZXh0GAcgASgLMiAud2cuY29zbW8ucGxhdGZvcm0udjEuVkNTQ29udGV4dEgCiAEBEisKBmxhYmVscxgIIAMoCzIbLndnLmNvc21vLnBsYXRmb3JtLnYxLkxhYmVsEi0KIGRpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uGAkgASgISAOIAQESEgoFbGltaXQYCiABKAVIBIgBAUIJCgdfZGVsZXRlQhUKE19za2lwX3RyYWZmaWNfY2hlY2tCDQoLX3Zjc0NvbnRleHRCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uQggKBl9saW1pdCKoAQoYRml4U3ViZ3JhcGhTY2hlbWFSZXF1ZXN0EhUKDXN1YmdyYXBoX25hbWUYASABKAkSDgoGc2NoZW1hGAIgASgJEhEKCW5hbWVzcGFjZRgDIAEoCRItCiBkaXNhYmxlX3Jlc29sdmFiaWxpdHlfdmFsaWRhdGlvbhgEIAEoCEgAiAEBQiMKIV9kaXNhYmxlX3Jlc29sdmFiaWxpdHlfdmFsaWRhdGlvbiLqAwoWQ3JlYXRlTW9ub2dyYXBoUmVxdWVzdBIMCgRuYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRITCgtyb3V0aW5nX3VybBgDIAEoCRIRCglncmFwaF91cmwYBCABKAkSHQoQc3Vic2NyaXB0aW9uX3VybBgFIAEoCUgAiAEBElAKFXN1YnNjcmlwdGlvbl9wcm90b2NvbBgGIAEoDjIsLndnLmNvc21vLmNvbW1vbi5HcmFwaFFMU3Vic2NyaXB0aW9uUHJvdG9jb2xIAYgBARITCgZyZWFkbWUYByABKAlIAogBARIbChNhZG1pc3Npb25XZWJob29rVVJMGAggASgJElAKFXdlYnNvY2tldF9zdWJwcm90b2NvbBgJIAEoDjIsLndnLmNvc21vLmNvbW1vbi5HcmFwaFFMV2Vic29ja2V0U3VicHJvdG9jb2xIA4gBARIjChZhZG1pc3Npb25XZWJob29rU2VjcmV0GAogASgJSASIAQFCEwoRX3N1YnNjcmlwdGlvbl91cmxCGAoWX3N1YnNjcmlwdGlvbl9wcm90b2NvbEIJCgdfcmVhZG1lQhgKFl93ZWJzb2NrZXRfc3VicHJvdG9jb2xCGQoXX2FkbWlzc2lvbldlYmhvb2tTZWNyZXQiSwoXQ3JlYXRlTW9ub2dyYXBoUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSK8AgobQ3JlYXRlRmVkZXJhdGVkR3JhcGhSZXF1ZXN0EgwKBG5hbWUYASABKAkSEwoLcm91dGluZ191cmwYAiABKAkSFgoObGFiZWxfbWF0Y2hlcnMYAyADKAkSEwoGcmVhZG1lGAQgASgJSACIAQESEQoJbmFtZXNwYWNlGAUgASgJEhsKE2FkbWlzc2lvbldlYmhvb2tVUkwYBiABKAkSIwoWYWRtaXNzaW9uV2ViaG9va1NlY3JldBgHIAEoCUgBiAEBEi0KIGRpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uGAggASgISAKIAQFCCQoHX3JlYWRtZUIZChdfYWRtaXNzaW9uV2ViaG9va1NlY3JldEIjCiFfZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24ipgUKHkNyZWF0ZUZlZGVyYXRlZFN1YmdyYXBoUmVxdWVzdBIMCgRuYW1lGAEgASgJEhgKC3JvdXRpbmdfdXJsGAIgASgJSACIAQESKwoGbGFiZWxzGAMgAygLMhsud2cuY29zbW8ucGxhdGZvcm0udjEuTGFiZWwSUAoVc3Vic2NyaXB0aW9uX3Byb3RvY29sGAUgASgOMiwud2cuY29zbW8uY29tbW9uLkdyYXBoUUxTdWJzY3JpcHRpb25Qcm90b2NvbEgBiAEBEh0KEHN1YnNjcmlwdGlvbl91cmwYBiABKAlIAogBARITCgZyZWFkbWUYByABKAlIA4gBARIRCgluYW1lc3BhY2UYCCABKAkSUAoVd2Vic29ja2V0X3N1YnByb3RvY29sGAkgASgOMiwud2cuY29zbW8uY29tbW9uLkdyYXBoUUxXZWJzb2NrZXRTdWJwcm90b2NvbEgEiAEBEiIKFWlzX2V2ZW50X2RyaXZlbl9ncmFwaBgKIAEoCEgFiAEBEiAKE2lzX2ZlYXR1cmVfc3ViZ3JhcGgYCyABKAhIBogBARIfChJiYXNlX3N1YmdyYXBoX25hbWUYDCABKAlIB4gBARIwCgR0eXBlGA0gASgOMiIud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGhUeXBlQg4KDF9yb3V0aW5nX3VybEIYChZfc3Vic2NyaXB0aW9uX3Byb3RvY29sQhMKEV9zdWJzY3JpcHRpb25fdXJsQgkKB19yZWFkbWVCGAoWX3dlYnNvY2tldF9zdWJwcm90b2NvbEIYChZfaXNfZXZlbnRfZHJpdmVuX2dyYXBoQhYKFF9pc19mZWF0dXJlX3N1YmdyYXBoQhUKE19iYXNlX3N1YmdyYXBoX25hbWUiPgobRGVsZXRlRmVkZXJhdGVkR3JhcGhSZXF1ZXN0EgwKBG5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJIjkKFkRlbGV0ZU1vbm9ncmFwaFJlcXVlc3QSDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkiSwoXRGVsZXRlTW9ub2dyYXBoUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSKeAQoeRGVsZXRlRmVkZXJhdGVkU3ViZ3JhcGhSZXF1ZXN0EhUKDXN1YmdyYXBoX25hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEi0KIGRpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uGAMgASgISACIAQFCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uIrkBCgxTY2hlbWFDaGFuZ2USDwoHbWVzc2FnZRgBIAEoCRISCgpjaGFuZ2VUeXBlGAIgASgJEhEKBHBhdGgYAyABKAlIAIgBARISCgppc0JyZWFraW5nGAQgASgIEhgKC2hhc092ZXJyaWRlGAUgASgISAGIAQESGQoMc3ViZ3JhcGhOYW1lGAYgASgJSAKIAQFCBwoFX3BhdGhCDgoMX2hhc092ZXJyaWRlQg8KDV9zdWJncmFwaE5hbWUitwEKGkZlZGVyYXRlZEdyYXBoU2NoZW1hQ2hhbmdlEg8KB21lc3NhZ2UYASABKAkSEgoKY2hhbmdlVHlwZRgCIAEoCRIRCgRwYXRoGAMgASgJSACIAQESEgoKaXNCcmVha2luZxgEIAEoCBIaChJmZWRlcmF0ZWRHcmFwaE5hbWUYBSABKAkSGAoLaGFzT3ZlcnJpZGUYBiABKAhIAYgBAUIHCgVfcGF0aEIOCgxfaGFzT3ZlcnJpZGUiZwoQQ29tcG9zaXRpb25FcnJvchIPCgdtZXNzYWdlGAEgASgJEhoKEmZlZGVyYXRlZEdyYXBoTmFtZRgCIAEoCRIRCgluYW1lc3BhY2UYAyABKAkSEwoLZmVhdHVyZUZsYWcYBCABKAkiaQoSQ29tcG9zaXRpb25XYXJuaW5nEg8KB21lc3NhZ2UYASABKAkSGgoSZmVkZXJhdGVkR3JhcGhOYW1lGAIgASgJEhEKCW5hbWVzcGFjZRgDIAEoCRITCgtmZWF0dXJlRmxhZxgEIAEoCSJRCg9EZXBsb3ltZW50RXJyb3ISDwoHbWVzc2FnZRgBIAEoCRIaChJmZWRlcmF0ZWRHcmFwaE5hbWUYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJInQKGENoZWNrT3BlcmF0aW9uVXNhZ2VTdGF0cxIXCg90b3RhbE9wZXJhdGlvbnMYASABKA0SEwoLZmlyc3RTZWVuQXQYAiABKAkSEgoKbGFzdFNlZW5BdBgDIAEoCRIWCg5zYWZlT3BlcmF0aW9ucxgEIAEoDSJgChZDaGVja2VkRmVkZXJhdGVkR3JhcGhzEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJEhkKEW9yZ2FuaXphdGlvbl9zbHVnGAQgASgJInQKDExpbnRMb2NhdGlvbhIMCgRsaW5lGAEgASgNEg4KBmNvbHVtbhgCIAEoDRIUCgdlbmRMaW5lGAMgASgNSACIAQESFgoJZW5kQ29sdW1uGAQgASgNSAGIAQFCCgoIX2VuZExpbmVCDAoKX2VuZENvbHVtbiLlAQoJTGludElzc3VlEhkKDGxpbnRSdWxlVHlwZRgBIAEoCUgAiAEBEjQKCHNldmVyaXR5GAIgASgOMiIud2cuY29zbW8ucGxhdGZvcm0udjEuTGludFNldmVyaXR5Eg8KB21lc3NhZ2UYAyABKAkSOQoNaXNzdWVMb2NhdGlvbhgEIAEoCzIiLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpbnRMb2NhdGlvbhIZCgxzdWJncmFwaE5hbWUYBSABKAlIAYgBAUIPCg1fbGludFJ1bGVUeXBlQg8KDV9zdWJncmFwaE5hbWUijgIKEUdyYXBoUHJ1bmluZ0lzc3VlEhwKFGdyYXBoUHJ1bmluZ1J1bGVUeXBlGAEgASgJEjQKCHNldmVyaXR5GAIgASgOMiIud2cuY29zbW8ucGxhdGZvcm0udjEuTGludFNldmVyaXR5EhEKCWZpZWxkUGF0aBgDIAEoCRIPCgdtZXNzYWdlGAQgASgJEjkKDWlzc3VlTG9jYXRpb24YBSABKAsyIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaW50TG9jYXRpb24SGgoSZmVkZXJhdGVkR3JhcGhOYW1lGAYgASgJEhkKDHN1YmdyYXBoTmFtZRgHIAEoCUgAiAEBQg8KDV9zdWJncmFwaE5hbWUivQoKG0NoZWNrU3ViZ3JhcGhTY2hlbWFSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjsKD2JyZWFraW5nQ2hhbmdlcxgCIAMoCzIiLndnLmNvc21vLnBsYXRmb3JtLnYxLlNjaGVtYUNoYW5nZRI+ChJub25CcmVha2luZ0NoYW5nZXMYAyADKAsyIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TY2hlbWFDaGFuZ2USQQoRY29tcG9zaXRpb25FcnJvcnMYBCADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEksKE29wZXJhdGlvblVzYWdlU3RhdHMYBSABKAsyLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DaGVja09wZXJhdGlvblVzYWdlU3RhdHMSEAoIY2hlY2tfaWQYBiABKAkSTgoYY2hlY2tlZF9mZWRlcmF0ZWRfZ3JhcGhzGAcgAygLMiwud2cuY29zbW8ucGxhdGZvcm0udjEuQ2hlY2tlZEZlZGVyYXRlZEdyYXBocxI1CgxsaW50V2FybmluZ3MYCCADKAsyHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaW50SXNzdWUSMwoKbGludEVycm9ycxgJIAMoCzIfLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpbnRJc3N1ZRJDChJncmFwaFBydW5lV2FybmluZ3MYCiADKAsyJy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HcmFwaFBydW5pbmdJc3N1ZRJBChBncmFwaFBydW5lRXJyb3JzGAsgAygLMicud2cuY29zbW8ucGxhdGZvcm0udjEuR3JhcGhQcnVuaW5nSXNzdWUSKQocY2xpZW50X3RyYWZmaWNfY2hlY2tfc2tpcHBlZBgMIAEoCEgAiAEBEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYDSADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcSIQoUcHJvcG9zYWxNYXRjaE1lc3NhZ2UYDiABKAlIAYgBARInChppc0xpbmtlZFRyYWZmaWNDaGVja0ZhaWxlZBgPIAEoCEgCiAEBEicKGmlzTGlua2VkUHJ1bmluZ0NoZWNrRmFpbGVkGBAgASgISAOIAQESJAoXaXNDaGVja0V4dGVuc2lvblNraXBwZWQYESABKAhIBIgBARInChpjaGVja0V4dGVuc2lvbkVycm9yTWVzc2FnZRgSIAEoCUgFiAEBEjwKBmNvdW50cxgTIAEoCzInLndnLmNvc21vLnBsYXRmb3JtLnYxLlNjaGVtYUNoZWNrQ291bnRzSAaIAQESVwodY29tcG9zZWRTY2hlbWFCcmVha2luZ0NoYW5nZXMYFCADKAsyMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWRlcmF0ZWRHcmFwaFNjaGVtYUNoYW5nZUIfCh1fY2xpZW50X3RyYWZmaWNfY2hlY2tfc2tpcHBlZEIXChVfcHJvcG9zYWxNYXRjaE1lc3NhZ2VCHQobX2lzTGlua2VkVHJhZmZpY0NoZWNrRmFpbGVkQh0KG19pc0xpbmtlZFBydW5pbmdDaGVja0ZhaWxlZEIaChhfaXNDaGVja0V4dGVuc2lvblNraXBwZWRCHQobX2NoZWNrRXh0ZW5zaW9uRXJyb3JNZXNzYWdlQgkKB19jb3VudHMihwIKEVNjaGVtYUNoZWNrQ291bnRzEhQKDGxpbnRXYXJuaW5ncxgBIAEoBRISCgpsaW50RXJyb3JzGAIgASgFEhcKD2JyZWFraW5nQ2hhbmdlcxgDIAEoBRIaChJub25CcmVha2luZ0NoYW5nZXMYBCABKAUSGQoRY29tcG9zaXRpb25FcnJvcnMYBSABKAUSGwoTY29tcG9zaXRpb25XYXJuaW5ncxgGIAEoBRIYChBncmFwaFBydW5lRXJyb3JzGAcgASgFEhoKEmdyYXBoUHJ1bmVXYXJuaW5ncxgIIAEoBRIlCh1jb21wb3NlZFNjaGVtYUJyZWFraW5nQ2hhbmdlcxgJIAEoBSJvChlGaXhTdWJncmFwaFNjaGVtYVJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USEAoIbW9kaWZpZWQYAiABKAgSDgoGc2NoZW1hGAMgASgJIpsCChxDcmVhdGVGZWRlcmF0ZWRHcmFwaFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQQoRY29tcG9zaXRpb25FcnJvcnMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEj8KEGRlcGxveW1lbnRFcnJvcnMYAyADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZXBsb3ltZW50RXJyb3ISRQoTY29tcG9zaXRpb25XYXJuaW5ncxgEIAMoCzIoLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXBvc2l0aW9uV2FybmluZyJTCh9DcmVhdGVGZWRlcmF0ZWRTdWJncmFwaFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2Ui2gIKH0RlbGV0ZUZlZGVyYXRlZFN1YmdyYXBoUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJBChFjb21wb3NpdGlvbkVycm9ycxgCIAMoCzImLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXBvc2l0aW9uRXJyb3ISPwoQZGVwbG95bWVudEVycm9ycxgDIAMoCzIlLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlcGxveW1lbnRFcnJvchJFChNjb21wb3NpdGlvbldhcm5pbmdzGAQgAygLMigud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25XYXJuaW5nEiEKFHByb3Bvc2FsTWF0Y2hNZXNzYWdlGAUgASgJSACIAQFCFwoVX3Byb3Bvc2FsTWF0Y2hNZXNzYWdlIlAKHERlbGV0ZUZlZGVyYXRlZEdyYXBoUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSKfAQoZR2V0RmVkZXJhdGVkR3JhcGhzUmVxdWVzdBINCgVsaW1pdBgBIAEoBRIOCgZvZmZzZXQYAiABKAUSFgoOaW5jbHVkZU1ldHJpY3MYAyABKAgSEQoJbmFtZXNwYWNlGAQgASgJEiAKE3N1cHBvcnRzX2ZlZGVyYXRpb24YBSABKAhIAIgBAUIWChRfc3VwcG9ydHNfZmVkZXJhdGlvbiJlCghDb250cmFjdBIKCgJpZBgBIAEoCRIhChlzb3VyY2VfZmVkZXJhdGVkX2dyYXBoX2lkGAIgASgJEhQKDGV4Y2x1ZGVfdGFncxgDIAMoCRIUCgxpbmNsdWRlX3RhZ3MYBCADKAkiswQKDkZlZGVyYXRlZEdyYXBoEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSEgoKcm91dGluZ1VSTBgDIAEoCRIWCg5sYWJlbF9tYXRjaGVycxgEIAMoCRIVCg1sYXN0VXBkYXRlZEF0GAUgASgJEhQKDGlzQ29tcG9zYWJsZRgGIAEoCBIZChFjb21wb3NpdGlvbkVycm9ycxgHIAEoCRIaChJjb25uZWN0ZWRTdWJncmFwaHMYCCABKAUSPgoNcmVxdWVzdFNlcmllcxgJIAMoCzInLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlcXVlc3RTZXJpZXNJdGVtEhMKBnJlYWRtZRgKIAEoCUgAiAEBEhEKCXRhcmdldF9pZBgLIAEoCRIRCgluYW1lc3BhY2UYDCABKAkSGgoNY29tcG9zaXRpb25JZBgNIAEoCUgBiAEBEhsKE3N1cHBvcnRzX2ZlZGVyYXRpb24YDiABKAgSNQoIY29udHJhY3QYDyABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db250cmFjdEgCiAEBEiIKFWFkbWlzc2lvbl93ZWJob29rX3VybBgQIAEoCUgDiAEBEiQKHHJvdXRlcl9jb21wYXRpYmlsaXR5X3ZlcnNpb24YESABKAlCCQoHX3JlYWRtZUIQCg5fY29tcG9zaXRpb25JZEILCglfY29udHJhY3RCGAoWX2FkbWlzc2lvbl93ZWJob29rX3VybCKEAQoaR2V0RmVkZXJhdGVkR3JhcGhzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI0CgZncmFwaHMYAiADKAsyJC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWRlcmF0ZWRHcmFwaCJUCilHZXRGZWRlcmF0ZWRHcmFwaHNCeVN1YmdyYXBoTGFiZWxzUmVxdWVzdBIUCgxzdWJncmFwaE5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJIpQBCipHZXRGZWRlcmF0ZWRHcmFwaHNCeVN1YmdyYXBoTGFiZWxzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI0CgZncmFwaHMYAiADKAsyJC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWRlcmF0ZWRHcmFwaCKIAQoTR2V0U3ViZ3JhcGhzUmVxdWVzdBINCgVsaW1pdBgBIAEoBRIOCgZvZmZzZXQYAiABKAUSEQoJbmFtZXNwYWNlGAMgASgJEhIKBXF1ZXJ5GAQgASgJSACIAQESIQoZZXhjbHVkZV9mZWF0dXJlX3N1YmdyYXBocxgFIAEoCEIICgZfcXVlcnkivQUKCFN1YmdyYXBoEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSEgoKcm91dGluZ1VSTBgDIAEoCRIVCg1sYXN0VXBkYXRlZEF0GAQgASgJEisKBmxhYmVscxgFIAMoCzIbLndnLmNvc21vLnBsYXRmb3JtLnYxLkxhYmVsEhoKDWNyZWF0b3JVc2VySWQYBiABKAlIAIgBARITCgZyZWFkbWUYByABKAlIAYgBARIXCg9zdWJzY3JpcHRpb25VcmwYCCABKAkSEQoJdGFyZ2V0X2lkGAkgASgJEhEKCW5hbWVzcGFjZRgKIAEoCRIcChRzdWJzY3JpcHRpb25Qcm90b2NvbBgLIAEoCRIWCglpc1YyR3JhcGgYDCABKAhIAogBARIaChJpc0V2ZW50RHJpdmVuR3JhcGgYDSABKAgSHAoUd2Vic29ja2V0U3VicHJvdG9jb2wYDiABKAkSGQoRaXNGZWF0dXJlU3ViZ3JhcGgYDyABKAgSHQoQYmFzZVN1YmdyYXBoTmFtZRgQIAEoCUgDiAEBEhsKDmJhc2VTdWJncmFwaElkGBEgASgJSASIAQESMAoEdHlwZRgSIAEoDjIiLndnLmNvc21vLnBsYXRmb3JtLnYxLlN1YmdyYXBoVHlwZRJCCgpwbHVnaW5EYXRhGBMgASgLMikud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGguUGx1Z2luRGF0YUgFiAEBGjAKClBsdWdpbkRhdGESDwoHdmVyc2lvbhgBIAEoCRIRCglwbGF0Zm9ybXMYAiADKAlCEAoOX2NyZWF0b3JVc2VySWRCCQoHX3JlYWRtZUIMCgpfaXNWMkdyYXBoQhMKEV9iYXNlU3ViZ3JhcGhOYW1lQhEKD19iYXNlU3ViZ3JhcGhJZEINCgtfcGx1Z2luRGF0YSKHAQoUR2V0U3ViZ3JhcGhzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIuCgZncmFwaHMYAiADKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TdWJncmFwaBINCgVjb3VudBgDIAEoBSJZCh5HZXRGZWRlcmF0ZWRHcmFwaEJ5TmFtZVJlcXVlc3QSDAoEbmFtZRgBIAEoCRIWCg5pbmNsdWRlTWV0cmljcxgCIAEoCBIRCgluYW1lc3BhY2UYAyABKAki1gEKH0dldEZlZGVyYXRlZEdyYXBoQnlOYW1lUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIzCgVncmFwaBgCIAEoCzIkLndnLmNvc21vLnBsYXRmb3JtLnYxLkZlZGVyYXRlZEdyYXBoEjEKCXN1YmdyYXBocxgDIAMoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlN1YmdyYXBoEhkKEWdyYXBoUmVxdWVzdFRva2VuGAQgASgJInoKIUdldEZlZGVyYXRlZEdyYXBoU0RMQnlOYW1lUmVxdWVzdBIMCgRuYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRIeChFmZWF0dXJlX2ZsYWdfbmFtZRgDIAEoCUgAiAEBQhQKEl9mZWF0dXJlX2ZsYWdfbmFtZSLGAQoiR2V0RmVkZXJhdGVkR3JhcGhTRExCeU5hbWVSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEhAKA3NkbBgCIAEoCUgAiAEBEhcKCnZlcnNpb25faWQYAyABKAlIAYgBARIaCg1jbGllbnRfc2NoZW1hGAQgASgJSAKIAQFCBgoEX3NkbEINCgtfdmVyc2lvbl9pZEIQCg5fY2xpZW50X3NjaGVtYSI7ChhHZXRTdWJncmFwaEJ5TmFtZVJlcXVlc3QSDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAki4gIKGUdldFN1YmdyYXBoQnlOYW1lUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRItCgVncmFwaBgCIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlN1YmdyYXBoEjUKB21lbWJlcnMYAyADKAsyJC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TdWJncmFwaE1lbWJlchJbCg5saW5rZWRTdWJncmFwaBgEIAEoCzI+LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFN1YmdyYXBoQnlOYW1lUmVzcG9uc2UuTGlua2VkU3ViZ3JhcGhIAIgBARo9Cg5MaW5rZWRTdWJncmFwaBIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEhEKCW5hbWVzcGFjZRgDIAEoCUIRCg9fbGlua2VkU3ViZ3JhcGgiYwoqR2V0U3ViZ3JhcGhTRExGcm9tTGF0ZXN0Q29tcG9zaXRpb25SZXF1ZXN0EgwKBG5hbWUYASABKAkSFAoMZmVkR3JhcGhOYW1lGAIgASgJEhEKCW5hbWVzcGFjZRgDIAEoCSKhAQorR2V0U3ViZ3JhcGhTRExGcm9tTGF0ZXN0Q29tcG9zaXRpb25SZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEhAKA3NkbBgCIAEoCUgAiAEBEhcKCnZlcnNpb25faWQYAyABKAlIAYgBAUIGCgRfc2RsQg0KC192ZXJzaW9uX2lkIj4KG0dldExhdGVzdFN1YmdyYXBoU0RMUmVxdWVzdBIMCgRuYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCSKSAQocR2V0TGF0ZXN0U3ViZ3JhcGhTRExSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEhAKA3NkbBgCIAEoCUgAiAEBEhcKCnZlcnNpb25faWQYAyABKAlIAYgBAUIGCgRfc2RsQg0KC192ZXJzaW9uX2lkIjkKJEdldENoZWNrc0J5RmVkZXJhdGVkR3JhcGhOYW1lRmlsdGVycxIRCglzdWJncmFwaHMYASADKAki6AEKJEdldENoZWNrc0J5RmVkZXJhdGVkR3JhcGhOYW1lUmVxdWVzdBIMCgRuYW1lGAEgASgJEg0KBWxpbWl0GAIgASgFEg4KBm9mZnNldBgDIAEoBRIRCglzdGFydERhdGUYBCABKAkSDwoHZW5kRGF0ZRgFIAEoCRIRCgluYW1lc3BhY2UYBiABKAkSUAoHZmlsdGVycxgHIAEoCzI6LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldENoZWNrc0J5RmVkZXJhdGVkR3JhcGhOYW1lRmlsdGVyc0gAiAEBQgoKCF9maWx0ZXJzIukLCgtTY2hlbWFDaGVjaxIKCgJpZBgBIAEoCRIVCgh0YXJnZXRJRBgCIAEoCUgAiAEBEhkKDHN1YmdyYXBoTmFtZRgDIAEoCUgBiAEBEhEKCXRpbWVzdGFtcBgEIAEoCRIUCgxpc0NvbXBvc2FibGUYBSABKAgSEgoKaXNCcmVha2luZxgGIAEoCBIYChBoYXNDbGllbnRUcmFmZmljGAcgASgIEhcKD2lzRm9yY2VkU3VjY2VzcxgIIAEoCBIRCglpc0RlbGV0ZWQYCSABKAgSQwoJZ2hEZXRhaWxzGAogASgLMisud2cuY29zbW8ucGxhdGZvcm0udjEuU2NoZW1hQ2hlY2suR2hEZXRhaWxzSAKIAQESFQoNaGFzTGludEVycm9ycxgLIAEoCBIdChVoYXNHcmFwaFBydW5pbmdFcnJvcnMYDCABKAgSJAocY2xpZW50X3RyYWZmaWNfY2hlY2tfc2tpcHBlZBgNIAEoCBIUCgxsaW50X3NraXBwZWQYDiABKAgSHQoVZ3JhcGhfcHJ1bmluZ19za2lwcGVkGA8gASgIEjkKCnZjc0NvbnRleHQYECABKAsyIC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5WQ1NDb250ZXh0SAOIAQESSwoQY2hlY2tlZFN1YmdyYXBocxgRIAMoCzIxLndnLmNvc21vLnBsYXRmb3JtLnYxLlNjaGVtYUNoZWNrLkNoZWNrZWRTdWJncmFwaBIaCg1wcm9wb3NhbE1hdGNoGBIgASgJSASIAQESGwoTY29tcG9zaXRpb25fc2tpcHBlZBgTIAEoCBIgChhicmVha2luZ19jaGFuZ2VzX3NraXBwZWQYFCABKAgSGQoMZXJyb3JNZXNzYWdlGBUgASgJSAWIAQESQwoMbGlua2VkQ2hlY2tzGBYgAygLMi0ud2cuY29zbW8ucGxhdGZvcm0udjEuU2NoZW1hQ2hlY2suTGlua2VkQ2hlY2sSKAobY2hlY2tfZXh0ZW5zaW9uX2RlbGl2ZXJ5X2lkGBcgASgJSAaIAQESKgodY2hlY2tfZXh0ZW5zaW9uX2Vycm9yX21lc3NhZ2UYGCABKAlIB4gBARpJCglHaERldGFpbHMSEQoJY29tbWl0U2hhGAEgASgJEhEKCW93bmVyU2x1ZxgCIAEoCRIWCg5yZXBvc2l0b3J5U2x1ZxgDIAEoCRqqAQoPQ2hlY2tlZFN1YmdyYXBoEgoKAmlkGAEgASgJEhQKDHN1YmdyYXBoTmFtZRgCIAEoCRIXCgpzdWJncmFwaElkGAMgASgJSACIAQESEQoJaXNEZWxldGVkGAQgASgIEg0KBWlzTmV3GAUgASgIEisKBmxhYmVscxgGIAMoCzIbLndnLmNvc21vLnBsYXRmb3JtLnYxLkxhYmVsQg0KC19zdWJncmFwaElkGpECCgtMaW5rZWRDaGVjaxIKCgJpZBgBIAEoCRIaChJhZmZlY3RlZEdyYXBoTmFtZXMYAiADKAkSGQoRaXNDaGVja1N1Y2Nlc3NmdWwYAyABKAgSGAoQaGFzQ2xpZW50VHJhZmZpYxgEIAEoCBIdChVoYXNHcmFwaFBydW5pbmdFcnJvcnMYBSABKAgSIQoZY2xpZW50VHJhZmZpY0NoZWNrU2tpcHBlZBgGIAEoCBIgChhncmFwaFBydW5pbmdDaGVja1NraXBwZWQYByABKAgSFQoNc3ViZ3JhcGhOYW1lcxgIIAMoCRIRCgluYW1lc3BhY2UYCSABKAkSFwoPaXNGb3JjZWRTdWNjZXNzGAogASgIQgsKCV90YXJnZXRJREIPCg1fc3ViZ3JhcGhOYW1lQgwKCl9naERldGFpbHNCDQoLX3Zjc0NvbnRleHRCEAoOX3Byb3Bvc2FsTWF0Y2hCDwoNX2Vycm9yTWVzc2FnZUIeChxfY2hlY2tfZXh0ZW5zaW9uX2RlbGl2ZXJ5X2lkQiAKHl9jaGVja19leHRlbnNpb25fZXJyb3JfbWVzc2FnZSKxAQolR2V0Q2hlY2tzQnlGZWRlcmF0ZWRHcmFwaE5hbWVSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjEKBmNoZWNrcxgCIAMoCzIhLndnLmNvc21vLnBsYXRmb3JtLnYxLlNjaGVtYUNoZWNrEiMKG2NoZWNrc0NvdW50QmFzZWRPbkRhdGVSYW5nZRgDIAEoBSJRChZHZXRDaGVja1N1bW1hcnlSZXF1ZXN0EhAKCGNoZWNrX2lkGAEgASgJEhIKCmdyYXBoX25hbWUYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJIjQKDENoYW5nZUNvdW50cxIRCglhZGRpdGlvbnMYASABKAUSEQoJZGVsZXRpb25zGAIgASgFIvYIChdHZXRDaGVja1N1bW1hcnlSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjAKBWNoZWNrGAIgASgLMiEud2cuY29zbW8ucGxhdGZvcm0udjEuU2NoZW1hQ2hlY2sSVAoPYWZmZWN0ZWRfZ3JhcGhzGAMgAygLMjsud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q2hlY2tTdW1tYXJ5UmVzcG9uc2UuQWZmZWN0ZWRHcmFwaBImChlwcm9wb3NlZFN1YmdyYXBoU2NoZW1hU0RMGAQgASgJSACIAQESMwoHY2hhbmdlcxgGIAMoCzIiLndnLmNvc21vLnBsYXRmb3JtLnYxLlNjaGVtYUNoYW5nZRIZChFjb21wb3NpdGlvbkVycm9ycxgHIAMoCRIaChJ0cmFmZmljX2NoZWNrX2RheXMYCCABKAUSMwoKbGludElzc3VlcxgJIAMoCzIfLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpbnRJc3N1ZRJDChJncmFwaFBydW5pbmdJc3N1ZXMYCiADKAsyJy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HcmFwaFBydW5pbmdJc3N1ZRIbChNjb21wb3NpdGlvbldhcm5pbmdzGAsgAygJEhcKCnByb3Bvc2FsSWQYDCABKAlIAYgBARIZCgxwcm9wb3NhbE5hbWUYDSABKAlIAogBARJaCg9wcm9wb3NhbE1hdGNoZXMYDiADKAsyQS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRDaGVja1N1bW1hcnlSZXNwb25zZS5Qcm9wb3NhbFNjaGVtYU1hdGNoEhoKEmlzUHJvcG9zYWxzRW5hYmxlZBgPIAEoCBJXCh1jb21wb3NlZFNjaGVtYUJyZWFraW5nQ2hhbmdlcxgQIAMoCzIwLndnLmNvc21vLnBsYXRmb3JtLnYxLkZlZGVyYXRlZEdyYXBoU2NoZW1hQ2hhbmdlGtoBCg1BZmZlY3RlZEdyYXBoEgoKAmlkGAEgASgJEhoKEnRyYWZmaWNfY2hlY2tfZGF5cxgCIAEoBRIMCgRuYW1lGAMgASgJEhkKEWlzQ2hlY2tTdWNjZXNzZnVsGAQgASgIEhQKDGlzQ29tcG9zYWJsZRgFIAEoCBISCgppc0JyZWFraW5nGAYgASgIEhgKEGhhc0NsaWVudFRyYWZmaWMYByABKAgSFQoNaGFzTGludEVycm9ycxgIIAEoCBIdChVoYXNHcmFwaFBydW5pbmdFcnJvcnMYCSABKAgaVgoTUHJvcG9zYWxTY2hlbWFNYXRjaBISCgpwcm9wb3NhbElkGAEgASgJEhQKDHByb3Bvc2FsTmFtZRgCIAEoCRIVCg1wcm9wb3NhbE1hdGNoGAMgASgIQhwKGl9wcm9wb3NlZFN1YmdyYXBoU2NoZW1hU0RMQg0KC19wcm9wb3NhbElkQg8KDV9wcm9wb3NhbE5hbWUikwEKGUdldENoZWNrT3BlcmF0aW9uc1JlcXVlc3QSEAoIY2hlY2tfaWQYASABKAkSEgoKZ3JhcGhfbmFtZRgCIAEoCRIRCgluYW1lc3BhY2UYAyABKAkSDQoFbGltaXQYBCABKAUSDgoGb2Zmc2V0GAUgASgFEhMKBnNlYXJjaBgGIAEoCUgAiAEBQgkKB19zZWFyY2gi0wQKGkdldENoZWNrT3BlcmF0aW9uc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USUwoKb3BlcmF0aW9ucxgCIAMoCzI/LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldENoZWNrT3BlcmF0aW9uc1Jlc3BvbnNlLkNoZWNrT3BlcmF0aW9uEhoKEnRyYWZmaWNfY2hlY2tfZGF5cxgDIAEoBRISCgpjcmVhdGVkX2F0GAQgASgJEiQKHGNsaWVudF90cmFmZmljX2NoZWNrX3NraXBwZWQYBSABKAgSHAoUdG90YWxPcGVyYXRpb25zQ291bnQYBiABKAUSLAokZG9BbGxPcGVyYXRpb25zSGF2ZUlnbm9yZUFsbE92ZXJyaWRlGAcgASgIEjQKLGRvQWxsT3BlcmF0aW9uc0hhdmVBbGxUaGVpckNoYW5nZXNNYXJrZWRTYWZlGAggASgIGtUBCg5DaGVja09wZXJhdGlvbhIMCgRoYXNoGAEgASgJEgwKBG5hbWUYAiABKAkSDAoEdHlwZRgDIAEoCRIVCg1maXJzdF9zZWVuX2F0GAQgASgJEhQKDGxhc3Rfc2Vlbl9hdBgFIAEoCRI9ChFpbXBhY3RpbmdfY2hhbmdlcxgGIAMoCzIiLndnLmNvc21vLnBsYXRmb3JtLnYxLlNjaGVtYUNoYW5nZRIPCgdpc19zYWZlGAcgASgIEhwKFGhhc0lnbm9yZUFsbE92ZXJyaWRlGAggASgIIncKGkdldE9wZXJhdGlvbkNvbnRlbnRSZXF1ZXN0EgwKBGhhc2gYASABKAkSHAoUZmVkZXJhdGVkX2dyYXBoX25hbWUYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJEhEKBG5hbWUYBCABKAlIAIgBAUIHCgVfbmFtZSJqChtHZXRPcGVyYXRpb25Db250ZW50UmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIZChFvcGVyYXRpb25fY29udGVudBgCIAEoCSKuAQohR2V0RmVkZXJhdGVkR3JhcGhDaGFuZ2Vsb2dSZXF1ZXN0EgwKBG5hbWUYASABKAkSNAoKcGFnaW5hdGlvbhgCIAEoCzIgLndnLmNvc21vLnBsYXRmb3JtLnYxLlBhZ2luYXRpb24SMgoJZGF0ZVJhbmdlGAMgASgLMh8ud2cuY29zbW8ucGxhdGZvcm0udjEuRGF0ZVJhbmdlEhEKCW5hbWVzcGFjZRgEIAEoCSJxChdGZWRlcmF0ZWRHcmFwaENoYW5nZWxvZxIKCgJpZBgBIAEoCRIMCgRwYXRoGAIgASgJEhIKCmNoYW5nZVR5cGUYAyABKAkSFQoNY2hhbmdlTWVzc2FnZRgEIAEoCRIRCgljcmVhdGVkQXQYBSABKAkipQEKHUZlZGVyYXRlZEdyYXBoQ2hhbmdlbG9nT3V0cHV0EhEKCWNyZWF0ZWRBdBgBIAEoCRIXCg9zY2hlbWFWZXJzaW9uSWQYAiABKAkSQQoKY2hhbmdlbG9ncxgDIAMoCzItLndnLmNvc21vLnBsYXRmb3JtLnYxLkZlZGVyYXRlZEdyYXBoQ2hhbmdlbG9nEhUKDWNvbXBvc2l0aW9uSWQYBCABKAkixwEKIkdldEZlZGVyYXRlZEdyYXBoQ2hhbmdlbG9nUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJaCh1mZWRlcmF0ZWRHcmFwaENoYW5nZWxvZ091dHB1dBgCIAMoCzIzLndnLmNvc21vLnBsYXRmb3JtLnYxLkZlZGVyYXRlZEdyYXBoQ2hhbmdlbG9nT3V0cHV0EhMKC2hhc05leHRQYWdlGAMgASgIImQKFEdldEZlZGVyYXRlZFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USGgoSRmVkZXJhdGVkU2NoZW1hU0RMGAIgASgJIswEChVVcGRhdGVTdWJncmFwaFJlcXVlc3QSDAoEbmFtZRgBIAEoCRIYCgtyb3V0aW5nX3VybBgCIAEoCUgAiAEBEisKBmxhYmVscxgDIAMoCzIbLndnLmNvc21vLnBsYXRmb3JtLnYxLkxhYmVsEg8KB2hlYWRlcnMYBCADKAkSUAoVc3Vic2NyaXB0aW9uX3Byb3RvY29sGAUgASgOMiwud2cuY29zbW8uY29tbW9uLkdyYXBoUUxTdWJzY3JpcHRpb25Qcm90b2NvbEgBiAEBEh0KEHN1YnNjcmlwdGlvbl91cmwYBiABKAlIAogBARITCgZyZWFkbWUYByABKAlIA4gBARIRCgluYW1lc3BhY2UYCCABKAkSGQoMdW5zZXRfbGFiZWxzGAkgASgISASIAQESUAoVd2Vic29ja2V0X3N1YnByb3RvY29sGAogASgOMiwud2cuY29zbW8uY29tbW9uLkdyYXBoUUxXZWJzb2NrZXRTdWJwcm90b2NvbEgFiAEBEi0KIGRpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uGAsgASgISAaIAQFCDgoMX3JvdXRpbmdfdXJsQhgKFl9zdWJzY3JpcHRpb25fcHJvdG9jb2xCEwoRX3N1YnNjcmlwdGlvbl91cmxCCQoHX3JlYWRtZUIPCg1fdW5zZXRfbGFiZWxzQhgKFl93ZWJzb2NrZXRfc3VicHJvdG9jb2xCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uIpUCChZVcGRhdGVTdWJncmFwaFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQQoRY29tcG9zaXRpb25FcnJvcnMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEj8KEGRlcGxveW1lbnRFcnJvcnMYAyADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZXBsb3ltZW50RXJyb3ISRQoTY29tcG9zaXRpb25XYXJuaW5ncxgEIAMoCzIoLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXBvc2l0aW9uV2FybmluZyKVAwobVXBkYXRlRmVkZXJhdGVkR3JhcGhSZXF1ZXN0EgwKBG5hbWUYASABKAkSEwoLcm91dGluZ191cmwYAiABKAkSFgoObGFiZWxfbWF0Y2hlcnMYAyADKAkSEwoGcmVhZG1lGAQgASgJSACIAQESEQoJbmFtZXNwYWNlGAUgASgJEiEKFHVuc2V0X2xhYmVsX21hdGNoZXJzGAYgASgISAGIAQESIAoTYWRtaXNzaW9uV2ViaG9va1VSTBgHIAEoCUgCiAEBEiMKFmFkbWlzc2lvbldlYmhvb2tTZWNyZXQYCCABKAlIA4gBARItCiBkaXNhYmxlX3Jlc29sdmFiaWxpdHlfdmFsaWRhdGlvbhgJIAEoCEgEiAEBQgkKB19yZWFkbWVCFwoVX3Vuc2V0X2xhYmVsX21hdGNoZXJzQhYKFF9hZG1pc3Npb25XZWJob29rVVJMQhkKF19hZG1pc3Npb25XZWJob29rU2VjcmV0QiMKIV9kaXNhYmxlX3Jlc29sdmFiaWxpdHlfdmFsaWRhdGlvbiKbAgocVXBkYXRlRmVkZXJhdGVkR3JhcGhSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkEKEWNvbXBvc2l0aW9uRXJyb3JzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchI/ChBkZXBsb3ltZW50RXJyb3JzGAMgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVwbG95bWVudEVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBCADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcihwQKFlVwZGF0ZU1vbm9ncmFwaFJlcXVlc3QSDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSEwoLcm91dGluZ191cmwYAyABKAkSEQoJZ3JhcGhfdXJsGAQgASgJElAKFXN1YnNjcmlwdGlvbl9wcm90b2NvbBgFIAEoDjIsLndnLmNvc21vLmNvbW1vbi5HcmFwaFFMU3Vic2NyaXB0aW9uUHJvdG9jb2xIAIgBARIdChBzdWJzY3JpcHRpb25fdXJsGAYgASgJSAGIAQESEwoGcmVhZG1lGAcgASgJSAKIAQESUAoVd2Vic29ja2V0X3N1YnByb3RvY29sGAggASgOMiwud2cuY29zbW8uY29tbW9uLkdyYXBoUUxXZWJzb2NrZXRTdWJwcm90b2NvbEgDiAEBEiAKE2FkbWlzc2lvbldlYmhvb2tVUkwYCSABKAlIBIgBARIjChZhZG1pc3Npb25XZWJob29rU2VjcmV0GAogASgJSAWIAQFCGAoWX3N1YnNjcmlwdGlvbl9wcm90b2NvbEITChFfc3Vic2NyaXB0aW9uX3VybEIJCgdfcmVhZG1lQhgKFl93ZWJzb2NrZXRfc3VicHJvdG9jb2xCFgoUX2FkbWlzc2lvbldlYmhvb2tVUkxCGQoXX2FkbWlzc2lvbldlYmhvb2tTZWNyZXQiSwoXVXBkYXRlTW9ub2dyYXBoUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSLHAQoaQ2hlY2tGZWRlcmF0ZWRHcmFwaFJlcXVlc3QSDAoEbmFtZRgBIAEoCRIWCg5sYWJlbF9tYXRjaGVycxgCIAMoCRIRCgluYW1lc3BhY2UYAyABKAkSLQogZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24YBCABKAhIAIgBARISCgVsaW1pdBgFIAEoBUgBiAEBQiMKIV9kaXNhYmxlX3Jlc29sdmFiaWxpdHlfdmFsaWRhdGlvbkIICgZfbGltaXQi1QIKG0NoZWNrRmVkZXJhdGVkR3JhcGhSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkEKEWNvbXBvc2l0aW9uRXJyb3JzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchIxCglzdWJncmFwaHMYAyADKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TdWJncmFwaBJFChNjb21wb3NpdGlvbldhcm5pbmdzGAQgAygLMigud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25XYXJuaW5nEjwKBmNvdW50cxgFIAEoCzInLndnLmNvc21vLnBsYXRmb3JtLnYxLlNjaGVtYUNoZWNrQ291bnRzSACIAQFCCQoHX2NvdW50cyIrCgpQYWdpbmF0aW9uEg0KBWxpbWl0GAEgASgFEg4KBm9mZnNldBgCIAEoBSIgCgRTb3J0EgoKAmlkGAEgASgJEgwKBGRlc2MYAiABKAgiiQIKD0FuYWx5dGljc0NvbmZpZxIyCglkYXRlUmFuZ2UYASABKAsyHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EYXRlUmFuZ2USEgoFcmFuZ2UYAiABKAVIAIgBARI2CgdmaWx0ZXJzGAMgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuQW5hbHl0aWNzRmlsdGVyEjQKCnBhZ2luYXRpb24YBCABKAsyIC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QYWdpbmF0aW9uEi0KBHNvcnQYBSABKAsyGi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Tb3J0SAGIAQFCCAoGX3JhbmdlQgcKBV9zb3J0InQKD0FuYWx5dGljc0ZpbHRlchINCgVmaWVsZBgBIAEoCRINCgV2YWx1ZRgCIAEoCRJDCghvcGVyYXRvchgDIAEoDjIxLndnLmNvc21vLnBsYXRmb3JtLnYxLkFuYWx5dGljc1ZpZXdGaWx0ZXJPcGVyYXRvciInCglEYXRlUmFuZ2USDQoFc3RhcnQYASABKAkSCwoDZW5kGAIgASgJIrsBChdHZXRBbmFseXRpY3NWaWV3UmVxdWVzdBIaChJmZWRlcmF0ZWRHcmFwaE5hbWUYASABKAkSOgoEbmFtZRgCIAEoDjIsLndnLmNvc21vLnBsYXRmb3JtLnYxLkFuYWx5dGljc1ZpZXdHcm91cE5hbWUSNQoGY29uZmlnGAMgASgLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuQW5hbHl0aWNzQ29uZmlnEhEKCW5hbWVzcGFjZRgEIAEoCSLYAQoTQW5hbHl0aWNzVmlld1Jlc3VsdBI6Cgdjb2x1bW5zGAEgAygLMikud2cuY29zbW8ucGxhdGZvcm0udjEuQW5hbHl0aWNzVmlld0NvbHVtbhI0CgRyb3dzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQW5hbHl0aWNzVmlld1JvdxJACgdmaWx0ZXJzGAMgAygLMi8ud2cuY29zbW8ucGxhdGZvcm0udjEuQW5hbHl0aWNzVmlld1Jlc3VsdEZpbHRlchINCgVwYWdlcxgEIAEoBSK+AQoTQW5hbHl0aWNzVmlld0NvbHVtbhIMCgRuYW1lGAEgASgJEg0KBXRpdGxlGAIgASgJEgwKBHR5cGUYAyABKAkSLQoEdW5pdBgEIAEoDjIaLndnLmNvc21vLnBsYXRmb3JtLnYxLlVuaXRIAIgBARIWCglpc19oaWRkZW4YBSABKAhIAYgBARITCgZpc19jdGEYBiABKAhIAogBAUIHCgVfdW5pdEIMCgpfaXNfaGlkZGVuQgkKB19pc19jdGEi2wEKGUFuYWx5dGljc1ZpZXdSZXN1bHRGaWx0ZXISEgoKY29sdW1uTmFtZRgBIAEoCRINCgV0aXRsZRgCIAEoCRJGCgdvcHRpb25zGAMgAygLMjUud2cuY29zbW8ucGxhdGZvcm0udjEuQW5hbHl0aWNzVmlld1Jlc3VsdEZpbHRlck9wdGlvbhJACg5jdXN0b21fb3B0aW9ucxgEIAEoDjIjLndnLmNvc21vLnBsYXRmb3JtLnYxLkN1c3RvbU9wdGlvbnNIAIgBAUIRCg9fY3VzdG9tX29wdGlvbnMikwEKH0FuYWx5dGljc1ZpZXdSZXN1bHRGaWx0ZXJPcHRpb24SDQoFbGFiZWwYASABKAkSEgoFdmFsdWUYAiABKAlIAIgBARJDCghvcGVyYXRvchgDIAEoDjIxLndnLmNvc21vLnBsYXRmb3JtLnYxLkFuYWx5dGljc1ZpZXdGaWx0ZXJPcGVyYXRvckIICgZfdmFsdWUirwEKEEFuYWx5dGljc1ZpZXdSb3cSQAoFdmFsdWUYASADKAsyMS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5BbmFseXRpY3NWaWV3Um93LlZhbHVlRW50cnkaWQoKVmFsdWVFbnRyeRILCgNrZXkYASABKAkSOgoFdmFsdWUYAiABKAsyKy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5BbmFseXRpY3NWaWV3Um93VmFsdWU6AjgBImUKFUFuYWx5dGljc1ZpZXdSb3dWYWx1ZRIWCgxudW1iZXJfdmFsdWUYASABKAFIABIWCgxzdHJpbmdfdmFsdWUYAiABKAlIABIUCgpib29sX3ZhbHVlGAMgASgISABCBgoEa2luZCKFAQoYR2V0QW5hbHl0aWNzVmlld1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USNwoEdmlldxgCIAEoCzIpLndnLmNvc21vLnBsYXRmb3JtLnYxLkFuYWx5dGljc1ZpZXdSZXN1bHQihAEKIEdldERhc2hib2FyZEFuYWx5dGljc1ZpZXdSZXF1ZXN0EhoKEmZlZGVyYXRlZEdyYXBoTmFtZRgBIAEoCRIRCglzdGFydERhdGUYAiABKAkSDwoHZW5kRGF0ZRgDIAEoCRINCgVyYW5nZRgEIAEoBRIRCgluYW1lc3BhY2UYBSABKAkiVgoRUmVxdWVzdFNlcmllc0l0ZW0SEQoJdGltZXN0YW1wGAEgASgJEhUKDXRvdGFsUmVxdWVzdHMYAiABKAUSFwoPZXJyb3JlZFJlcXVlc3RzGAMgASgFIlwKFU9wZXJhdGlvblJlcXVlc3RDb3VudBIVCg1vcGVyYXRpb25IYXNoGAEgASgJEhUKDW9wZXJhdGlvbk5hbWUYAiABKAkSFQoNdG90YWxSZXF1ZXN0cxgDIAEoBSJqChVGZWRlcmF0ZWRHcmFwaE1ldHJpY3MSGAoQZmVkZXJhdGVkR3JhcGhJRBgBIAEoCRITCgtyZXF1ZXN0UmF0ZRgCIAEoAhIRCgllcnJvclJhdGUYAyABKAISDwoHbGF0ZW5jeRgEIAEoAiJeCg9TdWJncmFwaE1ldHJpY3MSEgoKc3ViZ3JhcGhJRBgBIAEoCRITCgtyZXF1ZXN0UmF0ZRgCIAEoAhIRCgllcnJvclJhdGUYAyABKAISDwoHbGF0ZW5jeRgEIAEoAiLvAgohR2V0RGFzaGJvYXJkQW5hbHl0aWNzVmlld1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USPgoNcmVxdWVzdFNlcmllcxgCIAMoCzInLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlcXVlc3RTZXJpZXNJdGVtEkwKF21vc3RSZXF1ZXN0ZWRPcGVyYXRpb25zGAMgAygLMisud2cuY29zbW8ucGxhdGZvcm0udjEuT3BlcmF0aW9uUmVxdWVzdENvdW50Ej4KD3N1YmdyYXBoTWV0cmljcxgEIAMoCzIlLndnLmNvc21vLnBsYXRmb3JtLnYxLlN1YmdyYXBoTWV0cmljcxJKChVmZWRlcmF0ZWRHcmFwaE1ldHJpY3MYBSABKAsyKy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWRlcmF0ZWRHcmFwaE1ldHJpY3MiWwogQ3JlYXRlRmVkZXJhdGVkR3JhcGhUb2tlblJlcXVlc3QSEQoJZ3JhcGhOYW1lGAEgASgJEhEKCXRva2VuTmFtZRgCIAEoCRIRCgluYW1lc3BhY2UYAyABKAkiZAohQ3JlYXRlRmVkZXJhdGVkR3JhcGhUb2tlblJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USDQoFdG9rZW4YAiABKAkiTAoVT3JnYW5pemF0aW9uR3JvdXBSdWxlEgwKBHJvbGUYASABKAkSEgoKbmFtZXNwYWNlcxgCIAMoCRIRCglyZXNvdXJjZXMYAyADKAki2AEKEU9yZ2FuaXphdGlvbkdyb3VwEg8KB2dyb3VwSWQYASABKAkSDAoEbmFtZRgCIAEoCRITCgtkZXNjcmlwdGlvbhgDIAEoCRIPCgdidWlsdGluGAQgASgIEhQKDG1lbWJlcnNDb3VudBgFIAEoBRI6CgVydWxlcxgGIAMoCzIrLndnLmNvc21vLnBsYXRmb3JtLnYxLk9yZ2FuaXphdGlvbkdyb3VwUnVsZRIWCg5oYXNPaWRjTWFwcGVycxgHIAEoCBIUCgxhcGlLZXlzQ291bnQYCCABKAUiQwoeQ3JlYXRlT3JnYW5pemF0aW9uR3JvdXBSZXF1ZXN0EgwKBG5hbWUYASABKAkSEwoLZGVzY3JpcHRpb24YAiABKAkiiwEKH0NyZWF0ZU9yZ2FuaXphdGlvbkdyb3VwUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI2CgVncm91cBgCIAEoCzInLndnLmNvc21vLnBsYXRmb3JtLnYxLk9yZ2FuaXphdGlvbkdyb3VwIh4KHEdldE9yZ2FuaXphdGlvbkdyb3Vwc1JlcXVlc3QiigEKHUdldE9yZ2FuaXphdGlvbkdyb3Vwc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USNwoGZ3JvdXBzGAIgAygLMicud2cuY29zbW8ucGxhdGZvcm0udjEuT3JnYW5pemF0aW9uR3JvdXAiNQoiR2V0T3JnYW5pemF0aW9uR3JvdXBNZW1iZXJzUmVxdWVzdBIPCgdncm91cElkGAEgASgJIoADCiNHZXRPcmdhbml6YXRpb25Hcm91cE1lbWJlcnNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlElYKB21lbWJlcnMYAiADKAsyRS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25Hcm91cE1lbWJlcnNSZXNwb25zZS5Hcm91cE1lbWJlchJWCgdhcGlLZXlzGAMgAygLMkUud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uR3JvdXBNZW1iZXJzUmVzcG9uc2UuR3JvdXBBcGlLZXkaOwoLR3JvdXBNZW1iZXISCgoCaWQYASABKAkSDQoFZW1haWwYAiABKAkSEQoJY3JlYXRlZEF0GAMgASgJGjoKC0dyb3VwQXBpS2V5EgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSEQoJY3JlYXRlZEF0GAMgASgJItcBCh5VcGRhdGVPcmdhbml6YXRpb25Hcm91cFJlcXVlc3QSDwoHZ3JvdXBJZBgBIAEoCRITCgtkZXNjcmlwdGlvbhgCIAEoCRJNCgVydWxlcxgDIAMoCzI+LndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZU9yZ2FuaXphdGlvbkdyb3VwUmVxdWVzdC5Hcm91cFJ1bGUaQAoJR3JvdXBSdWxlEgwKBHJvbGUYASABKAkSEgoKbmFtZXNwYWNlcxgCIAMoCRIRCglyZXNvdXJjZXMYAyADKAkiUwofVXBkYXRlT3JnYW5pemF0aW9uR3JvdXBSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIlcKHkRlbGV0ZU9yZ2FuaXphdGlvbkdyb3VwUmVxdWVzdBIPCgdncm91cElkGAEgASgJEhYKCXRvR3JvdXBJZBgCIAEoCUgAiAEBQgwKCl90b0dyb3VwSWQiUwofRGVsZXRlT3JnYW5pemF0aW9uR3JvdXBSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIsABCglPcmdNZW1iZXISDgoGdXNlcklEGAEgASgJEg0KBWVtYWlsGAIgASgJEhMKC29yZ01lbWJlcklEGAMgASgJEg4KBmFjdGl2ZRgEIAEoCBIQCghqb2luZWRBdBgFIAEoCRI1CgZncm91cHMYBiADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5PcmdNZW1iZXIuR3JvdXAaJgoFR3JvdXASDwoHZ3JvdXBJZBgBIAEoCRIMCgRuYW1lGAIgASgJIjUKFFBlbmRpbmdPcmdJbnZpdGF0aW9uEg4KBnVzZXJJRBgBIAEoCRINCgVlbWFpbBgCIAEoCSJ8CiRHZXRQZW5kaW5nT3JnYW5pemF0aW9uTWVtYmVyc1JlcXVlc3QSNAoKcGFnaW5hdGlvbhgBIAEoCzIgLndnLmNvc21vLnBsYXRmb3JtLnYxLlBhZ2luYXRpb24SEwoGc2VhcmNoGAIgASgJSACIAQFCCQoHX3NlYXJjaCK2AQolR2V0UGVuZGluZ09yZ2FuaXphdGlvbk1lbWJlcnNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkYKEnBlbmRpbmdJbnZpdGF0aW9ucxgCIAMoCzIqLndnLmNvc21vLnBsYXRmb3JtLnYxLlBlbmRpbmdPcmdJbnZpdGF0aW9uEhMKC3RvdGFsX2NvdW50GAMgASgFInUKHUdldE9yZ2FuaXphdGlvbk1lbWJlcnNSZXF1ZXN0EjQKCnBhZ2luYXRpb24YASABKAsyIC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QYWdpbmF0aW9uEhMKBnNlYXJjaBgCIAEoCUgAiAEBQgkKB19zZWFyY2gimQEKHkdldE9yZ2FuaXphdGlvbk1lbWJlcnNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjAKB21lbWJlcnMYAiADKAsyHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5PcmdNZW1iZXISEwoLdG90YWxfY291bnQYAyABKAUiMgoRSW52aXRlVXNlclJlcXVlc3QSDQoFZW1haWwYASABKAkSDgoGZ3JvdXBzGAIgAygJIkYKEkludml0ZVVzZXJSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIjQKEkludml0ZVVzZXJzUmVxdWVzdBIOCgZlbWFpbHMYASADKAkSDgoGZ3JvdXBzGAIgAygJIjoKGkludml0ZVVzZXJzSW52aXRhdGlvbkVycm9yEg0KBWVtYWlsGAEgASgJEg0KBWVycm9yGAIgASgJIpMBChNJbnZpdGVVc2Vyc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USSgoQaW52aXRhdGlvbkVycm9ycxgCIAMoCzIwLndnLmNvc21vLnBsYXRmb3JtLnYxLkludml0ZVVzZXJzSW52aXRhdGlvbkVycm9yIuYBCgZBUElLZXkSCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCRIRCgljcmVhdGVkQnkYAyABKAkSEQoJY3JlYXRlZEF0GAQgASgJEhIKCmxhc3RVc2VkQXQYBSABKAkSEQoJZXhwaXJlc0F0GAYgASgJEjYKBWdyb3VwGAcgASgLMiIud2cuY29zbW8ucGxhdGZvcm0udjEuQVBJS2V5Lkdyb3VwSACIAQESEAoIZXh0ZXJuYWwYCCABKAgaIQoFR3JvdXASCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCUIICgZfZ3JvdXAiMgoRR2V0QVBJS2V5c1JlcXVlc3QSDQoFbGltaXQYASABKAUSDgoGb2Zmc2V0GAIgASgFIoQBChJHZXRBUElLZXlzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRItCgdhcGlLZXlzGAIgAygLMhwud2cuY29zbW8ucGxhdGZvcm0udjEuQVBJS2V5Eg0KBWNvdW50GAMgASgFIq8BChNDcmVhdGVBUElLZXlSZXF1ZXN0EgwKBG5hbWUYASABKAkSDgoGdXNlcklEGAIgASgJEjAKB2V4cGlyZXMYAyABKA4yHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5FeHBpcmVzQXQSDwoHZ3JvdXBJZBgEIAEoCRITCgtwZXJtaXNzaW9ucxgFIAMoCRIVCghleHRlcm5hbBgGIAEoCEgAiAEBQgsKCV9leHRlcm5hbCJYChRDcmVhdGVBUElLZXlSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEg4KBmFwaUtleRgCIAEoCSIjChNEZWxldGVBUElLZXlSZXF1ZXN0EgwKBG5hbWUYASABKAkiSAoURGVsZXRlQVBJS2V5UmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSI0ChNVcGRhdGVBUElLZXlSZXF1ZXN0EgwKBG5hbWUYASABKAkSDwoHZ3JvdXBJZBgCIAEoCSJIChRVcGRhdGVBUElLZXlSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIjAKH1JlbW92ZU9yZ2FuaXphdGlvbk1lbWJlclJlcXVlc3QSDQoFZW1haWwYASABKAkiVAogUmVtb3ZlT3JnYW5pemF0aW9uTWVtYmVyUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSIoChdSZW1vdmVJbnZpdGF0aW9uUmVxdWVzdBINCgVlbWFpbBgBIAEoCSJMChhSZW1vdmVJbnZpdGF0aW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSJSChhNaWdyYXRlRnJvbUFwb2xsb1JlcXVlc3QSDgoGYXBpS2V5GAEgASgJEhMKC3ZhcmlhbnROYW1lGAIgASgJEhEKCW5hbWVzcGFjZRgDIAEoCSJcChlNaWdyYXRlRnJvbUFwb2xsb1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USDQoFdG9rZW4YAiABKAkizAIKBFNwYW4SEQoJdGltZXN0YW1wGAEgASgDEhEKCXNjb3BlTmFtZRgCIAEoCRIPCgd0cmFjZUlEGAMgASgJEg4KBnNwYW5JRBgEIAEoCRIUCgxwYXJlbnRTcGFuSUQYBSABKAkSEAoIc3Bhbk5hbWUYBiABKAkSEAoIc3BhbktpbmQYByABKAkSEAoIZHVyYXRpb24YCCABKAMSEwoLc2VydmljZU5hbWUYCSABKAkSEgoKc3RhdHVzQ29kZRgKIAEoCRIVCg1zdGF0dXNNZXNzYWdlGAsgASgJEj4KCmF0dHJpYnV0ZXMYDCADKAsyKi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TcGFuLkF0dHJpYnV0ZXNFbnRyeRoxCg9BdHRyaWJ1dGVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASJKCg9HZXRUcmFjZVJlcXVlc3QSCgoCaWQYASABKAkSDwoHc3Bhbl9pZBgCIAEoCRIaChJmZWRlcmF0ZWRfZ3JhcGhfaWQYAyABKAkibwoQR2V0VHJhY2VSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEikKBXNwYW5zGAIgAygLMhoud2cuY29zbW8ucGxhdGZvcm0udjEuU3BhbiIPCg1XaG9BbUlSZXF1ZXN0Iu0BCg5XaG9BbUlSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEhgKEG9yZ2FuaXphdGlvbk5hbWUYAiABKAkSFgoJdXNlckVtYWlsGAMgASgJSACIAQESGAoQb3JnYW5pemF0aW9uU2x1ZxgEIAEoCRIWCg5vcmdhbml6YXRpb25JZBgFIAEoCRI3Cgxsb2dpbl9tZXRob2QYBiABKAsyIS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Mb2dpbk1ldGhvZEIMCgpfdXNlckVtYWlsIs0BCgtMb2dpbk1ldGhvZBIzCgR0eXBlGAEgASgOMiUud2cuY29zbW8ucGxhdGZvcm0udjEuTG9naW5NZXRob2RUeXBlEhcKD3Nzb19wcm92aWRlcl9pZBgCIAEoCRIZChFzc29fcHJvdmlkZXJfbmFtZRgDIAEoCRIRCglzc29fYWxpYXMYBCABKAkSQgoPc29jaWFsX3Byb3ZpZGVyGAUgASgOMikud2cuY29zbW8ucGxhdGZvcm0udjEuU29jaWFsTG9naW5Qcm92aWRlciJQCgtSb3V0ZXJUb2tlbhIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEhEKCWNyZWF0ZWRBdBgDIAEoCRIUCgxjcmVhdG9yRW1haWwYBSABKAkiRQoaR2VuZXJhdGVSb3V0ZXJUb2tlblJlcXVlc3QSFAoMZmVkR3JhcGhOYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCSJeChtHZW5lcmF0ZVJvdXRlclRva2VuUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRINCgV0b2tlbhgCIAEoCSJBChZHZXRSb3V0ZXJUb2tlbnNSZXF1ZXN0EhQKDGZlZEdyYXBoTmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkifgoXR2V0Um91dGVyVG9rZW5zUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIxCgZ0b2tlbnMYAiADKAsyIS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Sb3V0ZXJUb2tlbiJWChhEZWxldGVSb3V0ZXJUb2tlblJlcXVlc3QSEQoJdG9rZW5OYW1lGAEgASgJEhQKDGZlZEdyYXBoTmFtZRgCIAEoCRIRCgluYW1lc3BhY2UYAyABKAkiTQoZRGVsZXRlUm91dGVyVG9rZW5SZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIjIKElBlcnNpc3RlZE9wZXJhdGlvbhIKCgJpZBgBIAEoCRIQCghjb250ZW50cxgCIAEoCSKeAQohUHVibGlzaFBlcnNpc3RlZE9wZXJhdGlvbnNSZXF1ZXN0EhQKDGZlZEdyYXBoTmFtZRgBIAEoCRISCgpjbGllbnROYW1lGAIgASgJEjwKCm9wZXJhdGlvbnMYAyADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QZXJzaXN0ZWRPcGVyYXRpb24SEQoJbmFtZXNwYWNlGAQgASgJIoYBChJQdWJsaXNoZWRPcGVyYXRpb24SCgoCaWQYASABKAkSDAoEaGFzaBgCIAEoCRI+CgZzdGF0dXMYAyABKA4yLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QdWJsaXNoZWRPcGVyYXRpb25TdGF0dXMSFgoOb3BlcmF0aW9uTmFtZXMYBCADKAkilAEKIlB1Ymxpc2hQZXJzaXN0ZWRPcGVyYXRpb25zUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI8CgpvcGVyYXRpb25zGAIgAygLMigud2cuY29zbW8ucGxhdGZvcm0udjEuUHVibGlzaGVkT3BlcmF0aW9uInMKH0RlbGV0ZVBlcnNpc3RlZE9wZXJhdGlvblJlcXVlc3QSFAoMZmVkR3JhcGhOYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRISCgpjbGllbnROYW1lGAMgASgJEhMKC29wZXJhdGlvbklkGAQgASgJIoMCCiBEZWxldGVQZXJzaXN0ZWRPcGVyYXRpb25SZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlElMKCW9wZXJhdGlvbhgCIAEoCzJALndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZVBlcnNpc3RlZE9wZXJhdGlvblJlc3BvbnNlLk9wZXJhdGlvbhpYCglPcGVyYXRpb24SCgoCaWQYASABKAkSEwoLb3BlcmF0aW9uSWQYAiABKAkSEgoKY2xpZW50TmFtZRgDIAEoCRIWCg5vcGVyYXRpb25OYW1lcxgEIAMoCSJ5CiVDaGVja1BlcnNpc3RlZE9wZXJhdGlvblRyYWZmaWNSZXF1ZXN0EhQKDGZlZEdyYXBoTmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSEwoLb3BlcmF0aW9uSWQYAyABKAkSEgoKY2xpZW50TmFtZRgEIAEoCSKjAgomQ2hlY2tQZXJzaXN0ZWRPcGVyYXRpb25UcmFmZmljUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJZCglvcGVyYXRpb24YAiABKAsyRi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DaGVja1BlcnNpc3RlZE9wZXJhdGlvblRyYWZmaWNSZXNwb25zZS5PcGVyYXRpb24abAoJT3BlcmF0aW9uEgoKAmlkGAEgASgJEhMKC29wZXJhdGlvbklkGAIgASgJEhIKCmNsaWVudE5hbWUYAyABKAkSFgoOb3BlcmF0aW9uTmFtZXMYBCADKAkSEgoKaGFzVHJhZmZpYxgFIAEoCCJjCh1HZXRQZXJzaXN0ZWRPcGVyYXRpb25zUmVxdWVzdBIcChRmZWRlcmF0ZWRfZ3JhcGhfbmFtZRgBIAEoCRIRCgljbGllbnRfaWQYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJIpcCCh5HZXRQZXJzaXN0ZWRPcGVyYXRpb25zUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJSCgpvcGVyYXRpb25zGAIgAygLMj4ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0UGVyc2lzdGVkT3BlcmF0aW9uc1Jlc3BvbnNlLk9wZXJhdGlvbhpvCglPcGVyYXRpb24SCgoCaWQYASABKAkSEAoIY29udGVudHMYAiABKAkSEgoKY3JlYXRlZF9hdBgDIAEoCRIXCg9sYXN0X3VwZGF0ZWRfYXQYBCABKAkSFwoPb3BlcmF0aW9uX25hbWVzGAUgAygJIiQKBkhlYWRlchILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAkijwEKJkNyZWF0ZU9yZ2FuaXphdGlvbldlYmhvb2tDb25maWdSZXF1ZXN0EhAKCGVuZHBvaW50GAEgASgJEgsKA2tleRgCIAEoCRIOCgZldmVudHMYAyADKAkSNgoLZXZlbnRzX21ldGEYBCADKAsyIS53Zy5jb3Ntby5ub3RpZmljYXRpb25zLkV2ZW50TWV0YSJ2CidDcmVhdGVPcmdhbml6YXRpb25XZWJob29rQ29uZmlnUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIZChF3ZWJob29rX2NvbmZpZ19pZBgCIAEoCSImCiRHZXRPcmdhbml6YXRpb25XZWJob29rQ29uZmlnc1JlcXVlc3Qi5gEKJUdldE9yZ2FuaXphdGlvbldlYmhvb2tDb25maWdzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJTCgdjb25maWdzGAIgAygLMkIud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uV2ViaG9va0NvbmZpZ3NSZXNwb25zZS5Db25maWcaNgoGQ29uZmlnEgoKAmlkGAEgASgJEhAKCGVuZHBvaW50GAIgASgJEg4KBmV2ZW50cxgDIAMoCSIvCiFHZXRPcmdhbml6YXRpb25XZWJob29rTWV0YVJlcXVlc3QSCgoCaWQYASABKAkijgEKIkdldE9yZ2FuaXphdGlvbldlYmhvb2tNZXRhUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI2CgtldmVudHNfbWV0YRgCIAMoCzIhLndnLmNvc21vLm5vdGlmaWNhdGlvbnMuRXZlbnRNZXRhIrYBCiZVcGRhdGVPcmdhbml6YXRpb25XZWJob29rQ29uZmlnUmVxdWVzdBIKCgJpZBgBIAEoCRIQCghlbmRwb2ludBgCIAEoCRILCgNrZXkYAyABKAkSDgoGZXZlbnRzGAQgAygJEjYKC2V2ZW50c19tZXRhGAUgAygLMiEud2cuY29zbW8ubm90aWZpY2F0aW9ucy5FdmVudE1ldGESGQoRc2hvdWxkX3VwZGF0ZV9rZXkYBiABKAgiWwonVXBkYXRlT3JnYW5pemF0aW9uV2ViaG9va0NvbmZpZ1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiNAomRGVsZXRlT3JnYW5pemF0aW9uV2ViaG9va0NvbmZpZ1JlcXVlc3QSCgoCaWQYASABKAkiWwonRGVsZXRlT3JnYW5pemF0aW9uV2ViaG9va0NvbmZpZ1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiiwEKGENyZWF0ZUludGVncmF0aW9uUmVxdWVzdBIMCgR0eXBlGAEgASgJEgwKBG5hbWUYAiABKAkSDAoEY29kZRgDIAEoCRIOCgZldmVudHMYBCADKAkSNQoKZXZlbnRzTWV0YRgFIAMoCzIhLndnLmNvc21vLm5vdGlmaWNhdGlvbnMuRXZlbnRNZXRhIk0KGUNyZWF0ZUludGVncmF0aW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSIkCiJHZXRPcmdhbml6YXRpb25JbnRlZ3JhdGlvbnNSZXF1ZXN0IioKFlNsYWNrSW50ZWdyYXRpb25Db25maWcSEAoIZW5kcG9pbnQYASABKAkiogEKEUludGVncmF0aW9uQ29uZmlnEjMKBHR5cGUYASABKA4yJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5JbnRlZ3JhdGlvblR5cGUSTgoWc2xhY2tJbnRlZ3JhdGlvbkNvbmZpZxgCIAEoCzIsLndnLmNvc21vLnBsYXRmb3JtLnYxLlNsYWNrSW50ZWdyYXRpb25Db25maWdIAEIICgZjb25maWciwAEKC0ludGVncmF0aW9uEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSDAoEdHlwZRgDIAEoCRIOCgZldmVudHMYBCADKAkSQgoRaW50ZWdyYXRpb25Db25maWcYBSABKAsyJy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5JbnRlZ3JhdGlvbkNvbmZpZxI1CgpldmVudHNNZXRhGAYgAygLMiEud2cuY29zbW8ubm90aWZpY2F0aW9ucy5FdmVudE1ldGEikAEKI0dldE9yZ2FuaXphdGlvbkludGVncmF0aW9uc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USNwoMaW50ZWdyYXRpb25zGAIgAygLMiEud2cuY29zbW8ucGxhdGZvcm0udjEuSW50ZWdyYXRpb24ihgEKHlVwZGF0ZUludGVncmF0aW9uQ29uZmlnUmVxdWVzdBIKCgJpZBgBIAEoCRIQCghlbmRwb2ludBgCIAEoCRIOCgZldmVudHMYAyADKAkSNgoLZXZlbnRzX21ldGEYBCADKAsyIS53Zy5jb3Ntby5ub3RpZmljYXRpb25zLkV2ZW50TWV0YSJTCh9VcGRhdGVJbnRlZ3JhdGlvbkNvbmZpZ1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiJgoYRGVsZXRlSW50ZWdyYXRpb25SZXF1ZXN0EgoKAmlkGAEgASgJIk0KGURlbGV0ZUludGVncmF0aW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSIrChlEZWxldGVPcmdhbml6YXRpb25SZXF1ZXN0Eg4KBnVzZXJJRBgBIAEoCSJOChpEZWxldGVPcmdhbml6YXRpb25SZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIhwKGlJlc3RvcmVPcmdhbml6YXRpb25SZXF1ZXN0Ik8KG1Jlc3RvcmVPcmdhbml6YXRpb25SZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIhoKGExlYXZlT3JnYW5pemF0aW9uUmVxdWVzdCJNChlMZWF2ZU9yZ2FuaXphdGlvblJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiZgogVXBkYXRlT3JnYW5pemF0aW9uRGV0YWlsc1JlcXVlc3QSDgoGdXNlcklEGAEgASgJEhgKEG9yZ2FuaXphdGlvbk5hbWUYAiABKAkSGAoQb3JnYW5pemF0aW9uU2x1ZxgDIAEoCSJVCiFVcGRhdGVPcmdhbml6YXRpb25EZXRhaWxzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSJGChtVcGRhdGVPcmdNZW1iZXJHcm91cFJlcXVlc3QSFwoPb3JnTWVtYmVyVXNlcklEGAEgASgJEg4KBmdyb3VwcxgCIAMoCSJQChxVcGRhdGVPcmdNZW1iZXJHcm91cFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiRQoZQ3JlYXRlT3JnYW5pemF0aW9uUmVxdWVzdBIMCgRuYW1lGAEgASgJEgwKBHNsdWcYAiABKAkSDAoEcGxhbhgDIAEoCSLQAQoaQ3JlYXRlT3JnYW5pemF0aW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI9Cgxvcmdhbml6YXRpb24YAiABKAsyIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Pcmdhbml6YXRpb25IAIgBARIcCg9zdHJpcGVTZXNzaW9uSWQYAyABKAlIAYgBAUIPCg1fb3JnYW5pemF0aW9uQhIKEF9zdHJpcGVTZXNzaW9uSWQidwoMT3JnYW5pemF0aW9uEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSDAoEc2x1ZxgDIAEoCRIaCg1jcmVhdG9yVXNlcklkGAQgASgJSACIAQESEQoJY3JlYXRlZEF0GAUgASgJQhAKDl9jcmVhdG9yVXNlcklkIiwKHEdldE9yZ2FuaXphdGlvbkJ5U2x1Z1JlcXVlc3QSDAoEc2x1ZxgBIAEoCSKhAQodR2V0T3JnYW5pemF0aW9uQnlTbHVnUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI9Cgxvcmdhbml6YXRpb24YAiABKAsyIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Pcmdhbml6YXRpb25IAIgBAUIPCg1fb3JnYW5pemF0aW9uIhgKFkdldEJpbGxpbmdQbGFuc1JlcXVlc3Qi9wIKF0dldEJpbGxpbmdQbGFuc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USSAoFcGxhbnMYAiADKAsyOS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRCaWxsaW5nUGxhbnNSZXNwb25zZS5CaWxsaW5nUGxhbhpTChJCaWxsaW5nUGxhbkZlYXR1cmUSCgoCaWQYASABKAkSEwoLZGVzY3JpcHRpb24YAyABKAkSEgoFbGltaXQYBCABKAVIAIgBAUIICgZfbGltaXQaigEKC0JpbGxpbmdQbGFuEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSDQoFcHJpY2UYAyABKAUSUgoIZmVhdHVyZXMYBCADKAsyQC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRCaWxsaW5nUGxhbnNSZXNwb25zZS5CaWxsaW5nUGxhbkZlYXR1cmUiLAocQ3JlYXRlQ2hlY2tvdXRTZXNzaW9uUmVxdWVzdBIMCgRwbGFuGAEgASgJImQKHUNyZWF0ZUNoZWNrb3V0U2Vzc2lvblJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USEQoJc2Vzc2lvbklkGAIgASgJIiMKIUNyZWF0ZUJpbGxpbmdQb3J0YWxTZXNzaW9uUmVxdWVzdCJ2CiJDcmVhdGVCaWxsaW5nUG9ydGFsU2Vzc2lvblJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USEQoJc2Vzc2lvbklkGAIgASgJEgsKA3VybBgDIAEoCSIiChJVcGdyYWRlUGxhblJlcXVlc3QSDAoEcGxhbhgBIAEoCSJHChNVcGdyYWRlUGxhblJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiwgEKFkdldEdyYXBoTWV0cmljc1JlcXVlc3QSGgoSZmVkZXJhdGVkR3JhcGhOYW1lGAEgASgJEg0KBXJhbmdlGAIgASgFEjIKCWRhdGVSYW5nZRgDIAEoCzIfLndnLmNvc21vLnBsYXRmb3JtLnYxLkRhdGVSYW5nZRI2CgdmaWx0ZXJzGAQgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuQW5hbHl0aWNzRmlsdGVyEhEKCW5hbWVzcGFjZRgFIAEoCSLyAgoXR2V0R3JhcGhNZXRyaWNzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI+CghyZXF1ZXN0cxgCIAEoCzIsLndnLmNvc21vLnBsYXRmb3JtLnYxLk1ldHJpY3NEYXNoYm9hcmRNZXRyaWMSPQoHbGF0ZW5jeRgDIAEoCzIsLndnLmNvc21vLnBsYXRmb3JtLnYxLk1ldHJpY3NEYXNoYm9hcmRNZXRyaWMSPAoGZXJyb3JzGAQgASgLMiwud2cuY29zbW8ucGxhdGZvcm0udjEuTWV0cmljc0Rhc2hib2FyZE1ldHJpYxJACgdmaWx0ZXJzGAUgAygLMi8ud2cuY29zbW8ucGxhdGZvcm0udjEuQW5hbHl0aWNzVmlld1Jlc3VsdEZpbHRlchIXCgpyZXNvbHV0aW9uGAYgASgJSACIAQFCDQoLX3Jlc29sdXRpb24iwQEKFk1ldHJpY3NEYXNoYm9hcmRNZXRyaWMSDQoFdmFsdWUYASABKAkSGgoNcHJldmlvdXNWYWx1ZRgCIAEoCUgAiAEBEjEKA3RvcBgDIAMoCzIkLndnLmNvc21vLnBsYXRmb3JtLnYxLk1ldHJpY3NUb3BJdGVtEjcKBnNlcmllcxgEIAMoCzInLndnLmNvc21vLnBsYXRmb3JtLnYxLk1ldHJpY3NTZXJpZXNJdGVtQhAKDl9wcmV2aW91c1ZhbHVlIlAKDk1ldHJpY3NUb3BJdGVtEgwKBGhhc2gYASABKAkSDAoEbmFtZRgCIAEoCRINCgV2YWx1ZRgDIAEoCRITCgtpc1BlcnNpc3RlZBgEIAEoCCKxAQoRTWV0cmljc1Nlcmllc0l0ZW0SEQoJdGltZXN0YW1wGAEgASgJEg0KBXZhbHVlGAIgASgJEhoKDXByZXZpb3VzVmFsdWUYAyABKAlIAIgBARIQCgNwNTAYBCABKAlIAYgBARIQCgNwOTAYBSABKAlIAogBARIQCgNwOTkYBiABKAlIA4gBAUIQCg5fcHJldmlvdXNWYWx1ZUIGCgRfcDUwQgYKBF9wOTBCBgoEX3A5OSK7AQoQTWV0cmljc0Rhc2hib2FyZBIMCgRuYW1lGAEgASgJEg0KBXRpdGxlGAIgASgJEgwKBHR5cGUYAyABKAkSLQoEdW5pdBgEIAEoDjIaLndnLmNvc21vLnBsYXRmb3JtLnYxLlVuaXRIAIgBARIWCglpc19oaWRkZW4YBSABKAhIAYgBARITCgZpc19jdGEYBiABKAhIAogBAUIHCgVfdW5pdEIMCgpfaXNfaGlkZGVuQgkKB19pc19jdGEixgEKGkdldE1ldHJpY3NFcnJvclJhdGVSZXF1ZXN0EhoKEmZlZGVyYXRlZEdyYXBoTmFtZRgBIAEoCRINCgVyYW5nZRgCIAEoBRIyCglkYXRlUmFuZ2UYAyABKAsyHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EYXRlUmFuZ2USNgoHZmlsdGVycxgEIAMoCzIlLndnLmNvc21vLnBsYXRmb3JtLnYxLkFuYWx5dGljc0ZpbHRlchIRCgluYW1lc3BhY2UYBSABKAkiuQEKG0dldE1ldHJpY3NFcnJvclJhdGVSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkAKBnNlcmllcxgCIAMoCzIwLndnLmNvc21vLnBsYXRmb3JtLnYxLk1ldHJpY3NFcnJvclJhdGVTZXJpZXNJdGVtEhcKCnJlc29sdXRpb24YAyABKAlIAIgBAUINCgtfcmVzb2x1dGlvbiJXChpNZXRyaWNzRXJyb3JSYXRlU2VyaWVzSXRlbRIRCgl0aW1lc3RhbXAYASABKAkSEwoLcmVxdWVzdFJhdGUYAiABKAISEQoJZXJyb3JSYXRlGAMgASgCIr8BChlHZXRTdWJncmFwaE1ldHJpY3NSZXF1ZXN0EhQKDHN1YmdyYXBoTmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSDQoFcmFuZ2UYBCABKAUSMgoJZGF0ZVJhbmdlGAUgASgLMh8ud2cuY29zbW8ucGxhdGZvcm0udjEuRGF0ZVJhbmdlEjYKB2ZpbHRlcnMYBiADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5BbmFseXRpY3NGaWx0ZXIi9QIKGkdldFN1YmdyYXBoTWV0cmljc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USPgoIcmVxdWVzdHMYAiABKAsyLC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5NZXRyaWNzRGFzaGJvYXJkTWV0cmljEj0KB2xhdGVuY3kYAyABKAsyLC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5NZXRyaWNzRGFzaGJvYXJkTWV0cmljEjwKBmVycm9ycxgEIAEoCzIsLndnLmNvc21vLnBsYXRmb3JtLnYxLk1ldHJpY3NEYXNoYm9hcmRNZXRyaWMSQAoHZmlsdGVycxgFIAMoCzIvLndnLmNvc21vLnBsYXRmb3JtLnYxLkFuYWx5dGljc1ZpZXdSZXN1bHRGaWx0ZXISFwoKcmVzb2x1dGlvbhgGIAEoCUgAiAEBQg0KC19yZXNvbHV0aW9uIsgBCiJHZXRTdWJncmFwaE1ldHJpY3NFcnJvclJhdGVSZXF1ZXN0EhQKDHN1YmdyYXBoTmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSDQoFcmFuZ2UYBCABKAUSMgoJZGF0ZVJhbmdlGAUgASgLMh8ud2cuY29zbW8ucGxhdGZvcm0udjEuRGF0ZVJhbmdlEjYKB2ZpbHRlcnMYBiADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5BbmFseXRpY3NGaWx0ZXIiwQEKI0dldFN1YmdyYXBoTWV0cmljc0Vycm9yUmF0ZVJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQAoGc2VyaWVzGAIgAygLMjAud2cuY29zbW8ucGxhdGZvcm0udjEuTWV0cmljc0Vycm9yUmF0ZVNlcmllc0l0ZW0SFwoKcmVzb2x1dGlvbhgDIAEoCUgAiAEBQg0KC19yZXNvbHV0aW9uIlMKGEZvcmNlQ2hlY2tTdWNjZXNzUmVxdWVzdBIQCghjaGVja19pZBgBIAEoCRISCgpncmFwaF9uYW1lGAIgASgJEhEKCW5hbWVzcGFjZRgDIAEoCSJNChlGb3JjZUNoZWNrU3VjY2Vzc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UimAEKLFRvZ2dsZUNoYW5nZU92ZXJyaWRlc0ZvckFsbE9wZXJhdGlvbnNSZXF1ZXN0EhAKCGNoZWNrX2lkGAEgASgJEg8KB2lzX3NhZmUYAiABKAgSEgoKZ3JhcGhfbmFtZRgDIAEoCRIRCgluYW1lc3BhY2UYBCABKAkSEwoGc2VhcmNoGAUgASgJSACIAQFCCQoHX3NlYXJjaCJhCi1Ub2dnbGVDaGFuZ2VPdmVycmlkZXNGb3JBbGxPcGVyYXRpb25zUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSKHAQosQ3JlYXRlSWdub3JlT3ZlcnJpZGVzRm9yQWxsT3BlcmF0aW9uc1JlcXVlc3QSEAoIY2hlY2tfaWQYASABKAkSEgoKZ3JhcGhfbmFtZRgCIAEoCRIRCgluYW1lc3BhY2UYAyABKAkSEwoGc2VhcmNoGAQgASgJSACIAQFCCQoHX3NlYXJjaCJhCi1DcmVhdGVJZ25vcmVPdmVycmlkZXNGb3JBbGxPcGVyYXRpb25zUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSJACg5PdmVycmlkZUNoYW5nZRISCgpjaGFuZ2VUeXBlGAEgASgJEhEKBHBhdGgYAiABKAlIAIgBAUIHCgVfcGF0aCKvAQofQ3JlYXRlT3BlcmF0aW9uT3ZlcnJpZGVzUmVxdWVzdBISCgpncmFwaF9uYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRIWCg5vcGVyYXRpb25faGFzaBgDIAEoCRIWCg5vcGVyYXRpb25fbmFtZRgEIAEoCRI1CgdjaGFuZ2VzGAUgAygLMiQud2cuY29zbW8ucGxhdGZvcm0udjEuT3ZlcnJpZGVDaGFuZ2UiVAogQ3JlYXRlT3BlcmF0aW9uT3ZlcnJpZGVzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSKAAQonQ3JlYXRlT3BlcmF0aW9uSWdub3JlQWxsT3ZlcnJpZGVSZXF1ZXN0EhIKCmdyYXBoX25hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEhYKDm9wZXJhdGlvbl9oYXNoGAMgASgJEhYKDm9wZXJhdGlvbl9uYW1lGAQgASgJIlwKKENyZWF0ZU9wZXJhdGlvbklnbm9yZUFsbE92ZXJyaWRlUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSKXAQofUmVtb3ZlT3BlcmF0aW9uT3ZlcnJpZGVzUmVxdWVzdBISCgpncmFwaF9uYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRIWCg5vcGVyYXRpb25faGFzaBgDIAEoCRI1CgdjaGFuZ2VzGAQgAygLMiQud2cuY29zbW8ucGxhdGZvcm0udjEuT3ZlcnJpZGVDaGFuZ2UiVAogUmVtb3ZlT3BlcmF0aW9uT3ZlcnJpZGVzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSJoCidSZW1vdmVPcGVyYXRpb25JZ25vcmVBbGxPdmVycmlkZVJlcXVlc3QSEgoKZ3JhcGhfbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSFgoOb3BlcmF0aW9uX2hhc2gYAyABKAkiXAooUmVtb3ZlT3BlcmF0aW9uSWdub3JlQWxsT3ZlcnJpZGVSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIl0KHEdldE9wZXJhdGlvbk92ZXJyaWRlc1JlcXVlc3QSEgoKZ3JhcGhfbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSFgoOb3BlcmF0aW9uX2hhc2gYAyABKAkinAEKHUdldE9wZXJhdGlvbk92ZXJyaWRlc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USNQoHY2hhbmdlcxgCIAMoCzIkLndnLmNvc21vLnBsYXRmb3JtLnYxLk92ZXJyaWRlQ2hhbmdlEhIKCmlnbm9yZV9hbGwYAyABKAgiXgoWR2V0QWxsT3ZlcnJpZGVzUmVxdWVzdBISCgpncmFwaF9uYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRINCgVsaW1pdBgDIAEoBRIOCgZvZmZzZXQYBCABKAUiowIKF0dldEFsbE92ZXJyaWRlc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USSQoJb3ZlcnJpZGVzGAIgAygLMjYud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0QWxsT3ZlcnJpZGVzUmVzcG9uc2UuT3ZlcnJpZGUSEwoLdG90YWxfY291bnQYAyABKAUadgoIT3ZlcnJpZGUSDAoEaGFzaBgBIAEoCRIMCgRuYW1lGAIgASgJEhwKFGNoYW5nZXNPdmVycmlkZUNvdW50GAMgASgNEhwKFGhhc0lnbm9yZUFsbE92ZXJyaWRlGAQgASgIEhIKCnVwZGF0ZWRfYXQYBSABKAkiTgobSXNHaXRIdWJBcHBJbnN0YWxsZWRSZXF1ZXN0Ei8KCGdpdF9pbmZvGAEgASgLMh0ud2cuY29zbW8ucGxhdGZvcm0udjEuR2l0SW5mbyJmChxJc0dpdEh1YkFwcEluc3RhbGxlZFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USFAoMaXNfaW5zdGFsbGVkGAIgASgIIjAKC0dyb3VwTWFwcGVyEg8KB2dyb3VwSWQYASABKAkSEAoIc3NvR3JvdXAYAiABKAkioAEKGUNyZWF0ZU9JRENQcm92aWRlclJlcXVlc3QSDAoEbmFtZRgBIAEoCRIZChFkaXNjb3ZlcnlFbmRwb2ludBgCIAEoCRIQCghjbGllbnRJRBgDIAEoCRIUCgxjbGllbnRTZWNyZXQYBCABKAkSMgoHbWFwcGVycxgFIAMoCzIhLndnLmNvc21vLnBsYXRmb3JtLnYxLkdyb3VwTWFwcGVyIocBChpDcmVhdGVPSURDUHJvdmlkZXJSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEhEKCXNpZ25JblVSTBgCIAEoCRISCgpzaWduT3V0VVJMGAMgASgJEhAKCGxvZ2luVVJMGAQgASgJIqwBCgxPSURDUHJvdmlkZXISCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCRINCgVhbGlhcxgDIAEoCRIQCghlbmRwb2ludBgEIAEoCRIRCglsb2dpbl91cmwYBSABKAkSHAoUc2lnbl9pbl9yZWRpcmVjdF91cmwYBiABKAkSHQoVc2lnbl9vdXRfcmVkaXJlY3RfdXJsGAcgASgJEhEKCWNyZWF0ZWRBdBgIIAEoCSIaChhMaXN0T0lEQ1Byb3ZpZGVyc1JlcXVlc3QihAEKGUxpc3RPSURDUHJvdmlkZXJzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI1Cglwcm92aWRlcnMYAiADKAsyIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5PSURDUHJvdmlkZXIiJAoWR2V0T0lEQ1Byb3ZpZGVyUmVxdWVzdBIKCgJpZBgBIAEoCSLoAQoXR2V0T0lEQ1Byb3ZpZGVyUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIMCgRuYW1lGAIgASgJEhAKCGVuZHBvaW50GAMgASgJEhAKCGxvZ2luVVJMGAQgASgJEhkKEXNpZ25JblJlZGlyZWN0VVJMGAUgASgJEhoKEnNpZ25PdXRSZWRpcmVjdFVSTBgGIAEoCRIyCgdtYXBwZXJzGAcgAygLMiEud2cuY29zbW8ucGxhdGZvcm0udjEuR3JvdXBNYXBwZXIiJwoZRGVsZXRlT0lEQ1Byb3ZpZGVyUmVxdWVzdBIKCgJpZBgBIAEoCSJOChpEZWxldGVPSURDUHJvdmlkZXJSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIlkKF1VwZGF0ZUlEUE1hcHBlcnNSZXF1ZXN0EjIKB21hcHBlcnMYASADKAsyIS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Hcm91cE1hcHBlchIKCgJpZBgCIAEoCSJMChhVcGRhdGVJRFBNYXBwZXJzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSIlCiNHZXRPcmdhbml6YXRpb25SZXF1ZXN0c0NvdW50UmVxdWVzdCJnCiRHZXRPcmdhbml6YXRpb25SZXF1ZXN0c0NvdW50UmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRINCgVjb3VudBgCIAEoAyKjAQoST3JnYW5pemF0aW9uSW52aXRlEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSDAoEc2x1ZxgDIAEoCRIaCg1jcmVhdG9yVXNlcklkGAQgASgJSACIAQESEQoJY3JlYXRlZEF0GAUgASgJEhYKCWludml0ZWRCeRgGIAEoCUgBiAEBQhAKDl9jcmVhdG9yVXNlcklkQgwKCl9pbnZpdGVkQnkiWAoTR2V0QXVkaXRMb2dzUmVxdWVzdBINCgVsaW1pdBgBIAEoBRIOCgZvZmZzZXQYAiABKAUSEQoJc3RhcnREYXRlGAMgASgJEg8KB2VuZERhdGUYBCABKAkimwIKCEF1ZGl0TG9nEgoKAmlkGAEgASgJEhgKEGFjdG9yRGlzcGxheU5hbWUYAiABKAkSDgoGYWN0aW9uGAMgASgJEhEKCWFjdG9yVHlwZRgEIAEoCRITCgthdWRpdEFjdGlvbhgFIAEoCRIcChRhdWRpdGFibGVEaXNwbGF5TmFtZRgGIAEoCRIZChF0YXJnZXREaXNwbGF5TmFtZRgHIAEoCRISCgp0YXJnZXRUeXBlGAggASgJEhEKCWNyZWF0ZWRBdBgJIAEoCRIZChF0YXJnZXROYW1lc3BhY2VJZBgKIAEoCRIiChp0YXJnZXROYW1lc3BhY2VEaXNwbGF5TmFtZRgLIAEoCRISCgphcGlLZXlOYW1lGAwgASgJIoUBChRHZXRBdWRpdExvZ3NSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEiwKBGxvZ3MYAiADKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5BdWRpdExvZxINCgVjb3VudBgDIAEoBSIXChVHZXRJbnZpdGF0aW9uc1JlcXVlc3QiiQEKFkdldEludml0YXRpb25zUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI9CgtpbnZpdGF0aW9ucxgCIAMoCzIoLndnLmNvc21vLnBsYXRmb3JtLnYxLk9yZ2FuaXphdGlvbkludml0ZSJKCiBBY2NlcHRPckRlY2xpbmVJbnZpdGF0aW9uUmVxdWVzdBIWCg5vcmdhbml6YXRpb25JZBgBIAEoCRIOCgZhY2NlcHQYAiABKAgiVQohQWNjZXB0T3JEZWNsaW5lSW52aXRhdGlvblJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2Ui3wQKEEdyYXBoQ29tcG9zaXRpb24SCgoCaWQYASABKAkSFwoPc2NoZW1hVmVyc2lvbklkGAIgASgJEhEKCWNyZWF0ZWRBdBgDIAEoCRIUCgxpc0NvbXBvc2FibGUYBCABKAgSHgoRY29tcG9zaXRpb25FcnJvcnMYBSABKAlIAIgBARIWCgljcmVhdGVkQnkYBiABKAlIAYgBARIVCg1pc0xhdGVzdFZhbGlkGAcgASgIEiIKFXJvdXRlckNvbmZpZ1NpZ25hdHVyZRgIIAEoCUgCiAEBEhsKDmFkbWlzc2lvbkVycm9yGAkgASgJSAOIAQESHAoPZGVwbG95bWVudEVycm9yGAogASgJSASIAQESKAobaGFzTXVsdGlwbGVDaGFuZ2VkU3ViZ3JhcGhzGAsgASgISAWIAQESJAoXdHJpZ2dlcmVkQnlTdWJncmFwaE5hbWUYDCABKAlIBogBARIgChNjb21wb3NpdGlvbldhcm5pbmdzGA0gASgJSAeIAQESJAoccm91dGVyX2NvbXBhdGliaWxpdHlfdmVyc2lvbhgOIAEoCUIUChJfY29tcG9zaXRpb25FcnJvcnNCDAoKX2NyZWF0ZWRCeUIYChZfcm91dGVyQ29uZmlnU2lnbmF0dXJlQhEKD19hZG1pc3Npb25FcnJvckISChBfZGVwbG95bWVudEVycm9yQh4KHF9oYXNNdWx0aXBsZUNoYW5nZWRTdWJncmFwaHNCGgoYX3RyaWdnZXJlZEJ5U3ViZ3JhcGhOYW1lQhYKFF9jb21wb3NpdGlvbldhcm5pbmdzIskBChhHcmFwaENvbXBvc2l0aW9uU3ViZ3JhcGgSCgoCaWQYASABKAkSFwoPc2NoZW1hVmVyc2lvbklkGAIgASgJEgwKBG5hbWUYAyABKAkSEQoJdGFyZ2V0X2lkGAQgASgJEhkKEWlzRmVhdHVyZVN1YmdyYXBoGAUgASgIEhIKCmNoYW5nZVR5cGUYBiABKAkSOAoMc3ViZ3JhcGhUeXBlGAcgASgOMiIud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGhUeXBlIqwBChZHZXRDb21wb3NpdGlvbnNSZXF1ZXN0EhQKDGZlZEdyYXBoTmFtZRgBIAEoCRINCgVsaW1pdBgCIAEoBRIOCgZvZmZzZXQYAyABKAUSEQoJc3RhcnREYXRlGAQgASgJEg8KB2VuZERhdGUYBSABKAkSEQoJbmFtZXNwYWNlGAYgASgJEiYKHmV4Y2x1ZGVGZWF0dXJlRmxhZ0NvbXBvc2l0aW9ucxgHIAEoCCKYAQoXR2V0Q29tcG9zaXRpb25zUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI8Cgxjb21wb3NpdGlvbnMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HcmFwaENvbXBvc2l0aW9uEg0KBWNvdW50GAMgASgFIkgKHEdldENvbXBvc2l0aW9uRGV0YWlsc1JlcXVlc3QSFQoNY29tcG9zaXRpb25JZBgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkitQMKFkZlYXR1cmVGbGFnQ29tcG9zaXRpb24SCgoCaWQYASABKAkSFwoPc2NoZW1hVmVyc2lvbklkGAIgASgJEhEKCWNyZWF0ZWRBdBgDIAEoCRIUCgxpc0NvbXBvc2FibGUYBCABKAgSHgoRY29tcG9zaXRpb25FcnJvcnMYBSABKAlIAIgBARIWCgljcmVhdGVkQnkYBiABKAlIAYgBARIiChVyb3V0ZXJDb25maWdTaWduYXR1cmUYByABKAlIAogBARIbCg5hZG1pc3Npb25FcnJvchgIIAEoCUgDiAEBEhwKD2RlcGxveW1lbnRFcnJvchgJIAEoCUgEiAEBEhcKD2ZlYXR1cmVGbGFnTmFtZRgKIAEoCRIgChNjb21wb3NpdGlvbldhcm5pbmdzGAsgASgJSAWIAQFCFAoSX2NvbXBvc2l0aW9uRXJyb3JzQgwKCl9jcmVhdGVkQnlCGAoWX3JvdXRlckNvbmZpZ1NpZ25hdHVyZUIRCg9fYWRtaXNzaW9uRXJyb3JCEgoQX2RlcGxveW1lbnRFcnJvckIWChRfY29tcG9zaXRpb25XYXJuaW5ncyLlAgodR2V0Q29tcG9zaXRpb25EZXRhaWxzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI7Cgtjb21wb3NpdGlvbhgCIAEoCzImLndnLmNvc21vLnBsYXRmb3JtLnYxLkdyYXBoQ29tcG9zaXRpb24STAoUY29tcG9zaXRpb25TdWJncmFwaHMYAyADKAsyLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HcmFwaENvbXBvc2l0aW9uU3ViZ3JhcGgSOAoMY2hhbmdlQ291bnRzGAQgASgLMiIud2cuY29zbW8ucGxhdGZvcm0udjEuQ2hhbmdlQ291bnRzEk0KF2ZlYXR1cmVGbGFnQ29tcG9zaXRpb25zGAUgAygLMiwud2cuY29zbW8ucGxhdGZvcm0udjEuRmVhdHVyZUZsYWdDb21wb3NpdGlvbiJKChxHZXRTZGxCeVNjaGVtYVZlcnNpb25SZXF1ZXN0EhcKD3NjaGVtYVZlcnNpb25JZBgBIAEoCRIRCgl0YXJnZXRfaWQYAiABKAkidQodR2V0U2RsQnlTY2hlbWFWZXJzaW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRILCgNzZGwYAiABKAkSFQoNY2xpZW50X3NjaGVtYRgDIAEoCSI9CiJHZXRDaGFuZ2Vsb2dCeVNjaGVtYVZlcnNpb25SZXF1ZXN0EhcKD3NjaGVtYVZlcnNpb25JZBgBIAEoCSKfAQojR2V0Q2hhbmdlbG9nQnlTY2hlbWFWZXJzaW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJGCgljaGFuZ2Vsb2cYAiABKAsyMy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWRlcmF0ZWRHcmFwaENoYW5nZWxvZ091dHB1dCIjCiFHZXRVc2VyQWNjZXNzaWJsZVJlc291cmNlc1JlcXVlc3QiqwQKIkdldFVzZXJBY2Nlc3NpYmxlUmVzb3VyY2VzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJWCgpuYW1lc3BhY2VzGAIgAygLMkIud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0VXNlckFjY2Vzc2libGVSZXNvdXJjZXNSZXNwb25zZS5OYW1lc3BhY2USYAoPZmVkZXJhdGVkR3JhcGhzGAMgAygLMkcud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0VXNlckFjY2Vzc2libGVSZXNvdXJjZXNSZXNwb25zZS5GZWRlcmF0ZWRHcmFwaBJUCglzdWJncmFwaHMYBCADKAsyQS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRVc2VyQWNjZXNzaWJsZVJlc291cmNlc1Jlc3BvbnNlLlN1YkdyYXBoGiUKCU5hbWVzcGFjZRIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJGkMKDkZlZGVyYXRlZEdyYXBoEhAKCHRhcmdldElkGAEgASgJEgwKBG5hbWUYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJGlcKCFN1YkdyYXBoEhAKCHRhcmdldElkGAEgASgJEgwKBG5hbWUYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJEhgKEGZlZGVyYXRlZEdyYXBoSWQYBCABKAkiYAocVXBkYXRlRmVhdHVyZVNldHRpbmdzUmVxdWVzdBIOCgZlbmFibGUYASABKAgSMAoJZmVhdHVyZUlkGAIgASgOMh0ud2cuY29zbW8ucGxhdGZvcm0udjEuRmVhdHVyZSJRCh1VcGRhdGVGZWF0dXJlU2V0dGluZ3NSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIkQKGUdldFN1YmdyYXBoTWVtYmVyc1JlcXVlc3QSFAoMc3ViZ3JhcGhOYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCSJJCg5TdWJncmFwaE1lbWJlchIOCgZ1c2VySWQYASABKAkSDQoFZW1haWwYAiABKAkSGAoQc3ViZ3JhcGhNZW1iZXJJZBgEIAEoCSKFAQoaR2V0U3ViZ3JhcGhNZW1iZXJzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI1CgdtZW1iZXJzGAIgAygLMiQud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGhNZW1iZXIiSQoQQWRkUmVhZG1lUmVxdWVzdBISCgp0YXJnZXROYW1lGAEgASgJEg4KBnJlYWRtZRgCIAEoCRIRCgluYW1lc3BhY2UYAyABKAkiRQoRQWRkUmVhZG1lUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSLjAgoGUm91dGVyEhAKCGhvc3RuYW1lGAEgASgJEhMKC2NsdXN0ZXJOYW1lGAIgASgJEhMKC3NlcnZpY2VOYW1lGAMgASgJEhYKDnNlcnZpY2VWZXJzaW9uGAQgASgJEhkKEXNlcnZpY2VJbnN0YW5jZUlkGAUgASgJEhUKDXVwdGltZVNlY29uZHMYBiABKAkSGwoTc2VydmVyVXB0aW1lU2Vjb25kcxgHIAEoCRIVCg1jb21wb3NpdGlvbklkGAggASgJEhsKE29uTGF0ZXN0Q29tcG9zaXRpb24YCSABKAgSEQoJcHJvY2Vzc0lkGAogASgJEhUKDW1lbW9yeVVzYWdlTWIYCyABKAISIAoYbWVtb3J5VXNhZ2VDaGFuZ2VQZXJjZW50GAwgASgCEhcKD2NwdVVzYWdlUGVyY2VudBgNIAEoAhIdChVjcHVVc2FnZUNoYW5nZVBlcmNlbnQYDiABKAIiPAoRR2V0Um91dGVyc1JlcXVlc3QSFAoMZmVkR3JhcGhOYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCSJ1ChJHZXRSb3V0ZXJzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRItCgdyb3V0ZXJzGAIgAygLMhwud2cuY29zbW8ucGxhdGZvcm0udjEuUm91dGVyIuYBCgpDbGllbnRJbmZvEgwKBG5hbWUYASABKAkSCgoCaWQYAiABKAkSEQoJY3JlYXRlZEF0GAMgASgJEhUKDWxhc3RVcGRhdGVkQXQYBCABKAkSEQoJY3JlYXRlZEJ5GAUgASgJEhUKDWxhc3RVcGRhdGVkQnkYBiABKAkSJQoYcGVyc2lzdGVkT3BlcmF0aW9uc0NvdW50GAcgASgFSACIAQESFwoKaGFzVHJhZmZpYxgIIAEoCEgBiAEBQhsKGV9wZXJzaXN0ZWRPcGVyYXRpb25zQ291bnRCDQoLX2hhc1RyYWZmaWMiVAoRR2V0Q2xpZW50c1JlcXVlc3QSFAoMZmVkR3JhcGhOYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRIWCg5pbmNsdWRlVHJhZmZpYxgDIAEoCCJ5ChJHZXRDbGllbnRzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIxCgdjbGllbnRzGAIgAygLMiAud2cuY29zbW8ucGxhdGZvcm0udjEuQ2xpZW50SW5mbyJZChpQcmV2aWV3RGVsZXRlQ2xpZW50UmVxdWVzdBIUCgxmZWRHcmFwaE5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEhIKCmNsaWVudE5hbWUYAyABKAki0QEKG1ByZXZpZXdEZWxldGVDbGllbnRSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjAKBmNsaWVudBgCIAEoCzIgLndnLmNvc21vLnBsYXRmb3JtLnYxLkNsaWVudEluZm8SIAoYcGVyc2lzdGVkT3BlcmF0aW9uc0NvdW50GAMgASgFEhIKCmhhc1RyYWZmaWMYBCABKAgSGAoQb3JnYW5pemF0aW9uU2x1ZxgFIAEoCSJSChNEZWxldGVDbGllbnRSZXF1ZXN0EhQKDGZlZEdyYXBoTmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSEgoKY2xpZW50TmFtZRgDIAEoCSLgAQoURGVsZXRlQ2xpZW50UmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIwCgZjbGllbnQYAiABKAsyIC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DbGllbnRJbmZvEh4KFmRlbGV0ZWRPcGVyYXRpb25zQ291bnQYAyABKAUaRAoJT3BlcmF0aW9uEgoKAmlkGAEgASgJEhMKC29wZXJhdGlvbklkGAIgASgJEhYKDm9wZXJhdGlvbk5hbWVzGAMgAygJItQCChRHZXRGaWVsZFVzYWdlUmVxdWVzdBISCgpncmFwaF9uYW1lGAEgASgJEhYKCW5hbWVkVHlwZRgCIAEoCUgAiAEBEhUKCHR5cGVuYW1lGAMgASgJSAGIAQESEgoFZmllbGQYBCABKAlIAogBARISCgVyYW5nZRgFIAEoBUgDiAEBEjIKCWRhdGVSYW5nZRgGIAEoCzIfLndnLmNvc21vLnBsYXRmb3JtLnYxLkRhdGVSYW5nZRIRCgluYW1lc3BhY2UYByABKAkSHgoRZmVhdHVyZV9mbGFnX25hbWUYCCABKAlIBIgBARITCgtpc19hcmd1bWVudBgJIAEoCBIQCghpc19pbnB1dBgKIAEoCEIMCgpfbmFtZWRUeXBlQgsKCV90eXBlbmFtZUIICgZfZmllbGRCCAoGX3JhbmdlQhQKEl9mZWF0dXJlX2ZsYWdfbmFtZSK3AQoUQ2xpZW50V2l0aE9wZXJhdGlvbnMSDAoEbmFtZRgBIAEoCRIPCgd2ZXJzaW9uGAIgASgJEkgKCm9wZXJhdGlvbnMYAyADKAsyNC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DbGllbnRXaXRoT3BlcmF0aW9ucy5PcGVyYXRpb24aNgoJT3BlcmF0aW9uEgwKBGhhc2gYASABKAkSDAoEbmFtZRgCIAEoCRINCgVjb3VudBgDIAEoBSJfCg5GaWVsZFVzYWdlTWV0YRIUCgxzdWJncmFwaF9pZHMYASADKAkSGgoSZmlyc3RTZWVuVGltZXN0YW1wGAIgASgJEhsKE2xhdGVzdFNlZW5UaW1lc3RhbXAYAyABKAki+wEKFUdldEZpZWxkVXNhZ2VSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEj8KDnJlcXVlc3Rfc2VyaWVzGAIgAygLMicud2cuY29zbW8ucGxhdGZvcm0udjEuUmVxdWVzdFNlcmllc0l0ZW0SOwoHY2xpZW50cxgDIAMoCzIqLndnLmNvc21vLnBsYXRmb3JtLnYxLkNsaWVudFdpdGhPcGVyYXRpb25zEjIKBG1ldGEYBCABKAsyJC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GaWVsZFVzYWdlTWV0YSImChZDcmVhdGVOYW1lc3BhY2VSZXF1ZXN0EgwKBG5hbWUYASABKAkiSwoXQ3JlYXRlTmFtZXNwYWNlUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSImChZEZWxldGVOYW1lc3BhY2VSZXF1ZXN0EgwKBG5hbWUYASABKAkiSwoXRGVsZXRlTmFtZXNwYWNlUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSI4ChZSZW5hbWVOYW1lc3BhY2VSZXF1ZXN0EgwKBG5hbWUYASABKAkSEAoIbmV3X25hbWUYAiABKAkiSwoXUmVuYW1lTmFtZXNwYWNlUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSIlCglOYW1lc3BhY2USCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCSIWChRHZXROYW1lc3BhY2VzUmVxdWVzdCJ+ChVHZXROYW1lc3BhY2VzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIzCgpuYW1lc3BhY2VzGAIgAygLMh8ud2cuY29zbW8ucGxhdGZvcm0udjEuTmFtZXNwYWNlIp4BChBNb3ZlR3JhcGhSZXF1ZXN0EgwKBG5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEhUKDW5ld19uYW1lc3BhY2UYAyABKAkSLQogZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24YBCABKAhIAIgBAUIjCiFfZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24ikAIKEU1vdmVHcmFwaFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQQoRY29tcG9zaXRpb25FcnJvcnMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEj8KEGRlcGxveW1lbnRFcnJvcnMYAyADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZXBsb3ltZW50RXJyb3ISRQoTY29tcG9zaXRpb25XYXJuaW5ncxgEIAMoCzIoLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXBvc2l0aW9uV2FybmluZyIyCh1HZXROYW1lc3BhY2VMaW50Q29uZmlnUmVxdWVzdBIRCgluYW1lc3BhY2UYASABKAkinAEKHkdldE5hbWVzcGFjZUxpbnRDb25maWdSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEhUKDWxpbnRlckVuYWJsZWQYAiABKAgSMQoHY29uZmlncxgDIAMoCzIgLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpbnRDb25maWciOwomR2V0TmFtZXNwYWNlQ2hlY2tzQ29uZmlndXJhdGlvblJlcXVlc3QSEQoJbmFtZXNwYWNlGAEgASgJIpIBCidHZXROYW1lc3BhY2VDaGVja3NDb25maWd1cmF0aW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIXCg90aW1lZnJhbWVJbkRheXMYAiABKAUSHAoUdGltZWZyYW1lTGltaXRJbkRheXMYAyABKAUiVwopVXBkYXRlTmFtZXNwYWNlQ2hlY2tzQ29uZmlndXJhdGlvblJlcXVlc3QSEQoJbmFtZXNwYWNlGAEgASgJEhcKD3RpbWVmcmFtZUluRGF5cxgCIAEoBSJeCipVcGRhdGVOYW1lc3BhY2VDaGVja3NDb25maWd1cmF0aW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSJPCiNFbmFibGVMaW50aW5nRm9yVGhlTmFtZXNwYWNlUmVxdWVzdBIRCgluYW1lc3BhY2UYASABKAkSFQoNZW5hYmxlTGludGluZxgCIAEoCCJYCiRFbmFibGVMaW50aW5nRm9yVGhlTmFtZXNwYWNlUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSJZCgpMaW50Q29uZmlnEhAKCHJ1bGVOYW1lGAEgASgJEjkKDXNldmVyaXR5TGV2ZWwYAiABKA4yIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaW50U2V2ZXJpdHkiawojQ29uZmlndXJlTmFtZXNwYWNlTGludENvbmZpZ1JlcXVlc3QSEQoJbmFtZXNwYWNlGAEgASgJEjEKB2NvbmZpZ3MYAiADKAsyIC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaW50Q29uZmlnIlgKJENvbmZpZ3VyZU5hbWVzcGFjZUxpbnRDb25maWdSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIkoKGUVuYWJsZUdyYXBoUHJ1bmluZ1JlcXVlc3QSEQoJbmFtZXNwYWNlGAEgASgJEhoKEmVuYWJsZUdyYXBoUHJ1bmluZxgCIAEoCCJOChpFbmFibGVHcmFwaFBydW5pbmdSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIsgBChJHcmFwaFBydW5pbmdDb25maWcSEAoIcnVsZU5hbWUYASABKAkSOQoNc2V2ZXJpdHlMZXZlbBgCIAEoDjIiLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpbnRTZXZlcml0eRIZChFncmFjZVBlcmlvZEluRGF5cxgDIAEoBRIpChxzY2hlbWFVc2FnZUNoZWNrUGVyaW9kSW5EYXlzGAQgASgFSACIAQFCHwodX3NjaGVtYVVzYWdlQ2hlY2tQZXJpb2RJbkRheXMieworQ29uZmlndXJlTmFtZXNwYWNlR3JhcGhQcnVuaW5nQ29uZmlnUmVxdWVzdBIRCgluYW1lc3BhY2UYASABKAkSOQoHY29uZmlncxgCIAMoCzIoLndnLmNvc21vLnBsYXRmb3JtLnYxLkdyYXBoUHJ1bmluZ0NvbmZpZyJgCixDb25maWd1cmVOYW1lc3BhY2VHcmFwaFBydW5pbmdDb25maWdSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIjoKJUdldE5hbWVzcGFjZUdyYXBoUHJ1bmluZ0NvbmZpZ1JlcXVlc3QSEQoJbmFtZXNwYWNlGAEgASgJIrEBCiZHZXROYW1lc3BhY2VHcmFwaFBydW5pbmdDb25maWdSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEhoKEmdyYXBoUHJ1bmVyRW5hYmxlZBgCIAEoCBI5Cgdjb25maWdzGAMgAygLMigud2cuY29zbW8ucGxhdGZvcm0udjEuR3JhcGhQcnVuaW5nQ29uZmlnIjoKF01pZ3JhdGVNb25vZ3JhcGhSZXF1ZXN0EgwKBG5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJIkwKGE1pZ3JhdGVNb25vZ3JhcGhSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIiUKI0dldFVzZXJBY2Nlc3NpYmxlUGVybWlzc2lvbnNSZXF1ZXN0IjAKClBlcm1pc3Npb24SEwoLZGlzcGxheU5hbWUYASABKAkSDQoFdmFsdWUYAiABKAkijwEKJEdldFVzZXJBY2Nlc3NpYmxlUGVybWlzc2lvbnNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjUKC3Blcm1pc3Npb25zGAIgAygLMiAud2cuY29zbW8ucGxhdGZvcm0udjEuUGVybWlzc2lvbiLrAgoVQ3JlYXRlQ29udHJhY3RSZXF1ZXN0EgwKBG5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEhkKEXNvdXJjZV9ncmFwaF9uYW1lGAMgASgJEhMKC3JvdXRpbmdfdXJsGAQgASgJEh0KFWFkbWlzc2lvbl93ZWJob29rX3VybBgFIAEoCRIUCgxleGNsdWRlX3RhZ3MYBiADKAkSEwoGcmVhZG1lGAcgASgJSACIAQESJQoYYWRtaXNzaW9uX3dlYmhvb2tfc2VjcmV0GAggASgJSAGIAQESFAoMaW5jbHVkZV90YWdzGAkgAygJEi0KIGRpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uGAogASgISAKIAQFCCQoHX3JlYWRtZUIbChlfYWRtaXNzaW9uX3dlYmhvb2tfc2VjcmV0QiMKIV9kaXNhYmxlX3Jlc29sdmFiaWxpdHlfdmFsaWRhdGlvbiKVAgoWQ3JlYXRlQ29udHJhY3RSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkEKEWNvbXBvc2l0aW9uRXJyb3JzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchI/ChBkZXBsb3ltZW50RXJyb3JzGAMgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVwbG95bWVudEVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBCADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcihAMKFVVwZGF0ZUNvbnRyYWN0UmVxdWVzdBIMCgRuYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRIUCgxleGNsdWRlX3RhZ3MYAyADKAkSFAoMaW5jbHVkZV90YWdzGAQgAygJEhgKC3JvdXRpbmdfdXJsGAUgASgJSACIAQESIgoVYWRtaXNzaW9uX3dlYmhvb2tfdXJsGAYgASgJSAGIAQESJQoYYWRtaXNzaW9uX3dlYmhvb2tfc2VjcmV0GAcgASgJSAKIAQESEwoGcmVhZG1lGAggASgJSAOIAQESLQogZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24YCSABKAhIBIgBAUIOCgxfcm91dGluZ191cmxCGAoWX2FkbWlzc2lvbl93ZWJob29rX3VybEIbChlfYWRtaXNzaW9uX3dlYmhvb2tfc2VjcmV0QgkKB19yZWFkbWVCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uIpUCChZVcGRhdGVDb250cmFjdFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQQoRY29tcG9zaXRpb25FcnJvcnMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEj8KEGRlcGxveW1lbnRFcnJvcnMYAyADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZXBsb3ltZW50RXJyb3ISRQoTY29tcG9zaXRpb25XYXJuaW5ncxgEIAMoCzIoLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXBvc2l0aW9uV2FybmluZyIdChtJc01lbWJlckxpbWl0UmVhY2hlZFJlcXVlc3QifQocSXNNZW1iZXJMaW1pdFJlYWNoZWRSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEhUKDWxpbWl0X3JlYWNoZWQYAiABKAgSFAoMbWVtYmVyX2NvdW50GAMgASgFIhMKEURlbGV0ZVVzZXJSZXF1ZXN0IkYKEkRlbGV0ZVVzZXJSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIvABChhDcmVhdGVGZWF0dXJlRmxhZ1JlcXVlc3QSDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSKwoGbGFiZWxzGAMgAygLMhsud2cuY29zbW8ucGxhdGZvcm0udjEuTGFiZWwSHgoWZmVhdHVyZV9zdWJncmFwaF9uYW1lcxgEIAMoCRISCgppc19lbmFibGVkGAUgASgIEi0KIGRpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uGAYgASgISACIAQFCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uIpoCChlDcmVhdGVGZWF0dXJlRmxhZ1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQgoSY29tcG9zaXRpb25fZXJyb3JzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchJAChFkZXBsb3ltZW50X2Vycm9ycxgDIAMoCzIlLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlcGxveW1lbnRFcnJvchJFChNjb21wb3NpdGlvbldhcm5pbmdzGAQgAygLMigud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25XYXJuaW5nIvIBChhVcGRhdGVGZWF0dXJlRmxhZ1JlcXVlc3QSDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSKwoGbGFiZWxzGAMgAygLMhsud2cuY29zbW8ucGxhdGZvcm0udjEuTGFiZWwSHgoWZmVhdHVyZV9zdWJncmFwaF9uYW1lcxgEIAMoCRIUCgx1bnNldF9sYWJlbHMYBSABKAgSLQogZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24YBiABKAhIAIgBAUIjCiFfZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24ixAIKGVVwZGF0ZUZlYXR1cmVGbGFnUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJCChJjb21wb3NpdGlvbl9lcnJvcnMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEkAKEWRlcGxveW1lbnRfZXJyb3JzGAMgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVwbG95bWVudEVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBCADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcSGAoLaGFzX2NoYW5nZWQYBSABKAhIAIgBAUIOCgxfaGFzX2NoYW5nZWQioAEKGEVuYWJsZUZlYXR1cmVGbGFnUmVxdWVzdBIMCgRuYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRIPCgdlbmFibGVkGAMgASgIEi0KIGRpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uGAQgASgISACIAQFCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uIsQCChlFbmFibGVGZWF0dXJlRmxhZ1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQgoSY29tcG9zaXRpb25fZXJyb3JzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchJAChFkZXBsb3ltZW50X2Vycm9ycxgDIAMoCzIlLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlcGxveW1lbnRFcnJvchIYCgtoYXNfY2hhbmdlZBgEIAEoCEgAiAEBEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBSADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmdCDgoMX2hhc19jaGFuZ2VkIo8BChhEZWxldGVGZWF0dXJlRmxhZ1JlcXVlc3QSDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSLQogZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24YAyABKAhIAIgBAUIjCiFfZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24imgIKGURlbGV0ZUZlYXR1cmVGbGFnUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJCChJjb21wb3NpdGlvbl9lcnJvcnMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEkAKEWRlcGxveW1lbnRfZXJyb3JzGAMgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVwbG95bWVudEVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBCADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcitwEKC0ZlYXR1cmVGbGFnEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJEisKBmxhYmVscxgEIAMoCzIbLndnLmNvc21vLnBsYXRmb3JtLnYxLkxhYmVsEhIKCmlzX2VuYWJsZWQYBSABKAgSEgoKY3JlYXRlZF9ieRgGIAEoCRISCgpjcmVhdGVkX2F0GAcgASgJEhIKCnVwZGF0ZWRfYXQYCCABKAkiaAoWR2V0RmVhdHVyZUZsYWdzUmVxdWVzdBINCgVsaW1pdBgBIAEoBRIOCgZvZmZzZXQYAiABKAUSEQoJbmFtZXNwYWNlGAMgASgJEhIKBXF1ZXJ5GAQgASgJSACIAQFCCAoGX3F1ZXJ5IpoBChdHZXRGZWF0dXJlRmxhZ3NSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjgKDWZlYXR1cmVfZmxhZ3MYAiADKAsyIS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWF0dXJlRmxhZxITCgt0b3RhbF9jb3VudBgDIAEoBSI+ChtHZXRGZWF0dXJlRmxhZ0J5TmFtZVJlcXVlc3QSDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkijAMKHEdldEZlYXR1cmVGbGFnQnlOYW1lUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI3CgxmZWF0dXJlX2ZsYWcYAiABKAsyIS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWF0dXJlRmxhZxJdChBmZWRlcmF0ZWRfZ3JhcGhzGAMgAygLMkMud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVhdHVyZUZsYWdCeU5hbWVSZXNwb25zZS5GZkZlZGVyYXRlZEdyYXBoEjkKEWZlYXR1cmVfc3ViZ3JhcGhzGAQgAygLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGgaZwoQRmZGZWRlcmF0ZWRHcmFwaBI9Cg9mZWRlcmF0ZWRfZ3JhcGgYASABKAsyJC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWRlcmF0ZWRHcmFwaBIUCgxpc19jb25uZWN0ZWQYAiABKAgiVwonR2V0RmVhdHVyZVN1YmdyYXBoc0J5RmVhdHVyZUZsYWdSZXF1ZXN0EhkKEWZlYXR1cmVfZmxhZ19uYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCSKXAQooR2V0RmVhdHVyZVN1YmdyYXBoc0J5RmVhdHVyZUZsYWdSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjkKEWZlYXR1cmVfc3ViZ3JhcGhzGAIgAygLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGgibAoaR2V0RmVhdHVyZVN1YmdyYXBoc1JlcXVlc3QSDQoFbGltaXQYASABKAUSDgoGb2Zmc2V0GAIgASgFEhEKCW5hbWVzcGFjZRgDIAEoCRISCgVxdWVyeRgEIAEoCUgAiAEBQggKBl9xdWVyeSKZAQobR2V0RmVhdHVyZVN1YmdyYXBoc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USOQoRZmVhdHVyZV9zdWJncmFwaHMYAiADKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TdWJncmFwaBINCgVjb3VudBgDIAEoBSKWAQomR2V0RmVhdHVyZUZsYWdzQnlGZWRlcmF0ZWRHcmFwaFJlcXVlc3QSHAoUZmVkZXJhdGVkX2dyYXBoX25hbWUYASABKAkSDQoFbGltaXQYAiABKAUSDgoGb2Zmc2V0GAMgASgFEhEKCW5hbWVzcGFjZRgEIAEoCRISCgVxdWVyeRgFIAEoCUgAiAEBQggKBl9xdWVyeSKqAQonR2V0RmVhdHVyZUZsYWdzQnlGZWRlcmF0ZWRHcmFwaFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USOAoNZmVhdHVyZV9mbGFncxgCIAMoCzIhLndnLmNvc21vLnBsYXRmb3JtLnYxLkZlYXR1cmVGbGFnEhMKC3RvdGFsX2NvdW50GAMgASgFImwKOUdldEZlYXR1cmVGbGFnc0luTGF0ZXN0Q29tcG9zaXRpb25CeUZlZGVyYXRlZEdyYXBoUmVxdWVzdBIcChRmZWRlcmF0ZWRfZ3JhcGhfbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkiqAEKOkdldEZlYXR1cmVGbGFnc0luTGF0ZXN0Q29tcG9zaXRpb25CeUZlZGVyYXRlZEdyYXBoUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI4Cg1mZWF0dXJlX2ZsYWdzGAIgAygLMiEud2cuY29zbW8ucGxhdGZvcm0udjEuRmVhdHVyZUZsYWcimgEKKkdldEZlYXR1cmVTdWJncmFwaHNCeUZlZGVyYXRlZEdyYXBoUmVxdWVzdBIcChRmZWRlcmF0ZWRfZ3JhcGhfbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSDQoFbGltaXQYAyABKAUSDgoGb2Zmc2V0GAQgASgFEhIKBXF1ZXJ5GAUgASgJSACIAQFCCAoGX3F1ZXJ5Iq8BCitHZXRGZWF0dXJlU3ViZ3JhcGhzQnlGZWRlcmF0ZWRHcmFwaFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USOQoRZmVhdHVyZV9zdWJncmFwaHMYAiADKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TdWJncmFwaBITCgt0b3RhbF9jb3VudBgDIAEoBSLBAQokR2V0T3JnYW5pemF0aW9uV2ViaG9va0hpc3RvcnlSZXF1ZXN0EjQKCnBhZ2luYXRpb24YASABKAsyIC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QYWdpbmF0aW9uEjMKCmRhdGVfcmFuZ2UYAiABKAsyHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EYXRlUmFuZ2USGwoOZmlsdGVyX2J5X3R5cGUYAyABKAlIAIgBAUIRCg9fZmlsdGVyX2J5X3R5cGUi+wMKD1dlYmhvb2tEZWxpdmVyeRIKCgJpZBgBIAEoCRISCgpjcmVhdGVkX2F0GAIgASgJEhcKCmNyZWF0ZWRfYnkYAyABKAlIAIgBARIMCgR0eXBlGAQgASgJEhAKCGVuZHBvaW50GAUgASgJEhIKCmV2ZW50X25hbWUYBiABKAkSDwoHcGF5bG9hZBgHIAEoCRIXCg9yZXF1ZXN0X2hlYWRlcnMYCCABKAkSHQoQcmVzcG9uc2VfaGVhZGVycxgJIAEoCUgBiAEBEiEKFHJlc3BvbnNlX3N0YXR1c19jb2RlGAogASgFSAKIAQESIAoTcmVzcG9uc2VfZXJyb3JfY29kZRgLIAEoCUgDiAEBEhoKDWVycm9yX21lc3NhZ2UYDCABKAlIBIgBARIaCg1yZXNwb25zZV9ib2R5GA0gASgJSAWIAQESEwoLcmV0cnlfY291bnQYDiABKAUSEAoIZHVyYXRpb24YDyABKAISFQoNaXNfcmVkZWxpdmVyeRgQIAEoCEINCgtfY3JlYXRlZF9ieUITChFfcmVzcG9uc2VfaGVhZGVyc0IXChVfcmVzcG9uc2Vfc3RhdHVzX2NvZGVCFgoUX3Jlc3BvbnNlX2Vycm9yX2NvZGVCEAoOX2Vycm9yX21lc3NhZ2VCEAoOX3Jlc3BvbnNlX2JvZHkiqQEKJUdldE9yZ2FuaXphdGlvbldlYmhvb2tIaXN0b3J5UmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI5CgpkZWxpdmVyaWVzGAIgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuV2ViaG9va0RlbGl2ZXJ5EhMKC3RvdGFsX2NvdW50GAMgASgFIiUKF1JlZGVsaXZlcldlYmhvb2tSZXF1ZXN0EgoKAmlkGAEgASgJIkwKGFJlZGVsaXZlcldlYmhvb2tSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIi4KIEdldFdlYmhvb2tEZWxpdmVyeURldGFpbHNSZXF1ZXN0EgoKAmlkGAEgASgJIo4BCiFHZXRXZWJob29rRGVsaXZlcnlEZXRhaWxzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI3CghkZWxpdmVyeRgCIAEoCzIlLndnLmNvc21vLnBsYXRmb3JtLnYxLldlYmhvb2tEZWxpdmVyeSJNCh1DcmVhdGVQbGF5Z3JvdW5kU2NyaXB0UmVxdWVzdBINCgV0aXRsZRgBIAEoCRIMCgR0eXBlGAIgASgJEg8KB2NvbnRlbnQYAyABKAkiUgoeQ3JlYXRlUGxheWdyb3VuZFNjcmlwdFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiKwodRGVsZXRlUGxheWdyb3VuZFNjcmlwdFJlcXVlc3QSCgoCaWQYASABKAkiUgoeRGVsZXRlUGxheWdyb3VuZFNjcmlwdFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiSwodVXBkYXRlUGxheWdyb3VuZFNjcmlwdFJlcXVlc3QSCgoCaWQYASABKAkSDQoFdGl0bGUYAiABKAkSDwoHY29udGVudBgDIAEoCSJSCh5VcGRhdGVQbGF5Z3JvdW5kU2NyaXB0UmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSIrChtHZXRQbGF5Z3JvdW5kU2NyaXB0c1JlcXVlc3QSDAoEdHlwZRgBIAEoCSJMChBQbGF5Z3JvdW5kU2NyaXB0EgoKAmlkGAEgASgJEgwKBHR5cGUYAiABKAkSDQoFdGl0bGUYAyABKAkSDwoHY29udGVudBgEIAEoCSKJAQocR2V0UGxheWdyb3VuZFNjcmlwdHNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjcKB3NjcmlwdHMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QbGF5Z3JvdW5kU2NyaXB0IkIKHEdldEZlZGVyYXRlZEdyYXBoQnlJZFJlcXVlc3QSCgoCaWQYASABKAkSFgoOaW5jbHVkZU1ldHJpY3MYAiABKAgi3wIKHUdldEZlZGVyYXRlZEdyYXBoQnlJZFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USMwoFZ3JhcGgYAiABKAsyJC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWRlcmF0ZWRHcmFwaBIxCglzdWJncmFwaHMYAyADKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TdWJncmFwaBIZChFncmFwaFJlcXVlc3RUb2tlbhgEIAEoCRJPCiRmZWF0dXJlRmxhZ3NJbkxhdGVzdFZhbGlkQ29tcG9zaXRpb24YBSADKAsyIS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWF0dXJlRmxhZxI4ChBmZWF0dXJlU3ViZ3JhcGhzGAYgAygLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGgiJAoWR2V0U3ViZ3JhcGhCeUlkUmVxdWVzdBIKCgJpZBgBIAEoCSKxAQoXR2V0U3ViZ3JhcGhCeUlkUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRItCgVncmFwaBgCIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlN1YmdyYXBoEjUKB21lbWJlcnMYAyADKAsyJC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TdWJncmFwaE1lbWJlciIvChNHZXROYW1lc3BhY2VSZXF1ZXN0EgwKBG5hbWUYASABKAkSCgoCaWQYAiABKAkifAoUR2V0TmFtZXNwYWNlUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIyCgluYW1lc3BhY2UYAiABKAsyHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5OYW1lc3BhY2UibQoSV29ya3NwYWNlTmFtZXNwYWNlEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSPQoGZ3JhcGhzGAMgAygLMi0ud2cuY29zbW8ucGxhdGZvcm0udjEuV29ya3NwYWNlRmVkZXJhdGVkR3JhcGgilQEKF1dvcmtzcGFjZUZlZGVyYXRlZEdyYXBoEgoKAmlkGAEgASgJEhAKCHRhcmdldElkGAIgASgJEgwKBG5hbWUYAyABKAkSEgoKaXNDb250cmFjdBgEIAEoCBI6CglzdWJncmFwaHMYBSADKAsyJy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Xb3Jrc3BhY2VTdWJncmFwaCI/ChFXb3Jrc3BhY2VTdWJncmFwaBIKCgJpZBgBIAEoCRIQCgh0YXJnZXRJZBgCIAEoCRIMCgRuYW1lGAMgASgJIhUKE0dldFdvcmtzcGFjZVJlcXVlc3QihgEKFEdldFdvcmtzcGFjZVJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USPAoKbmFtZXNwYWNlcxgCIAMoCzIoLndnLmNvc21vLnBsYXRmb3JtLnYxLldvcmtzcGFjZU5hbWVzcGFjZSKfAQofUHVzaENhY2hlV2FybWVyT3BlcmF0aW9uUmVxdWVzdBIaChJmZWRlcmF0ZWRHcmFwaE5hbWUYASABKAkSGAoQb3BlcmF0aW9uQ29udGVudBgCIAEoCRIVCg1vcGVyYXRpb25OYW1lGAMgASgJEhwKFG9wZXJhdGlvblBlcnNpc3RlZElkGAQgASgJEhEKCW5hbWVzcGFjZRgFIAEoCSJUCiBQdXNoQ2FjaGVXYXJtZXJPcGVyYXRpb25SZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIm8KH0dldENhY2hlV2FybWVyT3BlcmF0aW9uc1JlcXVlc3QSGgoSZmVkZXJhdGVkR3JhcGhOYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRINCgVsaW1pdBgDIAEoBRIOCgZvZmZzZXQYBCABKAUiiAIKFENhY2hlV2FybWVyT3BlcmF0aW9uEgoKAmlkGAEgASgJEhgKEG9wZXJhdGlvbkNvbnRlbnQYAiABKAkSFQoNb3BlcmF0aW9uTmFtZRgDIAEoCRIcChRvcGVyYXRpb25QZXJzaXN0ZWRJZBgEIAEoCRIVCg1vcGVyYXRpb25IYXNoGAUgASgJEhIKCmNsaWVudE5hbWUYBiABKAkSFQoNY2xpZW50VmVyc2lvbhgHIAEoCRIUCgxwbGFubmluZ1RpbWUYCCABKAISFwoPaXNNYW51YWxseUFkZGVkGAkgASgIEhEKCWNyZWF0ZWRBdBgKIAEoCRIRCgljcmVhdGVkQnkYCyABKAkixwEKIEdldENhY2hlV2FybWVyT3BlcmF0aW9uc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USPgoKb3BlcmF0aW9ucxgCIAMoCzIqLndnLmNvc21vLnBsYXRmb3JtLnYxLkNhY2hlV2FybWVyT3BlcmF0aW9uEhMKC3RvdGFsX2NvdW50GAMgASgFEhwKFGlzQ2FjaGVXYXJtZXJFbmFibGVkGAQgASgIIlQKI0NvbXB1dGVDYWNoZVdhcm1lck9wZXJhdGlvbnNSZXF1ZXN0EhoKEmZlZGVyYXRlZEdyYXBoTmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkiWAokQ29tcHV0ZUNhY2hlV2FybWVyT3BlcmF0aW9uc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiZwobQ29uZmlndXJlQ2FjaGVXYXJtZXJSZXF1ZXN0EhEKCW5hbWVzcGFjZRgBIAEoCRIZChFlbmFibGVDYWNoZVdhcm1lchgCIAEoCBIaChJtYXhPcGVyYXRpb25zQ291bnQYAyABKAUiUAocQ29uZmlndXJlQ2FjaGVXYXJtZXJSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIjAKG0dldENhY2hlV2FybWVyQ29uZmlnUmVxdWVzdBIRCgluYW1lc3BhY2UYASABKAkiigEKHEdldENhY2hlV2FybWVyQ29uZmlnUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIcChRpc0NhY2hlV2FybWVyRW5hYmxlZBgCIAEoCBIaChJtYXhPcGVyYXRpb25zQ291bnQYAyABKAUiPAonR2V0U3ViZ3JhcGhDaGVja0V4dGVuc2lvbnNDb25maWdSZXF1ZXN0EhEKCW5hbWVzcGFjZRgBIAEoCSKUAwooR2V0U3ViZ3JhcGhDaGVja0V4dGVuc2lvbnNDb25maWdSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEh0KFWlzRW5hYmxlZEZvck5hbWVzcGFjZRgCIAEoCBIkChxpc0xpbnRpbmdFbmFibGVkRm9yTmFtZXNwYWNlGAMgASgIEikKIWlzR3JhcGhQcnVuaW5nRW5hYmxlZEZvck5hbWVzcGFjZRgEIAEoCBIQCghlbmRwb2ludBgFIAEoCRIbChNpc1NlY3JldEtleUFzc2lnbmVkGAYgASgIEhoKEmluY2x1ZGVDb21wb3NlZFNkbBgHIAEoCBIcChRpbmNsdWRlTGludGluZ0lzc3VlcxgIIAEoCBIcChRpbmNsdWRlUHJ1bmluZ0lzc3VlcxgJIAEoCBIcChRpbmNsdWRlU2NoZW1hQ2hhbmdlcxgKIAEoCBIhChlpbmNsdWRlQWZmZWN0ZWRPcGVyYXRpb25zGAsgASgIIrQCCidDb25maWd1cmVTdWJncmFwaENoZWNrRXh0ZW5zaW9uc1JlcXVlc3QSEQoJbmFtZXNwYWNlGAEgASgJEiUKHWVuYWJsZVN1YmdyYXBoQ2hlY2tFeHRlbnNpb25zGAIgASgIEhAKCGVuZHBvaW50GAMgASgJEhYKCXNlY3JldEtleRgEIAEoCUgAiAEBEhoKEmluY2x1ZGVDb21wb3NlZFNkbBgFIAEoCBIcChRpbmNsdWRlTGludGluZ0lzc3VlcxgGIAEoCBIcChRpbmNsdWRlUHJ1bmluZ0lzc3VlcxgHIAEoCBIcChRpbmNsdWRlU2NoZW1hQ2hhbmdlcxgIIAEoCBIhChlpbmNsdWRlQWZmZWN0ZWRPcGVyYXRpb25zGAkgASgIQgwKCl9zZWNyZXRLZXkiXAooQ29uZmlndXJlU3ViZ3JhcGhDaGVja0V4dGVuc2lvbnNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIl4KIURlbGV0ZUNhY2hlV2FybWVyT3BlcmF0aW9uUmVxdWVzdBIKCgJpZBgBIAEoCRIaChJmZWRlcmF0ZWRHcmFwaE5hbWUYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJIlYKIkRlbGV0ZUNhY2hlV2FybWVyT3BlcmF0aW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSIoCiZMaXN0Um91dGVyQ29tcGF0aWJpbGl0eVZlcnNpb25zUmVxdWVzdCJtCidMaXN0Um91dGVyQ29tcGF0aWJpbGl0eVZlcnNpb25zUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIQCgh2ZXJzaW9ucxgCIAMoCSKxAQopU2V0R3JhcGhSb3V0ZXJDb21wYXRpYmlsaXR5VmVyc2lvblJlcXVlc3QSDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSDwoHdmVyc2lvbhgDIAEoCRItCiBkaXNhYmxlX3Jlc29sdmFiaWxpdHlfdmFsaWRhdGlvbhgEIAEoCEgAiAEBQiMKIV9kaXNhYmxlX3Jlc29sdmFiaWxpdHlfdmFsaWRhdGlvbiLYAgoqU2V0R3JhcGhSb3V0ZXJDb21wYXRpYmlsaXR5VmVyc2lvblJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USGAoQcHJldmlvdXNfdmVyc2lvbhgCIAEoCRITCgtuZXdfdmVyc2lvbhgDIAEoCRJBChFjb21wb3NpdGlvbkVycm9ycxgEIAMoCzImLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXBvc2l0aW9uRXJyb3ISPwoQZGVwbG95bWVudEVycm9ycxgFIAMoCzIlLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlcGxveW1lbnRFcnJvchJFChNjb21wb3NpdGlvbldhcm5pbmdzGAYgAygLMigud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25XYXJuaW5nImsKKUdldFByb3Bvc2VkU2NoZW1hT2ZDaGVja2VkU3ViZ3JhcGhSZXF1ZXN0Eg8KB2NoZWNrSWQYASABKAkSGQoRY2hlY2tlZFN1YmdyYXBoSWQYAiABKAkSEgoKc3ViZ3JhcGhJZBgDIAEoCSJ2CipHZXRQcm9wb3NlZFNjaGVtYU9mQ2hlY2tlZFN1YmdyYXBoUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIWCg5wcm9wb3NlZFNjaGVtYRgCIAEoCSK4AgoIUHJvcG9zYWwSCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCRIRCgljcmVhdGVkQXQYAyABKAkSFgoOY3JlYXRlZEJ5RW1haWwYBCABKAkSDQoFc3RhdGUYBSABKAkSGAoQZmVkZXJhdGVkR3JhcGhJZBgGIAEoCRIaChJmZWRlcmF0ZWRHcmFwaE5hbWUYByABKAkSOQoJc3ViZ3JhcGhzGAggAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuUHJvcG9zYWxTdWJncmFwaBIaChJsYXRlc3RDaGVja1N1Y2Nlc3MYCSABKAgSFQoNbGF0ZXN0Q2hlY2tJZBgKIAEoCRI0CgZvcmlnaW4YCyABKA4yJC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Qcm9wb3NhbE9yaWdpbiKCAQoQUHJvcG9zYWxTdWJncmFwaBIMCgRuYW1lGAEgASgJEhEKCXNjaGVtYVNETBgCIAEoCRIRCglpc0RlbGV0ZWQYAyABKAgSDQoFaXNOZXcYBCABKAgSKwoGbGFiZWxzGAUgAygLMhsud2cuY29zbW8ucGxhdGZvcm0udjEuTGFiZWwijwIKFUNyZWF0ZVByb3Bvc2FsUmVxdWVzdBIaChJmZWRlcmF0ZWRHcmFwaE5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEgwKBG5hbWUYAyABKAkSOQoJc3ViZ3JhcGhzGAQgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuUHJvcG9zYWxTdWJncmFwaBJIChBuYW1pbmdDb252ZW50aW9uGAUgASgOMi4ud2cuY29zbW8ucGxhdGZvcm0udjEuUHJvcG9zYWxOYW1pbmdDb252ZW50aW9uEjQKBm9yaWdpbhgGIAEoDjIkLndnLmNvc21vLnBsYXRmb3JtLnYxLlByb3Bvc2FsT3JpZ2luItAIChZDcmVhdGVQcm9wb3NhbFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USEgoKcHJvcG9zYWxJZBgCIAEoCRIPCgdjaGVja0lkGAMgASgJEjsKD2JyZWFraW5nQ2hhbmdlcxgEIAMoCzIiLndnLmNvc21vLnBsYXRmb3JtLnYxLlNjaGVtYUNoYW5nZRI+ChJub25CcmVha2luZ0NoYW5nZXMYBSADKAsyIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TY2hlbWFDaGFuZ2USQQoRY29tcG9zaXRpb25FcnJvcnMYBiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYByADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcSMwoKbGludEVycm9ycxgIIAMoCzIfLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpbnRJc3N1ZRI1CgxsaW50V2FybmluZ3MYCSADKAsyHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaW50SXNzdWUSQQoQZ3JhcGhQcnVuZUVycm9ycxgKIAMoCzInLndnLmNvc21vLnBsYXRmb3JtLnYxLkdyYXBoUHJ1bmluZ0lzc3VlEkMKEmdyYXBoUHJ1bmVXYXJuaW5ncxgLIAMoCzInLndnLmNvc21vLnBsYXRmb3JtLnYxLkdyYXBoUHJ1bmluZ0lzc3VlEksKE29wZXJhdGlvblVzYWdlU3RhdHMYDCABKAsyLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DaGVja09wZXJhdGlvblVzYWdlU3RhdHMSFgoObGludGluZ1NraXBwZWQYDSABKAgSGwoTZ3JhcGhQcnVuaW5nU2tpcHBlZBgOIAEoCBIQCghjaGVja1VybBgPIAEoCRITCgtwcm9wb3NhbFVybBgQIAEoCRIUCgxwcm9wb3NhbE5hbWUYESABKAkSJwoaaXNMaW5rZWRUcmFmZmljQ2hlY2tGYWlsZWQYEiABKAhIAIgBARInChppc0xpbmtlZFBydW5pbmdDaGVja0ZhaWxlZBgTIAEoCEgBiAEBEiIKFWhhc0xpbmtlZFNjaGVtYUNoZWNrcxgUIAEoCEgCiAEBElcKHWNvbXBvc2VkU2NoZW1hQnJlYWtpbmdDaGFuZ2VzGBUgAygLMjAud2cuY29zbW8ucGxhdGZvcm0udjEuRmVkZXJhdGVkR3JhcGhTY2hlbWFDaGFuZ2VCHQobX2lzTGlua2VkVHJhZmZpY0NoZWNrRmFpbGVkQh0KG19pc0xpbmtlZFBydW5pbmdDaGVja0ZhaWxlZEIYChZfaGFzTGlua2VkU2NoZW1hQ2hlY2tzIigKEkdldFByb3Bvc2FsUmVxdWVzdBISCgpwcm9wb3NhbElkGAEgASgJIoICChNHZXRQcm9wb3NhbFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USMAoIcHJvcG9zYWwYAiABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Qcm9wb3NhbBJTChBjdXJyZW50U3ViZ3JhcGhzGAMgAygLMjkud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0UHJvcG9zYWxSZXNwb25zZS5DdXJyZW50U3ViZ3JhcGgaMgoPQ3VycmVudFN1YmdyYXBoEgwKBG5hbWUYASABKAkSEQoJc2NoZW1hU0RMGAIgASgJIpcBCiNHZXRQcm9wb3NhbHNCeUZlZGVyYXRlZEdyYXBoUmVxdWVzdBIaChJmZWRlcmF0ZWRHcmFwaE5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEhEKCXN0YXJ0RGF0ZRgDIAEoCRIPCgdlbmREYXRlGAQgASgJEg0KBWxpbWl0GAUgASgFEg4KBm9mZnNldBgGIAEoBSK7AQokR2V0UHJvcG9zYWxzQnlGZWRlcmF0ZWRHcmFwaFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USMQoJcHJvcG9zYWxzGAIgAygLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUHJvcG9zYWwSGgoSaXNQcm9wb3NhbHNFbmFibGVkGAMgASgIEhIKCnRvdGFsQ291bnQYBCABKAUicQoYR2V0UHJvcG9zYWxDaGVja3NSZXF1ZXN0EhIKCnByb3Bvc2FsSWQYASABKAkSDQoFbGltaXQYAiABKAUSDgoGb2Zmc2V0GAMgASgFEhEKCXN0YXJ0RGF0ZRgEIAEoCRIPCgdlbmREYXRlGAUgASgJIpoBChlHZXRQcm9wb3NhbENoZWNrc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USMQoGY2hlY2tzGAIgAygLMiEud2cuY29zbW8ucGxhdGZvcm0udjEuU2NoZW1hQ2hlY2sSGAoQdG90YWxDaGVja3NDb3VudBgDIAEoBSK1AgoVVXBkYXRlUHJvcG9zYWxSZXF1ZXN0EhQKDHByb3Bvc2FsTmFtZRgBIAEoCRIaChJmZWRlcmF0ZWRHcmFwaE5hbWUYAiABKAkSDwoFc3RhdGUYAyABKAlIABJfChB1cGRhdGVkU3ViZ3JhcGhzGAQgASgLMkMud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlUHJvcG9zYWxSZXF1ZXN0LlVwZGF0ZVByb3Bvc2FsU3ViZ3JhcGhzSAASEQoJbmFtZXNwYWNlGAUgASgJGlQKF1VwZGF0ZVByb3Bvc2FsU3ViZ3JhcGhzEjkKCXN1YmdyYXBocxgBIAMoCzImLndnLmNvc21vLnBsYXRmb3JtLnYxLlByb3Bvc2FsU3ViZ3JhcGhCDwoNdXBkYXRlX2FjdGlvbiKRCAoWVXBkYXRlUHJvcG9zYWxSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEg8KB2NoZWNrSWQYAiABKAkSOwoPYnJlYWtpbmdDaGFuZ2VzGAMgAygLMiIud2cuY29zbW8ucGxhdGZvcm0udjEuU2NoZW1hQ2hhbmdlEj4KEm5vbkJyZWFraW5nQ2hhbmdlcxgEIAMoCzIiLndnLmNvc21vLnBsYXRmb3JtLnYxLlNjaGVtYUNoYW5nZRJBChFjb21wb3NpdGlvbkVycm9ycxgFIAMoCzImLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXBvc2l0aW9uRXJyb3ISRQoTY29tcG9zaXRpb25XYXJuaW5ncxgGIAMoCzIoLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXBvc2l0aW9uV2FybmluZxIzCgpsaW50RXJyb3JzGAcgAygLMh8ud2cuY29zbW8ucGxhdGZvcm0udjEuTGludElzc3VlEjUKDGxpbnRXYXJuaW5ncxgIIAMoCzIfLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpbnRJc3N1ZRJBChBncmFwaFBydW5lRXJyb3JzGAkgAygLMicud2cuY29zbW8ucGxhdGZvcm0udjEuR3JhcGhQcnVuaW5nSXNzdWUSQwoSZ3JhcGhQcnVuZVdhcm5pbmdzGAogAygLMicud2cuY29zbW8ucGxhdGZvcm0udjEuR3JhcGhQcnVuaW5nSXNzdWUSSwoTb3BlcmF0aW9uVXNhZ2VTdGF0cxgLIAEoCzIuLndnLmNvc21vLnBsYXRmb3JtLnYxLkNoZWNrT3BlcmF0aW9uVXNhZ2VTdGF0cxIWCg5saW50aW5nU2tpcHBlZBgMIAEoCBIbChNncmFwaFBydW5pbmdTa2lwcGVkGA0gASgIEhAKCGNoZWNrVXJsGA4gASgJEicKGmlzTGlua2VkVHJhZmZpY0NoZWNrRmFpbGVkGA8gASgISACIAQESJwoaaXNMaW5rZWRQcnVuaW5nQ2hlY2tGYWlsZWQYECABKAhIAYgBARIiChVoYXNMaW5rZWRTY2hlbWFDaGVja3MYESABKAhIAogBARJXCh1jb21wb3NlZFNjaGVtYUJyZWFraW5nQ2hhbmdlcxgSIAMoCzIwLndnLmNvc21vLnBsYXRmb3JtLnYxLkZlZGVyYXRlZEdyYXBoU2NoZW1hQ2hhbmdlQh0KG19pc0xpbmtlZFRyYWZmaWNDaGVja0ZhaWxlZEIdChtfaXNMaW5rZWRQcnVuaW5nQ2hlY2tGYWlsZWRCGAoWX2hhc0xpbmtlZFNjaGVtYUNoZWNrcyJQCiJFbmFibGVQcm9wb3NhbHNGb3JOYW1lc3BhY2VSZXF1ZXN0EhEKCW5hbWVzcGFjZRgBIAEoCRIXCg9lbmFibGVQcm9wb3NhbHMYAiABKAgiVwojRW5hYmxlUHJvcG9zYWxzRm9yTmFtZXNwYWNlUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSK+AQonQ29uZmlndXJlTmFtZXNwYWNlUHJvcG9zYWxDb25maWdSZXF1ZXN0EhEKCW5hbWVzcGFjZRgBIAEoCRI+ChJjaGVja1NldmVyaXR5TGV2ZWwYAiABKA4yIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaW50U2V2ZXJpdHkSQAoUcHVibGlzaFNldmVyaXR5TGV2ZWwYAyABKA4yIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaW50U2V2ZXJpdHkiXAooQ29uZmlndXJlTmFtZXNwYWNlUHJvcG9zYWxDb25maWdSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIjYKIUdldE5hbWVzcGFjZVByb3Bvc2FsQ29uZmlnUmVxdWVzdBIRCgluYW1lc3BhY2UYASABKAki6QEKIkdldE5hbWVzcGFjZVByb3Bvc2FsQ29uZmlnUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIPCgdlbmFibGVkGAIgASgIEj4KEmNoZWNrU2V2ZXJpdHlMZXZlbBgDIAEoDjIiLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpbnRTZXZlcml0eRJAChRwdWJsaXNoU2V2ZXJpdHlMZXZlbBgEIAEoDjIiLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpbnRTZXZlcml0eSKrAQobTmFtZXNwYWNlTG9naW5NZXRob2RNYXBwaW5nEhQKDG5hbWVzcGFjZV9pZBgBIAEoCRIgChhhbGxvd2VkX3Nzb19wcm92aWRlcl9pZHMYAiADKAkSHAoUYWxsb3dfcGFzc3dvcmRfbG9naW4YAyABKAgSGgoSYWxsb3dfZ29vZ2xlX2xvZ2luGAQgASgIEhoKEmFsbG93X2dpdGh1Yl9sb2dpbhgFIAEoCCJpCiJVcGRhdGVOYW1lc3BhY2VMb2dpbk1ldGhvZHNSZXF1ZXN0EkMKCG1hcHBpbmdzGAEgAygLMjEud2cuY29zbW8ucGxhdGZvcm0udjEuTmFtZXNwYWNlTG9naW5NZXRob2RNYXBwaW5nIlcKI1VwZGF0ZU5hbWVzcGFjZUxvZ2luTWV0aG9kc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiIgogTGlzdE5hbWVzcGFjZUxvZ2luTWV0aG9kc1JlcXVlc3QimgEKIUxpc3ROYW1lc3BhY2VMb2dpbk1ldGhvZHNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkMKCG1hcHBpbmdzGAIgAygLMjEud2cuY29zbW8ucGxhdGZvcm0udjEuTmFtZXNwYWNlTG9naW5NZXRob2RNYXBwaW5nIqkBChhPcmdhbml6YXRpb25Mb2dpbk1ldGhvZHMSIAoYYWxsb3dlZF9zc29fcHJvdmlkZXJfaWRzGAEgAygJEhwKFGFsbG93X3Bhc3N3b3JkX2xvZ2luGAIgASgIEhoKEmFsbG93X2dvb2dsZV9sb2dpbhgDIAEoCBIaChJhbGxvd19naXRodWJfbG9naW4YBCABKAgSFQoNaXNfcmVzdHJpY3RlZBgFIAEoCCIkCiJHZXRPcmdhbml6YXRpb25Mb2dpbk1ldGhvZHNSZXF1ZXN0Ip4BCiNHZXRPcmdhbml6YXRpb25Mb2dpbk1ldGhvZHNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkUKDWxvZ2luX21ldGhvZHMYAiABKAsyLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Pcmdhbml6YXRpb25Mb2dpbk1ldGhvZHMiwgEKJVVwZGF0ZU9yZ2FuaXphdGlvbkxvZ2luTWV0aG9kc1JlcXVlc3QSIAoYYWxsb3dlZF9zc29fcHJvdmlkZXJfaWRzGAEgAygJEhwKFGFsbG93X3Bhc3N3b3JkX2xvZ2luGAIgASgIEhoKEmFsbG93X2dvb2dsZV9sb2dpbhgDIAEoCBIaChJhbGxvd19naXRodWJfbG9naW4YBCABKAgSIQoZY29uZmlybV9uYW1lc3BhY2VfY2hhbmdlcxgFIAEoCCK3AQomVXBkYXRlT3JnYW5pemF0aW9uTG9naW5NZXRob2RzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIdChVyZXF1aXJlc19jb25maXJtYXRpb24YAiABKAgSPAoTYWZmZWN0ZWRfbmFtZXNwYWNlcxgDIAMoCzIfLndnLmNvc21vLnBsYXRmb3JtLnYxLk5hbWVzcGFjZSLoBQoUR2V0T3BlcmF0aW9uc1JlcXVlc3QSGgoSZmVkZXJhdGVkR3JhcGhOYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRITCgtjbGllbnROYW1lcxgDIAMoCRISCgVsaW1pdBgEIAEoBUgAiAEBEhMKBm9mZnNldBgFIAEoBUgBiAEBEicKGmluY2x1ZGVIYXNEZXByZWNhdGVkRmllbGRzGAYgASgISAKIAQESRwoMZmV0Y2hCYXNlZE9uGAcgASgOMiwud2cuY29zbW8ucGxhdGZvcm0udjEuT3BlcmF0aW9uc0ZldGNoQmFzZWRPbkgDiAEBEhsKDmluY2x1ZGVDb250ZW50GAggASgISASIAQESEgoFcmFuZ2UYCSABKAVIBYgBARI3CglkYXRlUmFuZ2UYCiABKAsyHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EYXRlUmFuZ2VIBogBARIYCgtzZWFyY2hRdWVyeRgLIAEoCUgHiAEBEjYKKWluY2x1ZGVPcGVyYXRpb25zV2l0aERlcHJlY2F0ZWRGaWVsZHNPbmx5GAwgASgISAiIAQESPwoNc29ydERpcmVjdGlvbhgNIAEoDjIjLndnLmNvc21vLnBsYXRmb3JtLnYxLlNvcnREaXJlY3Rpb25ICYgBARIeChFpbmNsdWRlVG90YWxDb3VudBgOIAEoCEgKiAEBQggKBl9saW1pdEIJCgdfb2Zmc2V0Qh0KG19pbmNsdWRlSGFzRGVwcmVjYXRlZEZpZWxkc0IPCg1fZmV0Y2hCYXNlZE9uQhEKD19pbmNsdWRlQ29udGVudEIICgZfcmFuZ2VCDAoKX2RhdGVSYW5nZUIOCgxfc2VhcmNoUXVlcnlCLAoqX2luY2x1ZGVPcGVyYXRpb25zV2l0aERlcHJlY2F0ZWRGaWVsZHNPbmx5QhAKDl9zb3J0RGlyZWN0aW9uQhQKEl9pbmNsdWRlVG90YWxDb3VudCKXBAoVR2V0T3BlcmF0aW9uc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USSQoKb3BlcmF0aW9ucxgCIAMoCzI1LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9wZXJhdGlvbnNSZXNwb25zZS5PcGVyYXRpb24SFwoKdG90YWxDb3VudBgDIAEoBUgAiAEBGpwCCglPcGVyYXRpb24SDAoEaGFzaBgBIAEoCRIMCgRuYW1lGAIgASgJEhQKB2NvbnRlbnQYAyABKAlIAYgBARJHCgR0eXBlGAQgASgOMjkud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3BlcmF0aW9uc1Jlc3BvbnNlLk9wZXJhdGlvblR5cGUSIAoTaGFzRGVwcmVjYXRlZEZpZWxkcxgFIAEoCEgCiAEBEhEKB2xhdGVuY3kYBiABKAJIABIWCgxyZXF1ZXN0Q291bnQYByABKANIABIZCg9lcnJvclBlcmNlbnRhZ2UYCCABKAJIAEIICgZtZXRyaWNCCgoIX2NvbnRlbnRCFgoUX2hhc0RlcHJlY2F0ZWRGaWVsZHMiOgoNT3BlcmF0aW9uVHlwZRIJCgVRVUVSWRAAEgwKCE1VVEFUSU9OEAESEAoMU1VCU0NSSVBUSU9OEAJCDQoLX3RvdGFsQ291bnQiTwoeR2V0Q2xpZW50c0Zyb21BbmFseXRpY3NSZXF1ZXN0EhoKEmZlZGVyYXRlZEdyYXBoTmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkiugEKH0dldENsaWVudHNGcm9tQW5hbHl0aWNzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJNCgdjbGllbnRzGAIgAygLMjwud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q2xpZW50c0Zyb21BbmFseXRpY3NSZXNwb25zZS5DbGllbnQaFgoGQ2xpZW50EgwKBG5hbWUYASABKAki3gEKGkdldE9wZXJhdGlvbkNsaWVudHNSZXF1ZXN0EhoKEmZlZGVyYXRlZEdyYXBoTmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSFQoNb3BlcmF0aW9uSGFzaBgDIAEoCRIVCg1vcGVyYXRpb25OYW1lGAQgASgJEhIKBXJhbmdlGAUgASgFSACIAQESNwoJZGF0ZVJhbmdlGAYgASgLMh8ud2cuY29zbW8ucGxhdGZvcm0udjEuRGF0ZVJhbmdlSAGIAQFCCAoGX3JhbmdlQgwKCl9kYXRlUmFuZ2Ui6wEKG0dldE9wZXJhdGlvbkNsaWVudHNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkkKB2NsaWVudHMYAiADKAsyOC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcGVyYXRpb25DbGllbnRzUmVzcG9uc2UuQ2xpZW50Gk8KBkNsaWVudBIMCgRuYW1lGAEgASgJEg8KB3ZlcnNpb24YAiABKAkSFAoMcmVxdWVzdENvdW50GAMgASgDEhAKCGxhc3RVc2VkGAQgASgJIv4BCiNHZXRPcGVyYXRpb25EZXByZWNhdGVkRmllbGRzUmVxdWVzdBIaChJmZWRlcmF0ZWRHcmFwaE5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEhUKDW9wZXJhdGlvbkhhc2gYAyABKAkSGgoNb3BlcmF0aW9uTmFtZRgEIAEoCUgAiAEBEhIKBXJhbmdlGAUgASgFSAGIAQESNwoJZGF0ZVJhbmdlGAYgASgLMh8ud2cuY29zbW8ucGxhdGZvcm0udjEuRGF0ZVJhbmdlSAKIAQFCEAoOX29wZXJhdGlvbk5hbWVCCAoGX3JhbmdlQgwKCl9kYXRlUmFuZ2UinwIKJEdldE9wZXJhdGlvbkRlcHJlY2F0ZWRGaWVsZHNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEmQKEGRlcHJlY2F0ZWRGaWVsZHMYAiADKAsySi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcGVyYXRpb25EZXByZWNhdGVkRmllbGRzUmVzcG9uc2UuRGVwcmVjYXRlZEZpZWxkGl8KD0RlcHJlY2F0ZWRGaWVsZBIRCglmaWVsZE5hbWUYASABKAkSEAoIdHlwZU5hbWUYAiABKAkSDAoEcGF0aBgDIAEoCRIZChFkZXByZWNhdGlvblJlYXNvbhgEIAEoCSJxCiFWYWxpZGF0ZUFuZEZldGNoUGx1Z2luRGF0YVJlcXVlc3QSDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSKwoGbGFiZWxzGAMgAygLMhsud2cuY29zbW8ucGxhdGZvcm0udjEuTGFiZWwikAEKIlZhbGlkYXRlQW5kRmV0Y2hQbHVnaW5EYXRhUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRISCgpuZXdWZXJzaW9uGAIgASgJEhEKCXB1c2hUb2tlbhgDIAEoCRIRCglyZWZlcmVuY2UYBCABKAkijwEKE0xpbmtTdWJncmFwaFJlcXVlc3QSGgoSc291cmNlU3ViZ3JhcGhOYW1lGAEgASgJEh8KF3NvdXJjZVN1YmdyYXBoTmFtZXNwYWNlGAIgASgJEhoKEnRhcmdldFN1YmdyYXBoTmFtZRgDIAEoCRIfChd0YXJnZXRTdWJncmFwaE5hbWVzcGFjZRgEIAEoCSJIChRMaW5rU3ViZ3JhcGhSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIlQKFVVubGlua1N1YmdyYXBoUmVxdWVzdBIaChJzb3VyY2VTdWJncmFwaE5hbWUYASABKAkSHwoXc291cmNlU3ViZ3JhcGhOYW1lc3BhY2UYAiABKAkiSgoWVW5saW5rU3ViZ3JhcGhSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIjoKHlZlcmlmeUFQSUtleUdyYXBoQWNjZXNzUmVxdWVzdBIYChBmZWRlcmF0ZWRHcmFwaElkGAEgASgJIqYBCh9WZXJpZnlBUElLZXlHcmFwaEFjY2Vzc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USMgoqaGFzT3JnYW5pemF0aW9uQWRtaW5PckRldmVsb3BlclBlcm1pc3Npb25zGAIgASgIEh0KFWhhc1dyaXRlQWNjZXNzVG9HcmFwaBgDIAEoCCIrChpJbml0aWFsaXplQ29zbW9Vc2VyUmVxdWVzdBINCgV0b2tlbhgBIAEoCSJPChtJbml0aWFsaXplQ29zbW9Vc2VyUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSIaChhMaXN0T3JnYW5pemF0aW9uc1JlcXVlc3Qi/QEKGUxpc3RPcmdhbml6YXRpb25zUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJdCg1vcmdhbml6YXRpb25zGAIgAygLMkYud2cuY29zbW8ucGxhdGZvcm0udjEuTGlzdE9yZ2FuaXphdGlvbnNSZXNwb25zZS5Pcmdhbml6YXRpb25NZW1iZXJzaGlwGk8KFk9yZ2FuaXphdGlvbk1lbWJlcnNoaXASCgoCaWQYASABKAkSDAoEc2x1ZxgCIAEoCRIMCgRuYW1lGAMgASgJEg0KBXJvbGVzGAQgAygJIsABChVSZWNvbXBvc2VHcmFwaFJlcXVlc3QSDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSFAoMaXNfbW9ub2dyYXBoGAMgASgIEhIKBWxpbWl0GAQgASgFSACIAQESLQogZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24YBSABKAhIAYgBAUIICgZfbGltaXRCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uIusCChZSZWNvbXBvc2VHcmFwaFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQQoRY29tcG9zaXRpb25FcnJvcnMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEj8KEGRlcGxveW1lbnRFcnJvcnMYAyADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZXBsb3ltZW50RXJyb3ISRQoTY29tcG9zaXRpb25XYXJuaW5ncxgEIAMoCzIoLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXBvc2l0aW9uV2FybmluZxJECgtlcnJvckNvdW50cxgFIAEoCzIqLndnLmNvc21vLnBsYXRmb3JtLnYxLlN1YmdyYXBoUHVibGlzaFN0YXRzSACIAQFCDgoMX2Vycm9yQ291bnRzIrABChtSZWNvbXBvc2VGZWF0dXJlRmxhZ1JlcXVlc3QSDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSEgoFbGltaXQYAyABKAVIAIgBARItCiBkaXNhYmxlX3Jlc29sdmFiaWxpdHlfdmFsaWRhdGlvbhgFIAEoCEgBiAEBQggKBl9saW1pdEIjCiFfZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24i8QIKHFJlY29tcG9zZUZlYXR1cmVGbGFnUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJBChFjb21wb3NpdGlvbkVycm9ycxgCIAMoCzImLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXBvc2l0aW9uRXJyb3ISPwoQZGVwbG95bWVudEVycm9ycxgDIAMoCzIlLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlcGxveW1lbnRFcnJvchJFChNjb21wb3NpdGlvbldhcm5pbmdzGAQgAygLMigud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25XYXJuaW5nEkQKC2Vycm9yQ291bnRzGAUgASgLMioud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGhQdWJsaXNoU3RhdHNIAIgBAUIOCgxfZXJyb3JDb3VudHMiFgoUR2V0T25ib2FyZGluZ1JlcXVlc3QioAEKFUdldE9uYm9hcmRpbmdSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEhcKCmZpbmlzaGVkQXQYAyABKAlIAIgBARIcChRmZWRlcmF0ZWRHcmFwaHNDb3VudBgEIAEoBRIPCgdlbmFibGVkGAUgASgIQg0KC19maW5pc2hlZEF0IhkKF0NyZWF0ZU9uYm9hcmRpbmdSZXF1ZXN0IpIBChhDcmVhdGVPbmJvYXJkaW5nUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIXCgpmaW5pc2hlZEF0GAIgASgJSACIAQESHAoUZmVkZXJhdGVkR3JhcGhzQ291bnQYAyABKAVCDQoLX2ZpbmlzaGVkQXQiGQoXRmluaXNoT25ib2FyZGluZ1JlcXVlc3QifgoYRmluaXNoT25ib2FyZGluZ1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USHAoUZmVkZXJhdGVkR3JhcGhzQ291bnQYAiABKAUSEgoKZmluaXNoZWRBdBgDIAEoCSpPChVCYXRjaFB1Ymxpc2hKb2JTdGF0dXMSCwoHUEVORElORxAAEg4KClBST0NFU1NJTkcQARIKCgZGQUlMRUQQAhINCglDT01QTEVURUQQAyojCgxMaW50U2V2ZXJpdHkSCAoEd2FybhAAEgkKBWVycm9yEAEqPwoMU3ViZ3JhcGhUeXBlEgwKCFNUQU5EQVJEEAASDwoLR1JQQ19QTFVHSU4QARIQCgxHUlBDX1NFUlZJQ0UQAipVChZBbmFseXRpY3NWaWV3R3JvdXBOYW1lEggKBE5vbmUQABIRCg1PcGVyYXRpb25OYW1lEAESCgoGQ2xpZW50EAISEgoOSHR0cFN0YXR1c0NvZGUQAyoxCg1DdXN0b21PcHRpb25zEggKBFRleHQQABIJCgVSYW5nZRABEgsKB0Jvb2xlYW4QAiqOAQoEVW5pdBIPCgtVbnNwZWNpZmllZBAAEg8KC05hbm9zZWNvbmRzEAESEQoNVW5peFRpbWVzdGFtcBACEgkKBUJ5dGVzEAMSDQoJQ29kZUJsb2NrEAQSDgoKU3RhdHVzQ29kZRAFEgsKB1RyYWNlSUQQBhIKCgZTcGFuSUQQBxIOCgpQZXJjZW50YWdlEAgq/QEKG0FuYWx5dGljc1ZpZXdGaWx0ZXJPcGVyYXRvchIKCgZFUVVBTFMQABIOCgpOT1RfRVFVQUxTEAESEAoMR1JFQVRFUl9USEFOEAISDQoJTEVTU19USEFOEAMSGQoVR1JFQVRFUl9USEFOX09SX0VRVUFMEAQSFgoSTEVTU19USEFOX09SX0VRVUFMEAUSDAoIQ09OVEFJTlMQBhIQCgxOT1RfQ09OVEFJTlMQBxIGCgJJThAIEgoKBk5PVF9JThAJEgsKB0JFVFdFRU4QChIPCgtOT1RfQkVUV0VFThALEgsKB0lTX05VTEwQDBIPCgtJU19OT1RfTlVMTBANKkUKCUV4cGlyZXNBdBIJCgVORVZFUhAAEg8KC1RISVJUWV9EQVlTEAESDgoKU0lYX01PTlRIUxACEgwKCE9ORV9ZRUFSEAMqrAEKD0xvZ2luTWV0aG9kVHlwZRIhCh1MT0dJTl9NRVRIT0RfVFlQRV9VTlNQRUNJRklFRBAAEhkKFUxPR0lOX01FVEhPRF9UWVBFX1NTTxABEh4KGkxPR0lOX01FVEhPRF9UWVBFX1BBU1NXT1JEEAISHQoZTE9HSU5fTUVUSE9EX1RZUEVfQVBJX0tFWRADEhwKGExPR0lOX01FVEhPRF9UWVBFX1NPQ0lBTBAEKoABChNTb2NpYWxMb2dpblByb3ZpZGVyEiUKIVNPQ0lBTF9MT0dJTl9QUk9WSURFUl9VTlNQRUNJRklFRBAAEiAKHFNPQ0lBTF9MT0dJTl9QUk9WSURFUl9HT09HTEUQARIgChxTT0NJQUxfTE9HSU5fUFJPVklERVJfR0lUSFVCEAIqRQoYUHVibGlzaGVkT3BlcmF0aW9uU3RhdHVzEg4KClVQX1RPX0RBVEUQABILCgdDUkVBVEVEEAESDAoIQ09ORkxJQ1QQAiocCg9JbnRlZ3JhdGlvblR5cGUSCQoFU0xBQ0sQAColCgdGZWF0dXJlEggKBHJiYWMQABIGCgJhaRABEggKBHNjaW0QAiosCg5Qcm9wb3NhbE9yaWdpbhIMCghJTlRFUk5BTBAAEgwKCEVYVEVSTkFMEAEqNwoYUHJvcG9zYWxOYW1pbmdDb252ZW50aW9uEgoKBk5PUk1BTBAAEg8KC0lOQ1JFTUVOVEFMEAEqPwoWT3BlcmF0aW9uc0ZldGNoQmFzZWRPbhIMCghSRVFVRVNUUxAAEgsKB0xBVEVOQ1kQARIKCgZFUlJPUlMQAioiCg1Tb3J0RGlyZWN0aW9uEgcKA0FTQxAAEggKBERFU0MQATK8yAEKD1BsYXRmb3JtU2VydmljZRKFAQoWQ3JlYXRlUGxheWdyb3VuZFNjcmlwdBIzLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZVBsYXlncm91bmRTY3JpcHRSZXF1ZXN0GjQud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlUGxheWdyb3VuZFNjcmlwdFJlc3BvbnNlIgAShQEKFkRlbGV0ZVBsYXlncm91bmRTY3JpcHQSMy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVQbGF5Z3JvdW5kU2NyaXB0UmVxdWVzdBo0LndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZVBsYXlncm91bmRTY3JpcHRSZXNwb25zZSIAEoUBChZVcGRhdGVQbGF5Z3JvdW5kU2NyaXB0EjMud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlUGxheWdyb3VuZFNjcmlwdFJlcXVlc3QaNC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVQbGF5Z3JvdW5kU2NyaXB0UmVzcG9uc2UiABJ/ChRHZXRQbGF5Z3JvdW5kU2NyaXB0cxIxLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFBsYXlncm91bmRTY3JpcHRzUmVxdWVzdBoyLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFBsYXlncm91bmRTY3JpcHRzUmVzcG9uc2UiABJwCg9DcmVhdGVOYW1lc3BhY2USLC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVOYW1lc3BhY2VSZXF1ZXN0Gi0ud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlTmFtZXNwYWNlUmVzcG9uc2UiABJwCg9EZWxldGVOYW1lc3BhY2USLC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVOYW1lc3BhY2VSZXF1ZXN0Gi0ud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlTmFtZXNwYWNlUmVzcG9uc2UiABJwCg9SZW5hbWVOYW1lc3BhY2USLC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZW5hbWVOYW1lc3BhY2VSZXF1ZXN0Gi0ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVuYW1lTmFtZXNwYWNlUmVzcG9uc2UiABJqCg1HZXROYW1lc3BhY2VzEioud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0TmFtZXNwYWNlc1JlcXVlc3QaKy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXROYW1lc3BhY2VzUmVzcG9uc2UiABJnCgxHZXROYW1lc3BhY2USKS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXROYW1lc3BhY2VSZXF1ZXN0Gioud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0TmFtZXNwYWNlUmVzcG9uc2UiABJnCgxHZXRXb3Jrc3BhY2USKS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRXb3Jrc3BhY2VSZXF1ZXN0Gioud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0V29ya3NwYWNlUmVzcG9uc2UiABJtCg5DcmVhdGVDb250cmFjdBIrLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUNvbnRyYWN0UmVxdWVzdBosLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUNvbnRyYWN0UmVzcG9uc2UiABJtCg5VcGRhdGVDb250cmFjdBIrLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZUNvbnRyYWN0UmVxdWVzdBosLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZUNvbnRyYWN0UmVzcG9uc2UiABJnChJNb3ZlRmVkZXJhdGVkR3JhcGgSJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Nb3ZlR3JhcGhSZXF1ZXN0Gicud2cuY29zbW8ucGxhdGZvcm0udjEuTW92ZUdyYXBoUmVzcG9uc2UiABJhCgxNb3ZlU3ViZ3JhcGgSJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Nb3ZlR3JhcGhSZXF1ZXN0Gicud2cuY29zbW8ucGxhdGZvcm0udjEuTW92ZUdyYXBoUmVzcG9uc2UiABJiCg1Nb3ZlTW9ub2dyYXBoEiYud2cuY29zbW8ucGxhdGZvcm0udjEuTW92ZUdyYXBoUmVxdWVzdBonLndnLmNvc21vLnBsYXRmb3JtLnYxLk1vdmVHcmFwaFJlc3BvbnNlIgAScAoPQ3JlYXRlTW9ub2dyYXBoEiwud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlTW9ub2dyYXBoUmVxdWVzdBotLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZU1vbm9ncmFwaFJlc3BvbnNlIgAScwoQUHVibGlzaE1vbm9ncmFwaBItLndnLmNvc21vLnBsYXRmb3JtLnYxLlB1Ymxpc2hNb25vZ3JhcGhSZXF1ZXN0Gi4ud2cuY29zbW8ucGxhdGZvcm0udjEuUHVibGlzaE1vbm9ncmFwaFJlc3BvbnNlIgAScAoPRGVsZXRlTW9ub2dyYXBoEiwud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlTW9ub2dyYXBoUmVxdWVzdBotLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZU1vbm9ncmFwaFJlc3BvbnNlIgAScAoPVXBkYXRlTW9ub2dyYXBoEiwud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlTW9ub2dyYXBoUmVxdWVzdBotLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZU1vbm9ncmFwaFJlc3BvbnNlIgAScwoQTWlncmF0ZU1vbm9ncmFwaBItLndnLmNvc21vLnBsYXRmb3JtLnYxLk1pZ3JhdGVNb25vZ3JhcGhSZXF1ZXN0Gi4ud2cuY29zbW8ucGxhdGZvcm0udjEuTWlncmF0ZU1vbm9ncmFwaFJlc3BvbnNlIgASiAEKF0NyZWF0ZUZlZGVyYXRlZFN1YmdyYXBoEjQud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlRmVkZXJhdGVkU3ViZ3JhcGhSZXF1ZXN0GjUud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlRmVkZXJhdGVkU3ViZ3JhcGhSZXNwb25zZSIAEosBChhQdWJsaXNoRmVkZXJhdGVkU3ViZ3JhcGgSNS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QdWJsaXNoRmVkZXJhdGVkU3ViZ3JhcGhSZXF1ZXN0GjYud2cuY29zbW8ucGxhdGZvcm0udjEuUHVibGlzaEZlZGVyYXRlZFN1YmdyYXBoUmVzcG9uc2UiABKOAQoZUHVibGlzaEZlZGVyYXRlZFN1YmdyYXBocxI2LndnLmNvc21vLnBsYXRmb3JtLnYxLlB1Ymxpc2hGZWRlcmF0ZWRTdWJncmFwaHNSZXF1ZXN0Gjcud2cuY29zbW8ucGxhdGZvcm0udjEuUHVibGlzaEZlZGVyYXRlZFN1YmdyYXBoc1Jlc3BvbnNlIgASiwEKGEdldEJhdGNoUHVibGlzaEpvYlN0YXR1cxI1LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEJhdGNoUHVibGlzaEpvYlN0YXR1c1JlcXVlc3QaNi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRCYXRjaFB1Ymxpc2hKb2JTdGF0dXNSZXNwb25zZSIAEn8KFENyZWF0ZUZlZGVyYXRlZEdyYXBoEjEud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlRmVkZXJhdGVkR3JhcGhSZXF1ZXN0GjIud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlRmVkZXJhdGVkR3JhcGhSZXNwb25zZSIAEn8KFERlbGV0ZUZlZGVyYXRlZEdyYXBoEjEud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlRmVkZXJhdGVkR3JhcGhSZXF1ZXN0GjIud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlRmVkZXJhdGVkR3JhcGhSZXNwb25zZSIAEogBChdEZWxldGVGZWRlcmF0ZWRTdWJncmFwaBI0LndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZUZlZGVyYXRlZFN1YmdyYXBoUmVxdWVzdBo1LndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZUZlZGVyYXRlZFN1YmdyYXBoUmVzcG9uc2UiABJ8ChNDaGVja1N1YmdyYXBoU2NoZW1hEjAud2cuY29zbW8ucGxhdGZvcm0udjEuQ2hlY2tTdWJncmFwaFNjaGVtYVJlcXVlc3QaMS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DaGVja1N1YmdyYXBoU2NoZW1hUmVzcG9uc2UiABKpAQoiR2V0UHJvcG9zZWRTY2hlbWFPZkNoZWNrZWRTdWJncmFwaBI/LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFByb3Bvc2VkU2NoZW1hT2ZDaGVja2VkU3ViZ3JhcGhSZXF1ZXN0GkAud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0UHJvcG9zZWRTY2hlbWFPZkNoZWNrZWRTdWJncmFwaFJlc3BvbnNlIgASdgoRRml4U3ViZ3JhcGhTY2hlbWESLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GaXhTdWJncmFwaFNjaGVtYVJlcXVlc3QaLy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GaXhTdWJncmFwaFNjaGVtYVJlc3BvbnNlIgASfwoUVXBkYXRlRmVkZXJhdGVkR3JhcGgSMS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVGZWRlcmF0ZWRHcmFwaFJlcXVlc3QaMi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVGZWRlcmF0ZWRHcmFwaFJlc3BvbnNlIgASbQoOVXBkYXRlU3ViZ3JhcGgSKy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVTdWJncmFwaFJlcXVlc3QaLC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVTdWJncmFwaFJlc3BvbnNlIgASfAoTQ2hlY2tGZWRlcmF0ZWRHcmFwaBIwLndnLmNvc21vLnBsYXRmb3JtLnYxLkNoZWNrRmVkZXJhdGVkR3JhcGhSZXF1ZXN0GjEud2cuY29zbW8ucGxhdGZvcm0udjEuQ2hlY2tGZWRlcmF0ZWRHcmFwaFJlc3BvbnNlIgASVQoGV2hvQW1JEiMud2cuY29zbW8ucGxhdGZvcm0udjEuV2hvQW1JUmVxdWVzdBokLndnLmNvc21vLnBsYXRmb3JtLnYxLldob0FtSVJlc3BvbnNlIgASfAoTR2VuZXJhdGVSb3V0ZXJUb2tlbhIwLndnLmNvc21vLnBsYXRmb3JtLnYxLkdlbmVyYXRlUm91dGVyVG9rZW5SZXF1ZXN0GjEud2cuY29zbW8ucGxhdGZvcm0udjEuR2VuZXJhdGVSb3V0ZXJUb2tlblJlc3BvbnNlIgAScAoPR2V0Um91dGVyVG9rZW5zEiwud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Um91dGVyVG9rZW5zUmVxdWVzdBotLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFJvdXRlclRva2Vuc1Jlc3BvbnNlIgASdgoRRGVsZXRlUm91dGVyVG9rZW4SLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVSb3V0ZXJUb2tlblJlcXVlc3QaLy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVSb3V0ZXJUb2tlblJlc3BvbnNlIgASkQEKGlB1Ymxpc2hQZXJzaXN0ZWRPcGVyYXRpb25zEjcud2cuY29zbW8ucGxhdGZvcm0udjEuUHVibGlzaFBlcnNpc3RlZE9wZXJhdGlvbnNSZXF1ZXN0Gjgud2cuY29zbW8ucGxhdGZvcm0udjEuUHVibGlzaFBlcnNpc3RlZE9wZXJhdGlvbnNSZXNwb25zZSIAEp0BCh5DaGVja1BlcnNpc3RlZE9wZXJhdGlvblRyYWZmaWMSOy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DaGVja1BlcnNpc3RlZE9wZXJhdGlvblRyYWZmaWNSZXF1ZXN0Gjwud2cuY29zbW8ucGxhdGZvcm0udjEuQ2hlY2tQZXJzaXN0ZWRPcGVyYXRpb25UcmFmZmljUmVzcG9uc2UiABKLAQoYRGVsZXRlUGVyc2lzdGVkT3BlcmF0aW9uEjUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlUGVyc2lzdGVkT3BlcmF0aW9uUmVxdWVzdBo2LndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZVBlcnNpc3RlZE9wZXJhdGlvblJlc3BvbnNlIgAShQEKFkdldFBlcnNpc3RlZE9wZXJhdGlvbnMSMy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRQZXJzaXN0ZWRPcGVyYXRpb25zUmVxdWVzdBo0LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFBlcnNpc3RlZE9wZXJhdGlvbnNSZXNwb25zZSIAEmcKDEdldEF1ZGl0TG9ncxIpLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEF1ZGl0TG9nc1JlcXVlc3QaKi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRBdWRpdExvZ3NSZXNwb25zZSIAEnwKE0luaXRpYWxpemVDb3Ntb1VzZXISMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Jbml0aWFsaXplQ29zbW9Vc2VyUmVxdWVzdBoxLndnLmNvc21vLnBsYXRmb3JtLnYxLkluaXRpYWxpemVDb3Ntb1VzZXJSZXNwb25zZSIAEnYKEUxpc3RPcmdhbml6YXRpb25zEi4ud2cuY29zbW8ucGxhdGZvcm0udjEuTGlzdE9yZ2FuaXphdGlvbnNSZXF1ZXN0Gi8ud2cuY29zbW8ucGxhdGZvcm0udjEuTGlzdE9yZ2FuaXphdGlvbnNSZXNwb25zZSIAEnkKEkdldEZlZGVyYXRlZEdyYXBocxIvLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlZGVyYXRlZEdyYXBoc1JlcXVlc3QaMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGZWRlcmF0ZWRHcmFwaHNSZXNwb25zZSIAEqkBCiJHZXRGZWRlcmF0ZWRHcmFwaHNCeVN1YmdyYXBoTGFiZWxzEj8ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVkZXJhdGVkR3JhcGhzQnlTdWJncmFwaExhYmVsc1JlcXVlc3QaQC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGZWRlcmF0ZWRHcmFwaHNCeVN1YmdyYXBoTGFiZWxzUmVzcG9uc2UiABKIAQoXR2V0RmVkZXJhdGVkR3JhcGhCeU5hbWUSNC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGZWRlcmF0ZWRHcmFwaEJ5TmFtZVJlcXVlc3QaNS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGZWRlcmF0ZWRHcmFwaEJ5TmFtZVJlc3BvbnNlIgASkQEKGkdldEZlZGVyYXRlZEdyYXBoU0RMQnlOYW1lEjcud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVkZXJhdGVkR3JhcGhTRExCeU5hbWVSZXF1ZXN0Gjgud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVkZXJhdGVkR3JhcGhTRExCeU5hbWVSZXNwb25zZSIAEmcKDEdldFN1YmdyYXBocxIpLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFN1YmdyYXBoc1JlcXVlc3QaKi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRTdWJncmFwaHNSZXNwb25zZSIAEnYKEUdldFN1YmdyYXBoQnlOYW1lEi4ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0U3ViZ3JhcGhCeU5hbWVSZXF1ZXN0Gi8ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0U3ViZ3JhcGhCeU5hbWVSZXNwb25zZSIAEqwBCiNHZXRTdWJncmFwaFNETEZyb21MYXRlc3RDb21wb3NpdGlvbhJALndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFN1YmdyYXBoU0RMRnJvbUxhdGVzdENvbXBvc2l0aW9uUmVxdWVzdBpBLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFN1YmdyYXBoU0RMRnJvbUxhdGVzdENvbXBvc2l0aW9uUmVzcG9uc2UiABJ/ChRHZXRMYXRlc3RTdWJncmFwaFNETBIxLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldExhdGVzdFN1YmdyYXBoU0RMUmVxdWVzdBoyLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldExhdGVzdFN1YmdyYXBoU0RMUmVzcG9uc2UiABKaAQodR2V0Q2hlY2tzQnlGZWRlcmF0ZWRHcmFwaE5hbWUSOi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRDaGVja3NCeUZlZGVyYXRlZEdyYXBoTmFtZVJlcXVlc3QaOy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRDaGVja3NCeUZlZGVyYXRlZEdyYXBoTmFtZVJlc3BvbnNlIgAScAoPR2V0Q2hlY2tTdW1tYXJ5Eiwud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q2hlY2tTdW1tYXJ5UmVxdWVzdBotLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldENoZWNrU3VtbWFyeVJlc3BvbnNlIgASeQoSR2V0Q2hlY2tPcGVyYXRpb25zEi8ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q2hlY2tPcGVyYXRpb25zUmVxdWVzdBowLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldENoZWNrT3BlcmF0aW9uc1Jlc3BvbnNlIgASdgoRRm9yY2VDaGVja1N1Y2Nlc3MSLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Gb3JjZUNoZWNrU3VjY2Vzc1JlcXVlc3QaLy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Gb3JjZUNoZWNrU3VjY2Vzc1Jlc3BvbnNlIgASiwEKGENyZWF0ZU9wZXJhdGlvbk92ZXJyaWRlcxI1LndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZU9wZXJhdGlvbk92ZXJyaWRlc1JlcXVlc3QaNi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVPcGVyYXRpb25PdmVycmlkZXNSZXNwb25zZSIAEosBChhSZW1vdmVPcGVyYXRpb25PdmVycmlkZXMSNS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZW1vdmVPcGVyYXRpb25PdmVycmlkZXNSZXF1ZXN0GjYud2cuY29zbW8ucGxhdGZvcm0udjEuUmVtb3ZlT3BlcmF0aW9uT3ZlcnJpZGVzUmVzcG9uc2UiABKjAQogQ3JlYXRlT3BlcmF0aW9uSWdub3JlQWxsT3ZlcnJpZGUSPS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVPcGVyYXRpb25JZ25vcmVBbGxPdmVycmlkZVJlcXVlc3QaPi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVPcGVyYXRpb25JZ25vcmVBbGxPdmVycmlkZVJlc3BvbnNlIgASowEKIFJlbW92ZU9wZXJhdGlvbklnbm9yZUFsbE92ZXJyaWRlEj0ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVtb3ZlT3BlcmF0aW9uSWdub3JlQWxsT3ZlcnJpZGVSZXF1ZXN0Gj4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVtb3ZlT3BlcmF0aW9uSWdub3JlQWxsT3ZlcnJpZGVSZXNwb25zZSIAEoIBChVHZXRPcGVyYXRpb25PdmVycmlkZXMSMi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcGVyYXRpb25PdmVycmlkZXNSZXF1ZXN0GjMud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3BlcmF0aW9uT3ZlcnJpZGVzUmVzcG9uc2UiABJwCg9HZXRBbGxPdmVycmlkZXMSLC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRBbGxPdmVycmlkZXNSZXF1ZXN0Gi0ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0QWxsT3ZlcnJpZGVzUmVzcG9uc2UiABKyAQolVG9nZ2xlQ2hhbmdlT3ZlcnJpZGVzRm9yQWxsT3BlcmF0aW9ucxJCLndnLmNvc21vLnBsYXRmb3JtLnYxLlRvZ2dsZUNoYW5nZU92ZXJyaWRlc0ZvckFsbE9wZXJhdGlvbnNSZXF1ZXN0GkMud2cuY29zbW8ucGxhdGZvcm0udjEuVG9nZ2xlQ2hhbmdlT3ZlcnJpZGVzRm9yQWxsT3BlcmF0aW9uc1Jlc3BvbnNlIgASsgEKJUNyZWF0ZUlnbm9yZU92ZXJyaWRlc0ZvckFsbE9wZXJhdGlvbnMSQi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVJZ25vcmVPdmVycmlkZXNGb3JBbGxPcGVyYXRpb25zUmVxdWVzdBpDLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUlnbm9yZU92ZXJyaWRlc0ZvckFsbE9wZXJhdGlvbnNSZXNwb25zZSIAEnwKE0dldE9wZXJhdGlvbkNvbnRlbnQSMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcGVyYXRpb25Db250ZW50UmVxdWVzdBoxLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9wZXJhdGlvbkNvbnRlbnRSZXNwb25zZSIAEpEBChpHZXRGZWRlcmF0ZWRHcmFwaENoYW5nZWxvZxI3LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlZGVyYXRlZEdyYXBoQ2hhbmdlbG9nUmVxdWVzdBo4LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlZGVyYXRlZEdyYXBoQ2hhbmdlbG9nUmVzcG9uc2UiABKOAQoZQ3JlYXRlRmVkZXJhdGVkR3JhcGhUb2tlbhI2LndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUZlZGVyYXRlZEdyYXBoVG9rZW5SZXF1ZXN0Gjcud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlRmVkZXJhdGVkR3JhcGhUb2tlblJlc3BvbnNlIgASggEKFUdldE9yZ2FuaXphdGlvbkJ5U2x1ZxIyLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9yZ2FuaXphdGlvbkJ5U2x1Z1JlcXVlc3QaMy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25CeVNsdWdSZXNwb25zZSIAEoUBChZHZXRPcmdhbml6YXRpb25NZW1iZXJzEjMud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uTWVtYmVyc1JlcXVlc3QaNC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25NZW1iZXJzUmVzcG9uc2UiABKaAQodR2V0UGVuZGluZ09yZ2FuaXphdGlvbk1lbWJlcnMSOi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRQZW5kaW5nT3JnYW5pemF0aW9uTWVtYmVyc1JlcXVlc3QaOy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRQZW5kaW5nT3JnYW5pemF0aW9uTWVtYmVyc1Jlc3BvbnNlIgASfwoUSXNNZW1iZXJMaW1pdFJlYWNoZWQSMS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Jc01lbWJlckxpbWl0UmVhY2hlZFJlcXVlc3QaMi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Jc01lbWJlckxpbWl0UmVhY2hlZFJlc3BvbnNlIgASYQoKSW52aXRlVXNlchInLndnLmNvc21vLnBsYXRmb3JtLnYxLkludml0ZVVzZXJSZXF1ZXN0Gigud2cuY29zbW8ucGxhdGZvcm0udjEuSW52aXRlVXNlclJlc3BvbnNlIgASZAoLSW52aXRlVXNlcnMSKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5JbnZpdGVVc2Vyc1JlcXVlc3QaKS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5JbnZpdGVVc2Vyc1Jlc3BvbnNlIgASYQoKR2V0QVBJS2V5cxInLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEFQSUtleXNSZXF1ZXN0Gigud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0QVBJS2V5c1Jlc3BvbnNlIgASZwoMQ3JlYXRlQVBJS2V5Eikud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlQVBJS2V5UmVxdWVzdBoqLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUFQSUtleVJlc3BvbnNlIgASZwoMVXBkYXRlQVBJS2V5Eikud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlQVBJS2V5UmVxdWVzdBoqLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZUFQSUtleVJlc3BvbnNlIgASZwoMRGVsZXRlQVBJS2V5Eikud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlQVBJS2V5UmVxdWVzdBoqLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZUFQSUtleVJlc3BvbnNlIgASiwEKGFJlbW92ZU9yZ2FuaXphdGlvbk1lbWJlchI1LndnLmNvc21vLnBsYXRmb3JtLnYxLlJlbW92ZU9yZ2FuaXphdGlvbk1lbWJlclJlcXVlc3QaNi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZW1vdmVPcmdhbml6YXRpb25NZW1iZXJSZXNwb25zZSIAEnMKEFJlbW92ZUludml0YXRpb24SLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZW1vdmVJbnZpdGF0aW9uUmVxdWVzdBouLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlbW92ZUludml0YXRpb25SZXNwb25zZSIAEnYKEU1pZ3JhdGVGcm9tQXBvbGxvEi4ud2cuY29zbW8ucGxhdGZvcm0udjEuTWlncmF0ZUZyb21BcG9sbG9SZXF1ZXN0Gi8ud2cuY29zbW8ucGxhdGZvcm0udjEuTWlncmF0ZUZyb21BcG9sbG9SZXNwb25zZSIAEogBChdDcmVhdGVPcmdhbml6YXRpb25Hcm91cBI0LndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZU9yZ2FuaXphdGlvbkdyb3VwUmVxdWVzdBo1LndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZU9yZ2FuaXphdGlvbkdyb3VwUmVzcG9uc2UiABKCAQoVR2V0T3JnYW5pemF0aW9uR3JvdXBzEjIud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uR3JvdXBzUmVxdWVzdBozLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9yZ2FuaXphdGlvbkdyb3Vwc1Jlc3BvbnNlIgASlAEKG0dldE9yZ2FuaXphdGlvbkdyb3VwTWVtYmVycxI4LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9yZ2FuaXphdGlvbkdyb3VwTWVtYmVyc1JlcXVlc3QaOS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25Hcm91cE1lbWJlcnNSZXNwb25zZSIAEogBChdVcGRhdGVPcmdhbml6YXRpb25Hcm91cBI0LndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZU9yZ2FuaXphdGlvbkdyb3VwUmVxdWVzdBo1LndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZU9yZ2FuaXphdGlvbkdyb3VwUmVzcG9uc2UiABKIAQoXRGVsZXRlT3JnYW5pemF0aW9uR3JvdXASNC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVPcmdhbml6YXRpb25Hcm91cFJlcXVlc3QaNS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVPcmdhbml6YXRpb25Hcm91cFJlc3BvbnNlIgASoAEKH0NyZWF0ZU9yZ2FuaXphdGlvbldlYmhvb2tDb25maWcSPC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVPcmdhbml6YXRpb25XZWJob29rQ29uZmlnUmVxdWVzdBo9LndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZU9yZ2FuaXphdGlvbldlYmhvb2tDb25maWdSZXNwb25zZSIAEpoBCh1HZXRPcmdhbml6YXRpb25XZWJob29rQ29uZmlncxI6LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9yZ2FuaXphdGlvbldlYmhvb2tDb25maWdzUmVxdWVzdBo7LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9yZ2FuaXphdGlvbldlYmhvb2tDb25maWdzUmVzcG9uc2UiABKRAQoaR2V0T3JnYW5pemF0aW9uV2ViaG9va01ldGESNy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25XZWJob29rTWV0YVJlcXVlc3QaOC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25XZWJob29rTWV0YVJlc3BvbnNlIgASoAEKH1VwZGF0ZU9yZ2FuaXphdGlvbldlYmhvb2tDb25maWcSPC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVPcmdhbml6YXRpb25XZWJob29rQ29uZmlnUmVxdWVzdBo9LndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZU9yZ2FuaXphdGlvbldlYmhvb2tDb25maWdSZXNwb25zZSIAEqABCh9EZWxldGVPcmdhbml6YXRpb25XZWJob29rQ29uZmlnEjwud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlT3JnYW5pemF0aW9uV2ViaG9va0NvbmZpZ1JlcXVlc3QaPS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVPcmdhbml6YXRpb25XZWJob29rQ29uZmlnUmVzcG9uc2UiABKaAQodR2V0T3JnYW5pemF0aW9uV2ViaG9va0hpc3RvcnkSOi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25XZWJob29rSGlzdG9yeVJlcXVlc3QaOy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25XZWJob29rSGlzdG9yeVJlc3BvbnNlIgASjgEKGUdldFdlYmhvb2tEZWxpdmVyeURldGFpbHMSNi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRXZWJob29rRGVsaXZlcnlEZXRhaWxzUmVxdWVzdBo3LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFdlYmhvb2tEZWxpdmVyeURldGFpbHNSZXNwb25zZSIAEnMKEFJlZGVsaXZlcldlYmhvb2sSLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZWRlbGl2ZXJXZWJob29rUmVxdWVzdBouLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlZGVsaXZlcldlYmhvb2tSZXNwb25zZSIAEnYKEUNyZWF0ZUludGVncmF0aW9uEi4ud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlSW50ZWdyYXRpb25SZXF1ZXN0Gi8ud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlSW50ZWdyYXRpb25SZXNwb25zZSIAEpQBChtHZXRPcmdhbml6YXRpb25JbnRlZ3JhdGlvbnMSOC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25JbnRlZ3JhdGlvbnNSZXF1ZXN0Gjkud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uSW50ZWdyYXRpb25zUmVzcG9uc2UiABKIAQoXVXBkYXRlSW50ZWdyYXRpb25Db25maWcSNC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVJbnRlZ3JhdGlvbkNvbmZpZ1JlcXVlc3QaNS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVJbnRlZ3JhdGlvbkNvbmZpZ1Jlc3BvbnNlIgASdgoRRGVsZXRlSW50ZWdyYXRpb24SLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVJbnRlZ3JhdGlvblJlcXVlc3QaLy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVJbnRlZ3JhdGlvblJlc3BvbnNlIgASYQoKRGVsZXRlVXNlchInLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZVVzZXJSZXF1ZXN0Gigud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlVXNlclJlc3BvbnNlIgASeQoSRGVsZXRlT3JnYW5pemF0aW9uEi8ud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlT3JnYW5pemF0aW9uUmVxdWVzdBowLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZU9yZ2FuaXphdGlvblJlc3BvbnNlIgASfAoTUmVzdG9yZU9yZ2FuaXphdGlvbhIwLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3RvcmVPcmdhbml6YXRpb25SZXF1ZXN0GjEud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzdG9yZU9yZ2FuaXphdGlvblJlc3BvbnNlIgASdgoRTGVhdmVPcmdhbml6YXRpb24SLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MZWF2ZU9yZ2FuaXphdGlvblJlcXVlc3QaLy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MZWF2ZU9yZ2FuaXphdGlvblJlc3BvbnNlIgASjgEKGVVwZGF0ZU9yZ2FuaXphdGlvbkRldGFpbHMSNi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVPcmdhbml6YXRpb25EZXRhaWxzUmVxdWVzdBo3LndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZU9yZ2FuaXphdGlvbkRldGFpbHNSZXNwb25zZSIAEn8KFFVwZGF0ZU9yZ01lbWJlckdyb3VwEjEud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlT3JnTWVtYmVyR3JvdXBSZXF1ZXN0GjIud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlT3JnTWVtYmVyR3JvdXBSZXNwb25zZSIAEn8KFElzR2l0SHViQXBwSW5zdGFsbGVkEjEud2cuY29zbW8ucGxhdGZvcm0udjEuSXNHaXRIdWJBcHBJbnN0YWxsZWRSZXF1ZXN0GjIud2cuY29zbW8ucGxhdGZvcm0udjEuSXNHaXRIdWJBcHBJbnN0YWxsZWRSZXNwb25zZSIAEnkKEkNyZWF0ZU9JRENQcm92aWRlchIvLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZU9JRENQcm92aWRlclJlcXVlc3QaMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVPSURDUHJvdmlkZXJSZXNwb25zZSIAEnAKD0dldE9JRENQcm92aWRlchIsLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9JRENQcm92aWRlclJlcXVlc3QaLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPSURDUHJvdmlkZXJSZXNwb25zZSIAEnYKEUxpc3RPSURDUHJvdmlkZXJzEi4ud2cuY29zbW8ucGxhdGZvcm0udjEuTGlzdE9JRENQcm92aWRlcnNSZXF1ZXN0Gi8ud2cuY29zbW8ucGxhdGZvcm0udjEuTGlzdE9JRENQcm92aWRlcnNSZXNwb25zZSIAEnkKEkRlbGV0ZU9JRENQcm92aWRlchIvLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZU9JRENQcm92aWRlclJlcXVlc3QaMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVPSURDUHJvdmlkZXJSZXNwb25zZSIAEnMKEFVwZGF0ZUlEUE1hcHBlcnMSLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVJRFBNYXBwZXJzUmVxdWVzdBouLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZUlEUE1hcHBlcnNSZXNwb25zZSIAEmEKCkdldENsaWVudHMSJy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRDbGllbnRzUmVxdWVzdBooLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldENsaWVudHNSZXNwb25zZSIAEnwKE1ByZXZpZXdEZWxldGVDbGllbnQSMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QcmV2aWV3RGVsZXRlQ2xpZW50UmVxdWVzdBoxLndnLmNvc21vLnBsYXRmb3JtLnYxLlByZXZpZXdEZWxldGVDbGllbnRSZXNwb25zZSIAEmcKDERlbGV0ZUNsaWVudBIpLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZUNsaWVudFJlcXVlc3QaKi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVDbGllbnRSZXNwb25zZSIAEmEKCkdldFJvdXRlcnMSJy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRSb3V0ZXJzUmVxdWVzdBooLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFJvdXRlcnNSZXNwb25zZSIAEm0KDkdldEludml0YXRpb25zEisud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0SW52aXRhdGlvbnNSZXF1ZXN0Giwud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0SW52aXRhdGlvbnNSZXNwb25zZSIAEo4BChlBY2NlcHRPckRlY2xpbmVJbnZpdGF0aW9uEjYud2cuY29zbW8ucGxhdGZvcm0udjEuQWNjZXB0T3JEZWNsaW5lSW52aXRhdGlvblJlcXVlc3QaNy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5BY2NlcHRPckRlY2xpbmVJbnZpdGF0aW9uUmVzcG9uc2UiABJwCg9HZXRDb21wb3NpdGlvbnMSLC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRDb21wb3NpdGlvbnNSZXF1ZXN0Gi0ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q29tcG9zaXRpb25zUmVzcG9uc2UiABKCAQoVR2V0Q29tcG9zaXRpb25EZXRhaWxzEjIud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q29tcG9zaXRpb25EZXRhaWxzUmVxdWVzdBozLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldENvbXBvc2l0aW9uRGV0YWlsc1Jlc3BvbnNlIgASggEKFUdldFNkbEJ5U2NoZW1hVmVyc2lvbhIyLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFNkbEJ5U2NoZW1hVmVyc2lvblJlcXVlc3QaMy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRTZGxCeVNjaGVtYVZlcnNpb25SZXNwb25zZSIAEpQBChtHZXRDaGFuZ2Vsb2dCeVNjaGVtYVZlcnNpb24SOC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRDaGFuZ2Vsb2dCeVNjaGVtYVZlcnNpb25SZXF1ZXN0Gjkud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q2hhbmdlbG9nQnlTY2hlbWFWZXJzaW9uUmVzcG9uc2UiABKRAQoaR2V0VXNlckFjY2Vzc2libGVSZXNvdXJjZXMSNy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRVc2VyQWNjZXNzaWJsZVJlc291cmNlc1JlcXVlc3QaOC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRVc2VyQWNjZXNzaWJsZVJlc291cmNlc1Jlc3BvbnNlIgASggEKFVVwZGF0ZUZlYXR1cmVTZXR0aW5ncxIyLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZUZlYXR1cmVTZXR0aW5nc1JlcXVlc3QaMy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVGZWF0dXJlU2V0dGluZ3NSZXNwb25zZSIAEnkKEkdldFN1YmdyYXBoTWVtYmVycxIvLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFN1YmdyYXBoTWVtYmVyc1JlcXVlc3QaMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRTdWJncmFwaE1lbWJlcnNSZXNwb25zZSIAEl4KCUFkZFJlYWRtZRImLndnLmNvc21vLnBsYXRmb3JtLnYxLkFkZFJlYWRtZVJlcXVlc3QaJy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5BZGRSZWFkbWVSZXNwb25zZSIAEpcBChxHZXRVc2VyQWNjZXNzaWJsZVBlcm1pc3Npb25zEjkud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0VXNlckFjY2Vzc2libGVQZXJtaXNzaW9uc1JlcXVlc3QaOi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRVc2VyQWNjZXNzaWJsZVBlcm1pc3Npb25zUmVzcG9uc2UiABJ2ChFDcmVhdGVGZWF0dXJlRmxhZxIuLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUZlYXR1cmVGbGFnUmVxdWVzdBovLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUZlYXR1cmVGbGFnUmVzcG9uc2UiABJ2ChFEZWxldGVGZWF0dXJlRmxhZxIuLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZUZlYXR1cmVGbGFnUmVxdWVzdBovLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZUZlYXR1cmVGbGFnUmVzcG9uc2UiABJ2ChFVcGRhdGVGZWF0dXJlRmxhZxIuLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZUZlYXR1cmVGbGFnUmVxdWVzdBovLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZUZlYXR1cmVGbGFnUmVzcG9uc2UiABJ2ChFFbmFibGVGZWF0dXJlRmxhZxIuLndnLmNvc21vLnBsYXRmb3JtLnYxLkVuYWJsZUZlYXR1cmVGbGFnUmVxdWVzdBovLndnLmNvc21vLnBsYXRmb3JtLnYxLkVuYWJsZUZlYXR1cmVGbGFnUmVzcG9uc2UiABJ2ChBHZXRBbmFseXRpY3NWaWV3Ei0ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0QW5hbHl0aWNzVmlld1JlcXVlc3QaLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRBbmFseXRpY3NWaWV3UmVzcG9uc2UiA5ACARKRAQoZR2V0RGFzaGJvYXJkQW5hbHl0aWNzVmlldxI2LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldERhc2hib2FyZEFuYWx5dGljc1ZpZXdSZXF1ZXN0Gjcud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RGFzaGJvYXJkQW5hbHl0aWNzVmlld1Jlc3BvbnNlIgOQAgESWwoIR2V0VHJhY2USJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRUcmFjZVJlcXVlc3QaJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRUcmFjZVJlc3BvbnNlIgAScwoPR2V0R3JhcGhNZXRyaWNzEiwud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0R3JhcGhNZXRyaWNzUmVxdWVzdBotLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEdyYXBoTWV0cmljc1Jlc3BvbnNlIgOQAgESfwoTR2V0TWV0cmljc0Vycm9yUmF0ZRIwLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE1ldHJpY3NFcnJvclJhdGVSZXF1ZXN0GjEud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0TWV0cmljc0Vycm9yUmF0ZVJlc3BvbnNlIgOQAgESfAoSR2V0U3ViZ3JhcGhNZXRyaWNzEi8ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0U3ViZ3JhcGhNZXRyaWNzUmVxdWVzdBowLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFN1YmdyYXBoTWV0cmljc1Jlc3BvbnNlIgOQAgESlwEKG0dldFN1YmdyYXBoTWV0cmljc0Vycm9yUmF0ZRI4LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFN1YmdyYXBoTWV0cmljc0Vycm9yUmF0ZVJlcXVlc3QaOS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRTdWJncmFwaE1ldHJpY3NFcnJvclJhdGVSZXNwb25zZSIDkAIBEm0KDUdldEZpZWxkVXNhZ2USKi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGaWVsZFVzYWdlUmVxdWVzdBorLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZpZWxkVXNhZ2VSZXNwb25zZSIDkAIBEpcBChxHZXRPcmdhbml6YXRpb25SZXF1ZXN0c0NvdW50Ejkud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uUmVxdWVzdHNDb3VudFJlcXVlc3QaOi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25SZXF1ZXN0c0NvdW50UmVzcG9uc2UiABJ5ChJDcmVhdGVPcmdhbml6YXRpb24SLy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVPcmdhbml6YXRpb25SZXF1ZXN0GjAud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlT3JnYW5pemF0aW9uUmVzcG9uc2UiABKXAQocRW5hYmxlTGludGluZ0ZvclRoZU5hbWVzcGFjZRI5LndnLmNvc21vLnBsYXRmb3JtLnYxLkVuYWJsZUxpbnRpbmdGb3JUaGVOYW1lc3BhY2VSZXF1ZXN0Gjoud2cuY29zbW8ucGxhdGZvcm0udjEuRW5hYmxlTGludGluZ0ZvclRoZU5hbWVzcGFjZVJlc3BvbnNlIgASlwEKHENvbmZpZ3VyZU5hbWVzcGFjZUxpbnRDb25maWcSOS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db25maWd1cmVOYW1lc3BhY2VMaW50Q29uZmlnUmVxdWVzdBo6LndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbmZpZ3VyZU5hbWVzcGFjZUxpbnRDb25maWdSZXNwb25zZSIAEoUBChZHZXROYW1lc3BhY2VMaW50Q29uZmlnEjMud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0TmFtZXNwYWNlTGludENvbmZpZ1JlcXVlc3QaNC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXROYW1lc3BhY2VMaW50Q29uZmlnUmVzcG9uc2UiABKZAQoYR2V0TmFtZXNwYWNlQ2hlY2tzQ29uZmlnEjwud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0TmFtZXNwYWNlQ2hlY2tzQ29uZmlndXJhdGlvblJlcXVlc3QaPS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXROYW1lc3BhY2VDaGVja3NDb25maWd1cmF0aW9uUmVzcG9uc2UiABKiAQobVXBkYXRlTmFtZXNwYWNlQ2hlY2tzQ29uZmlnEj8ud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlTmFtZXNwYWNlQ2hlY2tzQ29uZmlndXJhdGlvblJlcXVlc3QaQC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVOYW1lc3BhY2VDaGVja3NDb25maWd1cmF0aW9uUmVzcG9uc2UiABJ5ChJFbmFibGVHcmFwaFBydW5pbmcSLy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5FbmFibGVHcmFwaFBydW5pbmdSZXF1ZXN0GjAud2cuY29zbW8ucGxhdGZvcm0udjEuRW5hYmxlR3JhcGhQcnVuaW5nUmVzcG9uc2UiABKvAQokQ29uZmlndXJlTmFtZXNwYWNlR3JhcGhQcnVuaW5nQ29uZmlnEkEud2cuY29zbW8ucGxhdGZvcm0udjEuQ29uZmlndXJlTmFtZXNwYWNlR3JhcGhQcnVuaW5nQ29uZmlnUmVxdWVzdBpCLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbmZpZ3VyZU5hbWVzcGFjZUdyYXBoUHJ1bmluZ0NvbmZpZ1Jlc3BvbnNlIgASnQEKHkdldE5hbWVzcGFjZUdyYXBoUHJ1bmluZ0NvbmZpZxI7LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE5hbWVzcGFjZUdyYXBoUHJ1bmluZ0NvbmZpZ1JlcXVlc3QaPC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXROYW1lc3BhY2VHcmFwaFBydW5pbmdDb25maWdSZXNwb25zZSIAEnAKD0dldEZlYXR1cmVGbGFncxIsLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlYXR1cmVGbGFnc1JlcXVlc3QaLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGZWF0dXJlRmxhZ3NSZXNwb25zZSIAEn8KFEdldEZlYXR1cmVGbGFnQnlOYW1lEjEud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVhdHVyZUZsYWdCeU5hbWVSZXF1ZXN0GjIud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVhdHVyZUZsYWdCeU5hbWVSZXNwb25zZSIAEqMBCiBHZXRGZWF0dXJlU3ViZ3JhcGhzQnlGZWF0dXJlRmxhZxI9LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlYXR1cmVTdWJncmFwaHNCeUZlYXR1cmVGbGFnUmVxdWVzdBo+LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlYXR1cmVTdWJncmFwaHNCeUZlYXR1cmVGbGFnUmVzcG9uc2UiABJ8ChNHZXRGZWF0dXJlU3ViZ3JhcGhzEjAud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVhdHVyZVN1YmdyYXBoc1JlcXVlc3QaMS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGZWF0dXJlU3ViZ3JhcGhzUmVzcG9uc2UiABKgAQofR2V0RmVhdHVyZUZsYWdzQnlGZWRlcmF0ZWRHcmFwaBI8LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlYXR1cmVGbGFnc0J5RmVkZXJhdGVkR3JhcGhSZXF1ZXN0Gj0ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVhdHVyZUZsYWdzQnlGZWRlcmF0ZWRHcmFwaFJlc3BvbnNlIgAS2QEKMkdldEZlYXR1cmVGbGFnc0luTGF0ZXN0Q29tcG9zaXRpb25CeUZlZGVyYXRlZEdyYXBoEk8ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVhdHVyZUZsYWdzSW5MYXRlc3RDb21wb3NpdGlvbkJ5RmVkZXJhdGVkR3JhcGhSZXF1ZXN0GlAud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVhdHVyZUZsYWdzSW5MYXRlc3RDb21wb3NpdGlvbkJ5RmVkZXJhdGVkR3JhcGhSZXNwb25zZSIAEqwBCiNHZXRGZWF0dXJlU3ViZ3JhcGhzQnlGZWRlcmF0ZWRHcmFwaBJALndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlYXR1cmVTdWJncmFwaHNCeUZlZGVyYXRlZEdyYXBoUmVxdWVzdBpBLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlYXR1cmVTdWJncmFwaHNCeUZlZGVyYXRlZEdyYXBoUmVzcG9uc2UiABKCAQoVR2V0RmVkZXJhdGVkR3JhcGhCeUlkEjIud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVkZXJhdGVkR3JhcGhCeUlkUmVxdWVzdBozLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlZGVyYXRlZEdyYXBoQnlJZFJlc3BvbnNlIgAScAoPR2V0U3ViZ3JhcGhCeUlkEiwud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0U3ViZ3JhcGhCeUlkUmVxdWVzdBotLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFN1YmdyYXBoQnlJZFJlc3BvbnNlIgASiwEKGFB1c2hDYWNoZVdhcm1lck9wZXJhdGlvbhI1LndnLmNvc21vLnBsYXRmb3JtLnYxLlB1c2hDYWNoZVdhcm1lck9wZXJhdGlvblJlcXVlc3QaNi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QdXNoQ2FjaGVXYXJtZXJPcGVyYXRpb25SZXNwb25zZSIAEosBChhHZXRDYWNoZVdhcm1lck9wZXJhdGlvbnMSNS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRDYWNoZVdhcm1lck9wZXJhdGlvbnNSZXF1ZXN0GjYud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q2FjaGVXYXJtZXJPcGVyYXRpb25zUmVzcG9uc2UiABKXAQocQ29tcHV0ZUNhY2hlV2FybWVyT3BlcmF0aW9ucxI5LndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXB1dGVDYWNoZVdhcm1lck9wZXJhdGlvbnNSZXF1ZXN0Gjoud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcHV0ZUNhY2hlV2FybWVyT3BlcmF0aW9uc1Jlc3BvbnNlIgASfwoUQ29uZmlndXJlQ2FjaGVXYXJtZXISMS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db25maWd1cmVDYWNoZVdhcm1lclJlcXVlc3QaMi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db25maWd1cmVDYWNoZVdhcm1lclJlc3BvbnNlIgASfwoUR2V0Q2FjaGVXYXJtZXJDb25maWcSMS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRDYWNoZVdhcm1lckNvbmZpZ1JlcXVlc3QaMi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRDYWNoZVdhcm1lckNvbmZpZ1Jlc3BvbnNlIgASkQEKGkRlbGV0ZUNhY2hlV2FybWVyT3BlcmF0aW9uEjcud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlQ2FjaGVXYXJtZXJPcGVyYXRpb25SZXF1ZXN0Gjgud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlQ2FjaGVXYXJtZXJPcGVyYXRpb25SZXNwb25zZSIAEqMBCiBHZXRTdWJncmFwaENoZWNrRXh0ZW5zaW9uc0NvbmZpZxI9LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFN1YmdyYXBoQ2hlY2tFeHRlbnNpb25zQ29uZmlnUmVxdWVzdBo+LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFN1YmdyYXBoQ2hlY2tFeHRlbnNpb25zQ29uZmlnUmVzcG9uc2UiABKjAQogQ29uZmlndXJlU3ViZ3JhcGhDaGVja0V4dGVuc2lvbnMSPS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db25maWd1cmVTdWJncmFwaENoZWNrRXh0ZW5zaW9uc1JlcXVlc3QaPi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db25maWd1cmVTdWJncmFwaENoZWNrRXh0ZW5zaW9uc1Jlc3BvbnNlIgAScAoPR2V0QmlsbGluZ1BsYW5zEiwud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0QmlsbGluZ1BsYW5zUmVxdWVzdBotLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEJpbGxpbmdQbGFuc1Jlc3BvbnNlIgASggEKFUNyZWF0ZUNoZWNrb3V0U2Vzc2lvbhIyLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUNoZWNrb3V0U2Vzc2lvblJlcXVlc3QaMy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVDaGVja291dFNlc3Npb25SZXNwb25zZSIAEpEBChpDcmVhdGVCaWxsaW5nUG9ydGFsU2Vzc2lvbhI3LndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUJpbGxpbmdQb3J0YWxTZXNzaW9uUmVxdWVzdBo4LndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUJpbGxpbmdQb3J0YWxTZXNzaW9uUmVzcG9uc2UiABJkCgtVcGdyYWRlUGxhbhIoLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZ3JhZGVQbGFuUmVxdWVzdBopLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZ3JhZGVQbGFuUmVzcG9uc2UiABKgAQofTGlzdFJvdXRlckNvbXBhdGliaWxpdHlWZXJzaW9ucxI8LndnLmNvc21vLnBsYXRmb3JtLnYxLkxpc3RSb3V0ZXJDb21wYXRpYmlsaXR5VmVyc2lvbnNSZXF1ZXN0Gj0ud2cuY29zbW8ucGxhdGZvcm0udjEuTGlzdFJvdXRlckNvbXBhdGliaWxpdHlWZXJzaW9uc1Jlc3BvbnNlIgASqQEKIlNldEdyYXBoUm91dGVyQ29tcGF0aWJpbGl0eVZlcnNpb24SPy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TZXRHcmFwaFJvdXRlckNvbXBhdGliaWxpdHlWZXJzaW9uUmVxdWVzdBpALndnLmNvc21vLnBsYXRmb3JtLnYxLlNldEdyYXBoUm91dGVyQ29tcGF0aWJpbGl0eVZlcnNpb25SZXNwb25zZSIAEm0KDkNyZWF0ZVByb3Bvc2FsEisud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlUHJvcG9zYWxSZXF1ZXN0Giwud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlUHJvcG9zYWxSZXNwb25zZSIAEmQKC0dldFByb3Bvc2FsEigud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0UHJvcG9zYWxSZXF1ZXN0Gikud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0UHJvcG9zYWxSZXNwb25zZSIAEm0KDlVwZGF0ZVByb3Bvc2FsEisud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlUHJvcG9zYWxSZXF1ZXN0Giwud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlUHJvcG9zYWxSZXNwb25zZSIAEpQBChtFbmFibGVQcm9wb3NhbHNGb3JOYW1lc3BhY2USOC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5FbmFibGVQcm9wb3NhbHNGb3JOYW1lc3BhY2VSZXF1ZXN0Gjkud2cuY29zbW8ucGxhdGZvcm0udjEuRW5hYmxlUHJvcG9zYWxzRm9yTmFtZXNwYWNlUmVzcG9uc2UiABKjAQogQ29uZmlndXJlTmFtZXNwYWNlUHJvcG9zYWxDb25maWcSPS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db25maWd1cmVOYW1lc3BhY2VQcm9wb3NhbENvbmZpZ1JlcXVlc3QaPi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db25maWd1cmVOYW1lc3BhY2VQcm9wb3NhbENvbmZpZ1Jlc3BvbnNlIgASkQEKGkdldE5hbWVzcGFjZVByb3Bvc2FsQ29uZmlnEjcud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0TmFtZXNwYWNlUHJvcG9zYWxDb25maWdSZXF1ZXN0Gjgud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0TmFtZXNwYWNlUHJvcG9zYWxDb25maWdSZXNwb25zZSIAEpQBChtVcGRhdGVOYW1lc3BhY2VMb2dpbk1ldGhvZHMSOC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVOYW1lc3BhY2VMb2dpbk1ldGhvZHNSZXF1ZXN0Gjkud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlTmFtZXNwYWNlTG9naW5NZXRob2RzUmVzcG9uc2UiABKOAQoZTGlzdE5hbWVzcGFjZUxvZ2luTWV0aG9kcxI2LndnLmNvc21vLnBsYXRmb3JtLnYxLkxpc3ROYW1lc3BhY2VMb2dpbk1ldGhvZHNSZXF1ZXN0Gjcud2cuY29zbW8ucGxhdGZvcm0udjEuTGlzdE5hbWVzcGFjZUxvZ2luTWV0aG9kc1Jlc3BvbnNlIgASlAEKG0dldE9yZ2FuaXphdGlvbkxvZ2luTWV0aG9kcxI4LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9yZ2FuaXphdGlvbkxvZ2luTWV0aG9kc1JlcXVlc3QaOS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25Mb2dpbk1ldGhvZHNSZXNwb25zZSIAEp0BCh5VcGRhdGVPcmdhbml6YXRpb25Mb2dpbk1ldGhvZHMSOy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVPcmdhbml6YXRpb25Mb2dpbk1ldGhvZHNSZXF1ZXN0Gjwud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlT3JnYW5pemF0aW9uTG9naW5NZXRob2RzUmVzcG9uc2UiABKXAQocR2V0UHJvcG9zYWxzQnlGZWRlcmF0ZWRHcmFwaBI5LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFByb3Bvc2Fsc0J5RmVkZXJhdGVkR3JhcGhSZXF1ZXN0Gjoud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0UHJvcG9zYWxzQnlGZWRlcmF0ZWRHcmFwaFJlc3BvbnNlIgASdgoRR2V0UHJvcG9zYWxDaGVja3MSLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRQcm9wb3NhbENoZWNrc1JlcXVlc3QaLy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRQcm9wb3NhbENoZWNrc1Jlc3BvbnNlIgASagoNR2V0T3BlcmF0aW9ucxIqLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9wZXJhdGlvbnNSZXF1ZXN0Gisud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3BlcmF0aW9uc1Jlc3BvbnNlIgASiAEKF0dldENsaWVudHNGcm9tQW5hbHl0aWNzEjQud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q2xpZW50c0Zyb21BbmFseXRpY3NSZXF1ZXN0GjUud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q2xpZW50c0Zyb21BbmFseXRpY3NSZXNwb25zZSIAEnwKE0dldE9wZXJhdGlvbkNsaWVudHMSMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcGVyYXRpb25DbGllbnRzUmVxdWVzdBoxLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9wZXJhdGlvbkNsaWVudHNSZXNwb25zZSIAEpcBChxHZXRPcGVyYXRpb25EZXByZWNhdGVkRmllbGRzEjkud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3BlcmF0aW9uRGVwcmVjYXRlZEZpZWxkc1JlcXVlc3QaOi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcGVyYXRpb25EZXByZWNhdGVkRmllbGRzUmVzcG9uc2UiABKRAQoaVmFsaWRhdGVBbmRGZXRjaFBsdWdpbkRhdGESNy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5WYWxpZGF0ZUFuZEZldGNoUGx1Z2luRGF0YVJlcXVlc3QaOC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5WYWxpZGF0ZUFuZEZldGNoUGx1Z2luRGF0YVJlc3BvbnNlIgASZwoMTGlua1N1YmdyYXBoEikud2cuY29zbW8ucGxhdGZvcm0udjEuTGlua1N1YmdyYXBoUmVxdWVzdBoqLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpbmtTdWJncmFwaFJlc3BvbnNlIgASbQoOVW5saW5rU3ViZ3JhcGgSKy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VbmxpbmtTdWJncmFwaFJlcXVlc3QaLC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VbmxpbmtTdWJncmFwaFJlc3BvbnNlIgASiAEKF1ZlcmlmeUFQSUtleUdyYXBoQWNjZXNzEjQud2cuY29zbW8ucGxhdGZvcm0udjEuVmVyaWZ5QVBJS2V5R3JhcGhBY2Nlc3NSZXF1ZXN0GjUud2cuY29zbW8ucGxhdGZvcm0udjEuVmVyaWZ5QVBJS2V5R3JhcGhBY2Nlc3NSZXNwb25zZSIAEm0KDlJlY29tcG9zZUdyYXBoEisud2cuY29zbW8ucGxhdGZvcm0udjEuUmVjb21wb3NlR3JhcGhSZXF1ZXN0Giwud2cuY29zbW8ucGxhdGZvcm0udjEuUmVjb21wb3NlR3JhcGhSZXNwb25zZSIAEn8KFFJlY29tcG9zZUZlYXR1cmVGbGFnEjEud2cuY29zbW8ucGxhdGZvcm0udjEuUmVjb21wb3NlRmVhdHVyZUZsYWdSZXF1ZXN0GjIud2cuY29zbW8ucGxhdGZvcm0udjEuUmVjb21wb3NlRmVhdHVyZUZsYWdSZXNwb25zZSIAEmoKDUdldE9uYm9hcmRpbmcSKi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPbmJvYXJkaW5nUmVxdWVzdBorLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9uYm9hcmRpbmdSZXNwb25zZSIAEnMKEENyZWF0ZU9uYm9hcmRpbmcSLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVPbmJvYXJkaW5nUmVxdWVzdBouLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZU9uYm9hcmRpbmdSZXNwb25zZSIAEnMKEEZpbmlzaE9uYm9hcmRpbmcSLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GaW5pc2hPbmJvYXJkaW5nUmVxdWVzdBouLndnLmNvc21vLnBsYXRmb3JtLnYxLkZpbmlzaE9uYm9hcmRpbmdSZXNwb25zZSIAYgZwcm90bzM", [file_wg_cosmo_common_common, file_wg_cosmo_notifications_events]); + fileDesc("CiN3Zy9jb3Ntby9wbGF0Zm9ybS92MS9wbGF0Zm9ybS5wcm90bxIUd2cuY29zbW8ucGxhdGZvcm0udjEiIwoFTGFiZWwSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJIlsKCFJlc3BvbnNlEi0KBGNvZGUYASABKA4yHy53Zy5jb3Ntby5jb21tb24uRW51bVN0YXR1c0NvZGUSFAoHZGV0YWlscxgCIAEoCUgAiAEBQgoKCF9kZXRhaWxzIi8KDlJlc3BvbnNlU3RhdHVzEgwKBGNvZGUYASABKAUSDwoHbWVzc2FnZRgCIAEoCSJKChdQdWJsaXNoTW9ub2dyYXBoUmVxdWVzdBIMCgRuYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRIOCgZzY2hlbWEYAyABKAkilwIKGFB1Ymxpc2hNb25vZ3JhcGhSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkEKEWNvbXBvc2l0aW9uRXJyb3JzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchI/ChBkZXBsb3ltZW50RXJyb3JzGAMgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVwbG95bWVudEVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBCADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmciYAoKUHJvdG9JbnB1dBIOCgZzY2hlbWEYASABKAkSEAoIbWFwcGluZ3MYAiABKAkSDAoEbG9jaxgDIAEoCRIRCglwbGF0Zm9ybXMYBCADKAkSDwoHdmVyc2lvbhgFIAEoCSKZBgofUHVibGlzaEZlZGVyYXRlZFN1YmdyYXBoUmVxdWVzdBIMCgRuYW1lGAEgASgJEg4KBnNjaGVtYRgCIAEoCRIYCgtyb3V0aW5nX3VybBgDIAEoCUgAiAEBEisKBmxhYmVscxgEIAMoCzIbLndnLmNvc21vLnBsYXRmb3JtLnYxLkxhYmVsElAKFXN1YnNjcmlwdGlvbl9wcm90b2NvbBgGIAEoDjIsLndnLmNvc21vLmNvbW1vbi5HcmFwaFFMU3Vic2NyaXB0aW9uUHJvdG9jb2xIAYgBARIdChBzdWJzY3JpcHRpb25fdXJsGAcgASgJSAKIAQESEQoJbmFtZXNwYWNlGAggASgJElAKFXdlYnNvY2tldF9zdWJwcm90b2NvbBgJIAEoDjIsLndnLmNvc21vLmNvbW1vbi5HcmFwaFFMV2Vic29ja2V0U3VicHJvdG9jb2xIA4gBARIgChNpc19mZWF0dXJlX3N1YmdyYXBoGAogASgISASIAQESHwoSYmFzZV9zdWJncmFwaF9uYW1lGAsgASgJSAWIAQESLQogZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24YDCABKAhIBogBARI1CgR0eXBlGA0gASgOMiIud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGhUeXBlSAeIAQESNAoFcHJvdG8YDiABKAsyIC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Qcm90b0lucHV0SAiIAQESEgoFbGltaXQYDyABKAVICYgBAUIOCgxfcm91dGluZ191cmxCGAoWX3N1YnNjcmlwdGlvbl9wcm90b2NvbEITChFfc3Vic2NyaXB0aW9uX3VybEIYChZfd2Vic29ja2V0X3N1YnByb3RvY29sQhYKFF9pc19mZWF0dXJlX3N1YmdyYXBoQhUKE19iYXNlX3N1YmdyYXBoX25hbWVCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uQgcKBV90eXBlQggKBl9wcm90b0IICgZfbGltaXQizwMKIFB1Ymxpc2hGZWRlcmF0ZWRTdWJncmFwaFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQQoRY29tcG9zaXRpb25FcnJvcnMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEj8KEGRlcGxveW1lbnRFcnJvcnMYAyADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZXBsb3ltZW50RXJyb3ISFwoKaGFzQ2hhbmdlZBgEIAEoCEgAiAEBEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBSADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcSIQoUcHJvcG9zYWxNYXRjaE1lc3NhZ2UYBiABKAlIAYgBARI/CgZjb3VudHMYByABKAsyKi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TdWJncmFwaFB1Ymxpc2hTdGF0c0gCiAEBQg0KC19oYXNDaGFuZ2VkQhcKFV9wcm9wb3NhbE1hdGNoTWVzc2FnZUIJCgdfY291bnRzImgKFFN1YmdyYXBoUHVibGlzaFN0YXRzEhkKEWNvbXBvc2l0aW9uRXJyb3JzGAEgASgFEhsKE2NvbXBvc2l0aW9uV2FybmluZ3MYAiABKAUSGAoQZGVwbG95bWVudEVycm9ycxgDIAEoBSIvCg9QdWJsaXNoU3ViZ3JhcGgSDAoEbmFtZRgBIAEoCRIOCgZzY2hlbWEYAiABKAki/wEKIFB1Ymxpc2hGZWRlcmF0ZWRTdWJncmFwaHNSZXF1ZXN0EhEKCW5hbWVzcGFjZRgBIAEoCRI4CglzdWJncmFwaHMYAiADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QdWJsaXNoU3ViZ3JhcGgSLQogZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24YAyABKAhIAIgBARISCgVsaW1pdBgEIAEoBUgBiAEBEhIKBWFzeW5jGAUgASgISAKIAQFCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uQggKBl9saW1pdEIICgZfYXN5bmMiqAMKIVB1Ymxpc2hGZWRlcmF0ZWRTdWJncmFwaHNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkEKEWNvbXBvc2l0aW9uRXJyb3JzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchI/ChBkZXBsb3ltZW50RXJyb3JzGAMgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVwbG95bWVudEVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBCADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcSPwoGY291bnRzGAUgASgLMioud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGhQdWJsaXNoU3RhdHNIAIgBARIcChR1cGRhdGVkU3ViZ3JhcGhOYW1lcxgGIAMoCRISCgVqb2JJZBgHIAEoCUgBiAEBQgkKB19jb3VudHNCCAoGX2pvYklkIk4KH0dldEJhdGNoUHVibGlzaEpvYlN0YXR1c1JlcXVlc3QSDQoFam9iSWQYASABKAkSEgoFbGltaXQYAiABKAVIAIgBAUIICgZfbGltaXQihAQKIEdldEJhdGNoUHVibGlzaEpvYlN0YXR1c1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQAoGc3RhdHVzGAIgASgOMisud2cuY29zbW8ucGxhdGZvcm0udjEuQmF0Y2hQdWJsaXNoSm9iU3RhdHVzSACIAQESGgoNZmFpbHVyZVJlYXNvbhgDIAEoCUgBiAEBEkEKEWNvbXBvc2l0aW9uRXJyb3JzGAQgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchI/ChBkZXBsb3ltZW50RXJyb3JzGAUgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVwbG95bWVudEVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBiADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcSPwoGY291bnRzGAcgASgLMioud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGhQdWJsaXNoU3RhdHNIAogBARIcChR1cGRhdGVkU3ViZ3JhcGhOYW1lcxgIIAMoCUIJCgdfc3RhdHVzQhAKDl9mYWlsdXJlUmVhc29uQgkKB19jb3VudHMiXgoHR2l0SW5mbxISCgpjb21taXRfc2hhGAEgASgJEhIKCmFjY291bnRfaWQYAiABKAkSEgoKb3duZXJfc2x1ZxgDIAEoCRIXCg9yZXBvc2l0b3J5X3NsdWcYBCABKAkiQAoKVkNTQ29udGV4dBIOCgZhdXRob3IYASABKAkSEgoKY29tbWl0X3NoYRgCIAEoCRIOCgZicmFuY2gYAyABKAkixwMKGkNoZWNrU3ViZ3JhcGhTY2hlbWFSZXF1ZXN0EhUKDXN1YmdyYXBoX25hbWUYASABKAkSDgoGc2NoZW1hGAIgASgMEi4KB2dpdEluZm8YAyABKAsyHS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HaXRJbmZvEhMKBmRlbGV0ZRgEIAEoCEgAiAEBEhEKCW5hbWVzcGFjZRgFIAEoCRIfChJza2lwX3RyYWZmaWNfY2hlY2sYBiABKAhIAYgBARI5Cgp2Y3NDb250ZXh0GAcgASgLMiAud2cuY29zbW8ucGxhdGZvcm0udjEuVkNTQ29udGV4dEgCiAEBEisKBmxhYmVscxgIIAMoCzIbLndnLmNvc21vLnBsYXRmb3JtLnYxLkxhYmVsEi0KIGRpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uGAkgASgISAOIAQESEgoFbGltaXQYCiABKAVIBIgBAUIJCgdfZGVsZXRlQhUKE19za2lwX3RyYWZmaWNfY2hlY2tCDQoLX3Zjc0NvbnRleHRCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uQggKBl9saW1pdCKoAQoYRml4U3ViZ3JhcGhTY2hlbWFSZXF1ZXN0EhUKDXN1YmdyYXBoX25hbWUYASABKAkSDgoGc2NoZW1hGAIgASgJEhEKCW5hbWVzcGFjZRgDIAEoCRItCiBkaXNhYmxlX3Jlc29sdmFiaWxpdHlfdmFsaWRhdGlvbhgEIAEoCEgAiAEBQiMKIV9kaXNhYmxlX3Jlc29sdmFiaWxpdHlfdmFsaWRhdGlvbiLqAwoWQ3JlYXRlTW9ub2dyYXBoUmVxdWVzdBIMCgRuYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRITCgtyb3V0aW5nX3VybBgDIAEoCRIRCglncmFwaF91cmwYBCABKAkSHQoQc3Vic2NyaXB0aW9uX3VybBgFIAEoCUgAiAEBElAKFXN1YnNjcmlwdGlvbl9wcm90b2NvbBgGIAEoDjIsLndnLmNvc21vLmNvbW1vbi5HcmFwaFFMU3Vic2NyaXB0aW9uUHJvdG9jb2xIAYgBARITCgZyZWFkbWUYByABKAlIAogBARIbChNhZG1pc3Npb25XZWJob29rVVJMGAggASgJElAKFXdlYnNvY2tldF9zdWJwcm90b2NvbBgJIAEoDjIsLndnLmNvc21vLmNvbW1vbi5HcmFwaFFMV2Vic29ja2V0U3VicHJvdG9jb2xIA4gBARIjChZhZG1pc3Npb25XZWJob29rU2VjcmV0GAogASgJSASIAQFCEwoRX3N1YnNjcmlwdGlvbl91cmxCGAoWX3N1YnNjcmlwdGlvbl9wcm90b2NvbEIJCgdfcmVhZG1lQhgKFl93ZWJzb2NrZXRfc3VicHJvdG9jb2xCGQoXX2FkbWlzc2lvbldlYmhvb2tTZWNyZXQiSwoXQ3JlYXRlTW9ub2dyYXBoUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSK8AgobQ3JlYXRlRmVkZXJhdGVkR3JhcGhSZXF1ZXN0EgwKBG5hbWUYASABKAkSEwoLcm91dGluZ191cmwYAiABKAkSFgoObGFiZWxfbWF0Y2hlcnMYAyADKAkSEwoGcmVhZG1lGAQgASgJSACIAQESEQoJbmFtZXNwYWNlGAUgASgJEhsKE2FkbWlzc2lvbldlYmhvb2tVUkwYBiABKAkSIwoWYWRtaXNzaW9uV2ViaG9va1NlY3JldBgHIAEoCUgBiAEBEi0KIGRpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uGAggASgISAKIAQFCCQoHX3JlYWRtZUIZChdfYWRtaXNzaW9uV2ViaG9va1NlY3JldEIjCiFfZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24ipgUKHkNyZWF0ZUZlZGVyYXRlZFN1YmdyYXBoUmVxdWVzdBIMCgRuYW1lGAEgASgJEhgKC3JvdXRpbmdfdXJsGAIgASgJSACIAQESKwoGbGFiZWxzGAMgAygLMhsud2cuY29zbW8ucGxhdGZvcm0udjEuTGFiZWwSUAoVc3Vic2NyaXB0aW9uX3Byb3RvY29sGAUgASgOMiwud2cuY29zbW8uY29tbW9uLkdyYXBoUUxTdWJzY3JpcHRpb25Qcm90b2NvbEgBiAEBEh0KEHN1YnNjcmlwdGlvbl91cmwYBiABKAlIAogBARITCgZyZWFkbWUYByABKAlIA4gBARIRCgluYW1lc3BhY2UYCCABKAkSUAoVd2Vic29ja2V0X3N1YnByb3RvY29sGAkgASgOMiwud2cuY29zbW8uY29tbW9uLkdyYXBoUUxXZWJzb2NrZXRTdWJwcm90b2NvbEgEiAEBEiIKFWlzX2V2ZW50X2RyaXZlbl9ncmFwaBgKIAEoCEgFiAEBEiAKE2lzX2ZlYXR1cmVfc3ViZ3JhcGgYCyABKAhIBogBARIfChJiYXNlX3N1YmdyYXBoX25hbWUYDCABKAlIB4gBARIwCgR0eXBlGA0gASgOMiIud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGhUeXBlQg4KDF9yb3V0aW5nX3VybEIYChZfc3Vic2NyaXB0aW9uX3Byb3RvY29sQhMKEV9zdWJzY3JpcHRpb25fdXJsQgkKB19yZWFkbWVCGAoWX3dlYnNvY2tldF9zdWJwcm90b2NvbEIYChZfaXNfZXZlbnRfZHJpdmVuX2dyYXBoQhYKFF9pc19mZWF0dXJlX3N1YmdyYXBoQhUKE19iYXNlX3N1YmdyYXBoX25hbWUiPgobRGVsZXRlRmVkZXJhdGVkR3JhcGhSZXF1ZXN0EgwKBG5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJIjkKFkRlbGV0ZU1vbm9ncmFwaFJlcXVlc3QSDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkiSwoXRGVsZXRlTW9ub2dyYXBoUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSKeAQoeRGVsZXRlRmVkZXJhdGVkU3ViZ3JhcGhSZXF1ZXN0EhUKDXN1YmdyYXBoX25hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEi0KIGRpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uGAMgASgISACIAQFCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uIrkBCgxTY2hlbWFDaGFuZ2USDwoHbWVzc2FnZRgBIAEoCRISCgpjaGFuZ2VUeXBlGAIgASgJEhEKBHBhdGgYAyABKAlIAIgBARISCgppc0JyZWFraW5nGAQgASgIEhgKC2hhc092ZXJyaWRlGAUgASgISAGIAQESGQoMc3ViZ3JhcGhOYW1lGAYgASgJSAKIAQFCBwoFX3BhdGhCDgoMX2hhc092ZXJyaWRlQg8KDV9zdWJncmFwaE5hbWUitwEKGkZlZGVyYXRlZEdyYXBoU2NoZW1hQ2hhbmdlEg8KB21lc3NhZ2UYASABKAkSEgoKY2hhbmdlVHlwZRgCIAEoCRIRCgRwYXRoGAMgASgJSACIAQESEgoKaXNCcmVha2luZxgEIAEoCBIaChJmZWRlcmF0ZWRHcmFwaE5hbWUYBSABKAkSGAoLaGFzT3ZlcnJpZGUYBiABKAhIAYgBAUIHCgVfcGF0aEIOCgxfaGFzT3ZlcnJpZGUiZwoQQ29tcG9zaXRpb25FcnJvchIPCgdtZXNzYWdlGAEgASgJEhoKEmZlZGVyYXRlZEdyYXBoTmFtZRgCIAEoCRIRCgluYW1lc3BhY2UYAyABKAkSEwoLZmVhdHVyZUZsYWcYBCABKAkiaQoSQ29tcG9zaXRpb25XYXJuaW5nEg8KB21lc3NhZ2UYASABKAkSGgoSZmVkZXJhdGVkR3JhcGhOYW1lGAIgASgJEhEKCW5hbWVzcGFjZRgDIAEoCRITCgtmZWF0dXJlRmxhZxgEIAEoCSJRCg9EZXBsb3ltZW50RXJyb3ISDwoHbWVzc2FnZRgBIAEoCRIaChJmZWRlcmF0ZWRHcmFwaE5hbWUYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJInQKGENoZWNrT3BlcmF0aW9uVXNhZ2VTdGF0cxIXCg90b3RhbE9wZXJhdGlvbnMYASABKA0SEwoLZmlyc3RTZWVuQXQYAiABKAkSEgoKbGFzdFNlZW5BdBgDIAEoCRIWCg5zYWZlT3BlcmF0aW9ucxgEIAEoDSJgChZDaGVja2VkRmVkZXJhdGVkR3JhcGhzEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJEhkKEW9yZ2FuaXphdGlvbl9zbHVnGAQgASgJInQKDExpbnRMb2NhdGlvbhIMCgRsaW5lGAEgASgNEg4KBmNvbHVtbhgCIAEoDRIUCgdlbmRMaW5lGAMgASgNSACIAQESFgoJZW5kQ29sdW1uGAQgASgNSAGIAQFCCgoIX2VuZExpbmVCDAoKX2VuZENvbHVtbiLlAQoJTGludElzc3VlEhkKDGxpbnRSdWxlVHlwZRgBIAEoCUgAiAEBEjQKCHNldmVyaXR5GAIgASgOMiIud2cuY29zbW8ucGxhdGZvcm0udjEuTGludFNldmVyaXR5Eg8KB21lc3NhZ2UYAyABKAkSOQoNaXNzdWVMb2NhdGlvbhgEIAEoCzIiLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpbnRMb2NhdGlvbhIZCgxzdWJncmFwaE5hbWUYBSABKAlIAYgBAUIPCg1fbGludFJ1bGVUeXBlQg8KDV9zdWJncmFwaE5hbWUijgIKEUdyYXBoUHJ1bmluZ0lzc3VlEhwKFGdyYXBoUHJ1bmluZ1J1bGVUeXBlGAEgASgJEjQKCHNldmVyaXR5GAIgASgOMiIud2cuY29zbW8ucGxhdGZvcm0udjEuTGludFNldmVyaXR5EhEKCWZpZWxkUGF0aBgDIAEoCRIPCgdtZXNzYWdlGAQgASgJEjkKDWlzc3VlTG9jYXRpb24YBSABKAsyIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaW50TG9jYXRpb24SGgoSZmVkZXJhdGVkR3JhcGhOYW1lGAYgASgJEhkKDHN1YmdyYXBoTmFtZRgHIAEoCUgAiAEBQg8KDV9zdWJncmFwaE5hbWUivQoKG0NoZWNrU3ViZ3JhcGhTY2hlbWFSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjsKD2JyZWFraW5nQ2hhbmdlcxgCIAMoCzIiLndnLmNvc21vLnBsYXRmb3JtLnYxLlNjaGVtYUNoYW5nZRI+ChJub25CcmVha2luZ0NoYW5nZXMYAyADKAsyIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TY2hlbWFDaGFuZ2USQQoRY29tcG9zaXRpb25FcnJvcnMYBCADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEksKE29wZXJhdGlvblVzYWdlU3RhdHMYBSABKAsyLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DaGVja09wZXJhdGlvblVzYWdlU3RhdHMSEAoIY2hlY2tfaWQYBiABKAkSTgoYY2hlY2tlZF9mZWRlcmF0ZWRfZ3JhcGhzGAcgAygLMiwud2cuY29zbW8ucGxhdGZvcm0udjEuQ2hlY2tlZEZlZGVyYXRlZEdyYXBocxI1CgxsaW50V2FybmluZ3MYCCADKAsyHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaW50SXNzdWUSMwoKbGludEVycm9ycxgJIAMoCzIfLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpbnRJc3N1ZRJDChJncmFwaFBydW5lV2FybmluZ3MYCiADKAsyJy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HcmFwaFBydW5pbmdJc3N1ZRJBChBncmFwaFBydW5lRXJyb3JzGAsgAygLMicud2cuY29zbW8ucGxhdGZvcm0udjEuR3JhcGhQcnVuaW5nSXNzdWUSKQocY2xpZW50X3RyYWZmaWNfY2hlY2tfc2tpcHBlZBgMIAEoCEgAiAEBEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYDSADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcSIQoUcHJvcG9zYWxNYXRjaE1lc3NhZ2UYDiABKAlIAYgBARInChppc0xpbmtlZFRyYWZmaWNDaGVja0ZhaWxlZBgPIAEoCEgCiAEBEicKGmlzTGlua2VkUHJ1bmluZ0NoZWNrRmFpbGVkGBAgASgISAOIAQESJAoXaXNDaGVja0V4dGVuc2lvblNraXBwZWQYESABKAhIBIgBARInChpjaGVja0V4dGVuc2lvbkVycm9yTWVzc2FnZRgSIAEoCUgFiAEBEjwKBmNvdW50cxgTIAEoCzInLndnLmNvc21vLnBsYXRmb3JtLnYxLlNjaGVtYUNoZWNrQ291bnRzSAaIAQESVwodY29tcG9zZWRTY2hlbWFCcmVha2luZ0NoYW5nZXMYFCADKAsyMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWRlcmF0ZWRHcmFwaFNjaGVtYUNoYW5nZUIfCh1fY2xpZW50X3RyYWZmaWNfY2hlY2tfc2tpcHBlZEIXChVfcHJvcG9zYWxNYXRjaE1lc3NhZ2VCHQobX2lzTGlua2VkVHJhZmZpY0NoZWNrRmFpbGVkQh0KG19pc0xpbmtlZFBydW5pbmdDaGVja0ZhaWxlZEIaChhfaXNDaGVja0V4dGVuc2lvblNraXBwZWRCHQobX2NoZWNrRXh0ZW5zaW9uRXJyb3JNZXNzYWdlQgkKB19jb3VudHMihwIKEVNjaGVtYUNoZWNrQ291bnRzEhQKDGxpbnRXYXJuaW5ncxgBIAEoBRISCgpsaW50RXJyb3JzGAIgASgFEhcKD2JyZWFraW5nQ2hhbmdlcxgDIAEoBRIaChJub25CcmVha2luZ0NoYW5nZXMYBCABKAUSGQoRY29tcG9zaXRpb25FcnJvcnMYBSABKAUSGwoTY29tcG9zaXRpb25XYXJuaW5ncxgGIAEoBRIYChBncmFwaFBydW5lRXJyb3JzGAcgASgFEhoKEmdyYXBoUHJ1bmVXYXJuaW5ncxgIIAEoBRIlCh1jb21wb3NlZFNjaGVtYUJyZWFraW5nQ2hhbmdlcxgJIAEoBSJvChlGaXhTdWJncmFwaFNjaGVtYVJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USEAoIbW9kaWZpZWQYAiABKAgSDgoGc2NoZW1hGAMgASgJIpsCChxDcmVhdGVGZWRlcmF0ZWRHcmFwaFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQQoRY29tcG9zaXRpb25FcnJvcnMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEj8KEGRlcGxveW1lbnRFcnJvcnMYAyADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZXBsb3ltZW50RXJyb3ISRQoTY29tcG9zaXRpb25XYXJuaW5ncxgEIAMoCzIoLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXBvc2l0aW9uV2FybmluZyJTCh9DcmVhdGVGZWRlcmF0ZWRTdWJncmFwaFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2Ui2gIKH0RlbGV0ZUZlZGVyYXRlZFN1YmdyYXBoUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJBChFjb21wb3NpdGlvbkVycm9ycxgCIAMoCzImLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXBvc2l0aW9uRXJyb3ISPwoQZGVwbG95bWVudEVycm9ycxgDIAMoCzIlLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlcGxveW1lbnRFcnJvchJFChNjb21wb3NpdGlvbldhcm5pbmdzGAQgAygLMigud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25XYXJuaW5nEiEKFHByb3Bvc2FsTWF0Y2hNZXNzYWdlGAUgASgJSACIAQFCFwoVX3Byb3Bvc2FsTWF0Y2hNZXNzYWdlIlAKHERlbGV0ZUZlZGVyYXRlZEdyYXBoUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSKfAQoZR2V0RmVkZXJhdGVkR3JhcGhzUmVxdWVzdBINCgVsaW1pdBgBIAEoBRIOCgZvZmZzZXQYAiABKAUSFgoOaW5jbHVkZU1ldHJpY3MYAyABKAgSEQoJbmFtZXNwYWNlGAQgASgJEiAKE3N1cHBvcnRzX2ZlZGVyYXRpb24YBSABKAhIAIgBAUIWChRfc3VwcG9ydHNfZmVkZXJhdGlvbiJlCghDb250cmFjdBIKCgJpZBgBIAEoCRIhChlzb3VyY2VfZmVkZXJhdGVkX2dyYXBoX2lkGAIgASgJEhQKDGV4Y2x1ZGVfdGFncxgDIAMoCRIUCgxpbmNsdWRlX3RhZ3MYBCADKAkiswQKDkZlZGVyYXRlZEdyYXBoEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSEgoKcm91dGluZ1VSTBgDIAEoCRIWCg5sYWJlbF9tYXRjaGVycxgEIAMoCRIVCg1sYXN0VXBkYXRlZEF0GAUgASgJEhQKDGlzQ29tcG9zYWJsZRgGIAEoCBIZChFjb21wb3NpdGlvbkVycm9ycxgHIAEoCRIaChJjb25uZWN0ZWRTdWJncmFwaHMYCCABKAUSPgoNcmVxdWVzdFNlcmllcxgJIAMoCzInLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlcXVlc3RTZXJpZXNJdGVtEhMKBnJlYWRtZRgKIAEoCUgAiAEBEhEKCXRhcmdldF9pZBgLIAEoCRIRCgluYW1lc3BhY2UYDCABKAkSGgoNY29tcG9zaXRpb25JZBgNIAEoCUgBiAEBEhsKE3N1cHBvcnRzX2ZlZGVyYXRpb24YDiABKAgSNQoIY29udHJhY3QYDyABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db250cmFjdEgCiAEBEiIKFWFkbWlzc2lvbl93ZWJob29rX3VybBgQIAEoCUgDiAEBEiQKHHJvdXRlcl9jb21wYXRpYmlsaXR5X3ZlcnNpb24YESABKAlCCQoHX3JlYWRtZUIQCg5fY29tcG9zaXRpb25JZEILCglfY29udHJhY3RCGAoWX2FkbWlzc2lvbl93ZWJob29rX3VybCKEAQoaR2V0RmVkZXJhdGVkR3JhcGhzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI0CgZncmFwaHMYAiADKAsyJC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWRlcmF0ZWRHcmFwaCJUCilHZXRGZWRlcmF0ZWRHcmFwaHNCeVN1YmdyYXBoTGFiZWxzUmVxdWVzdBIUCgxzdWJncmFwaE5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJIpQBCipHZXRGZWRlcmF0ZWRHcmFwaHNCeVN1YmdyYXBoTGFiZWxzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI0CgZncmFwaHMYAiADKAsyJC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWRlcmF0ZWRHcmFwaCKIAQoTR2V0U3ViZ3JhcGhzUmVxdWVzdBINCgVsaW1pdBgBIAEoBRIOCgZvZmZzZXQYAiABKAUSEQoJbmFtZXNwYWNlGAMgASgJEhIKBXF1ZXJ5GAQgASgJSACIAQESIQoZZXhjbHVkZV9mZWF0dXJlX3N1YmdyYXBocxgFIAEoCEIICgZfcXVlcnkivQUKCFN1YmdyYXBoEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSEgoKcm91dGluZ1VSTBgDIAEoCRIVCg1sYXN0VXBkYXRlZEF0GAQgASgJEisKBmxhYmVscxgFIAMoCzIbLndnLmNvc21vLnBsYXRmb3JtLnYxLkxhYmVsEhoKDWNyZWF0b3JVc2VySWQYBiABKAlIAIgBARITCgZyZWFkbWUYByABKAlIAYgBARIXCg9zdWJzY3JpcHRpb25VcmwYCCABKAkSEQoJdGFyZ2V0X2lkGAkgASgJEhEKCW5hbWVzcGFjZRgKIAEoCRIcChRzdWJzY3JpcHRpb25Qcm90b2NvbBgLIAEoCRIWCglpc1YyR3JhcGgYDCABKAhIAogBARIaChJpc0V2ZW50RHJpdmVuR3JhcGgYDSABKAgSHAoUd2Vic29ja2V0U3VicHJvdG9jb2wYDiABKAkSGQoRaXNGZWF0dXJlU3ViZ3JhcGgYDyABKAgSHQoQYmFzZVN1YmdyYXBoTmFtZRgQIAEoCUgDiAEBEhsKDmJhc2VTdWJncmFwaElkGBEgASgJSASIAQESMAoEdHlwZRgSIAEoDjIiLndnLmNvc21vLnBsYXRmb3JtLnYxLlN1YmdyYXBoVHlwZRJCCgpwbHVnaW5EYXRhGBMgASgLMikud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGguUGx1Z2luRGF0YUgFiAEBGjAKClBsdWdpbkRhdGESDwoHdmVyc2lvbhgBIAEoCRIRCglwbGF0Zm9ybXMYAiADKAlCEAoOX2NyZWF0b3JVc2VySWRCCQoHX3JlYWRtZUIMCgpfaXNWMkdyYXBoQhMKEV9iYXNlU3ViZ3JhcGhOYW1lQhEKD19iYXNlU3ViZ3JhcGhJZEINCgtfcGx1Z2luRGF0YSKHAQoUR2V0U3ViZ3JhcGhzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIuCgZncmFwaHMYAiADKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TdWJncmFwaBINCgVjb3VudBgDIAEoBSJZCh5HZXRGZWRlcmF0ZWRHcmFwaEJ5TmFtZVJlcXVlc3QSDAoEbmFtZRgBIAEoCRIWCg5pbmNsdWRlTWV0cmljcxgCIAEoCBIRCgluYW1lc3BhY2UYAyABKAki1gEKH0dldEZlZGVyYXRlZEdyYXBoQnlOYW1lUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIzCgVncmFwaBgCIAEoCzIkLndnLmNvc21vLnBsYXRmb3JtLnYxLkZlZGVyYXRlZEdyYXBoEjEKCXN1YmdyYXBocxgDIAMoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlN1YmdyYXBoEhkKEWdyYXBoUmVxdWVzdFRva2VuGAQgASgJInoKIUdldEZlZGVyYXRlZEdyYXBoU0RMQnlOYW1lUmVxdWVzdBIMCgRuYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRIeChFmZWF0dXJlX2ZsYWdfbmFtZRgDIAEoCUgAiAEBQhQKEl9mZWF0dXJlX2ZsYWdfbmFtZSLGAQoiR2V0RmVkZXJhdGVkR3JhcGhTRExCeU5hbWVSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEhAKA3NkbBgCIAEoCUgAiAEBEhcKCnZlcnNpb25faWQYAyABKAlIAYgBARIaCg1jbGllbnRfc2NoZW1hGAQgASgJSAKIAQFCBgoEX3NkbEINCgtfdmVyc2lvbl9pZEIQCg5fY2xpZW50X3NjaGVtYSI7ChhHZXRTdWJncmFwaEJ5TmFtZVJlcXVlc3QSDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAki4gIKGUdldFN1YmdyYXBoQnlOYW1lUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRItCgVncmFwaBgCIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlN1YmdyYXBoEjUKB21lbWJlcnMYAyADKAsyJC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TdWJncmFwaE1lbWJlchJbCg5saW5rZWRTdWJncmFwaBgEIAEoCzI+LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFN1YmdyYXBoQnlOYW1lUmVzcG9uc2UuTGlua2VkU3ViZ3JhcGhIAIgBARo9Cg5MaW5rZWRTdWJncmFwaBIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEhEKCW5hbWVzcGFjZRgDIAEoCUIRCg9fbGlua2VkU3ViZ3JhcGgiYwoqR2V0U3ViZ3JhcGhTRExGcm9tTGF0ZXN0Q29tcG9zaXRpb25SZXF1ZXN0EgwKBG5hbWUYASABKAkSFAoMZmVkR3JhcGhOYW1lGAIgASgJEhEKCW5hbWVzcGFjZRgDIAEoCSKhAQorR2V0U3ViZ3JhcGhTRExGcm9tTGF0ZXN0Q29tcG9zaXRpb25SZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEhAKA3NkbBgCIAEoCUgAiAEBEhcKCnZlcnNpb25faWQYAyABKAlIAYgBAUIGCgRfc2RsQg0KC192ZXJzaW9uX2lkIj4KG0dldExhdGVzdFN1YmdyYXBoU0RMUmVxdWVzdBIMCgRuYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCSKSAQocR2V0TGF0ZXN0U3ViZ3JhcGhTRExSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEhAKA3NkbBgCIAEoCUgAiAEBEhcKCnZlcnNpb25faWQYAyABKAlIAYgBAUIGCgRfc2RsQg0KC192ZXJzaW9uX2lkIjkKJEdldENoZWNrc0J5RmVkZXJhdGVkR3JhcGhOYW1lRmlsdGVycxIRCglzdWJncmFwaHMYASADKAki6AEKJEdldENoZWNrc0J5RmVkZXJhdGVkR3JhcGhOYW1lUmVxdWVzdBIMCgRuYW1lGAEgASgJEg0KBWxpbWl0GAIgASgFEg4KBm9mZnNldBgDIAEoBRIRCglzdGFydERhdGUYBCABKAkSDwoHZW5kRGF0ZRgFIAEoCRIRCgluYW1lc3BhY2UYBiABKAkSUAoHZmlsdGVycxgHIAEoCzI6LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldENoZWNrc0J5RmVkZXJhdGVkR3JhcGhOYW1lRmlsdGVyc0gAiAEBQgoKCF9maWx0ZXJzIukLCgtTY2hlbWFDaGVjaxIKCgJpZBgBIAEoCRIVCgh0YXJnZXRJRBgCIAEoCUgAiAEBEhkKDHN1YmdyYXBoTmFtZRgDIAEoCUgBiAEBEhEKCXRpbWVzdGFtcBgEIAEoCRIUCgxpc0NvbXBvc2FibGUYBSABKAgSEgoKaXNCcmVha2luZxgGIAEoCBIYChBoYXNDbGllbnRUcmFmZmljGAcgASgIEhcKD2lzRm9yY2VkU3VjY2VzcxgIIAEoCBIRCglpc0RlbGV0ZWQYCSABKAgSQwoJZ2hEZXRhaWxzGAogASgLMisud2cuY29zbW8ucGxhdGZvcm0udjEuU2NoZW1hQ2hlY2suR2hEZXRhaWxzSAKIAQESFQoNaGFzTGludEVycm9ycxgLIAEoCBIdChVoYXNHcmFwaFBydW5pbmdFcnJvcnMYDCABKAgSJAocY2xpZW50X3RyYWZmaWNfY2hlY2tfc2tpcHBlZBgNIAEoCBIUCgxsaW50X3NraXBwZWQYDiABKAgSHQoVZ3JhcGhfcHJ1bmluZ19za2lwcGVkGA8gASgIEjkKCnZjc0NvbnRleHQYECABKAsyIC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5WQ1NDb250ZXh0SAOIAQESSwoQY2hlY2tlZFN1YmdyYXBocxgRIAMoCzIxLndnLmNvc21vLnBsYXRmb3JtLnYxLlNjaGVtYUNoZWNrLkNoZWNrZWRTdWJncmFwaBIaCg1wcm9wb3NhbE1hdGNoGBIgASgJSASIAQESGwoTY29tcG9zaXRpb25fc2tpcHBlZBgTIAEoCBIgChhicmVha2luZ19jaGFuZ2VzX3NraXBwZWQYFCABKAgSGQoMZXJyb3JNZXNzYWdlGBUgASgJSAWIAQESQwoMbGlua2VkQ2hlY2tzGBYgAygLMi0ud2cuY29zbW8ucGxhdGZvcm0udjEuU2NoZW1hQ2hlY2suTGlua2VkQ2hlY2sSKAobY2hlY2tfZXh0ZW5zaW9uX2RlbGl2ZXJ5X2lkGBcgASgJSAaIAQESKgodY2hlY2tfZXh0ZW5zaW9uX2Vycm9yX21lc3NhZ2UYGCABKAlIB4gBARpJCglHaERldGFpbHMSEQoJY29tbWl0U2hhGAEgASgJEhEKCW93bmVyU2x1ZxgCIAEoCRIWCg5yZXBvc2l0b3J5U2x1ZxgDIAEoCRqqAQoPQ2hlY2tlZFN1YmdyYXBoEgoKAmlkGAEgASgJEhQKDHN1YmdyYXBoTmFtZRgCIAEoCRIXCgpzdWJncmFwaElkGAMgASgJSACIAQESEQoJaXNEZWxldGVkGAQgASgIEg0KBWlzTmV3GAUgASgIEisKBmxhYmVscxgGIAMoCzIbLndnLmNvc21vLnBsYXRmb3JtLnYxLkxhYmVsQg0KC19zdWJncmFwaElkGpECCgtMaW5rZWRDaGVjaxIKCgJpZBgBIAEoCRIaChJhZmZlY3RlZEdyYXBoTmFtZXMYAiADKAkSGQoRaXNDaGVja1N1Y2Nlc3NmdWwYAyABKAgSGAoQaGFzQ2xpZW50VHJhZmZpYxgEIAEoCBIdChVoYXNHcmFwaFBydW5pbmdFcnJvcnMYBSABKAgSIQoZY2xpZW50VHJhZmZpY0NoZWNrU2tpcHBlZBgGIAEoCBIgChhncmFwaFBydW5pbmdDaGVja1NraXBwZWQYByABKAgSFQoNc3ViZ3JhcGhOYW1lcxgIIAMoCRIRCgluYW1lc3BhY2UYCSABKAkSFwoPaXNGb3JjZWRTdWNjZXNzGAogASgIQgsKCV90YXJnZXRJREIPCg1fc3ViZ3JhcGhOYW1lQgwKCl9naERldGFpbHNCDQoLX3Zjc0NvbnRleHRCEAoOX3Byb3Bvc2FsTWF0Y2hCDwoNX2Vycm9yTWVzc2FnZUIeChxfY2hlY2tfZXh0ZW5zaW9uX2RlbGl2ZXJ5X2lkQiAKHl9jaGVja19leHRlbnNpb25fZXJyb3JfbWVzc2FnZSKxAQolR2V0Q2hlY2tzQnlGZWRlcmF0ZWRHcmFwaE5hbWVSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjEKBmNoZWNrcxgCIAMoCzIhLndnLmNvc21vLnBsYXRmb3JtLnYxLlNjaGVtYUNoZWNrEiMKG2NoZWNrc0NvdW50QmFzZWRPbkRhdGVSYW5nZRgDIAEoBSJRChZHZXRDaGVja1N1bW1hcnlSZXF1ZXN0EhAKCGNoZWNrX2lkGAEgASgJEhIKCmdyYXBoX25hbWUYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJIjQKDENoYW5nZUNvdW50cxIRCglhZGRpdGlvbnMYASABKAUSEQoJZGVsZXRpb25zGAIgASgFIvYIChdHZXRDaGVja1N1bW1hcnlSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjAKBWNoZWNrGAIgASgLMiEud2cuY29zbW8ucGxhdGZvcm0udjEuU2NoZW1hQ2hlY2sSVAoPYWZmZWN0ZWRfZ3JhcGhzGAMgAygLMjsud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q2hlY2tTdW1tYXJ5UmVzcG9uc2UuQWZmZWN0ZWRHcmFwaBImChlwcm9wb3NlZFN1YmdyYXBoU2NoZW1hU0RMGAQgASgJSACIAQESMwoHY2hhbmdlcxgGIAMoCzIiLndnLmNvc21vLnBsYXRmb3JtLnYxLlNjaGVtYUNoYW5nZRIZChFjb21wb3NpdGlvbkVycm9ycxgHIAMoCRIaChJ0cmFmZmljX2NoZWNrX2RheXMYCCABKAUSMwoKbGludElzc3VlcxgJIAMoCzIfLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpbnRJc3N1ZRJDChJncmFwaFBydW5pbmdJc3N1ZXMYCiADKAsyJy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HcmFwaFBydW5pbmdJc3N1ZRIbChNjb21wb3NpdGlvbldhcm5pbmdzGAsgAygJEhcKCnByb3Bvc2FsSWQYDCABKAlIAYgBARIZCgxwcm9wb3NhbE5hbWUYDSABKAlIAogBARJaCg9wcm9wb3NhbE1hdGNoZXMYDiADKAsyQS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRDaGVja1N1bW1hcnlSZXNwb25zZS5Qcm9wb3NhbFNjaGVtYU1hdGNoEhoKEmlzUHJvcG9zYWxzRW5hYmxlZBgPIAEoCBJXCh1jb21wb3NlZFNjaGVtYUJyZWFraW5nQ2hhbmdlcxgQIAMoCzIwLndnLmNvc21vLnBsYXRmb3JtLnYxLkZlZGVyYXRlZEdyYXBoU2NoZW1hQ2hhbmdlGtoBCg1BZmZlY3RlZEdyYXBoEgoKAmlkGAEgASgJEhoKEnRyYWZmaWNfY2hlY2tfZGF5cxgCIAEoBRIMCgRuYW1lGAMgASgJEhkKEWlzQ2hlY2tTdWNjZXNzZnVsGAQgASgIEhQKDGlzQ29tcG9zYWJsZRgFIAEoCBISCgppc0JyZWFraW5nGAYgASgIEhgKEGhhc0NsaWVudFRyYWZmaWMYByABKAgSFQoNaGFzTGludEVycm9ycxgIIAEoCBIdChVoYXNHcmFwaFBydW5pbmdFcnJvcnMYCSABKAgaVgoTUHJvcG9zYWxTY2hlbWFNYXRjaBISCgpwcm9wb3NhbElkGAEgASgJEhQKDHByb3Bvc2FsTmFtZRgCIAEoCRIVCg1wcm9wb3NhbE1hdGNoGAMgASgIQhwKGl9wcm9wb3NlZFN1YmdyYXBoU2NoZW1hU0RMQg0KC19wcm9wb3NhbElkQg8KDV9wcm9wb3NhbE5hbWUikwEKGUdldENoZWNrT3BlcmF0aW9uc1JlcXVlc3QSEAoIY2hlY2tfaWQYASABKAkSEgoKZ3JhcGhfbmFtZRgCIAEoCRIRCgluYW1lc3BhY2UYAyABKAkSDQoFbGltaXQYBCABKAUSDgoGb2Zmc2V0GAUgASgFEhMKBnNlYXJjaBgGIAEoCUgAiAEBQgkKB19zZWFyY2gi0wQKGkdldENoZWNrT3BlcmF0aW9uc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USUwoKb3BlcmF0aW9ucxgCIAMoCzI/LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldENoZWNrT3BlcmF0aW9uc1Jlc3BvbnNlLkNoZWNrT3BlcmF0aW9uEhoKEnRyYWZmaWNfY2hlY2tfZGF5cxgDIAEoBRISCgpjcmVhdGVkX2F0GAQgASgJEiQKHGNsaWVudF90cmFmZmljX2NoZWNrX3NraXBwZWQYBSABKAgSHAoUdG90YWxPcGVyYXRpb25zQ291bnQYBiABKAUSLAokZG9BbGxPcGVyYXRpb25zSGF2ZUlnbm9yZUFsbE92ZXJyaWRlGAcgASgIEjQKLGRvQWxsT3BlcmF0aW9uc0hhdmVBbGxUaGVpckNoYW5nZXNNYXJrZWRTYWZlGAggASgIGtUBCg5DaGVja09wZXJhdGlvbhIMCgRoYXNoGAEgASgJEgwKBG5hbWUYAiABKAkSDAoEdHlwZRgDIAEoCRIVCg1maXJzdF9zZWVuX2F0GAQgASgJEhQKDGxhc3Rfc2Vlbl9hdBgFIAEoCRI9ChFpbXBhY3RpbmdfY2hhbmdlcxgGIAMoCzIiLndnLmNvc21vLnBsYXRmb3JtLnYxLlNjaGVtYUNoYW5nZRIPCgdpc19zYWZlGAcgASgIEhwKFGhhc0lnbm9yZUFsbE92ZXJyaWRlGAggASgIIncKGkdldE9wZXJhdGlvbkNvbnRlbnRSZXF1ZXN0EgwKBGhhc2gYASABKAkSHAoUZmVkZXJhdGVkX2dyYXBoX25hbWUYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJEhEKBG5hbWUYBCABKAlIAIgBAUIHCgVfbmFtZSJqChtHZXRPcGVyYXRpb25Db250ZW50UmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIZChFvcGVyYXRpb25fY29udGVudBgCIAEoCSKuAQohR2V0RmVkZXJhdGVkR3JhcGhDaGFuZ2Vsb2dSZXF1ZXN0EgwKBG5hbWUYASABKAkSNAoKcGFnaW5hdGlvbhgCIAEoCzIgLndnLmNvc21vLnBsYXRmb3JtLnYxLlBhZ2luYXRpb24SMgoJZGF0ZVJhbmdlGAMgASgLMh8ud2cuY29zbW8ucGxhdGZvcm0udjEuRGF0ZVJhbmdlEhEKCW5hbWVzcGFjZRgEIAEoCSJxChdGZWRlcmF0ZWRHcmFwaENoYW5nZWxvZxIKCgJpZBgBIAEoCRIMCgRwYXRoGAIgASgJEhIKCmNoYW5nZVR5cGUYAyABKAkSFQoNY2hhbmdlTWVzc2FnZRgEIAEoCRIRCgljcmVhdGVkQXQYBSABKAkipQEKHUZlZGVyYXRlZEdyYXBoQ2hhbmdlbG9nT3V0cHV0EhEKCWNyZWF0ZWRBdBgBIAEoCRIXCg9zY2hlbWFWZXJzaW9uSWQYAiABKAkSQQoKY2hhbmdlbG9ncxgDIAMoCzItLndnLmNvc21vLnBsYXRmb3JtLnYxLkZlZGVyYXRlZEdyYXBoQ2hhbmdlbG9nEhUKDWNvbXBvc2l0aW9uSWQYBCABKAkixwEKIkdldEZlZGVyYXRlZEdyYXBoQ2hhbmdlbG9nUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJaCh1mZWRlcmF0ZWRHcmFwaENoYW5nZWxvZ091dHB1dBgCIAMoCzIzLndnLmNvc21vLnBsYXRmb3JtLnYxLkZlZGVyYXRlZEdyYXBoQ2hhbmdlbG9nT3V0cHV0EhMKC2hhc05leHRQYWdlGAMgASgIImQKFEdldEZlZGVyYXRlZFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USGgoSRmVkZXJhdGVkU2NoZW1hU0RMGAIgASgJIswEChVVcGRhdGVTdWJncmFwaFJlcXVlc3QSDAoEbmFtZRgBIAEoCRIYCgtyb3V0aW5nX3VybBgCIAEoCUgAiAEBEisKBmxhYmVscxgDIAMoCzIbLndnLmNvc21vLnBsYXRmb3JtLnYxLkxhYmVsEg8KB2hlYWRlcnMYBCADKAkSUAoVc3Vic2NyaXB0aW9uX3Byb3RvY29sGAUgASgOMiwud2cuY29zbW8uY29tbW9uLkdyYXBoUUxTdWJzY3JpcHRpb25Qcm90b2NvbEgBiAEBEh0KEHN1YnNjcmlwdGlvbl91cmwYBiABKAlIAogBARITCgZyZWFkbWUYByABKAlIA4gBARIRCgluYW1lc3BhY2UYCCABKAkSGQoMdW5zZXRfbGFiZWxzGAkgASgISASIAQESUAoVd2Vic29ja2V0X3N1YnByb3RvY29sGAogASgOMiwud2cuY29zbW8uY29tbW9uLkdyYXBoUUxXZWJzb2NrZXRTdWJwcm90b2NvbEgFiAEBEi0KIGRpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uGAsgASgISAaIAQFCDgoMX3JvdXRpbmdfdXJsQhgKFl9zdWJzY3JpcHRpb25fcHJvdG9jb2xCEwoRX3N1YnNjcmlwdGlvbl91cmxCCQoHX3JlYWRtZUIPCg1fdW5zZXRfbGFiZWxzQhgKFl93ZWJzb2NrZXRfc3VicHJvdG9jb2xCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uIpUCChZVcGRhdGVTdWJncmFwaFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQQoRY29tcG9zaXRpb25FcnJvcnMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEj8KEGRlcGxveW1lbnRFcnJvcnMYAyADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZXBsb3ltZW50RXJyb3ISRQoTY29tcG9zaXRpb25XYXJuaW5ncxgEIAMoCzIoLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXBvc2l0aW9uV2FybmluZyKVAwobVXBkYXRlRmVkZXJhdGVkR3JhcGhSZXF1ZXN0EgwKBG5hbWUYASABKAkSEwoLcm91dGluZ191cmwYAiABKAkSFgoObGFiZWxfbWF0Y2hlcnMYAyADKAkSEwoGcmVhZG1lGAQgASgJSACIAQESEQoJbmFtZXNwYWNlGAUgASgJEiEKFHVuc2V0X2xhYmVsX21hdGNoZXJzGAYgASgISAGIAQESIAoTYWRtaXNzaW9uV2ViaG9va1VSTBgHIAEoCUgCiAEBEiMKFmFkbWlzc2lvbldlYmhvb2tTZWNyZXQYCCABKAlIA4gBARItCiBkaXNhYmxlX3Jlc29sdmFiaWxpdHlfdmFsaWRhdGlvbhgJIAEoCEgEiAEBQgkKB19yZWFkbWVCFwoVX3Vuc2V0X2xhYmVsX21hdGNoZXJzQhYKFF9hZG1pc3Npb25XZWJob29rVVJMQhkKF19hZG1pc3Npb25XZWJob29rU2VjcmV0QiMKIV9kaXNhYmxlX3Jlc29sdmFiaWxpdHlfdmFsaWRhdGlvbiKbAgocVXBkYXRlRmVkZXJhdGVkR3JhcGhSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkEKEWNvbXBvc2l0aW9uRXJyb3JzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchI/ChBkZXBsb3ltZW50RXJyb3JzGAMgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVwbG95bWVudEVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBCADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcihwQKFlVwZGF0ZU1vbm9ncmFwaFJlcXVlc3QSDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSEwoLcm91dGluZ191cmwYAyABKAkSEQoJZ3JhcGhfdXJsGAQgASgJElAKFXN1YnNjcmlwdGlvbl9wcm90b2NvbBgFIAEoDjIsLndnLmNvc21vLmNvbW1vbi5HcmFwaFFMU3Vic2NyaXB0aW9uUHJvdG9jb2xIAIgBARIdChBzdWJzY3JpcHRpb25fdXJsGAYgASgJSAGIAQESEwoGcmVhZG1lGAcgASgJSAKIAQESUAoVd2Vic29ja2V0X3N1YnByb3RvY29sGAggASgOMiwud2cuY29zbW8uY29tbW9uLkdyYXBoUUxXZWJzb2NrZXRTdWJwcm90b2NvbEgDiAEBEiAKE2FkbWlzc2lvbldlYmhvb2tVUkwYCSABKAlIBIgBARIjChZhZG1pc3Npb25XZWJob29rU2VjcmV0GAogASgJSAWIAQFCGAoWX3N1YnNjcmlwdGlvbl9wcm90b2NvbEITChFfc3Vic2NyaXB0aW9uX3VybEIJCgdfcmVhZG1lQhgKFl93ZWJzb2NrZXRfc3VicHJvdG9jb2xCFgoUX2FkbWlzc2lvbldlYmhvb2tVUkxCGQoXX2FkbWlzc2lvbldlYmhvb2tTZWNyZXQiSwoXVXBkYXRlTW9ub2dyYXBoUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSLHAQoaQ2hlY2tGZWRlcmF0ZWRHcmFwaFJlcXVlc3QSDAoEbmFtZRgBIAEoCRIWCg5sYWJlbF9tYXRjaGVycxgCIAMoCRIRCgluYW1lc3BhY2UYAyABKAkSLQogZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24YBCABKAhIAIgBARISCgVsaW1pdBgFIAEoBUgBiAEBQiMKIV9kaXNhYmxlX3Jlc29sdmFiaWxpdHlfdmFsaWRhdGlvbkIICgZfbGltaXQi1QIKG0NoZWNrRmVkZXJhdGVkR3JhcGhSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkEKEWNvbXBvc2l0aW9uRXJyb3JzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchIxCglzdWJncmFwaHMYAyADKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TdWJncmFwaBJFChNjb21wb3NpdGlvbldhcm5pbmdzGAQgAygLMigud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25XYXJuaW5nEjwKBmNvdW50cxgFIAEoCzInLndnLmNvc21vLnBsYXRmb3JtLnYxLlNjaGVtYUNoZWNrQ291bnRzSACIAQFCCQoHX2NvdW50cyIrCgpQYWdpbmF0aW9uEg0KBWxpbWl0GAEgASgFEg4KBm9mZnNldBgCIAEoBSIgCgRTb3J0EgoKAmlkGAEgASgJEgwKBGRlc2MYAiABKAgiiQIKD0FuYWx5dGljc0NvbmZpZxIyCglkYXRlUmFuZ2UYASABKAsyHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EYXRlUmFuZ2USEgoFcmFuZ2UYAiABKAVIAIgBARI2CgdmaWx0ZXJzGAMgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuQW5hbHl0aWNzRmlsdGVyEjQKCnBhZ2luYXRpb24YBCABKAsyIC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QYWdpbmF0aW9uEi0KBHNvcnQYBSABKAsyGi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Tb3J0SAGIAQFCCAoGX3JhbmdlQgcKBV9zb3J0InQKD0FuYWx5dGljc0ZpbHRlchINCgVmaWVsZBgBIAEoCRINCgV2YWx1ZRgCIAEoCRJDCghvcGVyYXRvchgDIAEoDjIxLndnLmNvc21vLnBsYXRmb3JtLnYxLkFuYWx5dGljc1ZpZXdGaWx0ZXJPcGVyYXRvciInCglEYXRlUmFuZ2USDQoFc3RhcnQYASABKAkSCwoDZW5kGAIgASgJIrsBChdHZXRBbmFseXRpY3NWaWV3UmVxdWVzdBIaChJmZWRlcmF0ZWRHcmFwaE5hbWUYASABKAkSOgoEbmFtZRgCIAEoDjIsLndnLmNvc21vLnBsYXRmb3JtLnYxLkFuYWx5dGljc1ZpZXdHcm91cE5hbWUSNQoGY29uZmlnGAMgASgLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuQW5hbHl0aWNzQ29uZmlnEhEKCW5hbWVzcGFjZRgEIAEoCSLYAQoTQW5hbHl0aWNzVmlld1Jlc3VsdBI6Cgdjb2x1bW5zGAEgAygLMikud2cuY29zbW8ucGxhdGZvcm0udjEuQW5hbHl0aWNzVmlld0NvbHVtbhI0CgRyb3dzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQW5hbHl0aWNzVmlld1JvdxJACgdmaWx0ZXJzGAMgAygLMi8ud2cuY29zbW8ucGxhdGZvcm0udjEuQW5hbHl0aWNzVmlld1Jlc3VsdEZpbHRlchINCgVwYWdlcxgEIAEoBSK+AQoTQW5hbHl0aWNzVmlld0NvbHVtbhIMCgRuYW1lGAEgASgJEg0KBXRpdGxlGAIgASgJEgwKBHR5cGUYAyABKAkSLQoEdW5pdBgEIAEoDjIaLndnLmNvc21vLnBsYXRmb3JtLnYxLlVuaXRIAIgBARIWCglpc19oaWRkZW4YBSABKAhIAYgBARITCgZpc19jdGEYBiABKAhIAogBAUIHCgVfdW5pdEIMCgpfaXNfaGlkZGVuQgkKB19pc19jdGEi2wEKGUFuYWx5dGljc1ZpZXdSZXN1bHRGaWx0ZXISEgoKY29sdW1uTmFtZRgBIAEoCRINCgV0aXRsZRgCIAEoCRJGCgdvcHRpb25zGAMgAygLMjUud2cuY29zbW8ucGxhdGZvcm0udjEuQW5hbHl0aWNzVmlld1Jlc3VsdEZpbHRlck9wdGlvbhJACg5jdXN0b21fb3B0aW9ucxgEIAEoDjIjLndnLmNvc21vLnBsYXRmb3JtLnYxLkN1c3RvbU9wdGlvbnNIAIgBAUIRCg9fY3VzdG9tX29wdGlvbnMikwEKH0FuYWx5dGljc1ZpZXdSZXN1bHRGaWx0ZXJPcHRpb24SDQoFbGFiZWwYASABKAkSEgoFdmFsdWUYAiABKAlIAIgBARJDCghvcGVyYXRvchgDIAEoDjIxLndnLmNvc21vLnBsYXRmb3JtLnYxLkFuYWx5dGljc1ZpZXdGaWx0ZXJPcGVyYXRvckIICgZfdmFsdWUirwEKEEFuYWx5dGljc1ZpZXdSb3cSQAoFdmFsdWUYASADKAsyMS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5BbmFseXRpY3NWaWV3Um93LlZhbHVlRW50cnkaWQoKVmFsdWVFbnRyeRILCgNrZXkYASABKAkSOgoFdmFsdWUYAiABKAsyKy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5BbmFseXRpY3NWaWV3Um93VmFsdWU6AjgBImUKFUFuYWx5dGljc1ZpZXdSb3dWYWx1ZRIWCgxudW1iZXJfdmFsdWUYASABKAFIABIWCgxzdHJpbmdfdmFsdWUYAiABKAlIABIUCgpib29sX3ZhbHVlGAMgASgISABCBgoEa2luZCKFAQoYR2V0QW5hbHl0aWNzVmlld1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USNwoEdmlldxgCIAEoCzIpLndnLmNvc21vLnBsYXRmb3JtLnYxLkFuYWx5dGljc1ZpZXdSZXN1bHQihAEKIEdldERhc2hib2FyZEFuYWx5dGljc1ZpZXdSZXF1ZXN0EhoKEmZlZGVyYXRlZEdyYXBoTmFtZRgBIAEoCRIRCglzdGFydERhdGUYAiABKAkSDwoHZW5kRGF0ZRgDIAEoCRINCgVyYW5nZRgEIAEoBRIRCgluYW1lc3BhY2UYBSABKAkiVgoRUmVxdWVzdFNlcmllc0l0ZW0SEQoJdGltZXN0YW1wGAEgASgJEhUKDXRvdGFsUmVxdWVzdHMYAiABKAUSFwoPZXJyb3JlZFJlcXVlc3RzGAMgASgFIlwKFU9wZXJhdGlvblJlcXVlc3RDb3VudBIVCg1vcGVyYXRpb25IYXNoGAEgASgJEhUKDW9wZXJhdGlvbk5hbWUYAiABKAkSFQoNdG90YWxSZXF1ZXN0cxgDIAEoBSJqChVGZWRlcmF0ZWRHcmFwaE1ldHJpY3MSGAoQZmVkZXJhdGVkR3JhcGhJRBgBIAEoCRITCgtyZXF1ZXN0UmF0ZRgCIAEoAhIRCgllcnJvclJhdGUYAyABKAISDwoHbGF0ZW5jeRgEIAEoAiJeCg9TdWJncmFwaE1ldHJpY3MSEgoKc3ViZ3JhcGhJRBgBIAEoCRITCgtyZXF1ZXN0UmF0ZRgCIAEoAhIRCgllcnJvclJhdGUYAyABKAISDwoHbGF0ZW5jeRgEIAEoAiLvAgohR2V0RGFzaGJvYXJkQW5hbHl0aWNzVmlld1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USPgoNcmVxdWVzdFNlcmllcxgCIAMoCzInLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlcXVlc3RTZXJpZXNJdGVtEkwKF21vc3RSZXF1ZXN0ZWRPcGVyYXRpb25zGAMgAygLMisud2cuY29zbW8ucGxhdGZvcm0udjEuT3BlcmF0aW9uUmVxdWVzdENvdW50Ej4KD3N1YmdyYXBoTWV0cmljcxgEIAMoCzIlLndnLmNvc21vLnBsYXRmb3JtLnYxLlN1YmdyYXBoTWV0cmljcxJKChVmZWRlcmF0ZWRHcmFwaE1ldHJpY3MYBSABKAsyKy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWRlcmF0ZWRHcmFwaE1ldHJpY3MiWwogQ3JlYXRlRmVkZXJhdGVkR3JhcGhUb2tlblJlcXVlc3QSEQoJZ3JhcGhOYW1lGAEgASgJEhEKCXRva2VuTmFtZRgCIAEoCRIRCgluYW1lc3BhY2UYAyABKAkiZAohQ3JlYXRlRmVkZXJhdGVkR3JhcGhUb2tlblJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USDQoFdG9rZW4YAiABKAkiTAoVT3JnYW5pemF0aW9uR3JvdXBSdWxlEgwKBHJvbGUYASABKAkSEgoKbmFtZXNwYWNlcxgCIAMoCRIRCglyZXNvdXJjZXMYAyADKAki2AEKEU9yZ2FuaXphdGlvbkdyb3VwEg8KB2dyb3VwSWQYASABKAkSDAoEbmFtZRgCIAEoCRITCgtkZXNjcmlwdGlvbhgDIAEoCRIPCgdidWlsdGluGAQgASgIEhQKDG1lbWJlcnNDb3VudBgFIAEoBRI6CgVydWxlcxgGIAMoCzIrLndnLmNvc21vLnBsYXRmb3JtLnYxLk9yZ2FuaXphdGlvbkdyb3VwUnVsZRIWCg5oYXNPaWRjTWFwcGVycxgHIAEoCBIUCgxhcGlLZXlzQ291bnQYCCABKAUiQwoeQ3JlYXRlT3JnYW5pemF0aW9uR3JvdXBSZXF1ZXN0EgwKBG5hbWUYASABKAkSEwoLZGVzY3JpcHRpb24YAiABKAkiiwEKH0NyZWF0ZU9yZ2FuaXphdGlvbkdyb3VwUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI2CgVncm91cBgCIAEoCzInLndnLmNvc21vLnBsYXRmb3JtLnYxLk9yZ2FuaXphdGlvbkdyb3VwIh4KHEdldE9yZ2FuaXphdGlvbkdyb3Vwc1JlcXVlc3QiigEKHUdldE9yZ2FuaXphdGlvbkdyb3Vwc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USNwoGZ3JvdXBzGAIgAygLMicud2cuY29zbW8ucGxhdGZvcm0udjEuT3JnYW5pemF0aW9uR3JvdXAiNQoiR2V0T3JnYW5pemF0aW9uR3JvdXBNZW1iZXJzUmVxdWVzdBIPCgdncm91cElkGAEgASgJIoADCiNHZXRPcmdhbml6YXRpb25Hcm91cE1lbWJlcnNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlElYKB21lbWJlcnMYAiADKAsyRS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25Hcm91cE1lbWJlcnNSZXNwb25zZS5Hcm91cE1lbWJlchJWCgdhcGlLZXlzGAMgAygLMkUud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uR3JvdXBNZW1iZXJzUmVzcG9uc2UuR3JvdXBBcGlLZXkaOwoLR3JvdXBNZW1iZXISCgoCaWQYASABKAkSDQoFZW1haWwYAiABKAkSEQoJY3JlYXRlZEF0GAMgASgJGjoKC0dyb3VwQXBpS2V5EgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSEQoJY3JlYXRlZEF0GAMgASgJItcBCh5VcGRhdGVPcmdhbml6YXRpb25Hcm91cFJlcXVlc3QSDwoHZ3JvdXBJZBgBIAEoCRITCgtkZXNjcmlwdGlvbhgCIAEoCRJNCgVydWxlcxgDIAMoCzI+LndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZU9yZ2FuaXphdGlvbkdyb3VwUmVxdWVzdC5Hcm91cFJ1bGUaQAoJR3JvdXBSdWxlEgwKBHJvbGUYASABKAkSEgoKbmFtZXNwYWNlcxgCIAMoCRIRCglyZXNvdXJjZXMYAyADKAkiUwofVXBkYXRlT3JnYW5pemF0aW9uR3JvdXBSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIlcKHkRlbGV0ZU9yZ2FuaXphdGlvbkdyb3VwUmVxdWVzdBIPCgdncm91cElkGAEgASgJEhYKCXRvR3JvdXBJZBgCIAEoCUgAiAEBQgwKCl90b0dyb3VwSWQiUwofRGVsZXRlT3JnYW5pemF0aW9uR3JvdXBSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIsABCglPcmdNZW1iZXISDgoGdXNlcklEGAEgASgJEg0KBWVtYWlsGAIgASgJEhMKC29yZ01lbWJlcklEGAMgASgJEg4KBmFjdGl2ZRgEIAEoCBIQCghqb2luZWRBdBgFIAEoCRI1CgZncm91cHMYBiADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5PcmdNZW1iZXIuR3JvdXAaJgoFR3JvdXASDwoHZ3JvdXBJZBgBIAEoCRIMCgRuYW1lGAIgASgJIjUKFFBlbmRpbmdPcmdJbnZpdGF0aW9uEg4KBnVzZXJJRBgBIAEoCRINCgVlbWFpbBgCIAEoCSJ8CiRHZXRQZW5kaW5nT3JnYW5pemF0aW9uTWVtYmVyc1JlcXVlc3QSNAoKcGFnaW5hdGlvbhgBIAEoCzIgLndnLmNvc21vLnBsYXRmb3JtLnYxLlBhZ2luYXRpb24SEwoGc2VhcmNoGAIgASgJSACIAQFCCQoHX3NlYXJjaCK2AQolR2V0UGVuZGluZ09yZ2FuaXphdGlvbk1lbWJlcnNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkYKEnBlbmRpbmdJbnZpdGF0aW9ucxgCIAMoCzIqLndnLmNvc21vLnBsYXRmb3JtLnYxLlBlbmRpbmdPcmdJbnZpdGF0aW9uEhMKC3RvdGFsX2NvdW50GAMgASgFInUKHUdldE9yZ2FuaXphdGlvbk1lbWJlcnNSZXF1ZXN0EjQKCnBhZ2luYXRpb24YASABKAsyIC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QYWdpbmF0aW9uEhMKBnNlYXJjaBgCIAEoCUgAiAEBQgkKB19zZWFyY2gimQEKHkdldE9yZ2FuaXphdGlvbk1lbWJlcnNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjAKB21lbWJlcnMYAiADKAsyHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5PcmdNZW1iZXISEwoLdG90YWxfY291bnQYAyABKAUiMgoRSW52aXRlVXNlclJlcXVlc3QSDQoFZW1haWwYASABKAkSDgoGZ3JvdXBzGAIgAygJIkYKEkludml0ZVVzZXJSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIjQKEkludml0ZVVzZXJzUmVxdWVzdBIOCgZlbWFpbHMYASADKAkSDgoGZ3JvdXBzGAIgAygJIjoKGkludml0ZVVzZXJzSW52aXRhdGlvbkVycm9yEg0KBWVtYWlsGAEgASgJEg0KBWVycm9yGAIgASgJIpMBChNJbnZpdGVVc2Vyc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USSgoQaW52aXRhdGlvbkVycm9ycxgCIAMoCzIwLndnLmNvc21vLnBsYXRmb3JtLnYxLkludml0ZVVzZXJzSW52aXRhdGlvbkVycm9yIuYBCgZBUElLZXkSCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCRIRCgljcmVhdGVkQnkYAyABKAkSEQoJY3JlYXRlZEF0GAQgASgJEhIKCmxhc3RVc2VkQXQYBSABKAkSEQoJZXhwaXJlc0F0GAYgASgJEjYKBWdyb3VwGAcgASgLMiIud2cuY29zbW8ucGxhdGZvcm0udjEuQVBJS2V5Lkdyb3VwSACIAQESEAoIZXh0ZXJuYWwYCCABKAgaIQoFR3JvdXASCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCUIICgZfZ3JvdXAiMgoRR2V0QVBJS2V5c1JlcXVlc3QSDQoFbGltaXQYASABKAUSDgoGb2Zmc2V0GAIgASgFIoQBChJHZXRBUElLZXlzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRItCgdhcGlLZXlzGAIgAygLMhwud2cuY29zbW8ucGxhdGZvcm0udjEuQVBJS2V5Eg0KBWNvdW50GAMgASgFIq8BChNDcmVhdGVBUElLZXlSZXF1ZXN0EgwKBG5hbWUYASABKAkSDgoGdXNlcklEGAIgASgJEjAKB2V4cGlyZXMYAyABKA4yHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5FeHBpcmVzQXQSDwoHZ3JvdXBJZBgEIAEoCRITCgtwZXJtaXNzaW9ucxgFIAMoCRIVCghleHRlcm5hbBgGIAEoCEgAiAEBQgsKCV9leHRlcm5hbCJYChRDcmVhdGVBUElLZXlSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEg4KBmFwaUtleRgCIAEoCSIjChNEZWxldGVBUElLZXlSZXF1ZXN0EgwKBG5hbWUYASABKAkiSAoURGVsZXRlQVBJS2V5UmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSI0ChNVcGRhdGVBUElLZXlSZXF1ZXN0EgwKBG5hbWUYASABKAkSDwoHZ3JvdXBJZBgCIAEoCSJIChRVcGRhdGVBUElLZXlSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIjAKH1JlbW92ZU9yZ2FuaXphdGlvbk1lbWJlclJlcXVlc3QSDQoFZW1haWwYASABKAkiVAogUmVtb3ZlT3JnYW5pemF0aW9uTWVtYmVyUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSIoChdSZW1vdmVJbnZpdGF0aW9uUmVxdWVzdBINCgVlbWFpbBgBIAEoCSJMChhSZW1vdmVJbnZpdGF0aW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSJSChhNaWdyYXRlRnJvbUFwb2xsb1JlcXVlc3QSDgoGYXBpS2V5GAEgASgJEhMKC3ZhcmlhbnROYW1lGAIgASgJEhEKCW5hbWVzcGFjZRgDIAEoCSJcChlNaWdyYXRlRnJvbUFwb2xsb1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USDQoFdG9rZW4YAiABKAkizAIKBFNwYW4SEQoJdGltZXN0YW1wGAEgASgDEhEKCXNjb3BlTmFtZRgCIAEoCRIPCgd0cmFjZUlEGAMgASgJEg4KBnNwYW5JRBgEIAEoCRIUCgxwYXJlbnRTcGFuSUQYBSABKAkSEAoIc3Bhbk5hbWUYBiABKAkSEAoIc3BhbktpbmQYByABKAkSEAoIZHVyYXRpb24YCCABKAMSEwoLc2VydmljZU5hbWUYCSABKAkSEgoKc3RhdHVzQ29kZRgKIAEoCRIVCg1zdGF0dXNNZXNzYWdlGAsgASgJEj4KCmF0dHJpYnV0ZXMYDCADKAsyKi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TcGFuLkF0dHJpYnV0ZXNFbnRyeRoxCg9BdHRyaWJ1dGVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASJKCg9HZXRUcmFjZVJlcXVlc3QSCgoCaWQYASABKAkSDwoHc3Bhbl9pZBgCIAEoCRIaChJmZWRlcmF0ZWRfZ3JhcGhfaWQYAyABKAkibwoQR2V0VHJhY2VSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEikKBXNwYW5zGAIgAygLMhoud2cuY29zbW8ucGxhdGZvcm0udjEuU3BhbiIPCg1XaG9BbUlSZXF1ZXN0Iu0BCg5XaG9BbUlSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEhgKEG9yZ2FuaXphdGlvbk5hbWUYAiABKAkSFgoJdXNlckVtYWlsGAMgASgJSACIAQESGAoQb3JnYW5pemF0aW9uU2x1ZxgEIAEoCRIWCg5vcmdhbml6YXRpb25JZBgFIAEoCRI3Cgxsb2dpbl9tZXRob2QYBiABKAsyIS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Mb2dpbk1ldGhvZEIMCgpfdXNlckVtYWlsIs0BCgtMb2dpbk1ldGhvZBIzCgR0eXBlGAEgASgOMiUud2cuY29zbW8ucGxhdGZvcm0udjEuTG9naW5NZXRob2RUeXBlEhcKD3Nzb19wcm92aWRlcl9pZBgCIAEoCRIZChFzc29fcHJvdmlkZXJfbmFtZRgDIAEoCRIRCglzc29fYWxpYXMYBCABKAkSQgoPc29jaWFsX3Byb3ZpZGVyGAUgASgOMikud2cuY29zbW8ucGxhdGZvcm0udjEuU29jaWFsTG9naW5Qcm92aWRlciJQCgtSb3V0ZXJUb2tlbhIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEhEKCWNyZWF0ZWRBdBgDIAEoCRIUCgxjcmVhdG9yRW1haWwYBSABKAkiRQoaR2VuZXJhdGVSb3V0ZXJUb2tlblJlcXVlc3QSFAoMZmVkR3JhcGhOYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCSJeChtHZW5lcmF0ZVJvdXRlclRva2VuUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRINCgV0b2tlbhgCIAEoCSJBChZHZXRSb3V0ZXJUb2tlbnNSZXF1ZXN0EhQKDGZlZEdyYXBoTmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkifgoXR2V0Um91dGVyVG9rZW5zUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIxCgZ0b2tlbnMYAiADKAsyIS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Sb3V0ZXJUb2tlbiJWChhEZWxldGVSb3V0ZXJUb2tlblJlcXVlc3QSEQoJdG9rZW5OYW1lGAEgASgJEhQKDGZlZEdyYXBoTmFtZRgCIAEoCRIRCgluYW1lc3BhY2UYAyABKAkiTQoZRGVsZXRlUm91dGVyVG9rZW5SZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIjIKElBlcnNpc3RlZE9wZXJhdGlvbhIKCgJpZBgBIAEoCRIQCghjb250ZW50cxgCIAEoCSKeAQohUHVibGlzaFBlcnNpc3RlZE9wZXJhdGlvbnNSZXF1ZXN0EhQKDGZlZEdyYXBoTmFtZRgBIAEoCRISCgpjbGllbnROYW1lGAIgASgJEjwKCm9wZXJhdGlvbnMYAyADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QZXJzaXN0ZWRPcGVyYXRpb24SEQoJbmFtZXNwYWNlGAQgASgJIoYBChJQdWJsaXNoZWRPcGVyYXRpb24SCgoCaWQYASABKAkSDAoEaGFzaBgCIAEoCRI+CgZzdGF0dXMYAyABKA4yLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QdWJsaXNoZWRPcGVyYXRpb25TdGF0dXMSFgoOb3BlcmF0aW9uTmFtZXMYBCADKAkilAEKIlB1Ymxpc2hQZXJzaXN0ZWRPcGVyYXRpb25zUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI8CgpvcGVyYXRpb25zGAIgAygLMigud2cuY29zbW8ucGxhdGZvcm0udjEuUHVibGlzaGVkT3BlcmF0aW9uInMKH0RlbGV0ZVBlcnNpc3RlZE9wZXJhdGlvblJlcXVlc3QSFAoMZmVkR3JhcGhOYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRISCgpjbGllbnROYW1lGAMgASgJEhMKC29wZXJhdGlvbklkGAQgASgJIoMCCiBEZWxldGVQZXJzaXN0ZWRPcGVyYXRpb25SZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlElMKCW9wZXJhdGlvbhgCIAEoCzJALndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZVBlcnNpc3RlZE9wZXJhdGlvblJlc3BvbnNlLk9wZXJhdGlvbhpYCglPcGVyYXRpb24SCgoCaWQYASABKAkSEwoLb3BlcmF0aW9uSWQYAiABKAkSEgoKY2xpZW50TmFtZRgDIAEoCRIWCg5vcGVyYXRpb25OYW1lcxgEIAMoCSJ5CiVDaGVja1BlcnNpc3RlZE9wZXJhdGlvblRyYWZmaWNSZXF1ZXN0EhQKDGZlZEdyYXBoTmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSEwoLb3BlcmF0aW9uSWQYAyABKAkSEgoKY2xpZW50TmFtZRgEIAEoCSKjAgomQ2hlY2tQZXJzaXN0ZWRPcGVyYXRpb25UcmFmZmljUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJZCglvcGVyYXRpb24YAiABKAsyRi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DaGVja1BlcnNpc3RlZE9wZXJhdGlvblRyYWZmaWNSZXNwb25zZS5PcGVyYXRpb24abAoJT3BlcmF0aW9uEgoKAmlkGAEgASgJEhMKC29wZXJhdGlvbklkGAIgASgJEhIKCmNsaWVudE5hbWUYAyABKAkSFgoOb3BlcmF0aW9uTmFtZXMYBCADKAkSEgoKaGFzVHJhZmZpYxgFIAEoCCJjCh1HZXRQZXJzaXN0ZWRPcGVyYXRpb25zUmVxdWVzdBIcChRmZWRlcmF0ZWRfZ3JhcGhfbmFtZRgBIAEoCRIRCgljbGllbnRfaWQYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJIpcCCh5HZXRQZXJzaXN0ZWRPcGVyYXRpb25zUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJSCgpvcGVyYXRpb25zGAIgAygLMj4ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0UGVyc2lzdGVkT3BlcmF0aW9uc1Jlc3BvbnNlLk9wZXJhdGlvbhpvCglPcGVyYXRpb24SCgoCaWQYASABKAkSEAoIY29udGVudHMYAiABKAkSEgoKY3JlYXRlZF9hdBgDIAEoCRIXCg9sYXN0X3VwZGF0ZWRfYXQYBCABKAkSFwoPb3BlcmF0aW9uX25hbWVzGAUgAygJIiQKBkhlYWRlchILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAkijwEKJkNyZWF0ZU9yZ2FuaXphdGlvbldlYmhvb2tDb25maWdSZXF1ZXN0EhAKCGVuZHBvaW50GAEgASgJEgsKA2tleRgCIAEoCRIOCgZldmVudHMYAyADKAkSNgoLZXZlbnRzX21ldGEYBCADKAsyIS53Zy5jb3Ntby5ub3RpZmljYXRpb25zLkV2ZW50TWV0YSJ2CidDcmVhdGVPcmdhbml6YXRpb25XZWJob29rQ29uZmlnUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIZChF3ZWJob29rX2NvbmZpZ19pZBgCIAEoCSImCiRHZXRPcmdhbml6YXRpb25XZWJob29rQ29uZmlnc1JlcXVlc3Qi5gEKJUdldE9yZ2FuaXphdGlvbldlYmhvb2tDb25maWdzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJTCgdjb25maWdzGAIgAygLMkIud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uV2ViaG9va0NvbmZpZ3NSZXNwb25zZS5Db25maWcaNgoGQ29uZmlnEgoKAmlkGAEgASgJEhAKCGVuZHBvaW50GAIgASgJEg4KBmV2ZW50cxgDIAMoCSIvCiFHZXRPcmdhbml6YXRpb25XZWJob29rTWV0YVJlcXVlc3QSCgoCaWQYASABKAkijgEKIkdldE9yZ2FuaXphdGlvbldlYmhvb2tNZXRhUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI2CgtldmVudHNfbWV0YRgCIAMoCzIhLndnLmNvc21vLm5vdGlmaWNhdGlvbnMuRXZlbnRNZXRhIrYBCiZVcGRhdGVPcmdhbml6YXRpb25XZWJob29rQ29uZmlnUmVxdWVzdBIKCgJpZBgBIAEoCRIQCghlbmRwb2ludBgCIAEoCRILCgNrZXkYAyABKAkSDgoGZXZlbnRzGAQgAygJEjYKC2V2ZW50c19tZXRhGAUgAygLMiEud2cuY29zbW8ubm90aWZpY2F0aW9ucy5FdmVudE1ldGESGQoRc2hvdWxkX3VwZGF0ZV9rZXkYBiABKAgiWwonVXBkYXRlT3JnYW5pemF0aW9uV2ViaG9va0NvbmZpZ1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiNAomRGVsZXRlT3JnYW5pemF0aW9uV2ViaG9va0NvbmZpZ1JlcXVlc3QSCgoCaWQYASABKAkiWwonRGVsZXRlT3JnYW5pemF0aW9uV2ViaG9va0NvbmZpZ1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiiwEKGENyZWF0ZUludGVncmF0aW9uUmVxdWVzdBIMCgR0eXBlGAEgASgJEgwKBG5hbWUYAiABKAkSDAoEY29kZRgDIAEoCRIOCgZldmVudHMYBCADKAkSNQoKZXZlbnRzTWV0YRgFIAMoCzIhLndnLmNvc21vLm5vdGlmaWNhdGlvbnMuRXZlbnRNZXRhIk0KGUNyZWF0ZUludGVncmF0aW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSIkCiJHZXRPcmdhbml6YXRpb25JbnRlZ3JhdGlvbnNSZXF1ZXN0IioKFlNsYWNrSW50ZWdyYXRpb25Db25maWcSEAoIZW5kcG9pbnQYASABKAkiogEKEUludGVncmF0aW9uQ29uZmlnEjMKBHR5cGUYASABKA4yJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5JbnRlZ3JhdGlvblR5cGUSTgoWc2xhY2tJbnRlZ3JhdGlvbkNvbmZpZxgCIAEoCzIsLndnLmNvc21vLnBsYXRmb3JtLnYxLlNsYWNrSW50ZWdyYXRpb25Db25maWdIAEIICgZjb25maWciwAEKC0ludGVncmF0aW9uEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSDAoEdHlwZRgDIAEoCRIOCgZldmVudHMYBCADKAkSQgoRaW50ZWdyYXRpb25Db25maWcYBSABKAsyJy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5JbnRlZ3JhdGlvbkNvbmZpZxI1CgpldmVudHNNZXRhGAYgAygLMiEud2cuY29zbW8ubm90aWZpY2F0aW9ucy5FdmVudE1ldGEikAEKI0dldE9yZ2FuaXphdGlvbkludGVncmF0aW9uc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USNwoMaW50ZWdyYXRpb25zGAIgAygLMiEud2cuY29zbW8ucGxhdGZvcm0udjEuSW50ZWdyYXRpb24ihgEKHlVwZGF0ZUludGVncmF0aW9uQ29uZmlnUmVxdWVzdBIKCgJpZBgBIAEoCRIQCghlbmRwb2ludBgCIAEoCRIOCgZldmVudHMYAyADKAkSNgoLZXZlbnRzX21ldGEYBCADKAsyIS53Zy5jb3Ntby5ub3RpZmljYXRpb25zLkV2ZW50TWV0YSJTCh9VcGRhdGVJbnRlZ3JhdGlvbkNvbmZpZ1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiJgoYRGVsZXRlSW50ZWdyYXRpb25SZXF1ZXN0EgoKAmlkGAEgASgJIk0KGURlbGV0ZUludGVncmF0aW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSIrChlEZWxldGVPcmdhbml6YXRpb25SZXF1ZXN0Eg4KBnVzZXJJRBgBIAEoCSJOChpEZWxldGVPcmdhbml6YXRpb25SZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIhwKGlJlc3RvcmVPcmdhbml6YXRpb25SZXF1ZXN0Ik8KG1Jlc3RvcmVPcmdhbml6YXRpb25SZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIhoKGExlYXZlT3JnYW5pemF0aW9uUmVxdWVzdCJNChlMZWF2ZU9yZ2FuaXphdGlvblJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiZgogVXBkYXRlT3JnYW5pemF0aW9uRGV0YWlsc1JlcXVlc3QSDgoGdXNlcklEGAEgASgJEhgKEG9yZ2FuaXphdGlvbk5hbWUYAiABKAkSGAoQb3JnYW5pemF0aW9uU2x1ZxgDIAEoCSJVCiFVcGRhdGVPcmdhbml6YXRpb25EZXRhaWxzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSJGChtVcGRhdGVPcmdNZW1iZXJHcm91cFJlcXVlc3QSFwoPb3JnTWVtYmVyVXNlcklEGAEgASgJEg4KBmdyb3VwcxgCIAMoCSJQChxVcGRhdGVPcmdNZW1iZXJHcm91cFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiRQoZQ3JlYXRlT3JnYW5pemF0aW9uUmVxdWVzdBIMCgRuYW1lGAEgASgJEgwKBHNsdWcYAiABKAkSDAoEcGxhbhgDIAEoCSLQAQoaQ3JlYXRlT3JnYW5pemF0aW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI9Cgxvcmdhbml6YXRpb24YAiABKAsyIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Pcmdhbml6YXRpb25IAIgBARIcCg9zdHJpcGVTZXNzaW9uSWQYAyABKAlIAYgBAUIPCg1fb3JnYW5pemF0aW9uQhIKEF9zdHJpcGVTZXNzaW9uSWQidwoMT3JnYW5pemF0aW9uEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSDAoEc2x1ZxgDIAEoCRIaCg1jcmVhdG9yVXNlcklkGAQgASgJSACIAQESEQoJY3JlYXRlZEF0GAUgASgJQhAKDl9jcmVhdG9yVXNlcklkIiwKHEdldE9yZ2FuaXphdGlvbkJ5U2x1Z1JlcXVlc3QSDAoEc2x1ZxgBIAEoCSKhAQodR2V0T3JnYW5pemF0aW9uQnlTbHVnUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI9Cgxvcmdhbml6YXRpb24YAiABKAsyIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Pcmdhbml6YXRpb25IAIgBAUIPCg1fb3JnYW5pemF0aW9uIhgKFkdldEJpbGxpbmdQbGFuc1JlcXVlc3Qi9wIKF0dldEJpbGxpbmdQbGFuc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USSAoFcGxhbnMYAiADKAsyOS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRCaWxsaW5nUGxhbnNSZXNwb25zZS5CaWxsaW5nUGxhbhpTChJCaWxsaW5nUGxhbkZlYXR1cmUSCgoCaWQYASABKAkSEwoLZGVzY3JpcHRpb24YAyABKAkSEgoFbGltaXQYBCABKAVIAIgBAUIICgZfbGltaXQaigEKC0JpbGxpbmdQbGFuEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSDQoFcHJpY2UYAyABKAUSUgoIZmVhdHVyZXMYBCADKAsyQC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRCaWxsaW5nUGxhbnNSZXNwb25zZS5CaWxsaW5nUGxhbkZlYXR1cmUiLAocQ3JlYXRlQ2hlY2tvdXRTZXNzaW9uUmVxdWVzdBIMCgRwbGFuGAEgASgJImQKHUNyZWF0ZUNoZWNrb3V0U2Vzc2lvblJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USEQoJc2Vzc2lvbklkGAIgASgJIiMKIUNyZWF0ZUJpbGxpbmdQb3J0YWxTZXNzaW9uUmVxdWVzdCJ2CiJDcmVhdGVCaWxsaW5nUG9ydGFsU2Vzc2lvblJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USEQoJc2Vzc2lvbklkGAIgASgJEgsKA3VybBgDIAEoCSIiChJVcGdyYWRlUGxhblJlcXVlc3QSDAoEcGxhbhgBIAEoCSJHChNVcGdyYWRlUGxhblJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiwgEKFkdldEdyYXBoTWV0cmljc1JlcXVlc3QSGgoSZmVkZXJhdGVkR3JhcGhOYW1lGAEgASgJEg0KBXJhbmdlGAIgASgFEjIKCWRhdGVSYW5nZRgDIAEoCzIfLndnLmNvc21vLnBsYXRmb3JtLnYxLkRhdGVSYW5nZRI2CgdmaWx0ZXJzGAQgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuQW5hbHl0aWNzRmlsdGVyEhEKCW5hbWVzcGFjZRgFIAEoCSLyAgoXR2V0R3JhcGhNZXRyaWNzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI+CghyZXF1ZXN0cxgCIAEoCzIsLndnLmNvc21vLnBsYXRmb3JtLnYxLk1ldHJpY3NEYXNoYm9hcmRNZXRyaWMSPQoHbGF0ZW5jeRgDIAEoCzIsLndnLmNvc21vLnBsYXRmb3JtLnYxLk1ldHJpY3NEYXNoYm9hcmRNZXRyaWMSPAoGZXJyb3JzGAQgASgLMiwud2cuY29zbW8ucGxhdGZvcm0udjEuTWV0cmljc0Rhc2hib2FyZE1ldHJpYxJACgdmaWx0ZXJzGAUgAygLMi8ud2cuY29zbW8ucGxhdGZvcm0udjEuQW5hbHl0aWNzVmlld1Jlc3VsdEZpbHRlchIXCgpyZXNvbHV0aW9uGAYgASgJSACIAQFCDQoLX3Jlc29sdXRpb24iwQEKFk1ldHJpY3NEYXNoYm9hcmRNZXRyaWMSDQoFdmFsdWUYASABKAkSGgoNcHJldmlvdXNWYWx1ZRgCIAEoCUgAiAEBEjEKA3RvcBgDIAMoCzIkLndnLmNvc21vLnBsYXRmb3JtLnYxLk1ldHJpY3NUb3BJdGVtEjcKBnNlcmllcxgEIAMoCzInLndnLmNvc21vLnBsYXRmb3JtLnYxLk1ldHJpY3NTZXJpZXNJdGVtQhAKDl9wcmV2aW91c1ZhbHVlIlAKDk1ldHJpY3NUb3BJdGVtEgwKBGhhc2gYASABKAkSDAoEbmFtZRgCIAEoCRINCgV2YWx1ZRgDIAEoCRITCgtpc1BlcnNpc3RlZBgEIAEoCCKxAQoRTWV0cmljc1Nlcmllc0l0ZW0SEQoJdGltZXN0YW1wGAEgASgJEg0KBXZhbHVlGAIgASgJEhoKDXByZXZpb3VzVmFsdWUYAyABKAlIAIgBARIQCgNwNTAYBCABKAlIAYgBARIQCgNwOTAYBSABKAlIAogBARIQCgNwOTkYBiABKAlIA4gBAUIQCg5fcHJldmlvdXNWYWx1ZUIGCgRfcDUwQgYKBF9wOTBCBgoEX3A5OSK7AQoQTWV0cmljc0Rhc2hib2FyZBIMCgRuYW1lGAEgASgJEg0KBXRpdGxlGAIgASgJEgwKBHR5cGUYAyABKAkSLQoEdW5pdBgEIAEoDjIaLndnLmNvc21vLnBsYXRmb3JtLnYxLlVuaXRIAIgBARIWCglpc19oaWRkZW4YBSABKAhIAYgBARITCgZpc19jdGEYBiABKAhIAogBAUIHCgVfdW5pdEIMCgpfaXNfaGlkZGVuQgkKB19pc19jdGEixgEKGkdldE1ldHJpY3NFcnJvclJhdGVSZXF1ZXN0EhoKEmZlZGVyYXRlZEdyYXBoTmFtZRgBIAEoCRINCgVyYW5nZRgCIAEoBRIyCglkYXRlUmFuZ2UYAyABKAsyHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EYXRlUmFuZ2USNgoHZmlsdGVycxgEIAMoCzIlLndnLmNvc21vLnBsYXRmb3JtLnYxLkFuYWx5dGljc0ZpbHRlchIRCgluYW1lc3BhY2UYBSABKAkiuQEKG0dldE1ldHJpY3NFcnJvclJhdGVSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkAKBnNlcmllcxgCIAMoCzIwLndnLmNvc21vLnBsYXRmb3JtLnYxLk1ldHJpY3NFcnJvclJhdGVTZXJpZXNJdGVtEhcKCnJlc29sdXRpb24YAyABKAlIAIgBAUINCgtfcmVzb2x1dGlvbiJXChpNZXRyaWNzRXJyb3JSYXRlU2VyaWVzSXRlbRIRCgl0aW1lc3RhbXAYASABKAkSEwoLcmVxdWVzdFJhdGUYAiABKAISEQoJZXJyb3JSYXRlGAMgASgCIr8BChlHZXRTdWJncmFwaE1ldHJpY3NSZXF1ZXN0EhQKDHN1YmdyYXBoTmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSDQoFcmFuZ2UYBCABKAUSMgoJZGF0ZVJhbmdlGAUgASgLMh8ud2cuY29zbW8ucGxhdGZvcm0udjEuRGF0ZVJhbmdlEjYKB2ZpbHRlcnMYBiADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5BbmFseXRpY3NGaWx0ZXIi9QIKGkdldFN1YmdyYXBoTWV0cmljc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USPgoIcmVxdWVzdHMYAiABKAsyLC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5NZXRyaWNzRGFzaGJvYXJkTWV0cmljEj0KB2xhdGVuY3kYAyABKAsyLC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5NZXRyaWNzRGFzaGJvYXJkTWV0cmljEjwKBmVycm9ycxgEIAEoCzIsLndnLmNvc21vLnBsYXRmb3JtLnYxLk1ldHJpY3NEYXNoYm9hcmRNZXRyaWMSQAoHZmlsdGVycxgFIAMoCzIvLndnLmNvc21vLnBsYXRmb3JtLnYxLkFuYWx5dGljc1ZpZXdSZXN1bHRGaWx0ZXISFwoKcmVzb2x1dGlvbhgGIAEoCUgAiAEBQg0KC19yZXNvbHV0aW9uIsgBCiJHZXRTdWJncmFwaE1ldHJpY3NFcnJvclJhdGVSZXF1ZXN0EhQKDHN1YmdyYXBoTmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSDQoFcmFuZ2UYBCABKAUSMgoJZGF0ZVJhbmdlGAUgASgLMh8ud2cuY29zbW8ucGxhdGZvcm0udjEuRGF0ZVJhbmdlEjYKB2ZpbHRlcnMYBiADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5BbmFseXRpY3NGaWx0ZXIiwQEKI0dldFN1YmdyYXBoTWV0cmljc0Vycm9yUmF0ZVJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQAoGc2VyaWVzGAIgAygLMjAud2cuY29zbW8ucGxhdGZvcm0udjEuTWV0cmljc0Vycm9yUmF0ZVNlcmllc0l0ZW0SFwoKcmVzb2x1dGlvbhgDIAEoCUgAiAEBQg0KC19yZXNvbHV0aW9uIlMKGEZvcmNlQ2hlY2tTdWNjZXNzUmVxdWVzdBIQCghjaGVja19pZBgBIAEoCRISCgpncmFwaF9uYW1lGAIgASgJEhEKCW5hbWVzcGFjZRgDIAEoCSJNChlGb3JjZUNoZWNrU3VjY2Vzc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UimAEKLFRvZ2dsZUNoYW5nZU92ZXJyaWRlc0ZvckFsbE9wZXJhdGlvbnNSZXF1ZXN0EhAKCGNoZWNrX2lkGAEgASgJEg8KB2lzX3NhZmUYAiABKAgSEgoKZ3JhcGhfbmFtZRgDIAEoCRIRCgluYW1lc3BhY2UYBCABKAkSEwoGc2VhcmNoGAUgASgJSACIAQFCCQoHX3NlYXJjaCJhCi1Ub2dnbGVDaGFuZ2VPdmVycmlkZXNGb3JBbGxPcGVyYXRpb25zUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSKHAQosQ3JlYXRlSWdub3JlT3ZlcnJpZGVzRm9yQWxsT3BlcmF0aW9uc1JlcXVlc3QSEAoIY2hlY2tfaWQYASABKAkSEgoKZ3JhcGhfbmFtZRgCIAEoCRIRCgluYW1lc3BhY2UYAyABKAkSEwoGc2VhcmNoGAQgASgJSACIAQFCCQoHX3NlYXJjaCJhCi1DcmVhdGVJZ25vcmVPdmVycmlkZXNGb3JBbGxPcGVyYXRpb25zUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSJACg5PdmVycmlkZUNoYW5nZRISCgpjaGFuZ2VUeXBlGAEgASgJEhEKBHBhdGgYAiABKAlIAIgBAUIHCgVfcGF0aCKvAQofQ3JlYXRlT3BlcmF0aW9uT3ZlcnJpZGVzUmVxdWVzdBISCgpncmFwaF9uYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRIWCg5vcGVyYXRpb25faGFzaBgDIAEoCRIWCg5vcGVyYXRpb25fbmFtZRgEIAEoCRI1CgdjaGFuZ2VzGAUgAygLMiQud2cuY29zbW8ucGxhdGZvcm0udjEuT3ZlcnJpZGVDaGFuZ2UiVAogQ3JlYXRlT3BlcmF0aW9uT3ZlcnJpZGVzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSKAAQonQ3JlYXRlT3BlcmF0aW9uSWdub3JlQWxsT3ZlcnJpZGVSZXF1ZXN0EhIKCmdyYXBoX25hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEhYKDm9wZXJhdGlvbl9oYXNoGAMgASgJEhYKDm9wZXJhdGlvbl9uYW1lGAQgASgJIlwKKENyZWF0ZU9wZXJhdGlvbklnbm9yZUFsbE92ZXJyaWRlUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSKXAQofUmVtb3ZlT3BlcmF0aW9uT3ZlcnJpZGVzUmVxdWVzdBISCgpncmFwaF9uYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRIWCg5vcGVyYXRpb25faGFzaBgDIAEoCRI1CgdjaGFuZ2VzGAQgAygLMiQud2cuY29zbW8ucGxhdGZvcm0udjEuT3ZlcnJpZGVDaGFuZ2UiVAogUmVtb3ZlT3BlcmF0aW9uT3ZlcnJpZGVzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSJoCidSZW1vdmVPcGVyYXRpb25JZ25vcmVBbGxPdmVycmlkZVJlcXVlc3QSEgoKZ3JhcGhfbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSFgoOb3BlcmF0aW9uX2hhc2gYAyABKAkiXAooUmVtb3ZlT3BlcmF0aW9uSWdub3JlQWxsT3ZlcnJpZGVSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIl0KHEdldE9wZXJhdGlvbk92ZXJyaWRlc1JlcXVlc3QSEgoKZ3JhcGhfbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSFgoOb3BlcmF0aW9uX2hhc2gYAyABKAkinAEKHUdldE9wZXJhdGlvbk92ZXJyaWRlc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USNQoHY2hhbmdlcxgCIAMoCzIkLndnLmNvc21vLnBsYXRmb3JtLnYxLk92ZXJyaWRlQ2hhbmdlEhIKCmlnbm9yZV9hbGwYAyABKAgiXgoWR2V0QWxsT3ZlcnJpZGVzUmVxdWVzdBISCgpncmFwaF9uYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRINCgVsaW1pdBgDIAEoBRIOCgZvZmZzZXQYBCABKAUiowIKF0dldEFsbE92ZXJyaWRlc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USSQoJb3ZlcnJpZGVzGAIgAygLMjYud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0QWxsT3ZlcnJpZGVzUmVzcG9uc2UuT3ZlcnJpZGUSEwoLdG90YWxfY291bnQYAyABKAUadgoIT3ZlcnJpZGUSDAoEaGFzaBgBIAEoCRIMCgRuYW1lGAIgASgJEhwKFGNoYW5nZXNPdmVycmlkZUNvdW50GAMgASgNEhwKFGhhc0lnbm9yZUFsbE92ZXJyaWRlGAQgASgIEhIKCnVwZGF0ZWRfYXQYBSABKAkiTgobSXNHaXRIdWJBcHBJbnN0YWxsZWRSZXF1ZXN0Ei8KCGdpdF9pbmZvGAEgASgLMh0ud2cuY29zbW8ucGxhdGZvcm0udjEuR2l0SW5mbyJmChxJc0dpdEh1YkFwcEluc3RhbGxlZFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USFAoMaXNfaW5zdGFsbGVkGAIgASgIIjAKC0dyb3VwTWFwcGVyEg8KB2dyb3VwSWQYASABKAkSEAoIc3NvR3JvdXAYAiABKAkioAEKGUNyZWF0ZU9JRENQcm92aWRlclJlcXVlc3QSDAoEbmFtZRgBIAEoCRIZChFkaXNjb3ZlcnlFbmRwb2ludBgCIAEoCRIQCghjbGllbnRJRBgDIAEoCRIUCgxjbGllbnRTZWNyZXQYBCABKAkSMgoHbWFwcGVycxgFIAMoCzIhLndnLmNvc21vLnBsYXRmb3JtLnYxLkdyb3VwTWFwcGVyIocBChpDcmVhdGVPSURDUHJvdmlkZXJSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEhEKCXNpZ25JblVSTBgCIAEoCRISCgpzaWduT3V0VVJMGAMgASgJEhAKCGxvZ2luVVJMGAQgASgJIqwBCgxPSURDUHJvdmlkZXISCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCRINCgVhbGlhcxgDIAEoCRIQCghlbmRwb2ludBgEIAEoCRIRCglsb2dpbl91cmwYBSABKAkSHAoUc2lnbl9pbl9yZWRpcmVjdF91cmwYBiABKAkSHQoVc2lnbl9vdXRfcmVkaXJlY3RfdXJsGAcgASgJEhEKCWNyZWF0ZWRBdBgIIAEoCSIaChhMaXN0T0lEQ1Byb3ZpZGVyc1JlcXVlc3QihAEKGUxpc3RPSURDUHJvdmlkZXJzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI1Cglwcm92aWRlcnMYAiADKAsyIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5PSURDUHJvdmlkZXIiJAoWR2V0T0lEQ1Byb3ZpZGVyUmVxdWVzdBIKCgJpZBgBIAEoCSLoAQoXR2V0T0lEQ1Byb3ZpZGVyUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIMCgRuYW1lGAIgASgJEhAKCGVuZHBvaW50GAMgASgJEhAKCGxvZ2luVVJMGAQgASgJEhkKEXNpZ25JblJlZGlyZWN0VVJMGAUgASgJEhoKEnNpZ25PdXRSZWRpcmVjdFVSTBgGIAEoCRIyCgdtYXBwZXJzGAcgAygLMiEud2cuY29zbW8ucGxhdGZvcm0udjEuR3JvdXBNYXBwZXIiJwoZRGVsZXRlT0lEQ1Byb3ZpZGVyUmVxdWVzdBIKCgJpZBgBIAEoCSJOChpEZWxldGVPSURDUHJvdmlkZXJSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIlkKF1VwZGF0ZUlEUE1hcHBlcnNSZXF1ZXN0EjIKB21hcHBlcnMYASADKAsyIS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Hcm91cE1hcHBlchIKCgJpZBgCIAEoCSJMChhVcGRhdGVJRFBNYXBwZXJzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSIlCiNHZXRPcmdhbml6YXRpb25SZXF1ZXN0c0NvdW50UmVxdWVzdCJnCiRHZXRPcmdhbml6YXRpb25SZXF1ZXN0c0NvdW50UmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRINCgVjb3VudBgCIAEoAyKjAQoST3JnYW5pemF0aW9uSW52aXRlEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSDAoEc2x1ZxgDIAEoCRIaCg1jcmVhdG9yVXNlcklkGAQgASgJSACIAQESEQoJY3JlYXRlZEF0GAUgASgJEhYKCWludml0ZWRCeRgGIAEoCUgBiAEBQhAKDl9jcmVhdG9yVXNlcklkQgwKCl9pbnZpdGVkQnkiWAoTR2V0QXVkaXRMb2dzUmVxdWVzdBINCgVsaW1pdBgBIAEoBRIOCgZvZmZzZXQYAiABKAUSEQoJc3RhcnREYXRlGAMgASgJEg8KB2VuZERhdGUYBCABKAkimwIKCEF1ZGl0TG9nEgoKAmlkGAEgASgJEhgKEGFjdG9yRGlzcGxheU5hbWUYAiABKAkSDgoGYWN0aW9uGAMgASgJEhEKCWFjdG9yVHlwZRgEIAEoCRITCgthdWRpdEFjdGlvbhgFIAEoCRIcChRhdWRpdGFibGVEaXNwbGF5TmFtZRgGIAEoCRIZChF0YXJnZXREaXNwbGF5TmFtZRgHIAEoCRISCgp0YXJnZXRUeXBlGAggASgJEhEKCWNyZWF0ZWRBdBgJIAEoCRIZChF0YXJnZXROYW1lc3BhY2VJZBgKIAEoCRIiChp0YXJnZXROYW1lc3BhY2VEaXNwbGF5TmFtZRgLIAEoCRISCgphcGlLZXlOYW1lGAwgASgJIoUBChRHZXRBdWRpdExvZ3NSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEiwKBGxvZ3MYAiADKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5BdWRpdExvZxINCgVjb3VudBgDIAEoBSIXChVHZXRJbnZpdGF0aW9uc1JlcXVlc3QiiQEKFkdldEludml0YXRpb25zUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI9CgtpbnZpdGF0aW9ucxgCIAMoCzIoLndnLmNvc21vLnBsYXRmb3JtLnYxLk9yZ2FuaXphdGlvbkludml0ZSJKCiBBY2NlcHRPckRlY2xpbmVJbnZpdGF0aW9uUmVxdWVzdBIWCg5vcmdhbml6YXRpb25JZBgBIAEoCRIOCgZhY2NlcHQYAiABKAgiVQohQWNjZXB0T3JEZWNsaW5lSW52aXRhdGlvblJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiswUKEEdyYXBoQ29tcG9zaXRpb24SCgoCaWQYASABKAkSFwoPc2NoZW1hVmVyc2lvbklkGAIgASgJEhEKCWNyZWF0ZWRBdBgDIAEoCRIUCgxpc0NvbXBvc2FibGUYBCABKAgSHgoRY29tcG9zaXRpb25FcnJvcnMYBSABKAlIAIgBARIWCgljcmVhdGVkQnkYBiABKAlIAYgBARIVCg1pc0xhdGVzdFZhbGlkGAcgASgIEiIKFXJvdXRlckNvbmZpZ1NpZ25hdHVyZRgIIAEoCUgCiAEBEhsKDmFkbWlzc2lvbkVycm9yGAkgASgJSAOIAQESHAoPZGVwbG95bWVudEVycm9yGAogASgJSASIAQESKAobaGFzTXVsdGlwbGVDaGFuZ2VkU3ViZ3JhcGhzGAsgASgISAWIAQESJAoXdHJpZ2dlcmVkQnlTdWJncmFwaE5hbWUYDCABKAlIBogBARIgChNjb21wb3NpdGlvbldhcm5pbmdzGA0gASgJSAeIAQESJAoccm91dGVyX2NvbXBhdGliaWxpdHlfdmVyc2lvbhgOIAEoCRIgChhpc0ZlYXR1cmVGbGFnQ29tcG9zaXRpb24YDyABKAgSHAoPZmVhdHVyZUZsYWdOYW1lGBAgASgJSAiIAQFCFAoSX2NvbXBvc2l0aW9uRXJyb3JzQgwKCl9jcmVhdGVkQnlCGAoWX3JvdXRlckNvbmZpZ1NpZ25hdHVyZUIRCg9fYWRtaXNzaW9uRXJyb3JCEgoQX2RlcGxveW1lbnRFcnJvckIeChxfaGFzTXVsdGlwbGVDaGFuZ2VkU3ViZ3JhcGhzQhoKGF90cmlnZ2VyZWRCeVN1YmdyYXBoTmFtZUIWChRfY29tcG9zaXRpb25XYXJuaW5nc0ISChBfZmVhdHVyZUZsYWdOYW1lIskBChhHcmFwaENvbXBvc2l0aW9uU3ViZ3JhcGgSCgoCaWQYASABKAkSFwoPc2NoZW1hVmVyc2lvbklkGAIgASgJEgwKBG5hbWUYAyABKAkSEQoJdGFyZ2V0X2lkGAQgASgJEhkKEWlzRmVhdHVyZVN1YmdyYXBoGAUgASgIEhIKCmNoYW5nZVR5cGUYBiABKAkSOAoMc3ViZ3JhcGhUeXBlGAcgASgOMiIud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGhUeXBlIqwBChZHZXRDb21wb3NpdGlvbnNSZXF1ZXN0EhQKDGZlZEdyYXBoTmFtZRgBIAEoCRINCgVsaW1pdBgCIAEoBRIOCgZvZmZzZXQYAyABKAUSEQoJc3RhcnREYXRlGAQgASgJEg8KB2VuZERhdGUYBSABKAkSEQoJbmFtZXNwYWNlGAYgASgJEiYKHmV4Y2x1ZGVGZWF0dXJlRmxhZ0NvbXBvc2l0aW9ucxgHIAEoCCKYAQoXR2V0Q29tcG9zaXRpb25zUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI8Cgxjb21wb3NpdGlvbnMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HcmFwaENvbXBvc2l0aW9uEg0KBWNvdW50GAMgASgFIkgKHEdldENvbXBvc2l0aW9uRGV0YWlsc1JlcXVlc3QSFQoNY29tcG9zaXRpb25JZBgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkitQMKFkZlYXR1cmVGbGFnQ29tcG9zaXRpb24SCgoCaWQYASABKAkSFwoPc2NoZW1hVmVyc2lvbklkGAIgASgJEhEKCWNyZWF0ZWRBdBgDIAEoCRIUCgxpc0NvbXBvc2FibGUYBCABKAgSHgoRY29tcG9zaXRpb25FcnJvcnMYBSABKAlIAIgBARIWCgljcmVhdGVkQnkYBiABKAlIAYgBARIiChVyb3V0ZXJDb25maWdTaWduYXR1cmUYByABKAlIAogBARIbCg5hZG1pc3Npb25FcnJvchgIIAEoCUgDiAEBEhwKD2RlcGxveW1lbnRFcnJvchgJIAEoCUgEiAEBEhcKD2ZlYXR1cmVGbGFnTmFtZRgKIAEoCRIgChNjb21wb3NpdGlvbldhcm5pbmdzGAsgASgJSAWIAQFCFAoSX2NvbXBvc2l0aW9uRXJyb3JzQgwKCl9jcmVhdGVkQnlCGAoWX3JvdXRlckNvbmZpZ1NpZ25hdHVyZUIRCg9fYWRtaXNzaW9uRXJyb3JCEgoQX2RlcGxveW1lbnRFcnJvckIWChRfY29tcG9zaXRpb25XYXJuaW5ncyLlAgodR2V0Q29tcG9zaXRpb25EZXRhaWxzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI7Cgtjb21wb3NpdGlvbhgCIAEoCzImLndnLmNvc21vLnBsYXRmb3JtLnYxLkdyYXBoQ29tcG9zaXRpb24STAoUY29tcG9zaXRpb25TdWJncmFwaHMYAyADKAsyLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HcmFwaENvbXBvc2l0aW9uU3ViZ3JhcGgSOAoMY2hhbmdlQ291bnRzGAQgASgLMiIud2cuY29zbW8ucGxhdGZvcm0udjEuQ2hhbmdlQ291bnRzEk0KF2ZlYXR1cmVGbGFnQ29tcG9zaXRpb25zGAUgAygLMiwud2cuY29zbW8ucGxhdGZvcm0udjEuRmVhdHVyZUZsYWdDb21wb3NpdGlvbiJKChxHZXRTZGxCeVNjaGVtYVZlcnNpb25SZXF1ZXN0EhcKD3NjaGVtYVZlcnNpb25JZBgBIAEoCRIRCgl0YXJnZXRfaWQYAiABKAkidQodR2V0U2RsQnlTY2hlbWFWZXJzaW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRILCgNzZGwYAiABKAkSFQoNY2xpZW50X3NjaGVtYRgDIAEoCSI9CiJHZXRDaGFuZ2Vsb2dCeVNjaGVtYVZlcnNpb25SZXF1ZXN0EhcKD3NjaGVtYVZlcnNpb25JZBgBIAEoCSKfAQojR2V0Q2hhbmdlbG9nQnlTY2hlbWFWZXJzaW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJGCgljaGFuZ2Vsb2cYAiABKAsyMy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWRlcmF0ZWRHcmFwaENoYW5nZWxvZ091dHB1dCIjCiFHZXRVc2VyQWNjZXNzaWJsZVJlc291cmNlc1JlcXVlc3QiqwQKIkdldFVzZXJBY2Nlc3NpYmxlUmVzb3VyY2VzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJWCgpuYW1lc3BhY2VzGAIgAygLMkIud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0VXNlckFjY2Vzc2libGVSZXNvdXJjZXNSZXNwb25zZS5OYW1lc3BhY2USYAoPZmVkZXJhdGVkR3JhcGhzGAMgAygLMkcud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0VXNlckFjY2Vzc2libGVSZXNvdXJjZXNSZXNwb25zZS5GZWRlcmF0ZWRHcmFwaBJUCglzdWJncmFwaHMYBCADKAsyQS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRVc2VyQWNjZXNzaWJsZVJlc291cmNlc1Jlc3BvbnNlLlN1YkdyYXBoGiUKCU5hbWVzcGFjZRIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJGkMKDkZlZGVyYXRlZEdyYXBoEhAKCHRhcmdldElkGAEgASgJEgwKBG5hbWUYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJGlcKCFN1YkdyYXBoEhAKCHRhcmdldElkGAEgASgJEgwKBG5hbWUYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJEhgKEGZlZGVyYXRlZEdyYXBoSWQYBCABKAkiYAocVXBkYXRlRmVhdHVyZVNldHRpbmdzUmVxdWVzdBIOCgZlbmFibGUYASABKAgSMAoJZmVhdHVyZUlkGAIgASgOMh0ud2cuY29zbW8ucGxhdGZvcm0udjEuRmVhdHVyZSJRCh1VcGRhdGVGZWF0dXJlU2V0dGluZ3NSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIkQKGUdldFN1YmdyYXBoTWVtYmVyc1JlcXVlc3QSFAoMc3ViZ3JhcGhOYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCSJJCg5TdWJncmFwaE1lbWJlchIOCgZ1c2VySWQYASABKAkSDQoFZW1haWwYAiABKAkSGAoQc3ViZ3JhcGhNZW1iZXJJZBgEIAEoCSKFAQoaR2V0U3ViZ3JhcGhNZW1iZXJzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI1CgdtZW1iZXJzGAIgAygLMiQud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGhNZW1iZXIiSQoQQWRkUmVhZG1lUmVxdWVzdBISCgp0YXJnZXROYW1lGAEgASgJEg4KBnJlYWRtZRgCIAEoCRIRCgluYW1lc3BhY2UYAyABKAkiRQoRQWRkUmVhZG1lUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSLjAgoGUm91dGVyEhAKCGhvc3RuYW1lGAEgASgJEhMKC2NsdXN0ZXJOYW1lGAIgASgJEhMKC3NlcnZpY2VOYW1lGAMgASgJEhYKDnNlcnZpY2VWZXJzaW9uGAQgASgJEhkKEXNlcnZpY2VJbnN0YW5jZUlkGAUgASgJEhUKDXVwdGltZVNlY29uZHMYBiABKAkSGwoTc2VydmVyVXB0aW1lU2Vjb25kcxgHIAEoCRIVCg1jb21wb3NpdGlvbklkGAggASgJEhsKE29uTGF0ZXN0Q29tcG9zaXRpb24YCSABKAgSEQoJcHJvY2Vzc0lkGAogASgJEhUKDW1lbW9yeVVzYWdlTWIYCyABKAISIAoYbWVtb3J5VXNhZ2VDaGFuZ2VQZXJjZW50GAwgASgCEhcKD2NwdVVzYWdlUGVyY2VudBgNIAEoAhIdChVjcHVVc2FnZUNoYW5nZVBlcmNlbnQYDiABKAIiPAoRR2V0Um91dGVyc1JlcXVlc3QSFAoMZmVkR3JhcGhOYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCSJ1ChJHZXRSb3V0ZXJzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRItCgdyb3V0ZXJzGAIgAygLMhwud2cuY29zbW8ucGxhdGZvcm0udjEuUm91dGVyIuYBCgpDbGllbnRJbmZvEgwKBG5hbWUYASABKAkSCgoCaWQYAiABKAkSEQoJY3JlYXRlZEF0GAMgASgJEhUKDWxhc3RVcGRhdGVkQXQYBCABKAkSEQoJY3JlYXRlZEJ5GAUgASgJEhUKDWxhc3RVcGRhdGVkQnkYBiABKAkSJQoYcGVyc2lzdGVkT3BlcmF0aW9uc0NvdW50GAcgASgFSACIAQESFwoKaGFzVHJhZmZpYxgIIAEoCEgBiAEBQhsKGV9wZXJzaXN0ZWRPcGVyYXRpb25zQ291bnRCDQoLX2hhc1RyYWZmaWMiVAoRR2V0Q2xpZW50c1JlcXVlc3QSFAoMZmVkR3JhcGhOYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRIWCg5pbmNsdWRlVHJhZmZpYxgDIAEoCCJ5ChJHZXRDbGllbnRzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIxCgdjbGllbnRzGAIgAygLMiAud2cuY29zbW8ucGxhdGZvcm0udjEuQ2xpZW50SW5mbyJZChpQcmV2aWV3RGVsZXRlQ2xpZW50UmVxdWVzdBIUCgxmZWRHcmFwaE5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEhIKCmNsaWVudE5hbWUYAyABKAki0QEKG1ByZXZpZXdEZWxldGVDbGllbnRSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjAKBmNsaWVudBgCIAEoCzIgLndnLmNvc21vLnBsYXRmb3JtLnYxLkNsaWVudEluZm8SIAoYcGVyc2lzdGVkT3BlcmF0aW9uc0NvdW50GAMgASgFEhIKCmhhc1RyYWZmaWMYBCABKAgSGAoQb3JnYW5pemF0aW9uU2x1ZxgFIAEoCSJSChNEZWxldGVDbGllbnRSZXF1ZXN0EhQKDGZlZEdyYXBoTmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSEgoKY2xpZW50TmFtZRgDIAEoCSLgAQoURGVsZXRlQ2xpZW50UmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIwCgZjbGllbnQYAiABKAsyIC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DbGllbnRJbmZvEh4KFmRlbGV0ZWRPcGVyYXRpb25zQ291bnQYAyABKAUaRAoJT3BlcmF0aW9uEgoKAmlkGAEgASgJEhMKC29wZXJhdGlvbklkGAIgASgJEhYKDm9wZXJhdGlvbk5hbWVzGAMgAygJItQCChRHZXRGaWVsZFVzYWdlUmVxdWVzdBISCgpncmFwaF9uYW1lGAEgASgJEhYKCW5hbWVkVHlwZRgCIAEoCUgAiAEBEhUKCHR5cGVuYW1lGAMgASgJSAGIAQESEgoFZmllbGQYBCABKAlIAogBARISCgVyYW5nZRgFIAEoBUgDiAEBEjIKCWRhdGVSYW5nZRgGIAEoCzIfLndnLmNvc21vLnBsYXRmb3JtLnYxLkRhdGVSYW5nZRIRCgluYW1lc3BhY2UYByABKAkSHgoRZmVhdHVyZV9mbGFnX25hbWUYCCABKAlIBIgBARITCgtpc19hcmd1bWVudBgJIAEoCBIQCghpc19pbnB1dBgKIAEoCEIMCgpfbmFtZWRUeXBlQgsKCV90eXBlbmFtZUIICgZfZmllbGRCCAoGX3JhbmdlQhQKEl9mZWF0dXJlX2ZsYWdfbmFtZSK3AQoUQ2xpZW50V2l0aE9wZXJhdGlvbnMSDAoEbmFtZRgBIAEoCRIPCgd2ZXJzaW9uGAIgASgJEkgKCm9wZXJhdGlvbnMYAyADKAsyNC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DbGllbnRXaXRoT3BlcmF0aW9ucy5PcGVyYXRpb24aNgoJT3BlcmF0aW9uEgwKBGhhc2gYASABKAkSDAoEbmFtZRgCIAEoCRINCgVjb3VudBgDIAEoBSJfCg5GaWVsZFVzYWdlTWV0YRIUCgxzdWJncmFwaF9pZHMYASADKAkSGgoSZmlyc3RTZWVuVGltZXN0YW1wGAIgASgJEhsKE2xhdGVzdFNlZW5UaW1lc3RhbXAYAyABKAki+wEKFUdldEZpZWxkVXNhZ2VSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEj8KDnJlcXVlc3Rfc2VyaWVzGAIgAygLMicud2cuY29zbW8ucGxhdGZvcm0udjEuUmVxdWVzdFNlcmllc0l0ZW0SOwoHY2xpZW50cxgDIAMoCzIqLndnLmNvc21vLnBsYXRmb3JtLnYxLkNsaWVudFdpdGhPcGVyYXRpb25zEjIKBG1ldGEYBCABKAsyJC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GaWVsZFVzYWdlTWV0YSImChZDcmVhdGVOYW1lc3BhY2VSZXF1ZXN0EgwKBG5hbWUYASABKAkiSwoXQ3JlYXRlTmFtZXNwYWNlUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSImChZEZWxldGVOYW1lc3BhY2VSZXF1ZXN0EgwKBG5hbWUYASABKAkiSwoXRGVsZXRlTmFtZXNwYWNlUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSI4ChZSZW5hbWVOYW1lc3BhY2VSZXF1ZXN0EgwKBG5hbWUYASABKAkSEAoIbmV3X25hbWUYAiABKAkiSwoXUmVuYW1lTmFtZXNwYWNlUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSIlCglOYW1lc3BhY2USCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCSIWChRHZXROYW1lc3BhY2VzUmVxdWVzdCJ+ChVHZXROYW1lc3BhY2VzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIzCgpuYW1lc3BhY2VzGAIgAygLMh8ud2cuY29zbW8ucGxhdGZvcm0udjEuTmFtZXNwYWNlIp4BChBNb3ZlR3JhcGhSZXF1ZXN0EgwKBG5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEhUKDW5ld19uYW1lc3BhY2UYAyABKAkSLQogZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24YBCABKAhIAIgBAUIjCiFfZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24ikAIKEU1vdmVHcmFwaFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQQoRY29tcG9zaXRpb25FcnJvcnMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEj8KEGRlcGxveW1lbnRFcnJvcnMYAyADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZXBsb3ltZW50RXJyb3ISRQoTY29tcG9zaXRpb25XYXJuaW5ncxgEIAMoCzIoLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXBvc2l0aW9uV2FybmluZyIyCh1HZXROYW1lc3BhY2VMaW50Q29uZmlnUmVxdWVzdBIRCgluYW1lc3BhY2UYASABKAkinAEKHkdldE5hbWVzcGFjZUxpbnRDb25maWdSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEhUKDWxpbnRlckVuYWJsZWQYAiABKAgSMQoHY29uZmlncxgDIAMoCzIgLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpbnRDb25maWciOwomR2V0TmFtZXNwYWNlQ2hlY2tzQ29uZmlndXJhdGlvblJlcXVlc3QSEQoJbmFtZXNwYWNlGAEgASgJIpIBCidHZXROYW1lc3BhY2VDaGVja3NDb25maWd1cmF0aW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIXCg90aW1lZnJhbWVJbkRheXMYAiABKAUSHAoUdGltZWZyYW1lTGltaXRJbkRheXMYAyABKAUiVwopVXBkYXRlTmFtZXNwYWNlQ2hlY2tzQ29uZmlndXJhdGlvblJlcXVlc3QSEQoJbmFtZXNwYWNlGAEgASgJEhcKD3RpbWVmcmFtZUluRGF5cxgCIAEoBSJeCipVcGRhdGVOYW1lc3BhY2VDaGVja3NDb25maWd1cmF0aW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSJPCiNFbmFibGVMaW50aW5nRm9yVGhlTmFtZXNwYWNlUmVxdWVzdBIRCgluYW1lc3BhY2UYASABKAkSFQoNZW5hYmxlTGludGluZxgCIAEoCCJYCiRFbmFibGVMaW50aW5nRm9yVGhlTmFtZXNwYWNlUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSJZCgpMaW50Q29uZmlnEhAKCHJ1bGVOYW1lGAEgASgJEjkKDXNldmVyaXR5TGV2ZWwYAiABKA4yIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaW50U2V2ZXJpdHkiawojQ29uZmlndXJlTmFtZXNwYWNlTGludENvbmZpZ1JlcXVlc3QSEQoJbmFtZXNwYWNlGAEgASgJEjEKB2NvbmZpZ3MYAiADKAsyIC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaW50Q29uZmlnIlgKJENvbmZpZ3VyZU5hbWVzcGFjZUxpbnRDb25maWdSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIkoKGUVuYWJsZUdyYXBoUHJ1bmluZ1JlcXVlc3QSEQoJbmFtZXNwYWNlGAEgASgJEhoKEmVuYWJsZUdyYXBoUHJ1bmluZxgCIAEoCCJOChpFbmFibGVHcmFwaFBydW5pbmdSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIsgBChJHcmFwaFBydW5pbmdDb25maWcSEAoIcnVsZU5hbWUYASABKAkSOQoNc2V2ZXJpdHlMZXZlbBgCIAEoDjIiLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpbnRTZXZlcml0eRIZChFncmFjZVBlcmlvZEluRGF5cxgDIAEoBRIpChxzY2hlbWFVc2FnZUNoZWNrUGVyaW9kSW5EYXlzGAQgASgFSACIAQFCHwodX3NjaGVtYVVzYWdlQ2hlY2tQZXJpb2RJbkRheXMieworQ29uZmlndXJlTmFtZXNwYWNlR3JhcGhQcnVuaW5nQ29uZmlnUmVxdWVzdBIRCgluYW1lc3BhY2UYASABKAkSOQoHY29uZmlncxgCIAMoCzIoLndnLmNvc21vLnBsYXRmb3JtLnYxLkdyYXBoUHJ1bmluZ0NvbmZpZyJgCixDb25maWd1cmVOYW1lc3BhY2VHcmFwaFBydW5pbmdDb25maWdSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIjoKJUdldE5hbWVzcGFjZUdyYXBoUHJ1bmluZ0NvbmZpZ1JlcXVlc3QSEQoJbmFtZXNwYWNlGAEgASgJIrEBCiZHZXROYW1lc3BhY2VHcmFwaFBydW5pbmdDb25maWdSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEhoKEmdyYXBoUHJ1bmVyRW5hYmxlZBgCIAEoCBI5Cgdjb25maWdzGAMgAygLMigud2cuY29zbW8ucGxhdGZvcm0udjEuR3JhcGhQcnVuaW5nQ29uZmlnIjoKF01pZ3JhdGVNb25vZ3JhcGhSZXF1ZXN0EgwKBG5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJIkwKGE1pZ3JhdGVNb25vZ3JhcGhSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIiUKI0dldFVzZXJBY2Nlc3NpYmxlUGVybWlzc2lvbnNSZXF1ZXN0IjAKClBlcm1pc3Npb24SEwoLZGlzcGxheU5hbWUYASABKAkSDQoFdmFsdWUYAiABKAkijwEKJEdldFVzZXJBY2Nlc3NpYmxlUGVybWlzc2lvbnNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjUKC3Blcm1pc3Npb25zGAIgAygLMiAud2cuY29zbW8ucGxhdGZvcm0udjEuUGVybWlzc2lvbiLrAgoVQ3JlYXRlQ29udHJhY3RSZXF1ZXN0EgwKBG5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEhkKEXNvdXJjZV9ncmFwaF9uYW1lGAMgASgJEhMKC3JvdXRpbmdfdXJsGAQgASgJEh0KFWFkbWlzc2lvbl93ZWJob29rX3VybBgFIAEoCRIUCgxleGNsdWRlX3RhZ3MYBiADKAkSEwoGcmVhZG1lGAcgASgJSACIAQESJQoYYWRtaXNzaW9uX3dlYmhvb2tfc2VjcmV0GAggASgJSAGIAQESFAoMaW5jbHVkZV90YWdzGAkgAygJEi0KIGRpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uGAogASgISAKIAQFCCQoHX3JlYWRtZUIbChlfYWRtaXNzaW9uX3dlYmhvb2tfc2VjcmV0QiMKIV9kaXNhYmxlX3Jlc29sdmFiaWxpdHlfdmFsaWRhdGlvbiKVAgoWQ3JlYXRlQ29udHJhY3RSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkEKEWNvbXBvc2l0aW9uRXJyb3JzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchI/ChBkZXBsb3ltZW50RXJyb3JzGAMgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVwbG95bWVudEVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBCADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcihAMKFVVwZGF0ZUNvbnRyYWN0UmVxdWVzdBIMCgRuYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRIUCgxleGNsdWRlX3RhZ3MYAyADKAkSFAoMaW5jbHVkZV90YWdzGAQgAygJEhgKC3JvdXRpbmdfdXJsGAUgASgJSACIAQESIgoVYWRtaXNzaW9uX3dlYmhvb2tfdXJsGAYgASgJSAGIAQESJQoYYWRtaXNzaW9uX3dlYmhvb2tfc2VjcmV0GAcgASgJSAKIAQESEwoGcmVhZG1lGAggASgJSAOIAQESLQogZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24YCSABKAhIBIgBAUIOCgxfcm91dGluZ191cmxCGAoWX2FkbWlzc2lvbl93ZWJob29rX3VybEIbChlfYWRtaXNzaW9uX3dlYmhvb2tfc2VjcmV0QgkKB19yZWFkbWVCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uIpUCChZVcGRhdGVDb250cmFjdFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQQoRY29tcG9zaXRpb25FcnJvcnMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEj8KEGRlcGxveW1lbnRFcnJvcnMYAyADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZXBsb3ltZW50RXJyb3ISRQoTY29tcG9zaXRpb25XYXJuaW5ncxgEIAMoCzIoLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXBvc2l0aW9uV2FybmluZyIdChtJc01lbWJlckxpbWl0UmVhY2hlZFJlcXVlc3QifQocSXNNZW1iZXJMaW1pdFJlYWNoZWRSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEhUKDWxpbWl0X3JlYWNoZWQYAiABKAgSFAoMbWVtYmVyX2NvdW50GAMgASgFIhMKEURlbGV0ZVVzZXJSZXF1ZXN0IkYKEkRlbGV0ZVVzZXJSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIvABChhDcmVhdGVGZWF0dXJlRmxhZ1JlcXVlc3QSDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSKwoGbGFiZWxzGAMgAygLMhsud2cuY29zbW8ucGxhdGZvcm0udjEuTGFiZWwSHgoWZmVhdHVyZV9zdWJncmFwaF9uYW1lcxgEIAMoCRISCgppc19lbmFibGVkGAUgASgIEi0KIGRpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uGAYgASgISACIAQFCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uIpoCChlDcmVhdGVGZWF0dXJlRmxhZ1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQgoSY29tcG9zaXRpb25fZXJyb3JzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchJAChFkZXBsb3ltZW50X2Vycm9ycxgDIAMoCzIlLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlcGxveW1lbnRFcnJvchJFChNjb21wb3NpdGlvbldhcm5pbmdzGAQgAygLMigud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25XYXJuaW5nIvIBChhVcGRhdGVGZWF0dXJlRmxhZ1JlcXVlc3QSDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSKwoGbGFiZWxzGAMgAygLMhsud2cuY29zbW8ucGxhdGZvcm0udjEuTGFiZWwSHgoWZmVhdHVyZV9zdWJncmFwaF9uYW1lcxgEIAMoCRIUCgx1bnNldF9sYWJlbHMYBSABKAgSLQogZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24YBiABKAhIAIgBAUIjCiFfZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24ixAIKGVVwZGF0ZUZlYXR1cmVGbGFnUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJCChJjb21wb3NpdGlvbl9lcnJvcnMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEkAKEWRlcGxveW1lbnRfZXJyb3JzGAMgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVwbG95bWVudEVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBCADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcSGAoLaGFzX2NoYW5nZWQYBSABKAhIAIgBAUIOCgxfaGFzX2NoYW5nZWQioAEKGEVuYWJsZUZlYXR1cmVGbGFnUmVxdWVzdBIMCgRuYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRIPCgdlbmFibGVkGAMgASgIEi0KIGRpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uGAQgASgISACIAQFCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uIsQCChlFbmFibGVGZWF0dXJlRmxhZ1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQgoSY29tcG9zaXRpb25fZXJyb3JzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchJAChFkZXBsb3ltZW50X2Vycm9ycxgDIAMoCzIlLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlcGxveW1lbnRFcnJvchIYCgtoYXNfY2hhbmdlZBgEIAEoCEgAiAEBEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBSADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmdCDgoMX2hhc19jaGFuZ2VkIo8BChhEZWxldGVGZWF0dXJlRmxhZ1JlcXVlc3QSDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSLQogZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24YAyABKAhIAIgBAUIjCiFfZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24imgIKGURlbGV0ZUZlYXR1cmVGbGFnUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJCChJjb21wb3NpdGlvbl9lcnJvcnMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEkAKEWRlcGxveW1lbnRfZXJyb3JzGAMgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVwbG95bWVudEVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBCADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcitwEKC0ZlYXR1cmVGbGFnEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJEisKBmxhYmVscxgEIAMoCzIbLndnLmNvc21vLnBsYXRmb3JtLnYxLkxhYmVsEhIKCmlzX2VuYWJsZWQYBSABKAgSEgoKY3JlYXRlZF9ieRgGIAEoCRISCgpjcmVhdGVkX2F0GAcgASgJEhIKCnVwZGF0ZWRfYXQYCCABKAkiaAoWR2V0RmVhdHVyZUZsYWdzUmVxdWVzdBINCgVsaW1pdBgBIAEoBRIOCgZvZmZzZXQYAiABKAUSEQoJbmFtZXNwYWNlGAMgASgJEhIKBXF1ZXJ5GAQgASgJSACIAQFCCAoGX3F1ZXJ5IpoBChdHZXRGZWF0dXJlRmxhZ3NSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjgKDWZlYXR1cmVfZmxhZ3MYAiADKAsyIS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWF0dXJlRmxhZxITCgt0b3RhbF9jb3VudBgDIAEoBSI+ChtHZXRGZWF0dXJlRmxhZ0J5TmFtZVJlcXVlc3QSDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkijAMKHEdldEZlYXR1cmVGbGFnQnlOYW1lUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI3CgxmZWF0dXJlX2ZsYWcYAiABKAsyIS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWF0dXJlRmxhZxJdChBmZWRlcmF0ZWRfZ3JhcGhzGAMgAygLMkMud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVhdHVyZUZsYWdCeU5hbWVSZXNwb25zZS5GZkZlZGVyYXRlZEdyYXBoEjkKEWZlYXR1cmVfc3ViZ3JhcGhzGAQgAygLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGgaZwoQRmZGZWRlcmF0ZWRHcmFwaBI9Cg9mZWRlcmF0ZWRfZ3JhcGgYASABKAsyJC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWRlcmF0ZWRHcmFwaBIUCgxpc19jb25uZWN0ZWQYAiABKAgiVwonR2V0RmVhdHVyZVN1YmdyYXBoc0J5RmVhdHVyZUZsYWdSZXF1ZXN0EhkKEWZlYXR1cmVfZmxhZ19uYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCSKXAQooR2V0RmVhdHVyZVN1YmdyYXBoc0J5RmVhdHVyZUZsYWdSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjkKEWZlYXR1cmVfc3ViZ3JhcGhzGAIgAygLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGgibAoaR2V0RmVhdHVyZVN1YmdyYXBoc1JlcXVlc3QSDQoFbGltaXQYASABKAUSDgoGb2Zmc2V0GAIgASgFEhEKCW5hbWVzcGFjZRgDIAEoCRISCgVxdWVyeRgEIAEoCUgAiAEBQggKBl9xdWVyeSKZAQobR2V0RmVhdHVyZVN1YmdyYXBoc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USOQoRZmVhdHVyZV9zdWJncmFwaHMYAiADKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TdWJncmFwaBINCgVjb3VudBgDIAEoBSKWAQomR2V0RmVhdHVyZUZsYWdzQnlGZWRlcmF0ZWRHcmFwaFJlcXVlc3QSHAoUZmVkZXJhdGVkX2dyYXBoX25hbWUYASABKAkSDQoFbGltaXQYAiABKAUSDgoGb2Zmc2V0GAMgASgFEhEKCW5hbWVzcGFjZRgEIAEoCRISCgVxdWVyeRgFIAEoCUgAiAEBQggKBl9xdWVyeSKqAQonR2V0RmVhdHVyZUZsYWdzQnlGZWRlcmF0ZWRHcmFwaFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USOAoNZmVhdHVyZV9mbGFncxgCIAMoCzIhLndnLmNvc21vLnBsYXRmb3JtLnYxLkZlYXR1cmVGbGFnEhMKC3RvdGFsX2NvdW50GAMgASgFImwKOUdldEZlYXR1cmVGbGFnc0luTGF0ZXN0Q29tcG9zaXRpb25CeUZlZGVyYXRlZEdyYXBoUmVxdWVzdBIcChRmZWRlcmF0ZWRfZ3JhcGhfbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkiqAEKOkdldEZlYXR1cmVGbGFnc0luTGF0ZXN0Q29tcG9zaXRpb25CeUZlZGVyYXRlZEdyYXBoUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI4Cg1mZWF0dXJlX2ZsYWdzGAIgAygLMiEud2cuY29zbW8ucGxhdGZvcm0udjEuRmVhdHVyZUZsYWcimgEKKkdldEZlYXR1cmVTdWJncmFwaHNCeUZlZGVyYXRlZEdyYXBoUmVxdWVzdBIcChRmZWRlcmF0ZWRfZ3JhcGhfbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSDQoFbGltaXQYAyABKAUSDgoGb2Zmc2V0GAQgASgFEhIKBXF1ZXJ5GAUgASgJSACIAQFCCAoGX3F1ZXJ5Iq8BCitHZXRGZWF0dXJlU3ViZ3JhcGhzQnlGZWRlcmF0ZWRHcmFwaFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USOQoRZmVhdHVyZV9zdWJncmFwaHMYAiADKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TdWJncmFwaBITCgt0b3RhbF9jb3VudBgDIAEoBSLBAQokR2V0T3JnYW5pemF0aW9uV2ViaG9va0hpc3RvcnlSZXF1ZXN0EjQKCnBhZ2luYXRpb24YASABKAsyIC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QYWdpbmF0aW9uEjMKCmRhdGVfcmFuZ2UYAiABKAsyHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EYXRlUmFuZ2USGwoOZmlsdGVyX2J5X3R5cGUYAyABKAlIAIgBAUIRCg9fZmlsdGVyX2J5X3R5cGUi+wMKD1dlYmhvb2tEZWxpdmVyeRIKCgJpZBgBIAEoCRISCgpjcmVhdGVkX2F0GAIgASgJEhcKCmNyZWF0ZWRfYnkYAyABKAlIAIgBARIMCgR0eXBlGAQgASgJEhAKCGVuZHBvaW50GAUgASgJEhIKCmV2ZW50X25hbWUYBiABKAkSDwoHcGF5bG9hZBgHIAEoCRIXCg9yZXF1ZXN0X2hlYWRlcnMYCCABKAkSHQoQcmVzcG9uc2VfaGVhZGVycxgJIAEoCUgBiAEBEiEKFHJlc3BvbnNlX3N0YXR1c19jb2RlGAogASgFSAKIAQESIAoTcmVzcG9uc2VfZXJyb3JfY29kZRgLIAEoCUgDiAEBEhoKDWVycm9yX21lc3NhZ2UYDCABKAlIBIgBARIaCg1yZXNwb25zZV9ib2R5GA0gASgJSAWIAQESEwoLcmV0cnlfY291bnQYDiABKAUSEAoIZHVyYXRpb24YDyABKAISFQoNaXNfcmVkZWxpdmVyeRgQIAEoCEINCgtfY3JlYXRlZF9ieUITChFfcmVzcG9uc2VfaGVhZGVyc0IXChVfcmVzcG9uc2Vfc3RhdHVzX2NvZGVCFgoUX3Jlc3BvbnNlX2Vycm9yX2NvZGVCEAoOX2Vycm9yX21lc3NhZ2VCEAoOX3Jlc3BvbnNlX2JvZHkiqQEKJUdldE9yZ2FuaXphdGlvbldlYmhvb2tIaXN0b3J5UmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI5CgpkZWxpdmVyaWVzGAIgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuV2ViaG9va0RlbGl2ZXJ5EhMKC3RvdGFsX2NvdW50GAMgASgFIiUKF1JlZGVsaXZlcldlYmhvb2tSZXF1ZXN0EgoKAmlkGAEgASgJIkwKGFJlZGVsaXZlcldlYmhvb2tSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIi4KIEdldFdlYmhvb2tEZWxpdmVyeURldGFpbHNSZXF1ZXN0EgoKAmlkGAEgASgJIo4BCiFHZXRXZWJob29rRGVsaXZlcnlEZXRhaWxzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI3CghkZWxpdmVyeRgCIAEoCzIlLndnLmNvc21vLnBsYXRmb3JtLnYxLldlYmhvb2tEZWxpdmVyeSJNCh1DcmVhdGVQbGF5Z3JvdW5kU2NyaXB0UmVxdWVzdBINCgV0aXRsZRgBIAEoCRIMCgR0eXBlGAIgASgJEg8KB2NvbnRlbnQYAyABKAkiUgoeQ3JlYXRlUGxheWdyb3VuZFNjcmlwdFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiKwodRGVsZXRlUGxheWdyb3VuZFNjcmlwdFJlcXVlc3QSCgoCaWQYASABKAkiUgoeRGVsZXRlUGxheWdyb3VuZFNjcmlwdFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiSwodVXBkYXRlUGxheWdyb3VuZFNjcmlwdFJlcXVlc3QSCgoCaWQYASABKAkSDQoFdGl0bGUYAiABKAkSDwoHY29udGVudBgDIAEoCSJSCh5VcGRhdGVQbGF5Z3JvdW5kU2NyaXB0UmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSIrChtHZXRQbGF5Z3JvdW5kU2NyaXB0c1JlcXVlc3QSDAoEdHlwZRgBIAEoCSJMChBQbGF5Z3JvdW5kU2NyaXB0EgoKAmlkGAEgASgJEgwKBHR5cGUYAiABKAkSDQoFdGl0bGUYAyABKAkSDwoHY29udGVudBgEIAEoCSKJAQocR2V0UGxheWdyb3VuZFNjcmlwdHNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjcKB3NjcmlwdHMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QbGF5Z3JvdW5kU2NyaXB0IkIKHEdldEZlZGVyYXRlZEdyYXBoQnlJZFJlcXVlc3QSCgoCaWQYASABKAkSFgoOaW5jbHVkZU1ldHJpY3MYAiABKAgi3wIKHUdldEZlZGVyYXRlZEdyYXBoQnlJZFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USMwoFZ3JhcGgYAiABKAsyJC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWRlcmF0ZWRHcmFwaBIxCglzdWJncmFwaHMYAyADKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TdWJncmFwaBIZChFncmFwaFJlcXVlc3RUb2tlbhgEIAEoCRJPCiRmZWF0dXJlRmxhZ3NJbkxhdGVzdFZhbGlkQ29tcG9zaXRpb24YBSADKAsyIS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWF0dXJlRmxhZxI4ChBmZWF0dXJlU3ViZ3JhcGhzGAYgAygLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGgiJAoWR2V0U3ViZ3JhcGhCeUlkUmVxdWVzdBIKCgJpZBgBIAEoCSKxAQoXR2V0U3ViZ3JhcGhCeUlkUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRItCgVncmFwaBgCIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlN1YmdyYXBoEjUKB21lbWJlcnMYAyADKAsyJC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TdWJncmFwaE1lbWJlciIvChNHZXROYW1lc3BhY2VSZXF1ZXN0EgwKBG5hbWUYASABKAkSCgoCaWQYAiABKAkifAoUR2V0TmFtZXNwYWNlUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIyCgluYW1lc3BhY2UYAiABKAsyHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5OYW1lc3BhY2UibQoSV29ya3NwYWNlTmFtZXNwYWNlEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSPQoGZ3JhcGhzGAMgAygLMi0ud2cuY29zbW8ucGxhdGZvcm0udjEuV29ya3NwYWNlRmVkZXJhdGVkR3JhcGgilQEKF1dvcmtzcGFjZUZlZGVyYXRlZEdyYXBoEgoKAmlkGAEgASgJEhAKCHRhcmdldElkGAIgASgJEgwKBG5hbWUYAyABKAkSEgoKaXNDb250cmFjdBgEIAEoCBI6CglzdWJncmFwaHMYBSADKAsyJy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Xb3Jrc3BhY2VTdWJncmFwaCI/ChFXb3Jrc3BhY2VTdWJncmFwaBIKCgJpZBgBIAEoCRIQCgh0YXJnZXRJZBgCIAEoCRIMCgRuYW1lGAMgASgJIhUKE0dldFdvcmtzcGFjZVJlcXVlc3QihgEKFEdldFdvcmtzcGFjZVJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USPAoKbmFtZXNwYWNlcxgCIAMoCzIoLndnLmNvc21vLnBsYXRmb3JtLnYxLldvcmtzcGFjZU5hbWVzcGFjZSKfAQofUHVzaENhY2hlV2FybWVyT3BlcmF0aW9uUmVxdWVzdBIaChJmZWRlcmF0ZWRHcmFwaE5hbWUYASABKAkSGAoQb3BlcmF0aW9uQ29udGVudBgCIAEoCRIVCg1vcGVyYXRpb25OYW1lGAMgASgJEhwKFG9wZXJhdGlvblBlcnNpc3RlZElkGAQgASgJEhEKCW5hbWVzcGFjZRgFIAEoCSJUCiBQdXNoQ2FjaGVXYXJtZXJPcGVyYXRpb25SZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIm8KH0dldENhY2hlV2FybWVyT3BlcmF0aW9uc1JlcXVlc3QSGgoSZmVkZXJhdGVkR3JhcGhOYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRINCgVsaW1pdBgDIAEoBRIOCgZvZmZzZXQYBCABKAUiiAIKFENhY2hlV2FybWVyT3BlcmF0aW9uEgoKAmlkGAEgASgJEhgKEG9wZXJhdGlvbkNvbnRlbnQYAiABKAkSFQoNb3BlcmF0aW9uTmFtZRgDIAEoCRIcChRvcGVyYXRpb25QZXJzaXN0ZWRJZBgEIAEoCRIVCg1vcGVyYXRpb25IYXNoGAUgASgJEhIKCmNsaWVudE5hbWUYBiABKAkSFQoNY2xpZW50VmVyc2lvbhgHIAEoCRIUCgxwbGFubmluZ1RpbWUYCCABKAISFwoPaXNNYW51YWxseUFkZGVkGAkgASgIEhEKCWNyZWF0ZWRBdBgKIAEoCRIRCgljcmVhdGVkQnkYCyABKAkixwEKIEdldENhY2hlV2FybWVyT3BlcmF0aW9uc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USPgoKb3BlcmF0aW9ucxgCIAMoCzIqLndnLmNvc21vLnBsYXRmb3JtLnYxLkNhY2hlV2FybWVyT3BlcmF0aW9uEhMKC3RvdGFsX2NvdW50GAMgASgFEhwKFGlzQ2FjaGVXYXJtZXJFbmFibGVkGAQgASgIIlQKI0NvbXB1dGVDYWNoZVdhcm1lck9wZXJhdGlvbnNSZXF1ZXN0EhoKEmZlZGVyYXRlZEdyYXBoTmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkiWAokQ29tcHV0ZUNhY2hlV2FybWVyT3BlcmF0aW9uc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiZwobQ29uZmlndXJlQ2FjaGVXYXJtZXJSZXF1ZXN0EhEKCW5hbWVzcGFjZRgBIAEoCRIZChFlbmFibGVDYWNoZVdhcm1lchgCIAEoCBIaChJtYXhPcGVyYXRpb25zQ291bnQYAyABKAUiUAocQ29uZmlndXJlQ2FjaGVXYXJtZXJSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIjAKG0dldENhY2hlV2FybWVyQ29uZmlnUmVxdWVzdBIRCgluYW1lc3BhY2UYASABKAkiigEKHEdldENhY2hlV2FybWVyQ29uZmlnUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIcChRpc0NhY2hlV2FybWVyRW5hYmxlZBgCIAEoCBIaChJtYXhPcGVyYXRpb25zQ291bnQYAyABKAUiPAonR2V0U3ViZ3JhcGhDaGVja0V4dGVuc2lvbnNDb25maWdSZXF1ZXN0EhEKCW5hbWVzcGFjZRgBIAEoCSKUAwooR2V0U3ViZ3JhcGhDaGVja0V4dGVuc2lvbnNDb25maWdSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEh0KFWlzRW5hYmxlZEZvck5hbWVzcGFjZRgCIAEoCBIkChxpc0xpbnRpbmdFbmFibGVkRm9yTmFtZXNwYWNlGAMgASgIEikKIWlzR3JhcGhQcnVuaW5nRW5hYmxlZEZvck5hbWVzcGFjZRgEIAEoCBIQCghlbmRwb2ludBgFIAEoCRIbChNpc1NlY3JldEtleUFzc2lnbmVkGAYgASgIEhoKEmluY2x1ZGVDb21wb3NlZFNkbBgHIAEoCBIcChRpbmNsdWRlTGludGluZ0lzc3VlcxgIIAEoCBIcChRpbmNsdWRlUHJ1bmluZ0lzc3VlcxgJIAEoCBIcChRpbmNsdWRlU2NoZW1hQ2hhbmdlcxgKIAEoCBIhChlpbmNsdWRlQWZmZWN0ZWRPcGVyYXRpb25zGAsgASgIIrQCCidDb25maWd1cmVTdWJncmFwaENoZWNrRXh0ZW5zaW9uc1JlcXVlc3QSEQoJbmFtZXNwYWNlGAEgASgJEiUKHWVuYWJsZVN1YmdyYXBoQ2hlY2tFeHRlbnNpb25zGAIgASgIEhAKCGVuZHBvaW50GAMgASgJEhYKCXNlY3JldEtleRgEIAEoCUgAiAEBEhoKEmluY2x1ZGVDb21wb3NlZFNkbBgFIAEoCBIcChRpbmNsdWRlTGludGluZ0lzc3VlcxgGIAEoCBIcChRpbmNsdWRlUHJ1bmluZ0lzc3VlcxgHIAEoCBIcChRpbmNsdWRlU2NoZW1hQ2hhbmdlcxgIIAEoCBIhChlpbmNsdWRlQWZmZWN0ZWRPcGVyYXRpb25zGAkgASgIQgwKCl9zZWNyZXRLZXkiXAooQ29uZmlndXJlU3ViZ3JhcGhDaGVja0V4dGVuc2lvbnNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIl4KIURlbGV0ZUNhY2hlV2FybWVyT3BlcmF0aW9uUmVxdWVzdBIKCgJpZBgBIAEoCRIaChJmZWRlcmF0ZWRHcmFwaE5hbWUYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJIlYKIkRlbGV0ZUNhY2hlV2FybWVyT3BlcmF0aW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSIoCiZMaXN0Um91dGVyQ29tcGF0aWJpbGl0eVZlcnNpb25zUmVxdWVzdCJtCidMaXN0Um91dGVyQ29tcGF0aWJpbGl0eVZlcnNpb25zUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIQCgh2ZXJzaW9ucxgCIAMoCSKxAQopU2V0R3JhcGhSb3V0ZXJDb21wYXRpYmlsaXR5VmVyc2lvblJlcXVlc3QSDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSDwoHdmVyc2lvbhgDIAEoCRItCiBkaXNhYmxlX3Jlc29sdmFiaWxpdHlfdmFsaWRhdGlvbhgEIAEoCEgAiAEBQiMKIV9kaXNhYmxlX3Jlc29sdmFiaWxpdHlfdmFsaWRhdGlvbiLYAgoqU2V0R3JhcGhSb3V0ZXJDb21wYXRpYmlsaXR5VmVyc2lvblJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USGAoQcHJldmlvdXNfdmVyc2lvbhgCIAEoCRITCgtuZXdfdmVyc2lvbhgDIAEoCRJBChFjb21wb3NpdGlvbkVycm9ycxgEIAMoCzImLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXBvc2l0aW9uRXJyb3ISPwoQZGVwbG95bWVudEVycm9ycxgFIAMoCzIlLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlcGxveW1lbnRFcnJvchJFChNjb21wb3NpdGlvbldhcm5pbmdzGAYgAygLMigud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25XYXJuaW5nImsKKUdldFByb3Bvc2VkU2NoZW1hT2ZDaGVja2VkU3ViZ3JhcGhSZXF1ZXN0Eg8KB2NoZWNrSWQYASABKAkSGQoRY2hlY2tlZFN1YmdyYXBoSWQYAiABKAkSEgoKc3ViZ3JhcGhJZBgDIAEoCSJ2CipHZXRQcm9wb3NlZFNjaGVtYU9mQ2hlY2tlZFN1YmdyYXBoUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIWCg5wcm9wb3NlZFNjaGVtYRgCIAEoCSK4AgoIUHJvcG9zYWwSCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCRIRCgljcmVhdGVkQXQYAyABKAkSFgoOY3JlYXRlZEJ5RW1haWwYBCABKAkSDQoFc3RhdGUYBSABKAkSGAoQZmVkZXJhdGVkR3JhcGhJZBgGIAEoCRIaChJmZWRlcmF0ZWRHcmFwaE5hbWUYByABKAkSOQoJc3ViZ3JhcGhzGAggAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuUHJvcG9zYWxTdWJncmFwaBIaChJsYXRlc3RDaGVja1N1Y2Nlc3MYCSABKAgSFQoNbGF0ZXN0Q2hlY2tJZBgKIAEoCRI0CgZvcmlnaW4YCyABKA4yJC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Qcm9wb3NhbE9yaWdpbiKCAQoQUHJvcG9zYWxTdWJncmFwaBIMCgRuYW1lGAEgASgJEhEKCXNjaGVtYVNETBgCIAEoCRIRCglpc0RlbGV0ZWQYAyABKAgSDQoFaXNOZXcYBCABKAgSKwoGbGFiZWxzGAUgAygLMhsud2cuY29zbW8ucGxhdGZvcm0udjEuTGFiZWwijwIKFUNyZWF0ZVByb3Bvc2FsUmVxdWVzdBIaChJmZWRlcmF0ZWRHcmFwaE5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEgwKBG5hbWUYAyABKAkSOQoJc3ViZ3JhcGhzGAQgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuUHJvcG9zYWxTdWJncmFwaBJIChBuYW1pbmdDb252ZW50aW9uGAUgASgOMi4ud2cuY29zbW8ucGxhdGZvcm0udjEuUHJvcG9zYWxOYW1pbmdDb252ZW50aW9uEjQKBm9yaWdpbhgGIAEoDjIkLndnLmNvc21vLnBsYXRmb3JtLnYxLlByb3Bvc2FsT3JpZ2luItAIChZDcmVhdGVQcm9wb3NhbFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USEgoKcHJvcG9zYWxJZBgCIAEoCRIPCgdjaGVja0lkGAMgASgJEjsKD2JyZWFraW5nQ2hhbmdlcxgEIAMoCzIiLndnLmNvc21vLnBsYXRmb3JtLnYxLlNjaGVtYUNoYW5nZRI+ChJub25CcmVha2luZ0NoYW5nZXMYBSADKAsyIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TY2hlbWFDaGFuZ2USQQoRY29tcG9zaXRpb25FcnJvcnMYBiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYByADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcSMwoKbGludEVycm9ycxgIIAMoCzIfLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpbnRJc3N1ZRI1CgxsaW50V2FybmluZ3MYCSADKAsyHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaW50SXNzdWUSQQoQZ3JhcGhQcnVuZUVycm9ycxgKIAMoCzInLndnLmNvc21vLnBsYXRmb3JtLnYxLkdyYXBoUHJ1bmluZ0lzc3VlEkMKEmdyYXBoUHJ1bmVXYXJuaW5ncxgLIAMoCzInLndnLmNvc21vLnBsYXRmb3JtLnYxLkdyYXBoUHJ1bmluZ0lzc3VlEksKE29wZXJhdGlvblVzYWdlU3RhdHMYDCABKAsyLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DaGVja09wZXJhdGlvblVzYWdlU3RhdHMSFgoObGludGluZ1NraXBwZWQYDSABKAgSGwoTZ3JhcGhQcnVuaW5nU2tpcHBlZBgOIAEoCBIQCghjaGVja1VybBgPIAEoCRITCgtwcm9wb3NhbFVybBgQIAEoCRIUCgxwcm9wb3NhbE5hbWUYESABKAkSJwoaaXNMaW5rZWRUcmFmZmljQ2hlY2tGYWlsZWQYEiABKAhIAIgBARInChppc0xpbmtlZFBydW5pbmdDaGVja0ZhaWxlZBgTIAEoCEgBiAEBEiIKFWhhc0xpbmtlZFNjaGVtYUNoZWNrcxgUIAEoCEgCiAEBElcKHWNvbXBvc2VkU2NoZW1hQnJlYWtpbmdDaGFuZ2VzGBUgAygLMjAud2cuY29zbW8ucGxhdGZvcm0udjEuRmVkZXJhdGVkR3JhcGhTY2hlbWFDaGFuZ2VCHQobX2lzTGlua2VkVHJhZmZpY0NoZWNrRmFpbGVkQh0KG19pc0xpbmtlZFBydW5pbmdDaGVja0ZhaWxlZEIYChZfaGFzTGlua2VkU2NoZW1hQ2hlY2tzIigKEkdldFByb3Bvc2FsUmVxdWVzdBISCgpwcm9wb3NhbElkGAEgASgJIoICChNHZXRQcm9wb3NhbFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USMAoIcHJvcG9zYWwYAiABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Qcm9wb3NhbBJTChBjdXJyZW50U3ViZ3JhcGhzGAMgAygLMjkud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0UHJvcG9zYWxSZXNwb25zZS5DdXJyZW50U3ViZ3JhcGgaMgoPQ3VycmVudFN1YmdyYXBoEgwKBG5hbWUYASABKAkSEQoJc2NoZW1hU0RMGAIgASgJIpcBCiNHZXRQcm9wb3NhbHNCeUZlZGVyYXRlZEdyYXBoUmVxdWVzdBIaChJmZWRlcmF0ZWRHcmFwaE5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEhEKCXN0YXJ0RGF0ZRgDIAEoCRIPCgdlbmREYXRlGAQgASgJEg0KBWxpbWl0GAUgASgFEg4KBm9mZnNldBgGIAEoBSK7AQokR2V0UHJvcG9zYWxzQnlGZWRlcmF0ZWRHcmFwaFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USMQoJcHJvcG9zYWxzGAIgAygLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUHJvcG9zYWwSGgoSaXNQcm9wb3NhbHNFbmFibGVkGAMgASgIEhIKCnRvdGFsQ291bnQYBCABKAUicQoYR2V0UHJvcG9zYWxDaGVja3NSZXF1ZXN0EhIKCnByb3Bvc2FsSWQYASABKAkSDQoFbGltaXQYAiABKAUSDgoGb2Zmc2V0GAMgASgFEhEKCXN0YXJ0RGF0ZRgEIAEoCRIPCgdlbmREYXRlGAUgASgJIpoBChlHZXRQcm9wb3NhbENoZWNrc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USMQoGY2hlY2tzGAIgAygLMiEud2cuY29zbW8ucGxhdGZvcm0udjEuU2NoZW1hQ2hlY2sSGAoQdG90YWxDaGVja3NDb3VudBgDIAEoBSK1AgoVVXBkYXRlUHJvcG9zYWxSZXF1ZXN0EhQKDHByb3Bvc2FsTmFtZRgBIAEoCRIaChJmZWRlcmF0ZWRHcmFwaE5hbWUYAiABKAkSDwoFc3RhdGUYAyABKAlIABJfChB1cGRhdGVkU3ViZ3JhcGhzGAQgASgLMkMud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlUHJvcG9zYWxSZXF1ZXN0LlVwZGF0ZVByb3Bvc2FsU3ViZ3JhcGhzSAASEQoJbmFtZXNwYWNlGAUgASgJGlQKF1VwZGF0ZVByb3Bvc2FsU3ViZ3JhcGhzEjkKCXN1YmdyYXBocxgBIAMoCzImLndnLmNvc21vLnBsYXRmb3JtLnYxLlByb3Bvc2FsU3ViZ3JhcGhCDwoNdXBkYXRlX2FjdGlvbiKRCAoWVXBkYXRlUHJvcG9zYWxSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEg8KB2NoZWNrSWQYAiABKAkSOwoPYnJlYWtpbmdDaGFuZ2VzGAMgAygLMiIud2cuY29zbW8ucGxhdGZvcm0udjEuU2NoZW1hQ2hhbmdlEj4KEm5vbkJyZWFraW5nQ2hhbmdlcxgEIAMoCzIiLndnLmNvc21vLnBsYXRmb3JtLnYxLlNjaGVtYUNoYW5nZRJBChFjb21wb3NpdGlvbkVycm9ycxgFIAMoCzImLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXBvc2l0aW9uRXJyb3ISRQoTY29tcG9zaXRpb25XYXJuaW5ncxgGIAMoCzIoLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXBvc2l0aW9uV2FybmluZxIzCgpsaW50RXJyb3JzGAcgAygLMh8ud2cuY29zbW8ucGxhdGZvcm0udjEuTGludElzc3VlEjUKDGxpbnRXYXJuaW5ncxgIIAMoCzIfLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpbnRJc3N1ZRJBChBncmFwaFBydW5lRXJyb3JzGAkgAygLMicud2cuY29zbW8ucGxhdGZvcm0udjEuR3JhcGhQcnVuaW5nSXNzdWUSQwoSZ3JhcGhQcnVuZVdhcm5pbmdzGAogAygLMicud2cuY29zbW8ucGxhdGZvcm0udjEuR3JhcGhQcnVuaW5nSXNzdWUSSwoTb3BlcmF0aW9uVXNhZ2VTdGF0cxgLIAEoCzIuLndnLmNvc21vLnBsYXRmb3JtLnYxLkNoZWNrT3BlcmF0aW9uVXNhZ2VTdGF0cxIWCg5saW50aW5nU2tpcHBlZBgMIAEoCBIbChNncmFwaFBydW5pbmdTa2lwcGVkGA0gASgIEhAKCGNoZWNrVXJsGA4gASgJEicKGmlzTGlua2VkVHJhZmZpY0NoZWNrRmFpbGVkGA8gASgISACIAQESJwoaaXNMaW5rZWRQcnVuaW5nQ2hlY2tGYWlsZWQYECABKAhIAYgBARIiChVoYXNMaW5rZWRTY2hlbWFDaGVja3MYESABKAhIAogBARJXCh1jb21wb3NlZFNjaGVtYUJyZWFraW5nQ2hhbmdlcxgSIAMoCzIwLndnLmNvc21vLnBsYXRmb3JtLnYxLkZlZGVyYXRlZEdyYXBoU2NoZW1hQ2hhbmdlQh0KG19pc0xpbmtlZFRyYWZmaWNDaGVja0ZhaWxlZEIdChtfaXNMaW5rZWRQcnVuaW5nQ2hlY2tGYWlsZWRCGAoWX2hhc0xpbmtlZFNjaGVtYUNoZWNrcyJQCiJFbmFibGVQcm9wb3NhbHNGb3JOYW1lc3BhY2VSZXF1ZXN0EhEKCW5hbWVzcGFjZRgBIAEoCRIXCg9lbmFibGVQcm9wb3NhbHMYAiABKAgiVwojRW5hYmxlUHJvcG9zYWxzRm9yTmFtZXNwYWNlUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSK+AQonQ29uZmlndXJlTmFtZXNwYWNlUHJvcG9zYWxDb25maWdSZXF1ZXN0EhEKCW5hbWVzcGFjZRgBIAEoCRI+ChJjaGVja1NldmVyaXR5TGV2ZWwYAiABKA4yIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaW50U2V2ZXJpdHkSQAoUcHVibGlzaFNldmVyaXR5TGV2ZWwYAyABKA4yIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaW50U2V2ZXJpdHkiXAooQ29uZmlndXJlTmFtZXNwYWNlUHJvcG9zYWxDb25maWdSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIjYKIUdldE5hbWVzcGFjZVByb3Bvc2FsQ29uZmlnUmVxdWVzdBIRCgluYW1lc3BhY2UYASABKAki6QEKIkdldE5hbWVzcGFjZVByb3Bvc2FsQ29uZmlnUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIPCgdlbmFibGVkGAIgASgIEj4KEmNoZWNrU2V2ZXJpdHlMZXZlbBgDIAEoDjIiLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpbnRTZXZlcml0eRJAChRwdWJsaXNoU2V2ZXJpdHlMZXZlbBgEIAEoDjIiLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpbnRTZXZlcml0eSKrAQobTmFtZXNwYWNlTG9naW5NZXRob2RNYXBwaW5nEhQKDG5hbWVzcGFjZV9pZBgBIAEoCRIgChhhbGxvd2VkX3Nzb19wcm92aWRlcl9pZHMYAiADKAkSHAoUYWxsb3dfcGFzc3dvcmRfbG9naW4YAyABKAgSGgoSYWxsb3dfZ29vZ2xlX2xvZ2luGAQgASgIEhoKEmFsbG93X2dpdGh1Yl9sb2dpbhgFIAEoCCJpCiJVcGRhdGVOYW1lc3BhY2VMb2dpbk1ldGhvZHNSZXF1ZXN0EkMKCG1hcHBpbmdzGAEgAygLMjEud2cuY29zbW8ucGxhdGZvcm0udjEuTmFtZXNwYWNlTG9naW5NZXRob2RNYXBwaW5nIlcKI1VwZGF0ZU5hbWVzcGFjZUxvZ2luTWV0aG9kc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiIgogTGlzdE5hbWVzcGFjZUxvZ2luTWV0aG9kc1JlcXVlc3QimgEKIUxpc3ROYW1lc3BhY2VMb2dpbk1ldGhvZHNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkMKCG1hcHBpbmdzGAIgAygLMjEud2cuY29zbW8ucGxhdGZvcm0udjEuTmFtZXNwYWNlTG9naW5NZXRob2RNYXBwaW5nIqkBChhPcmdhbml6YXRpb25Mb2dpbk1ldGhvZHMSIAoYYWxsb3dlZF9zc29fcHJvdmlkZXJfaWRzGAEgAygJEhwKFGFsbG93X3Bhc3N3b3JkX2xvZ2luGAIgASgIEhoKEmFsbG93X2dvb2dsZV9sb2dpbhgDIAEoCBIaChJhbGxvd19naXRodWJfbG9naW4YBCABKAgSFQoNaXNfcmVzdHJpY3RlZBgFIAEoCCIkCiJHZXRPcmdhbml6YXRpb25Mb2dpbk1ldGhvZHNSZXF1ZXN0Ip4BCiNHZXRPcmdhbml6YXRpb25Mb2dpbk1ldGhvZHNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkUKDWxvZ2luX21ldGhvZHMYAiABKAsyLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Pcmdhbml6YXRpb25Mb2dpbk1ldGhvZHMiwgEKJVVwZGF0ZU9yZ2FuaXphdGlvbkxvZ2luTWV0aG9kc1JlcXVlc3QSIAoYYWxsb3dlZF9zc29fcHJvdmlkZXJfaWRzGAEgAygJEhwKFGFsbG93X3Bhc3N3b3JkX2xvZ2luGAIgASgIEhoKEmFsbG93X2dvb2dsZV9sb2dpbhgDIAEoCBIaChJhbGxvd19naXRodWJfbG9naW4YBCABKAgSIQoZY29uZmlybV9uYW1lc3BhY2VfY2hhbmdlcxgFIAEoCCK3AQomVXBkYXRlT3JnYW5pemF0aW9uTG9naW5NZXRob2RzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIdChVyZXF1aXJlc19jb25maXJtYXRpb24YAiABKAgSPAoTYWZmZWN0ZWRfbmFtZXNwYWNlcxgDIAMoCzIfLndnLmNvc21vLnBsYXRmb3JtLnYxLk5hbWVzcGFjZSLoBQoUR2V0T3BlcmF0aW9uc1JlcXVlc3QSGgoSZmVkZXJhdGVkR3JhcGhOYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRITCgtjbGllbnROYW1lcxgDIAMoCRISCgVsaW1pdBgEIAEoBUgAiAEBEhMKBm9mZnNldBgFIAEoBUgBiAEBEicKGmluY2x1ZGVIYXNEZXByZWNhdGVkRmllbGRzGAYgASgISAKIAQESRwoMZmV0Y2hCYXNlZE9uGAcgASgOMiwud2cuY29zbW8ucGxhdGZvcm0udjEuT3BlcmF0aW9uc0ZldGNoQmFzZWRPbkgDiAEBEhsKDmluY2x1ZGVDb250ZW50GAggASgISASIAQESEgoFcmFuZ2UYCSABKAVIBYgBARI3CglkYXRlUmFuZ2UYCiABKAsyHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EYXRlUmFuZ2VIBogBARIYCgtzZWFyY2hRdWVyeRgLIAEoCUgHiAEBEjYKKWluY2x1ZGVPcGVyYXRpb25zV2l0aERlcHJlY2F0ZWRGaWVsZHNPbmx5GAwgASgISAiIAQESPwoNc29ydERpcmVjdGlvbhgNIAEoDjIjLndnLmNvc21vLnBsYXRmb3JtLnYxLlNvcnREaXJlY3Rpb25ICYgBARIeChFpbmNsdWRlVG90YWxDb3VudBgOIAEoCEgKiAEBQggKBl9saW1pdEIJCgdfb2Zmc2V0Qh0KG19pbmNsdWRlSGFzRGVwcmVjYXRlZEZpZWxkc0IPCg1fZmV0Y2hCYXNlZE9uQhEKD19pbmNsdWRlQ29udGVudEIICgZfcmFuZ2VCDAoKX2RhdGVSYW5nZUIOCgxfc2VhcmNoUXVlcnlCLAoqX2luY2x1ZGVPcGVyYXRpb25zV2l0aERlcHJlY2F0ZWRGaWVsZHNPbmx5QhAKDl9zb3J0RGlyZWN0aW9uQhQKEl9pbmNsdWRlVG90YWxDb3VudCKXBAoVR2V0T3BlcmF0aW9uc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USSQoKb3BlcmF0aW9ucxgCIAMoCzI1LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9wZXJhdGlvbnNSZXNwb25zZS5PcGVyYXRpb24SFwoKdG90YWxDb3VudBgDIAEoBUgAiAEBGpwCCglPcGVyYXRpb24SDAoEaGFzaBgBIAEoCRIMCgRuYW1lGAIgASgJEhQKB2NvbnRlbnQYAyABKAlIAYgBARJHCgR0eXBlGAQgASgOMjkud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3BlcmF0aW9uc1Jlc3BvbnNlLk9wZXJhdGlvblR5cGUSIAoTaGFzRGVwcmVjYXRlZEZpZWxkcxgFIAEoCEgCiAEBEhEKB2xhdGVuY3kYBiABKAJIABIWCgxyZXF1ZXN0Q291bnQYByABKANIABIZCg9lcnJvclBlcmNlbnRhZ2UYCCABKAJIAEIICgZtZXRyaWNCCgoIX2NvbnRlbnRCFgoUX2hhc0RlcHJlY2F0ZWRGaWVsZHMiOgoNT3BlcmF0aW9uVHlwZRIJCgVRVUVSWRAAEgwKCE1VVEFUSU9OEAESEAoMU1VCU0NSSVBUSU9OEAJCDQoLX3RvdGFsQ291bnQiTwoeR2V0Q2xpZW50c0Zyb21BbmFseXRpY3NSZXF1ZXN0EhoKEmZlZGVyYXRlZEdyYXBoTmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkiugEKH0dldENsaWVudHNGcm9tQW5hbHl0aWNzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJNCgdjbGllbnRzGAIgAygLMjwud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q2xpZW50c0Zyb21BbmFseXRpY3NSZXNwb25zZS5DbGllbnQaFgoGQ2xpZW50EgwKBG5hbWUYASABKAki3gEKGkdldE9wZXJhdGlvbkNsaWVudHNSZXF1ZXN0EhoKEmZlZGVyYXRlZEdyYXBoTmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSFQoNb3BlcmF0aW9uSGFzaBgDIAEoCRIVCg1vcGVyYXRpb25OYW1lGAQgASgJEhIKBXJhbmdlGAUgASgFSACIAQESNwoJZGF0ZVJhbmdlGAYgASgLMh8ud2cuY29zbW8ucGxhdGZvcm0udjEuRGF0ZVJhbmdlSAGIAQFCCAoGX3JhbmdlQgwKCl9kYXRlUmFuZ2Ui6wEKG0dldE9wZXJhdGlvbkNsaWVudHNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkkKB2NsaWVudHMYAiADKAsyOC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcGVyYXRpb25DbGllbnRzUmVzcG9uc2UuQ2xpZW50Gk8KBkNsaWVudBIMCgRuYW1lGAEgASgJEg8KB3ZlcnNpb24YAiABKAkSFAoMcmVxdWVzdENvdW50GAMgASgDEhAKCGxhc3RVc2VkGAQgASgJIv4BCiNHZXRPcGVyYXRpb25EZXByZWNhdGVkRmllbGRzUmVxdWVzdBIaChJmZWRlcmF0ZWRHcmFwaE5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEhUKDW9wZXJhdGlvbkhhc2gYAyABKAkSGgoNb3BlcmF0aW9uTmFtZRgEIAEoCUgAiAEBEhIKBXJhbmdlGAUgASgFSAGIAQESNwoJZGF0ZVJhbmdlGAYgASgLMh8ud2cuY29zbW8ucGxhdGZvcm0udjEuRGF0ZVJhbmdlSAKIAQFCEAoOX29wZXJhdGlvbk5hbWVCCAoGX3JhbmdlQgwKCl9kYXRlUmFuZ2UinwIKJEdldE9wZXJhdGlvbkRlcHJlY2F0ZWRGaWVsZHNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEmQKEGRlcHJlY2F0ZWRGaWVsZHMYAiADKAsySi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcGVyYXRpb25EZXByZWNhdGVkRmllbGRzUmVzcG9uc2UuRGVwcmVjYXRlZEZpZWxkGl8KD0RlcHJlY2F0ZWRGaWVsZBIRCglmaWVsZE5hbWUYASABKAkSEAoIdHlwZU5hbWUYAiABKAkSDAoEcGF0aBgDIAEoCRIZChFkZXByZWNhdGlvblJlYXNvbhgEIAEoCSJxCiFWYWxpZGF0ZUFuZEZldGNoUGx1Z2luRGF0YVJlcXVlc3QSDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSKwoGbGFiZWxzGAMgAygLMhsud2cuY29zbW8ucGxhdGZvcm0udjEuTGFiZWwikAEKIlZhbGlkYXRlQW5kRmV0Y2hQbHVnaW5EYXRhUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRISCgpuZXdWZXJzaW9uGAIgASgJEhEKCXB1c2hUb2tlbhgDIAEoCRIRCglyZWZlcmVuY2UYBCABKAkijwEKE0xpbmtTdWJncmFwaFJlcXVlc3QSGgoSc291cmNlU3ViZ3JhcGhOYW1lGAEgASgJEh8KF3NvdXJjZVN1YmdyYXBoTmFtZXNwYWNlGAIgASgJEhoKEnRhcmdldFN1YmdyYXBoTmFtZRgDIAEoCRIfChd0YXJnZXRTdWJncmFwaE5hbWVzcGFjZRgEIAEoCSJIChRMaW5rU3ViZ3JhcGhSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIlQKFVVubGlua1N1YmdyYXBoUmVxdWVzdBIaChJzb3VyY2VTdWJncmFwaE5hbWUYASABKAkSHwoXc291cmNlU3ViZ3JhcGhOYW1lc3BhY2UYAiABKAkiSgoWVW5saW5rU3ViZ3JhcGhSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIjoKHlZlcmlmeUFQSUtleUdyYXBoQWNjZXNzUmVxdWVzdBIYChBmZWRlcmF0ZWRHcmFwaElkGAEgASgJIqYBCh9WZXJpZnlBUElLZXlHcmFwaEFjY2Vzc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USMgoqaGFzT3JnYW5pemF0aW9uQWRtaW5PckRldmVsb3BlclBlcm1pc3Npb25zGAIgASgIEh0KFWhhc1dyaXRlQWNjZXNzVG9HcmFwaBgDIAEoCCIrChpJbml0aWFsaXplQ29zbW9Vc2VyUmVxdWVzdBINCgV0b2tlbhgBIAEoCSJPChtJbml0aWFsaXplQ29zbW9Vc2VyUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSIaChhMaXN0T3JnYW5pemF0aW9uc1JlcXVlc3Qi/QEKGUxpc3RPcmdhbml6YXRpb25zUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJdCg1vcmdhbml6YXRpb25zGAIgAygLMkYud2cuY29zbW8ucGxhdGZvcm0udjEuTGlzdE9yZ2FuaXphdGlvbnNSZXNwb25zZS5Pcmdhbml6YXRpb25NZW1iZXJzaGlwGk8KFk9yZ2FuaXphdGlvbk1lbWJlcnNoaXASCgoCaWQYASABKAkSDAoEc2x1ZxgCIAEoCRIMCgRuYW1lGAMgASgJEg0KBXJvbGVzGAQgAygJIsABChVSZWNvbXBvc2VHcmFwaFJlcXVlc3QSDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSFAoMaXNfbW9ub2dyYXBoGAMgASgIEhIKBWxpbWl0GAQgASgFSACIAQESLQogZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24YBSABKAhIAYgBAUIICgZfbGltaXRCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uIusCChZSZWNvbXBvc2VHcmFwaFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQQoRY29tcG9zaXRpb25FcnJvcnMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEj8KEGRlcGxveW1lbnRFcnJvcnMYAyADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZXBsb3ltZW50RXJyb3ISRQoTY29tcG9zaXRpb25XYXJuaW5ncxgEIAMoCzIoLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXBvc2l0aW9uV2FybmluZxJECgtlcnJvckNvdW50cxgFIAEoCzIqLndnLmNvc21vLnBsYXRmb3JtLnYxLlN1YmdyYXBoUHVibGlzaFN0YXRzSACIAQFCDgoMX2Vycm9yQ291bnRzIrABChtSZWNvbXBvc2VGZWF0dXJlRmxhZ1JlcXVlc3QSDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSEgoFbGltaXQYAyABKAVIAIgBARItCiBkaXNhYmxlX3Jlc29sdmFiaWxpdHlfdmFsaWRhdGlvbhgFIAEoCEgBiAEBQggKBl9saW1pdEIjCiFfZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24i8QIKHFJlY29tcG9zZUZlYXR1cmVGbGFnUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJBChFjb21wb3NpdGlvbkVycm9ycxgCIAMoCzImLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXBvc2l0aW9uRXJyb3ISPwoQZGVwbG95bWVudEVycm9ycxgDIAMoCzIlLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlcGxveW1lbnRFcnJvchJFChNjb21wb3NpdGlvbldhcm5pbmdzGAQgAygLMigud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25XYXJuaW5nEkQKC2Vycm9yQ291bnRzGAUgASgLMioud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGhQdWJsaXNoU3RhdHNIAIgBAUIOCgxfZXJyb3JDb3VudHMiFgoUR2V0T25ib2FyZGluZ1JlcXVlc3QioAEKFUdldE9uYm9hcmRpbmdSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEhcKCmZpbmlzaGVkQXQYAyABKAlIAIgBARIcChRmZWRlcmF0ZWRHcmFwaHNDb3VudBgEIAEoBRIPCgdlbmFibGVkGAUgASgIQg0KC19maW5pc2hlZEF0IhkKF0NyZWF0ZU9uYm9hcmRpbmdSZXF1ZXN0IpIBChhDcmVhdGVPbmJvYXJkaW5nUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIXCgpmaW5pc2hlZEF0GAIgASgJSACIAQESHAoUZmVkZXJhdGVkR3JhcGhzQ291bnQYAyABKAVCDQoLX2ZpbmlzaGVkQXQiGQoXRmluaXNoT25ib2FyZGluZ1JlcXVlc3QifgoYRmluaXNoT25ib2FyZGluZ1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USHAoUZmVkZXJhdGVkR3JhcGhzQ291bnQYAiABKAUSEgoKZmluaXNoZWRBdBgDIAEoCSpPChVCYXRjaFB1Ymxpc2hKb2JTdGF0dXMSCwoHUEVORElORxAAEg4KClBST0NFU1NJTkcQARIKCgZGQUlMRUQQAhINCglDT01QTEVURUQQAyojCgxMaW50U2V2ZXJpdHkSCAoEd2FybhAAEgkKBWVycm9yEAEqPwoMU3ViZ3JhcGhUeXBlEgwKCFNUQU5EQVJEEAASDwoLR1JQQ19QTFVHSU4QARIQCgxHUlBDX1NFUlZJQ0UQAipVChZBbmFseXRpY3NWaWV3R3JvdXBOYW1lEggKBE5vbmUQABIRCg1PcGVyYXRpb25OYW1lEAESCgoGQ2xpZW50EAISEgoOSHR0cFN0YXR1c0NvZGUQAyoxCg1DdXN0b21PcHRpb25zEggKBFRleHQQABIJCgVSYW5nZRABEgsKB0Jvb2xlYW4QAiqOAQoEVW5pdBIPCgtVbnNwZWNpZmllZBAAEg8KC05hbm9zZWNvbmRzEAESEQoNVW5peFRpbWVzdGFtcBACEgkKBUJ5dGVzEAMSDQoJQ29kZUJsb2NrEAQSDgoKU3RhdHVzQ29kZRAFEgsKB1RyYWNlSUQQBhIKCgZTcGFuSUQQBxIOCgpQZXJjZW50YWdlEAgq/QEKG0FuYWx5dGljc1ZpZXdGaWx0ZXJPcGVyYXRvchIKCgZFUVVBTFMQABIOCgpOT1RfRVFVQUxTEAESEAoMR1JFQVRFUl9USEFOEAISDQoJTEVTU19USEFOEAMSGQoVR1JFQVRFUl9USEFOX09SX0VRVUFMEAQSFgoSTEVTU19USEFOX09SX0VRVUFMEAUSDAoIQ09OVEFJTlMQBhIQCgxOT1RfQ09OVEFJTlMQBxIGCgJJThAIEgoKBk5PVF9JThAJEgsKB0JFVFdFRU4QChIPCgtOT1RfQkVUV0VFThALEgsKB0lTX05VTEwQDBIPCgtJU19OT1RfTlVMTBANKkUKCUV4cGlyZXNBdBIJCgVORVZFUhAAEg8KC1RISVJUWV9EQVlTEAESDgoKU0lYX01PTlRIUxACEgwKCE9ORV9ZRUFSEAMqrAEKD0xvZ2luTWV0aG9kVHlwZRIhCh1MT0dJTl9NRVRIT0RfVFlQRV9VTlNQRUNJRklFRBAAEhkKFUxPR0lOX01FVEhPRF9UWVBFX1NTTxABEh4KGkxPR0lOX01FVEhPRF9UWVBFX1BBU1NXT1JEEAISHQoZTE9HSU5fTUVUSE9EX1RZUEVfQVBJX0tFWRADEhwKGExPR0lOX01FVEhPRF9UWVBFX1NPQ0lBTBAEKoABChNTb2NpYWxMb2dpblByb3ZpZGVyEiUKIVNPQ0lBTF9MT0dJTl9QUk9WSURFUl9VTlNQRUNJRklFRBAAEiAKHFNPQ0lBTF9MT0dJTl9QUk9WSURFUl9HT09HTEUQARIgChxTT0NJQUxfTE9HSU5fUFJPVklERVJfR0lUSFVCEAIqRQoYUHVibGlzaGVkT3BlcmF0aW9uU3RhdHVzEg4KClVQX1RPX0RBVEUQABILCgdDUkVBVEVEEAESDAoIQ09ORkxJQ1QQAiocCg9JbnRlZ3JhdGlvblR5cGUSCQoFU0xBQ0sQAColCgdGZWF0dXJlEggKBHJiYWMQABIGCgJhaRABEggKBHNjaW0QAiosCg5Qcm9wb3NhbE9yaWdpbhIMCghJTlRFUk5BTBAAEgwKCEVYVEVSTkFMEAEqNwoYUHJvcG9zYWxOYW1pbmdDb252ZW50aW9uEgoKBk5PUk1BTBAAEg8KC0lOQ1JFTUVOVEFMEAEqPwoWT3BlcmF0aW9uc0ZldGNoQmFzZWRPbhIMCghSRVFVRVNUUxAAEgsKB0xBVEVOQ1kQARIKCgZFUlJPUlMQAioiCg1Tb3J0RGlyZWN0aW9uEgcKA0FTQxAAEggKBERFU0MQATK8yAEKD1BsYXRmb3JtU2VydmljZRKFAQoWQ3JlYXRlUGxheWdyb3VuZFNjcmlwdBIzLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZVBsYXlncm91bmRTY3JpcHRSZXF1ZXN0GjQud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlUGxheWdyb3VuZFNjcmlwdFJlc3BvbnNlIgAShQEKFkRlbGV0ZVBsYXlncm91bmRTY3JpcHQSMy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVQbGF5Z3JvdW5kU2NyaXB0UmVxdWVzdBo0LndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZVBsYXlncm91bmRTY3JpcHRSZXNwb25zZSIAEoUBChZVcGRhdGVQbGF5Z3JvdW5kU2NyaXB0EjMud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlUGxheWdyb3VuZFNjcmlwdFJlcXVlc3QaNC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVQbGF5Z3JvdW5kU2NyaXB0UmVzcG9uc2UiABJ/ChRHZXRQbGF5Z3JvdW5kU2NyaXB0cxIxLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFBsYXlncm91bmRTY3JpcHRzUmVxdWVzdBoyLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFBsYXlncm91bmRTY3JpcHRzUmVzcG9uc2UiABJwCg9DcmVhdGVOYW1lc3BhY2USLC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVOYW1lc3BhY2VSZXF1ZXN0Gi0ud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlTmFtZXNwYWNlUmVzcG9uc2UiABJwCg9EZWxldGVOYW1lc3BhY2USLC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVOYW1lc3BhY2VSZXF1ZXN0Gi0ud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlTmFtZXNwYWNlUmVzcG9uc2UiABJwCg9SZW5hbWVOYW1lc3BhY2USLC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZW5hbWVOYW1lc3BhY2VSZXF1ZXN0Gi0ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVuYW1lTmFtZXNwYWNlUmVzcG9uc2UiABJqCg1HZXROYW1lc3BhY2VzEioud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0TmFtZXNwYWNlc1JlcXVlc3QaKy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXROYW1lc3BhY2VzUmVzcG9uc2UiABJnCgxHZXROYW1lc3BhY2USKS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXROYW1lc3BhY2VSZXF1ZXN0Gioud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0TmFtZXNwYWNlUmVzcG9uc2UiABJnCgxHZXRXb3Jrc3BhY2USKS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRXb3Jrc3BhY2VSZXF1ZXN0Gioud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0V29ya3NwYWNlUmVzcG9uc2UiABJtCg5DcmVhdGVDb250cmFjdBIrLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUNvbnRyYWN0UmVxdWVzdBosLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUNvbnRyYWN0UmVzcG9uc2UiABJtCg5VcGRhdGVDb250cmFjdBIrLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZUNvbnRyYWN0UmVxdWVzdBosLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZUNvbnRyYWN0UmVzcG9uc2UiABJnChJNb3ZlRmVkZXJhdGVkR3JhcGgSJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Nb3ZlR3JhcGhSZXF1ZXN0Gicud2cuY29zbW8ucGxhdGZvcm0udjEuTW92ZUdyYXBoUmVzcG9uc2UiABJhCgxNb3ZlU3ViZ3JhcGgSJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Nb3ZlR3JhcGhSZXF1ZXN0Gicud2cuY29zbW8ucGxhdGZvcm0udjEuTW92ZUdyYXBoUmVzcG9uc2UiABJiCg1Nb3ZlTW9ub2dyYXBoEiYud2cuY29zbW8ucGxhdGZvcm0udjEuTW92ZUdyYXBoUmVxdWVzdBonLndnLmNvc21vLnBsYXRmb3JtLnYxLk1vdmVHcmFwaFJlc3BvbnNlIgAScAoPQ3JlYXRlTW9ub2dyYXBoEiwud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlTW9ub2dyYXBoUmVxdWVzdBotLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZU1vbm9ncmFwaFJlc3BvbnNlIgAScwoQUHVibGlzaE1vbm9ncmFwaBItLndnLmNvc21vLnBsYXRmb3JtLnYxLlB1Ymxpc2hNb25vZ3JhcGhSZXF1ZXN0Gi4ud2cuY29zbW8ucGxhdGZvcm0udjEuUHVibGlzaE1vbm9ncmFwaFJlc3BvbnNlIgAScAoPRGVsZXRlTW9ub2dyYXBoEiwud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlTW9ub2dyYXBoUmVxdWVzdBotLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZU1vbm9ncmFwaFJlc3BvbnNlIgAScAoPVXBkYXRlTW9ub2dyYXBoEiwud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlTW9ub2dyYXBoUmVxdWVzdBotLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZU1vbm9ncmFwaFJlc3BvbnNlIgAScwoQTWlncmF0ZU1vbm9ncmFwaBItLndnLmNvc21vLnBsYXRmb3JtLnYxLk1pZ3JhdGVNb25vZ3JhcGhSZXF1ZXN0Gi4ud2cuY29zbW8ucGxhdGZvcm0udjEuTWlncmF0ZU1vbm9ncmFwaFJlc3BvbnNlIgASiAEKF0NyZWF0ZUZlZGVyYXRlZFN1YmdyYXBoEjQud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlRmVkZXJhdGVkU3ViZ3JhcGhSZXF1ZXN0GjUud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlRmVkZXJhdGVkU3ViZ3JhcGhSZXNwb25zZSIAEosBChhQdWJsaXNoRmVkZXJhdGVkU3ViZ3JhcGgSNS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QdWJsaXNoRmVkZXJhdGVkU3ViZ3JhcGhSZXF1ZXN0GjYud2cuY29zbW8ucGxhdGZvcm0udjEuUHVibGlzaEZlZGVyYXRlZFN1YmdyYXBoUmVzcG9uc2UiABKOAQoZUHVibGlzaEZlZGVyYXRlZFN1YmdyYXBocxI2LndnLmNvc21vLnBsYXRmb3JtLnYxLlB1Ymxpc2hGZWRlcmF0ZWRTdWJncmFwaHNSZXF1ZXN0Gjcud2cuY29zbW8ucGxhdGZvcm0udjEuUHVibGlzaEZlZGVyYXRlZFN1YmdyYXBoc1Jlc3BvbnNlIgASiwEKGEdldEJhdGNoUHVibGlzaEpvYlN0YXR1cxI1LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEJhdGNoUHVibGlzaEpvYlN0YXR1c1JlcXVlc3QaNi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRCYXRjaFB1Ymxpc2hKb2JTdGF0dXNSZXNwb25zZSIAEn8KFENyZWF0ZUZlZGVyYXRlZEdyYXBoEjEud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlRmVkZXJhdGVkR3JhcGhSZXF1ZXN0GjIud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlRmVkZXJhdGVkR3JhcGhSZXNwb25zZSIAEn8KFERlbGV0ZUZlZGVyYXRlZEdyYXBoEjEud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlRmVkZXJhdGVkR3JhcGhSZXF1ZXN0GjIud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlRmVkZXJhdGVkR3JhcGhSZXNwb25zZSIAEogBChdEZWxldGVGZWRlcmF0ZWRTdWJncmFwaBI0LndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZUZlZGVyYXRlZFN1YmdyYXBoUmVxdWVzdBo1LndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZUZlZGVyYXRlZFN1YmdyYXBoUmVzcG9uc2UiABJ8ChNDaGVja1N1YmdyYXBoU2NoZW1hEjAud2cuY29zbW8ucGxhdGZvcm0udjEuQ2hlY2tTdWJncmFwaFNjaGVtYVJlcXVlc3QaMS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DaGVja1N1YmdyYXBoU2NoZW1hUmVzcG9uc2UiABKpAQoiR2V0UHJvcG9zZWRTY2hlbWFPZkNoZWNrZWRTdWJncmFwaBI/LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFByb3Bvc2VkU2NoZW1hT2ZDaGVja2VkU3ViZ3JhcGhSZXF1ZXN0GkAud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0UHJvcG9zZWRTY2hlbWFPZkNoZWNrZWRTdWJncmFwaFJlc3BvbnNlIgASdgoRRml4U3ViZ3JhcGhTY2hlbWESLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GaXhTdWJncmFwaFNjaGVtYVJlcXVlc3QaLy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GaXhTdWJncmFwaFNjaGVtYVJlc3BvbnNlIgASfwoUVXBkYXRlRmVkZXJhdGVkR3JhcGgSMS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVGZWRlcmF0ZWRHcmFwaFJlcXVlc3QaMi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVGZWRlcmF0ZWRHcmFwaFJlc3BvbnNlIgASbQoOVXBkYXRlU3ViZ3JhcGgSKy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVTdWJncmFwaFJlcXVlc3QaLC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVTdWJncmFwaFJlc3BvbnNlIgASfAoTQ2hlY2tGZWRlcmF0ZWRHcmFwaBIwLndnLmNvc21vLnBsYXRmb3JtLnYxLkNoZWNrRmVkZXJhdGVkR3JhcGhSZXF1ZXN0GjEud2cuY29zbW8ucGxhdGZvcm0udjEuQ2hlY2tGZWRlcmF0ZWRHcmFwaFJlc3BvbnNlIgASVQoGV2hvQW1JEiMud2cuY29zbW8ucGxhdGZvcm0udjEuV2hvQW1JUmVxdWVzdBokLndnLmNvc21vLnBsYXRmb3JtLnYxLldob0FtSVJlc3BvbnNlIgASfAoTR2VuZXJhdGVSb3V0ZXJUb2tlbhIwLndnLmNvc21vLnBsYXRmb3JtLnYxLkdlbmVyYXRlUm91dGVyVG9rZW5SZXF1ZXN0GjEud2cuY29zbW8ucGxhdGZvcm0udjEuR2VuZXJhdGVSb3V0ZXJUb2tlblJlc3BvbnNlIgAScAoPR2V0Um91dGVyVG9rZW5zEiwud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Um91dGVyVG9rZW5zUmVxdWVzdBotLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFJvdXRlclRva2Vuc1Jlc3BvbnNlIgASdgoRRGVsZXRlUm91dGVyVG9rZW4SLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVSb3V0ZXJUb2tlblJlcXVlc3QaLy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVSb3V0ZXJUb2tlblJlc3BvbnNlIgASkQEKGlB1Ymxpc2hQZXJzaXN0ZWRPcGVyYXRpb25zEjcud2cuY29zbW8ucGxhdGZvcm0udjEuUHVibGlzaFBlcnNpc3RlZE9wZXJhdGlvbnNSZXF1ZXN0Gjgud2cuY29zbW8ucGxhdGZvcm0udjEuUHVibGlzaFBlcnNpc3RlZE9wZXJhdGlvbnNSZXNwb25zZSIAEp0BCh5DaGVja1BlcnNpc3RlZE9wZXJhdGlvblRyYWZmaWMSOy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DaGVja1BlcnNpc3RlZE9wZXJhdGlvblRyYWZmaWNSZXF1ZXN0Gjwud2cuY29zbW8ucGxhdGZvcm0udjEuQ2hlY2tQZXJzaXN0ZWRPcGVyYXRpb25UcmFmZmljUmVzcG9uc2UiABKLAQoYRGVsZXRlUGVyc2lzdGVkT3BlcmF0aW9uEjUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlUGVyc2lzdGVkT3BlcmF0aW9uUmVxdWVzdBo2LndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZVBlcnNpc3RlZE9wZXJhdGlvblJlc3BvbnNlIgAShQEKFkdldFBlcnNpc3RlZE9wZXJhdGlvbnMSMy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRQZXJzaXN0ZWRPcGVyYXRpb25zUmVxdWVzdBo0LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFBlcnNpc3RlZE9wZXJhdGlvbnNSZXNwb25zZSIAEmcKDEdldEF1ZGl0TG9ncxIpLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEF1ZGl0TG9nc1JlcXVlc3QaKi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRBdWRpdExvZ3NSZXNwb25zZSIAEnwKE0luaXRpYWxpemVDb3Ntb1VzZXISMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Jbml0aWFsaXplQ29zbW9Vc2VyUmVxdWVzdBoxLndnLmNvc21vLnBsYXRmb3JtLnYxLkluaXRpYWxpemVDb3Ntb1VzZXJSZXNwb25zZSIAEnYKEUxpc3RPcmdhbml6YXRpb25zEi4ud2cuY29zbW8ucGxhdGZvcm0udjEuTGlzdE9yZ2FuaXphdGlvbnNSZXF1ZXN0Gi8ud2cuY29zbW8ucGxhdGZvcm0udjEuTGlzdE9yZ2FuaXphdGlvbnNSZXNwb25zZSIAEnkKEkdldEZlZGVyYXRlZEdyYXBocxIvLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlZGVyYXRlZEdyYXBoc1JlcXVlc3QaMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGZWRlcmF0ZWRHcmFwaHNSZXNwb25zZSIAEqkBCiJHZXRGZWRlcmF0ZWRHcmFwaHNCeVN1YmdyYXBoTGFiZWxzEj8ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVkZXJhdGVkR3JhcGhzQnlTdWJncmFwaExhYmVsc1JlcXVlc3QaQC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGZWRlcmF0ZWRHcmFwaHNCeVN1YmdyYXBoTGFiZWxzUmVzcG9uc2UiABKIAQoXR2V0RmVkZXJhdGVkR3JhcGhCeU5hbWUSNC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGZWRlcmF0ZWRHcmFwaEJ5TmFtZVJlcXVlc3QaNS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGZWRlcmF0ZWRHcmFwaEJ5TmFtZVJlc3BvbnNlIgASkQEKGkdldEZlZGVyYXRlZEdyYXBoU0RMQnlOYW1lEjcud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVkZXJhdGVkR3JhcGhTRExCeU5hbWVSZXF1ZXN0Gjgud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVkZXJhdGVkR3JhcGhTRExCeU5hbWVSZXNwb25zZSIAEmcKDEdldFN1YmdyYXBocxIpLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFN1YmdyYXBoc1JlcXVlc3QaKi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRTdWJncmFwaHNSZXNwb25zZSIAEnYKEUdldFN1YmdyYXBoQnlOYW1lEi4ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0U3ViZ3JhcGhCeU5hbWVSZXF1ZXN0Gi8ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0U3ViZ3JhcGhCeU5hbWVSZXNwb25zZSIAEqwBCiNHZXRTdWJncmFwaFNETEZyb21MYXRlc3RDb21wb3NpdGlvbhJALndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFN1YmdyYXBoU0RMRnJvbUxhdGVzdENvbXBvc2l0aW9uUmVxdWVzdBpBLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFN1YmdyYXBoU0RMRnJvbUxhdGVzdENvbXBvc2l0aW9uUmVzcG9uc2UiABJ/ChRHZXRMYXRlc3RTdWJncmFwaFNETBIxLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldExhdGVzdFN1YmdyYXBoU0RMUmVxdWVzdBoyLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldExhdGVzdFN1YmdyYXBoU0RMUmVzcG9uc2UiABKaAQodR2V0Q2hlY2tzQnlGZWRlcmF0ZWRHcmFwaE5hbWUSOi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRDaGVja3NCeUZlZGVyYXRlZEdyYXBoTmFtZVJlcXVlc3QaOy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRDaGVja3NCeUZlZGVyYXRlZEdyYXBoTmFtZVJlc3BvbnNlIgAScAoPR2V0Q2hlY2tTdW1tYXJ5Eiwud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q2hlY2tTdW1tYXJ5UmVxdWVzdBotLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldENoZWNrU3VtbWFyeVJlc3BvbnNlIgASeQoSR2V0Q2hlY2tPcGVyYXRpb25zEi8ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q2hlY2tPcGVyYXRpb25zUmVxdWVzdBowLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldENoZWNrT3BlcmF0aW9uc1Jlc3BvbnNlIgASdgoRRm9yY2VDaGVja1N1Y2Nlc3MSLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Gb3JjZUNoZWNrU3VjY2Vzc1JlcXVlc3QaLy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Gb3JjZUNoZWNrU3VjY2Vzc1Jlc3BvbnNlIgASiwEKGENyZWF0ZU9wZXJhdGlvbk92ZXJyaWRlcxI1LndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZU9wZXJhdGlvbk92ZXJyaWRlc1JlcXVlc3QaNi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVPcGVyYXRpb25PdmVycmlkZXNSZXNwb25zZSIAEosBChhSZW1vdmVPcGVyYXRpb25PdmVycmlkZXMSNS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZW1vdmVPcGVyYXRpb25PdmVycmlkZXNSZXF1ZXN0GjYud2cuY29zbW8ucGxhdGZvcm0udjEuUmVtb3ZlT3BlcmF0aW9uT3ZlcnJpZGVzUmVzcG9uc2UiABKjAQogQ3JlYXRlT3BlcmF0aW9uSWdub3JlQWxsT3ZlcnJpZGUSPS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVPcGVyYXRpb25JZ25vcmVBbGxPdmVycmlkZVJlcXVlc3QaPi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVPcGVyYXRpb25JZ25vcmVBbGxPdmVycmlkZVJlc3BvbnNlIgASowEKIFJlbW92ZU9wZXJhdGlvbklnbm9yZUFsbE92ZXJyaWRlEj0ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVtb3ZlT3BlcmF0aW9uSWdub3JlQWxsT3ZlcnJpZGVSZXF1ZXN0Gj4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVtb3ZlT3BlcmF0aW9uSWdub3JlQWxsT3ZlcnJpZGVSZXNwb25zZSIAEoIBChVHZXRPcGVyYXRpb25PdmVycmlkZXMSMi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcGVyYXRpb25PdmVycmlkZXNSZXF1ZXN0GjMud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3BlcmF0aW9uT3ZlcnJpZGVzUmVzcG9uc2UiABJwCg9HZXRBbGxPdmVycmlkZXMSLC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRBbGxPdmVycmlkZXNSZXF1ZXN0Gi0ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0QWxsT3ZlcnJpZGVzUmVzcG9uc2UiABKyAQolVG9nZ2xlQ2hhbmdlT3ZlcnJpZGVzRm9yQWxsT3BlcmF0aW9ucxJCLndnLmNvc21vLnBsYXRmb3JtLnYxLlRvZ2dsZUNoYW5nZU92ZXJyaWRlc0ZvckFsbE9wZXJhdGlvbnNSZXF1ZXN0GkMud2cuY29zbW8ucGxhdGZvcm0udjEuVG9nZ2xlQ2hhbmdlT3ZlcnJpZGVzRm9yQWxsT3BlcmF0aW9uc1Jlc3BvbnNlIgASsgEKJUNyZWF0ZUlnbm9yZU92ZXJyaWRlc0ZvckFsbE9wZXJhdGlvbnMSQi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVJZ25vcmVPdmVycmlkZXNGb3JBbGxPcGVyYXRpb25zUmVxdWVzdBpDLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUlnbm9yZU92ZXJyaWRlc0ZvckFsbE9wZXJhdGlvbnNSZXNwb25zZSIAEnwKE0dldE9wZXJhdGlvbkNvbnRlbnQSMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcGVyYXRpb25Db250ZW50UmVxdWVzdBoxLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9wZXJhdGlvbkNvbnRlbnRSZXNwb25zZSIAEpEBChpHZXRGZWRlcmF0ZWRHcmFwaENoYW5nZWxvZxI3LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlZGVyYXRlZEdyYXBoQ2hhbmdlbG9nUmVxdWVzdBo4LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlZGVyYXRlZEdyYXBoQ2hhbmdlbG9nUmVzcG9uc2UiABKOAQoZQ3JlYXRlRmVkZXJhdGVkR3JhcGhUb2tlbhI2LndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUZlZGVyYXRlZEdyYXBoVG9rZW5SZXF1ZXN0Gjcud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlRmVkZXJhdGVkR3JhcGhUb2tlblJlc3BvbnNlIgASggEKFUdldE9yZ2FuaXphdGlvbkJ5U2x1ZxIyLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9yZ2FuaXphdGlvbkJ5U2x1Z1JlcXVlc3QaMy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25CeVNsdWdSZXNwb25zZSIAEoUBChZHZXRPcmdhbml6YXRpb25NZW1iZXJzEjMud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uTWVtYmVyc1JlcXVlc3QaNC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25NZW1iZXJzUmVzcG9uc2UiABKaAQodR2V0UGVuZGluZ09yZ2FuaXphdGlvbk1lbWJlcnMSOi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRQZW5kaW5nT3JnYW5pemF0aW9uTWVtYmVyc1JlcXVlc3QaOy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRQZW5kaW5nT3JnYW5pemF0aW9uTWVtYmVyc1Jlc3BvbnNlIgASfwoUSXNNZW1iZXJMaW1pdFJlYWNoZWQSMS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Jc01lbWJlckxpbWl0UmVhY2hlZFJlcXVlc3QaMi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Jc01lbWJlckxpbWl0UmVhY2hlZFJlc3BvbnNlIgASYQoKSW52aXRlVXNlchInLndnLmNvc21vLnBsYXRmb3JtLnYxLkludml0ZVVzZXJSZXF1ZXN0Gigud2cuY29zbW8ucGxhdGZvcm0udjEuSW52aXRlVXNlclJlc3BvbnNlIgASZAoLSW52aXRlVXNlcnMSKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5JbnZpdGVVc2Vyc1JlcXVlc3QaKS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5JbnZpdGVVc2Vyc1Jlc3BvbnNlIgASYQoKR2V0QVBJS2V5cxInLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEFQSUtleXNSZXF1ZXN0Gigud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0QVBJS2V5c1Jlc3BvbnNlIgASZwoMQ3JlYXRlQVBJS2V5Eikud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlQVBJS2V5UmVxdWVzdBoqLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUFQSUtleVJlc3BvbnNlIgASZwoMVXBkYXRlQVBJS2V5Eikud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlQVBJS2V5UmVxdWVzdBoqLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZUFQSUtleVJlc3BvbnNlIgASZwoMRGVsZXRlQVBJS2V5Eikud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlQVBJS2V5UmVxdWVzdBoqLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZUFQSUtleVJlc3BvbnNlIgASiwEKGFJlbW92ZU9yZ2FuaXphdGlvbk1lbWJlchI1LndnLmNvc21vLnBsYXRmb3JtLnYxLlJlbW92ZU9yZ2FuaXphdGlvbk1lbWJlclJlcXVlc3QaNi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZW1vdmVPcmdhbml6YXRpb25NZW1iZXJSZXNwb25zZSIAEnMKEFJlbW92ZUludml0YXRpb24SLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZW1vdmVJbnZpdGF0aW9uUmVxdWVzdBouLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlbW92ZUludml0YXRpb25SZXNwb25zZSIAEnYKEU1pZ3JhdGVGcm9tQXBvbGxvEi4ud2cuY29zbW8ucGxhdGZvcm0udjEuTWlncmF0ZUZyb21BcG9sbG9SZXF1ZXN0Gi8ud2cuY29zbW8ucGxhdGZvcm0udjEuTWlncmF0ZUZyb21BcG9sbG9SZXNwb25zZSIAEogBChdDcmVhdGVPcmdhbml6YXRpb25Hcm91cBI0LndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZU9yZ2FuaXphdGlvbkdyb3VwUmVxdWVzdBo1LndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZU9yZ2FuaXphdGlvbkdyb3VwUmVzcG9uc2UiABKCAQoVR2V0T3JnYW5pemF0aW9uR3JvdXBzEjIud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uR3JvdXBzUmVxdWVzdBozLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9yZ2FuaXphdGlvbkdyb3Vwc1Jlc3BvbnNlIgASlAEKG0dldE9yZ2FuaXphdGlvbkdyb3VwTWVtYmVycxI4LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9yZ2FuaXphdGlvbkdyb3VwTWVtYmVyc1JlcXVlc3QaOS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25Hcm91cE1lbWJlcnNSZXNwb25zZSIAEogBChdVcGRhdGVPcmdhbml6YXRpb25Hcm91cBI0LndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZU9yZ2FuaXphdGlvbkdyb3VwUmVxdWVzdBo1LndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZU9yZ2FuaXphdGlvbkdyb3VwUmVzcG9uc2UiABKIAQoXRGVsZXRlT3JnYW5pemF0aW9uR3JvdXASNC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVPcmdhbml6YXRpb25Hcm91cFJlcXVlc3QaNS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVPcmdhbml6YXRpb25Hcm91cFJlc3BvbnNlIgASoAEKH0NyZWF0ZU9yZ2FuaXphdGlvbldlYmhvb2tDb25maWcSPC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVPcmdhbml6YXRpb25XZWJob29rQ29uZmlnUmVxdWVzdBo9LndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZU9yZ2FuaXphdGlvbldlYmhvb2tDb25maWdSZXNwb25zZSIAEpoBCh1HZXRPcmdhbml6YXRpb25XZWJob29rQ29uZmlncxI6LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9yZ2FuaXphdGlvbldlYmhvb2tDb25maWdzUmVxdWVzdBo7LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9yZ2FuaXphdGlvbldlYmhvb2tDb25maWdzUmVzcG9uc2UiABKRAQoaR2V0T3JnYW5pemF0aW9uV2ViaG9va01ldGESNy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25XZWJob29rTWV0YVJlcXVlc3QaOC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25XZWJob29rTWV0YVJlc3BvbnNlIgASoAEKH1VwZGF0ZU9yZ2FuaXphdGlvbldlYmhvb2tDb25maWcSPC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVPcmdhbml6YXRpb25XZWJob29rQ29uZmlnUmVxdWVzdBo9LndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZU9yZ2FuaXphdGlvbldlYmhvb2tDb25maWdSZXNwb25zZSIAEqABCh9EZWxldGVPcmdhbml6YXRpb25XZWJob29rQ29uZmlnEjwud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlT3JnYW5pemF0aW9uV2ViaG9va0NvbmZpZ1JlcXVlc3QaPS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVPcmdhbml6YXRpb25XZWJob29rQ29uZmlnUmVzcG9uc2UiABKaAQodR2V0T3JnYW5pemF0aW9uV2ViaG9va0hpc3RvcnkSOi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25XZWJob29rSGlzdG9yeVJlcXVlc3QaOy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25XZWJob29rSGlzdG9yeVJlc3BvbnNlIgASjgEKGUdldFdlYmhvb2tEZWxpdmVyeURldGFpbHMSNi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRXZWJob29rRGVsaXZlcnlEZXRhaWxzUmVxdWVzdBo3LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFdlYmhvb2tEZWxpdmVyeURldGFpbHNSZXNwb25zZSIAEnMKEFJlZGVsaXZlcldlYmhvb2sSLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZWRlbGl2ZXJXZWJob29rUmVxdWVzdBouLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlZGVsaXZlcldlYmhvb2tSZXNwb25zZSIAEnYKEUNyZWF0ZUludGVncmF0aW9uEi4ud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlSW50ZWdyYXRpb25SZXF1ZXN0Gi8ud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlSW50ZWdyYXRpb25SZXNwb25zZSIAEpQBChtHZXRPcmdhbml6YXRpb25JbnRlZ3JhdGlvbnMSOC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25JbnRlZ3JhdGlvbnNSZXF1ZXN0Gjkud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uSW50ZWdyYXRpb25zUmVzcG9uc2UiABKIAQoXVXBkYXRlSW50ZWdyYXRpb25Db25maWcSNC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVJbnRlZ3JhdGlvbkNvbmZpZ1JlcXVlc3QaNS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVJbnRlZ3JhdGlvbkNvbmZpZ1Jlc3BvbnNlIgASdgoRRGVsZXRlSW50ZWdyYXRpb24SLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVJbnRlZ3JhdGlvblJlcXVlc3QaLy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVJbnRlZ3JhdGlvblJlc3BvbnNlIgASYQoKRGVsZXRlVXNlchInLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZVVzZXJSZXF1ZXN0Gigud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlVXNlclJlc3BvbnNlIgASeQoSRGVsZXRlT3JnYW5pemF0aW9uEi8ud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlT3JnYW5pemF0aW9uUmVxdWVzdBowLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZU9yZ2FuaXphdGlvblJlc3BvbnNlIgASfAoTUmVzdG9yZU9yZ2FuaXphdGlvbhIwLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3RvcmVPcmdhbml6YXRpb25SZXF1ZXN0GjEud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzdG9yZU9yZ2FuaXphdGlvblJlc3BvbnNlIgASdgoRTGVhdmVPcmdhbml6YXRpb24SLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MZWF2ZU9yZ2FuaXphdGlvblJlcXVlc3QaLy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MZWF2ZU9yZ2FuaXphdGlvblJlc3BvbnNlIgASjgEKGVVwZGF0ZU9yZ2FuaXphdGlvbkRldGFpbHMSNi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVPcmdhbml6YXRpb25EZXRhaWxzUmVxdWVzdBo3LndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZU9yZ2FuaXphdGlvbkRldGFpbHNSZXNwb25zZSIAEn8KFFVwZGF0ZU9yZ01lbWJlckdyb3VwEjEud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlT3JnTWVtYmVyR3JvdXBSZXF1ZXN0GjIud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlT3JnTWVtYmVyR3JvdXBSZXNwb25zZSIAEn8KFElzR2l0SHViQXBwSW5zdGFsbGVkEjEud2cuY29zbW8ucGxhdGZvcm0udjEuSXNHaXRIdWJBcHBJbnN0YWxsZWRSZXF1ZXN0GjIud2cuY29zbW8ucGxhdGZvcm0udjEuSXNHaXRIdWJBcHBJbnN0YWxsZWRSZXNwb25zZSIAEnkKEkNyZWF0ZU9JRENQcm92aWRlchIvLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZU9JRENQcm92aWRlclJlcXVlc3QaMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVPSURDUHJvdmlkZXJSZXNwb25zZSIAEnAKD0dldE9JRENQcm92aWRlchIsLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9JRENQcm92aWRlclJlcXVlc3QaLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPSURDUHJvdmlkZXJSZXNwb25zZSIAEnYKEUxpc3RPSURDUHJvdmlkZXJzEi4ud2cuY29zbW8ucGxhdGZvcm0udjEuTGlzdE9JRENQcm92aWRlcnNSZXF1ZXN0Gi8ud2cuY29zbW8ucGxhdGZvcm0udjEuTGlzdE9JRENQcm92aWRlcnNSZXNwb25zZSIAEnkKEkRlbGV0ZU9JRENQcm92aWRlchIvLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZU9JRENQcm92aWRlclJlcXVlc3QaMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVPSURDUHJvdmlkZXJSZXNwb25zZSIAEnMKEFVwZGF0ZUlEUE1hcHBlcnMSLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVJRFBNYXBwZXJzUmVxdWVzdBouLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZUlEUE1hcHBlcnNSZXNwb25zZSIAEmEKCkdldENsaWVudHMSJy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRDbGllbnRzUmVxdWVzdBooLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldENsaWVudHNSZXNwb25zZSIAEnwKE1ByZXZpZXdEZWxldGVDbGllbnQSMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QcmV2aWV3RGVsZXRlQ2xpZW50UmVxdWVzdBoxLndnLmNvc21vLnBsYXRmb3JtLnYxLlByZXZpZXdEZWxldGVDbGllbnRSZXNwb25zZSIAEmcKDERlbGV0ZUNsaWVudBIpLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZUNsaWVudFJlcXVlc3QaKi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVDbGllbnRSZXNwb25zZSIAEmEKCkdldFJvdXRlcnMSJy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRSb3V0ZXJzUmVxdWVzdBooLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFJvdXRlcnNSZXNwb25zZSIAEm0KDkdldEludml0YXRpb25zEisud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0SW52aXRhdGlvbnNSZXF1ZXN0Giwud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0SW52aXRhdGlvbnNSZXNwb25zZSIAEo4BChlBY2NlcHRPckRlY2xpbmVJbnZpdGF0aW9uEjYud2cuY29zbW8ucGxhdGZvcm0udjEuQWNjZXB0T3JEZWNsaW5lSW52aXRhdGlvblJlcXVlc3QaNy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5BY2NlcHRPckRlY2xpbmVJbnZpdGF0aW9uUmVzcG9uc2UiABJwCg9HZXRDb21wb3NpdGlvbnMSLC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRDb21wb3NpdGlvbnNSZXF1ZXN0Gi0ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q29tcG9zaXRpb25zUmVzcG9uc2UiABKCAQoVR2V0Q29tcG9zaXRpb25EZXRhaWxzEjIud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q29tcG9zaXRpb25EZXRhaWxzUmVxdWVzdBozLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldENvbXBvc2l0aW9uRGV0YWlsc1Jlc3BvbnNlIgASggEKFUdldFNkbEJ5U2NoZW1hVmVyc2lvbhIyLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFNkbEJ5U2NoZW1hVmVyc2lvblJlcXVlc3QaMy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRTZGxCeVNjaGVtYVZlcnNpb25SZXNwb25zZSIAEpQBChtHZXRDaGFuZ2Vsb2dCeVNjaGVtYVZlcnNpb24SOC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRDaGFuZ2Vsb2dCeVNjaGVtYVZlcnNpb25SZXF1ZXN0Gjkud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q2hhbmdlbG9nQnlTY2hlbWFWZXJzaW9uUmVzcG9uc2UiABKRAQoaR2V0VXNlckFjY2Vzc2libGVSZXNvdXJjZXMSNy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRVc2VyQWNjZXNzaWJsZVJlc291cmNlc1JlcXVlc3QaOC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRVc2VyQWNjZXNzaWJsZVJlc291cmNlc1Jlc3BvbnNlIgASggEKFVVwZGF0ZUZlYXR1cmVTZXR0aW5ncxIyLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZUZlYXR1cmVTZXR0aW5nc1JlcXVlc3QaMy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVGZWF0dXJlU2V0dGluZ3NSZXNwb25zZSIAEnkKEkdldFN1YmdyYXBoTWVtYmVycxIvLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFN1YmdyYXBoTWVtYmVyc1JlcXVlc3QaMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRTdWJncmFwaE1lbWJlcnNSZXNwb25zZSIAEl4KCUFkZFJlYWRtZRImLndnLmNvc21vLnBsYXRmb3JtLnYxLkFkZFJlYWRtZVJlcXVlc3QaJy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5BZGRSZWFkbWVSZXNwb25zZSIAEpcBChxHZXRVc2VyQWNjZXNzaWJsZVBlcm1pc3Npb25zEjkud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0VXNlckFjY2Vzc2libGVQZXJtaXNzaW9uc1JlcXVlc3QaOi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRVc2VyQWNjZXNzaWJsZVBlcm1pc3Npb25zUmVzcG9uc2UiABJ2ChFDcmVhdGVGZWF0dXJlRmxhZxIuLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUZlYXR1cmVGbGFnUmVxdWVzdBovLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUZlYXR1cmVGbGFnUmVzcG9uc2UiABJ2ChFEZWxldGVGZWF0dXJlRmxhZxIuLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZUZlYXR1cmVGbGFnUmVxdWVzdBovLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZUZlYXR1cmVGbGFnUmVzcG9uc2UiABJ2ChFVcGRhdGVGZWF0dXJlRmxhZxIuLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZUZlYXR1cmVGbGFnUmVxdWVzdBovLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZUZlYXR1cmVGbGFnUmVzcG9uc2UiABJ2ChFFbmFibGVGZWF0dXJlRmxhZxIuLndnLmNvc21vLnBsYXRmb3JtLnYxLkVuYWJsZUZlYXR1cmVGbGFnUmVxdWVzdBovLndnLmNvc21vLnBsYXRmb3JtLnYxLkVuYWJsZUZlYXR1cmVGbGFnUmVzcG9uc2UiABJ2ChBHZXRBbmFseXRpY3NWaWV3Ei0ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0QW5hbHl0aWNzVmlld1JlcXVlc3QaLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRBbmFseXRpY3NWaWV3UmVzcG9uc2UiA5ACARKRAQoZR2V0RGFzaGJvYXJkQW5hbHl0aWNzVmlldxI2LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldERhc2hib2FyZEFuYWx5dGljc1ZpZXdSZXF1ZXN0Gjcud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RGFzaGJvYXJkQW5hbHl0aWNzVmlld1Jlc3BvbnNlIgOQAgESWwoIR2V0VHJhY2USJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRUcmFjZVJlcXVlc3QaJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRUcmFjZVJlc3BvbnNlIgAScwoPR2V0R3JhcGhNZXRyaWNzEiwud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0R3JhcGhNZXRyaWNzUmVxdWVzdBotLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEdyYXBoTWV0cmljc1Jlc3BvbnNlIgOQAgESfwoTR2V0TWV0cmljc0Vycm9yUmF0ZRIwLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE1ldHJpY3NFcnJvclJhdGVSZXF1ZXN0GjEud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0TWV0cmljc0Vycm9yUmF0ZVJlc3BvbnNlIgOQAgESfAoSR2V0U3ViZ3JhcGhNZXRyaWNzEi8ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0U3ViZ3JhcGhNZXRyaWNzUmVxdWVzdBowLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFN1YmdyYXBoTWV0cmljc1Jlc3BvbnNlIgOQAgESlwEKG0dldFN1YmdyYXBoTWV0cmljc0Vycm9yUmF0ZRI4LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFN1YmdyYXBoTWV0cmljc0Vycm9yUmF0ZVJlcXVlc3QaOS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRTdWJncmFwaE1ldHJpY3NFcnJvclJhdGVSZXNwb25zZSIDkAIBEm0KDUdldEZpZWxkVXNhZ2USKi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGaWVsZFVzYWdlUmVxdWVzdBorLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZpZWxkVXNhZ2VSZXNwb25zZSIDkAIBEpcBChxHZXRPcmdhbml6YXRpb25SZXF1ZXN0c0NvdW50Ejkud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uUmVxdWVzdHNDb3VudFJlcXVlc3QaOi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25SZXF1ZXN0c0NvdW50UmVzcG9uc2UiABJ5ChJDcmVhdGVPcmdhbml6YXRpb24SLy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVPcmdhbml6YXRpb25SZXF1ZXN0GjAud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlT3JnYW5pemF0aW9uUmVzcG9uc2UiABKXAQocRW5hYmxlTGludGluZ0ZvclRoZU5hbWVzcGFjZRI5LndnLmNvc21vLnBsYXRmb3JtLnYxLkVuYWJsZUxpbnRpbmdGb3JUaGVOYW1lc3BhY2VSZXF1ZXN0Gjoud2cuY29zbW8ucGxhdGZvcm0udjEuRW5hYmxlTGludGluZ0ZvclRoZU5hbWVzcGFjZVJlc3BvbnNlIgASlwEKHENvbmZpZ3VyZU5hbWVzcGFjZUxpbnRDb25maWcSOS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db25maWd1cmVOYW1lc3BhY2VMaW50Q29uZmlnUmVxdWVzdBo6LndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbmZpZ3VyZU5hbWVzcGFjZUxpbnRDb25maWdSZXNwb25zZSIAEoUBChZHZXROYW1lc3BhY2VMaW50Q29uZmlnEjMud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0TmFtZXNwYWNlTGludENvbmZpZ1JlcXVlc3QaNC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXROYW1lc3BhY2VMaW50Q29uZmlnUmVzcG9uc2UiABKZAQoYR2V0TmFtZXNwYWNlQ2hlY2tzQ29uZmlnEjwud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0TmFtZXNwYWNlQ2hlY2tzQ29uZmlndXJhdGlvblJlcXVlc3QaPS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXROYW1lc3BhY2VDaGVja3NDb25maWd1cmF0aW9uUmVzcG9uc2UiABKiAQobVXBkYXRlTmFtZXNwYWNlQ2hlY2tzQ29uZmlnEj8ud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlTmFtZXNwYWNlQ2hlY2tzQ29uZmlndXJhdGlvblJlcXVlc3QaQC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVOYW1lc3BhY2VDaGVja3NDb25maWd1cmF0aW9uUmVzcG9uc2UiABJ5ChJFbmFibGVHcmFwaFBydW5pbmcSLy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5FbmFibGVHcmFwaFBydW5pbmdSZXF1ZXN0GjAud2cuY29zbW8ucGxhdGZvcm0udjEuRW5hYmxlR3JhcGhQcnVuaW5nUmVzcG9uc2UiABKvAQokQ29uZmlndXJlTmFtZXNwYWNlR3JhcGhQcnVuaW5nQ29uZmlnEkEud2cuY29zbW8ucGxhdGZvcm0udjEuQ29uZmlndXJlTmFtZXNwYWNlR3JhcGhQcnVuaW5nQ29uZmlnUmVxdWVzdBpCLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbmZpZ3VyZU5hbWVzcGFjZUdyYXBoUHJ1bmluZ0NvbmZpZ1Jlc3BvbnNlIgASnQEKHkdldE5hbWVzcGFjZUdyYXBoUHJ1bmluZ0NvbmZpZxI7LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE5hbWVzcGFjZUdyYXBoUHJ1bmluZ0NvbmZpZ1JlcXVlc3QaPC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXROYW1lc3BhY2VHcmFwaFBydW5pbmdDb25maWdSZXNwb25zZSIAEnAKD0dldEZlYXR1cmVGbGFncxIsLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlYXR1cmVGbGFnc1JlcXVlc3QaLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGZWF0dXJlRmxhZ3NSZXNwb25zZSIAEn8KFEdldEZlYXR1cmVGbGFnQnlOYW1lEjEud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVhdHVyZUZsYWdCeU5hbWVSZXF1ZXN0GjIud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVhdHVyZUZsYWdCeU5hbWVSZXNwb25zZSIAEqMBCiBHZXRGZWF0dXJlU3ViZ3JhcGhzQnlGZWF0dXJlRmxhZxI9LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlYXR1cmVTdWJncmFwaHNCeUZlYXR1cmVGbGFnUmVxdWVzdBo+LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlYXR1cmVTdWJncmFwaHNCeUZlYXR1cmVGbGFnUmVzcG9uc2UiABJ8ChNHZXRGZWF0dXJlU3ViZ3JhcGhzEjAud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVhdHVyZVN1YmdyYXBoc1JlcXVlc3QaMS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGZWF0dXJlU3ViZ3JhcGhzUmVzcG9uc2UiABKgAQofR2V0RmVhdHVyZUZsYWdzQnlGZWRlcmF0ZWRHcmFwaBI8LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlYXR1cmVGbGFnc0J5RmVkZXJhdGVkR3JhcGhSZXF1ZXN0Gj0ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVhdHVyZUZsYWdzQnlGZWRlcmF0ZWRHcmFwaFJlc3BvbnNlIgAS2QEKMkdldEZlYXR1cmVGbGFnc0luTGF0ZXN0Q29tcG9zaXRpb25CeUZlZGVyYXRlZEdyYXBoEk8ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVhdHVyZUZsYWdzSW5MYXRlc3RDb21wb3NpdGlvbkJ5RmVkZXJhdGVkR3JhcGhSZXF1ZXN0GlAud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVhdHVyZUZsYWdzSW5MYXRlc3RDb21wb3NpdGlvbkJ5RmVkZXJhdGVkR3JhcGhSZXNwb25zZSIAEqwBCiNHZXRGZWF0dXJlU3ViZ3JhcGhzQnlGZWRlcmF0ZWRHcmFwaBJALndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlYXR1cmVTdWJncmFwaHNCeUZlZGVyYXRlZEdyYXBoUmVxdWVzdBpBLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlYXR1cmVTdWJncmFwaHNCeUZlZGVyYXRlZEdyYXBoUmVzcG9uc2UiABKCAQoVR2V0RmVkZXJhdGVkR3JhcGhCeUlkEjIud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVkZXJhdGVkR3JhcGhCeUlkUmVxdWVzdBozLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlZGVyYXRlZEdyYXBoQnlJZFJlc3BvbnNlIgAScAoPR2V0U3ViZ3JhcGhCeUlkEiwud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0U3ViZ3JhcGhCeUlkUmVxdWVzdBotLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFN1YmdyYXBoQnlJZFJlc3BvbnNlIgASiwEKGFB1c2hDYWNoZVdhcm1lck9wZXJhdGlvbhI1LndnLmNvc21vLnBsYXRmb3JtLnYxLlB1c2hDYWNoZVdhcm1lck9wZXJhdGlvblJlcXVlc3QaNi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QdXNoQ2FjaGVXYXJtZXJPcGVyYXRpb25SZXNwb25zZSIAEosBChhHZXRDYWNoZVdhcm1lck9wZXJhdGlvbnMSNS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRDYWNoZVdhcm1lck9wZXJhdGlvbnNSZXF1ZXN0GjYud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q2FjaGVXYXJtZXJPcGVyYXRpb25zUmVzcG9uc2UiABKXAQocQ29tcHV0ZUNhY2hlV2FybWVyT3BlcmF0aW9ucxI5LndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXB1dGVDYWNoZVdhcm1lck9wZXJhdGlvbnNSZXF1ZXN0Gjoud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcHV0ZUNhY2hlV2FybWVyT3BlcmF0aW9uc1Jlc3BvbnNlIgASfwoUQ29uZmlndXJlQ2FjaGVXYXJtZXISMS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db25maWd1cmVDYWNoZVdhcm1lclJlcXVlc3QaMi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db25maWd1cmVDYWNoZVdhcm1lclJlc3BvbnNlIgASfwoUR2V0Q2FjaGVXYXJtZXJDb25maWcSMS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRDYWNoZVdhcm1lckNvbmZpZ1JlcXVlc3QaMi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRDYWNoZVdhcm1lckNvbmZpZ1Jlc3BvbnNlIgASkQEKGkRlbGV0ZUNhY2hlV2FybWVyT3BlcmF0aW9uEjcud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlQ2FjaGVXYXJtZXJPcGVyYXRpb25SZXF1ZXN0Gjgud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlQ2FjaGVXYXJtZXJPcGVyYXRpb25SZXNwb25zZSIAEqMBCiBHZXRTdWJncmFwaENoZWNrRXh0ZW5zaW9uc0NvbmZpZxI9LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFN1YmdyYXBoQ2hlY2tFeHRlbnNpb25zQ29uZmlnUmVxdWVzdBo+LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFN1YmdyYXBoQ2hlY2tFeHRlbnNpb25zQ29uZmlnUmVzcG9uc2UiABKjAQogQ29uZmlndXJlU3ViZ3JhcGhDaGVja0V4dGVuc2lvbnMSPS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db25maWd1cmVTdWJncmFwaENoZWNrRXh0ZW5zaW9uc1JlcXVlc3QaPi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db25maWd1cmVTdWJncmFwaENoZWNrRXh0ZW5zaW9uc1Jlc3BvbnNlIgAScAoPR2V0QmlsbGluZ1BsYW5zEiwud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0QmlsbGluZ1BsYW5zUmVxdWVzdBotLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEJpbGxpbmdQbGFuc1Jlc3BvbnNlIgASggEKFUNyZWF0ZUNoZWNrb3V0U2Vzc2lvbhIyLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUNoZWNrb3V0U2Vzc2lvblJlcXVlc3QaMy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVDaGVja291dFNlc3Npb25SZXNwb25zZSIAEpEBChpDcmVhdGVCaWxsaW5nUG9ydGFsU2Vzc2lvbhI3LndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUJpbGxpbmdQb3J0YWxTZXNzaW9uUmVxdWVzdBo4LndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUJpbGxpbmdQb3J0YWxTZXNzaW9uUmVzcG9uc2UiABJkCgtVcGdyYWRlUGxhbhIoLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZ3JhZGVQbGFuUmVxdWVzdBopLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZ3JhZGVQbGFuUmVzcG9uc2UiABKgAQofTGlzdFJvdXRlckNvbXBhdGliaWxpdHlWZXJzaW9ucxI8LndnLmNvc21vLnBsYXRmb3JtLnYxLkxpc3RSb3V0ZXJDb21wYXRpYmlsaXR5VmVyc2lvbnNSZXF1ZXN0Gj0ud2cuY29zbW8ucGxhdGZvcm0udjEuTGlzdFJvdXRlckNvbXBhdGliaWxpdHlWZXJzaW9uc1Jlc3BvbnNlIgASqQEKIlNldEdyYXBoUm91dGVyQ29tcGF0aWJpbGl0eVZlcnNpb24SPy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TZXRHcmFwaFJvdXRlckNvbXBhdGliaWxpdHlWZXJzaW9uUmVxdWVzdBpALndnLmNvc21vLnBsYXRmb3JtLnYxLlNldEdyYXBoUm91dGVyQ29tcGF0aWJpbGl0eVZlcnNpb25SZXNwb25zZSIAEm0KDkNyZWF0ZVByb3Bvc2FsEisud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlUHJvcG9zYWxSZXF1ZXN0Giwud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlUHJvcG9zYWxSZXNwb25zZSIAEmQKC0dldFByb3Bvc2FsEigud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0UHJvcG9zYWxSZXF1ZXN0Gikud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0UHJvcG9zYWxSZXNwb25zZSIAEm0KDlVwZGF0ZVByb3Bvc2FsEisud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlUHJvcG9zYWxSZXF1ZXN0Giwud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlUHJvcG9zYWxSZXNwb25zZSIAEpQBChtFbmFibGVQcm9wb3NhbHNGb3JOYW1lc3BhY2USOC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5FbmFibGVQcm9wb3NhbHNGb3JOYW1lc3BhY2VSZXF1ZXN0Gjkud2cuY29zbW8ucGxhdGZvcm0udjEuRW5hYmxlUHJvcG9zYWxzRm9yTmFtZXNwYWNlUmVzcG9uc2UiABKjAQogQ29uZmlndXJlTmFtZXNwYWNlUHJvcG9zYWxDb25maWcSPS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db25maWd1cmVOYW1lc3BhY2VQcm9wb3NhbENvbmZpZ1JlcXVlc3QaPi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db25maWd1cmVOYW1lc3BhY2VQcm9wb3NhbENvbmZpZ1Jlc3BvbnNlIgASkQEKGkdldE5hbWVzcGFjZVByb3Bvc2FsQ29uZmlnEjcud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0TmFtZXNwYWNlUHJvcG9zYWxDb25maWdSZXF1ZXN0Gjgud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0TmFtZXNwYWNlUHJvcG9zYWxDb25maWdSZXNwb25zZSIAEpQBChtVcGRhdGVOYW1lc3BhY2VMb2dpbk1ldGhvZHMSOC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVOYW1lc3BhY2VMb2dpbk1ldGhvZHNSZXF1ZXN0Gjkud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlTmFtZXNwYWNlTG9naW5NZXRob2RzUmVzcG9uc2UiABKOAQoZTGlzdE5hbWVzcGFjZUxvZ2luTWV0aG9kcxI2LndnLmNvc21vLnBsYXRmb3JtLnYxLkxpc3ROYW1lc3BhY2VMb2dpbk1ldGhvZHNSZXF1ZXN0Gjcud2cuY29zbW8ucGxhdGZvcm0udjEuTGlzdE5hbWVzcGFjZUxvZ2luTWV0aG9kc1Jlc3BvbnNlIgASlAEKG0dldE9yZ2FuaXphdGlvbkxvZ2luTWV0aG9kcxI4LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9yZ2FuaXphdGlvbkxvZ2luTWV0aG9kc1JlcXVlc3QaOS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25Mb2dpbk1ldGhvZHNSZXNwb25zZSIAEp0BCh5VcGRhdGVPcmdhbml6YXRpb25Mb2dpbk1ldGhvZHMSOy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVPcmdhbml6YXRpb25Mb2dpbk1ldGhvZHNSZXF1ZXN0Gjwud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlT3JnYW5pemF0aW9uTG9naW5NZXRob2RzUmVzcG9uc2UiABKXAQocR2V0UHJvcG9zYWxzQnlGZWRlcmF0ZWRHcmFwaBI5LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFByb3Bvc2Fsc0J5RmVkZXJhdGVkR3JhcGhSZXF1ZXN0Gjoud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0UHJvcG9zYWxzQnlGZWRlcmF0ZWRHcmFwaFJlc3BvbnNlIgASdgoRR2V0UHJvcG9zYWxDaGVja3MSLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRQcm9wb3NhbENoZWNrc1JlcXVlc3QaLy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRQcm9wb3NhbENoZWNrc1Jlc3BvbnNlIgASagoNR2V0T3BlcmF0aW9ucxIqLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9wZXJhdGlvbnNSZXF1ZXN0Gisud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3BlcmF0aW9uc1Jlc3BvbnNlIgASiAEKF0dldENsaWVudHNGcm9tQW5hbHl0aWNzEjQud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q2xpZW50c0Zyb21BbmFseXRpY3NSZXF1ZXN0GjUud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q2xpZW50c0Zyb21BbmFseXRpY3NSZXNwb25zZSIAEnwKE0dldE9wZXJhdGlvbkNsaWVudHMSMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcGVyYXRpb25DbGllbnRzUmVxdWVzdBoxLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9wZXJhdGlvbkNsaWVudHNSZXNwb25zZSIAEpcBChxHZXRPcGVyYXRpb25EZXByZWNhdGVkRmllbGRzEjkud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3BlcmF0aW9uRGVwcmVjYXRlZEZpZWxkc1JlcXVlc3QaOi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcGVyYXRpb25EZXByZWNhdGVkRmllbGRzUmVzcG9uc2UiABKRAQoaVmFsaWRhdGVBbmRGZXRjaFBsdWdpbkRhdGESNy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5WYWxpZGF0ZUFuZEZldGNoUGx1Z2luRGF0YVJlcXVlc3QaOC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5WYWxpZGF0ZUFuZEZldGNoUGx1Z2luRGF0YVJlc3BvbnNlIgASZwoMTGlua1N1YmdyYXBoEikud2cuY29zbW8ucGxhdGZvcm0udjEuTGlua1N1YmdyYXBoUmVxdWVzdBoqLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpbmtTdWJncmFwaFJlc3BvbnNlIgASbQoOVW5saW5rU3ViZ3JhcGgSKy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VbmxpbmtTdWJncmFwaFJlcXVlc3QaLC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VbmxpbmtTdWJncmFwaFJlc3BvbnNlIgASiAEKF1ZlcmlmeUFQSUtleUdyYXBoQWNjZXNzEjQud2cuY29zbW8ucGxhdGZvcm0udjEuVmVyaWZ5QVBJS2V5R3JhcGhBY2Nlc3NSZXF1ZXN0GjUud2cuY29zbW8ucGxhdGZvcm0udjEuVmVyaWZ5QVBJS2V5R3JhcGhBY2Nlc3NSZXNwb25zZSIAEm0KDlJlY29tcG9zZUdyYXBoEisud2cuY29zbW8ucGxhdGZvcm0udjEuUmVjb21wb3NlR3JhcGhSZXF1ZXN0Giwud2cuY29zbW8ucGxhdGZvcm0udjEuUmVjb21wb3NlR3JhcGhSZXNwb25zZSIAEn8KFFJlY29tcG9zZUZlYXR1cmVGbGFnEjEud2cuY29zbW8ucGxhdGZvcm0udjEuUmVjb21wb3NlRmVhdHVyZUZsYWdSZXF1ZXN0GjIud2cuY29zbW8ucGxhdGZvcm0udjEuUmVjb21wb3NlRmVhdHVyZUZsYWdSZXNwb25zZSIAEmoKDUdldE9uYm9hcmRpbmcSKi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPbmJvYXJkaW5nUmVxdWVzdBorLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9uYm9hcmRpbmdSZXNwb25zZSIAEnMKEENyZWF0ZU9uYm9hcmRpbmcSLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVPbmJvYXJkaW5nUmVxdWVzdBouLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZU9uYm9hcmRpbmdSZXNwb25zZSIAEnMKEEZpbmlzaE9uYm9hcmRpbmcSLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GaW5pc2hPbmJvYXJkaW5nUmVxdWVzdBouLndnLmNvc21vLnBsYXRmb3JtLnYxLkZpbmlzaE9uYm9hcmRpbmdSZXNwb25zZSIAYgZwcm90bzM", [file_wg_cosmo_common_common, file_wg_cosmo_notifications_events]); /** * @generated from message wg.cosmo.platform.v1.Label @@ -8844,6 +8844,16 @@ export type GraphComposition = Message<"wg.cosmo.platform.v1.GraphComposition"> * @generated from field: string router_compatibility_version = 14; */ routerCompatibilityVersion: string; + + /** + * @generated from field: bool isFeatureFlagComposition = 15; + */ + isFeatureFlagComposition: boolean; + + /** + * @generated from field: optional string featureFlagName = 16; + */ + featureFlagName?: string | undefined; }; /**