From 7d424694393fb4b2612df9d0048bed3ea0f65b59 Mon Sep 17 00:00:00 2001 From: rohithb Date: Wed, 12 Aug 2026 02:14:12 +0530 Subject: [PATCH 01/36] feat(check): re-gate cluster-validator per compute-plane targeting and widen RBAC --- src/clis/nvcf-cli/cmd/self_hosted_check.go | 154 ++++++++++++--- .../nvcf-cli/cmd/self_hosted_check_test.go | 160 ++++++++++++++++ .../internal/selfhosted/clustervalidator.go | 175 +++++++++++++++--- .../selfhosted/clustervalidator_test.go | 153 +++++++++++++-- 4 files changed, 584 insertions(+), 58 deletions(-) diff --git a/src/clis/nvcf-cli/cmd/self_hosted_check.go b/src/clis/nvcf-cli/cmd/self_hosted_check.go index dafb00fbf5..2498e8340f 100644 --- a/src/clis/nvcf-cli/cmd/self_hosted_check.go +++ b/src/clis/nvcf-cli/cmd/self_hosted_check.go @@ -22,6 +22,7 @@ import ( "fmt" "io" "os" + "path/filepath" "time" "github.com/spf13/cobra" @@ -45,6 +46,7 @@ var ( checkClusterValidatorImage string checkClusterValidatorPullSecret string checkClusterValidatorNoCleanup bool + checkClusterValidatorRegistries []string checkShowLogs bool ) @@ -58,9 +60,19 @@ var newClusterValidatorForSelfHosted = func() selfhosted.ClusterValidator { return selfhosted.NewClusterValidator() } +// Test seam. +var newStaleNamespaceProberForSelfHosted = func() selfhosted.StaleNamespaceProber { + return selfhosted.NewStaleNamespaceProber() +} + // Test seam. Tests stub this to skip the registry network call. var resolveLatestValidatorTagForSelfHosted = selfhosted.ResolveLatestValidatorTag +// Test seam. +var newRegistryCredentialCheckerForSelfHosted = func() selfhosted.RegistryCredentialChecker { + return selfhosted.NewRegistryCredentialChecker() +} + var checkWriterIsTTY = isWriterTTY var selfHostedCheckCmd = &cobra.Command{ @@ -100,6 +112,13 @@ func init() { selfHostedCheckCmd.Flags().BoolVar(&checkClusterValidatorNoCleanup, "no-cleanup", false, "Disable the validator Job's TTL so the Job persists for debugging. "+ "The next run still deletes prior Jobs via the singleton sweep.") + selfHostedCheckCmd.Flags().StringSliceVar(&checkClusterValidatorRegistries, "cluster-validator-registries", nil, + "Additional container registries to probe for reachability in the control-plane validator. "+ + "Format: host:port (e.g. harbor.company.internal:443,ghcr.io:443). "+ + "nvcr.io is always included. Env: NVCF_CLI_CLUSTER_VALIDATOR_REGISTRIES. "+ + "Can also be set in nvcf-cli config as cluster_validator_registries (list).") + _ = viper.BindPFlag("cluster_validator_registries", + selfHostedCheckCmd.Flags().Lookup("cluster-validator-registries")) selfHostedCheckCmd.Flags().BoolVar(&checkShowLogs, "show-logs", false, "Print the cleaned cluster-validator transcript to stderr after the check events. "+ "Useful when piping --json output to a script that also wants the transcript.") @@ -113,17 +132,25 @@ func runSelfHostedCheck(c *cobra.Command, _ []string) error { localOnly := checkLocalOnly || os.Getenv("NVCF_CLI_SELFHOSTED_LOCAL_ONLY") != "" skipClusterValidation := checkSkipClusterValidation || os.Getenv("NVCF_CLI_SELFHOSTED_SKIP_CLUSTER_VALIDATION") != "" + // Mode is needed before image resolution so computePlaneIsTargeted can + // gate the registry round trip. ValidateFlags in PersistentPreRunE + // guarantees mode is ModeSingle or ModeSplit here. + mode := kubectx.SelectMode(selfHostedControlPlaneContext, selfHostedComputePlaneContext) + // Resolve the validator image up-front so we can right-size the // outer timeout (only when the validator actually runs) and emit a // one-shot stderr note up-front explaining why no validator row // appears in the output. Empty == not configured anywhere. + // One image covers both roles (VALIDATOR_ROLE selects the check set). + anyValidatorIsTargeted := !localOnly && !skipClusterValidation && + (computePlaneIsTargeted(mode) || controlPlaneIsTargeted(mode)) clusterValidatorImage := "" - if !localOnly && !skipClusterValidation && (checkPre || checkAll) { + if anyValidatorIsTargeted { if img, ok := resolveClusterValidatorImage(c.Context()); ok { clusterValidatorImage = img } } - clusterValidatorWillRun := !localOnly && !skipClusterValidation && (checkPre || checkAll) && clusterValidatorImage != "" + clusterValidatorWillRun := anyValidatorIsTargeted && clusterValidatorImage != "" // The cluster-validator Job's internal budget is 5m // (selfhosted.clusterValidatorTimeout). The outer ctx must be at least @@ -154,7 +181,7 @@ func runSelfHostedCheck(c *cobra.Command, _ []string) error { // validator row" with "validator silently dropped". Print at most one // reason; --skip-cluster-validation takes precedence over missing // config since it's the explicit operator choice. - if !localOnly && (checkPre || checkAll) { + if !localOnly && (computePlaneIsTargeted(mode) || controlPlaneIsTargeted(mode)) { switch { case skipClusterValidation: fmt.Fprintln(c.ErrOrStderr(), "note: cluster-validator skipped (--skip-cluster-validation)") @@ -163,9 +190,27 @@ func runSelfHostedCheck(c *cobra.Command, _ []string) error { } } + // Enumerate registries for the local credential check. Skipped when + // local-only (no network) or when no validator image is configured. + // Uses the same extras list as the in-cluster ConfigMap reachability check. + var ( + credEntries []selfhosted.RegistryEntry + registryChecker selfhosted.RegistryCredentialChecker + ) + if !localOnly && clusterValidatorImage != "" { + extraRegistries := viper.GetStringSlice("cluster_validator_registries") + stackValuesFile := resolveStackValuesFile() + credEntries = selfhosted.EnumerateRegistries( + clusterValidatorImage, stackValuesFile, extraRegistries, + ) + registryChecker = newRegistryCredentialCheckerForSelfHosted() + } + cfg := selfhosted.PreflightConfig{ - LocalOnly: localOnly, - Tools: selfHostedPreflightTools(), + LocalOnly: localOnly, + Tools: selfHostedPreflightTools(), + Registries: credEntries, + RegistryChecker: registryChecker, } sink, err := selectCheckRenderer(c.ErrOrStderr(), selfHostedWait != "") @@ -181,8 +226,8 @@ func runSelfHostedCheck(c *cobra.Command, _ []string) error { runOnce := func() []selfhosted.CheckResult { var results []selfhosted.CheckResult - if checkPre || checkAll { - results = append(results, runPreflightByRole(ctx, cfg, sink, clusterValidatorImage)...) + if checkPre || checkAll || checkControlPlane || checkComputePlane { + results = append(results, runPreflightByRole(ctx, cfg, sink, mode, clusterValidatorImage)...) } // Inject force-fail seam for tests. if os.Getenv("NVCF_CLI_SELFHOSTED_FORCE_FAIL") != "" { @@ -194,7 +239,6 @@ func runSelfHostedCheck(c *cobra.Command, _ []string) error { Message: "forced failure (test seam)", }}, results...) } - // control-plane / compute-plane wired in M3/M4 — placeholder no-op for M2. return results } @@ -240,6 +284,44 @@ func runSelfHostedCheck(c *cobra.Command, _ []string) error { } } +// resolveStackValuesFile walks up from the current working directory to find +// the active environment values YAML. Returns "" when not found so callers +// skip the optional lookup gracefully. +func resolveStackValuesFile() string { + cwd, err := os.Getwd() + if err != nil { + return "" + } + // Walk up to 6 directory levels to find the stack environments directory. + dir := cwd + for i := 0; i < 6; i++ { + candidate := filepath.Join(dir, + "deploy", "stacks", "self-managed", "environments", "local.yaml") + if _, err := os.Stat(candidate); err == nil { + return candidate + } + parent := filepath.Dir(dir) + if parent == dir { + break + } + dir = parent + } + return "" +} + +// computePlaneIsTargeted reports whether the compute-plane validator should run: +// --compute-plane, --all, or --pre in ModeSingle. --pre in ModeSplit does not +// target it because separate clusters have no implicit compute-plane role. +func computePlaneIsTargeted(mode kubectx.Mode) bool { + return checkComputePlane || checkAll || (checkPre && mode == kubectx.ModeSingle) +} + +// controlPlaneIsTargeted mirrors computePlaneIsTargeted but for the control +// plane. Runs when: --control-plane, --all, or --pre in ModeSingle. +func controlPlaneIsTargeted(mode kubectx.Mode) bool { + return checkControlPlane || checkAll || (checkPre && mode == kubectx.ModeSingle) +} + // maybeShowClusterValidatorLogs prints the cleaned cluster-validator transcript // to the given writer when --show-logs is set, framed by markers so operators // can find it in mixed CLI output. Silent no-op when: @@ -296,10 +378,10 @@ func selectCheckRenderer(w io.Writer, wait bool) (progress.EventSink, error) { // - ModeSingle (no context flags) → RoleControlPlane + RoleComputePlane sequentially // - ModeSplit (both context flags set) → RoleControlPlane + RoleComputePlane in parallel // -// clusterValidatorImage is the already-resolved validator image (empty when -// not configured). Resolution happens in the caller so the outer-timeout -// and stderr-note logic can see the same answer this function does. -func runPreflightByRole(ctx context.Context, cfg selfhosted.PreflightConfig, sink progress.EventSink, clusterValidatorImage string) []selfhosted.CheckResult { +// mode is the already-resolved kubectx.Mode (hoisted to the caller so image +// resolution and timeout sizing share the same answer). clusterValidatorImage +// is the already-resolved validator image (empty when not configured). +func runPreflightByRole(ctx context.Context, cfg selfhosted.PreflightConfig, sink progress.EventSink, mode kubectx.Mode, clusterValidatorImage string) []selfhosted.CheckResult { // LocalOnly: skip all cluster probes. if cfg.LocalOnly { return selfhosted.RunPreflightForRole(ctx, cfg, selfhosted.RoleLocalOnly, selfhosted.RoleConfig{}, sink) @@ -309,7 +391,6 @@ func runPreflightByRole(ctx context.Context, cfg selfhosted.PreflightConfig, sin if checkAll || checkComputePlane || !checkPre { icmsURL = resolveICMSURL(selfHostedICMSURL) } - mode := kubectx.SelectMode(selfHostedControlPlaneContext, selfHostedComputePlaneContext) skipInotify := checkSkipInotifyCheck || os.Getenv("NVCF_CLI_SELFHOSTED_SKIP_INOTIFY") != "" var inotifyProber selfhosted.NodeInotifyProber @@ -328,6 +409,19 @@ func runPreflightByRole(ctx context.Context, cfg selfhosted.PreflightConfig, sin clusterValidator = newClusterValidatorForSelfHosted() } + staleNSProber := newStaleNamespaceProberForSelfHosted() + + // Additional registries to probe in the control-plane validator ConfigMap. + // Priority: flag > env > config file. + registries := viper.GetStringSlice("cluster_validator_registries") + + // The cluster-validator image is the same for both roles; VALIDATOR_ROLE + // in the Job env selects which check set runs inside the binary. + var cpClusterValidator selfhosted.ClusterValidator + if controlPlaneIsTargeted(mode) && clusterValidator != nil { + cpClusterValidator = newClusterValidatorForSelfHosted() + } + switch mode { case kubectx.ModeSplit: // Run both roles in parallel; each gets its own kubeconfig context. @@ -337,7 +431,15 @@ func runPreflightByRole(ctx context.Context, cfg selfhosted.PreflightConfig, sin ) eg, egCtx := errgroup.WithContext(ctx) eg.Go(func() error { - rc := selfhosted.RoleConfig{KubeContext: selfHostedControlPlaneContext} + rc := selfhosted.RoleConfig{ + KubeContext: selfHostedControlPlaneContext, + ClusterValidator: cpClusterValidator, + ClusterValidatorImage: clusterValidatorImage, + ClusterValidatorPullSecret: checkClusterValidatorPullSecret, + ClusterValidatorNoCleanup: checkClusterValidatorNoCleanup, + ClusterValidatorRegistries: registries, + StaleNamespaceProber: staleNSProber, + } cpResults = selfhosted.RunPreflightForRole(egCtx, cfg, selfhosted.RoleControlPlane, rc, sink) return nil }) @@ -350,6 +452,7 @@ func runPreflightByRole(ctx context.Context, cfg selfhosted.PreflightConfig, sin ClusterValidatorImage: clusterValidatorImage, ClusterValidatorPullSecret: checkClusterValidatorPullSecret, ClusterValidatorNoCleanup: checkClusterValidatorNoCleanup, + StaleNamespaceProber: staleNSProber, } gpuResults = selfhosted.RunPreflightForRole(egCtx, cfg, selfhosted.RoleComputePlane, rc, sink) return nil @@ -358,7 +461,15 @@ func runPreflightByRole(ctx context.Context, cfg selfhosted.PreflightConfig, sin return append(cpResults, gpuResults...) default: // ModeSingle — no context flags; union both role check sets sequentially. - cpRC := selfhosted.RoleConfig{SISURL: icmsURL} + cpRC := selfhosted.RoleConfig{ + SISURL: icmsURL, + ClusterValidator: cpClusterValidator, + ClusterValidatorImage: clusterValidatorImage, + ClusterValidatorPullSecret: checkClusterValidatorPullSecret, + ClusterValidatorNoCleanup: checkClusterValidatorNoCleanup, + ClusterValidatorRegistries: registries, + StaleNamespaceProber: staleNSProber, + } gpuRC := selfhosted.RoleConfig{ SISURL: icmsURL, InotifyProber: inotifyProber, @@ -366,6 +477,7 @@ func runPreflightByRole(ctx context.Context, cfg selfhosted.PreflightConfig, sin ClusterValidatorImage: clusterValidatorImage, ClusterValidatorPullSecret: checkClusterValidatorPullSecret, ClusterValidatorNoCleanup: checkClusterValidatorNoCleanup, + StaleNamespaceProber: staleNSProber, } cpResults := selfhosted.RunPreflightForRole(ctx, cfg, selfhosted.RoleControlPlane, cpRC, sink) gpuResults := selfhosted.RunPreflightForRole(ctx, cfg, selfhosted.RoleComputePlane, gpuRC, sink) @@ -373,15 +485,9 @@ func runPreflightByRole(ctx context.Context, cfg selfhosted.PreflightConfig, sin } } -// Resolves the validator image from the viper-backed config chain -// (flag > env > config-file > default). Returns ("", false) when nothing -// is configured so the caller can surface a clear "not configured" -// warning instead of pulling from a stale built-in default. -// -// When the configured value already has a tag, it is used as-is. When it -// names only a repo, the latest tag is discovered from the registry -// (preferring stable over rc, 1h cached); any discovery failure falls -// back to the configured value unchanged. +// resolveClusterValidatorImage resolves the validator image from flag > env > +// config-file. Returns ("", false) when unconfigured. When only a repo is +// given, discovers the latest stable tag (1h cached; falls back on failure). func resolveClusterValidatorImage(ctx context.Context) (string, bool) { image := viper.GetString("cluster_validator_image") if image == "" { diff --git a/src/clis/nvcf-cli/cmd/self_hosted_check_test.go b/src/clis/nvcf-cli/cmd/self_hosted_check_test.go index d3a6d94b64..218bdca80c 100644 --- a/src/clis/nvcf-cli/cmd/self_hosted_check_test.go +++ b/src/clis/nvcf-cli/cmd/self_hosted_check_test.go @@ -30,6 +30,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "nvcf-cli/internal/selfhosted/kubectx" "nvcf-cli/internal/selfhosted/progress" ) @@ -343,6 +344,165 @@ func TestCheck_SplitClusterMode(t *testing.T) { assert.Contains(t, categories, "compute-plane-cluster", "expected compute-plane-cluster in split mode") } +// TestComputePlaneIsTargeted tests the predicate that gates the cluster-validator +// probe. The validator should run when the compute plane is explicitly targeted +// (--compute-plane, --all) or implicitly targeted by ModeSingle + --pre. +// It must NOT run for --pre alone in ModeSplit, where the two context flags +// identify separate clusters and --pre does not constitute targeting the compute plane. +func TestComputePlaneIsTargeted(t *testing.T) { + t.Cleanup(func() { + checkPre = false + checkComputePlane = false + checkAll = false + }) + + tests := []struct { + name string + pre bool + cp bool + all bool + mode kubectx.Mode + want bool + }{ + {"--compute-plane single", false, true, false, kubectx.ModeSingle, true}, + {"--compute-plane split", false, true, false, kubectx.ModeSplit, true}, + {"--all single", false, false, true, kubectx.ModeSingle, true}, + {"--all split", false, false, true, kubectx.ModeSplit, true}, + {"--pre single — implicit compute plane", true, false, false, kubectx.ModeSingle, true}, + {"--pre split — must not target compute plane", true, false, false, kubectx.ModeSplit, false}, + {"--control-plane only", false, false, false, kubectx.ModeSingle, false}, + {"no relevant flag", false, false, false, kubectx.ModeSingle, false}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + checkPre = tt.pre + checkComputePlane = tt.cp + checkAll = tt.all + assert.Equal(t, tt.want, computePlaneIsTargeted(tt.mode)) + }) + } +} + +// TestCheck_ComputePlaneFlagRunsChecks verifies that --compute-plane alone +// produces compute-plane-cluster category events. Before the gating fix this +// flag was a complete no-op and produced no check events at all. +func TestCheck_ComputePlaneFlagRunsChecks(t *testing.T) { + t.Cleanup(func() { + selfHostedJSON = false + selfHostedOutput = "text" + checkComputePlane = false + }) + + var stderr bytes.Buffer + rootCmd.SetErr(&stderr) + rootCmd.SetOut(&bytes.Buffer{}) + + rootCmd.SetArgs([]string{"self-hosted", "check", "--compute-plane", "--json"}) + _ = rootCmd.Execute() + + lines := parseJSONLLines(t, stderr.String()) + require.NotEmpty(t, lines, "expected at least one JSONL line") + + var categories []string + for _, l := range lines[1:] { + if l["event"] == "category_completed" { + if cat, ok := l["category"].(string); ok { + categories = append(categories, cat) + } + } + } + assert.Contains(t, categories, "compute-plane-cluster", + "--compute-plane must produce compute-plane-cluster events") +} + +// TestCheck_ControlPlaneFlagRunsChecks verifies that --control-plane alone +// produces control-plane-cluster category events. +func TestCheck_ControlPlaneFlagRunsChecks(t *testing.T) { + t.Cleanup(func() { + selfHostedJSON = false + selfHostedOutput = "text" + checkControlPlane = false + }) + + var stderr bytes.Buffer + rootCmd.SetErr(&stderr) + rootCmd.SetOut(&bytes.Buffer{}) + + rootCmd.SetArgs([]string{"self-hosted", "check", "--control-plane", "--json"}) + _ = rootCmd.Execute() + + lines := parseJSONLLines(t, stderr.String()) + require.NotEmpty(t, lines, "expected at least one JSONL line") + + var categories []string + for _, l := range lines[1:] { + if l["event"] == "category_completed" { + if cat, ok := l["category"].(string); ok { + categories = append(categories, cat) + } + } + } + assert.Contains(t, categories, "control-plane-cluster", + "--control-plane must produce control-plane-cluster events") +} + +// TestCheck_ValidatorSkipNoteAppearsOnComputePlane verifies that the +// "cluster-validator skipped" note appears on stderr when --compute-plane is +// used with --skip-cluster-validation (compute plane is targeted, validator is +// suppressed). +func TestCheck_ValidatorSkipNoteAppearsOnComputePlane(t *testing.T) { + t.Cleanup(func() { + selfHostedJSON = false + selfHostedOutput = "text" + checkComputePlane = false + checkSkipClusterValidation = false + }) + + var stderr bytes.Buffer + rootCmd.SetErr(&stderr) + rootCmd.SetOut(&bytes.Buffer{}) + + rootCmd.SetArgs([]string{ + "self-hosted", "check", "--compute-plane", + "--skip-cluster-validation", "--json", + }) + _ = rootCmd.Execute() + + assert.Contains(t, stderr.String(), "cluster-validator skipped", + "expected skip note when compute plane is targeted and --skip-cluster-validation is set") +} + +// TestCheck_ValidatorSkipNoteAbsentForPreInSplitMode verifies that the +// "cluster-validator skipped" note does NOT appear when --pre is used in +// split mode, because the compute plane is not explicitly targeted and +// ModeSplit + --pre does not implicitly make either context the compute plane. +func TestCheck_ValidatorSkipNoteAbsentForPreInSplitMode(t *testing.T) { + t.Cleanup(func() { + selfHostedJSON = false + selfHostedOutput = "text" + checkPre = false + checkSkipClusterValidation = false + selfHostedControlPlaneContext = "" + selfHostedComputePlaneContext = "" + }) + + var stderr bytes.Buffer + rootCmd.SetErr(&stderr) + rootCmd.SetOut(&bytes.Buffer{}) + + rootCmd.SetArgs([]string{ + "self-hosted", "check", "--pre", + "--skip-cluster-validation", "--json", + "--control-plane-context", "admin@cp", + "--compute-plane-context", "admin@gpu1", + }) + _ = rootCmd.Execute() + + assert.NotContains(t, stderr.String(), "cluster-validator skipped", + "skip note must not appear for --pre in split mode (compute plane not targeted)") +} + // parseJSONLLines splits s into non-empty lines, skips any non-JSON lines // (e.g. cobra error messages written to stderr), and unmarshals each JSON line // as an object. Returns them in order. diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go index 5df457fa76..a9e1c6832b 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go @@ -71,6 +71,15 @@ type ClusterValidatorParams struct { Image string PullSecret string NoCleanup bool + // Role selects which check set the validator runs: "control-plane" or + // "compute-plane" (empty = compute-plane default). Passed to the Job as + // VALIDATOR_ROLE. See clustervalidator.RoleControlPlane / RoleComputePlane. + Role string + // Registries is a list of additional "host:port" registry endpoints to + // probe for reachability in the control-plane validator ConfigMap (in + // addition to nvcr.io which is always included). Ignored for the + // compute-plane role. + Registries []string } // Err is non-nil only when the run failed to execute (RBAC bootstrap, @@ -98,12 +107,12 @@ func NewClusterValidator() ClusterValidator { if err != nil { return ClusterValidatorResult{Err: fmt.Errorf("building kubernetes client: %w", err)} } - return runClusterValidator(ctx, client, p.Image, p.PullSecret, p.NoCleanup) + return runClusterValidator(ctx, client, p.Image, p.PullSecret, p.NoCleanup, p.Role, p.Registries) } } // Testable core. Pass a fake clientset to unit-test without a real cluster. -func runClusterValidator(ctx context.Context, client kubernetes.Interface, image, pullSecret string, noCleanup bool) ClusterValidatorResult { +func runClusterValidator(ctx context.Context, client kubernetes.Interface, image, pullSecret string, noCleanup bool, role string, registries []string) ClusterValidatorResult { if image == "" { // Defensive: callers gate on configured image before invoking the // validator, so this branch shouldn't fire in normal use. @@ -128,11 +137,23 @@ func runClusterValidator(ctx context.Context, client kubernetes.Interface, image return ClusterValidatorResult{Err: fmt.Errorf("bootstrapping validator RBAC: %w", err)} } + // For the control-plane role, create a ConfigMap with reachability + // endpoints and enforcement config so the validator runs its configurable + // checks. Best-effort: a failure here is logged but does not abort the + // run — the validator gracefully skips configurable checks when the + // ConfigMap is absent. + if role == clusterValidatorControlPlaneRole { + if err := ensureClusterValidatorConfig(vctx, client, registries); err != nil { + // Non-fatal: reachability checks will be skipped, not the whole run. + _ = err + } + } + sweepPriorClusterValidatorJobs(vctx, client) jobName := fmt.Sprintf("%s-%d", clusterValidatorName, time.Now().UnixNano()) if _, err := client.BatchV1().Jobs(clusterValidatorNamespace).Create( - vctx, buildClusterValidatorJob(jobName, image, pullSecret, noCleanup), metav1.CreateOptions{}, + vctx, buildClusterValidatorJob(jobName, image, pullSecret, role, noCleanup), metav1.CreateOptions{}, ); err != nil { return ClusterValidatorResult{Err: fmt.Errorf("creating validator Job: %w", err)} } @@ -167,9 +188,8 @@ func runClusterValidator(ctx context.Context, client kubernetes.Interface, image } // Creates the SA/ClusterRole/ClusterRoleBinding the validator pod runs under, -// idempotent via AlreadyExists tolerance. Permissions mirror the -// nvca-operator chart's validator rbac.yaml (read-only). Resources persist -// across runs; the sweep only deletes Jobs. +// idempotent via AlreadyExists tolerance. ClusterRole uses update-or-create so +// newer CLI versions replace stale rules without the operator needing to delete. func ensureClusterValidatorRBAC(ctx context.Context, client kubernetes.Interface) error { labels := clusterValidatorLabels() @@ -187,11 +207,21 @@ func ensureClusterValidatorRBAC(ctx context.Context, client kubernetes.Interface cr := &rbacv1.ClusterRole{ ObjectMeta: metav1.ObjectMeta{Name: clusterValidatorName, Labels: labels}, Rules: []rbacv1.PolicyRule{ - {APIGroups: []string{""}, Resources: []string{"nodes", "pods", "namespaces", "services", "configmaps"}, Verbs: []string{"get", "list", "watch"}}, + // Read-only: cluster inventory and configuration. + {APIGroups: []string{""}, Resources: []string{"nodes", "configmaps"}, Verbs: []string{"get", "list", "watch"}}, + // Read + write: enforcement checks create and delete probe namespaces + // and pods; the active-LB check creates and deletes a probe service. + {APIGroups: []string{""}, Resources: []string{"namespaces", "pods", "services"}, Verbs: []string{"get", "list", "watch", "create", "delete"}}, + // Pod log subresource: read probe output without exec. + {APIGroups: []string{""}, Resources: []string{"pods/log"}, Verbs: []string{"get"}}, {APIGroups: []string{"storage.k8s.io"}, Resources: []string{"csidrivers", "storageclasses"}, Verbs: []string{"get", "list"}}, - {APIGroups: []string{"networking.k8s.io"}, Resources: []string{"networkpolicies"}, Verbs: []string{"get", "list"}}, + // NetworkPolicies: read for CNI detection; write for enforcement + // check which creates/updates/deletes policies in the temp namespace. + {APIGroups: []string{"networking.k8s.io"}, Resources: []string{"networkpolicies"}, Verbs: []string{"get", "list", "create", "update", "delete"}}, {APIGroups: []string{"admissionregistration.k8s.io"}, Resources: []string{"mutatingwebhookconfigurations", "validatingwebhookconfigurations"}, Verbs: []string{"get", "list"}}, {APIGroups: []string{"apps"}, Resources: []string{"deployments", "daemonsets", "statefulsets"}, Verbs: []string{"get", "list"}}, + // Gateway API: control-plane gateway and route health checks. + {APIGroups: []string{"gateway.networking.k8s.io"}, Resources: []string{"gatewayclasses", "gateways", "httproutes", "grpcroutes"}, Verbs: []string{"get", "list"}}, {NonResourceURLs: []string{"/readyz", "/version", "/healthz"}, Verbs: []string{"get"}}, }, } @@ -266,19 +296,121 @@ func sweepManagedPullSecrets(ctx context.Context, client kubernetes.Interface) { ) } -// IfNotPresent so locally-imported images (k3d image import, kind load) are -// reused. VALIDATOR_CONFIG_NAME is empty so the validator skips the -// configurable reachability/network-policy sections (ConfigMap support is a -// follow-up). -// -// VALIDATOR_PREFLIGHT=true puts the validator in preflight mode: it runs the -// readiness checks and exits, but does NOT write its summary ConfigMap. The -// ConfigMap exists for the metrics path (the NVCA agent watches it and -// republishes on /metrics), which is meaningless here because preflight runs -// before NVCA is installed and our RBAC bootstrap grants no configmaps -// create/update. Tagging the invocation keeps preflight a clean no-op rather -// than emitting a confusing "failed to create summary ConfigMap" warning. -func buildClusterValidatorJob(name, image, pullSecret string, noCleanup bool) *batchv1.Job { +// clusterValidatorControlPlaneRole is the role value passed as VALIDATOR_ROLE +// when running against the control-plane cluster. Matches nvca's RoleControlPlane +// without importing that package. +const clusterValidatorControlPlaneRole = "control-plane" + +// clusterValidatorConfigName is the default ConfigMap name the validator binary +// looks for when VALIDATOR_CONFIG_NAME is empty. Must stay in sync with +// defaultConfigMapName in nvca/cmd/cluster-validator/main.go. +const clusterValidatorConfigName = "cluster-validator-network-checks" + +// controlPlaneValidatorConfigTemplate is the baseline network-check ConfigMap for +// control-plane preflight: nvcr.io reachability (critical) and NetworkPolicy +// enforcement (non-critical). Extra registries are appended as non-critical probes. +const controlPlaneValidatorConfigTemplate = `reachability: + endpoints: + - name: nvcr.io + host: nvcr.io + port: 443 + protocol: tcp+tls + critical: true +enforcement: + enabled: true + testImage: busybox:1.36 + timeoutSeconds: 60 + critical: false +` + +// ensureClusterValidatorConfig creates or updates the network-check ConfigMap. +// extraRegistries are added as non-critical tcp+tls probes. Best-effort: the +// validator skips configurable checks when the ConfigMap is absent. +func ensureClusterValidatorConfig(ctx context.Context, client kubernetes.Interface, extraRegistries []string) error { + content := buildControlPlaneValidatorConfig(extraRegistries) + desired := &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: clusterValidatorConfigName, + Namespace: clusterValidatorNamespace, + Labels: clusterValidatorLabels(), + }, + Data: map[string]string{"config.yaml": content}, + } + + existing, err := client.CoreV1().ConfigMaps(clusterValidatorNamespace).Get(ctx, clusterValidatorConfigName, metav1.GetOptions{}) + if err != nil { + if !apierrors.IsNotFound(err) { + return fmt.Errorf("get validator config ConfigMap: %w", err) + } + if _, err := client.CoreV1().ConfigMaps(clusterValidatorNamespace).Create(ctx, desired, metav1.CreateOptions{}); err != nil { + return fmt.Errorf("create validator config ConfigMap: %w", err) + } + return nil + } + + // Always update so a newer CLI version's config (or new registries) replaces stale content. + existing.Data = desired.Data + existing.Labels = desired.Labels + if _, err := client.CoreV1().ConfigMaps(clusterValidatorNamespace).Update(ctx, existing, metav1.UpdateOptions{}); err != nil { + return fmt.Errorf("update validator config ConfigMap: %w", err) + } + return nil +} + +// buildControlPlaneValidatorConfig assembles the network-check ConfigMap YAML +// from the baseline template plus any operator-supplied extra registries. +func buildControlPlaneValidatorConfig(extraRegistries []string) string { + if len(extraRegistries) == 0 { + return controlPlaneValidatorConfigTemplate + } + + // Parse host:port entries and append as non-critical tcp+tls endpoints. + var extra strings.Builder + for _, reg := range extraRegistries { + host, port := parseRegistryHostPort(reg) + if host == "" { + continue + } + // Append under the existing reachability.endpoints list. + fmt.Fprintf(&extra, " - name: %s\n host: %s\n port: %d\n protocol: tcp+tls\n critical: false\n", host, host, port) + } + if extra.Len() == 0 { + return controlPlaneValidatorConfigTemplate + } + + // Insert extra endpoints after the nvcr.io entry (before the enforcement block). + return strings.Replace(controlPlaneValidatorConfigTemplate, + "enforcement:", extra.String()+"enforcement:", 1) +} + +// parseRegistryHostPort splits a "host:port" string. Returns port 443 when +// no port is specified or when the port is not a valid number. +func parseRegistryHostPort(s string) (host string, port int) { + s = strings.TrimSpace(s) + if s == "" { + return "", 0 + } + if idx := strings.LastIndex(s, ":"); idx > 0 { + h := s[:idx] + p := s[idx+1:] + n := 0 + for _, c := range p { + if c < '0' || c > '9' { + return s, 443 + } + n = n*10 + int(c-'0') + } + if n > 0 && n <= 65535 { + return h, n + } + } + return s, 443 +} + +// buildClusterValidatorJob creates the validator Job. PullIfNotPresent reuses +// locally-imported images. VALIDATOR_PREFLIGHT=true skips the summary ConfigMap +// write. VALIDATOR_ROLE selects the check set (control-plane vs compute-plane). +func buildClusterValidatorJob(name, image, pullSecret, role string, noCleanup bool) *batchv1.Job { backoff := int32(0) podSpec := corev1.PodSpec{ ServiceAccountName: clusterValidatorName, @@ -291,6 +423,7 @@ func buildClusterValidatorJob(name, image, pullSecret string, noCleanup bool) *b {Name: "VALIDATOR_CONFIG_NAMESPACE", Value: clusterValidatorNamespace}, {Name: "VALIDATOR_CONFIG_NAME", Value: ""}, {Name: "VALIDATOR_PREFLIGHT", Value: "true"}, + {Name: "VALIDATOR_ROLE", Value: role}, }, }}, } diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go index 70ef4a6a91..95051c402a 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go @@ -113,7 +113,7 @@ func TestRunClusterValidator_EmptyImage(t *testing.T) { // branch is defensive. Verify it returns a clear error and makes // no API calls. client := fake.NewSimpleClientset() - res := runClusterValidator(context.Background(), client, "", "", false) + res := runClusterValidator(context.Background(), client, "", "", false, "", nil) require.Error(t, res.Err) assert.Contains(t, res.Err.Error(), "image is empty") assert.False(t, res.Passed) @@ -124,7 +124,7 @@ func TestClusterValidatorCheck_OrchestratorErrorStaysWarning(t *testing.T) { cv := func(_ context.Context, _ ClusterValidatorParams) ClusterValidatorResult { return ClusterValidatorResult{Err: fmt.Errorf("transient: API server unreachable")} } - r := clusterValidatorCheck(cv, "", "", "", false).Run(context.Background()) + r := clusterValidatorCheck(cv, "", "", "", false, "", nil).Run(context.Background()) assert.False(t, r.Passed) assert.Equal(t, "warning", r.Severity, "transient orchestrator failures should not fail the overall preflight") @@ -169,7 +169,7 @@ func TestRunClusterValidator_HappyPath(t *testing.T) { }, nil }) - res := runClusterValidator(context.Background(), client, "test-image:1.0", "", false) + res := runClusterValidator(context.Background(), client, "test-image:1.0", "", false, "", nil) require.NoError(t, res.Err, "happy path must not surface an error") assert.True(t, res.Passed, "Succeeded>0 maps to Passed=true") assert.Equal(t, int32(0), res.ExitCode) @@ -204,7 +204,7 @@ func TestRunClusterValidator_JobFailed(t *testing.T) { }) client.PrependReactor("list", "pods", podListReactor("")) - res := runClusterValidator(context.Background(), client, "test-image:1.0", "", false) + res := runClusterValidator(context.Background(), client, "test-image:1.0", "", false, "", nil) require.NoError(t, res.Err, "a clean Passed=false verdict must not set Err") assert.False(t, res.Passed, "Failed>0 maps to Passed=false") assert.NotEmpty(t, res.JobName, "JobName must be populated on failure for kubectl-logs follow-up") @@ -237,7 +237,7 @@ func TestRunClusterValidator_RBACIdempotent(t *testing.T) { }) client.PrependReactor("list", "pods", podListReactor("")) - res := runClusterValidator(context.Background(), client, "test-image:1.0", "", false) + res := runClusterValidator(context.Background(), client, "test-image:1.0", "", false, "", nil) require.NoError(t, res.Err, "AlreadyExists on RBAC bootstrap must be treated as success") assert.True(t, res.Passed) } @@ -264,7 +264,7 @@ func TestRunClusterValidator_RBACRefreshesClusterRoleRules(t *testing.T) { }) client.PrependReactor("list", "pods", podListReactor("")) - res := runClusterValidator(context.Background(), client, "test-image:1.0", "", false) + res := runClusterValidator(context.Background(), client, "test-image:1.0", "", false, "", nil) require.NoError(t, res.Err) got, err := client.RbacV1().ClusterRoles().Get(context.Background(), clusterValidatorName, metav1.GetOptions{}) @@ -273,6 +273,84 @@ func TestRunClusterValidator_RBACRefreshesClusterRoleRules(t *testing.T) { "ClusterRole rules must be refreshed to the current set on each run, not kept stale") } +// TestEnsureClusterValidatorRBAC_WritableResources verifies that the +// bootstrapped ClusterRole grants the write verbs required by enforcement +// checks (namespace/pod create+delete), probe log reading (pods/log get), +// and the Gateway API checks added in Req 3/4. +func TestEnsureClusterValidatorRBAC_WritableResources(t *testing.T) { + client := fake.NewSimpleClientset() + ctx := context.Background() + + require.NoError(t, ensureClusterValidatorRBAC(ctx, client)) + + cr, err := client.RbacV1().ClusterRoles().Get(ctx, clusterValidatorName, metav1.GetOptions{}) + require.NoError(t, err) + + type check struct { + group string + resource string + verb string + } + required := []check{ + // Enforcement checks create and delete probe namespaces. + {"", "namespaces", "create"}, + {"", "namespaces", "delete"}, + // Probe pods spun up for node-to-node and inter-namespace checks. + {"", "pods", "create"}, + {"", "pods", "delete"}, + // Log reading: fetch probe output without exec. + {"", "pods/log", "get"}, + // Active LB probe service. + {"", "services", "create"}, + {"", "services", "delete"}, + // Enforcement check creates/updates/deletes NetworkPolicies in temp namespace. + {"networking.k8s.io", "networkpolicies", "create"}, + {"networking.k8s.io", "networkpolicies", "update"}, + {"networking.k8s.io", "networkpolicies", "delete"}, + // Gateway API health checks. + {"gateway.networking.k8s.io", "gatewayclasses", "get"}, + {"gateway.networking.k8s.io", "gateways", "list"}, + {"gateway.networking.k8s.io", "httproutes", "get"}, + {"gateway.networking.k8s.io", "grpcroutes", "list"}, + } + + for _, want := range required { + t.Run(fmt.Sprintf("%s/%s/%s", want.group, want.resource, want.verb), func(t *testing.T) { + assert.True(t, rbacRuleCovers(cr.Rules, want.group, want.resource, want.verb), + "ClusterRole must grant %s on %s (group %q)", want.verb, want.resource, want.group) + }) + } +} + +// rbacRuleCovers returns true when any PolicyRule in rules grants verb on +// resource within group. Wildcard verbs ("*") are treated as matching any verb. +func rbacRuleCovers(rules []rbacv1.PolicyRule, group, resource, verb string) bool { + for _, r := range rules { + if len(r.NonResourceURLs) > 0 { + continue // non-resource rules don't apply to API resources + } + if !strSliceContains(r.APIGroups, group) { + continue + } + if !strSliceContains(r.Resources, resource) { + continue + } + if strSliceContains(r.Verbs, verb) || strSliceContains(r.Verbs, "*") { + return true + } + } + return false +} + +func strSliceContains(ss []string, s string) bool { + for _, v := range ss { + if v == s { + return true + } + } + return false +} + func TestRunClusterValidator_ImagePullBackOffShortCircuits(t *testing.T) { client := fake.NewSimpleClientset() var jobName atomic.Value @@ -317,7 +395,7 @@ func TestRunClusterValidator_ImagePullBackOffShortCircuits(t *testing.T) { }) start := time.Now() - res := runClusterValidator(context.Background(), client, "test-image:1.0", "", false) + res := runClusterValidator(context.Background(), client, "test-image:1.0", "", false, "", nil) elapsed := time.Since(start) require.Error(t, res.Err, "ImagePullBackOff must short-circuit the wait with an error") @@ -355,7 +433,7 @@ func TestRunClusterValidator_LogFetchSurvivesValidatorTimeout(t *testing.T) { client.PrependReactor("list", "pods", podListReactor("")) // Parent ctx stays alive for the entire run; only vctx expires. - res := runClusterValidator(context.Background(), client, "test-image:1.0", "", false) + res := runClusterValidator(context.Background(), client, "test-image:1.0", "", false, "", nil) require.Error(t, res.Err, "wait must surface the deadline-exceeded error") assert.Contains(t, res.Err.Error(), "waiting for job", @@ -408,13 +486,13 @@ func TestRunClusterValidator_ContextCanceled(t *testing.T) { time.Sleep(50 * time.Millisecond) cancel() }() - res := runClusterValidator(ctx, client, "test-image:1.0", "", false) + res := runClusterValidator(ctx, client, "test-image:1.0", "", false, "", nil) require.Error(t, res.Err) assert.Contains(t, res.Err.Error(), "context") } func TestBuildClusterValidatorJobShape(t *testing.T) { - job := buildClusterValidatorJob("test-job", "img:1", "", false) + job := buildClusterValidatorJob("test-job", "img:1", "", "", false) assert.Equal(t, "test-job", job.Name) assert.Equal(t, clusterValidatorNamespace, job.Namespace) @@ -451,19 +529,19 @@ func TestBuildClusterValidatorJobShape(t *testing.T) { } func TestBuildClusterValidatorJobShape_WithPullSecret(t *testing.T) { - job := buildClusterValidatorJob("test-job", "img:1", "nvcr-pull-secret", false) + job := buildClusterValidatorJob("test-job", "img:1", "nvcr-pull-secret", "", false) require.Len(t, job.Spec.Template.Spec.ImagePullSecrets, 1) assert.Equal(t, "nvcr-pull-secret", job.Spec.Template.Spec.ImagePullSecrets[0].Name) } func TestBuildClusterValidatorJobShape_NoPullSecret(t *testing.T) { - job := buildClusterValidatorJob("test-job", "img:1", "", false) + job := buildClusterValidatorJob("test-job", "img:1", "", "", false) assert.Empty(t, job.Spec.Template.Spec.ImagePullSecrets, "empty pull-secret arg must not produce an empty-name ImagePullSecrets entry") } func TestBuildClusterValidatorJobShape_NoCleanup(t *testing.T) { - job := buildClusterValidatorJob("test-job", "img:1", "", true) + job := buildClusterValidatorJob("test-job", "img:1", "", "", true) assert.Nil(t, job.Spec.TTLSecondsAfterFinished, "--no-cleanup must omit TTLSecondsAfterFinished so the Job persists for debugging") } @@ -521,6 +599,55 @@ func TestKubectlLogsHint_EmptyJob(t *testing.T) { "empty jobName must produce empty hint so callers can compose detail without conditionals") } +func TestBuildControlPlaneValidatorConfig_NoExtras(t *testing.T) { + got := buildControlPlaneValidatorConfig(nil) + assert.Equal(t, controlPlaneValidatorConfigTemplate, got, + "no extra registries must return the template unchanged") + assert.Contains(t, got, "nvcr.io", "nvcr.io must always be present") + assert.Contains(t, got, "enforcement:", "enforcement block must be present") +} + +func TestBuildControlPlaneValidatorConfig_WithExtras(t *testing.T) { + got := buildControlPlaneValidatorConfig([]string{"harbor.company.internal:443", "ghcr.io:443"}) + assert.Contains(t, got, "harbor.company.internal") + assert.Contains(t, got, "ghcr.io") + assert.Contains(t, got, "nvcr.io", "nvcr.io must still be present alongside extras") + assert.Contains(t, got, "enforcement:", "enforcement block must still be present after extras") + // Extra registries must appear BEFORE enforcement. + harborIdx := strings.Index(got, "harbor.company.internal") + enforcementIdx := strings.Index(got, "enforcement:") + assert.Less(t, harborIdx, enforcementIdx, "extra registry endpoints must appear before the enforcement block") +} + +func TestBuildControlPlaneValidatorConfig_InvalidRegistrySkipped(t *testing.T) { + // A blank entry is parsed as host="" → skipped; only the valid entry appears. + got := buildControlPlaneValidatorConfig([]string{" ", "valid.registry.internal:5000"}) + assert.Contains(t, got, "valid.registry.internal", "valid registry must appear") + // The blank entry must not add an empty host: line. + assert.NotContains(t, got, "host: \n", "blank entry must not produce an empty host line") +} + +func TestParseRegistryHostPort(t *testing.T) { + tests := []struct { + in string + wantHost string + wantPort int + }{ + {"nvcr.io:443", "nvcr.io", 443}, + {"harbor.company.internal:5000", "harbor.company.internal", 5000}, + {"registry.example.com", "registry.example.com", 443}, // no port → 443 + {"", "", 0}, // empty → skip + {" ", "", 0}, // blank → skip + } + for _, tt := range tests { + t.Run(tt.in, func(t *testing.T) { + h, p := parseRegistryHostPort(tt.in) + assert.Equal(t, tt.wantHost, h) + assert.Equal(t, tt.wantPort, p) + }) + } +} + func alreadyExistsReactor(resource, name string) ktesting.ReactionFunc { gr := schema.GroupResource{Resource: resource} return func(action ktesting.Action) (bool, runtime.Object, error) { From 1ffb0c0ac498f1f8b8cd64b441ad614decc7fe6e Mon Sep 17 00:00:00 2001 From: rohithb Date: Wed, 12 Aug 2026 02:14:34 +0530 Subject: [PATCH 02/36] feat(check): detect stale NVCF namespaces and add control-plane validator wiring --- .../nvcf-cli/internal/selfhosted/preflight.go | 189 ++++++++++++++--- .../internal/selfhosted/preflight_test.go | 24 ++- .../internal/selfhosted/stale_namespace.go | 114 ++++++++++ .../selfhosted/stale_namespace_test.go | 198 ++++++++++++++++++ 4 files changed, 497 insertions(+), 28 deletions(-) create mode 100644 src/clis/nvcf-cli/internal/selfhosted/stale_namespace.go create mode 100644 src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go diff --git a/src/clis/nvcf-cli/internal/selfhosted/preflight.go b/src/clis/nvcf-cli/internal/selfhosted/preflight.go index e4dc5858a1..78b0614104 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/preflight.go +++ b/src/clis/nvcf-cli/internal/selfhosted/preflight.go @@ -195,6 +195,15 @@ func runVersionCmdOnce(ctx context.Context, path string, args []string, re *rege type PreflightConfig struct { LocalOnly bool Tools []BinarySpec + + // Registries is the list of container registries to credential-check. + // When empty, the registry-credentials category is omitted entirely. + // Populated by the cmd layer from EnumerateRegistries. + Registries []RegistryEntry + + // RegistryChecker validates credentials for one registry. Nil skips the + // category. Production wires NewRegistryCredentialChecker; tests pass fakes. + RegistryChecker RegistryCredentialChecker } // DefaultTools returns the kubectl/helmfile/helm specs with version floors @@ -252,10 +261,18 @@ type Role int const ( RoleLocalOnly Role = iota // shared local-host tools only; no kubectl contact - RoleControlPlane // shared + Gateway API CRDs + default StorageClass + RoleControlPlane // shared + gateway/StorageClass/LB checks via cluster-validator RoleComputePlane // shared + GPU operator + GPU node labels + (optional) SIS reachability ) +// Validator role strings passed as VALIDATOR_ROLE to the cluster-validator Job. +// These must match the constants in the nvca cluster-validator binary's +// clustervalidator package (RoleControlPlane / RoleComputePlane). +const ( + validatorRoleControlPlane = "control-plane" + validatorRoleComputePlane = "compute-plane" +) + // String returns a human-readable name for the role. func (r Role) String() string { switch r { @@ -289,6 +306,16 @@ type RoleConfig struct { ClusterValidatorImage string ClusterValidatorPullSecret string ClusterValidatorNoCleanup bool + + // StaleNamespaceProber detects NVCF stack namespaces that are stuck + // Terminating or exist as empty shells after a partial teardown. Nil skips + // the check; production wires NewStaleNamespaceProber; tests pass fakes. + StaleNamespaceProber StaleNamespaceProber + + // ClusterValidatorRegistries is an optional list of "host:port" registry + // endpoints added to the control-plane validator ConfigMap alongside the + // built-in nvcr.io probe. Ignored for the compute-plane validator. + ClusterValidatorRegistries []string } // categorySpec groups a set of checks under a named category. Categories run @@ -318,6 +345,13 @@ func buildCategories(cfg PreflightConfig, role Role, rc RoleConfig) []categorySp out = append(out, *local) } + // Registry credential check runs from the operator's machine — no cluster + // contact needed. Placed after local-host-tools but before cluster probes + // so credential failures surface early. + if len(cfg.Registries) > 0 && cfg.RegistryChecker != nil { + out = append(out, buildRegistryCredentialCategory(cfg)) + } + if cfg.LocalOnly || role == RoleLocalOnly { return out } @@ -354,28 +388,42 @@ func buildLocalHostCategory(cfg PreflightConfig) *categorySpec { return &categorySpec{name: "local-host-tools", role: RoleLocalOnly, checks: checks} } -// controlPlaneCheckCategory returns the placeholder cluster-side checks for -// control plane: Gateway API CRDs, default StorageClass. Real probes land -// when M3 ships; for now they emit an "info" CheckResult so the renderer -// matrix is observable. -func controlPlaneCheckCategory(_ RoleConfig) categorySpec { - return categorySpec{ - name: "control-plane-cluster", - role: RoleControlPlane, - checks: []binaryCheckSpec{ - placeholderCheck("gateway-api-crds", "checking Gateway API CRDs…", "Gateway API CRD probe — pending M3 cluster-side preflight"), - placeholderCheck("default-storageclass", "checking default StorageClass…", "Default StorageClass probe — pending M3 cluster-side preflight"), - }, +// controlPlaneCheckCategory returns the cluster-side checks for the control +// plane. The stale-namespace check runs first so a leftover namespace from a +// prior partial teardown is surfaced before any other cluster work. +// Gateway API CRD and StorageClass probes are placeholders pending M3. +func controlPlaneCheckCategory(rc RoleConfig) categorySpec { + cat := categorySpec{ + name: "control-plane-cluster", + role: RoleControlPlane, + checks: []binaryCheckSpec{}, + } + // Stale namespace check runs first so leftover namespaces surface + // before any other cluster work. + if rc.StaleNamespaceProber != nil { + cat.checks = append(cat.checks, + staleNamespaceCheck(rc.StaleNamespaceProber, rc.KubeContext, nvcfControlPlaneNamespaces)) + } + // Containerized cluster-validator probe for control-plane checks + // (Gateway API CRDs, Envoy Gateway, StorageClass, external LB, + // node-to-node overlay, and reachability to nvcr.io + extra registries). + if rc.ClusterValidator != nil { + cat.checks = append(cat.checks, clusterValidatorCheck( + rc.ClusterValidator, + rc.KubeContext, + rc.ClusterValidatorImage, + rc.ClusterValidatorPullSecret, + rc.ClusterValidatorNoCleanup, + validatorRoleControlPlane, + rc.ClusterValidatorRegistries, + )) } + return cat } -// computePlaneCheckCategory returns the placeholder compute-plane checks. -// Conditionally adds an SIS reachability probe when RoleConfig.SISURL is set, -// a node-inotify-limits probe when RoleConfig.InotifyProber is set, and a -// containerized cluster-validator probe when RoleConfig.ClusterValidator is -// set. Each conditional probe is opt-in via its own RoleConfig field so -// callers that opted out via a --skip-* flag simply leave the corresponding -// field nil/empty and the check is omitted from the category entirely. +// computePlaneCheckCategory returns the compute-plane checks. SIS, inotify, +// and cluster-validator probes are opt-in via their RoleConfig fields; a nil +// or empty field omits the corresponding check from the category. func computePlaneCheckCategory(rc RoleConfig) categorySpec { cat := categorySpec{ name: "compute-plane-cluster", @@ -385,6 +433,13 @@ func computePlaneCheckCategory(rc RoleConfig) categorySpec { placeholderCheck("gpu-node-labels", "checking GPU node labels…", "GPU node-label probe — pending M+10 cluster-side preflight"), }, } + // Stale namespace check runs first so leftover namespaces from a prior + // partial teardown surface before any other cluster work. + if rc.StaleNamespaceProber != nil { + cat.checks = append([]binaryCheckSpec{ + staleNamespaceCheck(rc.StaleNamespaceProber, rc.KubeContext, nvcfComputePlaneNamespaces), + }, cat.checks...) + } if rc.SISURL != "" { cat.checks = append(cat.checks, sisReachabilityCheck(rc.SISURL)) } @@ -398,6 +453,8 @@ func computePlaneCheckCategory(rc RoleConfig) categorySpec { rc.ClusterValidatorImage, rc.ClusterValidatorPullSecret, rc.ClusterValidatorNoCleanup, + validatorRoleComputePlane, + nil, // registries: compute-plane doesn't use the ConfigMap reachability list )) } return cat @@ -503,10 +560,10 @@ func nodeInotifyCheck(prober NodeInotifyProber, kubeContext string) binaryCheckS } } -// Severity mapping: runner errors (RBAC/pull/timeout) -> warning, since -// they're operator-fixable infra issues; validator Passed=false -> -// error (real check failures); Passed=true -> info. -func clusterValidatorCheck(cv ClusterValidator, kubeContext, image, pullSecret string, noCleanup bool) binaryCheckSpec { +// clusterValidatorCheck runs the validator Job. Runner errors (RBAC/timeout) +// are warning severity; validator failures are error. role selects the check +// set via VALIDATOR_ROLE; registries extends the ConfigMap reachability list. +func clusterValidatorCheck(cv ClusterValidator, kubeContext, image, pullSecret string, noCleanup bool, role string, registries []string) binaryCheckSpec { const id = "cluster-validator" return binaryCheckSpec{ ID: id, @@ -521,6 +578,8 @@ func clusterValidatorCheck(cv ClusterValidator, kubeContext, image, pullSecret s Image: image, PullSecret: pullSecret, NoCleanup: noCleanup, + Role: role, + Registries: registries, }) r.Logs = result.Logs r.Detail = clusterValidatorDetail(result.JobName) @@ -552,6 +611,88 @@ func clusterValidatorDetail(jobName string) string { return "logs: " + hint } +// buildRegistryCredentialCategory returns the registry-credentials category +// that probes each configured registry for reachability and valid credentials. +func buildRegistryCredentialCategory(cfg PreflightConfig) categorySpec { + cat := categorySpec{ + name: "registry-credentials", + role: RoleLocalOnly, // runs regardless of cluster role + checks: make([]binaryCheckSpec, 0, len(cfg.Registries)), + } + for _, reg := range cfg.Registries { + reg := reg // capture loop var + cat.checks = append(cat.checks, registryCredentialCheck(cfg.RegistryChecker, reg)) + } + return cat +} + +// registryCredentialCheck returns a binaryCheckSpec that probes one registry. +// Critical registries (nvcr.io) fail at error severity; non-critical ones +// fail at warning so they don't block the operator on optional registries. +func registryCredentialCheck(checker RegistryCredentialChecker, entry RegistryEntry) binaryCheckSpec { + id := "registry-cred-" + entry.Registry + severity := "warning" + if entry.Critical { + severity = "error" + } + return binaryCheckSpec{ + ID: id, + HumanLabel: fmt.Sprintf("checking credentials for %s…", entry.Registry), + Run: func(ctx context.Context) CheckResult { + r := CheckResult{ + ID: id, + Severity: severity, + } + if err := checker(ctx, entry.Registry, entry.RepoHint); err != nil { + r.Message = entry.Registry + ": " + err.Error() + r.Err = err + return r + } + r.Passed = true + r.Severity = "info" + r.Message = entry.Registry + ": credentials valid" + return r + }, + } +} + +// staleNamespaceCheck detects NVCF namespaces stuck Terminating or left as +// empty shells after a partial teardown. Severity is error; prober errors +// degrade to warning so transient kubeconfig issues don't falsely fail. +func staleNamespaceCheck(prober StaleNamespaceProber, kubeContext string, namespaces []string) binaryCheckSpec { + const id = "stale-namespaces" + return binaryCheckSpec{ + ID: id, + HumanLabel: "checking for stale NVCF namespaces…", + Run: func(ctx context.Context) CheckResult { + r := CheckResult{ID: id, Severity: "error"} + stale, err := prober(ctx, kubeContext, namespaces) + if err != nil { + r.Severity = "warning" + r.Message = "stale namespace probe failed: " + err.Error() + r.Err = err + return r + } + if len(stale) == 0 { + r.Passed = true + r.Message = "no stale NVCF namespaces detected" + return r + } + parts := make([]string, 0, len(stale)) + names := make([]string, 0, len(stale)) + for _, ns := range stale { + parts = append(parts, ns.Name+" ("+ns.Reason+")") + names = append(names, ns.Name) + } + r.Message = fmt.Sprintf( + "%d stale namespace(s) detected: %s — remove with: kubectl delete namespace %s --force --grace-period=0", + len(stale), strings.Join(parts, ", "), strings.Join(names, " "), + ) + return r + }, + } +} + // placeholderCheck returns a binaryCheckSpec that emits a passing "info" // CheckResult with the given message. Used until M3/M+10 cluster-side probes ship. func placeholderCheck(id, label, message string) binaryCheckSpec { diff --git a/src/clis/nvcf-cli/internal/selfhosted/preflight_test.go b/src/clis/nvcf-cli/internal/selfhosted/preflight_test.go index 262075dff8..93dee7b253 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/preflight_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/preflight_test.go @@ -408,7 +408,10 @@ func TestRunPreflightForRole_LocalOnly(t *testing.T) { func TestRunPreflightForRole_ControlPlaneAddsClusterCategory(t *testing.T) { sink := &captureSink{} cfg := PreflightConfig{Tools: []BinarySpec{passingToolSpec("kubectl", "1.30.0")}} - res := RunPreflightForRole(context.Background(), cfg, RoleControlPlane, RoleConfig{KubeContext: "admin@cp"}, sink) + // No StaleNamespaceProber and no ClusterValidator: the control-plane + // category is empty but the category itself still fires (CategoryCompleted + // is always emitted). + RunPreflightForRole(context.Background(), cfg, RoleControlPlane, RoleConfig{KubeContext: "admin@cp"}, sink) seen := map[string]bool{} for _, e := range sink.events { @@ -417,14 +420,27 @@ func TestRunPreflightForRole_ControlPlaneAddsClusterCategory(t *testing.T) { } } assert.True(t, seen["local-host-tools"], "expected local-host-tools category") - assert.True(t, seen["control-plane-cluster"], "expected control-plane-cluster category") + assert.True(t, seen["control-plane-cluster"], "expected control-plane-cluster category even with no checks configured") +} + +func TestRunPreflightForRole_ControlPlaneWithValidatorAddsClusterValidatorCheck(t *testing.T) { + sink := &captureSink{} + cfg := PreflightConfig{Tools: []BinarySpec{passingToolSpec("kubectl", "1.30.0")}} + cv := func(_ context.Context, p ClusterValidatorParams) ClusterValidatorResult { + return ClusterValidatorResult{Passed: true} + } + res := RunPreflightForRole(context.Background(), cfg, RoleControlPlane, RoleConfig{ + KubeContext: "admin@cp", + ClusterValidator: cv, + ClusterValidatorImage: "nvcf-validator:1.0", + }, sink) var gotCheckIDs []string for _, r := range res { gotCheckIDs = append(gotCheckIDs, r.ID) } - assert.Contains(t, gotCheckIDs, "gateway-api-crds") - assert.Contains(t, gotCheckIDs, "default-storageclass") + assert.Contains(t, gotCheckIDs, "cluster-validator", + "cluster-validator check must appear when ClusterValidator is configured for control-plane role") } func TestRunPreflightForRole_ComputePlaneWithoutSISURL(t *testing.T) { diff --git a/src/clis/nvcf-cli/internal/selfhosted/stale_namespace.go b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace.go new file mode 100644 index 0000000000..8fe3131754 --- /dev/null +++ b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace.go @@ -0,0 +1,114 @@ +/* +SPDX-FileCopyrightText: Copyright (c) NVIDIA CORPORATION & AFFILIATES. All rights reserved. +SPDX-License-Identifier: Apache-2.0 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package selfhosted + +import ( + "context" + "fmt" + + corev1 "k8s.io/api/core/v1" + apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes" +) + +// nvcfControlPlaneNamespaces is the canonical set of namespaces created on the +// control-plane cluster by the NVCF self-managed stack. Any of these that +// exist without an active Helm release, or that are stuck Terminating, are +// leftover from a failed or partial teardown. +var nvcfControlPlaneNamespaces = []string{ + "cassandra-system", "nats-system", "nvcf", "api-keys", "ess", "sis", + "vault-system", "nvcf-backend", "envoy-gateway-system", "openbao-system", +} + +// nvcfComputePlaneNamespaces is the canonical set of namespaces created on the +// compute-plane cluster by the NVCF self-managed stack. +var nvcfComputePlaneNamespaces = []string{ + "nvca-operator", "nvca-system", +} + +// StaleNamespace describes a single NVCF stack namespace that appears to be a +// leftover from a failed or partial teardown. +type StaleNamespace struct { + Name string + Reason string // human-readable cause: "stuck Terminating" or "no Helm release" +} + +// StaleNamespaceProber inspects the given namespaces and returns those that +// appear stale. The probe is read-only; it never deletes or modifies anything. +// A non-nil error means the cluster could not be contacted; the returned slice +// may be a partial result. +type StaleNamespaceProber func(ctx context.Context, kubeContext string, namespaces []string) ([]StaleNamespace, error) + +// NewStaleNamespaceProber returns a StaleNamespaceProber backed by client-go. +// Chart-independent: works before any Helm release exists, and uses the +// operator's kubeconfig context to talk to the target cluster. +func NewStaleNamespaceProber() StaleNamespaceProber { + return func(ctx context.Context, kubeContext string, namespaces []string) ([]StaleNamespace, error) { + restCfg, err := loadKubeConfig(kubeContext) + if err != nil { + return nil, fmt.Errorf("building kubeconfig: %w", err) + } + client, err := kubernetes.NewForConfig(restCfg) + if err != nil { + return nil, fmt.Errorf("building kubernetes client: %w", err) + } + return probeStaleNamespaces(ctx, client, namespaces) + } +} + +// probeStaleNamespaces is the testable core that accepts a kubernetes.Interface +// so callers can inject fake.NewSimpleClientset in unit tests. +// +// A namespace is considered stale when either: +// - its DeletionTimestamp is set or its phase is Terminating (finalizer +// deadlock — it will never complete without operator intervention), or +// - it exists but holds no active Helm release (empty shell left by a partial +// helm uninstall or a failed teardown that cleaned the release but not the +// namespace). +// +// Helm 3 marks each release secret with the label owner=helm; absence of any +// such secret means no live Helm release occupies the namespace. +func probeStaleNamespaces(ctx context.Context, client kubernetes.Interface, namespaces []string) ([]StaleNamespace, error) { + var stale []StaleNamespace + for _, name := range namespaces { + ns, err := client.CoreV1().Namespaces().Get(ctx, name, metav1.GetOptions{}) + if err != nil { + if apierrors.IsNotFound(err) { + continue // absent = healthy; the check only fires on unexpected presence + } + return stale, fmt.Errorf("get namespace %s: %w", name, err) + } + + if ns.DeletionTimestamp != nil || ns.Status.Phase == corev1.NamespaceTerminating { + stale = append(stale, StaleNamespace{Name: name, Reason: "stuck Terminating"}) + continue + } + + secrets, err := client.CoreV1().Secrets(name).List(ctx, metav1.ListOptions{ + LabelSelector: "owner=helm", + }) + if err != nil { + return stale, fmt.Errorf("list Helm secrets in %s: %w", name, err) + } + if len(secrets.Items) == 0 { + stale = append(stale, StaleNamespace{Name: name, Reason: "no Helm release"}) + } + } + return stale, nil +} diff --git a/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go new file mode 100644 index 0000000000..8acd45a2fd --- /dev/null +++ b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go @@ -0,0 +1,198 @@ +/* +SPDX-FileCopyrightText: Copyright (c) NVIDIA CORPORATION & AFFILIATES. All rights reserved. +SPDX-License-Identifier: Apache-2.0 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package selfhosted + +import ( + "context" + "fmt" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes/fake" +) + +// -- probeStaleNamespaces -- + +func TestProbeStaleNamespaces_AbsentIsHealthy(t *testing.T) { + // A namespace that doesn't exist is not stale — it has simply never been + // created or was already fully deleted. + client := fake.NewSimpleClientset() + stale, err := probeStaleNamespaces(context.Background(), client, []string{"nvcf", "sis"}) + require.NoError(t, err) + assert.Empty(t, stale, "absent namespaces must not be reported as stale") +} + +func TestProbeStaleNamespaces_TerminatingIsByDeletionTimestamp(t *testing.T) { + now := metav1.Now() + client := fake.NewSimpleClientset(&corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{Name: "nvcf", DeletionTimestamp: &now}, + Status: corev1.NamespaceStatus{Phase: corev1.NamespaceActive}, + }) + stale, err := probeStaleNamespaces(context.Background(), client, []string{"nvcf"}) + require.NoError(t, err) + require.Len(t, stale, 1) + assert.Equal(t, "nvcf", stale[0].Name) + assert.Contains(t, stale[0].Reason, "Terminating") +} + +func TestProbeStaleNamespaces_TerminatingIsByPhase(t *testing.T) { + client := fake.NewSimpleClientset(&corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{Name: "sis"}, + Status: corev1.NamespaceStatus{Phase: corev1.NamespaceTerminating}, + }) + stale, err := probeStaleNamespaces(context.Background(), client, []string{"sis"}) + require.NoError(t, err) + require.Len(t, stale, 1) + assert.Equal(t, "sis", stale[0].Name) + assert.Contains(t, stale[0].Reason, "Terminating") +} + +func TestProbeStaleNamespaces_EmptyShellNoHelmSecrets(t *testing.T) { + // Namespace exists and is Active but holds no Helm release secrets → + // leftover empty shell from a partial helm uninstall. + client := fake.NewSimpleClientset(&corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{Name: "nvcf"}, + Status: corev1.NamespaceStatus{Phase: corev1.NamespaceActive}, + }) + stale, err := probeStaleNamespaces(context.Background(), client, []string{"nvcf"}) + require.NoError(t, err) + require.Len(t, stale, 1) + assert.Equal(t, "nvcf", stale[0].Name) + assert.Contains(t, stale[0].Reason, "Helm release") +} + +func TestProbeStaleNamespaces_HealthyReleaseNotStale(t *testing.T) { + // Namespace exists and carries an owner=helm secret → active Helm release, + // not stale. + client := fake.NewSimpleClientset( + &corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{Name: "nvcf"}, + Status: corev1.NamespaceStatus{Phase: corev1.NamespaceActive}, + }, + &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: "sh.helm.release.v1.nvcf.v1", + Namespace: "nvcf", + Labels: map[string]string{"owner": "helm", "name": "nvcf", "status": "deployed"}, + }, + }, + ) + stale, err := probeStaleNamespaces(context.Background(), client, []string{"nvcf"}) + require.NoError(t, err) + assert.Empty(t, stale, "namespace with an active Helm release must not be stale") +} + +func TestProbeStaleNamespaces_MixedNamespaces(t *testing.T) { + // One absent, one healthy, one terminating, one empty shell. + now := metav1.Now() + client := fake.NewSimpleClientset( + // "sis" — healthy with a Helm release + &corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{Name: "sis"}, + Status: corev1.NamespaceStatus{Phase: corev1.NamespaceActive}, + }, + &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: "sh.helm.release.v1.sis.v1", Namespace: "sis", + Labels: map[string]string{"owner": "helm"}, + }, + }, + // "nvcf" — stuck terminating + &corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{Name: "nvcf", DeletionTimestamp: &now}, + Status: corev1.NamespaceStatus{Phase: corev1.NamespaceTerminating}, + }, + // "api-keys" — empty shell + &corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{Name: "api-keys"}, + Status: corev1.NamespaceStatus{Phase: corev1.NamespaceActive}, + }, + // "cassandra-system" — absent (not present in fake) + ) + + namespaces := []string{"cassandra-system", "sis", "nvcf", "api-keys"} + stale, err := probeStaleNamespaces(context.Background(), client, namespaces) + require.NoError(t, err) + require.Len(t, stale, 2, "only nvcf (terminating) and api-keys (empty shell) should be stale") + + staleNames := make(map[string]string, 2) + for _, s := range stale { + staleNames[s.Name] = s.Reason + } + assert.Contains(t, staleNames, "nvcf") + assert.Contains(t, staleNames["nvcf"], "Terminating") + assert.Contains(t, staleNames, "api-keys") + assert.Contains(t, staleNames["api-keys"], "Helm release") +} + +// -- staleNamespaceCheck binaryCheckSpec -- + +func TestStaleNamespaceCheck_ProberErrorDegradestoWarning(t *testing.T) { + // A prober that cannot contact the cluster must not fail the overall check + // at error severity — it would produce false failures on transient network + // issues or misconfigured kubeconfigs. + prober := func(_ context.Context, _ string, _ []string) ([]StaleNamespace, error) { + return nil, fmt.Errorf("cluster unreachable") + } + r := staleNamespaceCheck(prober, "", []string{"nvcf"}).Run(context.Background()) + assert.False(t, r.Passed) + assert.Equal(t, "warning", r.Severity, + "prober errors must degrade to warning so transient failures do not block the operator") + assert.Contains(t, r.Message, "cluster unreachable") +} + +func TestStaleNamespaceCheck_StaleIsError(t *testing.T) { + // A successfully detected stale namespace must fail at error severity so + // anyFailed trips the non-zero exit code. + prober := func(_ context.Context, _ string, _ []string) ([]StaleNamespace, error) { + return []StaleNamespace{{Name: "nvcf", Reason: "stuck Terminating"}}, nil + } + r := staleNamespaceCheck(prober, "", []string{"nvcf"}).Run(context.Background()) + assert.False(t, r.Passed) + assert.Equal(t, "error", r.Severity, + "detected stale namespaces must use error severity so the exit code is non-zero") + assert.Contains(t, r.Message, "nvcf") + assert.Contains(t, r.Message, "kubectl delete namespace") +} + +func TestStaleNamespaceCheck_CleanPasses(t *testing.T) { + prober := func(_ context.Context, _ string, _ []string) ([]StaleNamespace, error) { + return nil, nil + } + r := staleNamespaceCheck(prober, "", []string{"nvcf", "sis"}).Run(context.Background()) + assert.True(t, r.Passed) +} + +func TestStaleNamespaceCheck_MessageNamesAllStaleNamespaces(t *testing.T) { + // The remediation command must name every stale namespace so the operator + // can copy-paste it without having to cross-reference the check output. + prober := func(_ context.Context, _ string, _ []string) ([]StaleNamespace, error) { + return []StaleNamespace{ + {Name: "nvcf", Reason: "stuck Terminating"}, + {Name: "api-keys", Reason: "no Helm release"}, + }, nil + } + r := staleNamespaceCheck(prober, "", []string{"nvcf", "api-keys"}).Run(context.Background()) + assert.Contains(t, r.Message, "nvcf") + assert.Contains(t, r.Message, "api-keys") + assert.Contains(t, r.Message, "kubectl delete namespace nvcf api-keys") +} From dfd490e7b2bf915e8ef825b11f30195ff118d19e Mon Sep 17 00:00:00 2001 From: rohithb Date: Wed, 12 Aug 2026 02:14:51 +0530 Subject: [PATCH 03/36] feat(check): validate registry credentials before install using generic OCI auth --- .../internal/selfhosted/registry_cred.go | 202 +++++++++++++ .../internal/selfhosted/registry_cred_test.go | 286 ++++++++++++++++++ .../internal/selfhosted/validatortag.go | 200 ++++++++++-- .../internal/selfhosted/validatortag_test.go | 52 ++++ 4 files changed, 720 insertions(+), 20 deletions(-) create mode 100644 src/clis/nvcf-cli/internal/selfhosted/registry_cred.go create mode 100644 src/clis/nvcf-cli/internal/selfhosted/registry_cred_test.go diff --git a/src/clis/nvcf-cli/internal/selfhosted/registry_cred.go b/src/clis/nvcf-cli/internal/selfhosted/registry_cred.go new file mode 100644 index 0000000000..0167a97900 --- /dev/null +++ b/src/clis/nvcf-cli/internal/selfhosted/registry_cred.go @@ -0,0 +1,202 @@ +/* +SPDX-FileCopyrightText: Copyright (c) NVIDIA CORPORATION & AFFILIATES. All rights reserved. +SPDX-License-Identifier: Apache-2.0 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package selfhosted + +import ( + "context" + "fmt" + "net/http" + "os" + "strings" + "time" + + "sigs.k8s.io/yaml" +) + +const ( + registryProbeTimeout = 10 * time.Second + + // certManagerRegistry is the well-known exception from the helmfile: + // cert-manager uses quay.io/jetstack images, not global.image.registry. + certManagerRegistry = "quay.io" +) + +// RegistryCredentialChecker probes whether credentials are present and valid +// for a registry. repoHint is the repository path used as the OAuth scope; +// pass "" to probe without a specific scope (works for public registries). +// Returns nil on success, a descriptive error otherwise. +type RegistryCredentialChecker func(ctx context.Context, registry, repoHint string) error + +// NewRegistryCredentialChecker returns a production RegistryCredentialChecker +// backed by real HTTP calls. +func NewRegistryCredentialChecker() RegistryCredentialChecker { + return probeRegistryCredential +} + +// probeRegistryCredential authenticates to registry using the OCI Bearer token +// flow. repoHint is the OAuth scope repository path. ECR registries return a +// clear diagnostic instead of attempting the Bearer flow. +func probeRegistryCredential(ctx context.Context, registry, repoHint string) error { + if isECRRegistry(registry) { + return fmt.Errorf("ECR registry detected — credential validation requires AWS CLI; " + + "run 'aws ecr get-login-password' to verify manually") + } + + pctx, cancel := context.WithTimeout(ctx, registryProbeTimeout) + defer cancel() + + client := &http.Client{Timeout: registryProbeTimeout} + + // Step 1: probe /v2/ unauthenticated. + probeURL := "https://" + registry + "/v2/" + req, err := http.NewRequestWithContext(pctx, http.MethodGet, probeURL, nil) + if err != nil { + return fmt.Errorf("build request: %w", err) + } + resp, err := client.Do(req) + if err != nil { + return fmt.Errorf("cannot reach %s: %w", registry, err) + } + + switch resp.StatusCode { + case http.StatusOK: + // Public registry — no credentials needed. + resp.Body.Close() + return nil + case http.StatusUnauthorized: + // Auth required — proceed with token exchange. + default: + resp.Body.Close() + return fmt.Errorf("unexpected status %s from %s", resp.Status, registry) + } + + // Step 2: exchange credentials for a Bearer token using the actual repo + // from the configured image (repoHint). Using a fake repo name causes + // org-level 403s from NGC and GHCR for non-existent orgs, which is + // indistinguishable from bad credentials. + wwwAuth := resp.Header.Get("Www-Authenticate") + resp.Body.Close() + + _, err = exchangeBearerToken(pctx, client, registry, repoHint, wwwAuth) + if err != nil { + // Use credentialsForRegistry (not ngcCredentials) so NGC_API_KEY does + // not masquerade as credentials for quay.io, GHCR, or Harbor — those + // registries reject NGC tokens, which would wrongly produce "credentials + // rejected" when the real diagnosis is "no credentials configured." + _, _, hasCreds := credentialsForRegistry(registry) + if !hasCreds { + return fmt.Errorf("no credentials configured for %s "+ + "(add to ~/.docker/config.json or set NGC_API_KEY for NGC registries)", registry) + } + return fmt.Errorf("credentials rejected by %s: %w", registry, err) + } + return nil +} + +// isECRRegistry returns true for AWS Elastic Container Registry hostnames, +// which use AWS SigV4 auth instead of the OCI Bearer token flow. +func isECRRegistry(registry string) bool { + return strings.Contains(registry, ".dkr.ecr.") && + strings.HasSuffix(registry, ".amazonaws.com") +} + +// RegistryEntry is one registry endpoint to credential-check. +type RegistryEntry struct { + // Registry is the hostname (and optional port) of the container registry. + Registry string + // RepoHint is the repository path used as the OAuth scope when probing + // credentials (e.g. "nvidia/nvcf-byoc/cluster-validator" for NGC). + // Empty means probe without a specific scope, which works for public + // registries (quay.io, Docker Hub public images) and GHCR anonymous access. + RepoHint string + // Critical marks registries whose credential failure should be a hard error + // rather than a warning. NGC (nvcr.io) is always critical; customer-supplied + // extras default to non-critical. + Critical bool +} + +// EnumerateRegistries builds the deduplicated list of registries to credential- +// check from the image ref, cert-manager (quay.io), the stack values file +// (global.image.registry), and operator-supplied extras. +func EnumerateRegistries(imageRef, stackValuesFile string, extras []string) []RegistryEntry { + seen := make(map[string]bool) + var out []RegistryEntry + + add := func(registry string, critical bool) { + registry = strings.TrimSpace(registry) + if registry == "" || seen[registry] { + return + } + seen[registry] = true + out = append(out, RegistryEntry{Registry: registry, Critical: critical}) + } + + // Source 1: base registry from the configured validator image. + // Carry the repo path as a scope hint so the token exchange uses the + // operator's actual org rather than a fake one — NGC returns 403 for + // orgs the API key cannot access, even if the key itself is valid. + if reg, repo, _, ok := parseImageRef(imageRef); ok && reg != "" { + seen[reg] = true + out = append(out, RegistryEntry{Registry: reg, RepoHint: repo, Critical: true}) + } + + // Source 2: read global.image.registry from the environment values file. + // This catches cases where the operator points at a custom NGC org or a + // staging environment that differs from the validator image's registry. + if stackValuesFile != "" { + if reg := readGlobalImageRegistry(stackValuesFile); reg != "" { + // If it's an NGC registry, mark critical; customer mirrors are non-critical. + add(reg, isNGCRegistry(reg)) + } + } + + // Source 3: cert-manager's well-known exception (quay.io/jetstack). + // cert-manager ignores global.image.registry and always pulls from quay.io. + add(certManagerRegistry, false) + + // Source 4: operator-supplied extras (--cluster-validator-registries). + for _, e := range extras { + host, _ := parseRegistryHostPort(e) + if host != "" { + add(host, false) + } + } + + return out +} + +// readGlobalImageRegistry reads the global.image.registry key from an +// environment values YAML file (e.g. environments/local.yaml). Returns "" +// on any error so the caller can safely ignore missing or malformed files. +func readGlobalImageRegistry(path string) string { + data, err := os.ReadFile(path) + if err != nil { + return "" + } + var vals struct { + Global struct { + Image struct { + Registry string `json:"registry" yaml:"registry"` + } `json:"image" yaml:"image"` + } `json:"global" yaml:"global"` + } + if err := yaml.Unmarshal(data, &vals); err != nil { + return "" + } + return strings.TrimSpace(vals.Global.Image.Registry) +} diff --git a/src/clis/nvcf-cli/internal/selfhosted/registry_cred_test.go b/src/clis/nvcf-cli/internal/selfhosted/registry_cred_test.go new file mode 100644 index 0000000000..2c9bfcb667 --- /dev/null +++ b/src/clis/nvcf-cli/internal/selfhosted/registry_cred_test.go @@ -0,0 +1,286 @@ +/* +SPDX-FileCopyrightText: Copyright (c) NVIDIA CORPORATION & AFFILIATES. All rights reserved. +SPDX-License-Identifier: Apache-2.0 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package selfhosted + +import ( + "context" + "fmt" + "net/http" + "net/http/httptest" + "os" + "strings" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// -- probeRegistryCredential -- + +func TestProbeRegistryCredential_PublicRegistry(t *testing.T) { + // Registry returns 200 on /v2/ → public, no credentials needed. + srv := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + })) + defer srv.Close() + + // Replace the default transport with the test server's transport so TLS + // validation passes against the self-signed cert. + origTransport := http.DefaultTransport + http.DefaultTransport = srv.Client().Transport + t.Cleanup(func() { http.DefaultTransport = origTransport }) + + // Use the test server's host as the registry. + host := strings.TrimPrefix(srv.URL, "https://") + err := probeRegistryCredential(context.Background(), host, "") + assert.NoError(t, err, "public registry (200 on /v2/) must not return an error") +} + +func TestProbeRegistryCredential_AuthSucceeds(t *testing.T) { + // Registry: /v2/ returns 401 with WWW-Authenticate; token endpoint returns a token. + tokenSrv := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // Token endpoint always succeeds. + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + _, _ = w.Write([]byte(`{"token":"test-token-abc"}`)) + })) + defer tokenSrv.Close() + + registrySrv := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Header.Get("Authorization") == "Bearer test-token-abc" { + w.WriteHeader(http.StatusOK) + return + } + // Point the client at our token server. + realm := tokenSrv.URL + "/token" + w.Header().Set("Www-Authenticate", + `Bearer realm="`+realm+`",service="test-registry",scope="repository:test:pull"`) + w.WriteHeader(http.StatusUnauthorized) + })) + defer registrySrv.Close() + + transport := registrySrv.Client().Transport + origTransport := http.DefaultTransport + http.DefaultTransport = transport + t.Cleanup(func() { http.DefaultTransport = origTransport }) + + host := strings.TrimPrefix(registrySrv.URL, "https://") + err := probeRegistryCredential(context.Background(), host, "") + assert.NoError(t, err, "successful token exchange must return nil") +} + +func TestProbeRegistryCredential_AuthFails(t *testing.T) { + // Registry returns 401 but the token endpoint returns 401 too → bad credentials. + tokenSrv := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusUnauthorized) + })) + defer tokenSrv.Close() + + registrySrv := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + realm := tokenSrv.URL + "/token" + w.Header().Set("Www-Authenticate", + `Bearer realm="`+realm+`",service="test-registry"`) + w.WriteHeader(http.StatusUnauthorized) + })) + defer registrySrv.Close() + + transport := registrySrv.Client().Transport + origTransport := http.DefaultTransport + http.DefaultTransport = transport + t.Cleanup(func() { http.DefaultTransport = origTransport }) + + host := strings.TrimPrefix(registrySrv.URL, "https://") + err := probeRegistryCredential(context.Background(), host, "") + assert.Error(t, err, "failed token exchange must return an error") +} + +func TestProbeRegistryCredential_ECRSkipped(t *testing.T) { + // ECR registries must get a clear "use AWS CLI" message rather than a + // confusing Bearer token failure. + err := probeRegistryCredential(context.Background(), + "123456789.dkr.ecr.us-east-1.amazonaws.com", "") + require.Error(t, err) + assert.Contains(t, err.Error(), "ECR", "ECR registries must produce a clear diagnostic") + assert.Contains(t, err.Error(), "AWS", "message must mention AWS") +} + +// -- EnumerateRegistries -- + +func TestEnumerateRegistries_FromImageRef(t *testing.T) { + entries := EnumerateRegistries("nvcr.io/nvidia/nvcf-byoc/cluster-validator:3.1.0", "", nil) + require.NotEmpty(t, entries) + + found := false + for _, e := range entries { + if e.Registry == "nvcr.io" { + assert.True(t, e.Critical, "nvcr.io must be marked critical") + found = true + } + } + assert.True(t, found, "nvcr.io must appear in the enumerated registries") +} + +func TestEnumerateRegistries_RepoHintFromImageRef(t *testing.T) { + // The RepoHint must be the repo path from the image ref so the token + // exchange uses the operator's actual org, not a fake one. + entries := EnumerateRegistries("nvcr.io/nvidia/nvcf-byoc/cluster-validator:3.1.0", "", nil) + for _, e := range entries { + if e.Registry == "nvcr.io" { + assert.Equal(t, "nvidia/nvcf-byoc/cluster-validator", e.RepoHint, + "RepoHint must carry the actual repo path for correct NGC token scope") + return + } + } + t.Fatal("nvcr.io not found in entries") +} + +func TestEnumerateRegistries_AlwaysIncludesCertManager(t *testing.T) { + // cert-manager always uses quay.io — it must appear even when not in extras. + entries := EnumerateRegistries("nvcr.io/some/image:1.0", "", nil) + found := false + for _, e := range entries { + if e.Registry == "quay.io" { + assert.False(t, e.Critical, "quay.io must be non-critical") + found = true + } + } + assert.True(t, found, "quay.io must always be included for cert-manager") +} + +func TestEnumerateRegistries_ExtrasAppended(t *testing.T) { + entries := EnumerateRegistries("nvcr.io/some/image:1.0", "", + []string{"harbor.company.internal:443", "ghcr.io:443"}) + + registries := make(map[string]bool, len(entries)) + for _, e := range entries { + registries[e.Registry] = true + } + assert.True(t, registries["harbor.company.internal"], "extra registry must be added") + assert.True(t, registries["ghcr.io"], "extra registry must be added") +} + +func TestEnumerateRegistries_NoDuplicates(t *testing.T) { + // Pass nvcr.io both as the image registry and as an extra — must not dedup. + entries := EnumerateRegistries("nvcr.io/some/image:1.0", "", + []string{"nvcr.io"}) + + count := 0 + for _, e := range entries { + if e.Registry == "nvcr.io" { + count++ + } + } + assert.Equal(t, 1, count, "nvcr.io must appear exactly once even when listed twice") +} + +func TestEnumerateRegistries_StackValuesFile(t *testing.T) { + // Write a minimal environments/local.yaml to a temp dir. + dir := t.TempDir() + valuesPath := dir + "/local.yaml" + require.NoError(t, writeFile(valuesPath, []byte(` +global: + image: + registry: stg.nvcr.io +`))) + + entries := EnumerateRegistries("nvcr.io/some/image:1.0", valuesPath, nil) + found := false + for _, e := range entries { + if e.Registry == "stg.nvcr.io" { + assert.True(t, e.Critical, "NGC staging registry must be critical") + found = true + } + } + assert.True(t, found, "registry from values file must be included") +} + +func TestReadGlobalImageRegistry_ValidFile(t *testing.T) { + dir := t.TempDir() + path := dir + "/values.yaml" + require.NoError(t, writeFile(path, []byte(` +global: + image: + registry: nvcr.io + repository: nvidia/nvcf-byoc +`))) + got := readGlobalImageRegistry(path) + assert.Equal(t, "nvcr.io", got) +} + +func TestReadGlobalImageRegistry_MissingFile(t *testing.T) { + got := readGlobalImageRegistry("/nonexistent/path/values.yaml") + assert.Empty(t, got, "missing file must return empty string, not error") +} + +func TestReadGlobalImageRegistry_MissingKey(t *testing.T) { + dir := t.TempDir() + path := dir + "/values.yaml" + require.NoError(t, writeFile(path, []byte(`other: value`))) + got := readGlobalImageRegistry(path) + assert.Empty(t, got, "missing global.image.registry must return empty string") +} + +// -- isECRRegistry -- + +func TestIsECRRegistry(t *testing.T) { + assert.True(t, isECRRegistry("123456789012.dkr.ecr.us-east-1.amazonaws.com")) + assert.True(t, isECRRegistry("999999999999.dkr.ecr.eu-west-1.amazonaws.com")) + assert.False(t, isECRRegistry("nvcr.io")) + assert.False(t, isECRRegistry("ghcr.io")) + assert.False(t, isECRRegistry("harbor.company.internal")) + assert.False(t, isECRRegistry("s3.amazonaws.com")) // S3, not ECR +} + +// -- registryCredentialCheck binaryCheckSpec -- + +func TestRegistryCredentialCheck_PassWhenNoError(t *testing.T) { + checker := func(_ context.Context, reg, _ string) error { return nil } + spec := registryCredentialCheck(checker, RegistryEntry{Registry: "nvcr.io", Critical: true}) + r := spec.Run(context.Background()) + assert.True(t, r.Passed) + assert.Equal(t, "info", r.Severity) + assert.Contains(t, r.Message, "nvcr.io") +} + +func TestRegistryCredentialCheck_CriticalSeverityOnFailure(t *testing.T) { + checker := func(_ context.Context, reg, _ string) error { + return errorf("credentials rejected") + } + spec := registryCredentialCheck(checker, RegistryEntry{Registry: "nvcr.io", Critical: true}) + r := spec.Run(context.Background()) + assert.False(t, r.Passed) + assert.Equal(t, "error", r.Severity, "critical registry failure must be error severity") +} + +func TestRegistryCredentialCheck_WarningSeverityOnNonCriticalFailure(t *testing.T) { + checker := func(_ context.Context, reg, _ string) error { + return errorf("credentials rejected") + } + spec := registryCredentialCheck(checker, RegistryEntry{Registry: "quay.io", Critical: false}) + r := spec.Run(context.Background()) + assert.False(t, r.Passed) + assert.Equal(t, "warning", r.Severity, "non-critical registry failure must be warning severity") +} + +// helpers + +func errorf(msg string) error { return fmt.Errorf("%s", msg) } + +func writeFile(path string, data []byte) error { + return os.WriteFile(path, data, 0o644) +} diff --git a/src/clis/nvcf-cli/internal/selfhosted/validatortag.go b/src/clis/nvcf-cli/internal/selfhosted/validatortag.go index f6750bbf35..4578184db5 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/validatortag.go +++ b/src/clis/nvcf-cli/internal/selfhosted/validatortag.go @@ -24,6 +24,7 @@ import ( "fmt" "io" "net/http" + "net/url" "os" "path/filepath" "regexp" @@ -132,11 +133,11 @@ func fetchValidatorTags(ctx context.Context, registry, repo string) ([]string, e return doc.Tags, nil } -func fetchWithBearer(ctx context.Context, url, registry, repo string) ([]byte, error) { +func fetchWithBearer(ctx context.Context, rawURL, registry, repo string) ([]byte, error) { client := &http.Client{Timeout: validatorTagFetchTimeout} // First attempt without auth so anonymous-pullable registries work. - req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) + req, err := http.NewRequestWithContext(ctx, http.MethodGet, rawURL, nil) if err != nil { return nil, err } @@ -152,16 +153,19 @@ func fetchWithBearer(ctx context.Context, url, registry, repo string) ([]byte, e resp.Body.Close() return nil, fmt.Errorf("registry returned %s", resp.Status) } + // Capture the auth challenge before closing. + wwwAuth := resp.Header.Get("Www-Authenticate") resp.Body.Close() - // Bearer-token exchange. Realm and scope come from the Www-Authenticate - // header; for NGC the realm is /proxy_auth and scope is repository::pull. - token, err := exchangeBearerToken(ctx, client, registry, repo) + // Generic OCI Bearer-token exchange: uses the realm/service/scope from + // the WWW-Authenticate header so any OCI-compliant registry works, not + // just NGC. Falls back to NGC's /proxy_auth when the header is absent. + token, err := exchangeBearerToken(ctx, client, registry, repo, wwwAuth) if err != nil { return nil, err } - req, err = http.NewRequestWithContext(ctx, http.MethodGet, url, nil) + req, err = http.NewRequestWithContext(ctx, http.MethodGet, rawURL, nil) if err != nil { return nil, err } @@ -177,21 +181,100 @@ func fetchWithBearer(ctx context.Context, url, registry, repo string) ([]byte, e return io.ReadAll(resp.Body) } -// exchangeBearerToken does the NGC token exchange using credentials -// resolved from ~/.docker/config.json or NGC env vars. -// -// NGC-specific: this constructs the token URL using NGC's /proxy_auth -// realm rather than parsing the Www-Authenticate header from the 401 -// response (the generic OAuth2 distribution flow). Non-NGC registries -// (GCR, ECR, GHCR, Harbor, etc.) will return a non-200 here and the -// caller falls back to using the configured image reference as-is. -// Acceptable for v1 since the validator image only ships from NGC. -func exchangeBearerToken(ctx context.Context, client *http.Client, registry, repo string) (string, error) { +// exchangeBearerToken implements the OCI Distribution Spec Bearer token flow, +// parsing realm/service/scope from the WWW-Authenticate header. Falls back to +// the NGC /proxy_auth endpoint when the header is absent or unparseable. +func exchangeBearerToken(ctx context.Context, client *http.Client, registry, repo, wwwAuthenticate string) (string, error) { + realm, service, scope := parseWWWAuthenticate(wwwAuthenticate) + + if realm == "" { + // No parseable WWW-Authenticate — use NGC's /proxy_auth as fallback. + return exchangeNGCBearerToken(ctx, client, registry, repo) + } + + // Build the token endpoint URL with service and scope query parameters. + u, err := url.Parse(realm) + if err != nil { + return exchangeNGCBearerToken(ctx, client, registry, repo) + } + q := u.Query() + if service != "" { + q.Set("service", service) + } + // Use scope from the WWW-Authenticate header when present. + // When scope is empty and a repo is provided, synthesize the standard + // pull scope. When neither is present (credential probe, no specific + // repo needed), omit scope entirely — most registries issue a valid + // token and the absence of a resource scope avoids org-level 403s for + // non-existent repositories. + if scope == "" && repo != "" { + scope = "repository:" + repo + ":pull" + } + if scope != "" { + q.Set("scope", scope) + } + u.RawQuery = q.Encode() + + req, err := http.NewRequestWithContext(ctx, http.MethodGet, u.String(), nil) + if err != nil { + return "", err + } + // Add credentials when present. Docker config covers any registry; + // NGC API key is only applicable to NGC-hosted registries. + // Critically: do NOT apply NGC_API_KEY to non-NGC registries — quay.io, + // GHCR, and Harbor will reject it, producing a misleading "credentials + // rejected" error when the real situation is "no credentials configured." + if user, pass, ok := credentialsForRegistry(registry); ok { + req.SetBasicAuth(user, pass) + } + + resp, err := client.Do(req) + if err != nil { + return "", err + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + // WWW-Authenticate realm failed — try NGC's /proxy_auth as last resort + // for registries that implement both endpoints (e.g. staging NGC envs). + if isNGCRegistry(registry) { + return exchangeNGCBearerToken(ctx, client, registry, repo) + } + return "", fmt.Errorf("token exchange at %s returned %s", realm, resp.Status) + } + + // Both "token" (OCI spec) and "access_token" (Docker Hub variant) are valid. + var doc struct { + Token string `json:"token"` + AccessToken string `json:"access_token"` + } + if err := json.NewDecoder(resp.Body).Decode(&doc); err != nil { + return "", fmt.Errorf("decode token response: %w", err) + } + tok := doc.Token + if tok == "" { + tok = doc.AccessToken + } + if tok == "" { + return "", fmt.Errorf("empty token in response from %s", realm) + } + return tok, nil +} + +// exchangeNGCBearerToken is the NGC-specific /proxy_auth token exchange, +// kept as a named fallback for when the standard OCI flow cannot be used. +func exchangeNGCBearerToken(ctx context.Context, client *http.Client, registry, repo string) (string, error) { user, pass, ok := ngcCredentials(registry) if !ok { - return "", fmt.Errorf("no NGC credentials for %s", registry) + return "", fmt.Errorf("no credentials for %s", registry) + } + // Build scope: use actual repo when provided; omit when empty so the NGC + // /proxy_auth endpoint validates the key without org-scoped access checks. + scope := "" + if repo != "" { + scope = "repository:" + repo + ":pull" } - tokenURL := fmt.Sprintf("https://%s/proxy_auth?service=%s&scope=repository:%s:pull", registry, registry, repo) + tokenURL := fmt.Sprintf("https://%s/proxy_auth?service=%s&scope=%s", + registry, registry, scope) req, err := http.NewRequestWithContext(ctx, http.MethodGet, tokenURL, nil) if err != nil { return "", err @@ -203,7 +286,7 @@ func exchangeBearerToken(ctx context.Context, client *http.Client, registry, rep } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { - return "", fmt.Errorf("token exchange returned %s", resp.Status) + return "", fmt.Errorf("NGC token exchange returned %s", resp.Status) } var doc struct { Token string `json:"token"` @@ -212,11 +295,88 @@ func exchangeBearerToken(ctx context.Context, client *http.Client, registry, rep return "", err } if doc.Token == "" { - return "", fmt.Errorf("empty token in response") + return "", fmt.Errorf("empty token in NGC response") } return doc.Token, nil } +// parseWWWAuthenticate extracts realm, service, and scope from a standard +// Bearer challenge header: +// +// Bearer realm="https://auth.example.com/token",service="reg.example.com",scope="repository:lib:pull" +// +// Returns empty strings when the header is absent, not a Bearer challenge, or +// cannot be parsed. The parser handles quoted values that might contain commas. +func parseWWWAuthenticate(header string) (realm, service, scope string) { + const prefix = "Bearer " + if !strings.HasPrefix(header, prefix) { + return + } + params := strings.TrimSpace(header[len(prefix):]) + for len(params) > 0 { + // Find key= + eq := strings.IndexByte(params, '=') + if eq < 0 { + break + } + key := strings.TrimSpace(params[:eq]) + params = params[eq+1:] + + // Read value (quoted or unquoted) + var val string + if strings.HasPrefix(params, `"`) { + end := strings.IndexByte(params[1:], '"') + if end < 0 { + break + } + val = params[1 : end+1] + params = strings.TrimPrefix(strings.TrimSpace(params[end+2:]), ",") + } else { + comma := strings.IndexByte(params, ',') + if comma < 0 { + val = params + params = "" + } else { + val = params[:comma] + params = params[comma+1:] + } + } + + switch key { + case "realm": + realm = val + case "service": + service = val + case "scope": + scope = val + } + } + return +} + +// isNGCRegistry returns true when the registry is hosted on an NVIDIA / NGC +// domain, where the /proxy_auth fallback applies. +func isNGCRegistry(registry string) bool { + return strings.HasSuffix(registry, "nvcr.io") || + strings.Contains(registry, "nvidia.com") || + strings.Contains(registry, "ngc.nvidia") +} + +// credentialsForRegistry resolves (username, password) for any registry. +// Checks ~/.docker/config.json first, then falls back to NGC_API_KEY only +// for NGC-domain registries to avoid sending NGC creds to unrelated registries. +func credentialsForRegistry(registry string) (string, string, bool) { + if u, p, ok := credsFromDockerConfig(registry); ok { + return u, p, true + } + if isNGCRegistry(registry) { + if key := firstNonEmptyEnv(ngcAPIKeyEnvNames...); key != "" { + return "$oauthtoken", key, true + } + } + return "", "", false +} + // ngcCredentials resolves (username, password) for an NGC-hosted registry. // Checks ~/.docker/config.json first; falls back to NGC_API_KEY env vars // with the literal "$oauthtoken" sentinel username NGC expects. diff --git a/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go b/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go index 0bd57306d2..b7c58c8979 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go @@ -252,3 +252,55 @@ func TestNGCCredentials_EnvFallback(t *testing.T) { assert.Equal(t, "$oauthtoken", user) assert.Equal(t, "from-env", pass) } + +// -- parseWWWAuthenticate -- + +func TestParseWWWAuthenticate_Standard(t *testing.T) { + header := `Bearer realm="https://auth.docker.io/token",service="registry-1.docker.io",scope="repository:library/ubuntu:pull"` + realm, service, scope := parseWWWAuthenticate(header) + assert.Equal(t, "https://auth.docker.io/token", realm) + assert.Equal(t, "registry-1.docker.io", service) + assert.Equal(t, "repository:library/ubuntu:pull", scope) +} + +func TestParseWWWAuthenticate_GHCR(t *testing.T) { + header := `Bearer realm="https://ghcr.io/token",service="ghcr.io",scope="repository:owner/image:pull"` + realm, service, scope := parseWWWAuthenticate(header) + assert.Equal(t, "https://ghcr.io/token", realm) + assert.Equal(t, "ghcr.io", service) + assert.Equal(t, "repository:owner/image:pull", scope) +} + +func TestParseWWWAuthenticate_NoBearer(t *testing.T) { + // Basic auth challenge — should return empty strings. + realm, service, scope := parseWWWAuthenticate(`Basic realm="My Registry"`) + assert.Empty(t, realm) + assert.Empty(t, service) + assert.Empty(t, scope) +} + +func TestParseWWWAuthenticate_Empty(t *testing.T) { + realm, service, scope := parseWWWAuthenticate("") + assert.Empty(t, realm) + assert.Empty(t, service) + assert.Empty(t, scope) +} + +func TestParseWWWAuthenticate_RealmOnly(t *testing.T) { + // Some registries omit service/scope in the initial challenge. + realm, service, scope := parseWWWAuthenticate(`Bearer realm="https://example.com/auth"`) + assert.Equal(t, "https://example.com/auth", realm) + assert.Empty(t, service) + assert.Empty(t, scope) +} + +// -- isNGCRegistry -- + +func TestIsNGCRegistry(t *testing.T) { + assert.True(t, isNGCRegistry("nvcr.io")) + assert.True(t, isNGCRegistry("stg.nvcr.io")) + assert.True(t, isNGCRegistry("registry.nvidia.com")) + assert.False(t, isNGCRegistry("ghcr.io")) + assert.False(t, isNGCRegistry("quay.io")) + assert.False(t, isNGCRegistry("harbor.company.internal")) +} From 1deb005edbc47f7c95f5d218b0752cfa8c37df00 Mon Sep 17 00:00:00 2001 From: rohithb Date: Wed, 12 Aug 2026 02:43:00 +0530 Subject: [PATCH 04/36] build(check): update BUILD.bazel for new selfhosted sources and deps --- src/clis/nvcf-cli/cmd/BUILD.bazel | 1 + src/clis/nvcf-cli/internal/selfhosted/BUILD.bazel | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/src/clis/nvcf-cli/cmd/BUILD.bazel b/src/clis/nvcf-cli/cmd/BUILD.bazel index 22671a8212..d43245fb1a 100644 --- a/src/clis/nvcf-cli/cmd/BUILD.bazel +++ b/src/clis/nvcf-cli/cmd/BUILD.bazel @@ -135,6 +135,7 @@ go_test( "//src/clis/nvcf-cli/internal/selfhosted", "//src/clis/nvcf-cli/internal/selfhosted/auth", "//src/clis/nvcf-cli/internal/selfhosted/controlplaneprofile", + "//src/clis/nvcf-cli/internal/selfhosted/kubectx", "//src/clis/nvcf-cli/internal/selfhosted/progress", "//src/clis/nvcf-cli/internal/selfhosted/reachability", "//src/clis/nvcf-cli/internal/selfhosted/teardown", diff --git a/src/clis/nvcf-cli/internal/selfhosted/BUILD.bazel b/src/clis/nvcf-cli/internal/selfhosted/BUILD.bazel index 7737a9a8b9..1a508d967d 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/BUILD.bazel +++ b/src/clis/nvcf-cli/internal/selfhosted/BUILD.bazel @@ -26,8 +26,10 @@ go_library( "preflight.go", "pullsecret.go", "register.go", + "registry_cred.go", "render.go", "stack.go", + "stale_namespace.go", "validatortag.go", ], importpath = "nvcf-cli/internal/selfhosted", @@ -46,6 +48,7 @@ go_library( "@io_k8s_client_go//kubernetes", "@io_k8s_client_go//rest", "@io_k8s_client_go//tools/clientcmd", + "@io_k8s_sigs_yaml//:yaml", "@org_golang_x_sync//errgroup", ], ) @@ -60,8 +63,10 @@ go_test( "preflight_test.go", "pullsecret_test.go", "register_test.go", + "registry_cred_test.go", "render_test.go", "stack_test.go", + "stale_namespace_test.go", "validatortag_test.go", ], embed = [":selfhosted"], From 4d7c477f1893685169362564d5ad5af58110348f Mon Sep 17 00:00:00 2001 From: rohithb Date: Wed, 12 Aug 2026 15:16:51 +0530 Subject: [PATCH 05/36] fix(check): address code-review findings in cluster-validator and preflight checks --- src/clis/nvcf-cli/cmd/self_hosted_check.go | 13 +++--- .../nvcf-cli/cmd/self_hosted_check_test.go | 40 ++++++++++++++++++- .../internal/selfhosted/clustervalidator.go | 10 ++++- .../selfhosted/clustervalidator_test.go | 10 +++++ .../nvcf-cli/internal/selfhosted/preflight.go | 35 +++++++++++----- .../internal/selfhosted/registry_cred.go | 31 ++++++++++---- .../internal/selfhosted/registry_cred_test.go | 14 +++---- .../internal/selfhosted/stale_namespace.go | 5 +++ .../selfhosted/stale_namespace_test.go | 5 ++- .../internal/selfhosted/validatortag.go | 11 ++++- 10 files changed, 137 insertions(+), 37 deletions(-) diff --git a/src/clis/nvcf-cli/cmd/self_hosted_check.go b/src/clis/nvcf-cli/cmd/self_hosted_check.go index 2498e8340f..deffda153a 100644 --- a/src/clis/nvcf-cli/cmd/self_hosted_check.go +++ b/src/clis/nvcf-cli/cmd/self_hosted_check.go @@ -152,13 +152,16 @@ func runSelfHostedCheck(c *cobra.Command, _ []string) error { } clusterValidatorWillRun := anyValidatorIsTargeted && clusterValidatorImage != "" - // The cluster-validator Job's internal budget is 5m - // (selfhosted.clusterValidatorTimeout). The outer ctx must be at least - // that plus headroom for RBAC bootstrap + log fetch, otherwise vctx - // derives from a shorter ceiling and silently truncates the wait. outerTimeout := 2 * time.Minute if clusterValidatorWillRun { - outerTimeout = 6 * time.Minute + // Each validator Job has a 5m internal budget. ModeSingle runs both + // validators sequentially (two 5m runs); ModeSplit runs them in + // parallel so one 6m ceiling covers both. + if mode == kubectx.ModeSingle && controlPlaneIsTargeted(mode) && computePlaneIsTargeted(mode) { + outerTimeout = 12 * time.Minute + } else { + outerTimeout = 6 * time.Minute + } } // --wait polls for the declared duration. The outer ctx has to outlive // the last iteration, so add waitDur on top of a single iteration's diff --git a/src/clis/nvcf-cli/cmd/self_hosted_check_test.go b/src/clis/nvcf-cli/cmd/self_hosted_check_test.go index 218bdca80c..53bc744c3a 100644 --- a/src/clis/nvcf-cli/cmd/self_hosted_check_test.go +++ b/src/clis/nvcf-cli/cmd/self_hosted_check_test.go @@ -384,6 +384,40 @@ func TestComputePlaneIsTargeted(t *testing.T) { } } +func TestControlPlaneIsTargeted(t *testing.T) { + t.Cleanup(func() { + checkPre = false + checkControlPlane = false + checkAll = false + }) + + tests := []struct { + name string + pre bool + cp bool + all bool + mode kubectx.Mode + want bool + }{ + {"--control-plane single", false, true, false, kubectx.ModeSingle, true}, + {"--control-plane split", false, true, false, kubectx.ModeSplit, true}, + {"--all single", false, false, true, kubectx.ModeSingle, true}, + {"--all split", false, false, true, kubectx.ModeSplit, true}, + {"--pre single -- implicit control plane", true, false, false, kubectx.ModeSingle, true}, + {"--pre split -- must not target control plane", true, false, false, kubectx.ModeSplit, false}, + {"--compute-plane only", false, false, false, kubectx.ModeSingle, false}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + checkPre = tt.pre + checkControlPlane = tt.cp + checkAll = tt.all + assert.Equal(t, tt.want, controlPlaneIsTargeted(tt.mode)) + }) + } +} + // TestCheck_ComputePlaneFlagRunsChecks verifies that --compute-plane alone // produces compute-plane-cluster category events. Before the gating fix this // flag was a complete no-op and produced no check events at all. @@ -398,7 +432,8 @@ func TestCheck_ComputePlaneFlagRunsChecks(t *testing.T) { rootCmd.SetErr(&stderr) rootCmd.SetOut(&bytes.Buffer{}) - rootCmd.SetArgs([]string{"self-hosted", "check", "--compute-plane", "--json"}) + t.Setenv("NVCF_CLI_SELFHOSTED_SKIP_INOTIFY", "1") + rootCmd.SetArgs([]string{"self-hosted", "check", "--compute-plane", "--skip-cluster-validation", "--json"}) _ = rootCmd.Execute() lines := parseJSONLLines(t, stderr.String()) @@ -429,7 +464,8 @@ func TestCheck_ControlPlaneFlagRunsChecks(t *testing.T) { rootCmd.SetErr(&stderr) rootCmd.SetOut(&bytes.Buffer{}) - rootCmd.SetArgs([]string{"self-hosted", "check", "--control-plane", "--json"}) + t.Setenv("NVCF_CLI_SELFHOSTED_SKIP_INOTIFY", "1") + rootCmd.SetArgs([]string{"self-hosted", "check", "--control-plane", "--skip-cluster-validation", "--json"}) _ = rootCmd.Execute() lines := parseJSONLLines(t, stderr.String()) diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go index a9e1c6832b..c779eac997 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go @@ -142,10 +142,13 @@ func runClusterValidator(ctx context.Context, client kubernetes.Interface, image // checks. Best-effort: a failure here is logged but does not abort the // run — the validator gracefully skips configurable checks when the // ConfigMap is absent. + var configNote string if role == clusterValidatorControlPlaneRole { if err := ensureClusterValidatorConfig(vctx, client, registries); err != nil { - // Non-fatal: reachability checks will be skipped, not the whole run. - _ = err + // Non-fatal: continue without the ConfigMap; the validator skips + // configurable reachability and enforcement checks silently unless + // we surface this note in the transcript. + configNote = fmt.Sprintf("note: validator config not applied (%v); reachability checks may be skipped", err) } } @@ -166,6 +169,9 @@ func runClusterValidator(ctx context.Context, client kubernetes.Interface, image defer logCancel() rawLogs, _ := fetchClusterValidatorLogs(logCtx, client, jobName) cleaned := cleanValidatorOutput(rawLogs) + if configNote != "" { + cleaned = configNote + "\n" + cleaned + } if waitErr != nil { return ClusterValidatorResult{ diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go index 95051c402a..44f487581b 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go @@ -528,6 +528,16 @@ func TestBuildClusterValidatorJobShape(t *testing.T) { "preflight invocation must tag the validator so it does not attempt the metrics ConfigMap write") } +func TestBuildClusterValidatorJobShape_ValidatorRoleInEnv(t *testing.T) { + job := buildClusterValidatorJob("test-job", "img:1", "", clusterValidatorControlPlaneRole, false) + env := map[string]string{} + for _, e := range job.Spec.Template.Spec.Containers[0].Env { + env[e.Name] = e.Value + } + assert.Equal(t, clusterValidatorControlPlaneRole, env["VALIDATOR_ROLE"], + "VALIDATOR_ROLE must carry the role to the validator binary") +} + func TestBuildClusterValidatorJobShape_WithPullSecret(t *testing.T) { job := buildClusterValidatorJob("test-job", "img:1", "nvcr-pull-secret", "", false) require.Len(t, job.Spec.Template.Spec.ImagePullSecrets, 1) diff --git a/src/clis/nvcf-cli/internal/selfhosted/preflight.go b/src/clis/nvcf-cli/internal/selfhosted/preflight.go index 78b0614104..89e053256b 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/preflight.go +++ b/src/clis/nvcf-cli/internal/selfhosted/preflight.go @@ -346,9 +346,11 @@ func buildCategories(cfg PreflightConfig, role Role, rc RoleConfig) []categorySp } // Registry credential check runs from the operator's machine — no cluster - // contact needed. Placed after local-host-tools but before cluster probes - // so credential failures surface early. - if len(cfg.Registries) > 0 && cfg.RegistryChecker != nil { + // contact needed. Gated on role != RoleComputePlane so the category is + // emitted at most once per invocation: in ModeSingle RunPreflightForRole + // is called for RoleControlPlane then RoleComputePlane sequentially; the + // gate ensures no duplicate check_started/check_completed events. + if role != RoleComputePlane && len(cfg.Registries) > 0 && cfg.RegistryChecker != nil { out = append(out, buildRegistryCredentialCategory(cfg)) } @@ -643,7 +645,7 @@ func registryCredentialCheck(checker RegistryCredentialChecker, entry RegistryEn ID: id, Severity: severity, } - if err := checker(ctx, entry.Registry, entry.RepoHint); err != nil { + if err := checker(ctx, entry.Registry, entry.RepoHint, entry.Critical); err != nil { r.Message = entry.Registry + ": " + err.Error() r.Err = err return r @@ -679,15 +681,28 @@ func staleNamespaceCheck(prober StaleNamespaceProber, kubeContext string, namesp return r } parts := make([]string, 0, len(stale)) - names := make([]string, 0, len(stale)) + var terminating, emptyShell []string for _, ns := range stale { parts = append(parts, ns.Name+" ("+ns.Reason+")") - names = append(names, ns.Name) + if ns.Reason == "stuck Terminating" { + terminating = append(terminating, ns.Name) + } else { + emptyShell = append(emptyShell, ns.Name) + } + } + var hints []string + if len(terminating) > 0 { + hints = append(hints, + fmt.Sprintf("remove finalizers on stuck namespaces: kubectl patch namespace %s -p '{\"spec\":{\"finalizers\":[]}}' --type=merge", + strings.Join(terminating, " "))) + } + if len(emptyShell) > 0 { + hints = append(hints, + fmt.Sprintf("inspect and delete empty namespaces: kubectl delete namespace %s", + strings.Join(emptyShell, " "))) } - r.Message = fmt.Sprintf( - "%d stale namespace(s) detected: %s — remove with: kubectl delete namespace %s --force --grace-period=0", - len(stale), strings.Join(parts, ", "), strings.Join(names, " "), - ) + r.Message = fmt.Sprintf("%d stale namespace(s) detected: %s. To resolve: %s", + len(stale), strings.Join(parts, ", "), strings.Join(hints, "; ")) return r }, } diff --git a/src/clis/nvcf-cli/internal/selfhosted/registry_cred.go b/src/clis/nvcf-cli/internal/selfhosted/registry_cred.go index 0167a97900..be51732c3a 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/registry_cred.go +++ b/src/clis/nvcf-cli/internal/selfhosted/registry_cred.go @@ -39,8 +39,9 @@ const ( // RegistryCredentialChecker probes whether credentials are present and valid // for a registry. repoHint is the repository path used as the OAuth scope; // pass "" to probe without a specific scope (works for public registries). -// Returns nil on success, a descriptive error otherwise. -type RegistryCredentialChecker func(ctx context.Context, registry, repoHint string) error +// critical signals that anonymous success is insufficient; configured credentials +// must be present. Returns nil on success, a descriptive error otherwise. +type RegistryCredentialChecker func(ctx context.Context, registry, repoHint string, critical bool) error // NewRegistryCredentialChecker returns a production RegistryCredentialChecker // backed by real HTTP calls. @@ -50,8 +51,9 @@ func NewRegistryCredentialChecker() RegistryCredentialChecker { // probeRegistryCredential authenticates to registry using the OCI Bearer token // flow. repoHint is the OAuth scope repository path. ECR registries return a -// clear diagnostic instead of attempting the Bearer flow. -func probeRegistryCredential(ctx context.Context, registry, repoHint string) error { +// clear diagnostic instead of attempting the Bearer flow. When critical is true, +// anonymous token success is rejected: configured credentials must be present. +func probeRegistryCredential(ctx context.Context, registry, repoHint string, critical bool) error { if isECRRegistry(registry) { return fmt.Errorf("ECR registry detected — credential validation requires AWS CLI; " + "run 'aws ecr get-login-password' to verify manually") @@ -105,6 +107,14 @@ func probeRegistryCredential(ctx context.Context, registry, repoHint string) err } return fmt.Errorf("credentials rejected by %s: %w", registry, err) } + // For critical registries, a successful anonymous token is not enough: + // if the actual install pulls private images, anonymous access will fail. + if critical { + if _, _, hasCreds := credentialsForRegistry(registry); !hasCreds { + return fmt.Errorf("no credentials configured for %s "+ + "(add to ~/.docker/config.json or set NGC_API_KEY for NGC registries)", registry) + } + } return nil } @@ -170,11 +180,18 @@ func EnumerateRegistries(imageRef, stackValuesFile string, extras []string) []Re add(certManagerRegistry, false) // Source 4: operator-supplied extras (--cluster-validator-registries). + // Preserve non-443 ports in the registry string so probeRegistryCredential + // builds the correct https://host:port/v2/ URL. for _, e := range extras { - host, _ := parseRegistryHostPort(e) - if host != "" { - add(host, false) + host, port := parseRegistryHostPort(e) + if host == "" { + continue + } + reg := host + if port != 0 && port != 443 { + reg = fmt.Sprintf("%s:%d", host, port) } + add(reg, false) } return out diff --git a/src/clis/nvcf-cli/internal/selfhosted/registry_cred_test.go b/src/clis/nvcf-cli/internal/selfhosted/registry_cred_test.go index 2c9bfcb667..ca6f81104a 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/registry_cred_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/registry_cred_test.go @@ -47,7 +47,7 @@ func TestProbeRegistryCredential_PublicRegistry(t *testing.T) { // Use the test server's host as the registry. host := strings.TrimPrefix(srv.URL, "https://") - err := probeRegistryCredential(context.Background(), host, "") + err := probeRegistryCredential(context.Background(), host, "", false) assert.NoError(t, err, "public registry (200 on /v2/) must not return an error") } @@ -80,7 +80,7 @@ func TestProbeRegistryCredential_AuthSucceeds(t *testing.T) { t.Cleanup(func() { http.DefaultTransport = origTransport }) host := strings.TrimPrefix(registrySrv.URL, "https://") - err := probeRegistryCredential(context.Background(), host, "") + err := probeRegistryCredential(context.Background(), host, "", false) assert.NoError(t, err, "successful token exchange must return nil") } @@ -105,7 +105,7 @@ func TestProbeRegistryCredential_AuthFails(t *testing.T) { t.Cleanup(func() { http.DefaultTransport = origTransport }) host := strings.TrimPrefix(registrySrv.URL, "https://") - err := probeRegistryCredential(context.Background(), host, "") + err := probeRegistryCredential(context.Background(), host, "", false) assert.Error(t, err, "failed token exchange must return an error") } @@ -113,7 +113,7 @@ func TestProbeRegistryCredential_ECRSkipped(t *testing.T) { // ECR registries must get a clear "use AWS CLI" message rather than a // confusing Bearer token failure. err := probeRegistryCredential(context.Background(), - "123456789.dkr.ecr.us-east-1.amazonaws.com", "") + "123456789.dkr.ecr.us-east-1.amazonaws.com", "", false) require.Error(t, err) assert.Contains(t, err.Error(), "ECR", "ECR registries must produce a clear diagnostic") assert.Contains(t, err.Error(), "AWS", "message must mention AWS") @@ -249,7 +249,7 @@ func TestIsECRRegistry(t *testing.T) { // -- registryCredentialCheck binaryCheckSpec -- func TestRegistryCredentialCheck_PassWhenNoError(t *testing.T) { - checker := func(_ context.Context, reg, _ string) error { return nil } + checker := func(_ context.Context, reg, _ string, _ bool) error { return nil } spec := registryCredentialCheck(checker, RegistryEntry{Registry: "nvcr.io", Critical: true}) r := spec.Run(context.Background()) assert.True(t, r.Passed) @@ -258,7 +258,7 @@ func TestRegistryCredentialCheck_PassWhenNoError(t *testing.T) { } func TestRegistryCredentialCheck_CriticalSeverityOnFailure(t *testing.T) { - checker := func(_ context.Context, reg, _ string) error { + checker := func(_ context.Context, reg, _ string, _ bool) error { return errorf("credentials rejected") } spec := registryCredentialCheck(checker, RegistryEntry{Registry: "nvcr.io", Critical: true}) @@ -268,7 +268,7 @@ func TestRegistryCredentialCheck_CriticalSeverityOnFailure(t *testing.T) { } func TestRegistryCredentialCheck_WarningSeverityOnNonCriticalFailure(t *testing.T) { - checker := func(_ context.Context, reg, _ string) error { + checker := func(_ context.Context, reg, _ string, _ bool) error { return errorf("credentials rejected") } spec := registryCredentialCheck(checker, RegistryEntry{Registry: "quay.io", Critical: false}) diff --git a/src/clis/nvcf-cli/internal/selfhosted/stale_namespace.go b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace.go index 8fe3131754..2e6df32c50 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/stale_namespace.go +++ b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace.go @@ -100,8 +100,13 @@ func probeStaleNamespaces(ctx context.Context, client kubernetes.Interface, name continue } + // Limit to 1: only existence matters, not the full release history. + // Note: this assumes Helm's default secret storage driver. Clusters + // using HELM_DRIVER=configmap or sql will have no owner=helm secrets + // and may be incorrectly reported as empty shells. secrets, err := client.CoreV1().Secrets(name).List(ctx, metav1.ListOptions{ LabelSelector: "owner=helm", + Limit: 1, }) if err != nil { return stale, fmt.Errorf("list Helm secrets in %s: %w", name, err) diff --git a/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go index 8acd45a2fd..f86ba578cb 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go @@ -171,7 +171,7 @@ func TestStaleNamespaceCheck_StaleIsError(t *testing.T) { assert.Equal(t, "error", r.Severity, "detected stale namespaces must use error severity so the exit code is non-zero") assert.Contains(t, r.Message, "nvcf") - assert.Contains(t, r.Message, "kubectl delete namespace") + assert.Contains(t, r.Message, "kubectl patch namespace nvcf") } func TestStaleNamespaceCheck_CleanPasses(t *testing.T) { @@ -194,5 +194,6 @@ func TestStaleNamespaceCheck_MessageNamesAllStaleNamespaces(t *testing.T) { r := staleNamespaceCheck(prober, "", []string{"nvcf", "api-keys"}).Run(context.Background()) assert.Contains(t, r.Message, "nvcf") assert.Contains(t, r.Message, "api-keys") - assert.Contains(t, r.Message, "kubectl delete namespace nvcf api-keys") + assert.Contains(t, r.Message, "kubectl patch namespace nvcf") + assert.Contains(t, r.Message, "kubectl delete namespace api-keys") } diff --git a/src/clis/nvcf-cli/internal/selfhosted/validatortag.go b/src/clis/nvcf-cli/internal/selfhosted/validatortag.go index 4578184db5..2c106c5d69 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/validatortag.go +++ b/src/clis/nvcf-cli/internal/selfhosted/validatortag.go @@ -197,6 +197,13 @@ func exchangeBearerToken(ctx context.Context, client *http.Client, registry, rep if err != nil { return exchangeNGCBearerToken(ctx, client, registry, repo) } + // Reject non-HTTPS or relative realms before attaching credentials. + // The realm comes from a registry-controlled response header and must be + // an absolute HTTPS URL to prevent sending credentials over cleartext or + // to an unrelated host. + if u.Scheme != "https" || u.Host == "" { + return "", fmt.Errorf("refusing token exchange at insecure or relative realm %q for %s", realm, registry) + } q := u.Query() if service != "" { q.Set("service", service) @@ -334,10 +341,10 @@ func parseWWWAuthenticate(header string) (realm, service, scope string) { } else { comma := strings.IndexByte(params, ',') if comma < 0 { - val = params + val = strings.TrimSpace(params) params = "" } else { - val = params[:comma] + val = strings.TrimSpace(params[:comma]) params = params[comma+1:] } } From 6fa77330553bcc2723749a1672f836829ef40ab3 Mon Sep 17 00:00:00 2001 From: rohithb Date: Wed, 12 Aug 2026 19:32:38 +0530 Subject: [PATCH 06/36] fix(check): replace parseRegistryHostPort with net.SplitHostPort and decouple registry checks from validator image --- src/clis/nvcf-cli/cmd/self_hosted_check.go | 10 ++++-- .../internal/selfhosted/clustervalidator.go | 35 ++++++++++--------- .../selfhosted/clustervalidator_test.go | 5 +++ 3 files changed, 32 insertions(+), 18 deletions(-) diff --git a/src/clis/nvcf-cli/cmd/self_hosted_check.go b/src/clis/nvcf-cli/cmd/self_hosted_check.go index deffda153a..e9fb76a762 100644 --- a/src/clis/nvcf-cli/cmd/self_hosted_check.go +++ b/src/clis/nvcf-cli/cmd/self_hosted_check.go @@ -200,13 +200,19 @@ func runSelfHostedCheck(c *cobra.Command, _ []string) error { credEntries []selfhosted.RegistryEntry registryChecker selfhosted.RegistryCredentialChecker ) - if !localOnly && clusterValidatorImage != "" { + // Run credential checks whenever not local-only. The validator image is + // optional: EnumerateRegistries handles an empty image ref and still picks + // up global.image.registry from the stack values file and any + // --cluster-validator-registries extras independently of the image config. + if !localOnly { extraRegistries := viper.GetStringSlice("cluster_validator_registries") stackValuesFile := resolveStackValuesFile() credEntries = selfhosted.EnumerateRegistries( clusterValidatorImage, stackValuesFile, extraRegistries, ) - registryChecker = newRegistryCredentialCheckerForSelfHosted() + if len(credEntries) > 0 { + registryChecker = newRegistryCredentialCheckerForSelfHosted() + } } cfg := selfhosted.PreflightConfig{ diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go index c779eac997..ad825dfdf1 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go @@ -21,7 +21,9 @@ import ( "context" "fmt" "io" + "net" "regexp" + "strconv" "strings" "time" @@ -389,28 +391,29 @@ func buildControlPlaneValidatorConfig(extraRegistries []string) string { "enforcement:", extra.String()+"enforcement:", 1) } -// parseRegistryHostPort splits a "host:port" string. Returns port 443 when -// no port is specified or when the port is not a valid number. +// parseRegistryHostPort splits a "host:port" string using net.SplitHostPort, +// which correctly handles IPv6 literals ([::1]:5000) and bare hostnames. +// Returns port 443 when no port is specified, the port is non-numeric, or +// the input has a trailing colon with no digit (e.g. "nvcr.io:"). func parseRegistryHostPort(s string) (host string, port int) { s = strings.TrimSpace(s) if s == "" { return "", 0 } - if idx := strings.LastIndex(s, ":"); idx > 0 { - h := s[:idx] - p := s[idx+1:] - n := 0 - for _, c := range p { - if c < '0' || c > '9' { - return s, 443 - } - n = n*10 + int(c-'0') - } - if n > 0 && n <= 65535 { - return h, n - } + h, p, err := net.SplitHostPort(s) + if err != nil { + // No port present (e.g. "nvcr.io") — return the input as-is. + return s, 443 + } + if p == "" { + // Trailing colon with no port digit (e.g. "nvcr.io:"). + return h, 443 + } + n, err := strconv.Atoi(p) + if err != nil || n <= 0 || n > 65535 { + return h, 443 } - return s, 443 + return h, n } // buildClusterValidatorJob creates the validator Job. PullIfNotPresent reuses diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go index 44f487581b..ee70636e36 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go @@ -648,6 +648,11 @@ func TestParseRegistryHostPort(t *testing.T) { {"registry.example.com", "registry.example.com", 443}, // no port → 443 {"", "", 0}, // empty → skip {" ", "", 0}, // blank → skip + // IPv6: net.SplitHostPort handles bracketed literals correctly. + {"[::1]:5000", "::1", 5000}, + {"[2001:db8::1]:443", "2001:db8::1", 443}, + // Trailing colon with no digit → default to 443. + {"nvcr.io:", "nvcr.io", 443}, } for _, tt := range tests { t.Run(tt.in, func(t *testing.T) { From b6eaac136c92b1805b3f0110847baef3de50e0f7 Mon Sep 17 00:00:00 2001 From: rohithb Date: Wed, 12 Aug 2026 20:07:23 +0530 Subject: [PATCH 07/36] fix(check): sweep ClusterRole and ClusterRoleBinding after validator Job completes --- .../internal/selfhosted/clustervalidator.go | 19 +++++++++++++++++++ .../selfhosted/clustervalidator_test.go | 3 ++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go index ad825dfdf1..75c9d9a51b 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go @@ -138,6 +138,14 @@ func runClusterValidator(ctx context.Context, client kubernetes.Interface, image if err := ensureClusterValidatorRBAC(vctx, client); err != nil { return ClusterValidatorResult{Err: fmt.Errorf("bootstrapping validator RBAC: %w", err)} } + // Remove the ClusterRole and ClusterRoleBinding after the Job finishes + // (when cleanup is enabled) to minimize the window where the elevated SA + // exists. Uses a fresh context so cleanup runs even when vctx is expired. + // When --no-cleanup is set, the operator expects to inspect the Job; we + // leave the RBAC in place so they can re-exec the pod without re-bootstrap. + if !noCleanup { + defer sweepClusterValidatorRBAC(context.Background(), client) + } // For the control-plane role, create a ConfigMap with reachability // endpoints and enforcement config so the validator runs its configurable @@ -276,6 +284,17 @@ func clusterValidatorLabels() map[string]string { } } +// sweepClusterValidatorRBAC removes the SA, ClusterRole, and ClusterRoleBinding +// created by ensureClusterValidatorRBAC. Called after Job completion (when +// --no-cleanup is not set) to close the window where the elevated ClusterRole +// exists. The next run recreates them via ensureClusterValidatorRBAC. +// Errors are swallowed: stale RBAC is preferable to failing the result. +func sweepClusterValidatorRBAC(ctx context.Context, client kubernetes.Interface) { + _ = client.RbacV1().ClusterRoleBindings().Delete(ctx, clusterValidatorName, metav1.DeleteOptions{}) + _ = client.RbacV1().ClusterRoles().Delete(ctx, clusterValidatorName, metav1.DeleteOptions{}) + _ = client.CoreV1().ServiceAccounts(clusterValidatorNamespace).Delete(ctx, clusterValidatorName, metav1.DeleteOptions{}) +} + // Errors are swallowed: a stale Job is preferable to blocking the new run. func sweepPriorClusterValidatorJobs(ctx context.Context, client kubernetes.Interface) { selector := fmt.Sprintf("app.kubernetes.io/name=%s,app.kubernetes.io/managed-by=nvcf-cli", clusterValidatorAppLabel) diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go index ee70636e36..0ecb7e602b 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go @@ -264,7 +264,8 @@ func TestRunClusterValidator_RBACRefreshesClusterRoleRules(t *testing.T) { }) client.PrependReactor("list", "pods", podListReactor("")) - res := runClusterValidator(context.Background(), client, "test-image:1.0", "", false, "", nil) + // noCleanup=true so the ClusterRole is not swept before we inspect it. + res := runClusterValidator(context.Background(), client, "test-image:1.0", "", true, "", nil) require.NoError(t, res.Err) got, err := client.RbacV1().ClusterRoles().Get(context.Background(), clusterValidatorName, metav1.GetOptions{}) From 5c4d2dc5d784b68cc873d6f07f817fd330055492 Mon Sep 17 00:00:00 2001 From: rohithb Date: Mon, 17 Aug 2026 22:13:45 +0530 Subject: [PATCH 08/36] fix(nvcf-cli): add DaemonSet create/delete RBAC for node-to-node probe --- src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go index 75c9d9a51b..66a409d140 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go @@ -235,7 +235,10 @@ func ensureClusterValidatorRBAC(ctx context.Context, client kubernetes.Interface // check which creates/updates/deletes policies in the temp namespace. {APIGroups: []string{"networking.k8s.io"}, Resources: []string{"networkpolicies"}, Verbs: []string{"get", "list", "create", "update", "delete"}}, {APIGroups: []string{"admissionregistration.k8s.io"}, Resources: []string{"mutatingwebhookconfigurations", "validatingwebhookconfigurations"}, Verbs: []string{"get", "list"}}, - {APIGroups: []string{"apps"}, Resources: []string{"deployments", "daemonsets", "statefulsets"}, Verbs: []string{"get", "list"}}, + // Deployments/StatefulSets: list for Tier-1/Tier-2 HA readiness checks. + // DaemonSets: create/delete for the node-to-node DaemonSet probe; list to watch pod readiness. + {APIGroups: []string{"apps"}, Resources: []string{"deployments", "statefulsets"}, Verbs: []string{"get", "list"}}, + {APIGroups: []string{"apps"}, Resources: []string{"daemonsets"}, Verbs: []string{"get", "list", "create", "delete"}}, // Gateway API: control-plane gateway and route health checks. {APIGroups: []string{"gateway.networking.k8s.io"}, Resources: []string{"gatewayclasses", "gateways", "httproutes", "grpcroutes"}, Verbs: []string{"get", "list"}}, {NonResourceURLs: []string{"/readyz", "/version", "/healthz"}, Verbs: []string{"get"}}, From 81930891af3784168756f506a48b4a48514eb80b Mon Sep 17 00:00:00 2001 From: rohithb Date: Wed, 19 Aug 2026 14:53:48 +0530 Subject: [PATCH 09/36] fix(nvcf-cli): address CodeRabbit review comments in validatortag and stale namespace isNGCRegistry: use dot-boundary host matching and strip port before comparing so evilnvcr.io and nvidia.com.invalid are rejected while nvcr.io:443 and stg.nvcr.io are correctly accepted. parseWWWAuthenticate: accept Bearer challenge schemes case-insensitively using strings.EqualFold after splitting scheme from parameters on whitespace (RFC 7235 requires case-insensitive scheme comparison). probeStaleNamespaces: fall back to listing owner=helm ConfigMaps when no owner=helm Secret exists, so clusters running HELM_DRIVER=configmap are not incorrectly reported as empty shells. stale_namespace_test.go: replace non-ASCII em dashes in comments with ASCII hyphens per repo style guidelines. --- .../internal/selfhosted/stale_namespace.go | 18 +++++-- .../selfhosted/stale_namespace_test.go | 34 ++++++++++--- .../internal/selfhosted/validatortag.go | 49 ++++++++++++++++--- .../internal/selfhosted/validatortag_test.go | 22 +++++++++ 4 files changed, 105 insertions(+), 18 deletions(-) diff --git a/src/clis/nvcf-cli/internal/selfhosted/stale_namespace.go b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace.go index 2e6df32c50..56a57526a8 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/stale_namespace.go +++ b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace.go @@ -101,9 +101,9 @@ func probeStaleNamespaces(ctx context.Context, client kubernetes.Interface, name } // Limit to 1: only existence matters, not the full release history. - // Note: this assumes Helm's default secret storage driver. Clusters - // using HELM_DRIVER=configmap or sql will have no owner=helm secrets - // and may be incorrectly reported as empty shells. + // Check Secrets first (default Helm storage driver). If none exist, + // also check ConfigMaps to handle HELM_DRIVER=configmap clusters — + // both storage backends label their release objects with owner=helm. secrets, err := client.CoreV1().Secrets(name).List(ctx, metav1.ListOptions{ LabelSelector: "owner=helm", Limit: 1, @@ -111,7 +111,17 @@ func probeStaleNamespaces(ctx context.Context, client kubernetes.Interface, name if err != nil { return stale, fmt.Errorf("list Helm secrets in %s: %w", name, err) } - if len(secrets.Items) == 0 { + if len(secrets.Items) > 0 { + continue // healthy: active Helm release found via secret driver + } + cms, err := client.CoreV1().ConfigMaps(name).List(ctx, metav1.ListOptions{ + LabelSelector: "owner=helm", + Limit: 1, + }) + if err != nil { + return stale, fmt.Errorf("list Helm configmaps in %s: %w", name, err) + } + if len(cms.Items) == 0 { stale = append(stale, StaleNamespace{Name: name, Reason: "no Helm release"}) } } diff --git a/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go index f86ba578cb..e64700366f 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go @@ -33,7 +33,7 @@ import ( // -- probeStaleNamespaces -- func TestProbeStaleNamespaces_AbsentIsHealthy(t *testing.T) { - // A namespace that doesn't exist is not stale — it has simply never been + // A namespace that doesn't exist is not stale - it has simply never been // created or was already fully deleted. client := fake.NewSimpleClientset() stale, err := probeStaleNamespaces(context.Background(), client, []string{"nvcf", "sis"}) @@ -101,11 +101,33 @@ func TestProbeStaleNamespaces_HealthyReleaseNotStale(t *testing.T) { assert.Empty(t, stale, "namespace with an active Helm release must not be stale") } +func TestProbeStaleNamespaces_HealthyReleaseConfigMapDriverNotStale(t *testing.T) { + // HELM_DRIVER=configmap stores release objects as ConfigMaps with owner=helm. + // A namespace with an owner=helm ConfigMap and no Helm Secret must not be + // reported as stale. + client := fake.NewSimpleClientset( + &corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{Name: "nvcf"}, + Status: corev1.NamespaceStatus{Phase: corev1.NamespaceActive}, + }, + &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: "nvcf.v1", + Namespace: "nvcf", + Labels: map[string]string{"owner": "helm", "name": "nvcf", "status": "deployed"}, + }, + }, + ) + stale, err := probeStaleNamespaces(context.Background(), client, []string{"nvcf"}) + require.NoError(t, err) + assert.Empty(t, stale, "namespace with an owner=helm ConfigMap (configmap driver) must not be stale") +} + func TestProbeStaleNamespaces_MixedNamespaces(t *testing.T) { // One absent, one healthy, one terminating, one empty shell. now := metav1.Now() client := fake.NewSimpleClientset( - // "sis" — healthy with a Helm release + // "sis" - healthy with a Helm release &corev1.Namespace{ ObjectMeta: metav1.ObjectMeta{Name: "sis"}, Status: corev1.NamespaceStatus{Phase: corev1.NamespaceActive}, @@ -116,17 +138,17 @@ func TestProbeStaleNamespaces_MixedNamespaces(t *testing.T) { Labels: map[string]string{"owner": "helm"}, }, }, - // "nvcf" — stuck terminating + // "nvcf" - stuck terminating &corev1.Namespace{ ObjectMeta: metav1.ObjectMeta{Name: "nvcf", DeletionTimestamp: &now}, Status: corev1.NamespaceStatus{Phase: corev1.NamespaceTerminating}, }, - // "api-keys" — empty shell + // "api-keys" - empty shell &corev1.Namespace{ ObjectMeta: metav1.ObjectMeta{Name: "api-keys"}, Status: corev1.NamespaceStatus{Phase: corev1.NamespaceActive}, }, - // "cassandra-system" — absent (not present in fake) + // "cassandra-system" - absent (not present in fake) ) namespaces := []string{"cassandra-system", "sis", "nvcf", "api-keys"} @@ -148,7 +170,7 @@ func TestProbeStaleNamespaces_MixedNamespaces(t *testing.T) { func TestStaleNamespaceCheck_ProberErrorDegradestoWarning(t *testing.T) { // A prober that cannot contact the cluster must not fail the overall check - // at error severity — it would produce false failures on transient network + // at error severity - it would produce false failures on transient network // issues or misconfigured kubeconfigs. prober := func(_ context.Context, _ string, _ []string) ([]StaleNamespace, error) { return nil, fmt.Errorf("cluster unreachable") diff --git a/src/clis/nvcf-cli/internal/selfhosted/validatortag.go b/src/clis/nvcf-cli/internal/selfhosted/validatortag.go index 2c106c5d69..b3eef3e0bd 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/validatortag.go +++ b/src/clis/nvcf-cli/internal/selfhosted/validatortag.go @@ -23,6 +23,7 @@ import ( "encoding/json" "fmt" "io" + "net" "net/http" "net/url" "os" @@ -315,11 +316,13 @@ func exchangeNGCBearerToken(ctx context.Context, client *http.Client, registry, // Returns empty strings when the header is absent, not a Bearer challenge, or // cannot be parsed. The parser handles quoted values that might contain commas. func parseWWWAuthenticate(header string) (realm, service, scope string) { - const prefix = "Bearer " - if !strings.HasPrefix(header, prefix) { + // Split scheme from parameters on the first whitespace. HTTP auth scheme + // names are case-insensitive (RFC 7235 s2.1), so compare with EqualFold. + idx := strings.IndexByte(header, ' ') + if idx < 0 || !strings.EqualFold(header[:idx], "Bearer") { return } - params := strings.TrimSpace(header[len(prefix):]) + params := strings.TrimSpace(header[idx+1:]) for len(params) > 0 { // Find key= eq := strings.IndexByte(params, '=') @@ -361,12 +364,42 @@ func parseWWWAuthenticate(header string) (realm, service, scope string) { return } -// isNGCRegistry returns true when the registry is hosted on an NVIDIA / NGC -// domain, where the /proxy_auth fallback applies. +// ngcApprovedHosts is the set of exact hostnames (without port) that are +// considered NGC-hosted. Dot-prefixed entries match any subdomain. +var ngcApprovedHosts = []string{ + "nvcr.io", + ".nvcr.io", + "nvidia.com", + ".nvidia.com", + "ngc.nvidia", + ".ngc.nvidia", +} + +// isNGCRegistry returns true when the registry host belongs to an NVIDIA / NGC +// domain. The check strips any port from the registry string before matching +// so that nvcr.io:443 is handled correctly, and uses dot-boundary matching to +// reject deceptive suffixes such as evilnvcr.io or nvidia.com.invalid. func isNGCRegistry(registry string) bool { - return strings.HasSuffix(registry, "nvcr.io") || - strings.Contains(registry, "nvidia.com") || - strings.Contains(registry, "ngc.nvidia") + host := registry + // Strip port if present (e.g. nvcr.io:5000 -> nvcr.io). + if h, _, err := net.SplitHostPort(registry); err == nil { + host = h + } + host = strings.ToLower(host) + for _, approved := range ngcApprovedHosts { + if strings.HasPrefix(approved, ".") { + // Subdomain match: host must end with ".suffix" or equal "suffix". + suffix := approved[1:] // strip the leading dot + if host == suffix || strings.HasSuffix(host, approved) { + return true + } + } else { + if host == approved { + return true + } + } + } + return false } // credentialsForRegistry resolves (username, password) for any registry. diff --git a/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go b/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go index b7c58c8979..387254f039 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go @@ -294,13 +294,35 @@ func TestParseWWWAuthenticate_RealmOnly(t *testing.T) { assert.Empty(t, scope) } +func TestParseWWWAuthenticate_CaseInsensitiveBearer(t *testing.T) { + // HTTP auth scheme names are case-insensitive (RFC 7235 s2.1). + for _, header := range []string{ + `bearer realm="https://auth.example.com/token",service="reg.example.com"`, + `BEARER realm="https://auth.example.com/token",service="reg.example.com"`, + `Bearer realm="https://auth.example.com/token",service="reg.example.com"`, + } { + realm, service, _ := parseWWWAuthenticate(header) + assert.Equal(t, "https://auth.example.com/token", realm, "header: %s", header) + assert.Equal(t, "reg.example.com", service, "header: %s", header) + } +} + // -- isNGCRegistry -- func TestIsNGCRegistry(t *testing.T) { + // Valid NGC registries. assert.True(t, isNGCRegistry("nvcr.io")) assert.True(t, isNGCRegistry("stg.nvcr.io")) assert.True(t, isNGCRegistry("registry.nvidia.com")) + assert.True(t, isNGCRegistry("nvcr.io:443"), "port must be stripped before matching") + + // Non-NGC registries must be rejected. assert.False(t, isNGCRegistry("ghcr.io")) assert.False(t, isNGCRegistry("quay.io")) assert.False(t, isNGCRegistry("harbor.company.internal")) + + // Deceptive suffixes must be rejected. + assert.False(t, isNGCRegistry("evilnvcr.io"), "suffix match without dot boundary must be rejected") + assert.False(t, isNGCRegistry("nvidia.com.invalid"), "deceptive TLD must be rejected") + assert.False(t, isNGCRegistry("fakenvidia.com"), "partial host match must be rejected") } From c3c4a41cb8a4505c262efe1c279e614afe9b8916 Mon Sep 17 00:00:00 2001 From: rohithb Date: Wed, 19 Aug 2026 16:01:56 +0530 Subject: [PATCH 10/36] fix(nvcf-cli): restrict NGC token fallback to NGC registries and fix em dash --- .../nvcf-cli/internal/selfhosted/stale_namespace.go | 2 +- .../nvcf-cli/internal/selfhosted/validatortag.go | 5 +++++ .../internal/selfhosted/validatortag_test.go | 13 +++++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/clis/nvcf-cli/internal/selfhosted/stale_namespace.go b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace.go index 56a57526a8..8779b8e1aa 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/stale_namespace.go +++ b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace.go @@ -102,7 +102,7 @@ func probeStaleNamespaces(ctx context.Context, client kubernetes.Interface, name // Limit to 1: only existence matters, not the full release history. // Check Secrets first (default Helm storage driver). If none exist, - // also check ConfigMaps to handle HELM_DRIVER=configmap clusters — + // also check ConfigMaps to handle HELM_DRIVER=configmap clusters; // both storage backends label their release objects with owner=helm. secrets, err := client.CoreV1().Secrets(name).List(ctx, metav1.ListOptions{ LabelSelector: "owner=helm", diff --git a/src/clis/nvcf-cli/internal/selfhosted/validatortag.go b/src/clis/nvcf-cli/internal/selfhosted/validatortag.go index b3eef3e0bd..5a234ef1f7 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/validatortag.go +++ b/src/clis/nvcf-cli/internal/selfhosted/validatortag.go @@ -270,7 +270,12 @@ func exchangeBearerToken(ctx context.Context, client *http.Client, registry, rep // exchangeNGCBearerToken is the NGC-specific /proxy_auth token exchange, // kept as a named fallback for when the standard OCI flow cannot be used. +// It always rejects non-NGC registries so NGC credentials are never sent +// to an unrelated /proxy_auth endpoint. func exchangeNGCBearerToken(ctx context.Context, client *http.Client, registry, repo string) (string, error) { + if !isNGCRegistry(registry) { + return "", fmt.Errorf("NGC token fallback not applicable for non-NGC registry %s", registry) + } user, pass, ok := ngcCredentials(registry) if !ok { return "", fmt.Errorf("no credentials for %s", registry) diff --git a/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go b/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go index 387254f039..bcc49f8cab 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go @@ -20,6 +20,7 @@ package selfhosted import ( "context" "encoding/json" + "net/http" "os" "path/filepath" "testing" @@ -326,3 +327,15 @@ func TestIsNGCRegistry(t *testing.T) { assert.False(t, isNGCRegistry("nvidia.com.invalid"), "deceptive TLD must be rejected") assert.False(t, isNGCRegistry("fakenvidia.com"), "partial host match must be rejected") } + +// -- exchangeNGCBearerToken -- + +func TestExchangeNGCBearerToken_RejectsNonNGCRegistry(t *testing.T) { + // A non-NGC registry with an absent or malformed WWW-Authenticate header + // must not trigger the NGC /proxy_auth fallback. If it did, NGC credentials + // could be sent to an unrelated registry's /proxy_auth endpoint. + client := &http.Client{} + _, err := exchangeNGCBearerToken(context.Background(), client, "harbor.company.internal", "myrepo/image") + require.Error(t, err, "non-NGC registry must be rejected without issuing a request") + assert.Contains(t, err.Error(), "non-NGC registry") +} From de7999b9ead42bdbc2beeda926f628caf839bd44 Mon Sep 17 00:00:00 2001 From: rohithb Date: Wed, 19 Aug 2026 16:47:05 +0530 Subject: [PATCH 11/36] fix(nvcf-cli): response body close, case-insensitive params, empty scope, spy transport test --- .../internal/selfhosted/validatortag.go | 24 ++++++++++------- .../internal/selfhosted/validatortag_test.go | 26 ++++++++++++++++--- 2 files changed, 36 insertions(+), 14 deletions(-) diff --git a/src/clis/nvcf-cli/internal/selfhosted/validatortag.go b/src/clis/nvcf-cli/internal/selfhosted/validatortag.go index 5a234ef1f7..f906dff16d 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/validatortag.go +++ b/src/clis/nvcf-cli/internal/selfhosted/validatortag.go @@ -240,15 +240,19 @@ func exchangeBearerToken(ctx context.Context, client *http.Client, registry, rep if err != nil { return "", err } - defer resp.Body.Close() if resp.StatusCode != http.StatusOK { - // WWW-Authenticate realm failed — try NGC's /proxy_auth as last resort + // Close the body immediately before the fallback or the error return so + // the connection is not held open while the NGC /proxy_auth call runs. + status := resp.Status + resp.Body.Close() + // WWW-Authenticate realm failed; try NGC's /proxy_auth as last resort // for registries that implement both endpoints (e.g. staging NGC envs). if isNGCRegistry(registry) { return exchangeNGCBearerToken(ctx, client, registry, repo) } - return "", fmt.Errorf("token exchange at %s returned %s", realm, resp.Status) + return "", fmt.Errorf("token exchange at %s returned %s", realm, status) } + defer resp.Body.Close() // Both "token" (OCI spec) and "access_token" (Docker Hub variant) are valid. var doc struct { @@ -280,14 +284,14 @@ func exchangeNGCBearerToken(ctx context.Context, client *http.Client, registry, if !ok { return "", fmt.Errorf("no credentials for %s", registry) } - // Build scope: use actual repo when provided; omit when empty so the NGC - // /proxy_auth endpoint validates the key without org-scoped access checks. - scope := "" + // Build the query: use url.Values so the scope key is omitted entirely + // when repo is empty rather than sending scope= with an empty value. + // An empty scope validates the API key without org-scoped access checks. + q := url.Values{"service": {registry}} if repo != "" { - scope = "repository:" + repo + ":pull" + q.Set("scope", "repository:"+repo+":pull") } - tokenURL := fmt.Sprintf("https://%s/proxy_auth?service=%s&scope=%s", - registry, registry, scope) + tokenURL := "https://" + registry + "/proxy_auth?" + q.Encode() req, err := http.NewRequestWithContext(ctx, http.MethodGet, tokenURL, nil) if err != nil { return "", err @@ -357,7 +361,7 @@ func parseWWWAuthenticate(header string) (realm, service, scope string) { } } - switch key { + switch strings.ToLower(key) { case "realm": realm = val case "service": diff --git a/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go b/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go index bcc49f8cab..e2d7809e54 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go @@ -295,6 +295,14 @@ func TestParseWWWAuthenticate_RealmOnly(t *testing.T) { assert.Empty(t, scope) } +func TestParseWWWAuthenticate_MixedCaseParams(t *testing.T) { + // Auth parameter names are parsed with mixed case in the wild. + realm, service, scope := parseWWWAuthenticate(`Bearer Realm="https://auth.example.com/token",Service="reg.example.com",Scope="repository:foo:pull"`) + assert.Equal(t, "https://auth.example.com/token", realm) + assert.Equal(t, "reg.example.com", service) + assert.Equal(t, "repository:foo:pull", scope) +} + func TestParseWWWAuthenticate_CaseInsensitiveBearer(t *testing.T) { // HTTP auth scheme names are case-insensitive (RFC 7235 s2.1). for _, header := range []string{ @@ -330,11 +338,21 @@ func TestIsNGCRegistry(t *testing.T) { // -- exchangeNGCBearerToken -- +// spyTransport is an http.RoundTripper that fails the test if called. +type spyTransport struct{ t *testing.T } + +func (s *spyTransport) RoundTrip(_ *http.Request) (*http.Response, error) { + s.t.Fatal("HTTP request must not be issued for non-NGC registry") + return nil, nil +} + func TestExchangeNGCBearerToken_RejectsNonNGCRegistry(t *testing.T) { - // A non-NGC registry with an absent or malformed WWW-Authenticate header - // must not trigger the NGC /proxy_auth fallback. If it did, NGC credentials - // could be sent to an unrelated registry's /proxy_auth endpoint. - client := &http.Client{} + // A non-NGC registry must be rejected before any HTTP request is made, + // even when NGC credentials are configured. The spy transport fails the + // test immediately if RoundTrip is called, ensuring the isNGCRegistry + // guard fires before any network activity. + t.Setenv("NGC_API_KEY", "test-key") // configure a credential so a missing guard would reach the transport + client := &http.Client{Transport: &spyTransport{t: t}} _, err := exchangeNGCBearerToken(context.Background(), client, "harbor.company.internal", "myrepo/image") require.Error(t, err, "non-NGC registry must be rejected without issuing a request") assert.Contains(t, err.Error(), "non-NGC registry") From a52685f46d7e9f3416277342b7753b95e8156c53 Mon Sep 17 00:00:00 2001 From: rohithb Date: Wed, 19 Aug 2026 22:14:32 +0530 Subject: [PATCH 12/36] fix(nvcf-cli): authorize realm host before forwarding credentials and fix em dash --- .../internal/selfhosted/stale_namespace.go | 2 +- .../internal/selfhosted/validatortag.go | 22 +++++++++-- .../internal/selfhosted/validatortag_test.go | 38 +++++++++++++++++++ 3 files changed, 58 insertions(+), 4 deletions(-) diff --git a/src/clis/nvcf-cli/internal/selfhosted/stale_namespace.go b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace.go index 8779b8e1aa..1f31403cf3 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/stale_namespace.go +++ b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace.go @@ -77,7 +77,7 @@ func NewStaleNamespaceProber() StaleNamespaceProber { // // A namespace is considered stale when either: // - its DeletionTimestamp is set or its phase is Terminating (finalizer -// deadlock — it will never complete without operator intervention), or +// deadlock; it will never complete without operator intervention), or // - it exists but holds no active Helm release (empty shell left by a partial // helm uninstall or a failed teardown that cleaned the release but not the // namespace). diff --git a/src/clis/nvcf-cli/internal/selfhosted/validatortag.go b/src/clis/nvcf-cli/internal/selfhosted/validatortag.go index f906dff16d..9064e4db01 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/validatortag.go +++ b/src/clis/nvcf-cli/internal/selfhosted/validatortag.go @@ -199,12 +199,28 @@ func exchangeBearerToken(ctx context.Context, client *http.Client, registry, rep return exchangeNGCBearerToken(ctx, client, registry, repo) } // Reject non-HTTPS or relative realms before attaching credentials. - // The realm comes from a registry-controlled response header and must be - // an absolute HTTPS URL to prevent sending credentials over cleartext or - // to an unrelated host. if u.Scheme != "https" || u.Host == "" { return "", fmt.Errorf("refusing token exchange at insecure or relative realm %q for %s", realm, registry) } + // Authorize the realm host before forwarding credentials. The realm URL + // comes from a registry-controlled response header. Without this check, a + // malicious registry could return realm="https://attacker.com/token" and + // receive the operator's Docker credentials for the original registry. + // Allow the realm only when it matches the registry's own host, is a + // sub-domain of that host (e.g. auth.registry.example.com for registry.example.com), + // or is an NGC auth domain when the registry is NGC-hosted (NGC delegates + // token issuance to authn.nvidia.com and other nvidia.com sub-domains). + realmHost := strings.ToLower(u.Hostname()) + regHost := strings.ToLower(registry) + if h, _, err := net.SplitHostPort(registry); err == nil { + regHost = strings.ToLower(h) + } + realmOK := realmHost == regHost || + strings.HasSuffix(realmHost, "."+regHost) || + (isNGCRegistry(registry) && isNGCRegistry(realmHost)) + if !realmOK { + return "", fmt.Errorf("refusing to forward credentials to realm host %q; not authorized for registry %s", realmHost, registry) + } q := u.Query() if service != "" { q.Set("service", service) diff --git a/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go b/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go index e2d7809e54..1d082ddc99 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go @@ -21,8 +21,10 @@ import ( "context" "encoding/json" "net/http" + "net/http/httptest" "os" "path/filepath" + "strings" "testing" "time" @@ -336,6 +338,37 @@ func TestIsNGCRegistry(t *testing.T) { assert.False(t, isNGCRegistry("fakenvidia.com"), "partial host match must be rejected") } +// -- exchangeBearerToken realm host authorization -- + +func TestExchangeBearerToken_RejectsAttackerRealm(t *testing.T) { + // A malicious registry returns a realm on an attacker-controlled host. + // The function must reject this without forwarding credentials. + spy := &spyTransport{t: t} + + // Set up a fake registry server that returns 401 with an attacker realm. + srv := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Www-Authenticate", `Bearer realm="https://attacker.example.com/token",service="harbor.company.internal"`) + w.WriteHeader(http.StatusUnauthorized) + })) + defer srv.Close() + + client := srv.Client() + // Replace the transport with the spy AFTER the TLS is set up; the spy + // wraps the original to preserve TLS but fails on any attacker call. + origTransport := client.Transport + client.Transport = roundTripperFunc(func(r *http.Request) (*http.Response, error) { + if r.Host == "attacker.example.com" || strings.Contains(r.URL.Host, "attacker") { + t.Fatalf("credentials must not be forwarded to attacker host: %s", r.URL) + } + return origTransport.RoundTrip(r) + }) + _ = spy + + _, err := exchangeBearerToken(context.Background(), client, "harbor.company.internal", "myrepo/image", `Bearer realm="https://attacker.example.com/token",service="harbor.company.internal"`) + require.Error(t, err) + assert.Contains(t, err.Error(), "not authorized for registry") +} + // -- exchangeNGCBearerToken -- // spyTransport is an http.RoundTripper that fails the test if called. @@ -346,6 +379,11 @@ func (s *spyTransport) RoundTrip(_ *http.Request) (*http.Response, error) { return nil, nil } +// roundTripperFunc adapts a function to the http.RoundTripper interface. +type roundTripperFunc func(*http.Request) (*http.Response, error) + +func (f roundTripperFunc) RoundTrip(r *http.Request) (*http.Response, error) { return f(r) } + func TestExchangeNGCBearerToken_RejectsNonNGCRegistry(t *testing.T) { // A non-NGC registry must be rejected before any HTTP request is made, // even when NGC credentials are configured. The spy transport fails the From 2218f34fe0cd99b7ab90d6c59361b56ac45636fe Mon Sep 17 00:00:00 2001 From: rohithb Date: Wed, 19 Aug 2026 22:39:13 +0530 Subject: [PATCH 13/36] fix(nvcf-cli): allow Docker Hub delegated auth realm in token exchange --- .../internal/selfhosted/validatortag.go | 15 ++++++++++++++- .../internal/selfhosted/validatortag_test.go | 17 +++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/clis/nvcf-cli/internal/selfhosted/validatortag.go b/src/clis/nvcf-cli/internal/selfhosted/validatortag.go index 9064e4db01..d2f9fbca98 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/validatortag.go +++ b/src/clis/nvcf-cli/internal/selfhosted/validatortag.go @@ -217,7 +217,8 @@ func exchangeBearerToken(ctx context.Context, client *http.Client, registry, rep } realmOK := realmHost == regHost || strings.HasSuffix(realmHost, "."+regHost) || - (isNGCRegistry(registry) && isNGCRegistry(realmHost)) + (isNGCRegistry(registry) && isNGCRegistry(realmHost)) || + trustedRealmDelegations[regHost] == realmHost if !realmOK { return "", fmt.Errorf("refusing to forward credentials to realm host %q; not authorized for registry %s", realmHost, registry) } @@ -389,6 +390,18 @@ func parseWWWAuthenticate(header string) (realm, service, scope string) { return } +// trustedRealmDelegations maps a registry host to its authorized token host +// when the registry uses a separate host for token exchange. Only add entries +// here for registries with publicly documented auth architectures; this list +// extends the fail-closed realm validation and must not grow without a clear +// trust basis. +var trustedRealmDelegations = map[string]string{ + // Docker Hub documents this split explicitly: the pull host and the auth + // host are distinct (docs.docker.com/registry/spec/auth/token/). + "registry-1.docker.io": "auth.docker.io", + "docker.io": "auth.docker.io", +} + // ngcApprovedHosts is the set of exact hostnames (without port) that are // considered NGC-hosted. Dot-prefixed entries match any subdomain. var ngcApprovedHosts = []string{ diff --git a/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go b/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go index 1d082ddc99..ce056a58b7 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go @@ -22,6 +22,7 @@ import ( "encoding/json" "net/http" "net/http/httptest" + "net/url" "os" "path/filepath" "strings" @@ -384,6 +385,22 @@ type roundTripperFunc func(*http.Request) (*http.Response, error) func (f roundTripperFunc) RoundTrip(r *http.Request) (*http.Response, error) { return f(r) } +func TestExchangeBearerToken_DockerHubDelegatedRealm(t *testing.T) { + // Docker Hub uses registry-1.docker.io as the pull host and auth.docker.io + // for token exchange. The realm host check must allow this documented + // delegation rather than rejecting it as an unauthorized host. + wwwAuth := `Bearer realm="https://auth.docker.io/token",service="registry.docker.io",scope="repository:library/ubuntu:pull"` + realm, _, _ := parseWWWAuthenticate(wwwAuth) + u, err := url.Parse(realm) + require.NoError(t, err) + + realmHost := strings.ToLower(u.Hostname()) + regHost := "registry-1.docker.io" + delegated := trustedRealmDelegations[regHost] + assert.Equal(t, "auth.docker.io", delegated, "Docker Hub auth host must be in trusted delegation map") + assert.Equal(t, delegated, realmHost, "auth.docker.io realm must be authorized for registry-1.docker.io") +} + func TestExchangeNGCBearerToken_RejectsNonNGCRegistry(t *testing.T) { // A non-NGC registry must be rejected before any HTTP request is made, // even when NGC credentials are configured. The spy transport fails the From b8faf70c7433164145442e84f401e3fa049e516f Mon Sep 17 00:00:00 2001 From: rohithb Date: Tue, 15 Sep 2026 12:28:53 +0530 Subject: [PATCH 14/36] fix(nvcf-cli): stop preflight failing healthy clusters and destroying live namespaces --- .../selfhosted/clustervalidator_test.go | 2 - .../selfhosted/orchestrator_errors_test.go | 6 +- .../nvcf-cli/internal/selfhosted/preflight.go | 37 ++++- .../selfhosted/progress/k8s_watcher_test.go | 2 +- .../selfhosted/progress/log_line_writer.go | 12 +- .../selfhosted/progress/render_jsonl.go | 18 +-- .../selfhosted/progress/render_jsonl_test.go | 2 +- .../internal/selfhosted/registry_cred.go | 133 +++++++++++++++--- .../internal/selfhosted/registry_cred_test.go | 4 +- .../internal/selfhosted/stale_namespace.go | 99 +++++++++---- .../selfhosted/stale_namespace_test.go | 59 +++++++- .../selfhosted/teardown/drain_test.go | 4 +- .../internal/selfhosted/validatortag.go | 25 +++- .../internal/selfhosted/validatortag_test.go | 16 +-- 14 files changed, 335 insertions(+), 84 deletions(-) diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go index 0ecb7e602b..3db50167a6 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go @@ -131,7 +131,6 @@ func TestClusterValidatorCheck_OrchestratorErrorStaysWarning(t *testing.T) { assert.Contains(t, r.Message, "cluster-validator did not complete") } - func TestRunClusterValidator_HappyPath(t *testing.T) { client := fake.NewSimpleClientset() // Capture the Job name the runner picks, then drive Get/List reactors to @@ -678,4 +677,3 @@ func alreadyExistsReactor(resource, name string) ktesting.ReactionFunc { return true, nil, apierrors.NewAlreadyExists(gr, name) } } - diff --git a/src/clis/nvcf-cli/internal/selfhosted/orchestrator_errors_test.go b/src/clis/nvcf-cli/internal/selfhosted/orchestrator_errors_test.go index a3b2e0e184..5a1df7f0b7 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/orchestrator_errors_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/orchestrator_errors_test.go @@ -422,9 +422,9 @@ func TestRetryAfterFromError_Parsing(t *testing.T) { {"rate limit: Retry-After: 30", 30}, {"Retry-After: 120s", 120}, {"retry-after: 5", 5}, - {"no header here", 5}, // default - {"Retry-After: ", 5}, // no digits → default - {"Retry-After: 0", 5}, // zero → default + {"no header here", 5}, // default + {"Retry-After: ", 5}, // no digits → default + {"Retry-After: 0", 5}, // zero → default {"Retry-After: 300 ok", 300}, // stops at first non-digit } for _, tc := range cases { diff --git a/src/clis/nvcf-cli/internal/selfhosted/preflight.go b/src/clis/nvcf-cli/internal/selfhosted/preflight.go index 89e053256b..fd6138a628 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/preflight.go +++ b/src/clis/nvcf-cli/internal/selfhosted/preflight.go @@ -19,6 +19,7 @@ package selfhosted import ( "context" + "errors" "fmt" "net/http" "os" @@ -55,7 +56,7 @@ type CheckResult struct { Message string Detail string // optional: short version string or extra context (M+8.11) HintURL string - Err error // populated only when the check itself failed to execute + Err error // populated only when the check itself failed to execute Logs string // optional: full check transcript for --show-logs; not emitted to JSON } @@ -646,6 +647,24 @@ func registryCredentialCheck(checker RegistryCredentialChecker, entry RegistryEn Severity: severity, } if err := checker(ctx, entry.Registry, entry.RepoHint, entry.Critical); err != nil { + // A registry this probe cannot speak to (ECR's SigV4, a Basic + // challenge) is not evidence of a credential problem, and an + // unreadable credential helper is not evidence of a missing + // credential. Neither may block the run. + var skipped errRegistryProbeSkipped + var unverified errRegistryCredentialsUnverified + switch { + case errors.As(err, &skipped): + r.Passed = true + r.Severity = "info" + r.Message = entry.Registry + ": skipped (" + skipped.reason + ")" + return r + case errors.As(err, &unverified): + r.Severity = "warning" + r.Message = entry.Registry + ": " + err.Error() + r.Err = err + return r + } r.Message = entry.Registry + ": " + err.Error() r.Err = err return r @@ -676,6 +695,7 @@ func staleNamespaceCheck(prober StaleNamespaceProber, kubeContext string, namesp return r } if len(stale) == 0 { + r.Severity = "info" r.Passed = true r.Message = "no stale NVCF namespaces detected" return r @@ -692,9 +712,20 @@ func staleNamespaceCheck(prober StaleNamespaceProber, kubeContext string, namesp } var hints []string if len(terminating) > 0 { + // spec.finalizers is writable only through the /finalize + // subresource: a plain patch or update is silently reverted by + // the apiserver's namespace strategy, so `kubectl patch ... + // --type=merge` prints "patched" and changes nothing. + for _, ns := range terminating { + hints = append(hints, fmt.Sprintf( + "clear namespace finalizers on %s: kubectl get ns %s -o json | "+ + "jq '.spec.finalizers=[]' | kubectl replace --raw /api/v1/namespaces/%s/finalize -f -", + ns, ns, ns)) + } hints = append(hints, - fmt.Sprintf("remove finalizers on stuck namespaces: kubectl patch namespace %s -p '{\"spec\":{\"finalizers\":[]}}' --type=merge", - strings.Join(terminating, " "))) + "if it stays Terminating, the deadlock is on objects inside it: "+ + "kubectl api-resources --verbs=list --namespaced -o name | "+ + "xargs -n1 kubectl get -n --show-kind --ignore-not-found") } if len(emptyShell) > 0 { hints = append(hints, diff --git a/src/clis/nvcf-cli/internal/selfhosted/progress/k8s_watcher_test.go b/src/clis/nvcf-cli/internal/selfhosted/progress/k8s_watcher_test.go index c8e22dd93f..03e2334eea 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/progress/k8s_watcher_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/progress/k8s_watcher_test.go @@ -135,7 +135,7 @@ func TestWatchResources_EmitsCountsForEachType(t *testing.T) { }, 3*time.Second, 50*time.Millisecond, "did not see all 5 resource types") last := sink.lastByResource() - assert.Equal(t, 4, last["namespaces"].Num) // phaseNum baked in + assert.Equal(t, 4, last["namespaces"].Num) // phaseNum baked in assert.Equal(t, "apply-cp", last["namespaces"].Name) // phaseName baked in assert.Equal(t, "namespaces", last["namespaces"].Resource) assert.Equal(t, 2, last["namespaces"].Done) diff --git a/src/clis/nvcf-cli/internal/selfhosted/progress/log_line_writer.go b/src/clis/nvcf-cli/internal/selfhosted/progress/log_line_writer.go index 3f6ff8f481..1a2cba7262 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/progress/log_line_writer.go +++ b/src/clis/nvcf-cli/internal/selfhosted/progress/log_line_writer.go @@ -41,12 +41,12 @@ import ( // EventSink is responsible for its own concurrency (JSONLRenderer's mu; // TTYRenderer's tea.Program.Send is goroutine-safe by design). type LogLineWriter struct { - mu sync.Mutex - buf bytes.Buffer - sink EventSink - stream string // "stdout" | "stderr" - source string // short producer tag, e.g. "helmfile-cp" - closed bool + mu sync.Mutex + buf bytes.Buffer + sink EventSink + stream string // "stdout" | "stderr" + source string // short producer tag, e.g. "helmfile-cp" + closed bool } // NewLogLineWriter constructs a LogLineWriter feeding into sink. stream and diff --git a/src/clis/nvcf-cli/internal/selfhosted/progress/render_jsonl.go b/src/clis/nvcf-cli/internal/selfhosted/progress/render_jsonl.go index 3f4940c1fd..736f861e06 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/progress/render_jsonl.go +++ b/src/clis/nvcf-cli/internal/selfhosted/progress/render_jsonl.go @@ -710,7 +710,7 @@ type wireClusterRow struct { Event string `json:"event"` TS string `json:"ts"` Name string `json:"name"` - Context string `json:"context,omitempty"` // M+9: omitted when unknown + Context string `json:"context,omitempty"` // M+9: omitted when unknown GPU string `json:"gpu"` GPUCount int `json:"gpuCount"` ActiveDeployments int `json:"activeDeployments"` @@ -766,12 +766,12 @@ type wireCategoryCompleted struct { // mode. It carries the Snapshot identity plus all ComponentHealth, ClusterRow, // and RecentEvent sub-objects inlined. type wireSnapshotComposed struct { - Event string `json:"event"` - TS string `json:"ts"` - Cluster string `json:"cluster"` - Verdict string `json:"verdict"` - ReconcileAgeSec int `json:"reconcileAgeSec"` - Identity wireSnapshotIdentity `json:"identity"` + Event string `json:"event"` + TS string `json:"ts"` + Cluster string `json:"cluster"` + Verdict string `json:"verdict"` + ReconcileAgeSec int `json:"reconcileAgeSec"` + Identity wireSnapshotIdentity `json:"identity"` Components []wireComponentInline `json:"components,omitempty"` ComputeClusters []wireClusterInline `json:"computeClusters,omitempty"` Events []wireEventInline `json:"events,omitempty"` @@ -781,7 +781,7 @@ type wireSnapshotComposed struct { type wireComponentInline struct { Name string `json:"name"` Cluster string `json:"cluster,omitempty"` - Role string `json:"role,omitempty"` // M+9: omitted in single-cluster mode + Role string `json:"role,omitempty"` // M+9: omitted in single-cluster mode Ready int `json:"ready"` Total int `json:"total"` UptimeSec int `json:"uptimeSec"` @@ -792,7 +792,7 @@ type wireComponentInline struct { // wireClusterInline is a ClusterRow without event/ts fields. type wireClusterInline struct { Name string `json:"name"` - Context string `json:"context,omitempty"` // M+9: omitted when unknown + Context string `json:"context,omitempty"` // M+9: omitted when unknown GPU string `json:"gpu"` GPUCount int `json:"gpuCount"` ActiveDeployments int `json:"activeDeployments"` diff --git a/src/clis/nvcf-cli/internal/selfhosted/progress/render_jsonl_test.go b/src/clis/nvcf-cli/internal/selfhosted/progress/render_jsonl_test.go index 3ceb92eb20..3f55654def 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/progress/render_jsonl_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/progress/render_jsonl_test.go @@ -82,7 +82,7 @@ func TestRenderJSONL_PhaseFailed(t *testing.T) { ErrCategory: "helm_apply", ErrMessage: "helm install api-keys: timed out", RetryClass: "backoff", RetryAfterSec: 60, Remediation: []string{"kubectl describe pod -n cassandra-system cassandra-0", "Re-run with --debug"}, - Raw: RawFailure{Subprocess: "helmfile", ExitCode: 1, StderrTail: "Error: timeout reached", KubernetesReason: "FailedScheduling"}, + Raw: RawFailure{Subprocess: "helmfile", ExitCode: 1, StderrTail: "Error: timeout reached", KubernetesReason: "FailedScheduling"}, }, } got := runEmit(t, clock, events) diff --git a/src/clis/nvcf-cli/internal/selfhosted/registry_cred.go b/src/clis/nvcf-cli/internal/selfhosted/registry_cred.go index be51732c3a..9312b18807 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/registry_cred.go +++ b/src/clis/nvcf-cli/internal/selfhosted/registry_cred.go @@ -20,8 +20,10 @@ package selfhosted import ( "context" "fmt" + "net" "net/http" "os" + "strconv" "strings" "time" @@ -54,15 +56,20 @@ func NewRegistryCredentialChecker() RegistryCredentialChecker { // clear diagnostic instead of attempting the Bearer flow. When critical is true, // anonymous token success is rejected: configured credentials must be present. func probeRegistryCredential(ctx context.Context, registry, repoHint string, critical bool) error { + // ECR uses AWS SigV4, not the OCI Bearer flow, so this probe cannot speak + // to it. Skip rather than fail: returning an error here makes an + // ECR-hosted validator image unconditionally fail preflight, so --wait + // could never converge. if isECRRegistry(registry) { - return fmt.Errorf("ECR registry detected — credential validation requires AWS CLI; " + - "run 'aws ecr get-login-password' to verify manually") + return errRegistryProbeSkipped{ + reason: "ECR uses AWS SigV4; verify manually with 'aws ecr get-login-password'", + } } pctx, cancel := context.WithTimeout(ctx, registryProbeTimeout) defer cancel() - client := &http.Client{Timeout: registryProbeTimeout} + client := &http.Client{Timeout: registryProbeTimeout, CheckRedirect: refuseInsecureRedirect} // Step 1: probe /v2/ unauthenticated. probeURL := "https://" + registry + "/v2/" @@ -75,11 +82,33 @@ func probeRegistryCredential(ctx context.Context, registry, repoHint string, cri return fmt.Errorf("cannot reach %s: %w", registry, err) } + // A 200 only proves /v2/ is anonymously readable, which says nothing about + // the repositories the install actually pulls. Require the registry to + // identify itself as an OCI registry so a captive portal or TLS-intercepting + // proxy answering 200 HTML is not read as success. + isOCI := resp.Header.Get("Docker-Distribution-Api-Version") != "" || + strings.Contains(resp.Header.Get("Www-Authenticate"), "realm") + switch resp.StatusCode { case http.StatusOK: - // Public registry — no credentials needed. resp.Body.Close() - return nil + if !isOCI { + // A captive portal or TLS-intercepting proxy also answers 200. The + // header is a Docker convention rather than an OCI requirement, so + // a conformant registry may legitimately omit it: report that the + // result is unverifiable instead of guessing either way. + return errRegistryProbeSkipped{ + reason: fmt.Sprintf("%s answered 200 but did not identify as an OCI registry; "+ + "if this is unexpected, check for a proxy or captive portal", registry), + } + } + // Anonymous read works. For a critical registry that is still not + // enough: the install pulls private repositories, so fall through to + // the credential requirement below rather than returning early. + if !critical { + return nil + } + return requireConfiguredCredentials(registry) case http.StatusUnauthorized: // Auth required — proceed with token exchange. default: @@ -94,6 +123,15 @@ func probeRegistryCredential(ctx context.Context, registry, repoHint string, cri wwwAuth := resp.Header.Get("Www-Authenticate") resp.Body.Close() + // Only the Bearer flow is implemented. Self-hosted Harbor and htpasswd + // mirrors commonly answer with Basic, where the Bearer path would report a + // spurious credential failure, so skip instead. + if scheme := authChallengeScheme(wwwAuth); scheme != "" && !strings.EqualFold(scheme, "Bearer") { + return errRegistryProbeSkipped{ + reason: fmt.Sprintf("%s uses %s auth; only the OCI Bearer flow is probed", registry, scheme), + } + } + _, err = exchangeBearerToken(pctx, client, registry, repoHint, wwwAuth) if err != nil { // Use credentialsForRegistry (not ngcCredentials) so NGC_API_KEY does @@ -110,14 +148,56 @@ func probeRegistryCredential(ctx context.Context, registry, repoHint string, cri // For critical registries, a successful anonymous token is not enough: // if the actual install pulls private images, anonymous access will fail. if critical { - if _, _, hasCreds := credentialsForRegistry(registry); !hasCreds { - return fmt.Errorf("no credentials configured for %s "+ - "(add to ~/.docker/config.json or set NGC_API_KEY for NGC registries)", registry) - } + return requireConfiguredCredentials(registry) } return nil } +// errRegistryProbeSkipped marks a registry this probe cannot speak to. The +// caller reports it as a skip rather than a credential failure. +type errRegistryProbeSkipped struct{ reason string } + +func (e errRegistryProbeSkipped) Error() string { return e.reason } + +// authChallengeScheme returns the auth scheme named by a WWW-Authenticate +// header, or "" when the header is absent or malformed. +func authChallengeScheme(header string) string { + header = strings.TrimSpace(header) + if header == "" { + return "" + } + if i := strings.IndexByte(header, ' '); i > 0 { + return header[:i] + } + return header +} + +// requireConfiguredCredentials reports an error when no credential is reachable +// for the registry. +// +// A missing credential is a warning, not a hard failure: credsFromDockerConfig +// reads only inline auth entries, so a workstation using a credential helper +// (credsStore on Docker Desktop, docker-credential-pass on Linux) has a working +// docker login that is invisible here. The install path also mints or mirrors a +// pull secret of its own, so preflight must not be the thing that blocks. +func requireConfiguredCredentials(registry string) error { + if _, _, ok := credentialsForRegistry(registry); ok { + return nil + } + return errRegistryCredentialsUnverified{registry: registry} +} + +// errRegistryCredentialsUnverified means no credential was found locally. The +// caller downgrades this to a warning. +type errRegistryCredentialsUnverified struct{ registry string } + +func (e errRegistryCredentialsUnverified) Error() string { + return fmt.Sprintf("no local credentials found for %s "+ + "(a credential helper such as credsStore is not readable here); "+ + "if 'docker pull' works this can be ignored, otherwise add an entry to "+ + "~/.docker/config.json or set NGC_API_KEY for NGC registries", e.registry) +} + // isECRRegistry returns true for AWS Elastic Container Registry hostnames, // which use AWS SigV4 auth instead of the OCI Bearer token flow. func isECRRegistry(registry string) bool { @@ -147,22 +227,25 @@ func EnumerateRegistries(imageRef, stackValuesFile string, extras []string) []Re seen := make(map[string]bool) var out []RegistryEntry - add := func(registry string, critical bool) { + add := func(registry, repoHint string, critical bool) { registry = strings.TrimSpace(registry) if registry == "" || seen[registry] { return } seen[registry] = true - out = append(out, RegistryEntry{Registry: registry, Critical: critical}) + out = append(out, RegistryEntry{Registry: registry, RepoHint: repoHint, Critical: critical}) } // Source 1: base registry from the configured validator image. // Carry the repo path as a scope hint so the token exchange uses the // operator's actual org rather than a fake one — NGC returns 403 for // orgs the API key cannot access, even if the key itself is valid. + // + // Critical follows the same rule as every other source rather than being + // forced true: an air-gapped install that side-loaded the image never + // contacts this registry at pull time (ImagePullPolicy is IfNotPresent). if reg, repo, _, ok := parseImageRef(imageRef); ok && reg != "" { - seen[reg] = true - out = append(out, RegistryEntry{Registry: reg, RepoHint: repo, Critical: true}) + add(reg, repo, isNGCRegistry(reg)) } // Source 2: read global.image.registry from the environment values file. @@ -171,17 +254,23 @@ func EnumerateRegistries(imageRef, stackValuesFile string, extras []string) []Re if stackValuesFile != "" { if reg := readGlobalImageRegistry(stackValuesFile); reg != "" { // If it's an NGC registry, mark critical; customer mirrors are non-critical. - add(reg, isNGCRegistry(reg)) + add(reg, "", isNGCRegistry(reg)) } } - // Source 3: cert-manager's well-known exception (quay.io/jetstack). - // cert-manager ignores global.image.registry and always pulls from quay.io. - add(certManagerRegistry, false) + // Source 3: cert-manager, but only when the stack is not mirroring it. + // deploy/stacks/self-managed/global.yaml.gotmpl rewrites every cert-manager + // image to global.image.registry, so on a configured stack quay.io is never + // contacted and probing it is a pointless round trip. It is only reachable + // when no stack values file resolved. + if stackValuesFile == "" || readGlobalImageRegistry(stackValuesFile) == "" { + add(certManagerRegistry, "", false) + } // Source 4: operator-supplied extras (--cluster-validator-registries). - // Preserve non-443 ports in the registry string so probeRegistryCredential - // builds the correct https://host:port/v2/ URL. + // Preserve non-443 ports so probeRegistryCredential builds the correct + // https://host:port/v2/ URL. net.JoinHostPort brackets IPv6 literals, which + // a bare "%s:%d" would corrupt into https://::1:5000/v2/. for _, e := range extras { host, port := parseRegistryHostPort(e) if host == "" { @@ -189,9 +278,11 @@ func EnumerateRegistries(imageRef, stackValuesFile string, extras []string) []Re } reg := host if port != 0 && port != 443 { - reg = fmt.Sprintf("%s:%d", host, port) + reg = net.JoinHostPort(host, strconv.Itoa(port)) + } else if strings.Contains(host, ":") { + reg = "[" + host + "]" // bare IPv6 literal on the default port } - add(reg, false) + add(reg, "", false) } return out diff --git a/src/clis/nvcf-cli/internal/selfhosted/registry_cred_test.go b/src/clis/nvcf-cli/internal/selfhosted/registry_cred_test.go index ca6f81104a..411bafb83c 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/registry_cred_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/registry_cred_test.go @@ -33,8 +33,10 @@ import ( // -- probeRegistryCredential -- func TestProbeRegistryCredential_PublicRegistry(t *testing.T) { - // Registry returns 200 on /v2/ → public, no credentials needed. + // Registry returns 200 on /v2/ with the registry API header → public, + // no credentials needed. srv := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Docker-Distribution-Api-Version", "registry/2.0") w.WriteHeader(http.StatusOK) })) defer srv.Close() diff --git a/src/clis/nvcf-cli/internal/selfhosted/stale_namespace.go b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace.go index 1f31403cf3..75e4e9d80a 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/stale_namespace.go +++ b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace.go @@ -27,19 +27,30 @@ import ( "k8s.io/client-go/kubernetes" ) -// nvcfControlPlaneNamespaces is the canonical set of namespaces created on the -// control-plane cluster by the NVCF self-managed stack. Any of these that -// exist without an active Helm release, or that are stuck Terminating, are -// leftover from a failed or partial teardown. +// nvcfControlPlaneNamespaces lists namespaces that a helmfile release deploys +// into on the control-plane cluster, per deploy/stacks/self-managed/helmfile.d. +// Any of these that exist without an active Helm release, or that are stuck +// Terminating, are leftover from a failed or partial teardown. +// +// Only namespaces that actually host a release belong here: the remediation for +// a hit is "delete this namespace", so a namespace populated by something other +// than Helm (nvcf-backend, created at runtime by NVCA for worker pods) would be +// reported stale on a healthy cluster and deleting it would destroy live work. +// +// The gateway controller namespace is deliberately absent: the release templates +// it from .Values.ingress.gatewayApi.controllerNamespace, so hardcoding +// envoy-gateway-system would probe a namespace the stack may not own. var nvcfControlPlaneNamespaces = []string{ - "cassandra-system", "nats-system", "nvcf", "api-keys", "ess", "sis", - "vault-system", "nvcf-backend", "envoy-gateway-system", "openbao-system", + "api-keys", "cassandra-system", "cert-manager", "ess", + "nats-system", "nvcf", "nvcf-ui", "sis", "vault-system", } -// nvcfComputePlaneNamespaces is the canonical set of namespaces created on the -// compute-plane cluster by the NVCF self-managed stack. +// nvcfComputePlaneNamespaces lists namespaces that a helmfile release deploys +// into on the compute-plane cluster, per +// deploy/stacks/nvcf-compute-plane/helmfile.d. nvca-system is deliberately +// absent: it is operator-created and hosts no release. var nvcfComputePlaneNamespaces = []string{ - "nvca-operator", "nvca-system", + "dynamo-system", "grove-system", "kai-scheduler", "nvca-operator", } // StaleNamespace describes a single NVCF stack namespace that appears to be a @@ -84,6 +95,39 @@ func NewStaleNamespaceProber() StaleNamespaceProber { // // Helm 3 marks each release secret with the label owner=helm; absence of any // such secret means no live Helm release occupies the namespace. +// helmReleaseListPageSize bounds each page of the owner=helm scan. A namespace +// holds at most a handful of release objects, so this is only a ceiling on how +// much is pulled per round trip while paging past non-matching objects. +const helmReleaseListPageSize = 100 + +// helmReleaseExists reports whether any owner=helm object exists, paging until +// it finds one or the server reports no more results. +// +// A single page with Limit set is not a valid existence test: the apiserver +// applies the label selector after paging, so a page can legitimately return +// zero items alongside a Continue token. A namespace like nvcf holds dozens of +// ServiceAccount tokens and TLS secrets that sort before sh.helm.release.v1.*, +// so the first page is routinely empty on a perfectly healthy install. +func helmReleaseExists( + ctx context.Context, namespace string, + list func(metav1.ListOptions) (count int, cont string, err error), +) (bool, error) { + opts := metav1.ListOptions{LabelSelector: "owner=helm", Limit: helmReleaseListPageSize} + for { + count, cont, err := list(opts) + if err != nil { + return false, err + } + if count > 0 { + return true, nil + } + if cont == "" { + return false, nil + } + opts.Continue = cont + } +} + func probeStaleNamespaces(ctx context.Context, client kubernetes.Interface, namespaces []string) ([]StaleNamespace, error) { var stale []StaleNamespace for _, name := range namespaces { @@ -100,28 +144,35 @@ func probeStaleNamespaces(ctx context.Context, client kubernetes.Interface, name continue } - // Limit to 1: only existence matters, not the full release history. - // Check Secrets first (default Helm storage driver). If none exist, - // also check ConfigMaps to handle HELM_DRIVER=configmap clusters; - // both storage backends label their release objects with owner=helm. - secrets, err := client.CoreV1().Secrets(name).List(ctx, metav1.ListOptions{ - LabelSelector: "owner=helm", - Limit: 1, - }) + // Check Secrets first (the default Helm storage driver), then ConfigMaps + // for HELM_DRIVER=configmap clusters. Both label release objects + // owner=helm. + found, err := helmReleaseExists(ctx, name, + func(opts metav1.ListOptions) (int, string, error) { + l, lerr := client.CoreV1().Secrets(name).List(ctx, opts) + if lerr != nil { + return 0, "", lerr + } + return len(l.Items), l.Continue, nil + }) if err != nil { return stale, fmt.Errorf("list Helm secrets in %s: %w", name, err) } - if len(secrets.Items) > 0 { - continue // healthy: active Helm release found via secret driver + if found { + continue // healthy: active Helm release found via the secret driver } - cms, err := client.CoreV1().ConfigMaps(name).List(ctx, metav1.ListOptions{ - LabelSelector: "owner=helm", - Limit: 1, - }) + found, err = helmReleaseExists(ctx, name, + func(opts metav1.ListOptions) (int, string, error) { + l, lerr := client.CoreV1().ConfigMaps(name).List(ctx, opts) + if lerr != nil { + return 0, "", lerr + } + return len(l.Items), l.Continue, nil + }) if err != nil { return stale, fmt.Errorf("list Helm configmaps in %s: %w", name, err) } - if len(cms.Items) == 0 { + if !found { stale = append(stale, StaleNamespace{Name: name, Reason: "no Helm release"}) } } diff --git a/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go index e64700366f..5f20baf0d2 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go @@ -27,7 +27,9 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/kubernetes/fake" + ktesting "k8s.io/client-go/testing" ) // -- probeStaleNamespaces -- @@ -193,7 +195,8 @@ func TestStaleNamespaceCheck_StaleIsError(t *testing.T) { assert.Equal(t, "error", r.Severity, "detected stale namespaces must use error severity so the exit code is non-zero") assert.Contains(t, r.Message, "nvcf") - assert.Contains(t, r.Message, "kubectl patch namespace nvcf") + assert.Contains(t, r.Message, "/api/v1/namespaces/nvcf/finalize", + "the remediation must use the finalize subresource; a plain patch is silently reverted") } func TestStaleNamespaceCheck_CleanPasses(t *testing.T) { @@ -216,6 +219,58 @@ func TestStaleNamespaceCheck_MessageNamesAllStaleNamespaces(t *testing.T) { r := staleNamespaceCheck(prober, "", []string{"nvcf", "api-keys"}).Run(context.Background()) assert.Contains(t, r.Message, "nvcf") assert.Contains(t, r.Message, "api-keys") - assert.Contains(t, r.Message, "kubectl patch namespace nvcf") + assert.Contains(t, r.Message, "/api/v1/namespaces/nvcf/finalize", + "the remediation must use the finalize subresource; a plain patch is silently reverted") assert.Contains(t, r.Message, "kubectl delete namespace api-keys") } + +// A namespace on a real install holds many non-Helm Secrets (ServiceAccount +// tokens, TLS, pull secrets) that sort before sh.helm.release.v1.*. The +// apiserver applies the label selector after paging, so the first page can +// legitimately come back empty with a Continue token. Treating that as "no +// release" reports a live namespace stale and tells the operator to delete it. +func TestProbeStaleNamespaces_PagesPastNonMatchingObjects(t *testing.T) { + client := fake.NewSimpleClientset(&corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{Name: "nvcf"}, + Status: corev1.NamespaceStatus{Phase: corev1.NamespaceActive}, + }) + + // First page: empty with a Continue token. Second page: the release secret. + call := 0 + client.PrependReactor("list", "secrets", func(_ ktesting.Action) (bool, runtime.Object, error) { + call++ + if call == 1 { + return true, &corev1.SecretList{ + ListMeta: metav1.ListMeta{Continue: "next-page-token"}, + }, nil + } + return true, &corev1.SecretList{Items: []corev1.Secret{{ + ObjectMeta: metav1.ObjectMeta{ + Name: "sh.helm.release.v1.nvcf.v1", Namespace: "nvcf", + Labels: map[string]string{"owner": "helm"}, + }, + }}}, nil + }) + + stale, err := probeStaleNamespaces(context.Background(), client, []string{"nvcf"}) + require.NoError(t, err) + assert.Empty(t, stale, + "an empty first page with a Continue token must not be read as 'no Helm release'") + assert.Greater(t, call, 1, "the probe must follow the Continue token") +} + +// The remediation for a hit is "delete this namespace", so the list must only +// contain namespaces a helmfile release actually owns. nvcf-backend is created +// at runtime by NVCA and holds live worker pods. +func TestControlPlaneNamespaceList_ExcludesRuntimeOwnedNamespaces(t *testing.T) { + for _, ns := range []string{"nvcf-backend", "openbao-system"} { + assert.NotContains(t, nvcfControlPlaneNamespaces, ns, + "%s hosts no Helm release; probing it yields a destructive false positive", ns) + } + for _, ns := range []string{"cert-manager", "nvcf-ui"} { + assert.Contains(t, nvcfControlPlaneNamespaces, ns, + "%s is a real stack namespace and must be probed", ns) + } + assert.NotContains(t, nvcfComputePlaneNamespaces, "nvca-system", + "nvca-system is operator-created and hosts no release") +} diff --git a/src/clis/nvcf-cli/internal/selfhosted/teardown/drain_test.go b/src/clis/nvcf-cli/internal/selfhosted/teardown/drain_test.go index 3452e2724d..a8cb5c70c1 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/teardown/drain_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/teardown/drain_test.go @@ -34,7 +34,7 @@ import ( type fakeSIS struct { deployments []ActiveDeployment removeErr error - removeCalled []string // IDs passed to RemoveDeployment + removeCalled []string // IDs passed to RemoveDeployment statusResults map[string]string // ID → state string statusCallCnt int32 } @@ -73,7 +73,7 @@ func (s *recordSink) Close() error { return nil } type discardSink struct{} func (d *discardSink) Emit(_ context.Context, _ progress.Event) error { return nil } -func (d *discardSink) Close() error { return nil } +func (d *discardSink) Close() error { return nil } // TestDrain_NoActiveDeploymentsIsNoop: empty list → returns nil, no events. func TestDrain_NoActiveDeploymentsIsNoop(t *testing.T) { diff --git a/src/clis/nvcf-cli/internal/selfhosted/validatortag.go b/src/clis/nvcf-cli/internal/selfhosted/validatortag.go index d2f9fbca98..7b12c81332 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/validatortag.go +++ b/src/clis/nvcf-cli/internal/selfhosted/validatortag.go @@ -135,7 +135,7 @@ func fetchValidatorTags(ctx context.Context, registry, repo string) ([]string, e } func fetchWithBearer(ctx context.Context, rawURL, registry, repo string) ([]byte, error) { - client := &http.Client{Timeout: validatorTagFetchTimeout} + client := &http.Client{Timeout: validatorTagFetchTimeout, CheckRedirect: refuseInsecureRedirect} // First attempt without auth so anonymous-pullable registries work. req, err := http.NewRequestWithContext(ctx, http.MethodGet, rawURL, nil) @@ -182,6 +182,22 @@ func fetchWithBearer(ctx context.Context, rawURL, registry, repo string) ([]byte return io.ReadAll(resp.Body) } +// refuseInsecureRedirect rejects any redirect hop that is not https. +// +// Go strips the Authorization header only when a redirect changes host, and +// that comparison ignores the scheme. Without this, an https realm that 302s to +// http on the same host would re-send the operator's credentials in cleartext, +// defeating the https-only realm check a few lines below. +func refuseInsecureRedirect(req *http.Request, via []*http.Request) error { + if req.URL.Scheme != "https" { + return fmt.Errorf("refusing redirect to non-https URL %q", req.URL.Redacted()) + } + if len(via) >= 10 { + return fmt.Errorf("stopped after %d redirects", len(via)) + } + return nil +} + // exchangeBearerToken implements the OCI Distribution Spec Bearer token flow, // parsing realm/service/scope from the WWW-Authenticate header. Falls back to // the NGC /proxy_auth endpoint when the header is absent or unparseable. @@ -215,6 +231,13 @@ func exchangeBearerToken(ctx context.Context, client *http.Client, registry, rep if h, _, err := net.SplitHostPort(registry); err == nil { regHost = strings.ToLower(h) } + // Reject an empty realm host explicitly. "https://:443/token" has a + // non-empty u.Host (":443") so it clears the guard above, but Hostname() is + // "", and an empty trustedRealmDelegations lookup would then compare equal + // and authorize it. Fail closed instead. + if realmHost == "" { + return "", fmt.Errorf("refusing token exchange at realm %q with no host for %s", realm, registry) + } realmOK := realmHost == regHost || strings.HasSuffix(realmHost, "."+regHost) || (isNGCRegistry(registry) && isNGCRegistry(realmHost)) || diff --git a/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go b/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go index ce056a58b7..9e05456840 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go @@ -35,12 +35,12 @@ import ( func TestParseImageRef(t *testing.T) { cases := []struct { - name string - in string - reg string - repo string - tag string - wantOK bool + name string + in string + reg string + repo string + tag string + wantOK bool }{ {"full tag", "stg.nvcr.io/nvidia/nvcf-byoc/cluster-validator:3.0.0-rc.26", "stg.nvcr.io", "nvidia/nvcf-byoc/cluster-validator", "3.0.0-rc.26", true}, {"digest", "nvcr.io/foo/bar@sha256:abc", "nvcr.io", "foo/bar", "sha256:abc", true}, @@ -68,8 +68,8 @@ func TestPickBestValidatorTag_StablePreferred(t *testing.T) { tags := []string{ "3.0.0-rc.11", "3.0.0-rc.26", - "3.0.0", // stable; should win over any rc - "3.1.0-rc.1", // higher major but pre-release: must lose to 3.0.0 + "3.0.0", // stable; should win over any rc + "3.1.0-rc.1", // higher major but pre-release: must lose to 3.0.0 "sha256-abc.sig", "3.0.0-v50ca53a0", // commit-SHA: filtered out by pattern } From ff14b5d1ee6bfd4be9f9039f93ef2ee89b3f6f9b Mon Sep 17 00:00:00 2001 From: rohithb Date: Tue, 15 Sep 2026 13:05:35 +0530 Subject: [PATCH 15/36] fix(nvcf-cli): scope preflight to the targeted role and stop cross-role interference --- src/clis/nvcf-cli/cmd/root.go | 1 + src/clis/nvcf-cli/cmd/self_hosted_check.go | 157 +++++++++++++----- .../nvcf-cli/cmd/self_hosted_check_test.go | 4 + .../internal/selfhosted/clustervalidator.go | 75 +++++++-- .../internal/selfhosted/validatortag_test.go | 125 +++++++++----- 5 files changed, 268 insertions(+), 94 deletions(-) diff --git a/src/clis/nvcf-cli/cmd/root.go b/src/clis/nvcf-cli/cmd/root.go index a42df48c08..2f07f1b943 100644 --- a/src/clis/nvcf-cli/cmd/root.go +++ b/src/clis/nvcf-cli/cmd/root.go @@ -285,6 +285,7 @@ func initConfig() { // swapping --config files. The env name matches the historical // NVCF_CLI_CLUSTER_VALIDATOR_IMAGE override. viper.BindEnv("cluster_validator_image", "NVCF_CLI_CLUSTER_VALIDATOR_IMAGE") + viper.BindEnv("cluster_validator_registries", "NVCF_CLI_CLUSTER_VALIDATOR_REGISTRIES") // If a config file is found, read it in. if err := viper.ReadInConfig(); err == nil && viper.GetBool("debug") { diff --git a/src/clis/nvcf-cli/cmd/self_hosted_check.go b/src/clis/nvcf-cli/cmd/self_hosted_check.go index e9fb76a762..7e2421d052 100644 --- a/src/clis/nvcf-cli/cmd/self_hosted_check.go +++ b/src/clis/nvcf-cli/cmd/self_hosted_check.go @@ -23,6 +23,7 @@ import ( "io" "os" "path/filepath" + "strings" "time" "github.com/spf13/cobra" @@ -205,7 +206,7 @@ func runSelfHostedCheck(c *cobra.Command, _ []string) error { // up global.image.registry from the stack values file and any // --cluster-validator-registries extras independently of the image config. if !localOnly { - extraRegistries := viper.GetStringSlice("cluster_validator_registries") + extraRegistries := configuredValidatorRegistries() stackValuesFile := resolveStackValuesFile() credEntries = selfhosted.EnumerateRegistries( clusterValidatorImage, stackValuesFile, extraRegistries, @@ -293,31 +294,73 @@ func runSelfHostedCheck(c *cobra.Command, _ []string) error { } } -// resolveStackValuesFile walks up from the current working directory to find -// the active environment values YAML. Returns "" when not found so callers -// skip the optional lookup gracefully. +// resolveStackValuesFile returns the environment values YAML to read +// global.image.registry from, or "" when none is available. +// +// It prefers --control-plane-stack, the same source every sibling command uses, +// and only falls back to walking up from the working directory. Within a stack +// it tries HELMFILE_ENV (default "default") and then base.yaml, which is where +// global.image.registry actually lives. The previous version looked only for +// environments/local.yaml, which is not a tracked file, so on any clean +// checkout os.Stat never succeeded and this whole lookup was dead. func resolveStackValuesFile() string { - cwd, err := os.Getwd() - if err != nil { - return "" - } - // Walk up to 6 directory levels to find the stack environments directory. - dir := cwd - for i := 0; i < 6; i++ { - candidate := filepath.Join(dir, - "deploy", "stacks", "self-managed", "environments", "local.yaml") - if _, err := os.Stat(candidate); err == nil { - return candidate + var roots []string + if selfHostedControlPlaneStack != "" { + roots = append(roots, selfHostedControlPlaneStack) + } + if cwd, err := os.Getwd(); err == nil { + dir := cwd + for i := 0; i < 6; i++ { + roots = append(roots, dir) + parent := filepath.Dir(dir) + if parent == dir { + break + } + dir = parent } - parent := filepath.Dir(dir) - if parent == dir { - break + } + + env := os.Getenv("HELMFILE_ENV") + if env == "" { + env = "default" + } + names := []string{env + ".yaml", "base.yaml"} + + for _, root := range roots { + for _, sub := range [][]string{ + {"deploy", "stacks", "self-managed", "environments"}, + {"environments"}, // a stack dir passed directly + } { + for _, name := range names { + candidate := filepath.Join(append(append([]string{root}, sub...), name)...) + if _, err := os.Stat(candidate); err == nil { + return candidate + } + } } - dir = parent } return "" } +// configuredValidatorRegistries returns the extra registries from the flag, env +// var, or config file, normalized to one entry per registry. +// +// viper.GetStringSlice splits a raw env string on whitespace, so the documented +// comma form "a:443,b:443" arrives as a single element. Left as-is it reaches +// net.SplitHostPort as "a:443,b:443", which errors with "too many colons" and is +// then passed through verbatim as a host, producing https://a:443,b:443/v2/. +func configuredValidatorRegistries() []string { + var out []string + for _, raw := range viper.GetStringSlice("cluster_validator_registries") { + for _, part := range strings.Split(raw, ",") { + if part = strings.TrimSpace(part); part != "" { + out = append(out, part) + } + } + } + return out +} + // computePlaneIsTargeted reports whether the compute-plane validator should run: // --compute-plane, --all, or --pre in ModeSingle. --pre in ModeSplit does not // target it because separate clusters have no implicit compute-plane role. @@ -396,14 +439,18 @@ func runPreflightByRole(ctx context.Context, cfg selfhosted.PreflightConfig, sin return selfhosted.RunPreflightForRole(ctx, cfg, selfhosted.RoleLocalOnly, selfhosted.RoleConfig{}, sink) } + // SIS reachability is a compute-plane concern, and it is skipped pre-install + // because SIS is not up yet. The previous `!checkPre` form was also true + // whenever --control-plane was passed, so a control-plane run fired an HTTP + // request at SIS that the operator never asked for. icmsURL := "" - if checkAll || checkComputePlane || !checkPre { + if computePlaneIsTargeted(mode) && !checkPre { icmsURL = resolveICMSURL(selfHostedICMSURL) } skipInotify := checkSkipInotifyCheck || os.Getenv("NVCF_CLI_SELFHOSTED_SKIP_INOTIFY") != "" var inotifyProber selfhosted.NodeInotifyProber - if !skipInotify { + if computePlaneIsTargeted(mode) && !skipInotify { inotifyProber = newInotifyProberForSelfHosted() } @@ -413,8 +460,12 @@ func runPreflightByRole(ctx context.Context, cfg selfhosted.PreflightConfig, sin // Either way, leave clusterValidator nil so the validator row is // omitted from the check stream; the caller already emitted a // one-line stderr notice explaining which case applies. + // Gate on the role predicate as well as the image, mirroring + // cpClusterValidator below. Without this, --control-plane in ModeSplit + // still creates a ServiceAccount, cluster-wide ClusterRole/CRB, pull secret + // and validator Job in the compute cluster. var clusterValidator selfhosted.ClusterValidator - if clusterValidatorImage != "" { + if computePlaneIsTargeted(mode) && clusterValidatorImage != "" { clusterValidator = newClusterValidatorForSelfHosted() } @@ -422,7 +473,7 @@ func runPreflightByRole(ctx context.Context, cfg selfhosted.PreflightConfig, sin // Additional registries to probe in the control-plane validator ConfigMap. // Priority: flag > env > config file. - registries := viper.GetStringSlice("cluster_validator_registries") + registries := configuredValidatorRegistries() // The cluster-validator image is the same for both roles; VALIDATOR_ROLE // in the Job env selects which check set runs inside the binary. @@ -469,28 +520,48 @@ func runPreflightByRole(ctx context.Context, cfg selfhosted.PreflightConfig, sin _ = eg.Wait() return append(cpResults, gpuResults...) - default: // ModeSingle — no context flags; union both role check sets sequentially. - cpRC := selfhosted.RoleConfig{ - SISURL: icmsURL, - ClusterValidator: cpClusterValidator, - ClusterValidatorImage: clusterValidatorImage, - ClusterValidatorPullSecret: checkClusterValidatorPullSecret, - ClusterValidatorNoCleanup: checkClusterValidatorNoCleanup, - ClusterValidatorRegistries: registries, - StaleNamespaceProber: staleNSProber, + default: // ModeSingle — one cluster; run only the roles the flags target. + var results []selfhosted.CheckResult + + // The stale-namespace probe goes to exactly one role. Both roles share + // the cluster here, so handing it to both emits two check_completed + // events with the same ID and loads the kubeconfig twice, which means a + // second exec-credential-plugin prompt. + staleForControlPlane := staleNSProber + staleForComputePlane := staleNSProber + if controlPlaneIsTargeted(mode) { + staleForComputePlane = nil + } else { + staleForControlPlane = nil } - gpuRC := selfhosted.RoleConfig{ - SISURL: icmsURL, - InotifyProber: inotifyProber, - ClusterValidator: clusterValidator, - ClusterValidatorImage: clusterValidatorImage, - ClusterValidatorPullSecret: checkClusterValidatorPullSecret, - ClusterValidatorNoCleanup: checkClusterValidatorNoCleanup, - StaleNamespaceProber: staleNSProber, + + if controlPlaneIsTargeted(mode) { + cpRC := selfhosted.RoleConfig{ + SISURL: icmsURL, + ClusterValidator: cpClusterValidator, + ClusterValidatorImage: clusterValidatorImage, + ClusterValidatorPullSecret: checkClusterValidatorPullSecret, + ClusterValidatorNoCleanup: checkClusterValidatorNoCleanup, + ClusterValidatorRegistries: registries, + StaleNamespaceProber: staleForControlPlane, + } + results = append(results, + selfhosted.RunPreflightForRole(ctx, cfg, selfhosted.RoleControlPlane, cpRC, sink)...) } - cpResults := selfhosted.RunPreflightForRole(ctx, cfg, selfhosted.RoleControlPlane, cpRC, sink) - gpuResults := selfhosted.RunPreflightForRole(ctx, cfg, selfhosted.RoleComputePlane, gpuRC, sink) - return append(cpResults, gpuResults...) + if computePlaneIsTargeted(mode) { + gpuRC := selfhosted.RoleConfig{ + SISURL: icmsURL, + InotifyProber: inotifyProber, + ClusterValidator: clusterValidator, + ClusterValidatorImage: clusterValidatorImage, + ClusterValidatorPullSecret: checkClusterValidatorPullSecret, + ClusterValidatorNoCleanup: checkClusterValidatorNoCleanup, + StaleNamespaceProber: staleForComputePlane, + } + results = append(results, + selfhosted.RunPreflightForRole(ctx, cfg, selfhosted.RoleComputePlane, gpuRC, sink)...) + } + return results } } diff --git a/src/clis/nvcf-cli/cmd/self_hosted_check_test.go b/src/clis/nvcf-cli/cmd/self_hosted_check_test.go index 53bc744c3a..38fed5637d 100644 --- a/src/clis/nvcf-cli/cmd/self_hosted_check_test.go +++ b/src/clis/nvcf-cli/cmd/self_hosted_check_test.go @@ -494,6 +494,10 @@ func TestCheck_ValidatorSkipNoteAppearsOnComputePlane(t *testing.T) { checkComputePlane = false checkSkipClusterValidation = false }) + // --skip-cluster-validation does not gate the inotify prober, which lists + // every node and creates a privileged pod on each. Without this the test + // writes to whatever cluster is in the developer's current kubecontext. + t.Setenv("NVCF_CLI_SELFHOSTED_SKIP_INOTIFY", "1") var stderr bytes.Buffer rootCmd.SetErr(&stderr) diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go index 66a409d140..f44f4fe361 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go @@ -138,14 +138,20 @@ func runClusterValidator(ctx context.Context, client kubernetes.Interface, image if err := ensureClusterValidatorRBAC(vctx, client); err != nil { return ClusterValidatorResult{Err: fmt.Errorf("bootstrapping validator RBAC: %w", err)} } - // Remove the ClusterRole and ClusterRoleBinding after the Job finishes - // (when cleanup is enabled) to minimize the window where the elevated SA - // exists. Uses a fresh context so cleanup runs even when vctx is expired. - // When --no-cleanup is set, the operator expects to inspect the Job; we - // leave the RBAC in place so they can re-exec the pod without re-bootstrap. - if !noCleanup { - defer sweepClusterValidatorRBAC(context.Background(), client) - } + // Remove the ClusterRole and ClusterRoleBinding once the Job has reached a + // terminal state, to minimize the window where the elevated SA exists. + // + // Gated on jobTerminated rather than deferred unconditionally: on the + // timeout and ImagePullBackOff paths the pod is still running, and pulling + // its RBAC out from under it fills the surviving transcript with "forbidden" + // errors that mask the real cause. When --no-cleanup is set the operator + // expects to inspect the Job, so the RBAC stays either way. + jobTerminated := false + defer func() { + if !noCleanup && jobTerminated { + sweepClusterValidatorRBAC(context.Background(), client) + } + }() // For the control-plane role, create a ConfigMap with reachability // endpoints and enforcement config so the validator runs its configurable @@ -162,7 +168,7 @@ func runClusterValidator(ctx context.Context, client kubernetes.Interface, image } } - sweepPriorClusterValidatorJobs(vctx, client) + sweepPriorClusterValidatorJobs(vctx, client, role) jobName := fmt.Sprintf("%s-%d", clusterValidatorName, time.Now().UnixNano()) if _, err := client.BatchV1().Jobs(clusterValidatorNamespace).Create( @@ -172,6 +178,9 @@ func runClusterValidator(ctx context.Context, client kubernetes.Interface, image } final, waitErr := waitForClusterValidatorJob(vctx, client, jobName) + // Only a clean wait means the pod is done; a timeout or a pull failure + // leaves it running, so the deferred RBAC sweep must not fire. + jobTerminated = waitErr == nil // Fetch logs under a fresh ctx from the parent: vctx is expired on the // timeout path, and dropping the partial transcript hurts most there. @@ -287,6 +296,27 @@ func clusterValidatorLabels() map[string]string { } } +// clusterValidatorRoleLabels adds the role so the prior-run sweep only matches +// Jobs from the same role. Without it, a ModeSingle run deletes the other +// role's Job mid-command, including under --no-cleanup, which makes the +// printed `kubectl logs job/...` hint 404. +func clusterValidatorRoleLabels(role string) map[string]string { + l := clusterValidatorLabels() + l[clusterValidatorRoleLabel] = role + return l +} + +// validatorConfigNameForRole returns the network-check ConfigMap name the Job +// should read. Only the control-plane role has one; the compute-plane role gets +// a sentinel that resolves to nothing so it cannot inherit the control-plane's +// reachability and enforcement config. +func validatorConfigNameForRole(role string) string { + if role == clusterValidatorControlPlaneRole { + return clusterValidatorConfigName + } + return clusterValidatorNoConfigName +} + // sweepClusterValidatorRBAC removes the SA, ClusterRole, and ClusterRoleBinding // created by ensureClusterValidatorRBAC. Called after Job completion (when // --no-cleanup is not set) to close the window where the elevated ClusterRole @@ -299,8 +329,11 @@ func sweepClusterValidatorRBAC(ctx context.Context, client kubernetes.Interface) } // Errors are swallowed: a stale Job is preferable to blocking the new run. -func sweepPriorClusterValidatorJobs(ctx context.Context, client kubernetes.Interface) { - selector := fmt.Sprintf("app.kubernetes.io/name=%s,app.kubernetes.io/managed-by=nvcf-cli", clusterValidatorAppLabel) +func sweepPriorClusterValidatorJobs(ctx context.Context, client kubernetes.Interface, role string) { + // Scope to this role: in ModeSingle both roles run against the same + // cluster, so an unscoped selector deletes the other role's Job mid-command. + selector := fmt.Sprintf("app.kubernetes.io/name=%s,app.kubernetes.io/managed-by=nvcf-cli,%s=%s", + clusterValidatorAppLabel, clusterValidatorRoleLabel, role) propagation := metav1.DeletePropagationBackground _ = client.BatchV1().Jobs(clusterValidatorNamespace).DeleteCollection( ctx, @@ -336,6 +369,14 @@ const clusterValidatorControlPlaneRole = "control-plane" // defaultConfigMapName in nvca/cmd/cluster-validator/main.go. const clusterValidatorConfigName = "cluster-validator-network-checks" +// clusterValidatorNoConfigName is a name no ConfigMap uses. VALIDATOR_CONFIG_NAME +// must be non-empty to suppress the validator's own default-name fallback, so +// "no config" has to be spelled as a name that resolves to nothing. +const clusterValidatorNoConfigName = "cluster-validator-no-config" + +// clusterValidatorRoleLabel scopes Job selectors to a single validator role. +const clusterValidatorRoleLabel = "nvcf.nvidia.com/validator-role" + // controlPlaneValidatorConfigTemplate is the baseline network-check ConfigMap for // control-plane preflight: nvcr.io reachability (critical) and NetworkPolicy // enforcement (non-critical). Extra registries are appended as non-critical probes. @@ -452,7 +493,13 @@ func buildClusterValidatorJob(name, image, pullSecret, role string, noCleanup bo ImagePullPolicy: corev1.PullIfNotPresent, Env: []corev1.EnvVar{ {Name: "VALIDATOR_CONFIG_NAMESPACE", Value: clusterValidatorNamespace}, - {Name: "VALIDATOR_CONFIG_NAME", Value: ""}, + // Name the ConfigMap explicitly for the control-plane role and + // leave it unresolvable for the compute-plane role. An empty + // value is NOT "no config": the validator falls back to its own + // default name, so both roles would resolve the same ConfigMap + // and the compute-plane preflight would silently run the + // control-plane's active NetworkPolicy enforcement. + {Name: "VALIDATOR_CONFIG_NAME", Value: validatorConfigNameForRole(role)}, {Name: "VALIDATOR_PREFLIGHT", Value: "true"}, {Name: "VALIDATOR_ROLE", Value: role}, }, @@ -465,12 +512,12 @@ func buildClusterValidatorJob(name, image, pullSecret, role string, noCleanup bo ObjectMeta: metav1.ObjectMeta{ Name: name, Namespace: clusterValidatorNamespace, - Labels: clusterValidatorLabels(), + Labels: clusterValidatorRoleLabels(role), }, Spec: batchv1.JobSpec{ BackoffLimit: &backoff, Template: corev1.PodTemplateSpec{ - ObjectMeta: metav1.ObjectMeta{Labels: clusterValidatorLabels()}, + ObjectMeta: metav1.ObjectMeta{Labels: clusterValidatorRoleLabels(role)}, Spec: podSpec, }, }, diff --git a/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go b/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go index 9e05456840..88b5970441 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go @@ -20,12 +20,13 @@ package selfhosted import ( "context" "encoding/json" + "fmt" + "io" "net/http" - "net/http/httptest" - "net/url" "os" "path/filepath" "strings" + "sync" "testing" "time" @@ -341,33 +342,69 @@ func TestIsNGCRegistry(t *testing.T) { // -- exchangeBearerToken realm host authorization -- +// recordingTransport records every request it sees and reports whether any +// carried an Authorization header, so a test can assert that no credential +// escaped rather than only that an error was returned. +type recordingTransport struct { + mu sync.Mutex + requests []*http.Request + withAuth []string + inner http.RoundTripper +} + +func (rt *recordingTransport) RoundTrip(r *http.Request) (*http.Response, error) { + rt.mu.Lock() + rt.requests = append(rt.requests, r) + if r.Header.Get("Authorization") != "" { + rt.withAuth = append(rt.withAuth, r.URL.String()) + } + rt.mu.Unlock() + if rt.inner == nil { + return nil, fmt.Errorf("no inner transport") + } + return rt.inner.RoundTrip(r) +} + func TestExchangeBearerToken_RejectsAttackerRealm(t *testing.T) { - // A malicious registry returns a realm on an attacker-controlled host. - // The function must reject this without forwarding credentials. - spy := &spyTransport{t: t} - - // Set up a fake registry server that returns 401 with an attacker realm. - srv := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Www-Authenticate", `Bearer realm="https://attacker.example.com/token",service="harbor.company.internal"`) - w.WriteHeader(http.StatusUnauthorized) - })) - defer srv.Close() - - client := srv.Client() - // Replace the transport with the spy AFTER the TLS is set up; the spy - // wraps the original to preserve TLS but fails on any attacker call. - origTransport := client.Transport - client.Transport = roundTripperFunc(func(r *http.Request) (*http.Response, error) { - if r.Host == "attacker.example.com" || strings.Contains(r.URL.Host, "attacker") { - t.Fatalf("credentials must not be forwarded to attacker host: %s", r.URL) - } - return origTransport.RoundTrip(r) - }) - _ = spy + // A malicious registry returns a realm on an attacker-controlled host. The + // realm check must reject it, and crucially must do so before any request + // carrying the operator's credentials leaves the process. + // + // Credentials have to be configured for the assertion to mean anything: if + // none were present, no request could carry an Authorization header whether + // the control works or not. + t.Setenv("NGC_API_KEY", "test-key") + + rec := &recordingTransport{inner: http.DefaultTransport} + client := &http.Client{Transport: rec} + + const wwwAuth = `Bearer realm="https://attacker.example.com/token",service="harbor.company.internal"` + _, err := exchangeBearerToken(context.Background(), client, + "harbor.company.internal", "myrepo/image", wwwAuth) - _, err := exchangeBearerToken(context.Background(), client, "harbor.company.internal", "myrepo/image", `Bearer realm="https://attacker.example.com/token",service="harbor.company.internal"`) require.Error(t, err) assert.Contains(t, err.Error(), "not authorized for registry") + assert.Empty(t, rec.withAuth, + "no request carrying an Authorization header may be issued once the realm is rejected") + for _, r := range rec.requests { + assert.NotContains(t, r.URL.Host, "attacker", + "no request at all may reach the attacker host") + } +} + +// An empty realm host must fail closed. "https://:443/token" has a non-empty +// u.Host (":443") so it clears the relative-realm guard, but Hostname() is "", +// and an empty trustedRealmDelegations lookup would compare equal to it. +func TestExchangeBearerToken_RejectsEmptyRealmHost(t *testing.T) { + t.Setenv("NGC_API_KEY", "test-key") + rec := &recordingTransport{inner: http.DefaultTransport} + client := &http.Client{Transport: rec} + + _, err := exchangeBearerToken(context.Background(), client, + "harbor.company.internal", "myrepo/image", `Bearer realm="https://:443/token"`) + + require.Error(t, err) + assert.Empty(t, rec.withAuth, "an empty realm host must not receive credentials") } // -- exchangeNGCBearerToken -- @@ -387,18 +424,32 @@ func (f roundTripperFunc) RoundTrip(r *http.Request) (*http.Response, error) { r func TestExchangeBearerToken_DockerHubDelegatedRealm(t *testing.T) { // Docker Hub uses registry-1.docker.io as the pull host and auth.docker.io - // for token exchange. The realm host check must allow this documented - // delegation rather than rejecting it as an unauthorized host. - wwwAuth := `Bearer realm="https://auth.docker.io/token",service="registry.docker.io",scope="repository:library/ubuntu:pull"` - realm, _, _ := parseWWWAuthenticate(wwwAuth) - u, err := url.Parse(realm) - require.NoError(t, err) - - realmHost := strings.ToLower(u.Hostname()) - regHost := "registry-1.docker.io" - delegated := trustedRealmDelegations[regHost] - assert.Equal(t, "auth.docker.io", delegated, "Docker Hub auth host must be in trusted delegation map") - assert.Equal(t, delegated, realmHost, "auth.docker.io realm must be authorized for registry-1.docker.io") + // for token exchange. The realm check must authorize that delegation, so + // drive exchangeBearerToken and assert the request actually reached the + // auth host rather than comparing the delegation map against itself. + t.Setenv("NGC_API_KEY", "test-key") + + rec := &recordingTransport{inner: roundTripperFunc(func(r *http.Request) (*http.Response, error) { + if r.URL.Host != "auth.docker.io" { + return nil, fmt.Errorf("unexpected host %s", r.URL.Host) + } + return &http.Response{ + StatusCode: http.StatusOK, + Body: io.NopCloser(strings.NewReader(`{"token":"dockerhub-token"}`)), + Header: make(http.Header), + }, nil + })} + client := &http.Client{Transport: rec} + + const wwwAuth = `Bearer realm="https://auth.docker.io/token",service="registry.docker.io",` + + `scope="repository:library/ubuntu:pull"` + tok, err := exchangeBearerToken(context.Background(), client, + "registry-1.docker.io", "library/ubuntu", wwwAuth) + + require.NoError(t, err, "the documented Docker Hub delegation must be authorized") + assert.Equal(t, "dockerhub-token", tok) + require.NotEmpty(t, rec.requests, "the token exchange must actually be issued") + assert.Equal(t, "auth.docker.io", rec.requests[0].URL.Host) } func TestExchangeNGCBearerToken_RejectsNonNGCRegistry(t *testing.T) { From 7aba33bb9556a05379a6963851a16a6bad47b62f Mon Sep 17 00:00:00 2001 From: rohithb Date: Tue, 15 Sep 2026 13:15:27 +0530 Subject: [PATCH 16/36] fix(nvcf-cli): derive stale-namespace probe targets from the stack helmfile --- src/clis/nvcf-cli/cmd/self_hosted_check.go | 22 +++++ .../nvcf-cli/internal/selfhosted/preflight.go | 11 ++- .../internal/selfhosted/stack_namespaces.go | 85 ++++++++++++++++ .../selfhosted/stack_namespaces_test.go | 97 +++++++++++++++++++ 4 files changed, 213 insertions(+), 2 deletions(-) create mode 100644 src/clis/nvcf-cli/internal/selfhosted/stack_namespaces.go create mode 100644 src/clis/nvcf-cli/internal/selfhosted/stack_namespaces_test.go diff --git a/src/clis/nvcf-cli/cmd/self_hosted_check.go b/src/clis/nvcf-cli/cmd/self_hosted_check.go index 7e2421d052..b7eda1a315 100644 --- a/src/clis/nvcf-cli/cmd/self_hosted_check.go +++ b/src/clis/nvcf-cli/cmd/self_hosted_check.go @@ -342,6 +342,24 @@ func resolveStackValuesFile() string { return "" } +// localStackDir returns src when it points at a readable local directory. +// Remote sources (oci://, git@, https://...git) are not fetched here: the +// stale-namespace check falls back to its static list rather than making +// preflight depend on a network round trip. +func localStackDir(src string) string { + if src == "" { + return "" + } + src = strings.TrimPrefix(src, "file://") + if strings.Contains(src, "://") || strings.HasPrefix(src, "git@") { + return "" + } + if fi, err := os.Stat(src); err == nil && fi.IsDir() { + return src + } + return "" +} + // configuredValidatorRegistries returns the extra registries from the flag, env // var, or config file, normalized to one entry per registry. // @@ -499,6 +517,7 @@ func runPreflightByRole(ctx context.Context, cfg selfhosted.PreflightConfig, sin ClusterValidatorNoCleanup: checkClusterValidatorNoCleanup, ClusterValidatorRegistries: registries, StaleNamespaceProber: staleNSProber, + StackDir: localStackDir(selfHostedControlPlaneStack), } cpResults = selfhosted.RunPreflightForRole(egCtx, cfg, selfhosted.RoleControlPlane, rc, sink) return nil @@ -513,6 +532,7 @@ func runPreflightByRole(ctx context.Context, cfg selfhosted.PreflightConfig, sin ClusterValidatorPullSecret: checkClusterValidatorPullSecret, ClusterValidatorNoCleanup: checkClusterValidatorNoCleanup, StaleNamespaceProber: staleNSProber, + StackDir: localStackDir(selfHostedComputePlaneStack), } gpuResults = selfhosted.RunPreflightForRole(egCtx, cfg, selfhosted.RoleComputePlane, rc, sink) return nil @@ -544,6 +564,7 @@ func runPreflightByRole(ctx context.Context, cfg selfhosted.PreflightConfig, sin ClusterValidatorNoCleanup: checkClusterValidatorNoCleanup, ClusterValidatorRegistries: registries, StaleNamespaceProber: staleForControlPlane, + StackDir: localStackDir(selfHostedControlPlaneStack), } results = append(results, selfhosted.RunPreflightForRole(ctx, cfg, selfhosted.RoleControlPlane, cpRC, sink)...) @@ -557,6 +578,7 @@ func runPreflightByRole(ctx context.Context, cfg selfhosted.PreflightConfig, sin ClusterValidatorPullSecret: checkClusterValidatorPullSecret, ClusterValidatorNoCleanup: checkClusterValidatorNoCleanup, StaleNamespaceProber: staleForComputePlane, + StackDir: localStackDir(selfHostedComputePlaneStack), } results = append(results, selfhosted.RunPreflightForRole(ctx, cfg, selfhosted.RoleComputePlane, gpuRC, sink)...) diff --git a/src/clis/nvcf-cli/internal/selfhosted/preflight.go b/src/clis/nvcf-cli/internal/selfhosted/preflight.go index fd6138a628..39e1d50d73 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/preflight.go +++ b/src/clis/nvcf-cli/internal/selfhosted/preflight.go @@ -313,6 +313,11 @@ type RoleConfig struct { // the check; production wires NewStaleNamespaceProber; tests pass fakes. StaleNamespaceProber StaleNamespaceProber + // StackDir is the resolved stack checkout. When set, the namespaces to + // probe are read from its helmfile.d rather than the static fallback list, + // so the check follows the stack instead of drifting from it. + StackDir string + // ClusterValidatorRegistries is an optional list of "host:port" registry // endpoints added to the control-plane validator ConfigMap alongside the // built-in nvcr.io probe. Ignored for the compute-plane validator. @@ -405,7 +410,8 @@ func controlPlaneCheckCategory(rc RoleConfig) categorySpec { // before any other cluster work. if rc.StaleNamespaceProber != nil { cat.checks = append(cat.checks, - staleNamespaceCheck(rc.StaleNamespaceProber, rc.KubeContext, nvcfControlPlaneNamespaces)) + staleNamespaceCheck(rc.StaleNamespaceProber, rc.KubeContext, + resolveStackNamespaces(rc.StackDir, nvcfControlPlaneNamespaces))) } // Containerized cluster-validator probe for control-plane checks // (Gateway API CRDs, Envoy Gateway, StorageClass, external LB, @@ -440,7 +446,8 @@ func computePlaneCheckCategory(rc RoleConfig) categorySpec { // partial teardown surface before any other cluster work. if rc.StaleNamespaceProber != nil { cat.checks = append([]binaryCheckSpec{ - staleNamespaceCheck(rc.StaleNamespaceProber, rc.KubeContext, nvcfComputePlaneNamespaces), + staleNamespaceCheck(rc.StaleNamespaceProber, rc.KubeContext, + resolveStackNamespaces(rc.StackDir, nvcfComputePlaneNamespaces)), }, cat.checks...) } if rc.SISURL != "" { diff --git a/src/clis/nvcf-cli/internal/selfhosted/stack_namespaces.go b/src/clis/nvcf-cli/internal/selfhosted/stack_namespaces.go new file mode 100644 index 0000000000..d6f6f68859 --- /dev/null +++ b/src/clis/nvcf-cli/internal/selfhosted/stack_namespaces.go @@ -0,0 +1,85 @@ +/* +SPDX-FileCopyrightText: Copyright (c) NVIDIA CORPORATION & AFFILIATES. All rights reserved. +SPDX-License-Identifier: Apache-2.0 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package selfhosted + +import ( + "os" + "path/filepath" + "regexp" + "sort" + "strings" +) + +// helmfileNamespaceRE matches a literal `namespace: ` declaration in a +// helmfile release entry. Values containing a Go template action are excluded +// by the character class: those are operator-configurable (the gateway +// controller namespace is one), so their rendered value is not knowable here. +var helmfileNamespaceRE = regexp.MustCompile(`(?m)^\s*namespace:\s*([A-Za-z0-9][A-Za-z0-9.-]*)\s*$`) + +// stackReleaseNamespaces returns the namespaces that helmfile releases deploy +// into for the stack rooted at stackDir, or nil when the stack is not readable. +// +// This is the authoritative answer to "which namespaces does the stack own", +// which matters because the stale-namespace check's remediation is to delete +// them: a hardcoded list that drifts either misses a real leftover or, worse, +// names a namespace the stack does not own. +// +// Callers fall back to the static list when this returns nil, which is the +// normal case for a released binary with no stack checkout alongside it. +func stackReleaseNamespaces(stackDir string) []string { + if stackDir == "" { + return nil + } + entries, err := filepath.Glob(filepath.Join(stackDir, "helmfile.d", "*.yaml.gotmpl")) + if err != nil || len(entries) == 0 { + return nil + } + + seen := make(map[string]bool) + for _, path := range entries { + body, err := os.ReadFile(path) + if err != nil { + continue + } + for _, m := range helmfileNamespaceRE.FindAllStringSubmatch(string(body), -1) { + if ns := strings.TrimSpace(m[1]); ns != "" { + seen[ns] = true + } + } + } + if len(seen) == 0 { + return nil + } + + out := make([]string, 0, len(seen)) + for ns := range seen { + out = append(out, ns) + } + sort.Strings(out) + return out +} + +// resolveStackNamespaces returns the namespaces to probe for the given plane. +// It prefers what the stack actually declares and falls back to the static +// list when no stack is available. +func resolveStackNamespaces(stackDir string, fallback []string) []string { + if derived := stackReleaseNamespaces(stackDir); len(derived) > 0 { + return derived + } + return fallback +} diff --git a/src/clis/nvcf-cli/internal/selfhosted/stack_namespaces_test.go b/src/clis/nvcf-cli/internal/selfhosted/stack_namespaces_test.go new file mode 100644 index 0000000000..0bd4ba19d8 --- /dev/null +++ b/src/clis/nvcf-cli/internal/selfhosted/stack_namespaces_test.go @@ -0,0 +1,97 @@ +/* +SPDX-FileCopyrightText: Copyright (c) NVIDIA CORPORATION & AFFILIATES. All rights reserved. +SPDX-License-Identifier: Apache-2.0 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package selfhosted + +import ( + "os" + "path/filepath" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// writeStack lays out a minimal helmfile.d matching the real stack's shape. +func writeStack(t *testing.T, files map[string]string) string { + t.Helper() + dir := t.TempDir() + hd := filepath.Join(dir, "helmfile.d") + require.NoError(t, os.MkdirAll(hd, 0o755)) + for name, body := range files { + require.NoError(t, os.WriteFile(filepath.Join(hd, name), []byte(body), 0o600)) + } + return dir +} + +func TestStackReleaseNamespaces_ReadsLiteralNamespaces(t *testing.T) { + dir := writeStack(t, map[string]string{ + "01-dependencies.yaml.gotmpl": ` +releases: + - name: nats + namespace: nats-system + - name: cert-manager + namespace: cert-manager +`, + "02-core.yaml.gotmpl": ` +releases: + - name: api + namespace: nvcf + - name: ui + namespace: nvcf-ui +`, + }) + + got := stackReleaseNamespaces(dir) + assert.Equal(t, []string{"cert-manager", "nats-system", "nvcf", "nvcf-ui"}, got, + "namespaces must come from the stack, de-duplicated and sorted") +} + +// The gateway controller namespace is templated from a values key, so its +// rendered value is not knowable from the source. Including the raw template +// text would produce a garbage namespace to probe and, on a hit, to delete. +func TestStackReleaseNamespaces_SkipsTemplatedNamespaces(t *testing.T) { + dir := writeStack(t, map[string]string{ + "02-core.yaml.gotmpl": ` +releases: + - name: api + namespace: nvcf + - name: ingress + namespace: {{ .Values.ingress.gatewayApi.controllerNamespace }} +`, + }) + + got := stackReleaseNamespaces(dir) + assert.Equal(t, []string{"nvcf"}, got, "a templated namespace must not be probed") +} + +func TestResolveStackNamespaces_FallsBackWhenNoStack(t *testing.T) { + fallback := []string{"nvcf", "sis"} + + assert.Equal(t, fallback, resolveStackNamespaces("", fallback), + "no stack path must use the static list") + assert.Equal(t, fallback, resolveStackNamespaces(t.TempDir(), fallback), + "a directory with no helmfile.d must use the static list") +} + +func TestResolveStackNamespaces_PrefersStack(t *testing.T) { + dir := writeStack(t, map[string]string{ + "01.yaml.gotmpl": "releases:\n - name: a\n namespace: from-stack\n", + }) + assert.Equal(t, []string{"from-stack"}, resolveStackNamespaces(dir, []string{"static"}), + "a readable stack must win over the static list") +} From ce9f770b856935f40b7c748f93b27df4ea4a467c Mon Sep 17 00:00:00 2001 From: rohithb Date: Tue, 15 Sep 2026 13:39:58 +0530 Subject: [PATCH 17/36] fix(nvcf-cli): make credential and RBAC outcomes consistent across probe paths --- .../internal/selfhosted/clustervalidator.go | 25 ++++----- .../internal/selfhosted/registry_cred.go | 34 +++++++----- .../internal/selfhosted/registry_cred_test.go | 53 ++++++++++++++++++- .../internal/selfhosted/stack_namespaces.go | 18 +++++-- .../selfhosted/stack_namespaces_test.go | 22 ++++++++ .../internal/selfhosted/stale_namespace.go | 24 ++++++--- 6 files changed, 137 insertions(+), 39 deletions(-) diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go index f44f4fe361..b076239470 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go @@ -138,17 +138,16 @@ func runClusterValidator(ctx context.Context, client kubernetes.Interface, image if err := ensureClusterValidatorRBAC(vctx, client); err != nil { return ClusterValidatorResult{Err: fmt.Errorf("bootstrapping validator RBAC: %w", err)} } - // Remove the ClusterRole and ClusterRoleBinding once the Job has reached a - // terminal state, to minimize the window where the elevated SA exists. - // - // Gated on jobTerminated rather than deferred unconditionally: on the - // timeout and ImagePullBackOff paths the pod is still running, and pulling - // its RBAC out from under it fills the surviving transcript with "forbidden" - // errors that mask the real cause. When --no-cleanup is set the operator + // Remove the ClusterRole and ClusterRoleBinding to minimize the window in + // which the elevated SA exists. When --no-cleanup is set the operator // expects to inspect the Job, so the RBAC stays either way. - jobTerminated := false + // + // podMayBeRunning is true only between a successful Job create and a clean + // wait. Everywhere else nothing is using the RBAC, so reclaim it rather + // than leaking a cluster-wide ClusterRole. + podMayBeRunning := false defer func() { - if !noCleanup && jobTerminated { + if !noCleanup && !podMayBeRunning { sweepClusterValidatorRBAC(context.Background(), client) } }() @@ -176,11 +175,13 @@ func runClusterValidator(ctx context.Context, client kubernetes.Interface, image ); err != nil { return ClusterValidatorResult{Err: fmt.Errorf("creating validator Job: %w", err)} } + podMayBeRunning = true final, waitErr := waitForClusterValidatorJob(vctx, client, jobName) - // Only a clean wait means the pod is done; a timeout or a pull failure - // leaves it running, so the deferred RBAC sweep must not fire. - jobTerminated = waitErr == nil + // A clean wait means the pod reached a terminal state, so the RBAC can go. + // A timeout or pull failure leaves it running: pulling the RBAC then fills + // the surviving transcript with "forbidden" and masks the real cause. + podMayBeRunning = waitErr != nil // Fetch logs under a fresh ctx from the parent: vctx is expired on the // timeout path, and dropping the partial transcript hurts most there. diff --git a/src/clis/nvcf-cli/internal/selfhosted/registry_cred.go b/src/clis/nvcf-cli/internal/selfhosted/registry_cred.go index 9312b18807..140fb9fdf9 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/registry_cred.go +++ b/src/clis/nvcf-cli/internal/selfhosted/registry_cred.go @@ -33,8 +33,9 @@ import ( const ( registryProbeTimeout = 10 * time.Second - // certManagerRegistry is the well-known exception from the helmfile: - // cert-manager uses quay.io/jetstack images, not global.image.registry. + // certManagerRegistry is cert-manager's upstream registry. It is only + // contacted when the stack is not rewriting cert-manager images to + // global.image.registry, which global.yaml.gotmpl does for all five of them. certManagerRegistry = "quay.io" ) @@ -52,9 +53,15 @@ func NewRegistryCredentialChecker() RegistryCredentialChecker { } // probeRegistryCredential authenticates to registry using the OCI Bearer token -// flow. repoHint is the OAuth scope repository path. ECR registries return a -// clear diagnostic instead of attempting the Bearer flow. When critical is true, -// anonymous token success is rejected: configured credentials must be present. +// flow. repoHint is the OAuth scope repository path. +// +// When critical is true, anonymous success is not sufficient: the install pulls +// private repositories, so a local credential must also be present. +// +// Returns errRegistryProbeSkipped for registries this flow cannot speak to +// (ECR's SigV4, a Basic challenge, a 200 that does not look like a registry) +// and errRegistryCredentialsUnverified when no local credential is readable. +// Both are advisory: the caller must not fail the run on either. func probeRegistryCredential(ctx context.Context, registry, repoHint string, critical bool) error { // ECR uses AWS SigV4, not the OCI Bearer flow, so this probe cannot speak // to it. Skip rather than fail: returning an error here makes an @@ -138,10 +145,11 @@ func probeRegistryCredential(ctx context.Context, registry, repoHint string, cri // not masquerade as credentials for quay.io, GHCR, or Harbor — those // registries reject NGC tokens, which would wrongly produce "credentials // rejected" when the real diagnosis is "no credentials configured." - _, _, hasCreds := credentialsForRegistry(registry) - if !hasCreds { - return fmt.Errorf("no credentials configured for %s "+ - "(add to ~/.docker/config.json or set NGC_API_KEY for NGC registries)", registry) + if _, _, hasCreds := credentialsForRegistry(registry); !hasCreds { + // Same situation as the critical path below, so the same verdict: + // no readable local credential is not proof that none exists, since + // a credential helper is invisible here. + return errRegistryCredentialsUnverified{registry: registry} } return fmt.Errorf("credentials rejected by %s: %w", registry, err) } @@ -251,10 +259,12 @@ func EnumerateRegistries(imageRef, stackValuesFile string, extras []string) []Re // Source 2: read global.image.registry from the environment values file. // This catches cases where the operator points at a custom NGC org or a // staging environment that differs from the validator image's registry. + stackRegistry := "" if stackValuesFile != "" { - if reg := readGlobalImageRegistry(stackValuesFile); reg != "" { + stackRegistry = readGlobalImageRegistry(stackValuesFile) + if stackRegistry != "" { // If it's an NGC registry, mark critical; customer mirrors are non-critical. - add(reg, "", isNGCRegistry(reg)) + add(stackRegistry, "", isNGCRegistry(stackRegistry)) } } @@ -263,7 +273,7 @@ func EnumerateRegistries(imageRef, stackValuesFile string, extras []string) []Re // image to global.image.registry, so on a configured stack quay.io is never // contacted and probing it is a pointless round trip. It is only reachable // when no stack values file resolved. - if stackValuesFile == "" || readGlobalImageRegistry(stackValuesFile) == "" { + if stackRegistry == "" { add(certManagerRegistry, "", false) } diff --git a/src/clis/nvcf-cli/internal/selfhosted/registry_cred_test.go b/src/clis/nvcf-cli/internal/selfhosted/registry_cred_test.go index 411bafb83c..bdafc6d6a3 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/registry_cred_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/registry_cred_test.go @@ -151,8 +151,9 @@ func TestEnumerateRegistries_RepoHintFromImageRef(t *testing.T) { t.Fatal("nvcr.io not found in entries") } -func TestEnumerateRegistries_AlwaysIncludesCertManager(t *testing.T) { - // cert-manager always uses quay.io — it must appear even when not in extras. +func TestEnumerateRegistries_IncludesCertManagerWhenStackIsNotMirroring(t *testing.T) { + // With no stack values file there is no global.image.registry to mirror + // cert-manager to, so its upstream registry is genuinely contacted. entries := EnumerateRegistries("nvcr.io/some/image:1.0", "", nil) found := false for _, e := range entries { @@ -286,3 +287,51 @@ func errorf(msg string) error { return fmt.Errorf("%s", msg) } func writeFile(path string, data []byte) error { return os.WriteFile(path, data, 0o644) } + +// The stack rewrites every cert-manager image to global.image.registry, so on +// a configured stack quay.io is never contacted at pull time and probing it is +// a pointless 10-second round trip on every invocation. +func TestEnumerateRegistries_SkipsCertManagerWhenStackMirrors(t *testing.T) { + dir := t.TempDir() + valuesPath := dir + "/base.yaml" + require.NoError(t, writeFile(valuesPath, []byte(` +global: + image: + registry: mirror.company.internal +`))) + + entries := EnumerateRegistries("nvcr.io/some/image:1.0", valuesPath, nil) + for _, e := range entries { + assert.NotEqual(t, certManagerRegistry, e.Registry, + "a stack mirroring images must not trigger a quay.io probe") + } +} + +// A bare IPv6 literal must stay bracketed or the probe URL is malformed. +func TestEnumerateRegistries_BracketsIPv6Extras(t *testing.T) { + entries := EnumerateRegistries("nvcr.io/some/image:1.0", "", []string{"[::1]:5000"}) + + found := false + for _, e := range entries { + if strings.Contains(e.Registry, "::1") { + found = true + assert.Equal(t, "[::1]:5000", e.Registry, + "an IPv6 literal must keep its brackets so the probe URL parses") + } + } + assert.True(t, found, "the IPv6 extra must be enumerated") +} + +// The validator image's registry follows the same Critical policy as every +// other source. Forcing it true makes an air-gapped install fail preflight for +// a registry that is never contacted (ImagePullPolicy is IfNotPresent). +func TestEnumerateRegistries_NonNGCImageRegistryIsNotCritical(t *testing.T) { + entries := EnumerateRegistries("mirror.company.internal/nvcf/cluster-validator:1.0", "", nil) + for _, e := range entries { + if e.Registry == "mirror.company.internal" { + assert.False(t, e.Critical, "a non-NGC mirror must not be forced critical") + return + } + } + t.Fatal("mirror.company.internal not enumerated") +} diff --git a/src/clis/nvcf-cli/internal/selfhosted/stack_namespaces.go b/src/clis/nvcf-cli/internal/selfhosted/stack_namespaces.go index d6f6f68859..054a7aa7da 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/stack_namespaces.go +++ b/src/clis/nvcf-cli/internal/selfhosted/stack_namespaces.go @@ -25,11 +25,19 @@ import ( "strings" ) -// helmfileNamespaceRE matches a literal `namespace: ` declaration in a -// helmfile release entry. Values containing a Go template action are excluded -// by the character class: those are operator-configurable (the gateway -// controller namespace is one), so their rendered value is not knowable here. -var helmfileNamespaceRE = regexp.MustCompile(`(?m)^\s*namespace:\s*([A-Za-z0-9][A-Za-z0-9.-]*)\s*$`) +// helmfileNamespaceRE matches a literal `namespace: ` declaration on a +// helmfile release entry. +// +// Two deliberate restrictions, because a false positive here becomes a +// "delete this namespace" remediation: +// +// - Indentation is capped at 4 spaces, the release-entry level. Keys nested +// inside a release's `values:` block sit at 6 or more and must not be read +// as release namespaces. +// - The value must be a bare DNS label. A value containing a Go template +// action is operator-configurable (the gateway controller namespace is +// one), so its rendered value is not knowable from the source. +var helmfileNamespaceRE = regexp.MustCompile(`(?m)^ {0,4}namespace:\s*([a-z0-9][a-z0-9.-]*)\s*$`) // stackReleaseNamespaces returns the namespaces that helmfile releases deploy // into for the stack rooted at stackDir, or nil when the stack is not readable. diff --git a/src/clis/nvcf-cli/internal/selfhosted/stack_namespaces_test.go b/src/clis/nvcf-cli/internal/selfhosted/stack_namespaces_test.go index 0bd4ba19d8..febf3ff2c3 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/stack_namespaces_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/stack_namespaces_test.go @@ -95,3 +95,25 @@ func TestResolveStackNamespaces_PrefersStack(t *testing.T) { assert.Equal(t, []string{"from-stack"}, resolveStackNamespaces(dir, []string{"static"}), "a readable stack must win over the static list") } + +// A `namespace:` key nested inside a release's values block is chart +// configuration, not a namespace the stack owns. Reading it as one would add a +// probe target whose remediation is deletion. +func TestStackReleaseNamespaces_SkipsNestedValuesKeys(t *testing.T) { + dir := writeStack(t, map[string]string{ + "02-core.yaml.gotmpl": ` +releases: + - name: api + namespace: nvcf + values: + - serviceMonitor: + namespace: monitoring + - someChart: + namespace: kube-system +`, + }) + + got := stackReleaseNamespaces(dir) + assert.Equal(t, []string{"nvcf"}, got, + "only release-level namespaces may be probed; nested values keys must be ignored") +} diff --git a/src/clis/nvcf-cli/internal/selfhosted/stale_namespace.go b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace.go index 75e4e9d80a..7dde653238 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/stale_namespace.go +++ b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace.go @@ -95,10 +95,18 @@ func NewStaleNamespaceProber() StaleNamespaceProber { // // Helm 3 marks each release secret with the label owner=helm; absence of any // such secret means no live Helm release occupies the namespace. -// helmReleaseListPageSize bounds each page of the owner=helm scan. A namespace -// holds at most a handful of release objects, so this is only a ceiling on how -// much is pulled per round trip while paging past non-matching objects. -const helmReleaseListPageSize = 100 +const ( + // helmReleaseListPageSize bounds each page of the owner=helm scan. A + // namespace holds at most a handful of release objects, so this is only a + // ceiling on how much is pulled per round trip while paging past + // non-matching objects. + helmReleaseListPageSize = 100 + + // helmReleaseListMaxPages stops the scan even if the server keeps handing + // back a Continue token. At the page size above this covers 100k objects in + // one namespace, far past anything real, and guarantees termination. + helmReleaseListMaxPages = 1000 +) // helmReleaseExists reports whether any owner=helm object exists, paging until // it finds one or the server reports no more results. @@ -109,11 +117,10 @@ const helmReleaseListPageSize = 100 // ServiceAccount tokens and TLS secrets that sort before sh.helm.release.v1.*, // so the first page is routinely empty on a perfectly healthy install. func helmReleaseExists( - ctx context.Context, namespace string, list func(metav1.ListOptions) (count int, cont string, err error), ) (bool, error) { opts := metav1.ListOptions{LabelSelector: "owner=helm", Limit: helmReleaseListPageSize} - for { + for page := 0; page < helmReleaseListMaxPages; page++ { count, cont, err := list(opts) if err != nil { return false, err @@ -126,6 +133,7 @@ func helmReleaseExists( } opts.Continue = cont } + return false, fmt.Errorf("gave up after %d pages scanning for Helm releases", helmReleaseListMaxPages) } func probeStaleNamespaces(ctx context.Context, client kubernetes.Interface, namespaces []string) ([]StaleNamespace, error) { @@ -147,7 +155,7 @@ func probeStaleNamespaces(ctx context.Context, client kubernetes.Interface, name // Check Secrets first (the default Helm storage driver), then ConfigMaps // for HELM_DRIVER=configmap clusters. Both label release objects // owner=helm. - found, err := helmReleaseExists(ctx, name, + found, err := helmReleaseExists( func(opts metav1.ListOptions) (int, string, error) { l, lerr := client.CoreV1().Secrets(name).List(ctx, opts) if lerr != nil { @@ -161,7 +169,7 @@ func probeStaleNamespaces(ctx context.Context, client kubernetes.Interface, name if found { continue // healthy: active Helm release found via the secret driver } - found, err = helmReleaseExists(ctx, name, + found, err = helmReleaseExists( func(opts metav1.ListOptions) (int, string, error) { l, lerr := client.CoreV1().ConfigMaps(name).List(ctx, opts) if lerr != nil { From 9d6fd315e7436b9066a6b4821d101ff1357c9bc3 Mon Sep 17 00:00:00 2001 From: rohithb Date: Tue, 15 Sep 2026 14:07:56 +0530 Subject: [PATCH 18/36] fix(nvcf-cli): scope validator RBAC per role and quote operator-supplied registry hosts --- src/clis/nvcf-cli/cmd/self_hosted.go | 4 +- src/clis/nvcf-cli/cmd/self_hosted_check.go | 6 +- src/clis/nvcf-cli/cmd/task.go | 51 ++++++++--------- src/clis/nvcf-cli/cmd/task_test.go | 18 +++--- .../nvcf-cli/internal/selfhosted/BUILD.bazel | 2 + .../internal/selfhosted/clustervalidator.go | 56 +++++++++++++------ .../selfhosted/clustervalidator_test.go | 35 +++++++++++- 7 files changed, 113 insertions(+), 59 deletions(-) diff --git a/src/clis/nvcf-cli/cmd/self_hosted.go b/src/clis/nvcf-cli/cmd/self_hosted.go index 19c82c884f..f6fcdc1b38 100644 --- a/src/clis/nvcf-cli/cmd/self_hosted.go +++ b/src/clis/nvcf-cli/cmd/self_hosted.go @@ -41,8 +41,8 @@ and 'install --compute-plane' explicitly.`, // Persistent flags shared by all self-hosted subcommands. var ( - selfHostedControlPlaneStack string - selfHostedComputePlaneStack string + selfHostedControlPlaneStack string + selfHostedComputePlaneStack string selfHostedEnv string selfHostedNoApply bool selfHostedNonInter bool diff --git a/src/clis/nvcf-cli/cmd/self_hosted_check.go b/src/clis/nvcf-cli/cmd/self_hosted_check.go index b7eda1a315..ce9e436ca7 100644 --- a/src/clis/nvcf-cli/cmd/self_hosted_check.go +++ b/src/clis/nvcf-cli/cmd/self_hosted_check.go @@ -495,8 +495,12 @@ func runPreflightByRole(ctx context.Context, cfg selfhosted.PreflightConfig, sin // The cluster-validator image is the same for both roles; VALIDATOR_ROLE // in the Job env selects which check set runs inside the binary. + // Gate on the image, not on the compute-plane validator being constructed: + // in ModeSplit with --control-plane the compute role is not targeted, so + // clusterValidator is nil and keying off it would drop the control-plane + // validator check from the run entirely. var cpClusterValidator selfhosted.ClusterValidator - if controlPlaneIsTargeted(mode) && clusterValidator != nil { + if controlPlaneIsTargeted(mode) && clusterValidatorImage != "" { cpClusterValidator = newClusterValidatorForSelfHosted() } diff --git a/src/clis/nvcf-cli/cmd/task.go b/src/clis/nvcf-cli/cmd/task.go index dc88bb3d90..183b179c60 100644 --- a/src/clis/nvcf-cli/cmd/task.go +++ b/src/clis/nvcf-cli/cmd/task.go @@ -188,7 +188,6 @@ like { "secrets": [{"name": "...", "value": "..."}] }.`, RunE: runTaskUpdateSecrets, } - // ============================================================================ // Configuration structs // ============================================================================ @@ -197,23 +196,23 @@ like { "secrets": [{"name": "...", "value": "..."}] }.`, // near 1:1 mapping of CreateTaskRequest with secret values typed loosely so // users can drop in either strings or objects. type TaskCreateConfig struct { - Name string `json:"name"` - GpuSpecification *TaskGpuSpecificationInput `json:"gpuSpecification,omitempty"` - ContainerImage string `json:"containerImage,omitempty"` - ContainerArgs string `json:"containerArgs,omitempty"` - ContainerEnvironment []ContainerEnvironmentEntry `json:"containerEnvironment,omitempty"` - Models []ArtifactConfig `json:"models,omitempty"` - Resources []ArtifactConfig `json:"resources,omitempty"` - Tags []string `json:"tags,omitempty"` - Description string `json:"description,omitempty"` - MaxRuntimeDuration string `json:"maxRuntimeDuration,omitempty"` - MaxQueuedDuration string `json:"maxQueuedDuration,omitempty"` - TerminationGracePeriodDuration string `json:"terminationGracePeriodDuration,omitempty"` - ResultHandlingStrategy string `json:"resultHandlingStrategy,omitempty"` - ResultsLocation string `json:"resultsLocation,omitempty"` - HelmChart string `json:"helmChart,omitempty"` - Telemetries *TaskTelemetriesInput `json:"telemetries,omitempty"` - Secrets interface{} `json:"secrets,omitempty"` // []string or []SecretConfig + Name string `json:"name"` + GpuSpecification *TaskGpuSpecificationInput `json:"gpuSpecification,omitempty"` + ContainerImage string `json:"containerImage,omitempty"` + ContainerArgs string `json:"containerArgs,omitempty"` + ContainerEnvironment []ContainerEnvironmentEntry `json:"containerEnvironment,omitempty"` + Models []ArtifactConfig `json:"models,omitempty"` + Resources []ArtifactConfig `json:"resources,omitempty"` + Tags []string `json:"tags,omitempty"` + Description string `json:"description,omitempty"` + MaxRuntimeDuration string `json:"maxRuntimeDuration,omitempty"` + MaxQueuedDuration string `json:"maxQueuedDuration,omitempty"` + TerminationGracePeriodDuration string `json:"terminationGracePeriodDuration,omitempty"` + ResultHandlingStrategy string `json:"resultHandlingStrategy,omitempty"` + ResultsLocation string `json:"resultsLocation,omitempty"` + HelmChart string `json:"helmChart,omitempty"` + Telemetries *TaskTelemetriesInput `json:"telemetries,omitempty"` + Secrets interface{} `json:"secrets,omitempty"` // []string or []SecretConfig } // TaskGpuSpecificationInput maps to GpuSpecificationDto. @@ -228,8 +227,8 @@ type TaskGpuSpecificationInput struct { // TaskHelmValidationInput maps to HelmValidationPolicyDto. type TaskHelmValidationInput struct { - Name string `json:"name"` - ExtraKubernetesTypes []TaskKubernetesTypeIn `json:"extraKubernetesTypes,omitempty"` + Name string `json:"name"` + ExtraKubernetesTypes []TaskKubernetesTypeIn `json:"extraKubernetesTypes,omitempty"` } // TaskKubernetesTypeIn maps to KubernetesType. @@ -263,11 +262,11 @@ type TaskBulkConfig struct { var taskCreateFlags struct { inputFile string - name string - gpu string - instanceType string - backend string - clusters []string + name string + gpu string + instanceType string + backend string + clusters []string containerImage string containerArgs string @@ -324,7 +323,6 @@ var taskUpdateSecretsFlags struct { secrets []string } - // ============================================================================ // Init // ============================================================================ @@ -1143,4 +1141,3 @@ func runTaskUpdateSecrets(cmd *cobra.Command, args []string) error { logging.Success("Updated %d secret(s) for task %s.", len(secrets), taskID) return nil } - diff --git a/src/clis/nvcf-cli/cmd/task_test.go b/src/clis/nvcf-cli/cmd/task_test.go index 5301ca1853..db71e482b5 100644 --- a/src/clis/nvcf-cli/cmd/task_test.go +++ b/src/clis/nvcf-cli/cmd/task_test.go @@ -33,15 +33,15 @@ func TestTaskCommandStructure(t *testing.T) { t.Run("registers all expected subcommands", func(t *testing.T) { expected := map[string]bool{ - "create": false, - "list": false, - "bulk": false, - "get [taskId]": false, - "delete [taskId]": false, - "cancel [taskId]": false, - "events [taskId]": false, - "results [taskId]": false, - "update-secrets [taskId]": false, + "create": false, + "list": false, + "bulk": false, + "get [taskId]": false, + "delete [taskId]": false, + "cancel [taskId]": false, + "events [taskId]": false, + "results [taskId]": false, + "update-secrets [taskId]": false, } for _, sub := range taskCmd.Commands() { if _, ok := expected[sub.Use]; ok { diff --git a/src/clis/nvcf-cli/internal/selfhosted/BUILD.bazel b/src/clis/nvcf-cli/internal/selfhosted/BUILD.bazel index 1a508d967d..8adbcd82e0 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/BUILD.bazel +++ b/src/clis/nvcf-cli/internal/selfhosted/BUILD.bazel @@ -29,6 +29,7 @@ go_library( "registry_cred.go", "render.go", "stack.go", + "stack_namespaces.go", "stale_namespace.go", "validatortag.go", ], @@ -65,6 +66,7 @@ go_test( "register_test.go", "registry_cred_test.go", "render_test.go", + "stack_namespaces_test.go", "stack_test.go", "stale_namespace_test.go", "validatortag_test.go", diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go index b076239470..940ec8081a 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go @@ -135,7 +135,7 @@ func runClusterValidator(ctx context.Context, client kubernetes.Interface, image // labeled by us and are skipped. defer sweepManagedPullSecrets(context.Background(), client) - if err := ensureClusterValidatorRBAC(vctx, client); err != nil { + if err := ensureClusterValidatorRBAC(vctx, client, role); err != nil { return ClusterValidatorResult{Err: fmt.Errorf("bootstrapping validator RBAC: %w", err)} } // Remove the ClusterRole and ClusterRoleBinding to minimize the window in @@ -148,7 +148,7 @@ func runClusterValidator(ctx context.Context, client kubernetes.Interface, image podMayBeRunning := false defer func() { if !noCleanup && !podMayBeRunning { - sweepClusterValidatorRBAC(context.Background(), client) + sweepClusterValidatorRBAC(context.Background(), client, role) } }() @@ -216,12 +216,13 @@ func runClusterValidator(ctx context.Context, client kubernetes.Interface, image // Creates the SA/ClusterRole/ClusterRoleBinding the validator pod runs under, // idempotent via AlreadyExists tolerance. ClusterRole uses update-or-create so // newer CLI versions replace stale rules without the operator needing to delete. -func ensureClusterValidatorRBAC(ctx context.Context, client kubernetes.Interface) error { - labels := clusterValidatorLabels() +func ensureClusterValidatorRBAC(ctx context.Context, client kubernetes.Interface, role string) error { + labels := clusterValidatorRoleLabels(role) + name := clusterValidatorRBACName(role) sa := &corev1.ServiceAccount{ ObjectMeta: metav1.ObjectMeta{ - Name: clusterValidatorName, + Name: name, Namespace: clusterValidatorNamespace, Labels: labels, }, @@ -231,7 +232,7 @@ func ensureClusterValidatorRBAC(ctx context.Context, client kubernetes.Interface } cr := &rbacv1.ClusterRole{ - ObjectMeta: metav1.ObjectMeta{Name: clusterValidatorName, Labels: labels}, + ObjectMeta: metav1.ObjectMeta{Name: name, Labels: labels}, Rules: []rbacv1.PolicyRule{ // Read-only: cluster inventory and configuration. {APIGroups: []string{""}, Resources: []string{"nodes", "configmaps"}, Verbs: []string{"get", "list", "watch"}}, @@ -256,7 +257,7 @@ func ensureClusterValidatorRBAC(ctx context.Context, client kubernetes.Interface } // Update-or-Create so a future CLI version's expanded rules replace the // old set; AlreadyExists tolerance alone would silently keep stale rules. - if existing, err := client.RbacV1().ClusterRoles().Get(ctx, clusterValidatorName, metav1.GetOptions{}); err == nil { + if existing, err := client.RbacV1().ClusterRoles().Get(ctx, name, metav1.GetOptions{}); err == nil { existing.Rules = cr.Rules existing.Labels = cr.Labels if _, err := client.RbacV1().ClusterRoles().Update(ctx, existing, metav1.UpdateOptions{}); err != nil { @@ -271,16 +272,16 @@ func ensureClusterValidatorRBAC(ctx context.Context, client kubernetes.Interface } crb := &rbacv1.ClusterRoleBinding{ - ObjectMeta: metav1.ObjectMeta{Name: clusterValidatorName, Labels: labels}, + ObjectMeta: metav1.ObjectMeta{Name: name, Labels: labels}, Subjects: []rbacv1.Subject{{ Kind: rbacv1.ServiceAccountKind, - Name: clusterValidatorName, + Name: name, Namespace: clusterValidatorNamespace, }}, RoleRef: rbacv1.RoleRef{ APIGroup: rbacv1.GroupName, Kind: "ClusterRole", - Name: clusterValidatorName, + Name: name, }, } if _, err := client.RbacV1().ClusterRoleBindings().Create(ctx, crb, metav1.CreateOptions{}); err != nil && !apierrors.IsAlreadyExists(err) { @@ -323,10 +324,11 @@ func validatorConfigNameForRole(role string) string { // --no-cleanup is not set) to close the window where the elevated ClusterRole // exists. The next run recreates them via ensureClusterValidatorRBAC. // Errors are swallowed: stale RBAC is preferable to failing the result. -func sweepClusterValidatorRBAC(ctx context.Context, client kubernetes.Interface) { - _ = client.RbacV1().ClusterRoleBindings().Delete(ctx, clusterValidatorName, metav1.DeleteOptions{}) - _ = client.RbacV1().ClusterRoles().Delete(ctx, clusterValidatorName, metav1.DeleteOptions{}) - _ = client.CoreV1().ServiceAccounts(clusterValidatorNamespace).Delete(ctx, clusterValidatorName, metav1.DeleteOptions{}) +func sweepClusterValidatorRBAC(ctx context.Context, client kubernetes.Interface, role string) { + name := clusterValidatorRBACName(role) + _ = client.RbacV1().ClusterRoleBindings().Delete(ctx, name, metav1.DeleteOptions{}) + _ = client.RbacV1().ClusterRoles().Delete(ctx, name, metav1.DeleteOptions{}) + _ = client.CoreV1().ServiceAccounts(clusterValidatorNamespace).Delete(ctx, name, metav1.DeleteOptions{}) } // Errors are swallowed: a stale Job is preferable to blocking the new run. @@ -378,6 +380,20 @@ const clusterValidatorNoConfigName = "cluster-validator-no-config" // clusterValidatorRoleLabel scopes Job selectors to a single validator role. const clusterValidatorRoleLabel = "nvcf.nvidia.com/validator-role" +// clusterValidatorRBACName returns the ServiceAccount / ClusterRole / +// ClusterRoleBinding name for a role. +// +// Per-role names matter because ModeSplit runs both validators concurrently, +// and the two kubecontexts can resolve to the same cluster. With one shared +// name the first run to finish deletes the RBAC out from under the other run's +// pod, which then fails every API call with "forbidden". +func clusterValidatorRBACName(role string) string { + if role == "" { + return clusterValidatorName + } + return clusterValidatorName + "-" + role +} + // controlPlaneValidatorConfigTemplate is the baseline network-check ConfigMap for // control-plane preflight: nvcr.io reachability (critical) and NetworkPolicy // enforcement (non-critical). Extra registries are appended as non-critical probes. @@ -443,8 +459,14 @@ func buildControlPlaneValidatorConfig(extraRegistries []string) string { if host == "" { continue } - // Append under the existing reachability.endpoints list. - fmt.Fprintf(&extra, " - name: %s\n host: %s\n port: %d\n protocol: tcp+tls\n critical: false\n", host, host, port) + // Append under the existing reachability.endpoints list. Quote the host: + // it comes from operator input, and parseRegistryHostPort passes a value + // it cannot split through verbatim. An unquoted "[" or embedded newline + // would make the whole ConfigMap unparseable, and the validator then + // silently drops every reachability and enforcement check. + fmt.Fprintf(&extra, + " - name: %q\n host: %q\n port: %d\n protocol: tcp+tls\n critical: false\n", + host, host, port) } if extra.Len() == 0 { return controlPlaneValidatorConfigTemplate @@ -486,7 +508,7 @@ func parseRegistryHostPort(s string) (host string, port int) { func buildClusterValidatorJob(name, image, pullSecret, role string, noCleanup bool) *batchv1.Job { backoff := int32(0) podSpec := corev1.PodSpec{ - ServiceAccountName: clusterValidatorName, + ServiceAccountName: clusterValidatorRBACName(role), RestartPolicy: corev1.RestartPolicyNever, Containers: []corev1.Container{{ Name: clusterValidatorContainer, diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go index 3db50167a6..be4dfa6003 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go @@ -276,14 +276,15 @@ func TestRunClusterValidator_RBACRefreshesClusterRoleRules(t *testing.T) { // TestEnsureClusterValidatorRBAC_WritableResources verifies that the // bootstrapped ClusterRole grants the write verbs required by enforcement // checks (namespace/pod create+delete), probe log reading (pods/log get), -// and the Gateway API checks added in Req 3/4. +// and the Gateway API checks. func TestEnsureClusterValidatorRBAC_WritableResources(t *testing.T) { client := fake.NewSimpleClientset() ctx := context.Background() - require.NoError(t, ensureClusterValidatorRBAC(ctx, client)) + const role = clusterValidatorControlPlaneRole + require.NoError(t, ensureClusterValidatorRBAC(ctx, client, role)) - cr, err := client.RbacV1().ClusterRoles().Get(ctx, clusterValidatorName, metav1.GetOptions{}) + cr, err := client.RbacV1().ClusterRoles().Get(ctx, clusterValidatorRBACName(role), metav1.GetOptions{}) require.NoError(t, err) type check struct { @@ -677,3 +678,31 @@ func alreadyExistsReactor(resource, name string) ktesting.ReactionFunc { return true, nil, apierrors.NewAlreadyExists(gr, name) } } + +// ModeSplit runs both validators concurrently, and the two kubecontexts can +// resolve to the same cluster. With one shared RBAC name the first run to +// finish deletes the ServiceAccount, ClusterRole and binding out from under the +// other run's pod, which then fails every API call with "forbidden". +func TestClusterValidatorRBAC_IsScopedPerRole(t *testing.T) { + client := fake.NewSimpleClientset() + ctx := context.Background() + + cpName := clusterValidatorRBACName(clusterValidatorControlPlaneRole) + gpuName := clusterValidatorRBACName("compute-plane") + require.NotEqual(t, cpName, gpuName, "each role needs its own RBAC identity") + + require.NoError(t, ensureClusterValidatorRBAC(ctx, client, clusterValidatorControlPlaneRole)) + require.NoError(t, ensureClusterValidatorRBAC(ctx, client, "compute-plane")) + + // Sweeping one role must leave the other's RBAC intact. + sweepClusterValidatorRBAC(ctx, client, clusterValidatorControlPlaneRole) + + _, err := client.RbacV1().ClusterRoles().Get(ctx, cpName, metav1.GetOptions{}) + assert.True(t, apierrors.IsNotFound(err), "the swept role's ClusterRole must be gone") + + _, err = client.RbacV1().ClusterRoles().Get(ctx, gpuName, metav1.GetOptions{}) + assert.NoError(t, err, "the other role's ClusterRole must survive") + + _, err = client.CoreV1().ServiceAccounts(clusterValidatorNamespace).Get(ctx, gpuName, metav1.GetOptions{}) + assert.NoError(t, err, "the other role's ServiceAccount must survive") +} From 1bff24a1ce1e323bf4c55ab55756d2986f776cd9 Mon Sep 17 00:00:00 2001 From: rohithb Date: Tue, 15 Sep 2026 14:10:15 +0530 Subject: [PATCH 19/36] style(nvcf-cli): revert unrelated gofmt churn in task and self_hosted commands --- src/clis/nvcf-cli/cmd/self_hosted.go | 4 +-- src/clis/nvcf-cli/cmd/task.go | 51 +++++++++++++++------------- src/clis/nvcf-cli/cmd/task_test.go | 18 +++++----- 3 files changed, 38 insertions(+), 35 deletions(-) diff --git a/src/clis/nvcf-cli/cmd/self_hosted.go b/src/clis/nvcf-cli/cmd/self_hosted.go index f6fcdc1b38..19c82c884f 100644 --- a/src/clis/nvcf-cli/cmd/self_hosted.go +++ b/src/clis/nvcf-cli/cmd/self_hosted.go @@ -41,8 +41,8 @@ and 'install --compute-plane' explicitly.`, // Persistent flags shared by all self-hosted subcommands. var ( - selfHostedControlPlaneStack string - selfHostedComputePlaneStack string + selfHostedControlPlaneStack string + selfHostedComputePlaneStack string selfHostedEnv string selfHostedNoApply bool selfHostedNonInter bool diff --git a/src/clis/nvcf-cli/cmd/task.go b/src/clis/nvcf-cli/cmd/task.go index 183b179c60..dc88bb3d90 100644 --- a/src/clis/nvcf-cli/cmd/task.go +++ b/src/clis/nvcf-cli/cmd/task.go @@ -188,6 +188,7 @@ like { "secrets": [{"name": "...", "value": "..."}] }.`, RunE: runTaskUpdateSecrets, } + // ============================================================================ // Configuration structs // ============================================================================ @@ -196,23 +197,23 @@ like { "secrets": [{"name": "...", "value": "..."}] }.`, // near 1:1 mapping of CreateTaskRequest with secret values typed loosely so // users can drop in either strings or objects. type TaskCreateConfig struct { - Name string `json:"name"` - GpuSpecification *TaskGpuSpecificationInput `json:"gpuSpecification,omitempty"` - ContainerImage string `json:"containerImage,omitempty"` - ContainerArgs string `json:"containerArgs,omitempty"` - ContainerEnvironment []ContainerEnvironmentEntry `json:"containerEnvironment,omitempty"` - Models []ArtifactConfig `json:"models,omitempty"` - Resources []ArtifactConfig `json:"resources,omitempty"` - Tags []string `json:"tags,omitempty"` - Description string `json:"description,omitempty"` - MaxRuntimeDuration string `json:"maxRuntimeDuration,omitempty"` - MaxQueuedDuration string `json:"maxQueuedDuration,omitempty"` - TerminationGracePeriodDuration string `json:"terminationGracePeriodDuration,omitempty"` - ResultHandlingStrategy string `json:"resultHandlingStrategy,omitempty"` - ResultsLocation string `json:"resultsLocation,omitempty"` - HelmChart string `json:"helmChart,omitempty"` - Telemetries *TaskTelemetriesInput `json:"telemetries,omitempty"` - Secrets interface{} `json:"secrets,omitempty"` // []string or []SecretConfig + Name string `json:"name"` + GpuSpecification *TaskGpuSpecificationInput `json:"gpuSpecification,omitempty"` + ContainerImage string `json:"containerImage,omitempty"` + ContainerArgs string `json:"containerArgs,omitempty"` + ContainerEnvironment []ContainerEnvironmentEntry `json:"containerEnvironment,omitempty"` + Models []ArtifactConfig `json:"models,omitempty"` + Resources []ArtifactConfig `json:"resources,omitempty"` + Tags []string `json:"tags,omitempty"` + Description string `json:"description,omitempty"` + MaxRuntimeDuration string `json:"maxRuntimeDuration,omitempty"` + MaxQueuedDuration string `json:"maxQueuedDuration,omitempty"` + TerminationGracePeriodDuration string `json:"terminationGracePeriodDuration,omitempty"` + ResultHandlingStrategy string `json:"resultHandlingStrategy,omitempty"` + ResultsLocation string `json:"resultsLocation,omitempty"` + HelmChart string `json:"helmChart,omitempty"` + Telemetries *TaskTelemetriesInput `json:"telemetries,omitempty"` + Secrets interface{} `json:"secrets,omitempty"` // []string or []SecretConfig } // TaskGpuSpecificationInput maps to GpuSpecificationDto. @@ -227,8 +228,8 @@ type TaskGpuSpecificationInput struct { // TaskHelmValidationInput maps to HelmValidationPolicyDto. type TaskHelmValidationInput struct { - Name string `json:"name"` - ExtraKubernetesTypes []TaskKubernetesTypeIn `json:"extraKubernetesTypes,omitempty"` + Name string `json:"name"` + ExtraKubernetesTypes []TaskKubernetesTypeIn `json:"extraKubernetesTypes,omitempty"` } // TaskKubernetesTypeIn maps to KubernetesType. @@ -262,11 +263,11 @@ type TaskBulkConfig struct { var taskCreateFlags struct { inputFile string - name string - gpu string - instanceType string - backend string - clusters []string + name string + gpu string + instanceType string + backend string + clusters []string containerImage string containerArgs string @@ -323,6 +324,7 @@ var taskUpdateSecretsFlags struct { secrets []string } + // ============================================================================ // Init // ============================================================================ @@ -1141,3 +1143,4 @@ func runTaskUpdateSecrets(cmd *cobra.Command, args []string) error { logging.Success("Updated %d secret(s) for task %s.", len(secrets), taskID) return nil } + diff --git a/src/clis/nvcf-cli/cmd/task_test.go b/src/clis/nvcf-cli/cmd/task_test.go index db71e482b5..5301ca1853 100644 --- a/src/clis/nvcf-cli/cmd/task_test.go +++ b/src/clis/nvcf-cli/cmd/task_test.go @@ -33,15 +33,15 @@ func TestTaskCommandStructure(t *testing.T) { t.Run("registers all expected subcommands", func(t *testing.T) { expected := map[string]bool{ - "create": false, - "list": false, - "bulk": false, - "get [taskId]": false, - "delete [taskId]": false, - "cancel [taskId]": false, - "events [taskId]": false, - "results [taskId]": false, - "update-secrets [taskId]": false, + "create": false, + "list": false, + "bulk": false, + "get [taskId]": false, + "delete [taskId]": false, + "cancel [taskId]": false, + "events [taskId]": false, + "results [taskId]": false, + "update-secrets [taskId]": false, } for _, sub := range taskCmd.Commands() { if _, ok := expected[sub.Use]; ok { From 0d3550266927a8f9405a6308afaaaeec50a4886e Mon Sep 17 00:00:00 2001 From: rohithb Date: Tue, 15 Sep 2026 16:05:01 +0530 Subject: [PATCH 20/36] fix(nvcf-cli): scope the managed pull secret per validator role --- .../internal/selfhosted/clustervalidator.go | 33 ++-- .../internal/selfhosted/pullsecret.go | 53 +++++-- .../internal/selfhosted/pullsecret_test.go | 147 ++++++++++++++---- 3 files changed, 181 insertions(+), 52 deletions(-) diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go index 940ec8081a..3db254119f 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go @@ -124,16 +124,27 @@ func runClusterValidator(ctx context.Context, client kubernetes.Interface, image vctx, cancel := context.WithTimeout(ctx, clusterValidatorTimeout) defer cancel() + // podMayBeRunning is true only between a successful Job create and a clean + // wait. Both cleanup defers below key off it: outside that window nothing + // is using the pull secret or the RBAC, so reclaiming them is safe, and + // inside it reclaiming them breaks the pod that is still running. + podMayBeRunning := false + // Resolver errors are non-fatal: fall through to the caller's value and // let waitForClusterValidatorJob surface ImagePullBackOff if needed. - if resolved, err := resolveValidatorPullSecret(ctx, client, pullSecret, image); err == nil { + if resolved, err := resolveValidatorPullSecret(ctx, client, pullSecret, image, role); err == nil { pullSecret = resolved } - // Sweep any pull secrets we created (mirror or env-mint) after the - // Job terminates. Uses a fresh context so cleanup runs even when - // vctx has expired. Operator-supplied secrets via the flag aren't - // labeled by us and are skipped. - defer sweepManagedPullSecrets(context.Background(), client) + // Sweep only this role's managed pull secret, and only once the pod can no + // longer need it. Sweeping unconditionally deletes the Secret out from + // under a pod that is still retrying its pull, which the kubelet then + // reports as FailedToRetrieveImagePullSecret. Operator-supplied secrets via + // the flag aren't labeled by us and are skipped. + defer func() { + if !podMayBeRunning { + sweepManagedPullSecrets(context.Background(), client, role) + } + }() if err := ensureClusterValidatorRBAC(vctx, client, role); err != nil { return ClusterValidatorResult{Err: fmt.Errorf("bootstrapping validator RBAC: %w", err)} @@ -141,11 +152,6 @@ func runClusterValidator(ctx context.Context, client kubernetes.Interface, image // Remove the ClusterRole and ClusterRoleBinding to minimize the window in // which the elevated SA exists. When --no-cleanup is set the operator // expects to inspect the Job, so the RBAC stays either way. - // - // podMayBeRunning is true only between a successful Job create and a clean - // wait. Everywhere else nothing is using the RBAC, so reclaim it rather - // than leaking a cluster-wide ClusterRole. - podMayBeRunning := false defer func() { if !noCleanup && !podMayBeRunning { sweepClusterValidatorRBAC(context.Background(), client, role) @@ -353,8 +359,9 @@ func sweepPriorClusterValidatorJobs(ctx context.Context, client kubernetes.Inter // Operator-supplied secrets via --cluster-validator-pull-secret aren't // labeled by us and are skipped by the selector. Errors are swallowed: // failing to clean up is preferable to failing the check itself. -func sweepManagedPullSecrets(ctx context.Context, client kubernetes.Interface) { - selector := fmt.Sprintf("app.kubernetes.io/name=%s,app.kubernetes.io/managed-by=nvcf-cli", clusterValidatorAppLabel) +func sweepManagedPullSecrets(ctx context.Context, client kubernetes.Interface, role string) { + selector := fmt.Sprintf("app.kubernetes.io/name=%s,app.kubernetes.io/managed-by=nvcf-cli,%s=%s", + clusterValidatorAppLabel, clusterValidatorRoleLabel, role) _ = client.CoreV1().Secrets(clusterValidatorNamespace).DeleteCollection( ctx, metav1.DeleteOptions{}, diff --git a/src/clis/nvcf-cli/internal/selfhosted/pullsecret.go b/src/clis/nvcf-cli/internal/selfhosted/pullsecret.go index d01311e802..7d6ee66c9a 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/pullsecret.go +++ b/src/clis/nvcf-cli/internal/selfhosted/pullsecret.go @@ -37,10 +37,26 @@ const ( // can never collide with the conventional `nvcr-pull-secret` that // operators or the install flow may already manage in 'default'. // Pairs with isManagedByValidatorCLI label guard for defense-in-depth. + // + // The name is suffixed per role by validatorPullSecretRoleName: ModeSplit + // runs both validators concurrently, and the two kubecontexts can resolve + // to the same cluster. One shared Secret means the role that finishes first + // deletes it while the other Job is still pulling, which the kubelet + // reports as FailedToRetrieveImagePullSecret. validatorPullSecretName = "nvcf-preflight-pull-secret" validatorPullSecretScanTimeout = 10 * time.Second ) +// validatorPullSecretRoleName returns the managed pull-secret name for a role. +// A Secret cannot be co-owned, so each role needs its own rather than a shared +// object with a role label. +func validatorPullSecretRoleName(role string) string { + if role == "" { + return validatorPullSecretName + } + return validatorPullSecretName + "-" + role +} + // Mirrors the chain used by ensureLocalImagePullSecrets in cmd/self_hosted_up.go. var ngcAPIKeyEnvNames = []string{ "NGC_IMAGE_PULL_API_KEY", @@ -80,7 +96,7 @@ var validatorPullSecretSearchNamespaces = []string{ func resolveValidatorPullSecret( ctx context.Context, client kubernetes.Interface, - provided, image string, + provided, image, role string, ) (string, error) { if provided != "" { return provided, nil @@ -93,13 +109,13 @@ func resolveValidatorPullSecret( scanCtx, cancel := context.WithTimeout(ctx, validatorPullSecretScanTimeout) defer cancel() - if name, err := scanAndMirrorPullSecret(scanCtx, client, registry); err != nil { + if name, err := scanAndMirrorPullSecret(scanCtx, client, registry, role); err != nil { return "", err } else if name != "" { return name, nil } - if name, err := autoCreatePullSecretFromEnv(scanCtx, client, registry); err != nil { + if name, err := autoCreatePullSecretFromEnv(scanCtx, client, registry, role); err != nil { return "", err } else if name != "" { return name, nil @@ -131,7 +147,7 @@ func parseRegistryFromImage(image string) string { // registry. Mirrors the body into clusterValidatorNamespace when the match // lives elsewhere, so the Job can reference the secret without cross-namespace // lookups. -func scanAndMirrorPullSecret(ctx context.Context, client kubernetes.Interface, registry string) (string, error) { +func scanAndMirrorPullSecret(ctx context.Context, client kubernetes.Interface, registry, role string) (string, error) { for _, ns := range validatorPullSecretSearchNamespaces { // Filter client-side rather than via FieldSelector: server-side // type= selector on Secrets is only honored from k8s 1.27 onward. @@ -156,11 +172,11 @@ func scanAndMirrorPullSecret(ctx context.Context, client kubernetes.Interface, r // the destination namespace, and writeDockerConfigSecret's // delete-and-recreate path would otherwise destroy that // secret on type mismatch. - if err := writeDockerConfigSecret(ctx, client, clusterValidatorNamespace, validatorPullSecretName, cfg); err != nil { + if err := writeDockerConfigSecret(ctx, client, clusterValidatorNamespace, validatorPullSecretRoleName(role), role, cfg); err != nil { return "", fmt.Errorf("mirror pull secret %s/%s to %s/%s: %w", - s.Namespace, s.Name, clusterValidatorNamespace, validatorPullSecretName, err) + s.Namespace, s.Name, clusterValidatorNamespace, validatorPullSecretRoleName(role), err) } - return validatorPullSecretName, nil + return validatorPullSecretRoleName(role), nil } } return "", nil @@ -177,7 +193,7 @@ func dockerConfigHasRegistry(cfg []byte, registry string) bool { return ok } -func autoCreatePullSecretFromEnv(ctx context.Context, client kubernetes.Interface, registry string) (string, error) { +func autoCreatePullSecretFromEnv(ctx context.Context, client kubernetes.Interface, registry, role string) (string, error) { apiKey := firstNonEmptyEnv(ngcAPIKeyEnvNames...) if apiKey == "" { return "", nil @@ -186,11 +202,11 @@ func autoCreatePullSecretFromEnv(ctx context.Context, client kubernetes.Interfac if err != nil { return "", fmt.Errorf("encode dockerconfigjson for %s: %w", registry, err) } - if err := writeDockerConfigSecret(ctx, client, clusterValidatorNamespace, validatorPullSecretName, cfg); err != nil { + if err := writeDockerConfigSecret(ctx, client, clusterValidatorNamespace, validatorPullSecretRoleName(role), role, cfg); err != nil { return "", fmt.Errorf("auto-create pull secret %s/%s: %w", - clusterValidatorNamespace, validatorPullSecretName, err) + clusterValidatorNamespace, validatorPullSecretRoleName(role), err) } - return validatorPullSecretName, nil + return validatorPullSecretRoleName(role), nil } // Mirrors cmd/self_hosted_up.go's firstNonEmptyEnv; kept local to avoid an @@ -221,8 +237,8 @@ func buildDockerConfigJSON(registry, username, password string) ([]byte, error) // Mirrors cmd/self_hosted_up.go's ensureDockerConfigSecret. Attaches the // CLI's managed-by labels so a future cleanup path can identify resources // to remove. -func writeDockerConfigSecret(ctx context.Context, client kubernetes.Interface, namespace, name string, dockerConfig []byte) error { - labels := clusterValidatorLabels() +func writeDockerConfigSecret(ctx context.Context, client kubernetes.Interface, namespace, name, role string, dockerConfig []byte) error { + labels := clusterValidatorRoleLabels(role) secrets := client.CoreV1().Secrets(namespace) secret := &corev1.Secret{ ObjectMeta: metav1.ObjectMeta{ @@ -236,6 +252,17 @@ func writeDockerConfigSecret(ctx context.Context, client kubernetes.Interface, n current, err := secrets.Get(ctx, name, metav1.GetOptions{}) switch { case err == nil && current.Type == corev1.SecretTypeDockerConfigJson: + // Same guard as the type-mismatch branch below, for the same reason. A + // matching type is not permission to write: an operator-owned secret + // with a colliding name holds their registry credentials, and this + // would replace the data and stamp our managed labels on it, after + // which the role sweep would delete it outright. + if !isManagedByValidatorCLI(current) { + return fmt.Errorf( + "refusing to overwrite %s/%s which is not managed by nvcf-cli; "+ + "pass --cluster-validator-pull-secret to choose an explicit secret name", + namespace, name) + } if current.Data == nil { current.Data = map[string][]byte{} } diff --git a/src/clis/nvcf-cli/internal/selfhosted/pullsecret_test.go b/src/clis/nvcf-cli/internal/selfhosted/pullsecret_test.go index 7a77df310c..1762fac226 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/pullsecret_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/pullsecret_test.go @@ -28,7 +28,9 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/kubernetes/fake" + ktesting "k8s.io/client-go/testing" ) func dockerConfigBlob(t *testing.T, registry, user, pass string) []byte { @@ -134,7 +136,7 @@ func TestWriteDockerConfigSecret_Create(t *testing.T) { client := fake.NewSimpleClientset() cfg := dockerConfigBlob(t, "private.registry.test", "$oauthtoken", "key") - require.NoError(t, writeDockerConfigSecret(context.Background(), client, "default", "nvcr-pull-secret", cfg)) + require.NoError(t, writeDockerConfigSecret(context.Background(), client, "default", "nvcr-pull-secret", clusterValidatorControlPlaneRole, cfg)) got, err := client.CoreV1().Secrets("default").Get(context.Background(), "nvcr-pull-secret", metav1.GetOptions{}) require.NoError(t, err) @@ -148,17 +150,22 @@ func TestWriteDockerConfigSecret_Update(t *testing.T) { old := dockerConfigBlob(t, "private.registry.test", "$oauthtoken", "stale-key") fresh := dockerConfigBlob(t, "private.registry.test", "$oauthtoken", "rotated-key") + // Managed labels plus an unrelated one: only a secret we own may be + // updated, and updating must not drop labels the operator added. + existingLabels := clusterValidatorLabels() + existingLabels["existing-label"] = "preserved" + client := fake.NewSimpleClientset(&corev1.Secret{ ObjectMeta: metav1.ObjectMeta{ Name: "nvcr-pull-secret", Namespace: "default", - Labels: map[string]string{"existing-label": "preserved"}, + Labels: existingLabels, }, Type: corev1.SecretTypeDockerConfigJson, Data: map[string][]byte{corev1.DockerConfigJsonKey: old}, }) - require.NoError(t, writeDockerConfigSecret(context.Background(), client, "default", "nvcr-pull-secret", fresh)) + require.NoError(t, writeDockerConfigSecret(context.Background(), client, "default", "nvcr-pull-secret", clusterValidatorControlPlaneRole, fresh)) got, _ := client.CoreV1().Secrets("default").Get(context.Background(), "nvcr-pull-secret", metav1.GetOptions{}) assert.Equal(t, fresh, got.Data[corev1.DockerConfigJsonKey], "data must be updated to the fresh body") @@ -181,7 +188,7 @@ func TestWriteDockerConfigSecret_TypeMismatchReplaces(t *testing.T) { Data: map[string][]byte{"some-key": []byte("some-value")}, }) - require.NoError(t, writeDockerConfigSecret(context.Background(), client, "default", "nvcr-pull-secret", fresh)) + require.NoError(t, writeDockerConfigSecret(context.Background(), client, "default", "nvcr-pull-secret", clusterValidatorControlPlaneRole, fresh)) got, err := client.CoreV1().Secrets("default").Get(context.Background(), "nvcr-pull-secret", metav1.GetOptions{}) require.NoError(t, err) @@ -207,7 +214,7 @@ func TestWriteDockerConfigSecret_TypeMismatchRefusesUnlabeledSecret(t *testing.T Data: map[string][]byte{"operator-payload": operatorPayload}, }) - err := writeDockerConfigSecret(context.Background(), client, "default", "nvcr-pull-secret", fresh) + err := writeDockerConfigSecret(context.Background(), client, "default", "nvcr-pull-secret", clusterValidatorControlPlaneRole, fresh) require.Error(t, err, "must refuse to destroy a non-CLI-managed secret") assert.Contains(t, err.Error(), "not managed by nvcf-cli") @@ -226,7 +233,7 @@ func TestScanAndMirrorPullSecret_FoundInDefault(t *testing.T) { Data: map[string][]byte{corev1.DockerConfigJsonKey: cfg}, }) - name, err := scanAndMirrorPullSecret(context.Background(), client, "private.registry.test") + name, err := scanAndMirrorPullSecret(context.Background(), client, "private.registry.test", clusterValidatorControlPlaneRole) require.NoError(t, err) assert.Equal(t, "operator-secret", name) @@ -247,12 +254,12 @@ func TestScanAndMirrorPullSecret_FoundInNvcfMirroredToDefault(t *testing.T) { Data: map[string][]byte{corev1.DockerConfigJsonKey: cfg}, }) - name, err := scanAndMirrorPullSecret(context.Background(), client, "private.registry.test") + name, err := scanAndMirrorPullSecret(context.Background(), client, "private.registry.test", clusterValidatorControlPlaneRole) require.NoError(t, err) - assert.Equal(t, validatorPullSecretName, name) + assert.Equal(t, validatorPullSecretRoleName(clusterValidatorControlPlaneRole), name) - mirrored, err := client.CoreV1().Secrets("default").Get(context.Background(), validatorPullSecretName, metav1.GetOptions{}) - require.NoError(t, err, "mirror must be created under validatorPullSecretName") + mirrored, err := client.CoreV1().Secrets("default").Get(context.Background(), validatorPullSecretRoleName(clusterValidatorControlPlaneRole), metav1.GetOptions{}) + require.NoError(t, err, "mirror must be created under the role-scoped managed name") assert.Equal(t, cfg, mirrored.Data[corev1.DockerConfigJsonKey]) // The source secret must remain untouched in the source namespace. @@ -269,14 +276,14 @@ func TestScanAndMirrorPullSecret_RegistryMismatch(t *testing.T) { Data: map[string][]byte{corev1.DockerConfigJsonKey: cfg}, }) - name, err := scanAndMirrorPullSecret(context.Background(), client, "private.registry.test") + name, err := scanAndMirrorPullSecret(context.Background(), client, "private.registry.test", clusterValidatorControlPlaneRole) require.NoError(t, err) assert.Equal(t, "", name, "secret for a different registry must not match") } func TestScanAndMirrorPullSecret_NoSecrets(t *testing.T) { client := fake.NewSimpleClientset() - name, err := scanAndMirrorPullSecret(context.Background(), client, "private.registry.test") + name, err := scanAndMirrorPullSecret(context.Background(), client, "private.registry.test", clusterValidatorControlPlaneRole) require.NoError(t, err) assert.Equal(t, "", name) } @@ -296,7 +303,7 @@ func TestScanAndMirrorPullSecret_PrefersDefaultNamespace(t *testing.T) { }, ) - name, err := scanAndMirrorPullSecret(context.Background(), client, "private.registry.test") + name, err := scanAndMirrorPullSecret(context.Background(), client, "private.registry.test", clusterValidatorControlPlaneRole) require.NoError(t, err) assert.Equal(t, "in-default", name) } @@ -308,7 +315,7 @@ func TestAutoCreatePullSecretFromEnv_NoEnv(t *testing.T) { } client := fake.NewSimpleClientset() - got, err := autoCreatePullSecretFromEnv(context.Background(), client, "private.registry.test") + got, err := autoCreatePullSecretFromEnv(context.Background(), client, "private.registry.test", clusterValidatorControlPlaneRole) require.NoError(t, err) assert.Equal(t, "", got, "no env var set means no secret minted") @@ -323,11 +330,11 @@ func TestAutoCreatePullSecretFromEnv_KeyPresent(t *testing.T) { t.Setenv("NGC_API_KEY", "nvapi-test-123") client := fake.NewSimpleClientset() - got, err := autoCreatePullSecretFromEnv(context.Background(), client, "private.registry.test") + got, err := autoCreatePullSecretFromEnv(context.Background(), client, "private.registry.test", clusterValidatorControlPlaneRole) require.NoError(t, err) - assert.Equal(t, validatorPullSecretName, got) + assert.Equal(t, validatorPullSecretRoleName(clusterValidatorControlPlaneRole), got) - s, err := client.CoreV1().Secrets("default").Get(context.Background(), validatorPullSecretName, metav1.GetOptions{}) + s, err := client.CoreV1().Secrets("default").Get(context.Background(), validatorPullSecretRoleName(clusterValidatorControlPlaneRole), metav1.GetOptions{}) require.NoError(t, err) assert.True(t, dockerConfigHasRegistry(s.Data[corev1.DockerConfigJsonKey], "private.registry.test"), "minted secret must contain auth for the validator image's registry") @@ -335,7 +342,7 @@ func TestAutoCreatePullSecretFromEnv_KeyPresent(t *testing.T) { func TestResolveValidatorPullSecret_FlagOverride(t *testing.T) { client := fake.NewSimpleClientset() - got, err := resolveValidatorPullSecret(context.Background(), client, "custom-secret", "private.registry.test/nvidia/nvcf-byoc/cluster-validator:rc26") + got, err := resolveValidatorPullSecret(context.Background(), client, "custom-secret", "private.registry.test/nvidia/nvcf-byoc/cluster-validator:rc26", clusterValidatorControlPlaneRole) require.NoError(t, err) assert.Equal(t, "custom-secret", got, "explicit override always wins") @@ -355,14 +362,14 @@ func TestResolveValidatorPullSecret_ScanWins(t *testing.T) { Data: map[string][]byte{corev1.DockerConfigJsonKey: cfg}, }) - got, err := resolveValidatorPullSecret(context.Background(), client, "", "private.registry.test/nvidia/nvcf-byoc/cluster-validator:rc26") + got, err := resolveValidatorPullSecret(context.Background(), client, "", "private.registry.test/nvidia/nvcf-byoc/cluster-validator:rc26", clusterValidatorControlPlaneRole) require.NoError(t, err) // Mirror destination is the validator's well-known name, not the // source secret's name (avoids same-name collisions with operator // or chart-owned secrets in the destination namespace). - assert.Equal(t, validatorPullSecretName, got) + assert.Equal(t, validatorPullSecretRoleName(clusterValidatorControlPlaneRole), got) - mirrored, err := client.CoreV1().Secrets("default").Get(context.Background(), validatorPullSecretName, metav1.GetOptions{}) + mirrored, err := client.CoreV1().Secrets("default").Get(context.Background(), validatorPullSecretRoleName(clusterValidatorControlPlaneRole), metav1.GetOptions{}) require.NoError(t, err) assert.True(t, dockerConfigHasRegistry(mirrored.Data[corev1.DockerConfigJsonKey], "private.registry.test")) } @@ -374,11 +381,11 @@ func TestResolveValidatorPullSecret_EnvFallback(t *testing.T) { t.Setenv("NVCF_NGC_API_KEY", "nvapi-fallback") client := fake.NewSimpleClientset() - got, err := resolveValidatorPullSecret(context.Background(), client, "", "private.registry.test/nvidia/nvcf-byoc/cluster-validator:rc26") + got, err := resolveValidatorPullSecret(context.Background(), client, "", "private.registry.test/nvidia/nvcf-byoc/cluster-validator:rc26", clusterValidatorControlPlaneRole) require.NoError(t, err) - assert.Equal(t, validatorPullSecretName, got) + assert.Equal(t, validatorPullSecretRoleName(clusterValidatorControlPlaneRole), got) - s, err := client.CoreV1().Secrets("default").Get(context.Background(), validatorPullSecretName, metav1.GetOptions{}) + s, err := client.CoreV1().Secrets("default").Get(context.Background(), validatorPullSecretRoleName(clusterValidatorControlPlaneRole), metav1.GetOptions{}) require.NoError(t, err) assert.True(t, dockerConfigHasRegistry(s.Data[corev1.DockerConfigJsonKey], "private.registry.test")) } @@ -389,7 +396,7 @@ func TestResolveValidatorPullSecret_AllEmpty(t *testing.T) { } client := fake.NewSimpleClientset() - got, err := resolveValidatorPullSecret(context.Background(), client, "", "private.registry.test/nvidia/nvcf-byoc/cluster-validator:rc26") + got, err := resolveValidatorPullSecret(context.Background(), client, "", "private.registry.test/nvidia/nvcf-byoc/cluster-validator:rc26", clusterValidatorControlPlaneRole) require.NoError(t, err) assert.Equal(t, "", got, "no override, no scan match, no env var -> empty so kubelet surfaces ImagePullBackOff") } @@ -400,10 +407,98 @@ func TestResolveValidatorPullSecret_UnparsableImage(t *testing.T) { } client := fake.NewSimpleClientset() - got, err := resolveValidatorPullSecret(context.Background(), client, "", "bareimage") + got, err := resolveValidatorPullSecret(context.Background(), client, "", "bareimage", clusterValidatorControlPlaneRole) require.NoError(t, err) assert.Equal(t, "", got, "no registry hostname means no scan target and no auto-create") list, _ := client.CoreV1().Secrets("default").List(context.Background(), metav1.ListOptions{}) assert.Empty(t, list.Items, "no secret must be created when registry cannot be derived") } + +// ModeSplit runs both validators concurrently against contexts that can resolve +// to the same cluster. A Secret cannot be co-owned, so each role needs its own: +// with a shared name the role that finishes first deletes it while the other +// Job is still pulling, which the kubelet reports as +// FailedToRetrieveImagePullSecret. +// +// The sweep is asserted through a reactor rather than by observing deletions: +// the fake clientset implements DeleteCollection as a no-op, so a state-based +// assertion here would pass whatever the selector said. +func TestManagedPullSecret_IsScopedPerRole(t *testing.T) { + ctx := context.Background() + + cpName := validatorPullSecretRoleName(clusterValidatorControlPlaneRole) + gpuName := validatorPullSecretRoleName("compute-plane") + require.NotEqual(t, cpName, gpuName, "each role needs its own managed pull secret") + + client := fake.NewSimpleClientset() + var gotSelector string + client.PrependReactor("delete-collection", "secrets", + func(action ktesting.Action) (bool, runtime.Object, error) { + gotSelector = action.(ktesting.DeleteCollectionAction). + GetListRestrictions().Labels.String() + return true, nil, nil + }) + + sweepManagedPullSecrets(ctx, client, clusterValidatorControlPlaneRole) + + assert.Contains(t, gotSelector, clusterValidatorRoleLabel+"="+clusterValidatorControlPlaneRole, + "the sweep must select on the role so it cannot delete the other role's secret") +} + +// The managed labels a created secret carries must satisfy the sweep selector +// for that role, and must not satisfy another role's. +func TestManagedPullSecret_LabelsMatchOnlyItsOwnRole(t *testing.T) { + ctx := context.Background() + client := fake.NewSimpleClientset() + + // dockerConfigBlob encodes the auth value at runtime; a literal base64 + // docker credential in the source trips secret scanners. + cfg := dockerConfigBlob(t, "private.registry.test", "user", "pass") + require.NoError(t, writeDockerConfigSecret(ctx, client, clusterValidatorNamespace, + validatorPullSecretRoleName(clusterValidatorControlPlaneRole), + clusterValidatorControlPlaneRole, cfg)) + + got, err := client.CoreV1().Secrets(clusterValidatorNamespace).Get(ctx, + validatorPullSecretRoleName(clusterValidatorControlPlaneRole), metav1.GetOptions{}) + require.NoError(t, err) + + assert.Equal(t, clusterValidatorControlPlaneRole, got.Labels[clusterValidatorRoleLabel], + "a managed secret must carry its own role label") + assert.Equal(t, "nvcf-cli", got.Labels["app.kubernetes.io/managed-by"], + "the managed-by label is what excludes operator-supplied secrets from cleanup") +} + +// A matching Secret type is not permission to write. An operator-owned secret +// with a colliding name holds their registry credentials; overwriting it would +// also stamp our managed labels on it, after which the role sweep would delete +// it outright. +func TestWriteDockerConfigSecret_RefusesUnmanagedSameTypeSecret(t *testing.T) { + ctx := context.Background() + operatorOwned := dockerConfigBlob(t, "private.registry.test", "operator", "their-secret") + ours := dockerConfigBlob(t, "private.registry.test", "$oauthtoken", "ours") + + client := fake.NewSimpleClientset(&corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: "nvcf-preflight-pull-secret-control-plane", + Namespace: clusterValidatorNamespace, + Labels: map[string]string{"owner": "operator"}, + }, + Type: corev1.SecretTypeDockerConfigJson, + Data: map[string][]byte{corev1.DockerConfigJsonKey: operatorOwned}, + }) + + err := writeDockerConfigSecret(ctx, client, clusterValidatorNamespace, + "nvcf-preflight-pull-secret-control-plane", clusterValidatorControlPlaneRole, ours) + + require.Error(t, err, "an unmanaged secret of the same type must not be overwritten") + assert.Contains(t, err.Error(), "not managed by nvcf-cli") + + got, getErr := client.CoreV1().Secrets(clusterValidatorNamespace).Get(ctx, + "nvcf-preflight-pull-secret-control-plane", metav1.GetOptions{}) + require.NoError(t, getErr) + assert.Equal(t, operatorOwned, got.Data[corev1.DockerConfigJsonKey], + "the operator's credentials must be left untouched") + assert.NotContains(t, got.Labels, "app.kubernetes.io/managed-by", + "managed labels must not be stamped on it, or the sweep would later delete it") +} From 3fcd00dde95d2ca28efd12cdc41cb1444a35cc5a Mon Sep 17 00:00:00 2001 From: rohithb Date: Tue, 15 Sep 2026 16:50:31 +0530 Subject: [PATCH 21/36] fix(nvcf-cli): verify ownership before mutating or deleting any validator resource --- .../internal/selfhosted/clustervalidator.go | 35 ++++++++++-- .../selfhosted/clustervalidator_test.go | 57 ++++++++++++++++++- .../internal/selfhosted/pullsecret.go | 47 +++++++++++---- .../internal/selfhosted/pullsecret_test.go | 49 ++++++++++++++++ 4 files changed, 172 insertions(+), 16 deletions(-) diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go index 3db254119f..249b77d064 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go @@ -264,6 +264,13 @@ func ensureClusterValidatorRBAC(ctx context.Context, client kubernetes.Interface // Update-or-Create so a future CLI version's expanded rules replace the // old set; AlreadyExists tolerance alone would silently keep stale rules. if existing, err := client.RbacV1().ClusterRoles().Get(ctx, name, metav1.GetOptions{}); err == nil { + // Do not rewrite the rules of a ClusterRole we do not own: this is a + // cluster-scoped privilege object, and an operator-owned one with a + // colliding name would silently have its permissions replaced. + if !hasValidatorManagedLabels(existing.Labels) { + return fmt.Errorf( + "refusing to modify ClusterRole %s which is not managed by nvcf-cli", name) + } existing.Rules = cr.Rules existing.Labels = cr.Labels if _, err := client.RbacV1().ClusterRoles().Update(ctx, existing, metav1.UpdateOptions{}); err != nil { @@ -332,9 +339,23 @@ func validatorConfigNameForRole(role string) string { // Errors are swallowed: stale RBAC is preferable to failing the result. func sweepClusterValidatorRBAC(ctx context.Context, client kubernetes.Interface, role string) { name := clusterValidatorRBACName(role) - _ = client.RbacV1().ClusterRoleBindings().Delete(ctx, name, metav1.DeleteOptions{}) - _ = client.RbacV1().ClusterRoles().Delete(ctx, name, metav1.DeleteOptions{}) - _ = client.CoreV1().ServiceAccounts(clusterValidatorNamespace).Delete(ctx, name, metav1.DeleteOptions{}) + + // Delete by name, but only what we own. These are cluster-scoped objects + // and the errors here are swallowed, so an operator-owned ClusterRole with + // a colliding name would otherwise vanish with no diagnostic at all. + if crb, err := client.RbacV1().ClusterRoleBindings().Get(ctx, name, metav1.GetOptions{}); err == nil && + hasValidatorManagedLabels(crb.Labels) { + _ = client.RbacV1().ClusterRoleBindings().Delete(ctx, name, metav1.DeleteOptions{}) + } + if cr, err := client.RbacV1().ClusterRoles().Get(ctx, name, metav1.GetOptions{}); err == nil && + hasValidatorManagedLabels(cr.Labels) { + _ = client.RbacV1().ClusterRoles().Delete(ctx, name, metav1.DeleteOptions{}) + } + sa := client.CoreV1().ServiceAccounts(clusterValidatorNamespace) + if acct, err := sa.Get(ctx, name, metav1.GetOptions{}); err == nil && + hasValidatorManagedLabels(acct.Labels) { + _ = sa.Delete(ctx, name, metav1.DeleteOptions{}) + } } // Errors are swallowed: a stale Job is preferable to blocking the new run. @@ -443,7 +464,13 @@ func ensureClusterValidatorConfig(ctx context.Context, client kubernetes.Interfa return nil } - // Always update so a newer CLI version's config (or new registries) replaces stale content. + // Always update so a newer CLI version's config (or new registries) replaces + // stale content, but never overwrite a ConfigMap we do not own. + if !hasValidatorManagedLabels(existing.Labels) { + return fmt.Errorf( + "refusing to overwrite ConfigMap %s/%s which is not managed by nvcf-cli", + clusterValidatorNamespace, clusterValidatorConfigName) + } existing.Data = desired.Data existing.Labels = desired.Labels if _, err := client.CoreV1().ConfigMaps(clusterValidatorNamespace).Update(ctx, existing, metav1.UpdateOptions{}); err != nil { diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go index be4dfa6003..7298649e44 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go @@ -247,8 +247,10 @@ func TestRunClusterValidator_RBACRefreshesClusterRoleRules(t *testing.T) { oldRules := []rbacv1.PolicyRule{ {APIGroups: []string{""}, Resources: []string{"nodes"}, Verbs: []string{"get"}}, } + // Labelled as a prior CLI run would have left it: only a ClusterRole we own + // may have its rules rewritten. client := fake.NewSimpleClientset(&rbacv1.ClusterRole{ - ObjectMeta: metav1.ObjectMeta{Name: clusterValidatorName}, + ObjectMeta: metav1.ObjectMeta{Name: clusterValidatorName, Labels: clusterValidatorLabels()}, Rules: oldRules, }) @@ -706,3 +708,56 @@ func TestClusterValidatorRBAC_IsScopedPerRole(t *testing.T) { _, err = client.CoreV1().ServiceAccounts(clusterValidatorNamespace).Get(ctx, gpuName, metav1.GetOptions{}) assert.NoError(t, err, "the other role's ServiceAccount must survive") } + +// A ClusterRole is a cluster-scoped privilege object. An operator-owned one with +// a colliding name must not have its rules rewritten, and the sweep must not +// delete it. +func TestClusterValidatorRBAC_RefusesUnmanagedClusterRole(t *testing.T) { + ctx := context.Background() + const role = clusterValidatorControlPlaneRole + name := clusterValidatorRBACName(role) + + operatorRules := []rbacv1.PolicyRule{ + {APIGroups: []string{""}, Resources: []string{"pods"}, Verbs: []string{"get"}}, + } + client := fake.NewSimpleClientset(&rbacv1.ClusterRole{ + ObjectMeta: metav1.ObjectMeta{Name: name, Labels: map[string]string{"owner": "operator"}}, + Rules: operatorRules, + }) + + err := ensureClusterValidatorRBAC(ctx, client, role) + require.Error(t, err, "an unmanaged ClusterRole must not be rewritten") + assert.Contains(t, err.Error(), "not managed by nvcf-cli") + + got, getErr := client.RbacV1().ClusterRoles().Get(ctx, name, metav1.GetOptions{}) + require.NoError(t, getErr) + assert.Equal(t, operatorRules, got.Rules, "the operator's rules must be untouched") + + // The sweep must leave it alone too, even though it matches by name. + sweepClusterValidatorRBAC(ctx, client, role) + _, getErr = client.RbacV1().ClusterRoles().Get(ctx, name, metav1.GetOptions{}) + assert.NoError(t, getErr, "the sweep must not delete a ClusterRole it does not own") +} + +// The same invariant for the network-check ConfigMap. +func TestEnsureClusterValidatorConfig_RefusesUnmanagedConfigMap(t *testing.T) { + ctx := context.Background() + client := fake.NewSimpleClientset(&corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: clusterValidatorConfigName, + Namespace: clusterValidatorNamespace, + Labels: map[string]string{"owner": "operator"}, + }, + Data: map[string]string{"config.yaml": "operator: content"}, + }) + + err := ensureClusterValidatorConfig(ctx, client, nil) + require.Error(t, err, "an unmanaged ConfigMap must not be overwritten") + assert.Contains(t, err.Error(), "not managed by nvcf-cli") + + got, getErr := client.CoreV1().ConfigMaps(clusterValidatorNamespace).Get(ctx, + clusterValidatorConfigName, metav1.GetOptions{}) + require.NoError(t, getErr) + assert.Equal(t, "operator: content", got.Data["config.yaml"], + "the operator's ConfigMap content must be untouched") +} diff --git a/src/clis/nvcf-cli/internal/selfhosted/pullsecret.go b/src/clis/nvcf-cli/internal/selfhosted/pullsecret.go index 7d6ee66c9a..a846e4c1c1 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/pullsecret.go +++ b/src/clis/nvcf-cli/internal/selfhosted/pullsecret.go @@ -257,11 +257,8 @@ func writeDockerConfigSecret(ctx context.Context, client kubernetes.Interface, n // with a colliding name holds their registry credentials, and this // would replace the data and stamp our managed labels on it, after // which the role sweep would delete it outright. - if !isManagedByValidatorCLI(current) { - return fmt.Errorf( - "refusing to overwrite %s/%s which is not managed by nvcf-cli; "+ - "pass --cluster-validator-pull-secret to choose an explicit secret name", - namespace, name) + if err := refuseIfUnmanaged(current, namespace, name, ""); err != nil { + return err } if current.Data == nil { current.Data = map[string][]byte{} @@ -283,11 +280,9 @@ func writeDockerConfigSecret(ctx context.Context, client kubernetes.Interface, n // Without this, an operator-owned secret with a colliding name // (e.g. an Opaque secret in 'default' sharing the validator's // pull-secret name) would be silently destroyed. - if !isManagedByValidatorCLI(current) { - return fmt.Errorf( - "refusing to replace %s/%s (type=%s) which is not managed by nvcf-cli; "+ - "pass --cluster-validator-pull-secret to choose an explicit secret name", - namespace, name, current.Type) + if err := refuseIfUnmanaged(current, namespace, name, + fmt.Sprintf("type=%s", current.Type)); err != nil { + return err } if err := secrets.Delete(ctx, name, metav1.DeleteOptions{}); err != nil && !apierrors.IsNotFound(err) { return fmt.Errorf("delete incompatible secret type %s: %w", current.Type, err) @@ -307,6 +302,9 @@ func writeDockerConfigSecret(ctx context.Context, client kubernetes.Interface, n if getErr != nil { return fmt.Errorf("get after create race: %w", getErr) } + if err := refuseIfUnmanaged(current, namespace, name, "lost create race"); err != nil { + return err + } if current.Type != corev1.SecretTypeDockerConfigJson { return fmt.Errorf("create race left secret %s/%s with type %s, want %s", namespace, name, current.Type, corev1.SecretTypeDockerConfigJson) @@ -332,9 +330,36 @@ func writeDockerConfigSecret(ctx context.Context, client kubernetes.Interface, n // writeDockerConfigSecret stamps on every secret it creates. Used to // gate the delete-then-recreate branch so we never destroy an operator- // or chart-owned secret that happens to share a name with one of ours. +// refuseIfUnmanaged rejects a Secret nvcf-cli does not own. Every path in +// writeDockerConfigSecret that mutates an existing Secret must call this: +// overwriting an operator-owned secret replaces their registry credentials and +// stamps our managed labels on it, after which the role sweep deletes it. +// +// detail is appended to the message when there is something useful to say +// (the conflicting type, the race), otherwise "". +func refuseIfUnmanaged(s *corev1.Secret, namespace, name, detail string) error { + if isManagedByValidatorCLI(s) { + return nil + } + if detail != "" { + detail = " (" + detail + ")" + } + return fmt.Errorf( + "refusing to overwrite %s/%s%s which is not managed by nvcf-cli; "+ + "pass --cluster-validator-pull-secret to choose an explicit secret name", + namespace, name, detail) +} + func isManagedByValidatorCLI(s *corev1.Secret) bool { + return hasValidatorManagedLabels(s.Labels) +} + +// hasValidatorManagedLabels reports whether an object carries the labels this +// CLI stamps on everything it creates. It is the ownership test for every +// resource the validator writes to or deletes by name, not just Secrets. +func hasValidatorManagedLabels(labels map[string]string) bool { for k, v := range clusterValidatorLabels() { - if s.Labels[k] != v { + if labels[k] != v { return false } } diff --git a/src/clis/nvcf-cli/internal/selfhosted/pullsecret_test.go b/src/clis/nvcf-cli/internal/selfhosted/pullsecret_test.go index 1762fac226..80aa267b6a 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/pullsecret_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/pullsecret_test.go @@ -27,6 +27,7 @@ import ( "github.com/stretchr/testify/require" corev1 "k8s.io/api/core/v1" + apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/kubernetes/fake" @@ -502,3 +503,51 @@ func TestWriteDockerConfigSecret_RefusesUnmanagedSameTypeSecret(t *testing.T) { assert.NotContains(t, got.Labels, "app.kubernetes.io/managed-by", "managed labels must not be stamped on it, or the sweep would later delete it") } + +// If an unmanaged Docker-config Secret appears between our Get and our Create, +// Create fails with AlreadyExists and the recovery path refetches it. That path +// must apply the same ownership check as the others, or a lost race silently +// overwrites an operator-owned secret and marks it for sweep deletion. +func TestWriteDockerConfigSecret_RefusesUnmanagedAfterCreateRace(t *testing.T) { + ctx := context.Background() + operatorOwned := dockerConfigBlob(t, "private.registry.test", "operator", "their-secret") + ours := dockerConfigBlob(t, "private.registry.test", "$oauthtoken", "ours") + + const name = "nvcf-preflight-pull-secret-control-plane" + client := fake.NewSimpleClientset() + + // First Get: absent, so the code proceeds to Create. Create: AlreadyExists, + // as though another actor won the race. Second Get: their unmanaged secret. + gets := 0 + client.PrependReactor("get", "secrets", func(_ ktesting.Action) (bool, runtime.Object, error) { + gets++ + if gets == 1 { + return true, nil, apierrors.NewNotFound(corev1.Resource("secrets"), name) + } + return true, &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: clusterValidatorNamespace, + Labels: map[string]string{"owner": "operator"}, + }, + Type: corev1.SecretTypeDockerConfigJson, + Data: map[string][]byte{corev1.DockerConfigJsonKey: operatorOwned}, + }, nil + }) + client.PrependReactor("create", "secrets", func(_ ktesting.Action) (bool, runtime.Object, error) { + return true, nil, apierrors.NewAlreadyExists(corev1.Resource("secrets"), name) + }) + + var updated bool + client.PrependReactor("update", "secrets", func(_ ktesting.Action) (bool, runtime.Object, error) { + updated = true + return true, nil, nil + }) + + err := writeDockerConfigSecret(ctx, client, clusterValidatorNamespace, name, + clusterValidatorControlPlaneRole, ours) + + require.Error(t, err, "losing the create race to an unmanaged secret must not overwrite it") + assert.Contains(t, err.Error(), "not managed by nvcf-cli") + assert.False(t, updated, "no Update may be issued against an unmanaged secret") +} From 5952b0f56c872991cb0f72c0ad740130963c315f Mon Sep 17 00:00:00 2001 From: rohithb Date: Tue, 15 Sep 2026 17:21:24 +0530 Subject: [PATCH 22/36] fix(nvcf-cli): verify RBAC ownership before reuse and reject host-confusing registries --- .../internal/selfhosted/clustervalidator.go | 70 ++++++++++- .../selfhosted/clustervalidator_test.go | 117 ++++++++++++++++-- .../internal/selfhosted/validatortag.go | 30 +++++ .../internal/selfhosted/validatortag_test.go | 37 ++++++ 4 files changed, 236 insertions(+), 18 deletions(-) diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go index 249b77d064..066223806c 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go @@ -233,8 +233,24 @@ func ensureClusterValidatorRBAC(ctx context.Context, client kubernetes.Interface Labels: labels, }, } - if _, err := client.CoreV1().ServiceAccounts(clusterValidatorNamespace).Create(ctx, sa, metav1.CreateOptions{}); err != nil && !apierrors.IsAlreadyExists(err) { - return fmt.Errorf("create service account: %w", err) + if _, err := client.CoreV1().ServiceAccounts(clusterValidatorNamespace).Create(ctx, sa, metav1.CreateOptions{}); err != nil { + if !apierrors.IsAlreadyExists(err) { + return fmt.Errorf("create service account: %w", err) + } + // Do not adopt a ServiceAccount we did not create. The ClusterRoleBinding + // below would bind it to the validator ClusterRole, handing whoever + // controls that account cluster-wide create/delete on namespaces, pods, + // services and daemonsets. + existing, getErr := client.CoreV1().ServiceAccounts(clusterValidatorNamespace).Get(ctx, name, metav1.GetOptions{}) + if getErr != nil { + return fmt.Errorf("get existing service account: %w", getErr) + } + if !hasValidatorManagedLabels(existing.Labels) { + return fmt.Errorf( + "refusing to bind ServiceAccount %s/%s which is not managed by nvcf-cli; "+ + "remove it or run against a cluster where the name is free", + clusterValidatorNamespace, name) + } } cr := &rbacv1.ClusterRole{ @@ -297,12 +313,53 @@ func ensureClusterValidatorRBAC(ctx context.Context, client kubernetes.Interface Name: name, }, } - if _, err := client.RbacV1().ClusterRoleBindings().Create(ctx, crb, metav1.CreateOptions{}); err != nil && !apierrors.IsAlreadyExists(err) { - return fmt.Errorf("create cluster role binding: %w", err) + if _, err := client.RbacV1().ClusterRoleBindings().Create(ctx, crb, metav1.CreateOptions{}); err != nil { + if !apierrors.IsAlreadyExists(err) { + return fmt.Errorf("create cluster role binding: %w", err) + } + existing, getErr := client.RbacV1().ClusterRoleBindings().Get(ctx, name, metav1.GetOptions{}) + if getErr != nil { + return fmt.Errorf("get existing cluster role binding: %w", getErr) + } + // An unowned binding with this name may point anywhere, or bind subjects + // we never intended, so never leave it in place and assume it is ours. + if !hasValidatorManagedLabels(existing.Labels) { + return fmt.Errorf( + "refusing to reuse ClusterRoleBinding %s which is not managed by nvcf-cli; "+ + "remove it or run against a cluster where the name is free", name) + } + // Ours, but from an older CLI whose RoleRef or subjects differ. RoleRef + // is immutable, so replace rather than update. + if !clusterRoleBindingMatches(existing, crb) { + if delErr := client.RbacV1().ClusterRoleBindings().Delete(ctx, name, metav1.DeleteOptions{}); delErr != nil && + !apierrors.IsNotFound(delErr) { + return fmt.Errorf("replace stale cluster role binding: %w", delErr) + } + if _, cErr := client.RbacV1().ClusterRoleBindings().Create(ctx, crb, metav1.CreateOptions{}); cErr != nil { + return fmt.Errorf("recreate cluster role binding: %w", cErr) + } + } } return nil } +// clusterRoleBindingMatches reports whether an existing binding already grants +// exactly what we intend: the same ClusterRole, to the same single subject. +func clusterRoleBindingMatches(existing, want *rbacv1.ClusterRoleBinding) bool { + if existing.RoleRef != want.RoleRef { + return false + } + if len(existing.Subjects) != len(want.Subjects) { + return false + } + for i := range want.Subjects { + if existing.Subjects[i] != want.Subjects[i] { + return false + } + } + return true +} + func clusterValidatorLabels() map[string]string { return map[string]string{ "app.kubernetes.io/name": clusterValidatorAppLabel, @@ -517,7 +574,10 @@ func buildControlPlaneValidatorConfig(extraRegistries []string) string { // the input has a trailing colon with no digit (e.g. "nvcr.io:"). func parseRegistryHostPort(s string) (host string, port int) { s = strings.TrimSpace(s) - if s == "" { + // Reject anything that is not a bare host[:port]. Callers interpolate the + // result straight into a URL and into the validator ConfigMap, and an empty + // host is the signal to skip the entry entirely. + if !isBareRegistryHost(s) { return "", 0 } h, p, err := net.SplitHostPort(s) diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go index 7298649e44..7fd3f22a51 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go @@ -210,20 +210,36 @@ func TestRunClusterValidator_JobFailed(t *testing.T) { } func TestRunClusterValidator_RBACIdempotent(t *testing.T) { - client := fake.NewSimpleClientset() - // Seed the cluster with the SA, ClusterRole, and ClusterRoleBinding so - // each Create returns AlreadyExists. The runner must treat that as + // Seed the SA, ClusterRole and ClusterRoleBinding exactly as a prior run + // would have left them: present, and carrying our managed labels. Each + // Create then returns AlreadyExists and the runner must treat that as // success and proceed to Job creation. - existing := []ktesting.ReactionFunc{ - alreadyExistsReactor("serviceaccounts", clusterValidatorName), - alreadyExistsReactor("clusterroles", clusterValidatorName), - alreadyExistsReactor("clusterrolebindings", clusterValidatorName), - } - verbs := []string{"create"} - resources := []string{"serviceaccounts", "clusterroles", "clusterrolebindings"} - for i, r := range existing { - client.PrependReactor(verbs[0], resources[i], r) - } + // + // Seeding real objects rather than faking AlreadyExists with a reactor + // matters: the runner refetches on conflict to confirm it owns what it is + // about to bind, so a reactor with nothing behind it is not a valid model. + client := fake.NewSimpleClientset( + &corev1.ServiceAccount{ObjectMeta: metav1.ObjectMeta{ + Name: clusterValidatorName, Namespace: clusterValidatorNamespace, + Labels: clusterValidatorLabels(), + }}, + &rbacv1.ClusterRole{ObjectMeta: metav1.ObjectMeta{ + Name: clusterValidatorName, Labels: clusterValidatorLabels(), + }}, + &rbacv1.ClusterRoleBinding{ + ObjectMeta: metav1.ObjectMeta{ + Name: clusterValidatorName, Labels: clusterValidatorLabels(), + }, + Subjects: []rbacv1.Subject{{ + Kind: rbacv1.ServiceAccountKind, + Name: clusterValidatorName, + Namespace: clusterValidatorNamespace, + }}, + RoleRef: rbacv1.RoleRef{ + APIGroup: rbacv1.GroupName, Kind: "ClusterRole", Name: clusterValidatorName, + }, + }, + ) var jobName atomic.Value jobName.Store("") @@ -761,3 +777,78 @@ func TestEnsureClusterValidatorConfig_RefusesUnmanagedConfigMap(t *testing.T) { assert.Equal(t, "operator: content", got.Data["config.yaml"], "the operator's ConfigMap content must be untouched") } + +// An attacker who can create a ServiceAccount in the probe namespace could +// pre-create one under the generated name. Blindly tolerating AlreadyExists +// would then bind that account to the validator ClusterRole, handing whoever +// controls it cluster-wide create/delete on namespaces, pods and daemonsets. +func TestClusterValidatorRBAC_RefusesUnmanagedServiceAccount(t *testing.T) { + ctx := context.Background() + const role = clusterValidatorControlPlaneRole + name := clusterValidatorRBACName(role) + + client := fake.NewSimpleClientset(&corev1.ServiceAccount{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, Namespace: clusterValidatorNamespace, + Labels: map[string]string{"owner": "someone-else"}, + }, + }) + + err := ensureClusterValidatorRBAC(ctx, client, role) + require.Error(t, err, "an unowned ServiceAccount must not be adopted") + assert.Contains(t, err.Error(), "not managed by nvcf-cli") + + _, bindErr := client.RbacV1().ClusterRoleBindings().Get(ctx, name, metav1.GetOptions{}) + assert.True(t, apierrors.IsNotFound(bindErr), + "no ClusterRoleBinding may be created for a ServiceAccount we do not own") +} + +// A pre-existing ClusterRoleBinding under our name may bind subjects we never +// intended, or point at a different role. It must not be silently reused. +func TestClusterValidatorRBAC_RefusesUnmanagedClusterRoleBinding(t *testing.T) { + ctx := context.Background() + const role = clusterValidatorControlPlaneRole + name := clusterValidatorRBACName(role) + + client := fake.NewSimpleClientset(&rbacv1.ClusterRoleBinding{ + ObjectMeta: metav1.ObjectMeta{Name: name, Labels: map[string]string{"owner": "someone-else"}}, + Subjects: []rbacv1.Subject{{ + Kind: rbacv1.ServiceAccountKind, Name: "attacker-sa", Namespace: "default", + }}, + RoleRef: rbacv1.RoleRef{APIGroup: rbacv1.GroupName, Kind: "ClusterRole", Name: "cluster-admin"}, + }) + + err := ensureClusterValidatorRBAC(ctx, client, role) + require.Error(t, err, "an unowned ClusterRoleBinding must not be reused") + assert.Contains(t, err.Error(), "not managed by nvcf-cli") + + got, getErr := client.RbacV1().ClusterRoleBindings().Get(ctx, name, metav1.GetOptions{}) + require.NoError(t, getErr) + assert.Equal(t, "attacker-sa", got.Subjects[0].Name, "the existing binding must be left untouched") +} + +// A binding we own but from an older CLI can point at a stale RoleRef, which is +// immutable, so it has to be replaced rather than updated. +func TestClusterValidatorRBAC_ReplacesOwnedBindingWithStaleRoleRef(t *testing.T) { + ctx := context.Background() + const role = clusterValidatorControlPlaneRole + name := clusterValidatorRBACName(role) + + client := fake.NewSimpleClientset( + &rbacv1.ClusterRoleBinding{ + ObjectMeta: metav1.ObjectMeta{Name: name, Labels: clusterValidatorLabels()}, + Subjects: []rbacv1.Subject{{ + Kind: rbacv1.ServiceAccountKind, Name: "old-name", Namespace: clusterValidatorNamespace, + }}, + RoleRef: rbacv1.RoleRef{APIGroup: rbacv1.GroupName, Kind: "ClusterRole", Name: "old-role"}, + }, + ) + + require.NoError(t, ensureClusterValidatorRBAC(ctx, client, role)) + + got, err := client.RbacV1().ClusterRoleBindings().Get(ctx, name, metav1.GetOptions{}) + require.NoError(t, err) + assert.Equal(t, name, got.RoleRef.Name, "the stale RoleRef must be replaced with the current one") + require.Len(t, got.Subjects, 1) + assert.Equal(t, name, got.Subjects[0].Name, "the subject must be the current ServiceAccount") +} diff --git a/src/clis/nvcf-cli/internal/selfhosted/validatortag.go b/src/clis/nvcf-cli/internal/selfhosted/validatortag.go index 7b12c81332..7029581ab4 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/validatortag.go +++ b/src/clis/nvcf-cli/internal/selfhosted/validatortag.go @@ -440,7 +440,37 @@ var ngcApprovedHosts = []string{ // domain. The check strips any port from the registry string before matching // so that nvcr.io:443 is handled correctly, and uses dot-boundary matching to // reject deceptive suffixes such as evilnvcr.io or nvidia.com.invalid. +// isBareRegistryHost reports whether s is a plain host[:port], with nothing in +// it that could move the request somewhere else once concatenated into a URL. +// +// This matters because the registry string is interpolated directly into +// "https://" + registry + "/...". A value like "evil.com/x.nvcr.io" ends with a +// trusted suffix but parses to host evil.com, so a suffix check alone would +// authorize sending credentials to an attacker. IPv6 literals keep their +// brackets and are allowed. +func isBareRegistryHost(s string) bool { + if s == "" { + return false + } + // "/" and "@" move the host; "?" and "#" truncate it; whitespace and + // control characters have no place in a hostname. + if strings.ContainsAny(s, "/@?#\\") { + return false + } + for _, r := range s { + if r <= ' ' || r == 0x7f { + return false + } + } + return true +} + func isNGCRegistry(registry string) bool { + // Never treat a value we cannot safely place in a URL as an NGC host: the + // caller uses this to decide whether to forward the NGC API key. + if !isBareRegistryHost(registry) { + return false + } host := registry // Strip port if present (e.g. nvcr.io:5000 -> nvcr.io). if h, _, err := net.SplitHostPort(registry); err == nil { diff --git a/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go b/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go index 88b5970441..d528c4a174 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go @@ -463,3 +463,40 @@ func TestExchangeNGCBearerToken_RejectsNonNGCRegistry(t *testing.T) { require.Error(t, err, "non-NGC registry must be rejected without issuing a request") assert.Contains(t, err.Error(), "non-NGC registry") } + +// The registry string is concatenated into "https://" + registry + "/...", so a +// suffix match alone is not enough to authorize forwarding the NGC API key: +// "evil.com/x.nvcr.io" ends with a trusted suffix but parses to host evil.com. +func TestIsNGCRegistry_RejectsHostConfusion(t *testing.T) { + for _, tc := range []struct { + registry string + want bool + why string + }{ + {"nvcr.io", true, "the canonical host"}, + {"stg.nvcr.io", true, "a real subdomain"}, + {"evil.com/x.nvcr.io", false, "path component: the request host is evil.com"}, + {"evil.com@nvcr.io", false, "userinfo: not a bare host"}, + {"nvcr.io?x=.nvcr.io", false, "query truncates the host"}, + {"nvcr.io#.nvcr.io", false, "fragment truncates the host"}, + {"nvcr.io.evil.com", false, "deceptive suffix"}, + {"nvcr.io evil.com", false, "whitespace"}, + } { + assert.Equal(t, tc.want, isNGCRegistry(tc.registry), + "isNGCRegistry(%q): %s", tc.registry, tc.why) + } +} + +// A non-bare registry must never reach the NGC token exchange, which attaches +// the API key with basic auth. +func TestExchangeNGCBearerToken_RejectsHostConfusion(t *testing.T) { + t.Setenv("NGC_API_KEY", "test-key") + rec := &recordingTransport{inner: http.DefaultTransport} + client := &http.Client{Transport: rec} + + _, err := exchangeNGCBearerToken(context.Background(), client, "evil.com/x.nvcr.io", "repo/img") + + require.Error(t, err) + assert.Empty(t, rec.withAuth, "the NGC API key must not be sent to a confused host") + assert.Empty(t, rec.requests, "no request may be issued at all") +} From 96d08657699df40ee7ab583d5784149bdffd08e1 Mon Sep 17 00:00:00 2001 From: rohithb Date: Tue, 15 Sep 2026 18:40:19 +0530 Subject: [PATCH 23/36] fix(nvcf-cli): give validator RBAC an unguessable per-run name and reject malformed ports --- .../internal/selfhosted/clustervalidator.go | 206 +++++++-------- .../selfhosted/clustervalidator_test.go | 238 ++++++------------ 2 files changed, 187 insertions(+), 257 deletions(-) diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go index 066223806c..314cea3597 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go @@ -19,6 +19,8 @@ package selfhosted import ( "context" + cryptorand "crypto/rand" + "encoding/hex" "fmt" "io" "net" @@ -43,6 +45,9 @@ const ( clusterValidatorPollInterval = 2 * time.Second clusterValidatorTTLSeconds = int32(600) clusterValidatorHintURL = "https://docs.nvidia.com/nvcf/self-managed-clusters#cluster-validator" + // orphanValidatorRBACTTL is the minimum age before leftover validator RBAC + // is reclaimed. Must exceed the validator timeout so a live run is never hit. + orphanValidatorRBACTTL = 30 * time.Minute ) // Vars (not consts) so tests can shorten without the full production budget. @@ -146,7 +151,14 @@ func runClusterValidator(ctx context.Context, client kubernetes.Interface, image } }() - if err := ensureClusterValidatorRBAC(vctx, client, role); err != nil { + // Random per-run identity for the SA/ClusterRole/ClusterRoleBinding, so a + // predictable name cannot be pre-created by someone else and then bound to + // the validator's cluster-wide permissions. + runID, err := newValidatorRunID() + if err != nil { + return ClusterValidatorResult{Err: err} + } + if err := ensureClusterValidatorRBAC(vctx, client, role, runID); err != nil { return ClusterValidatorResult{Err: fmt.Errorf("bootstrapping validator RBAC: %w", err)} } // Remove the ClusterRole and ClusterRoleBinding to minimize the window in @@ -154,7 +166,7 @@ func runClusterValidator(ctx context.Context, client kubernetes.Interface, image // expects to inspect the Job, so the RBAC stays either way. defer func() { if !noCleanup && !podMayBeRunning { - sweepClusterValidatorRBAC(context.Background(), client, role) + sweepClusterValidatorRBAC(context.Background(), client, role, runID) } }() @@ -173,11 +185,12 @@ func runClusterValidator(ctx context.Context, client kubernetes.Interface, image } } + sweepOrphanClusterValidatorRBAC(vctx, client, orphanValidatorRBACTTL) sweepPriorClusterValidatorJobs(vctx, client, role) jobName := fmt.Sprintf("%s-%d", clusterValidatorName, time.Now().UnixNano()) if _, err := client.BatchV1().Jobs(clusterValidatorNamespace).Create( - vctx, buildClusterValidatorJob(jobName, image, pullSecret, role, noCleanup), metav1.CreateOptions{}, + vctx, buildClusterValidatorJob(jobName, image, pullSecret, role, runID, noCleanup), metav1.CreateOptions{}, ); err != nil { return ClusterValidatorResult{Err: fmt.Errorf("creating validator Job: %w", err)} } @@ -222,9 +235,9 @@ func runClusterValidator(ctx context.Context, client kubernetes.Interface, image // Creates the SA/ClusterRole/ClusterRoleBinding the validator pod runs under, // idempotent via AlreadyExists tolerance. ClusterRole uses update-or-create so // newer CLI versions replace stale rules without the operator needing to delete. -func ensureClusterValidatorRBAC(ctx context.Context, client kubernetes.Interface, role string) error { +func ensureClusterValidatorRBAC(ctx context.Context, client kubernetes.Interface, role, runID string) error { labels := clusterValidatorRoleLabels(role) - name := clusterValidatorRBACName(role) + name := clusterValidatorRBACName(role, runID) sa := &corev1.ServiceAccount{ ObjectMeta: metav1.ObjectMeta{ @@ -233,24 +246,11 @@ func ensureClusterValidatorRBAC(ctx context.Context, client kubernetes.Interface Labels: labels, }, } + // No AlreadyExists tolerance: the name carries a random per-run suffix, so + // anything already sitting there was not put there by this run and must not + // be adopted and bound to the validator ClusterRole. if _, err := client.CoreV1().ServiceAccounts(clusterValidatorNamespace).Create(ctx, sa, metav1.CreateOptions{}); err != nil { - if !apierrors.IsAlreadyExists(err) { - return fmt.Errorf("create service account: %w", err) - } - // Do not adopt a ServiceAccount we did not create. The ClusterRoleBinding - // below would bind it to the validator ClusterRole, handing whoever - // controls that account cluster-wide create/delete on namespaces, pods, - // services and daemonsets. - existing, getErr := client.CoreV1().ServiceAccounts(clusterValidatorNamespace).Get(ctx, name, metav1.GetOptions{}) - if getErr != nil { - return fmt.Errorf("get existing service account: %w", getErr) - } - if !hasValidatorManagedLabels(existing.Labels) { - return fmt.Errorf( - "refusing to bind ServiceAccount %s/%s which is not managed by nvcf-cli; "+ - "remove it or run against a cluster where the name is free", - clusterValidatorNamespace, name) - } + return fmt.Errorf("create service account: %w", err) } cr := &rbacv1.ClusterRole{ @@ -277,27 +277,11 @@ func ensureClusterValidatorRBAC(ctx context.Context, client kubernetes.Interface {NonResourceURLs: []string{"/readyz", "/version", "/healthz"}, Verbs: []string{"get"}}, }, } - // Update-or-Create so a future CLI version's expanded rules replace the - // old set; AlreadyExists tolerance alone would silently keep stale rules. - if existing, err := client.RbacV1().ClusterRoles().Get(ctx, name, metav1.GetOptions{}); err == nil { - // Do not rewrite the rules of a ClusterRole we do not own: this is a - // cluster-scoped privilege object, and an operator-owned one with a - // colliding name would silently have its permissions replaced. - if !hasValidatorManagedLabels(existing.Labels) { - return fmt.Errorf( - "refusing to modify ClusterRole %s which is not managed by nvcf-cli", name) - } - existing.Rules = cr.Rules - existing.Labels = cr.Labels - if _, err := client.RbacV1().ClusterRoles().Update(ctx, existing, metav1.UpdateOptions{}); err != nil { - return fmt.Errorf("update cluster role: %w", err) - } - } else if apierrors.IsNotFound(err) { - if _, err := client.RbacV1().ClusterRoles().Create(ctx, cr, metav1.CreateOptions{}); err != nil && !apierrors.IsAlreadyExists(err) { - return fmt.Errorf("create cluster role: %w", err) - } - } else { - return fmt.Errorf("get cluster role: %w", err) + // Create only, for the same reason as the ServiceAccount above. The name is + // unique per run, so there are no stale rules from an older CLI to refresh + // and nothing legitimate to overwrite. + if _, err := client.RbacV1().ClusterRoles().Create(ctx, cr, metav1.CreateOptions{}); err != nil { + return fmt.Errorf("create cluster role: %w", err) } crb := &rbacv1.ClusterRoleBinding{ @@ -313,53 +297,13 @@ func ensureClusterValidatorRBAC(ctx context.Context, client kubernetes.Interface Name: name, }, } + // Create only, same reasoning as above. if _, err := client.RbacV1().ClusterRoleBindings().Create(ctx, crb, metav1.CreateOptions{}); err != nil { - if !apierrors.IsAlreadyExists(err) { - return fmt.Errorf("create cluster role binding: %w", err) - } - existing, getErr := client.RbacV1().ClusterRoleBindings().Get(ctx, name, metav1.GetOptions{}) - if getErr != nil { - return fmt.Errorf("get existing cluster role binding: %w", getErr) - } - // An unowned binding with this name may point anywhere, or bind subjects - // we never intended, so never leave it in place and assume it is ours. - if !hasValidatorManagedLabels(existing.Labels) { - return fmt.Errorf( - "refusing to reuse ClusterRoleBinding %s which is not managed by nvcf-cli; "+ - "remove it or run against a cluster where the name is free", name) - } - // Ours, but from an older CLI whose RoleRef or subjects differ. RoleRef - // is immutable, so replace rather than update. - if !clusterRoleBindingMatches(existing, crb) { - if delErr := client.RbacV1().ClusterRoleBindings().Delete(ctx, name, metav1.DeleteOptions{}); delErr != nil && - !apierrors.IsNotFound(delErr) { - return fmt.Errorf("replace stale cluster role binding: %w", delErr) - } - if _, cErr := client.RbacV1().ClusterRoleBindings().Create(ctx, crb, metav1.CreateOptions{}); cErr != nil { - return fmt.Errorf("recreate cluster role binding: %w", cErr) - } - } + return fmt.Errorf("create cluster role binding: %w", err) } return nil } -// clusterRoleBindingMatches reports whether an existing binding already grants -// exactly what we intend: the same ClusterRole, to the same single subject. -func clusterRoleBindingMatches(existing, want *rbacv1.ClusterRoleBinding) bool { - if existing.RoleRef != want.RoleRef { - return false - } - if len(existing.Subjects) != len(want.Subjects) { - return false - } - for i := range want.Subjects { - if existing.Subjects[i] != want.Subjects[i] { - return false - } - } - return true -} - func clusterValidatorLabels() map[string]string { return map[string]string{ "app.kubernetes.io/name": clusterValidatorAppLabel, @@ -394,8 +338,44 @@ func validatorConfigNameForRole(role string) string { // --no-cleanup is not set) to close the window where the elevated ClusterRole // exists. The next run recreates them via ensureClusterValidatorRBAC. // Errors are swallowed: stale RBAC is preferable to failing the result. -func sweepClusterValidatorRBAC(ctx context.Context, client kubernetes.Interface, role string) { - name := clusterValidatorRBACName(role) +// sweepOrphanClusterValidatorRBAC removes validator RBAC left behind by a run +// that died before its deferred cleanup (SIGKILL, OOM, lost terminal). +// +// Needed because the names are random per run: a fixed name self-healed by +// being reused, these would accumulate. Only objects carrying our labels and +// older than the TTL are removed, so a concurrent run is never disturbed. +func sweepOrphanClusterValidatorRBAC(ctx context.Context, client kubernetes.Interface, ttl time.Duration) { + selector := fmt.Sprintf("app.kubernetes.io/name=%s,app.kubernetes.io/managed-by=nvcf-cli", + clusterValidatorAppLabel) + cutoff := time.Now().Add(-ttl) + opts := metav1.ListOptions{LabelSelector: selector} + + if l, err := client.RbacV1().ClusterRoleBindings().List(ctx, opts); err == nil { + for i := range l.Items { + if o := &l.Items[i]; o.CreationTimestamp.Before(&metav1.Time{Time: cutoff}) { + _ = client.RbacV1().ClusterRoleBindings().Delete(ctx, o.Name, metav1.DeleteOptions{}) + } + } + } + if l, err := client.RbacV1().ClusterRoles().List(ctx, opts); err == nil { + for i := range l.Items { + if o := &l.Items[i]; o.CreationTimestamp.Before(&metav1.Time{Time: cutoff}) { + _ = client.RbacV1().ClusterRoles().Delete(ctx, o.Name, metav1.DeleteOptions{}) + } + } + } + sa := client.CoreV1().ServiceAccounts(clusterValidatorNamespace) + if l, err := sa.List(ctx, opts); err == nil { + for i := range l.Items { + if o := &l.Items[i]; o.CreationTimestamp.Before(&metav1.Time{Time: cutoff}) { + _ = sa.Delete(ctx, o.Name, metav1.DeleteOptions{}) + } + } + } +} + +func sweepClusterValidatorRBAC(ctx context.Context, client kubernetes.Interface, role, runID string) { + name := clusterValidatorRBACName(role, runID) // Delete by name, but only what we own. These are cluster-scoped objects // and the errors here are swallowed, so an operator-owned ClusterRole with @@ -466,17 +446,36 @@ const clusterValidatorNoConfigName = "cluster-validator-no-config" const clusterValidatorRoleLabel = "nvcf.nvidia.com/validator-role" // clusterValidatorRBACName returns the ServiceAccount / ClusterRole / -// ClusterRoleBinding name for a role. +// ClusterRoleBinding name for one run of one role. +// +// The runID is random per run, which is what makes the name safe to create. +// A predictable name can be squatted: the managed labels are three public +// constants, so anyone who can create a ServiceAccount in the probe namespace +// could pre-create one carrying them, and a label check alone would then adopt +// it and bind it to the validator ClusterRole. With an unguessable name there +// is no collision to adopt, so the resources are only ever created by us. // -// Per-role names matter because ModeSplit runs both validators concurrently, -// and the two kubecontexts can resolve to the same cluster. With one shared -// name the first run to finish deletes the RBAC out from under the other run's -// pod, which then fails every API call with "forbidden". -func clusterValidatorRBACName(role string) string { - if role == "" { - return clusterValidatorName - } - return clusterValidatorName + "-" + role +// Per-role naming also matters because ModeSplit runs both validators +// concurrently against contexts that can resolve to the same cluster. +func clusterValidatorRBACName(role, runID string) string { + name := clusterValidatorName + if role != "" { + name += "-" + role + } + if runID != "" { + name += "-" + runID + } + return name +} + +// newValidatorRunID returns an unguessable suffix for this run's RBAC names. +// crypto/rand, not math/rand: a predictable value would defeat the point. +func newValidatorRunID() (string, error) { + b := make([]byte, 5) + if _, err := cryptorand.Read(b); err != nil { + return "", fmt.Errorf("generating run id: %w", err) + } + return hex.EncodeToString(b), nil } // controlPlaneValidatorConfigTemplate is the baseline network-check ConfigMap for @@ -586,12 +585,15 @@ func parseRegistryHostPort(s string) (host string, port int) { return s, 443 } if p == "" { - // Trailing colon with no port digit (e.g. "nvcr.io:"). - return h, 443 + // Trailing colon with no port digit (e.g. "nvcr.io:") is the same typo. + return "", 0 } n, err := strconv.Atoi(p) if err != nil || n <= 0 || n > 65535 { - return h, 443 + // An explicit but unparseable port is a typo, not a request for 443. + // Silently probing a different endpoint than configured would report a + // result for something the operator never asked about. + return "", 0 } return h, n } @@ -599,10 +601,10 @@ func parseRegistryHostPort(s string) (host string, port int) { // buildClusterValidatorJob creates the validator Job. PullIfNotPresent reuses // locally-imported images. VALIDATOR_PREFLIGHT=true skips the summary ConfigMap // write. VALIDATOR_ROLE selects the check set (control-plane vs compute-plane). -func buildClusterValidatorJob(name, image, pullSecret, role string, noCleanup bool) *batchv1.Job { +func buildClusterValidatorJob(name, image, pullSecret, role, runID string, noCleanup bool) *batchv1.Job { backoff := int32(0) podSpec := corev1.PodSpec{ - ServiceAccountName: clusterValidatorRBACName(role), + ServiceAccountName: clusterValidatorRBACName(role, runID), RestartPolicy: corev1.RestartPolicyNever, Containers: []corev1.Container{{ Name: clusterValidatorContainer, diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go index 7fd3f22a51..7706dcd866 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go @@ -257,40 +257,6 @@ func TestRunClusterValidator_RBACIdempotent(t *testing.T) { assert.True(t, res.Passed) } -// Regression guard: a ClusterRole left over from an older CLI version must -// be refreshed with the current rule set instead of silently kept stale. -func TestRunClusterValidator_RBACRefreshesClusterRoleRules(t *testing.T) { - oldRules := []rbacv1.PolicyRule{ - {APIGroups: []string{""}, Resources: []string{"nodes"}, Verbs: []string{"get"}}, - } - // Labelled as a prior CLI run would have left it: only a ClusterRole we own - // may have its rules rewritten. - client := fake.NewSimpleClientset(&rbacv1.ClusterRole{ - ObjectMeta: metav1.ObjectMeta{Name: clusterValidatorName, Labels: clusterValidatorLabels()}, - Rules: oldRules, - }) - - var jobName atomic.Value - jobName.Store("") - client.PrependReactor("create", "jobs", func(action ktesting.Action) (bool, runtime.Object, error) { - jobName.Store(action.(ktesting.CreateAction).GetObject().(*batchv1.Job).Name) - return false, nil, nil - }) - client.PrependReactor("get", "jobs", func(action ktesting.Action) (bool, runtime.Object, error) { - return jobSucceededReactor(jobName.Load().(string))(action) - }) - client.PrependReactor("list", "pods", podListReactor("")) - - // noCleanup=true so the ClusterRole is not swept before we inspect it. - res := runClusterValidator(context.Background(), client, "test-image:1.0", "", true, "", nil) - require.NoError(t, res.Err) - - got, err := client.RbacV1().ClusterRoles().Get(context.Background(), clusterValidatorName, metav1.GetOptions{}) - require.NoError(t, err) - assert.Greater(t, len(got.Rules), len(oldRules), - "ClusterRole rules must be refreshed to the current set on each run, not kept stale") -} - // TestEnsureClusterValidatorRBAC_WritableResources verifies that the // bootstrapped ClusterRole grants the write verbs required by enforcement // checks (namespace/pod create+delete), probe log reading (pods/log get), @@ -300,9 +266,10 @@ func TestEnsureClusterValidatorRBAC_WritableResources(t *testing.T) { ctx := context.Background() const role = clusterValidatorControlPlaneRole - require.NoError(t, ensureClusterValidatorRBAC(ctx, client, role)) + const runID = "testrunid" + require.NoError(t, ensureClusterValidatorRBAC(ctx, client, role, runID)) - cr, err := client.RbacV1().ClusterRoles().Get(ctx, clusterValidatorRBACName(role), metav1.GetOptions{}) + cr, err := client.RbacV1().ClusterRoles().Get(ctx, clusterValidatorRBACName(role, runID), metav1.GetOptions{}) require.NoError(t, err) type check struct { @@ -511,7 +478,7 @@ func TestRunClusterValidator_ContextCanceled(t *testing.T) { } func TestBuildClusterValidatorJobShape(t *testing.T) { - job := buildClusterValidatorJob("test-job", "img:1", "", "", false) + job := buildClusterValidatorJob("test-job", "img:1", "", "", "runid", false) assert.Equal(t, "test-job", job.Name) assert.Equal(t, clusterValidatorNamespace, job.Namespace) @@ -528,8 +495,8 @@ func TestBuildClusterValidatorJobShape(t *testing.T) { "IfNotPresent so locally-imported images (k3d image import, kind load) are picked up without a registry pull") assert.Equal(t, corev1.RestartPolicyNever, job.Spec.Template.Spec.RestartPolicy, "validator is a one-shot command, not a long-running service") - assert.Equal(t, clusterValidatorName, job.Spec.Template.Spec.ServiceAccountName, - "pod must run under the CLI-bootstrapped SA, not the namespace default") + assert.Equal(t, clusterValidatorRBACName("", "runid"), job.Spec.Template.Spec.ServiceAccountName, + "pod must run under this run's bootstrapped SA, not the namespace default") labels := job.Labels assert.Equal(t, clusterValidatorAppLabel, labels["app.kubernetes.io/name"]) @@ -548,7 +515,7 @@ func TestBuildClusterValidatorJobShape(t *testing.T) { } func TestBuildClusterValidatorJobShape_ValidatorRoleInEnv(t *testing.T) { - job := buildClusterValidatorJob("test-job", "img:1", "", clusterValidatorControlPlaneRole, false) + job := buildClusterValidatorJob("test-job", "img:1", "", clusterValidatorControlPlaneRole, "runid", false) env := map[string]string{} for _, e := range job.Spec.Template.Spec.Containers[0].Env { env[e.Name] = e.Value @@ -558,19 +525,19 @@ func TestBuildClusterValidatorJobShape_ValidatorRoleInEnv(t *testing.T) { } func TestBuildClusterValidatorJobShape_WithPullSecret(t *testing.T) { - job := buildClusterValidatorJob("test-job", "img:1", "nvcr-pull-secret", "", false) + job := buildClusterValidatorJob("test-job", "img:1", "nvcr-pull-secret", "", "runid", false) require.Len(t, job.Spec.Template.Spec.ImagePullSecrets, 1) assert.Equal(t, "nvcr-pull-secret", job.Spec.Template.Spec.ImagePullSecrets[0].Name) } func TestBuildClusterValidatorJobShape_NoPullSecret(t *testing.T) { - job := buildClusterValidatorJob("test-job", "img:1", "", "", false) + job := buildClusterValidatorJob("test-job", "img:1", "", "", "runid", false) assert.Empty(t, job.Spec.Template.Spec.ImagePullSecrets, "empty pull-secret arg must not produce an empty-name ImagePullSecrets entry") } func TestBuildClusterValidatorJobShape_NoCleanup(t *testing.T) { - job := buildClusterValidatorJob("test-job", "img:1", "", "", true) + job := buildClusterValidatorJob("test-job", "img:1", "", "", "runid", true) assert.Nil(t, job.Spec.TTLSecondsAfterFinished, "--no-cleanup must omit TTLSecondsAfterFinished so the Job persists for debugging") } @@ -670,8 +637,13 @@ func TestParseRegistryHostPort(t *testing.T) { // IPv6: net.SplitHostPort handles bracketed literals correctly. {"[::1]:5000", "::1", 5000}, {"[2001:db8::1]:443", "2001:db8::1", 443}, - // Trailing colon with no digit → default to 443. - {"nvcr.io:", "nvcr.io", 443}, + // An explicit but unusable port is a typo, not a request for 443: + // probing a different endpoint than configured reports a result for + // something the operator never asked about. + {"nvcr.io:", "", 0}, + {"nvcr.io:abc", "", 0}, + {"nvcr.io:0", "", 0}, + {"nvcr.io:70000", "", 0}, } for _, tt := range tests { t.Run(tt.in, func(t *testing.T) { @@ -697,64 +669,6 @@ func alreadyExistsReactor(resource, name string) ktesting.ReactionFunc { } } -// ModeSplit runs both validators concurrently, and the two kubecontexts can -// resolve to the same cluster. With one shared RBAC name the first run to -// finish deletes the ServiceAccount, ClusterRole and binding out from under the -// other run's pod, which then fails every API call with "forbidden". -func TestClusterValidatorRBAC_IsScopedPerRole(t *testing.T) { - client := fake.NewSimpleClientset() - ctx := context.Background() - - cpName := clusterValidatorRBACName(clusterValidatorControlPlaneRole) - gpuName := clusterValidatorRBACName("compute-plane") - require.NotEqual(t, cpName, gpuName, "each role needs its own RBAC identity") - - require.NoError(t, ensureClusterValidatorRBAC(ctx, client, clusterValidatorControlPlaneRole)) - require.NoError(t, ensureClusterValidatorRBAC(ctx, client, "compute-plane")) - - // Sweeping one role must leave the other's RBAC intact. - sweepClusterValidatorRBAC(ctx, client, clusterValidatorControlPlaneRole) - - _, err := client.RbacV1().ClusterRoles().Get(ctx, cpName, metav1.GetOptions{}) - assert.True(t, apierrors.IsNotFound(err), "the swept role's ClusterRole must be gone") - - _, err = client.RbacV1().ClusterRoles().Get(ctx, gpuName, metav1.GetOptions{}) - assert.NoError(t, err, "the other role's ClusterRole must survive") - - _, err = client.CoreV1().ServiceAccounts(clusterValidatorNamespace).Get(ctx, gpuName, metav1.GetOptions{}) - assert.NoError(t, err, "the other role's ServiceAccount must survive") -} - -// A ClusterRole is a cluster-scoped privilege object. An operator-owned one with -// a colliding name must not have its rules rewritten, and the sweep must not -// delete it. -func TestClusterValidatorRBAC_RefusesUnmanagedClusterRole(t *testing.T) { - ctx := context.Background() - const role = clusterValidatorControlPlaneRole - name := clusterValidatorRBACName(role) - - operatorRules := []rbacv1.PolicyRule{ - {APIGroups: []string{""}, Resources: []string{"pods"}, Verbs: []string{"get"}}, - } - client := fake.NewSimpleClientset(&rbacv1.ClusterRole{ - ObjectMeta: metav1.ObjectMeta{Name: name, Labels: map[string]string{"owner": "operator"}}, - Rules: operatorRules, - }) - - err := ensureClusterValidatorRBAC(ctx, client, role) - require.Error(t, err, "an unmanaged ClusterRole must not be rewritten") - assert.Contains(t, err.Error(), "not managed by nvcf-cli") - - got, getErr := client.RbacV1().ClusterRoles().Get(ctx, name, metav1.GetOptions{}) - require.NoError(t, getErr) - assert.Equal(t, operatorRules, got.Rules, "the operator's rules must be untouched") - - // The sweep must leave it alone too, even though it matches by name. - sweepClusterValidatorRBAC(ctx, client, role) - _, getErr = client.RbacV1().ClusterRoles().Get(ctx, name, metav1.GetOptions{}) - assert.NoError(t, getErr, "the sweep must not delete a ClusterRole it does not own") -} - // The same invariant for the network-check ConfigMap. func TestEnsureClusterValidatorConfig_RefusesUnmanagedConfigMap(t *testing.T) { ctx := context.Background() @@ -778,77 +692,91 @@ func TestEnsureClusterValidatorConfig_RefusesUnmanagedConfigMap(t *testing.T) { "the operator's ConfigMap content must be untouched") } -// An attacker who can create a ServiceAccount in the probe namespace could -// pre-create one under the generated name. Blindly tolerating AlreadyExists -// would then bind that account to the validator ClusterRole, handing whoever -// controls it cluster-wide create/delete on namespaces, pods and daemonsets. -func TestClusterValidatorRBAC_RefusesUnmanagedServiceAccount(t *testing.T) { +// The managed labels are three public constants, so a label check alone cannot +// establish ownership: anyone able to create a ServiceAccount in the probe +// namespace could stamp them. Safety comes from the name being unguessable, so +// there is no predictable object to pre-create and get bound to the validator's +// cluster-wide permissions. +func TestClusterValidatorRBACName_IsUnpredictableAndPerRun(t *testing.T) { + a, err := newValidatorRunID() + require.NoError(t, err) + b, err := newValidatorRunID() + require.NoError(t, err) + + assert.NotEqual(t, a, b, "each run must get a distinct identity") + assert.NotEmpty(t, a) + + const role = clusterValidatorControlPlaneRole + assert.NotEqual(t, clusterValidatorRBACName(role, a), clusterValidatorRBACName(role, b), + "RBAC names must differ per run") + assert.NotEqual(t, clusterValidatorRBACName(role, a), clusterValidatorRBACName("compute-plane", a), + "RBAC names must differ per role within a run") +} + +// Nothing pre-existing is adopted: creation is unconditional, so a squatted +// object surfaces as an error rather than being bound to our ClusterRole. +func TestEnsureClusterValidatorRBAC_DoesNotAdoptExistingObjects(t *testing.T) { ctx := context.Background() const role = clusterValidatorControlPlaneRole - name := clusterValidatorRBACName(role) + const runID = "collide" + name := clusterValidatorRBACName(role, runID) + // Forged managed labels: a label check alone would have adopted this. client := fake.NewSimpleClientset(&corev1.ServiceAccount{ ObjectMeta: metav1.ObjectMeta{ - Name: name, Namespace: clusterValidatorNamespace, - Labels: map[string]string{"owner": "someone-else"}, + Name: name, Namespace: clusterValidatorNamespace, Labels: clusterValidatorLabels(), }, }) - err := ensureClusterValidatorRBAC(ctx, client, role) - require.Error(t, err, "an unowned ServiceAccount must not be adopted") - assert.Contains(t, err.Error(), "not managed by nvcf-cli") + err := ensureClusterValidatorRBAC(ctx, client, role, runID) + require.Error(t, err, "a pre-existing object must not be adopted, forged labels or not") _, bindErr := client.RbacV1().ClusterRoleBindings().Get(ctx, name, metav1.GetOptions{}) assert.True(t, apierrors.IsNotFound(bindErr), - "no ClusterRoleBinding may be created for a ServiceAccount we do not own") + "no binding may be created when the ServiceAccount was not created by this run") } -// A pre-existing ClusterRoleBinding under our name may bind subjects we never -// intended, or point at a different role. It must not be silently reused. -func TestClusterValidatorRBAC_RefusesUnmanagedClusterRoleBinding(t *testing.T) { +// Random names cannot self-heal by being reused next run, so leftovers from a +// killed run are reclaimed by age. A fresh one must survive: it may belong to a +// run happening right now. +func TestSweepOrphanClusterValidatorRBAC_AgeScoped(t *testing.T) { ctx := context.Background() - const role = clusterValidatorControlPlaneRole - name := clusterValidatorRBACName(role) + old := metav1.NewTime(time.Now().Add(-2 * time.Hour)) + now := metav1.NewTime(time.Now()) - client := fake.NewSimpleClientset(&rbacv1.ClusterRoleBinding{ - ObjectMeta: metav1.ObjectMeta{Name: name, Labels: map[string]string{"owner": "someone-else"}}, - Subjects: []rbacv1.Subject{{ - Kind: rbacv1.ServiceAccountKind, Name: "attacker-sa", Namespace: "default", + client := fake.NewSimpleClientset( + &rbacv1.ClusterRole{ObjectMeta: metav1.ObjectMeta{ + Name: "stale", Labels: clusterValidatorLabels(), CreationTimestamp: old, }}, - RoleRef: rbacv1.RoleRef{APIGroup: rbacv1.GroupName, Kind: "ClusterRole", Name: "cluster-admin"}, - }) - - err := ensureClusterValidatorRBAC(ctx, client, role) - require.Error(t, err, "an unowned ClusterRoleBinding must not be reused") - assert.Contains(t, err.Error(), "not managed by nvcf-cli") + &rbacv1.ClusterRole{ObjectMeta: metav1.ObjectMeta{ + Name: "fresh", Labels: clusterValidatorLabels(), CreationTimestamp: now, + }}, + &rbacv1.ClusterRole{ObjectMeta: metav1.ObjectMeta{ + Name: "theirs", Labels: map[string]string{"owner": "operator"}, CreationTimestamp: old, + }}, + ) - got, getErr := client.RbacV1().ClusterRoleBindings().Get(ctx, name, metav1.GetOptions{}) - require.NoError(t, getErr) - assert.Equal(t, "attacker-sa", got.Subjects[0].Name, "the existing binding must be left untouched") -} + sweepOrphanClusterValidatorRBAC(ctx, client, orphanValidatorRBACTTL) -// A binding we own but from an older CLI can point at a stale RoleRef, which is -// immutable, so it has to be replaced rather than updated. -func TestClusterValidatorRBAC_ReplacesOwnedBindingWithStaleRoleRef(t *testing.T) { - ctx := context.Background() - const role = clusterValidatorControlPlaneRole - name := clusterValidatorRBACName(role) + _, err := client.RbacV1().ClusterRoles().Get(ctx, "stale", metav1.GetOptions{}) + assert.True(t, apierrors.IsNotFound(err), "a leftover past the TTL must be reclaimed") - client := fake.NewSimpleClientset( - &rbacv1.ClusterRoleBinding{ - ObjectMeta: metav1.ObjectMeta{Name: name, Labels: clusterValidatorLabels()}, - Subjects: []rbacv1.Subject{{ - Kind: rbacv1.ServiceAccountKind, Name: "old-name", Namespace: clusterValidatorNamespace, - }}, - RoleRef: rbacv1.RoleRef{APIGroup: rbacv1.GroupName, Kind: "ClusterRole", Name: "old-role"}, - }, - ) + _, err = client.RbacV1().ClusterRoles().Get(ctx, "fresh", metav1.GetOptions{}) + assert.NoError(t, err, "a recent one may belong to a concurrent run") - require.NoError(t, ensureClusterValidatorRBAC(ctx, client, role)) + _, err = client.RbacV1().ClusterRoles().Get(ctx, "theirs", metav1.GetOptions{}) + assert.NoError(t, err, "an unlabelled ClusterRole is not ours to delete") +} - got, err := client.RbacV1().ClusterRoleBindings().Get(ctx, name, metav1.GetOptions{}) - require.NoError(t, err) - assert.Equal(t, name, got.RoleRef.Name, "the stale RoleRef must be replaced with the current one") - require.Len(t, got.Subjects, 1) - assert.Equal(t, name, got.Subjects[0].Name, "the subject must be the current ServiceAccount") +// An explicit but unparseable port is a typo. Silently probing 443 would report +// a result for an endpoint the operator never configured. +func TestParseRegistryHostPort_RejectsMalformedExplicitPort(t *testing.T) { + for _, in := range []string{"registry.example:abc", "registry.example:0", "registry.example:99999", "registry.example:"} { + host, port := parseRegistryHostPort(in) + assert.Empty(t, host, "%q must be rejected, not defaulted", in) + assert.Zero(t, port, "%q must not fall back to a port", in) + } + host, port := parseRegistryHostPort("registry.example") + assert.Equal(t, "registry.example", host, "no explicit port keeps the default") + assert.Equal(t, 443, port) } From cbd2c1ff0105f31989f220fb0c65eb3ced7434ab Mon Sep 17 00:00:00 2001 From: rohithb Date: Tue, 15 Sep 2026 19:11:53 +0530 Subject: [PATCH 24/36] fix(nvcf-cli): require the generated name before deleting any validator resource --- .../internal/selfhosted/clustervalidator.go | 69 ++++++++++++---- .../selfhosted/clustervalidator_test.go | 82 +++++++++++++------ .../internal/selfhosted/pullsecret_test.go | 32 +++++--- 3 files changed, 128 insertions(+), 55 deletions(-) diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go index 314cea3597..4030172ebd 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go @@ -345,21 +345,34 @@ func validatorConfigNameForRole(role string) string { // being reused, these would accumulate. Only objects carrying our labels and // older than the TTL are removed, so a concurrent run is never disturbed. func sweepOrphanClusterValidatorRBAC(ctx context.Context, client kubernetes.Interface, ttl time.Duration) { - selector := fmt.Sprintf("app.kubernetes.io/name=%s,app.kubernetes.io/managed-by=nvcf-cli", + // All three managed labels, not two: the component label is part of what + // identifies these as ours. + selector := fmt.Sprintf("app.kubernetes.io/name=%s,app.kubernetes.io/managed-by=nvcf-cli,app.kubernetes.io/component=preflight", clusterValidatorAppLabel) - cutoff := time.Now().Add(-ttl) opts := metav1.ListOptions{LabelSelector: selector} + cutoff := metav1.Time{Time: time.Now().Add(-ttl)} + + // reclaimable requires the generated name as well as the labels and the + // age. Labels alone are three public constants and can be copied onto + // anything, and this deletes cluster-scoped objects with errors swallowed. + reclaimable := func(o metav1.Object) bool { + if !strings.HasPrefix(o.GetName(), clusterValidatorName) { + return false + } + ts := o.GetCreationTimestamp() + return ts.Before(&cutoff) + } if l, err := client.RbacV1().ClusterRoleBindings().List(ctx, opts); err == nil { for i := range l.Items { - if o := &l.Items[i]; o.CreationTimestamp.Before(&metav1.Time{Time: cutoff}) { + if o := &l.Items[i]; reclaimable(o) { _ = client.RbacV1().ClusterRoleBindings().Delete(ctx, o.Name, metav1.DeleteOptions{}) } } } if l, err := client.RbacV1().ClusterRoles().List(ctx, opts); err == nil { for i := range l.Items { - if o := &l.Items[i]; o.CreationTimestamp.Before(&metav1.Time{Time: cutoff}) { + if o := &l.Items[i]; reclaimable(o) { _ = client.RbacV1().ClusterRoles().Delete(ctx, o.Name, metav1.DeleteOptions{}) } } @@ -367,7 +380,7 @@ func sweepOrphanClusterValidatorRBAC(ctx context.Context, client kubernetes.Inte sa := client.CoreV1().ServiceAccounts(clusterValidatorNamespace) if l, err := sa.List(ctx, opts); err == nil { for i := range l.Items { - if o := &l.Items[i]; o.CreationTimestamp.Before(&metav1.Time{Time: cutoff}) { + if o := &l.Items[i]; reclaimable(o) { _ = sa.Delete(ctx, o.Name, metav1.DeleteOptions{}) } } @@ -399,14 +412,22 @@ func sweepClusterValidatorRBAC(ctx context.Context, client kubernetes.Interface, func sweepPriorClusterValidatorJobs(ctx context.Context, client kubernetes.Interface, role string) { // Scope to this role: in ModeSingle both roles run against the same // cluster, so an unscoped selector deletes the other role's Job mid-command. - selector := fmt.Sprintf("app.kubernetes.io/name=%s,app.kubernetes.io/managed-by=nvcf-cli,%s=%s", - clusterValidatorAppLabel, clusterValidatorRoleLabel, role) + // + // List-then-delete rather than DeleteCollection: the name has to be checked + // too, which a collection selector cannot express, and the labels alone are + // public constants that anything could carry. + jobs := client.BatchV1().Jobs(clusterValidatorNamespace) + l, err := jobs.List(ctx, metav1.ListOptions{LabelSelector: validatorRoleSelector(role)}) + if err != nil { + return + } propagation := metav1.DeletePropagationBackground - _ = client.BatchV1().Jobs(clusterValidatorNamespace).DeleteCollection( - ctx, - metav1.DeleteOptions{PropagationPolicy: &propagation}, - metav1.ListOptions{LabelSelector: selector}, - ) + for i := range l.Items { + if !strings.HasPrefix(l.Items[i].Name, clusterValidatorName) { + continue + } + _ = jobs.Delete(ctx, l.Items[i].Name, metav1.DeleteOptions{PropagationPolicy: &propagation}) + } } // sweepManagedPullSecrets removes any docker-registry secrets in @@ -418,13 +439,25 @@ func sweepPriorClusterValidatorJobs(ctx context.Context, client kubernetes.Inter // labeled by us and are skipped by the selector. Errors are swallowed: // failing to clean up is preferable to failing the check itself. func sweepManagedPullSecrets(ctx context.Context, client kubernetes.Interface, role string) { - selector := fmt.Sprintf("app.kubernetes.io/name=%s,app.kubernetes.io/managed-by=nvcf-cli,%s=%s", + // Same reasoning as sweepPriorClusterValidatorJobs: the generated name is + // part of the ownership test, not just the labels. + secrets := client.CoreV1().Secrets(clusterValidatorNamespace) + l, err := secrets.List(ctx, metav1.ListOptions{LabelSelector: validatorRoleSelector(role)}) + if err != nil { + return + } + for i := range l.Items { + if !strings.HasPrefix(l.Items[i].Name, validatorPullSecretName) { + continue + } + _ = secrets.Delete(ctx, l.Items[i].Name, metav1.DeleteOptions{}) + } +} + +// validatorRoleSelector matches objects this CLI created for one validator role. +func validatorRoleSelector(role string) string { + return fmt.Sprintf("app.kubernetes.io/name=%s,app.kubernetes.io/managed-by=nvcf-cli,app.kubernetes.io/component=preflight,%s=%s", clusterValidatorAppLabel, clusterValidatorRoleLabel, role) - _ = client.CoreV1().Secrets(clusterValidatorNamespace).DeleteCollection( - ctx, - metav1.DeleteOptions{}, - metav1.ListOptions{LabelSelector: selector}, - ) } // clusterValidatorControlPlaneRole is the role value passed as VALIDATOR_ROLE diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go index 7706dcd866..c6c2114d51 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go @@ -99,15 +99,6 @@ func podListReactor(waitingReason string) ktesting.ReactionFunc { } } -func hasActionPrefix(actions []ktesting.Action, verb, resource string) bool { - for _, a := range actions { - if a.GetVerb() == verb && a.GetResource().Resource == resource { - return true - } - } - return false -} - func TestRunClusterValidator_EmptyImage(t *testing.T) { // In normal flow the caller gates on a configured image, so this // branch is defensive. Verify it returns a clear error and makes @@ -174,19 +165,20 @@ func TestRunClusterValidator_HappyPath(t *testing.T) { assert.Equal(t, int32(0), res.ExitCode) assert.NotEmpty(t, res.JobName, "JobName must be populated so operators can read logs after the run") - // Sweep must run before create so the singleton invariant holds. + // Sweep must run before create so the singleton invariant holds. The sweep + // lists rather than issuing a DeleteCollection, because the generated name + // has to be checked too and a collection selector cannot express that. actions := client.Actions() - require.True(t, hasActionPrefix(actions, "delete-collection", "jobs"), - "runClusterValidator must sweep prior Jobs before creating the new one") var sweepIdx, createIdx = -1, -1 for i, a := range actions { - if a.GetVerb() == "delete-collection" && a.GetResource().Resource == "jobs" && sweepIdx == -1 { + if a.GetVerb() == "list" && a.GetResource().Resource == "jobs" && sweepIdx == -1 { sweepIdx = i } if a.GetVerb() == "create" && a.GetResource().Resource == "jobs" && createIdx == -1 { createIdx = i } } + require.NotEqual(t, -1, sweepIdx, "runClusterValidator must sweep prior Jobs before creating the new one") assert.Less(t, sweepIdx, createIdx, "sweep must precede create in action sequence") } @@ -737,35 +729,41 @@ func TestEnsureClusterValidatorRBAC_DoesNotAdoptExistingObjects(t *testing.T) { } // Random names cannot self-heal by being reused next run, so leftovers from a -// killed run are reclaimed by age. A fresh one must survive: it may belong to a -// run happening right now. -func TestSweepOrphanClusterValidatorRBAC_AgeScoped(t *testing.T) { +// killed run are reclaimed by age. Two things must survive: anything recent +// (it may belong to a run happening right now) and anything whose name is not +// one we generate, even when it carries our labels. Those labels are three +// public constants, so they can be copied onto anything. +func TestSweepOrphanClusterValidatorRBAC_RequiresNameLabelsAndAge(t *testing.T) { ctx := context.Background() old := metav1.NewTime(time.Now().Add(-2 * time.Hour)) now := metav1.NewTime(time.Now()) + staleName := clusterValidatorRBACName(clusterValidatorControlPlaneRole, "deadbeef01") + freshName := clusterValidatorRBACName("compute-plane", "cafebabe02") client := fake.NewSimpleClientset( &rbacv1.ClusterRole{ObjectMeta: metav1.ObjectMeta{ - Name: "stale", Labels: clusterValidatorLabels(), CreationTimestamp: old, + Name: staleName, Labels: clusterValidatorLabels(), CreationTimestamp: old, }}, &rbacv1.ClusterRole{ObjectMeta: metav1.ObjectMeta{ - Name: "fresh", Labels: clusterValidatorLabels(), CreationTimestamp: now, + Name: freshName, Labels: clusterValidatorLabels(), CreationTimestamp: now, }}, + // Our labels, but not a name we generate: an operator copying the + // labels onto their own ClusterRole must not have it deleted. &rbacv1.ClusterRole{ObjectMeta: metav1.ObjectMeta{ - Name: "theirs", Labels: map[string]string{"owner": "operator"}, CreationTimestamp: old, + Name: "operator-owned-role", Labels: clusterValidatorLabels(), CreationTimestamp: old, }}, ) sweepOrphanClusterValidatorRBAC(ctx, client, orphanValidatorRBACTTL) - _, err := client.RbacV1().ClusterRoles().Get(ctx, "stale", metav1.GetOptions{}) - assert.True(t, apierrors.IsNotFound(err), "a leftover past the TTL must be reclaimed") + _, err := client.RbacV1().ClusterRoles().Get(ctx, staleName, metav1.GetOptions{}) + assert.True(t, apierrors.IsNotFound(err), "a generated name past the TTL must be reclaimed") - _, err = client.RbacV1().ClusterRoles().Get(ctx, "fresh", metav1.GetOptions{}) + _, err = client.RbacV1().ClusterRoles().Get(ctx, freshName, metav1.GetOptions{}) assert.NoError(t, err, "a recent one may belong to a concurrent run") - _, err = client.RbacV1().ClusterRoles().Get(ctx, "theirs", metav1.GetOptions{}) - assert.NoError(t, err, "an unlabelled ClusterRole is not ours to delete") + _, err = client.RbacV1().ClusterRoles().Get(ctx, "operator-owned-role", metav1.GetOptions{}) + assert.NoError(t, err, "matching labels alone must not authorize deleting someone else's object") } // An explicit but unparseable port is a typo. Silently probing 443 would report @@ -780,3 +778,39 @@ func TestParseRegistryHostPort_RejectsMalformedExplicitPort(t *testing.T) { assert.Equal(t, "registry.example", host, "no explicit port keeps the default") assert.Equal(t, 443, port) } + +// The prior-run Job sweep deletes by label plus generated name. Labels alone +// are three public constants, so a Job carrying them under an unrelated name is +// not ours to delete. +func TestSweepPriorClusterValidatorJobs_RequiresGeneratedName(t *testing.T) { + ctx := context.Background() + const role = clusterValidatorControlPlaneRole + ours := clusterValidatorName + "-1700000000" + + client := fake.NewSimpleClientset( + &batchv1.Job{ObjectMeta: metav1.ObjectMeta{ + Name: ours, Namespace: clusterValidatorNamespace, + Labels: clusterValidatorRoleLabels(role), + }}, + &batchv1.Job{ObjectMeta: metav1.ObjectMeta{ + Name: "operator-owned-job", Namespace: clusterValidatorNamespace, + Labels: clusterValidatorRoleLabels(role), + }}, + &batchv1.Job{ObjectMeta: metav1.ObjectMeta{ + Name: clusterValidatorName + "-9999999999", Namespace: clusterValidatorNamespace, + Labels: clusterValidatorRoleLabels("compute-plane"), + }}, + ) + + sweepPriorClusterValidatorJobs(ctx, client, role) + + jobs := client.BatchV1().Jobs(clusterValidatorNamespace) + _, err := jobs.Get(ctx, ours, metav1.GetOptions{}) + assert.True(t, apierrors.IsNotFound(err), "this role's prior Job must be swept") + + _, err = jobs.Get(ctx, "operator-owned-job", metav1.GetOptions{}) + assert.NoError(t, err, "matching labels alone must not authorize deleting someone else's Job") + + _, err = jobs.Get(ctx, clusterValidatorName+"-9999999999", metav1.GetOptions{}) + assert.NoError(t, err, "the other role's Job must survive") +} diff --git a/src/clis/nvcf-cli/internal/selfhosted/pullsecret_test.go b/src/clis/nvcf-cli/internal/selfhosted/pullsecret_test.go index 80aa267b6a..80cc3b3ae8 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/pullsecret_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/pullsecret_test.go @@ -422,29 +422,35 @@ func TestResolveValidatorPullSecret_UnparsableImage(t *testing.T) { // Job is still pulling, which the kubelet reports as // FailedToRetrieveImagePullSecret. // -// The sweep is asserted through a reactor rather than by observing deletions: -// the fake clientset implements DeleteCollection as a no-op, so a state-based -// assertion here would pass whatever the selector said. +// State-assertable now that the sweep lists and deletes individually; the fake +// clientset implements DeleteCollection as a no-op. func TestManagedPullSecret_IsScopedPerRole(t *testing.T) { ctx := context.Background() - cpName := validatorPullSecretRoleName(clusterValidatorControlPlaneRole) gpuName := validatorPullSecretRoleName("compute-plane") require.NotEqual(t, cpName, gpuName, "each role needs its own managed pull secret") + cfg := dockerConfigBlob(t, "private.registry.test", "user", "pass") client := fake.NewSimpleClientset() - var gotSelector string - client.PrependReactor("delete-collection", "secrets", - func(action ktesting.Action) (bool, runtime.Object, error) { - gotSelector = action.(ktesting.DeleteCollectionAction). - GetListRestrictions().Labels.String() - return true, nil, nil - }) + require.NoError(t, writeDockerConfigSecret(ctx, client, clusterValidatorNamespace, + cpName, clusterValidatorControlPlaneRole, cfg)) + require.NoError(t, writeDockerConfigSecret(ctx, client, clusterValidatorNamespace, + gpuName, "compute-plane", cfg)) + // Our labels, but not a name we generate: must survive. + require.NoError(t, writeDockerConfigSecret(ctx, client, clusterValidatorNamespace, + "operator-owned-secret", clusterValidatorControlPlaneRole, cfg)) sweepManagedPullSecrets(ctx, client, clusterValidatorControlPlaneRole) - assert.Contains(t, gotSelector, clusterValidatorRoleLabel+"="+clusterValidatorControlPlaneRole, - "the sweep must select on the role so it cannot delete the other role's secret") + secrets := client.CoreV1().Secrets(clusterValidatorNamespace) + _, err := secrets.Get(ctx, cpName, metav1.GetOptions{}) + assert.True(t, apierrors.IsNotFound(err), "this role's managed secret must be swept") + + _, err = secrets.Get(ctx, gpuName, metav1.GetOptions{}) + assert.NoError(t, err, "the other role's secret must survive") + + _, err = secrets.Get(ctx, "operator-owned-secret", metav1.GetOptions{}) + assert.NoError(t, err, "matching labels alone must not authorize deleting someone else's secret") } // The managed labels a created secret carries must satisfy the sweep selector From ca3a28c6030347482bcc212ac3503b721511769f Mon Sep 17 00:00:00 2001 From: rohithb Date: Tue, 15 Sep 2026 19:32:38 +0530 Subject: [PATCH 25/36] refactor(nvcf-cli): derive validator label selectors from the managed label maps --- .../nvcf-cli/internal/selfhosted/BUILD.bazel | 1 + .../internal/selfhosted/clustervalidator.go | 23 ++++++++++--------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/clis/nvcf-cli/internal/selfhosted/BUILD.bazel b/src/clis/nvcf-cli/internal/selfhosted/BUILD.bazel index 8adbcd82e0..730c3ebb46 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/BUILD.bazel +++ b/src/clis/nvcf-cli/internal/selfhosted/BUILD.bazel @@ -46,6 +46,7 @@ go_library( "@io_k8s_api//rbac/v1:rbac", "@io_k8s_apimachinery//pkg/api/errors", "@io_k8s_apimachinery//pkg/apis/meta/v1:meta", + "@io_k8s_apimachinery//pkg/labels", "@io_k8s_client_go//kubernetes", "@io_k8s_client_go//rest", "@io_k8s_client_go//tools/clientcmd", diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go index 4030172ebd..926532b994 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go @@ -34,6 +34,7 @@ import ( rbacv1 "k8s.io/api/rbac/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/labels" "k8s.io/client-go/kubernetes" ) @@ -236,14 +237,14 @@ func runClusterValidator(ctx context.Context, client kubernetes.Interface, image // idempotent via AlreadyExists tolerance. ClusterRole uses update-or-create so // newer CLI versions replace stale rules without the operator needing to delete. func ensureClusterValidatorRBAC(ctx context.Context, client kubernetes.Interface, role, runID string) error { - labels := clusterValidatorRoleLabels(role) + roleLabels := clusterValidatorRoleLabels(role) name := clusterValidatorRBACName(role, runID) sa := &corev1.ServiceAccount{ ObjectMeta: metav1.ObjectMeta{ Name: name, Namespace: clusterValidatorNamespace, - Labels: labels, + Labels: roleLabels, }, } // No AlreadyExists tolerance: the name carries a random per-run suffix, so @@ -254,7 +255,7 @@ func ensureClusterValidatorRBAC(ctx context.Context, client kubernetes.Interface } cr := &rbacv1.ClusterRole{ - ObjectMeta: metav1.ObjectMeta{Name: name, Labels: labels}, + ObjectMeta: metav1.ObjectMeta{Name: name, Labels: roleLabels}, Rules: []rbacv1.PolicyRule{ // Read-only: cluster inventory and configuration. {APIGroups: []string{""}, Resources: []string{"nodes", "configmaps"}, Verbs: []string{"get", "list", "watch"}}, @@ -285,7 +286,7 @@ func ensureClusterValidatorRBAC(ctx context.Context, client kubernetes.Interface } crb := &rbacv1.ClusterRoleBinding{ - ObjectMeta: metav1.ObjectMeta{Name: name, Labels: labels}, + ObjectMeta: metav1.ObjectMeta{Name: name, Labels: roleLabels}, Subjects: []rbacv1.Subject{{ Kind: rbacv1.ServiceAccountKind, Name: name, @@ -345,11 +346,10 @@ func validatorConfigNameForRole(role string) string { // being reused, these would accumulate. Only objects carrying our labels and // older than the TTL are removed, so a concurrent run is never disturbed. func sweepOrphanClusterValidatorRBAC(ctx context.Context, client kubernetes.Interface, ttl time.Duration) { - // All three managed labels, not two: the component label is part of what - // identifies these as ours. - selector := fmt.Sprintf("app.kubernetes.io/name=%s,app.kubernetes.io/managed-by=nvcf-cli,app.kubernetes.io/component=preflight", - clusterValidatorAppLabel) - opts := metav1.ListOptions{LabelSelector: selector} + // Derived from the same map the objects are stamped with, so the selector + // cannot drift from the labels. All three managed labels are required: the + // component label is part of what identifies these as ours. + opts := metav1.ListOptions{LabelSelector: labels.SelectorFromSet(clusterValidatorLabels()).String()} cutoff := metav1.Time{Time: time.Now().Add(-ttl)} // reclaimable requires the generated name as well as the labels and the @@ -455,9 +455,10 @@ func sweepManagedPullSecrets(ctx context.Context, client kubernetes.Interface, r } // validatorRoleSelector matches objects this CLI created for one validator role. +// Derived from clusterValidatorRoleLabels so it cannot drift from the labels +// actually stamped on the objects. func validatorRoleSelector(role string) string { - return fmt.Sprintf("app.kubernetes.io/name=%s,app.kubernetes.io/managed-by=nvcf-cli,app.kubernetes.io/component=preflight,%s=%s", - clusterValidatorAppLabel, clusterValidatorRoleLabel, role) + return labels.SelectorFromSet(clusterValidatorRoleLabels(role)).String() } // clusterValidatorControlPlaneRole is the role value passed as VALIDATOR_ROLE From 46bac78c7357345a1b25d9c8401a3d6dfe344e6e Mon Sep 17 00:00:00 2001 From: rohithb Date: Tue, 15 Sep 2026 20:00:35 +0530 Subject: [PATCH 26/36] fix(nvcf-cli): run split-mode preflight only for the roles the flags target --- src/clis/nvcf-cli/cmd/self_hosted_check.go | 112 +++++++++++------ .../nvcf-cli/cmd/self_hosted_check_test.go | 113 ++++++++++++++++++ .../nvcf-cli/internal/selfhosted/preflight.go | 11 +- 3 files changed, 197 insertions(+), 39 deletions(-) diff --git a/src/clis/nvcf-cli/cmd/self_hosted_check.go b/src/clis/nvcf-cli/cmd/self_hosted_check.go index ce9e436ca7..c87220f74e 100644 --- a/src/clis/nvcf-cli/cmd/self_hosted_check.go +++ b/src/clis/nvcf-cli/cmd/self_hosted_check.go @@ -392,6 +392,32 @@ func controlPlaneIsTargeted(mode kubectx.Mode) bool { return checkControlPlane || checkAll || (checkPre && mode == kubectx.ModeSingle) } +// The *IsVisited pair reports whether a cluster should be contacted at all, +// which is broader than whether its role-specific check set runs. --pre in +// ModeSplit visits both clusters for the shared pre-install checks (stale +// namespaces) without targeting either role, so the targeting predicates alone +// cannot gate the dispatch. In ModeSingle --pre already targets both roles and +// these are equivalent to their *IsTargeted counterparts. +func computePlaneIsVisited(mode kubectx.Mode) bool { + return computePlaneIsTargeted(mode) || checkPre +} + +func controlPlaneIsVisited(mode kubectx.Mode) bool { + return controlPlaneIsTargeted(mode) || checkPre +} + +// withoutHostLocalChecks returns a copy of cfg with the inputs for the checks +// that run on the operator's machine cleared: local tool versions and registry +// credentials. Neither contacts a cluster, so exactly one role invocation must +// carry them. Without this both roles emit the same check IDs, which +// double-counts them in the pass/fail totals and repeats them in --json. +func withoutHostLocalChecks(cfg selfhosted.PreflightConfig) selfhosted.PreflightConfig { + cfg.Tools = nil + cfg.Registries = nil + cfg.RegistryChecker = nil + return cfg +} + // maybeShowClusterValidatorLogs prints the cleaned cluster-validator transcript // to the given writer when --show-logs is set, framed by markers so operators // can find it in mixed CLI output. Silent no-op when: @@ -504,43 +530,61 @@ func runPreflightByRole(ctx context.Context, cfg selfhosted.PreflightConfig, sin cpClusterValidator = newClusterValidatorForSelfHosted() } + // Local tool versions and registry credentials are checked on the + // operator's machine, so they belong to one invocation only. The control + // plane carries them when it runs; otherwise the compute plane does, so + // neither is silently dropped by a compute-plane-only invocation. + runControlPlane := controlPlaneIsVisited(mode) + runComputePlane := computePlaneIsVisited(mode) + cpCfg, gpuCfg := cfg, cfg + if runControlPlane { + gpuCfg = withoutHostLocalChecks(cfg) + } + switch mode { case kubectx.ModeSplit: // Run both roles in parallel; each gets its own kubeconfig context. + // Each dispatch is gated: with only one role selected the other + // cluster is never contacted, so its stale-namespace probe cannot + // report a failure the operator did not ask about. var ( cpResults []selfhosted.CheckResult gpuResults []selfhosted.CheckResult ) eg, egCtx := errgroup.WithContext(ctx) - eg.Go(func() error { - rc := selfhosted.RoleConfig{ - KubeContext: selfHostedControlPlaneContext, - ClusterValidator: cpClusterValidator, - ClusterValidatorImage: clusterValidatorImage, - ClusterValidatorPullSecret: checkClusterValidatorPullSecret, - ClusterValidatorNoCleanup: checkClusterValidatorNoCleanup, - ClusterValidatorRegistries: registries, - StaleNamespaceProber: staleNSProber, - StackDir: localStackDir(selfHostedControlPlaneStack), - } - cpResults = selfhosted.RunPreflightForRole(egCtx, cfg, selfhosted.RoleControlPlane, rc, sink) - return nil - }) - eg.Go(func() error { - rc := selfhosted.RoleConfig{ - KubeContext: selfHostedComputePlaneContext, - SISURL: icmsURL, - InotifyProber: inotifyProber, - ClusterValidator: clusterValidator, - ClusterValidatorImage: clusterValidatorImage, - ClusterValidatorPullSecret: checkClusterValidatorPullSecret, - ClusterValidatorNoCleanup: checkClusterValidatorNoCleanup, - StaleNamespaceProber: staleNSProber, - StackDir: localStackDir(selfHostedComputePlaneStack), - } - gpuResults = selfhosted.RunPreflightForRole(egCtx, cfg, selfhosted.RoleComputePlane, rc, sink) - return nil - }) + if runControlPlane { + eg.Go(func() error { + rc := selfhosted.RoleConfig{ + KubeContext: selfHostedControlPlaneContext, + ClusterValidator: cpClusterValidator, + ClusterValidatorImage: clusterValidatorImage, + ClusterValidatorPullSecret: checkClusterValidatorPullSecret, + ClusterValidatorNoCleanup: checkClusterValidatorNoCleanup, + ClusterValidatorRegistries: registries, + StaleNamespaceProber: staleNSProber, + StackDir: localStackDir(selfHostedControlPlaneStack), + } + cpResults = selfhosted.RunPreflightForRole(egCtx, cpCfg, selfhosted.RoleControlPlane, rc, sink) + return nil + }) + } + if runComputePlane { + eg.Go(func() error { + rc := selfhosted.RoleConfig{ + KubeContext: selfHostedComputePlaneContext, + SISURL: icmsURL, + InotifyProber: inotifyProber, + ClusterValidator: clusterValidator, + ClusterValidatorImage: clusterValidatorImage, + ClusterValidatorPullSecret: checkClusterValidatorPullSecret, + ClusterValidatorNoCleanup: checkClusterValidatorNoCleanup, + StaleNamespaceProber: staleNSProber, + StackDir: localStackDir(selfHostedComputePlaneStack), + } + gpuResults = selfhosted.RunPreflightForRole(egCtx, gpuCfg, selfhosted.RoleComputePlane, rc, sink) + return nil + }) + } _ = eg.Wait() return append(cpResults, gpuResults...) @@ -553,13 +597,13 @@ func runPreflightByRole(ctx context.Context, cfg selfhosted.PreflightConfig, sin // second exec-credential-plugin prompt. staleForControlPlane := staleNSProber staleForComputePlane := staleNSProber - if controlPlaneIsTargeted(mode) { + if runControlPlane { staleForComputePlane = nil } else { staleForControlPlane = nil } - if controlPlaneIsTargeted(mode) { + if runControlPlane { cpRC := selfhosted.RoleConfig{ SISURL: icmsURL, ClusterValidator: cpClusterValidator, @@ -571,9 +615,9 @@ func runPreflightByRole(ctx context.Context, cfg selfhosted.PreflightConfig, sin StackDir: localStackDir(selfHostedControlPlaneStack), } results = append(results, - selfhosted.RunPreflightForRole(ctx, cfg, selfhosted.RoleControlPlane, cpRC, sink)...) + selfhosted.RunPreflightForRole(ctx, cpCfg, selfhosted.RoleControlPlane, cpRC, sink)...) } - if computePlaneIsTargeted(mode) { + if runComputePlane { gpuRC := selfhosted.RoleConfig{ SISURL: icmsURL, InotifyProber: inotifyProber, @@ -585,7 +629,7 @@ func runPreflightByRole(ctx context.Context, cfg selfhosted.PreflightConfig, sin StackDir: localStackDir(selfHostedComputePlaneStack), } results = append(results, - selfhosted.RunPreflightForRole(ctx, cfg, selfhosted.RoleComputePlane, gpuRC, sink)...) + selfhosted.RunPreflightForRole(ctx, gpuCfg, selfhosted.RoleComputePlane, gpuRC, sink)...) } return results } diff --git a/src/clis/nvcf-cli/cmd/self_hosted_check_test.go b/src/clis/nvcf-cli/cmd/self_hosted_check_test.go index 38fed5637d..cca9e83dd9 100644 --- a/src/clis/nvcf-cli/cmd/self_hosted_check_test.go +++ b/src/clis/nvcf-cli/cmd/self_hosted_check_test.go @@ -563,3 +563,116 @@ func parseJSONLLines(t *testing.T, s string) []map[string]any { } return out } + +// TestPlaneIsVisited covers the dispatch predicates, which are broader than +// the targeting predicates: --pre in ModeSplit visits both clusters for the +// shared pre-install checks without targeting either role. Gating the split +// dispatch on the targeting predicates alone would make --pre a no-op there. +func TestPlaneIsVisited(t *testing.T) { + t.Cleanup(func() { + checkPre = false + checkControlPlane = false + checkComputePlane = false + checkAll = false + }) + + tests := []struct { + name string + pre, cp, gpu bool + all bool + mode kubectx.Mode + wantCP bool + wantComputeGP bool + }{ + {"--pre split visits both", true, false, false, false, kubectx.ModeSplit, true, true}, + {"--pre single visits both", true, false, false, false, kubectx.ModeSingle, true, true}, + {"--control-plane split skips compute", false, true, false, false, kubectx.ModeSplit, true, false}, + {"--compute-plane split skips control", false, false, true, false, kubectx.ModeSplit, false, true}, + {"--all split visits both", false, false, false, true, kubectx.ModeSplit, true, true}, + {"--control-plane single skips compute", false, true, false, false, kubectx.ModeSingle, true, false}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + checkPre, checkControlPlane, checkComputePlane, checkAll = tt.pre, tt.cp, tt.gpu, tt.all + assert.Equal(t, tt.wantCP, controlPlaneIsVisited(tt.mode)) + assert.Equal(t, tt.wantComputeGP, computePlaneIsVisited(tt.mode)) + }) + } +} + +// TestCheck_SplitModeControlPlaneOnlySkipsComputeCluster is the regression +// guard for the dispatch gating: in ModeSplit with only --control-plane, the +// compute cluster must not be contacted at all, so no compute-plane-cluster +// category is emitted. +func TestCheck_SplitModeControlPlaneOnlySkipsComputeCluster(t *testing.T) { + t.Cleanup(func() { + selfHostedJSON = false + selfHostedOutput = "text" + checkControlPlane = false + selfHostedControlPlaneContext = "" + selfHostedComputePlaneContext = "" + }) + + var stderr bytes.Buffer + rootCmd.SetErr(&stderr) + rootCmd.SetOut(&bytes.Buffer{}) + + t.Setenv("NVCF_CLI_SELFHOSTED_SKIP_INOTIFY", "1") + rootCmd.SetArgs([]string{"self-hosted", "check", "--control-plane", + "--control-plane-context", "cp-ctx", "--compute-plane-context", "gpu-ctx", + "--skip-cluster-validation", "--json"}) + _ = rootCmd.Execute() + + lines := parseJSONLLines(t, stderr.String()) + require.NotEmpty(t, lines, "expected at least one JSONL line") + + var categories []string + for _, l := range lines[1:] { + if l["event"] == "category_completed" { + if cat, ok := l["category"].(string); ok { + categories = append(categories, cat) + } + } + } + assert.Contains(t, categories, "control-plane-cluster") + assert.NotContains(t, categories, "compute-plane-cluster", + "--control-plane in split mode must not probe the compute cluster") +} + +// TestCheck_HostLocalChecksRunOnce guards against the host-local categories +// being emitted once per role. Local tool versions and registry credentials +// are checked on the operator's machine, so running them for both roles +// repeats the same check IDs in --json and double-counts them in the totals. +func TestCheck_HostLocalChecksRunOnce(t *testing.T) { + t.Cleanup(func() { + selfHostedJSON = false + selfHostedOutput = "text" + checkAll = false + }) + + var stderr bytes.Buffer + rootCmd.SetErr(&stderr) + rootCmd.SetOut(&bytes.Buffer{}) + + t.Setenv("NVCF_CLI_SELFHOSTED_SKIP_INOTIFY", "1") + rootCmd.SetArgs([]string{"self-hosted", "check", "--all", "--skip-cluster-validation", "--json"}) + _ = rootCmd.Execute() + + lines := parseJSONLLines(t, stderr.String()) + require.NotEmpty(t, lines, "expected at least one JSONL line") + + counts := map[string]int{} + for _, l := range lines { + if l["event"] != "check_completed" { + continue + } + if id, ok := l["id"].(string); ok && strings.HasPrefix(id, "local-host-tools-") { + counts[id]++ + } + } + require.NotEmpty(t, counts, "expected local-host-tools checks in the stream") + for id, n := range counts { + assert.Equal(t, 1, n, "check %s emitted %d times", id, n) + } +} diff --git a/src/clis/nvcf-cli/internal/selfhosted/preflight.go b/src/clis/nvcf-cli/internal/selfhosted/preflight.go index 39e1d50d73..86f9d082a0 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/preflight.go +++ b/src/clis/nvcf-cli/internal/selfhosted/preflight.go @@ -352,11 +352,12 @@ func buildCategories(cfg PreflightConfig, role Role, rc RoleConfig) []categorySp } // Registry credential check runs from the operator's machine — no cluster - // contact needed. Gated on role != RoleComputePlane so the category is - // emitted at most once per invocation: in ModeSingle RunPreflightForRole - // is called for RoleControlPlane then RoleComputePlane sequentially; the - // gate ensures no duplicate check_started/check_completed events. - if role != RoleComputePlane && len(cfg.Registries) > 0 && cfg.RegistryChecker != nil { + // contact needed. RunPreflightForRole is called once per role, so the + // caller clears Registries on every role but one to avoid duplicate + // check_started/check_completed events. Deduplicating on the role here + // instead would drop the check entirely when the control plane does not + // run, which is the case for a compute-plane-only invocation. + if len(cfg.Registries) > 0 && cfg.RegistryChecker != nil { out = append(out, buildRegistryCredentialCategory(cfg)) } From 95e5648ca4c4026ee5c2583757d30876c1b3af9c Mon Sep 17 00:00:00 2001 From: rohithb Date: Wed, 16 Sep 2026 00:24:30 +0530 Subject: [PATCH 27/36] fix(nvcf-cli): pin preflight remediation hints to the probed kube context --- .../internal/selfhosted/clustervalidator.go | 8 ++- .../selfhosted/clustervalidator_test.go | 20 ++++++- .../nvcf-cli/internal/selfhosted/preflight.go | 54 +++++++++++++++---- .../selfhosted/stale_namespace_test.go | 32 +++++++++++ 4 files changed, 100 insertions(+), 14 deletions(-) diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go index 926532b994..2d40c79803 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go @@ -814,9 +814,13 @@ func cleanValidatorOutput(raw string) string { return s + "\n" } -func kubectlLogsHint(jobName string) string { +// Pinned to the context the Job was created in: in ModeSplit the two roles +// run against different clusters, so a bare kubectl command resolves to +// whichever context is current and the hint reports "job not found". +func kubectlLogsHint(kubeContext, jobName string) string { if jobName == "" { return "" } - return fmt.Sprintf("kubectl logs -n %s job/%s --tail=-1", clusterValidatorNamespace, jobName) + return fmt.Sprintf("kubectl%s logs -n %s job/%s --tail=-1", + kubectlContextArg(kubeContext), clusterValidatorNamespace, jobName) } diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go index c6c2114d51..3bcc2b9d0d 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go @@ -575,15 +575,31 @@ func TestCleanValidatorOutput_EmptyInput(t *testing.T) { } func TestKubectlLogsHint(t *testing.T) { - got := kubectlLogsHint("nvcf-preflight-validator-12345") + got := kubectlLogsHint("", "nvcf-preflight-validator-12345") assert.Equal(t, "kubectl logs -n default job/nvcf-preflight-validator-12345 --tail=-1", got, ) } +// In ModeSplit the two roles run against different clusters, so the hint has +// to name the context the Job was actually created in. +func TestKubectlLogsHint_PinsContext(t *testing.T) { + got := kubectlLogsHint("gpu-ctx", "nvcf-preflight-validator-12345") + assert.Equal(t, + "kubectl --context gpu-ctx logs -n default job/nvcf-preflight-validator-12345 --tail=-1", + got, + ) +} + +func TestKubectlLogsHint_QuotesContext(t *testing.T) { + got := kubectlLogsHint("my ctx", "nvcf-preflight-validator-12345") + assert.Contains(t, got, "--context 'my ctx'", + "a context name with a space must be quoted so the pasted command does not split it") +} + func TestKubectlLogsHint_EmptyJob(t *testing.T) { - assert.Equal(t, "", kubectlLogsHint(""), + assert.Equal(t, "", kubectlLogsHint("gpu-ctx", ""), "empty jobName must produce empty hint so callers can compose detail without conditionals") } diff --git a/src/clis/nvcf-cli/internal/selfhosted/preflight.go b/src/clis/nvcf-cli/internal/selfhosted/preflight.go index 86f9d082a0..aa27e7c7fa 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/preflight.go +++ b/src/clis/nvcf-cli/internal/selfhosted/preflight.go @@ -593,7 +593,7 @@ func clusterValidatorCheck(cv ClusterValidator, kubeContext, image, pullSecret s Registries: registries, }) r.Logs = result.Logs - r.Detail = clusterValidatorDetail(result.JobName) + r.Detail = clusterValidatorDetail(kubeContext, result.JobName) if result.Err != nil { r.Severity = "warning" @@ -614,8 +614,8 @@ func clusterValidatorCheck(cv ClusterValidator, kubeContext, image, pullSecret s } } -func clusterValidatorDetail(jobName string) string { - hint := kubectlLogsHint(jobName) +func clusterValidatorDetail(kubeContext, jobName string) string { + hint := kubectlLogsHint(kubeContext, jobName) if hint == "" { return "" } @@ -718,6 +718,11 @@ func staleNamespaceCheck(prober StaleNamespaceProber, kubeContext string, namesp emptyShell = append(emptyShell, ns.Name) } } + // Every hint is pinned to the context that was actually probed. + // In split mode the two callers pass different contexts, so a bare + // kubectl command would run against whatever context happens to be + // current, and these hints delete namespaces. + kctl := "kubectl" + kubectlContextArg(kubeContext) var hints []string if len(terminating) > 0 { // spec.finalizers is writable only through the /finalize @@ -726,19 +731,19 @@ func staleNamespaceCheck(prober StaleNamespaceProber, kubeContext string, namesp // --type=merge` prints "patched" and changes nothing. for _, ns := range terminating { hints = append(hints, fmt.Sprintf( - "clear namespace finalizers on %s: kubectl get ns %s -o json | "+ - "jq '.spec.finalizers=[]' | kubectl replace --raw /api/v1/namespaces/%s/finalize -f -", - ns, ns, ns)) + "clear namespace finalizers on %s: %s get ns %s -o json | "+ + "jq '.spec.finalizers=[]' | %s replace --raw /api/v1/namespaces/%s/finalize -f -", + ns, kctl, ns, kctl, ns)) } hints = append(hints, "if it stays Terminating, the deadlock is on objects inside it: "+ - "kubectl api-resources --verbs=list --namespaced -o name | "+ - "xargs -n1 kubectl get -n --show-kind --ignore-not-found") + kctl+" api-resources --verbs=list --namespaced -o name | "+ + "xargs -n1 "+kctl+" get -n --show-kind --ignore-not-found") } if len(emptyShell) > 0 { hints = append(hints, - fmt.Sprintf("inspect and delete empty namespaces: kubectl delete namespace %s", - strings.Join(emptyShell, " "))) + fmt.Sprintf("inspect and delete empty namespaces: %s delete namespace %s", + kctl, strings.Join(emptyShell, " "))) } r.Message = fmt.Sprintf("%d stale namespace(s) detected: %s. To resolve: %s", len(stale), strings.Join(parts, ", "), strings.Join(hints, "; ")) @@ -747,6 +752,35 @@ func staleNamespaceCheck(prober StaleNamespaceProber, kubeContext string, namesp } } +// kubectlContextArg renders the probed context as a --context flag for the +// remediation hints, or "" when no explicit context was given so the hint stays +// readable for a single-cluster setup. The value is shell-quoted: a context +// name is operator-supplied and arbitrary. +func kubectlContextArg(kubeContext string) string { + if kubeContext == "" { + return "" + } + return " --context " + shellQuoteArg(kubeContext) +} + +// shellQuoteArg makes s safe to paste into a shell. Unquoted when it holds only +// characters no shell treats specially, so the common case stays legible. +func shellQuoteArg(s string) string { + if s == "" { + return "''" + } + safe := strings.IndexFunc(s, func(r rune) bool { + return !(r == '-' || r == '_' || r == '.' || r == '/' || r == ':' || r == '@' || r == '=' || + (r >= '0' && r <= '9') || + (r >= 'A' && r <= 'Z') || + (r >= 'a' && r <= 'z')) + }) == -1 + if safe { + return s + } + return "'" + strings.ReplaceAll(s, "'", "'\"'\"'") + "'" +} + // placeholderCheck returns a binaryCheckSpec that emits a passing "info" // CheckResult with the given message. Used until M3/M+10 cluster-side probes ship. func placeholderCheck(id, label, message string) binaryCheckSpec { diff --git a/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go index 5f20baf0d2..2f21a76048 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go @@ -20,6 +20,7 @@ package selfhosted import ( "context" "fmt" + "strings" "testing" "github.com/stretchr/testify/assert" @@ -274,3 +275,34 @@ func TestControlPlaneNamespaceList_ExcludesRuntimeOwnedNamespaces(t *testing.T) assert.NotContains(t, nvcfComputePlaneNamespaces, "nvca-system", "nvca-system is operator-created and hosts no release") } + +// TestStaleNamespaceCheck_HintsPinTheProbedContext guards the remediation +// hints in split mode. The two callers probe different clusters, so a bare +// kubectl command in a hint runs against whatever context is current, and +// these hints delete namespaces. +func TestStaleNamespaceCheck_HintsPinTheProbedContext(t *testing.T) { + prober := func(_ context.Context, _ string, _ []string) ([]StaleNamespace, error) { + return []StaleNamespace{ + {Name: "nvcf", Reason: "stuck Terminating"}, + {Name: "api-keys", Reason: "no Helm release"}, + }, nil + } + r := staleNamespaceCheck(prober, "cp-ctx", []string{"nvcf", "api-keys"}).Run(context.Background()) + + // Every kubectl invocation, including the one piped into xargs, has to + // carry the flag: one unpinned command is enough to hit the wrong cluster. + for _, cmd := range strings.Split(r.Message, "kubectl ")[1:] { + assert.True(t, strings.HasPrefix(cmd, "--context cp-ctx "), + "unpinned kubectl invocation in hint: kubectl %s", cmd) + } + assert.Contains(t, r.Message, "kubectl --context cp-ctx delete namespace api-keys") +} + +func TestStaleNamespaceCheck_HintsQuoteTheContext(t *testing.T) { + prober := func(_ context.Context, _ string, _ []string) ([]StaleNamespace, error) { + return []StaleNamespace{{Name: "nvcf", Reason: "no Helm release"}}, nil + } + r := staleNamespaceCheck(prober, "my ctx", []string{"nvcf"}).Run(context.Background()) + assert.Contains(t, r.Message, "--context 'my ctx' delete namespace nvcf", + "a context name with a space must be quoted so the pasted command does not split it") +} From ef693a47a5efd04f046dff13715602bee56dd5bf Mon Sep 17 00:00:00 2001 From: rohithb Date: Wed, 16 Sep 2026 00:24:30 +0530 Subject: [PATCH 28/36] docs(nvcf-cli): document the cluster-validator check flags and registry list --- .../nvcf-self-managed-cli/reference/flags.md | 29 + src/clis/nvcf-cli/.nvcf-cli.yaml.template | 20 +- .../agentskill/skilldata_generated.go | 7113 +++++++++-------- 3 files changed, 3624 insertions(+), 3538 deletions(-) diff --git a/ai-tooling/user/skills/nvcf-self-managed-cli/reference/flags.md b/ai-tooling/user/skills/nvcf-self-managed-cli/reference/flags.md index ca093b8da5..ca329b2743 100644 --- a/ai-tooling/user/skills/nvcf-self-managed-cli/reference/flags.md +++ b/ai-tooling/user/skills/nvcf-self-managed-cli/reference/flags.md @@ -26,6 +26,35 @@ | `--icms-url URL` | Public ICMS URL; required when contexts differ | derived from `base_http_url` | | `--local-only` | `check --pre` only; skip all kubectl contact | `false` | +## `check`-specific + +At least one of `--pre`, `--control-plane`, `--compute-plane`, or `--all` is +required. Each selects a role; only the selected roles contact a cluster. + +| Flag | Purpose | Default | +|---|---|---| +| `--pre` | Pre-flight: local-host tools plus cluster readiness | `false` | +| `--control-plane` | Control-plane checks | `false` | +| `--compute-plane` | Compute-plane checks | `false` | +| `--all` | Every category | `false` | +| `--cluster-name NAME` | Cluster name for compute-plane checks | - | +| `--skip-inotify-check` | Skip the per-node inotify-limits probe. Needed when the kubeconfig user cannot create pods in `default`. Env: `NVCF_CLI_SELFHOSTED_SKIP_INOTIFY` | `false` | + +### Cluster-validator flags + +The validator runs as a Job in the cluster being checked. The CLI creates a +ServiceAccount, ClusterRole, and ClusterRoleBinding for it and removes them +after the run, so the kubeconfig context needs permission to manage those. + +| Flag | Purpose | Default | +|---|---|---| +| `--cluster-validator-image REF` | Validator image. Resolution order: flag, `NVCF_CLI_CLUSTER_VALIDATOR_IMAGE`, config key `cluster_validator_image`. A ref with no tag discovers the latest stable tag from the registry. Unset everywhere skips the probe with a warning | - | +| `--cluster-validator-registries host:port,...` | Extra registries the control-plane validator probes for reachability. `nvcr.io` is always probed. Repeatable or comma-separated. Env: `NVCF_CLI_CLUSTER_VALIDATOR_REGISTRIES`; config key `cluster_validator_registries` | `nvcr.io` only | +| `--cluster-validator-pull-secret NAME` | docker-registry Secret in `default` used to pull the validator image. When empty, the CLI looks for one in the NVCF namespaces and falls back to minting one from `NGC_API_KEY` | auto-detect | +| `--skip-cluster-validation` | Skip the in-cluster validator probe entirely. Env: `NVCF_CLI_SELFHOSTED_SKIP_CLUSTER_VALIDATION` | `false` | +| `--no-cleanup` | Keep the validator Job (and its RBAC) after the run for debugging. The next run still sweeps prior Jobs | `false` | +| `--show-logs` | Print the validator transcript to stderr after the check events. Useful when piping `--json` to a script that also wants the transcript | `false` | + ## `up`-specific | Flag | Purpose | Default | diff --git a/src/clis/nvcf-cli/.nvcf-cli.yaml.template b/src/clis/nvcf-cli/.nvcf-cli.yaml.template index 585adc8b21..f21daa19d5 100644 --- a/src/clis/nvcf-cli/.nvcf-cli.yaml.template +++ b/src/clis/nvcf-cli/.nvcf-cli.yaml.template @@ -142,7 +142,13 @@ api_keys_owner_id: svc@nvcf-api.local # Image reference for the cluster-validator pod used by # `nvcf-cli self-hosted check`. The CLI runs this image as a Job in the -# compute-plane cluster to verify NVCA prerequisites before install. +# cluster being checked to verify prerequisites before install. One image +# serves both roles; the Job environment selects the check set. +# +# The Job needs a ServiceAccount, ClusterRole, and ClusterRoleBinding, which +# the CLI creates and removes per run. The kubeconfig context therefore needs +# permission to manage those objects; without it the probe reports a warning +# instead of a result. # # Config key: cluster_validator_image # Environment variable: NVCF_CLI_CLUSTER_VALIDATOR_IMAGE @@ -156,6 +162,18 @@ api_keys_owner_id: svc@nvcf-api.local # Prod: nvcr.io/nvidia/nvcf-byoc/cluster-validator # cluster_validator_image: nvcr.io/nvidia/nvcf-byoc/cluster-validator +# Extra container registries the control-plane validator probes for +# reachability, as host:port. nvcr.io is always probed, so list only the +# registries your stack pulls from in addition to it. +# +# Config key: cluster_validator_registries (list) +# Environment variable: NVCF_CLI_CLUSTER_VALIDATOR_REGISTRIES (comma-separated) +# Command-line flag: --cluster-validator-registries (repeatable or comma-separated) +# +# cluster_validator_registries: +# - harbor.example.com:443 +# - ghcr.io:443 + # ============================================================================== # General Settings # ============================================================================== diff --git a/src/clis/nvcf-cli/internal/agentskill/skilldata_generated.go b/src/clis/nvcf-cli/internal/agentskill/skilldata_generated.go index f004cac554..441a759bf5 100644 --- a/src/clis/nvcf-cli/internal/agentskill/skilldata_generated.go +++ b/src/clis/nvcf-cli/internal/agentskill/skilldata_generated.go @@ -31,7 +31,7 @@ import ( const skillDataZipBase64 = "" + "UEsDBBQACAAAAAAAIQAAAAAAAAAAAAAAAAASAAkAZGF0YS9tYW5pZmVzdC5qc29uVVQFAAEAps4S" + "ewogICJzY2hlbWFWZXJzaW9uIjogMSwKICAiZ2VuZXJhdGVkQXQiOiAiMTk3MC0wMS0wMVQwMDow" + - "MDowMFoiLAogICJ0b3RhbEZpbGVzIjogMjIsCiAgInRvdGFsQnl0ZXMiOiAxOTU0MDEsCiAgImZp" + + "MDowMFoiLAogICJ0b3RhbEZpbGVzIjogMjIsCiAgInRvdGFsQnl0ZXMiOiAxOTc2MzYsCiAgImZp" + "bGVzIjogWwogICAgewogICAgICAicGF0aCI6ICJudmNmLXNlbGYtbWFuYWdlZC1jbGkvU0tJTEwu" + "bWQiLAogICAgICAic2hhMjU2IjogImY2MjBlMTRmMTYxYTZiZWJlMTNlN2Y1NTkwMDE5N2VkYmEx" + "NTExYzY0ZjQwYzM0ZmM3OGZjMjM4MWQxMTI3YzciLAogICAgICAic2l6ZSI6IDI0NTgxCiAgICB9" + @@ -71,3553 +71,3592 @@ const skillDataZipBase64 = "" + "bmNlL2V4aXQtY29kZXMubWQiLAogICAgICAic2hhMjU2IjogIjY0YjVmYTliY2FmMGUwYTUzZjc4" + "OTIwYjczZmNiNTMwYWI2OTQ1MWI0OGE1YjQ5M2YyNTJjYTE4NTgzYWIwODYiLAogICAgICAic2l6" + "ZSI6IDE3NDkKICAgIH0sCiAgICB7CiAgICAgICJwYXRoIjogIm52Y2Ytc2VsZi1tYW5hZ2VkLWNs" + - "aS9yZWZlcmVuY2UvZmxhZ3MubWQiLAogICAgICAic2hhMjU2IjogIjU0YjVlYTc5ODFkMjYyNmM1" + - "ODM1MzMyYWJhMjdlYjI4N2FjYTg5ZTFiYWRjYjJmYWI4MDcwMWFlMjlmNzZlMDgiLAogICAgICAi" + - "c2l6ZSI6IDg5MDIKICAgIH0sCiAgICB7CiAgICAgICJwYXRoIjogIm52Y2Ytc2VsZi1tYW5hZ2Vk" + - "LWNsaS9yZWZlcmVuY2UvdHJvdWJsZXNob290aW5nLm1kIiwKICAgICAgInNoYTI1NiI6ICJhNjMw" + - "ODRlMjI0OWYxZDE1NGM1OTgxZTRhMDcyYjdjNzg0Yjg1ZWExNDYwODY1MTVlYWI0YWI2NzBhOTQw" + - "ZTk0IiwKICAgICAgInNpemUiOiA0NDY4CiAgICB9LAogICAgewogICAgICAicGF0aCI6ICJudmNm" + - "LXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24vU0tJTEwubWQiLAogICAgICAic2hhMjU2IjogImMz" + - "M2ZkODMwNWVjM2ZkMDIwZWI0Yzk4MmMzYWZlNzZhN2MxZDQzYzNlMDU0YzhmYmQzOGM0YmIxYjcw" + - "N2M3NWEiLAogICAgICAic2l6ZSI6IDI1MTU0CiAgICB9LAogICAgewogICAgICAicGF0aCI6ICJu" + - "dmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24vZXZhbHMvZXZhbHMuanNvbiIsCiAgICAgICJz" + - "aGEyNTYiOiAiYzViNDUzMzdlNDliM2FiOGFlMjgzNDVkMzE2NGE3ZjU3OTE5ZTY0NDg5ODcwMmQw" + - "Y2FhZDQ4YWVlMjhiMWYzYSIsCiAgICAgICJzaXplIjogMjE5MzMKICAgIH0sCiAgICB7CiAgICAg" + - "ICJwYXRoIjogIm52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbi9leGFtcGxlcy5tZCIsCiAg" + - "ICAgICJzaGEyNTYiOiAiOWEzOWU1Y2NhYmQ0MDgxOWM3MWYyYjBmMmQ3NTIzMTZiNzIzMTU2NTRk" + - "ODBkM2QwMTc2OThjZTFmYjNlNWIxMSIsCiAgICAgICJzaXplIjogMTAzNjcKICAgIH0sCiAgICB7" + - "CiAgICAgICJwYXRoIjogIm52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbi9yZWZlcmVuY2Vz" + - "L2NvbXB1dGUtcGxhbmUtaW5zdGFsbGF0aW9uLm1kIiwKICAgICAgInNoYTI1NiI6ICI1ZGVlNThh" + - "ZTJjNjdhNjI5NDZlM2M1OTMwMmFmYWNjNDBiZGU3MWY4ZGMyZjI1Y2Q3Nzk5Y2M0NWI0NzRmYTE5" + - "IiwKICAgICAgInNpemUiOiAxMjMwNgogICAgfSwKICAgIHsKICAgICAgInBhdGgiOiAibnZjZi1z" + - "ZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uL3JlZmVyZW5jZXMvZGVidWdnaW5nLm1kIiwKICAgICAg" + - "InNoYTI1NiI6ICJhNTI4MTU4YmMwYmZmZmVlZjZlMDFkZTM4NGNhZjU2NWU2NDQ1YjQ4YWJkM2Nl" + - "ZTQwMDQ4NzFmNTIzZjUzYjk3IiwKICAgICAgInNpemUiOiAxMjQzNwogICAgfSwKICAgIHsKICAg" + - "ICAgInBhdGgiOiAibnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uL3JlZmVyZW5jZXMvaGVs" + - "bWZpbGUtc3RydWN0dXJlLm1kIiwKICAgICAgInNoYTI1NiI6ICIxZDUyNzc2ZjlkN2Q4ZGY1OGRl" + - "ZmUzMDQ2ZDYzZWM4ZjUyZmQzMDFjMjE1YmYwZTFhYjZiYjkxOTE2MjA3M2RlIiwKICAgICAgInNp" + - "emUiOiAxMDEyNwogICAgfSwKICAgIHsKICAgICAgInBhdGgiOiAibnZjZi1zZWxmLW1hbmFnZWQt" + - "aW5zdGFsbGF0aW9uL3JlZmVyZW5jZXMvbnZjZi11aS1hZGRvbi5tZCIsCiAgICAgICJzaGEyNTYi" + - "OiAiNTA1MjRlNmUxOTcxMTgzYmRjOWFkMGFjMzhhODA3ZGY3MmNjMDg1MWI3OWY1MThmZTExYTQ4" + - "ZTQ1OTdjODUwZSIsCiAgICAgICJzaXplIjogMTk3NwogICAgfSwKICAgIHsKICAgICAgInBhdGgi" + - "OiAibnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uL3JlZmVyZW5jZXMvcHVsbC1zZWNyZXRz" + - "Lm1kIiwKICAgICAgInNoYTI1NiI6ICJlYzFmM2ZmY2QxN2U1Zjk1ODNmZWUzOTc0NGVlODk3ZDQ2" + - "NmJjM2NmNjM4OTI5NDI2NGQ4OWU3ZjllZDAxYjg3IiwKICAgICAgInNpemUiOiA1NjMyCiAgICB9" + - "CiAgXQp9ClBLBwhLpxLcSBAAAEgQAABQSwMEFAAIAAAAAAAhAAAAAAAAAAAAAAAAACMACQBkYXRh" + - "L252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9TS0lMTC5tZFVUBQABAKbOEi0tLQpuYW1lOiBudmNmLXNl" + - "bGYtbWFuYWdlZC1jbGkKZGVzY3JpcHRpb246IHwKICBJbnN0YWxsLCBvcGVyYXRlLCBhbmQgdGVh" + - "ciBkb3duIHNlbGYtaG9zdGVkIE5WSURJQSBDbG91ZCBGdW5jdGlvbnMgKE5WQ0YpCiAgZGVwbG95" + - "bWVudHMgd2l0aCBudmNmLWNsaS4gVXNlIGZvciBjb250cm9sLXBsYW5lIG9yIGNvbXB1dGUtcGxh" + - "bmUgaW5zdGFsbCwKICBzdGF0dXMgY2hlY2tzLCBjbHVzdGVyIHJlZ2lzdHJhdGlvbiwgZnVuY3Rp" + - "b24gZGVwbG95L2ludm9rZSwgdGFzawogIGNyZWF0ZS9saXN0L2NhbmNlbC9kZWxldGUsIEFQSSBr" + - "ZXlzLCBhZG1pbiB0b2tlbnMsIEpXS1Mgcm90YXRpb24sCiAgZmFpbGVkLWluc3RhbGwgZGlhZ25v" + - "c2lzLCBhbmQgdW5pbnN0YWxsIG9yIGRvd24gd29ya2Zsb3dzLiBUcmlnZ2VyIGtleXdvcmRzOgog" + - "IG52Y2YsIG52Y2YtY2xpLCBzZWxmLWhvc3RlZCBudmNmLCBzZWxmLW1hbmFnZWQgbnZjZiwgTlZD" + - "RkJhY2tlbmQsIE5WQ0EsIE5DUCwKICBJQ01TLCBoZWxtZmlsZSwgY29udHJvbCBwbGFuZSwgY29t" + - "cHV0ZSBwbGFuZSwgTExNIGZ1bmN0aW9uLAogIE9wZW5BSS1jb21wYXRpYmxlIGludm9jYXRpb24s" + - "IFJlc3BvbnNlcyBBUEksIGVtYmVkZGluZ3MsIGJhdGNoIHRhc2ssIHRhc2sKICBtb25pdG9yLCBj" + - "bHVzdGVyIHJvdGF0ZSwgY2x1c3RlciBkZWxldGUsIGhlbG0gdGFzaywgaGVsbS1iYXNlZCB0YXNr" + - "LAogIHRhc2sgc2VjcmV0cywgdXBkYXRlIHRhc2sgc2VjcmV0cywgcmV0cmlldmUgdGFzayByZXN1" + - "bHRzLCBidWxrIGZldGNoIHRhc2tzLAogIHRhc2sgcmVzdWx0cywgTlZDVCwgTlZDVCB0YXNrLCBO" + - "VkNUIGJhdGNoIGpvYi4KYWxsb3dlZC10b29sczogQmFzaCwgUmVhZCwgQXNrVXNlclF1ZXN0aW9u" + - "CmFyZ3VtZW50LWhpbnQ6ICJbaW5zdGFsbHxzdGF0dXN8Y2hlY2t8ZGVwbG95LWZ1bmN0aW9ufHJl" + - "Z2lzdGVyLWNsdXN0ZXJ8dGVhcmRvd25dIFthcmdzXSIKLS0tCjwhLS0KVG9rZW4gQnVkZ2V0Ogot" + - "IExldmVsIDEgKFlBTUwpOiB+MTIwIHRva2VucwotIExldmVsIDIgKHRoaXMgZmlsZSk6IH4xOTAw" + - "IHRva2VucyAodGFyZ2V0IDwyMDAwKQotIExldmVsIDMgKHByb21wdHMvLCByZWZlcmVuY2UvLCBl" + - "eGFtcGxlcy8pOiBsb2FkZWQgb24gZGVtYW5kCi0tPgoKIyBOVkNGIFNlbGYtSG9zdGVkIENMSQoK" + - "YG52Y2YtY2xpYCBkcml2ZXMgZXZlcnkgc3RlcCBvZiBicmluZ2luZyB1cCBzZWxmLWhvc3RlZCBO" + - "VklESUEgQ2xvdWQgRnVuY3Rpb25zOiBjbHVzdGVyIHJlZ2lzdHJhdGlvbiwgY29udHJvbC1wbGFu" + - "ZSBpbnN0YWxsLCBjb21wdXRlLXBsYW5lIGluc3RhbGwsIGZ1bmN0aW9uIGRlcGxveS9pbnZva2Us" + - "IGFuZCBsaWZlY3ljbGUgbWFuYWdlbWVudC4gVXNlIHRoaXMgc2tpbGwgYW55IHRpbWUgdGhlIHVz" + - "ZXIgd2FudHMgdG8gb3BlcmF0ZSBzZWxmLWhvc3RlZCBOVkNGLgoKIyMgV2hlbiB0byB1c2UKCi0g" + - "Imluc3RhbGwgc2VsZi1ob3N0ZWQgTlZDRiIgLyAiYnJpbmcgdXAgYW4gTlZDRiBjbHVzdGVyIgot" + - "ICJyZWdpc3RlciBhIChjb21wdXRlfEdQVSkgY2x1c3RlciB3aXRoIE5WQ0YiCi0gImRlcGxveSBh" + - "IChjb250YWluZXJ8R1BVKSBmdW5jdGlvbiIgLyAiaW52b2tlIGFuIE5WQ0YgZnVuY3Rpb24iCi0g" + - "ImNoZWNrIE5WQ0YgY2x1c3RlciBoZWFsdGgiIC8gImlzIG15IE5WQ0YgaW5zdGFsbCBPSz8iCi0g" + - "InJvdGF0ZSBOVkNGIGNsdXN0ZXIgSldLUyIgLyAidGhlIE5WQ0EgYWdlbnQgc3RvcHBlZCBhdXRo" + - "ZW50aWNhdGluZyIKLSAidGVhciBkb3duIE5WQ0YiIC8gInJlbW92ZSB0aGUgY29tcHV0ZSBwbGFu" + - "ZSIgLyAidW5pbnN0YWxsIE5WQ0YiIC8gImRlcmVnaXN0ZXIgdGhpcyBjbHVzdGVyIgotICJwcmV2" + - "aWV3IHdoYXQgYGRvd25gIHdvdWxkIGRvIiAvICJkcnktcnVuIHVuaW5zdGFsbCIKLSBBbnkgdGFz" + - "ayBvcGVyYXRpb246IGNyZWF0ZSAvIHJ1biAvIHN1Ym1pdCAvIG1vbml0b3IgLyBjYW5jZWwgLyBk" + - "ZWxldGUgLyBsaXN0IHRhc2tzLCBoZWxtIHRhc2ssIHVwZGF0ZSB0YXNrIHNlY3JldHMsIHJldHJp" + - "ZXZlIHRhc2sgcmVzdWx0cywgYnVsayBmZXRjaCB0YXNrIGRldGFpbHMuCi0gQW55IHJlZmVyZW5j" + - "ZSB0byBgTlZDVGAsIGBOVkNUIHRhc2tgLCBvciBgTlZDVCBiYXRjaCBqb2JgIChsaXN0IC8gcnVu" + - "IC8gY2FuY2VsIC8gZGVsZXRlIC8gcmVzdWx0cykuCi0gQW55IHJlZmVyZW5jZSB0byBgTlZDRkJh" + - "Y2tlbmRgLCBgTlZDQWAsIElDTVMsIGhlbG0gcmVsZWFzZXMgbGlrZSBgaGVsbS1udmNmLSpgLCBv" + - "ciBgaWNtcy48ZG9tYWluPmAgLyBgYXBpLjxkb21haW4+YCBVUkxzLgoKIyMgUXVpY2sgc3RhcnQK" + - "CkZvciByZW1vdGUgb25lLWNsaWNrIGluc3RhbGxzLCBwcmVwYXJlIEdhdGV3YXkgQVBJIGluZ3Jl" + - "c3MgYW5kIENMSSBlbmRwb2ludApjb25maWd1cmF0aW9uIGJlZm9yZSBydW5uaW5nIGBzZWxmLWhv" + - "c3RlZCB1cGAuIFRoZSBjb21tYW5kIGFwcGxpZXMgdGhlIGNvbnRyb2wKcGxhbmUgYW5kIHRoZW4g" + - "aW1tZWRpYXRlbHkgY2FsbHMgQVBJLCBBUEkgS2V5cywgaW52b2NhdGlvbiwgYW5kIGdSUEMgZW5k" + - "cG9pbnRzLgpJZiB0aGUgR2F0ZXdheSBpcyBub3QgcHJvZ3JhbW1lZCBvciB0aGUgQ0xJIGhvc3Qg" + - "aGVhZGVycyBkbyBub3QgbWF0Y2ggdGhlCkhUVFBSb3V0ZXMgcmVuZGVyZWQgYnkgdGhlIHN0YWNr" + - "IGVudmlyb25tZW50LCBwb3N0LWluc3RhbGwgaGVhbHRoIGFuZCBjbHVzdGVyCnJlZ2lzdHJhdGlv" + - "biB3aWxsIGZhaWwuCgpgYGBzaAojIFNpbmdsZS1jbHVzdGVyIChjb250cm9sICsgY29tcHV0ZSBv" + - "biB0aGUgY3VycmVudCBrdWJlY29uZmlnIGNvbnRleHQpOgpudmNmLWNsaSBzZWxmLWhvc3RlZCB1" + - "cCAtLWNsdXN0ZXItbmFtZT1uY3AtbG9jYWwKCiMgU3BsaXQtY2x1c3RlciAoY29udHJvbCBwbGFu" + - "ZSBvbiBjb250ZXh0IEEsIGNvbXB1dGUgcGxhbmUgb24gY29udGV4dCBCKToKS1VCRUNPTkZJRz1j" + - "cC55YW1sOmdwdTEueWFtbCBudmNmLWNsaSBzZWxmLWhvc3RlZCB1cCBcCiAgLS1jbHVzdGVyLW5h" + - "bWU9bmNwLWxvY2FsIFwKICAtLWNvbnRyb2wtcGxhbmUtY29udGV4dD1hZG1pbkBjcCBcCiAgLS1j" + - "b21wdXRlLXBsYW5lLWNvbnRleHQ9YWRtaW5AZ3B1MSBcCiAgLS1pY21zLXVybD1odHRwczovL2lj" + - "bXMubnZjZi5leGFtcGxlLmNvbQoKIyBBZGQgYSBuZXcgY29tcHV0ZSBwbGFuZSB0byBhbiBleGlz" + - "dGluZyBjb250cm9sIHBsYW5lIChubyBrdWJlY3RsIGFjY2VzcyB0byBDUCBuZWVkZWQ7CiMgcmVh" + - "Y2hlcyB0aGUgY29udHJvbCBwbGFuZSB2aWEgdGhlIHB1YmxpYyBJQ01TIEhUVFBSb3V0ZSk6Cm52" + - "Y2YtY2xpIHNlbGYtaG9zdGVkIGFkZC1jb21wdXRlLXBsYW5lIFwKICAtLWNsdXN0ZXItbmFtZT1u" + - "Y3AtbG9jYWwtMiBcCiAgLS1jb21wdXRlLXBsYW5lLWNvbnRleHQ9YWRtaW5AZ3B1MiBcCiAgLS1p" + - "Y21zLXVybD1odHRwczovL2ljbXMubnZjZi5leGFtcGxlLmNvbSBcCiAgLS10b2tlbj0kQURNSU5f" + - "SldUCgojIFRlYXIgZG93biAoYWx3YXlzIHBsYW4tb25seSBmaXJzdCk6Cm52Y2YtY2xpIHNlbGYt" + - "aG9zdGVkIGRvd24gLS1wbGFuLW9ubHkgLS1jbHVzdGVyLW5hbWU9bmNwLWxvY2FsIC0tanNvbiB8" + - "IGpxCm52Y2YtY2xpIHNlbGYtaG9zdGVkIGRvd24gLS1jbHVzdGVyLW5hbWU9bmNwLWxvY2FsCgoj" + - "IFBlci1wbGFuZSB1bmluc3RhbGwgKEdpdE9wczsgbWlycm9ycyBgaW5zdGFsbGApOgpudmNmLWNs" + - "aSBzZWxmLWhvc3RlZCB1bmluc3RhbGwgLS1uby1hcHBseSAtLWNvbXB1dGUtcGxhbmUgLS1jbHVz" + - "dGVyLW5hbWU9bmNwLWxvY2FsIHwga3ViZWN0bCBkZWxldGUgLWYgLQpgYGAKCj4gKipgdXBgIHZz" + - "IGBhZGQtY29tcHV0ZS1wbGFuZWAuKiogYHVwYCBhbHdheXMgaW5zdGFsbHMgYm90aCBwbGFuZXMg" + - "4oCUIHVzZSBpdCBmb3IgdGhlICpmaXJzdCogaW5zdGFsbC4gYGFkZC1jb21wdXRlLXBsYW5lYCBp" + - "cyB0aGUgcmlnaHQgc3ViY29tbWFuZCBhbnkgdGltZSB0aGUgY29udHJvbCBwbGFuZSBpcyBhbHJl" + - "YWR5IHJ1bm5pbmcgYW5kIHlvdSB3YW50IHRvIGF0dGFjaCBhbiBOdGggY29tcHV0ZSBjbHVzdGVy" + - "LgoKPiAqKmBkb3duYCBhbHdheXMgd2l0aCBgLS1wbGFuLW9ubHlgIGZpcnN0LioqIFNob3cgdGhl" + - "IHVzZXIgdGhlIGB3aWxsVW5pbnN0YWxsLmNvbW1hbmRzW11gIGFycmF5IGJlZm9yZSBydW5uaW5n" + - "IGZvciByZWFsLgoKIyMgQXV0aGVudGljYXRpb24KCmBudmNmLWNsaWAgdXNlcyB0d28gY3JlZGVu" + - "dGlhbHMuIEVhY2ggaXMgcmVzb2x2ZWQgaW5kZXBlbmRlbnRseSBpbiB0aGlzIG9yZGVyOgoKfCBQ" + - "cmVjZWRlbmNlIHwgU291cmNlIHwKfC0tLXwtLS18CnwgMSAoaGlnaGVzdCkgfCBFbnZpcm9ubWVu" + - "dCB2YXJpYWJsZSAoYE5WQ0ZfVE9LRU5gLCBgTlZDRl9BUElfS0VZYCkgfAp8IDIgfCBDb25maWcg" + - "ZmlsZSAoYH4vLm52Y2YtY2xpLnlhbWxgLCBrZXlzIGB0b2tlbmAgYW5kIGBhcGlfa2V5YCkgfAp8" + - "IDMgfCBTdGF0ZSBmaWxlIChgfi8ubnZjZi1jbGkuc3RhdGVgKSwgc2tpcHBlZCB3aGVuIHRoZSBz" + - "dG9yZWQgdG9rZW4gaXMgZXhwaXJlZCB8Cgp8IEVudiB2YXIgfCBUb2tlbiB0eXBlIHwgVXNlZCBi" + - "eSB8CnwtLS18LS0tfC0tLXwKfCBgTlZDRl9UT0tFTmAgfCBBZG1pbiBKV1QgfCBgZnVuY3Rpb24g" + - "Y3JlYXRlYCAvIGBkZXBsb3lgIC8gYHVwZGF0ZWAgLyBgZGVsZXRlYCwgY2x1c3RlciBtYW5hZ2Vt" + - "ZW50IChgY2x1c3RlciByZWdpc3RlcmAvYHJvdGF0ZWAvYGRlbGV0ZWAsIGBzZWxmLWhvc3RlZGAg" + - "b3BzKS4gUmVxdWlyZWQgZm9yIGFkbWluIGNvbW1hbmRzOyBwcmVmZXJyZWQgZm9yIHRoZSByZXN0" + - "LiB8CnwgYE5WQ0ZfQVBJX0tFWWAgfCBgbnZhcGktLi4uYCBBUEkga2V5IHwgYGZ1bmN0aW9uIGlu" + - "dm9rZWAgLyBgbGlzdGAgLyBgZ2V0YCwgcXVldWUgZGV0YWlscy4gRmFsbHMgYmFjayB0byBgTlZD" + - "Rl9UT0tFTmAgd2hlbiB1bnNldC4gfAoKVG9rZW4gZ2VuZXJhdGlvbiBmbG93OgoKMS4gUG9pbnQg" + - "dGhlIENMSSBhdCB5b3VyIHNlbGYtaG9zdGVkIGVuZHBvaW50cy4gRGVmYXVsdHMgdGFyZ2V0IHBy" + - "b2R1Y3Rpb24gTlZDRjsgb3ZlcnJpZGUgd2l0aCBlbnYgdmFycyBvciBhIHlhbWwgZmlsZSAoYC0t" + - "Y29uZmlnIDxwYXRoPmAsIGAuLy5udmNmLWNsaS55YW1sYCwgb3IgYH4vLm52Y2YtY2xpLnlhbWxg" + - "OyBhIGZ1bGwgdGVtcGxhdGUgc2hpcHMgYXQgYHNyYy9jbGlzL252Y2YtY2xpLy5udmNmLWNsaS55" + - "YW1sLnRlbXBsYXRlYCkuCgogICBgTlZDRl9CQVNFX0hUVFBfVVJMYCAvIGBBUElfS0VZU19TRVJW" + - "SUNFX1VSTGAgLyBgTlZDRl9CQVNFX0dSUENfVVJMYCB0ZWxsIHRoZSBDTEkgKndoZXJlIHRvIHNl" + - "bmQgcmVxdWVzdHMqLiBgQVBJX0hPU1RgIC8gYEFQSV9LRVlTX0hPU1RgIC8gYElOVk9LRV9IT1NU" + - "YCBzZXQgdGhlIGBIb3N0OmAgaGVhZGVyIG9uIHRob3NlIHJlcXVlc3RzIOKAlCBuZWVkZWQgd2hl" + - "biBldmVyeSBOVkNGIHNlcnZpY2Ugc2l0cyBiZWhpbmQgYSBzaW5nbGUgZ2F0ZXdheSB0aGF0IHJv" + - "dXRlcyBieSBob3N0bmFtZSAoRW52b3kgR2F0ZXdheSBIVFRQUm91dGUgb24gYGFwaS48RUxCPmAs" + - "IGBhcGkta2V5cy48RUxCPmAsIGBpbnZvY2F0aW9uLjxFTEI+YCwgYGxsbS48RUxCPmApLiBTa2lw" + - "IHRoZSB0aHJlZSBIb3N0IHZhcnMgd2hlbiB0aGUgYmFzZSBVUkwgYWxyZWFkeSByZXNvbHZlcyB0" + - "byB0aGUgcmlnaHQgc2VydmljZS4KCiAgIEVudi12YXIgZm9ybToKICAgYGBgc2gKICAgZXhwb3J0" + - "IE5WQ0ZfQkFTRV9IVFRQX1VSTD1odHRwczovL2d3LmV4YW1wbGUuY29tCiAgIGV4cG9ydCBBUElf" + - "S0VZU19TRVJWSUNFX1VSTD1odHRwczovL2d3LmV4YW1wbGUuY29tCiAgIGV4cG9ydCBOVkNGX0JB" + - "U0VfR1JQQ19VUkw9Z3cuZXhhbXBsZS5jb206NDQzCgogICAjIE9ubHkgd2hlbiB0aGUgZ2F0ZXdh" + - "eSByb3V0ZXMgYnkgSG9zdCBoZWFkZXI6CiAgIGV4cG9ydCBBUElfS0VZU19IT1NUPWFwaS1rZXlz" + - "Lmd3LmV4YW1wbGUuY29tCiAgIGV4cG9ydCBBUElfSE9TVD1hcGkuZ3cuZXhhbXBsZS5jb20KICAg" + - "ZXhwb3J0IElOVk9LRV9IT1NUPWludm9jYXRpb24uZ3cuZXhhbXBsZS5jb20KICAgYGBgCgogICBZ" + - "YW1sIGZvcm0gKGB+Ly5udmNmLWNsaS55YW1sYCk6CiAgIGBgYHlhbWwKICAgYmFzZV9odHRwX3Vy" + - "bDogaHR0cHM6Ly9ndy5leGFtcGxlLmNvbQogICBhcGlfa2V5c19zZXJ2aWNlX3VybDogaHR0cHM6" + - "Ly9ndy5leGFtcGxlLmNvbQogICBiYXNlX2dycGNfdXJsOiBndy5leGFtcGxlLmNvbTo0NDMKCiAg" + - "ICMgT25seSB3aGVuIHRoZSBnYXRld2F5IHJvdXRlcyBieSBIb3N0IGhlYWRlcjoKICAgYXBpX2tl" + - "eXNfaG9zdDogYXBpLWtleXMuZ3cuZXhhbXBsZS5jb20KICAgYXBpX2hvc3Q6IGFwaS5ndy5leGFt" + - "cGxlLmNvbQogICBpbnZva2VfaG9zdDogaW52b2NhdGlvbi5ndy5leGFtcGxlLmNvbQogICBgYGAK" + - "CjIuIGBudmNmLWNsaSBpbml0YCBjYWxscyB0aGUgQVBJIEtleXMgc2VydmljZSB2aWEgdGhvc2Ug" + - "ZW5kcG9pbnRzIGFuZCB3cml0ZXMgdGhlIGFkbWluIHRva2VuIHRvIGB+Ly5udmNmLWNsaS5zdGF0" + - "ZWAuIFVzZSBgbnZjZi1jbGkgcmVmcmVzaGAgdG8gcm90YXRlIGEgc3RvcmVkIHRva2VuLgozLiBB" + - "ZnRlciBgaW5pdGAsIGBudmNmLWNsaSBhcGkta2V5IGdlbmVyYXRlYCBtaW50cyBmdW5jdGlvbiAr" + - "IHRhc2sgQVBJIGtleXMgKGFsc28gc3RvcmVkIGluIHN0YXRlKS4KCkFmdGVyIGBpbml0YCwgdGhl" + - "IGNyZWRlbnRpYWxzIGxpdmUgaW4gYH4vLm52Y2YtY2xpLnN0YXRlYCwgc28gbGF0ZXIgY29tbWFu" + - "ZHMgd29yayB3aXRob3V0IGV4cG9ydGluZyBgTlZDRl9UT0tFTmAgb3IgYE5WQ0ZfQVBJX0tFWWAu" + - "IEV4cG9ydCB0aGUgZW52IHZhciBvbmx5IHRvIG92ZXJyaWRlIHRoZSBzdG9yZWQgdmFsdWUgKGZv" + - "ciBleGFtcGxlIGEgc2hvcnRlci1saXZlZCB0b2tlbiBmcm9tIENJKS4KCiMjIENvcmUgc3ViY29t" + - "bWFuZHMKCnwgU3ViY29tbWFuZCB8IFdoYXQgaXQgZG9lcyB8IFdoZW4gdG8gdXNlIHwKfC0tLXwt" + - "LS18LS0tfAp8IGBudmNmLWNsaSBzZWxmLWhvc3RlZCBjaGVjayAtLXByZSBbLS1sb2NhbC1vbmx5" + - "IFx8IC0tY29udHJvbC1wbGFuZS1jb250ZXh0PVggXHwgLS1jb21wdXRlLXBsYW5lLWNvbnRleHQ9" + - "WV1gIHwgUHJlLWZsaWdodDogbG9jYWwtaG9zdCB0b29scyArIGNsdXN0ZXItc2lkZSBwcmVyZXF1" + - "aXNpdGVzIHwgQWx3YXlzIHJ1biBmaXJzdCBvbiBhIG5ldyBlbnZpcm9ubWVudCB8CnwgYG52Y2Yt" + - "Y2xpIHNlbGYtaG9zdGVkIGluc3RhbGwgLS1jb250cm9sLXBsYW5lIFx8IGt1YmVjdGwgYXBwbHkg" + - "LWYgLWAgfCBSZW5kZXIgKyBhcHBseSB0aGUgY29udHJvbCBwbGFuZSB8IFdoZW4geW91IHdhbnQg" + - "bWFudWFsIGNvbnRyb2wgb3ZlciBhcHBseSAoR2l0T3BzLWZyaWVuZGx5KSB8CnwgYG52Y2YtY2xp" + - "IHNlbGYtaG9zdGVkIGluc3RhbGwgLS1jb21wdXRlLXBsYW5lIC0tY2x1c3Rlci1uYW1lPVggXHwg" + - "a3ViZWN0bCBhcHBseSAtZiAtYCB8IFJlZ2lzdGVyIGNsdXN0ZXIgKyByZW5kZXIgY29tcHV0ZSBw" + - "bGFuZSB8IFNhbWUg4oCUIG1hbnVhbCBhcHBseSBwYXRoIHwKfCBgbnZjZi1jbGkgc2VsZi1ob3N0" + - "ZWQgdXAgLS1jbHVzdGVyLW5hbWU9WGAgfCBPbmUtc2hvdCBmaXJzdCBpbnN0YWxsOiBwcmUtZmxp" + - "Z2h0IOKGkiBjb250cm9sIHBsYW5lIOKGkiByZWdpc3RlciDihpIgY29tcHV0ZSBwbGFuZSB8IFN0" + - "YW5kYXJkIGluc3RhbGwgcGF0aCAoYm90aCBwbGFuZXMgZnJvbSBzY3JhdGNoKSB8CnwgYG52Y2Yt" + - "Y2xpIHNlbGYtaG9zdGVkIHVwIC0tcGxhbi1vbmx5IC0tY2x1c3Rlci1uYW1lPVhgIHwgRHJ5LXJ1" + - "bjogZW1pdCBwaGFzZS1ieS1waGFzZSBwbGFuICsgRVRBIHdpdGhvdXQgY2hhbmdpbmcgc3RhdGUg" + - "fCBBZ2VudCAvIENJIHByZXZpZXcgYmVmb3JlIGNvbW1pdCB8CnwgYG52Y2YtY2xpIHNlbGYtaG9z" + - "dGVkIGFkZC1jb21wdXRlLXBsYW5lIC0tY2x1c3Rlci1uYW1lPVggLS1jb21wdXRlLXBsYW5lLWNv" + - "bnRleHQ9WSAtLWljbXMtdXJsPeKApiAtLXRva2VuPSRKV1RgIHwgQWRkIGEgbmV3IGNvbXB1dGUg" + - "cGxhbmUgdG8gYW4gKmV4aXN0aW5nKiBjb250cm9sIHBsYW5lIChubyBDUCBpbnN0YWxsKSB8IEFk" + - "ZGluZyB0aGUgMm5kLCAzcmQsIOKApiBHUFUgY2x1c3RlciBhZnRlciB0aGUgaW5pdGlhbCBgdXBg" + - "IHwKfCBgbnZjZi1jbGkgc2VsZi1ob3N0ZWQgdW5pbnN0YWxsIC0tY29udHJvbC1wbGFuZWAgfCBQ" + - "ZXItcGxhbmUgcHJpbWl0aXZlOiBgaGVsbWZpbGUgZGVzdHJveWAgb24gdGhlIGNvbnRyb2wgcGxh" + - "bmUgKHJlZnVzZXMgaWYgY29tcHV0ZSBwbGFuZXMgc3RpbGwgcmVnaXN0ZXJlZCkgfCBGaW5hbCB0" + - "ZWFyZG93biBhZnRlciBhbGwgY29tcHV0ZSBwbGFuZXMgYXJlIGdvbmUsIG9yIHNjcmlwdGVkIHBp" + - "cGVsaW5lcyB8CnwgYG52Y2YtY2xpIHNlbGYtaG9zdGVkIHVuaW5zdGFsbCAtLWNvbXB1dGUtcGxh" + - "bmUgLS1jbHVzdGVyLW5hbWU9WGAgfCBQZXItcGxhbmUgcHJpbWl0aXZlOiBgaGVsbWZpbGUgZGVz" + - "dHJveWAgb24gYSBjb21wdXRlIHBsYW5lIChubyBJQ01TIHVucmVnaXN0ZXIsIG5vIGRyYWluKSB8" + - "IEp1c3QgcmVtb3ZlIHRoZSBoZWxtIHJlbGVhc2VzIHdpdGhvdXQgdGhlIElDTVMtc2lkZSBjbGVh" + - "bnVwIHwKfCBgbnZjZi1jbGkgc2VsZi1ob3N0ZWQgdW5pbnN0YWxsIC0tbm8tYXBwbHkgPHBsYW5l" + - "PmAgfCBSZW5kZXIgZGVsZXRlIFlBTUwgdmlhIGBoZWxtIGdldCBtYW5pZmVzdGAgfCBHaXRPcHM7" + - "IGBcfCBrdWJlY3RsIGRlbGV0ZSAtZiAtYCBvciBjb21taXQgKyBBcmdvIGFwcGxpZXMgfAp8IGBu" + - "dmNmLWNsaSBzZWxmLWhvc3RlZCBkb3duIC0tY2x1c3Rlci1uYW1lPVhgIHwgT3JjaGVzdHJhdG9y" + - "OiBkcmFpbiDihpIgdW5pbnN0YWxsIC0tY29tcHV0ZS1wbGFuZSDihpIgY2x1c3RlciBkZWxldGUg" + - "aW4gSUNNUyB8IFN0YW5kYXJkICJyZW1vdmUgb25lIEdQVSBjbHVzdGVyIiBwYXRoIHwKfCBgbnZj" + - "Zi1jbGkgc2VsZi1ob3N0ZWQgZG93biAtLWFsbCAtLWNvbmZpcm1gIHwgT3JjaGVzdHJhdG9yOiB0" + - "ZWFyIGRvd24gZXZlcnkgcmVnaXN0ZXJlZCBjb21wdXRlIHBsYW5lICsgY29udHJvbCBwbGFuZSB8" + - "IEZ1bGwgdW5pbnN0YWxsIHwKfCBgbnZjZi1jbGkgc2VsZi1ob3N0ZWQgZG93biAtLXBsYW4tb25s" + - "eSAtLWNsdXN0ZXItbmFtZT1YYCB8IERyeS1ydW4gcHJldmlldyAocGhhc2VzICsgaGVsbSByZWxl" + - "YXNlcyArIElDTVMgcm93cyArIEVUQXM7IG5vIGhlbG0vaGVsbWZpbGUgY29udGFjdCkgfCAqKkFM" + - "V0FZUyBydW4gYmVmb3JlIGFueSBhY3R1YWwgYGRvd25gKiogfAp8IGBudmNmLWNsaSBzZWxmLWhv" + - "c3RlZCBzdGF0dXMgWy0tY2x1c3Rlci1uYW1lPVhdIFstLXdhdGNoXSBbLS1qc29uXWAgfCBTbmFw" + - "c2hvdCBkYXNoYm9hcmQgb2YgY2x1c3RlciBpZGVudGl0eSArIGNvbXBvbmVudCBoZWFsdGggKyBy" + - "ZWNlbnQgZXZlbnRzIHwgUm91dGluZSBoZWFsdGggY2hlY2tzOyBgLS13YXRjaGAgZm9yIGxpdmUg" + - "fAp8IGBudmNmLWNsaSBpbml0YCB8IE1pbnQgYWRtaW4gdG9rZW4gZnJvbSBBUEkgS2V5cyBzZXJ2" + - "aWNlIHZpYSB0aGUgcHVibGljIGFwaSBnYXRld2F5IHwgQmVmb3JlIGFueSBjbHVzdGVyLW1hbmFn" + - "ZW1lbnQgb3BlcmF0aW9uOyBpZGVtcG90ZW50IHwKfCBgbnZjZi1jbGkgY2x1c3RlciByZWdpc3Rl" + - "ciAtLW5hbWU9WCAtLW5jYS1pZD1ZIC0tcmVnaW9uPVogWy0taWdub3JlLWV4aXN0aW5nXWAgfCBS" + - "ZWdpc3RlciBhIGNsdXN0ZXIgSldLUytPSURDIGlzc3VlciB3aXRoIElDTVMgfCBTdGFuZGFsb25l" + - "IHJlZ2lzdGVyICh3aXRob3V0IGNvbXB1dGUtcGxhbmUgaW5zdGFsbCkgfAp8IGBudmNmLWNsaSBj" + - "bHVzdGVyIHJvdGF0ZSAtLWNsdXN0ZXItaWQ9SURgIHwgUm90YXRlIGNsdXN0ZXIgSldLUyBpbiBJ" + - "Q01TIHwgV2hlbiBOVkNBJ3MgSzhzIHNpZ25pbmcga2V5IGNoYW5nZWQgYW5kIFBTQVQgdmVyaWZp" + - "Y2F0aW9uIHN0YXJ0ZWQgNDAxLWluZyB8CnwgYG52Y2YtY2xpIGNsdXN0ZXIgZGVsZXRlIC0tY2x1" + - "c3Rlci1pZD1JRGAgfCBSZW1vdmUgY2x1c3RlciByZWdpc3RyYXRpb24gZnJvbSBJQ01TIHwgKipD" + - "b25maXJtIHdpdGggdXNlci4qKiBEZXN0cm95cyBJQ01TIHN0YXRlIGZvciB0aGUgY2x1c3Rlci4g" + - "fAp8IGBudmNmLWNsaSBhcGkta2V5IGdlbmVyYXRlIC0tZGVzY3JpcHRpb249IuKApiIgLS1leHBp" + - "cmVzLWluPTFoYCB8IE1pbnQgYm90aCBhIGZ1bmN0aW9uIEFQSSBrZXkgYW5kIGEgdGFzayBBUEkg" + - "a2V5IChkZWZhdWx0KSB8IEJlZm9yZSBpbnZva2luZyBmdW5jdGlvbnMgb3IgY3JlYXRpbmcgdGFz" + - "a3M7IHJ1biBhZnRlciBldmVyeSBgaW5pdGAgfAp8IGBudmNmLWNsaSBhcGkta2V5IGdlbmVyYXRl" + - "IC0tZm9yIGZ1bmN0aW9uIC0tZGVzY3JpcHRpb249IuKApiJgIHwgTWludCBhIGZ1bmN0aW9uIEFQ" + - "SSBrZXkgb25seSAoYGludm9rZV9mdW5jdGlvbmAgc2NvcGUpIHwgV2hlbiBvbmx5IGZ1bmN0aW9u" + - "IGludm9jYXRpb24gaXMgbmVlZGVkIHwKfCBgbnZjZi1jbGkgYXBpLWtleSBnZW5lcmF0ZSAtLWZv" + - "ciB0YXNrIC0tZGVzY3JpcHRpb249IuKApiJgIHwgTWludCBhIHRhc2sgQVBJIGtleSBvbmx5IHwg" + - "V2hlbiBvbmx5IHRhc2sgb3BlcmF0aW9ucyBhcmUgbmVlZGVkIHwKfCBgbnZjZi1jbGkgZnVuY3Rp" + - "b24gY3JlYXRlIC0taW5wdXQtZmlsZT08anNvbj5gIHwgQ3JlYXRlIGZ1bmN0aW9uIG1ldGFkYXRh" + - "IGluIElDTVMgfCBGaXJzdCBzdGVwIG9mIGFueSBmdW5jdGlvbiBkZXBsb3k7IHVzZSBgZnVuY3Rp" + - "b25UeXBlOiAiTExNImAgYW5kIGBtb2RlbHNbXS5sbG1Db25maWdgIGZvciBMTE0gZnVuY3Rpb25z" + - "IHwKfCBgbnZjZi1jbGkgZnVuY3Rpb24gZGVwbG95IGNyZWF0ZSAtLWlucHV0LWZpbGU9PGpzb24+" + - "YCB8IFNjaGVkdWxlIGEgZGVwbG95bWVudCBvZiBhIGNyZWF0ZWQgZnVuY3Rpb24gfCBXYWl0cyBm" + - "b3IgQUNUSVZFIGJlZm9yZSByZXR1cm5pbmcgKHRpbWVvdXQgOTAwcykgfAp8IGBudmNmLWNsaSBm" + - "dW5jdGlvbiBpbnZva2UgLS1pbnB1dC1maWxlPTxqc29uPmAgfCBJbnZva2UgYSBkZXBsb3llZCBm" + - "dW5jdGlvbiB8IFJlcXVpcmVzIEFQSSBrZXkgKG5vdCBhZG1pbiB0b2tlbikgfAp8IGBudmNmLWNs" + - "aSBmdW5jdGlvbiBkZWxldGUgLS1mdW5jdGlvbi1pZD1JRCAtLXZlcnNpb24taWQ9VklEYCB8IFJl" + - "bW92ZSBhIGZ1bmN0aW9uIGFuZCBpdHMgZGVwbG95bWVudCB8ICoqQ29uZmlybSB3aXRoIHVzZXIu" + - "KiogfAp8IGBudmNmLWNsaSB0YXNrIGNyZWF0ZSAtLW5hbWU9WCAtLWdwdT1IMTAwIC0taW5zdGFu" + - "Y2UtdHlwZT1ZIC0taW1hZ2U9WmAgfCBTdWJtaXQgYSBjb250YWluZXIgdGFzazsgc2F2ZXMgdGFz" + - "ayBJRCB0byBDTEkgc3RhdGUgfCBSZXF1aXJlcyB0YXNrIEFQSSBrZXk7IHNldCBgTlZDRl9CQVNF" + - "X05WQ1RfVVJMYCB0byB0aGUgTlZDVCBnYXRld2F5IGVuZHBvaW50IHwKfCBgbnZjZi1jbGkgdGFz" + - "ayBjcmVhdGUgLS1uYW1lPVggLS1ncHU9SDEwMCAtLWluc3RhbmNlLXR5cGU9WSAtLWhlbG0tY2hh" + - "cnQ9WmAgfCBTdWJtaXQgYSBIZWxtIHRhc2sgfCBTYW1lIGFzIGNvbnRhaW5lciB0YXNrOyBgLS1o" + - "ZWxtLWNoYXJ0YCByZXBsYWNlcyBgLS1pbWFnZWAgfAp8IGBudmNmLWNsaSB0YXNrIGNyZWF0ZSAt" + - "LWlucHV0LWZpbGU9PGpzb24+YCB8IFN1Ym1pdCBhIHRhc2sgZnJvbSBhIEpTT04gY29uZmlnIGZp" + - "bGUgfCBSZWNvbW1lbmRlZCBmb3IgcmVwZWF0YWJsZSBjb25maWd1cmF0aW9ucyB8CnwgYG52Y2Yt" + - "Y2xpIHRhc2sgbGlzdCBbLS1zdGF0dXM9UVVFVUVEXHxSVU5OSU5HXHxDT01QTEVURURdYCB8IExp" + - "c3QgdGFza3MsIG9wdGlvbmFsbHkgZmlsdGVyZWQgYnkgc3RhdHVzIHwgfAp8IGBudmNmLWNsaSB0" + - "YXNrIGdldCBbdGFza0lkXWAgfCBHZXQgZGV0YWlscyBmb3IgYSB0YXNrOyB1c2VzIHNhdmVkIHRh" + - "c2sgSUQgaWYgb21pdHRlZCB8IHwKfCBgbnZjZi1jbGkgdGFzayBldmVudHMgW3Rhc2tJZF1gIHwg" + - "U3RyZWFtIGxpZmVjeWNsZSBldmVudHMgZm9yIGEgdGFzayB8IHwKfCBgbnZjZi1jbGkgdGFzayBy" + - "ZXN1bHRzIFt0YXNrSWRdYCB8IExpc3QgcmVzdWx0IGFydGlmYWN0cyBmb3IgYSBjb21wbGV0ZWQg" + - "dGFzayB8IFJlc3VsdCB1cGxvYWQgbm90IHlldCBzdXBwb3J0ZWQ7IHJldHVybnMgZW1wdHkgbGlz" + - "dCBmb3IgYE5PTkVgIHN0cmF0ZWd5IHwKfCBgbnZjZi1jbGkgdGFzayBjYW5jZWwgW3Rhc2tJZF1g" + - "IHwgQ2FuY2VsIGEgcXVldWVkIG9yIHJ1bm5pbmcgdGFzayB8IHwKfCBgbnZjZi1jbGkgdGFzayBk" + - "ZWxldGUgW3Rhc2tJZF1gIHwgRGVsZXRlIGEgdGFzayByZWNvcmQgfCAqKkNvbmZpcm0gd2l0aCB1" + - "c2VyLioqIHwKfCBgbnZjZi1jbGkgdGFzayB1cGRhdGUtc2VjcmV0cyBbdGFza0lkXSAtLXNlY3Jl" + - "dHMgTkFNRT12YWx1ZWAgfCBVcGRhdGUgc2VjcmV0cyBvbiBhIHRhc2s7IHN1cHBsaWVkIHNlY3Jl" + - "dHMgYXJlIGFkZGVkIG9yIHVwZGF0ZWQgYnkgbmFtZSwgZXhpc3Rpbmcgc2VjcmV0cyBub3QgaW4g" + - "dGhlIHJlcXVlc3QgYXJlIHByZXNlcnZlZCB8IHwKfCBgbnZjZi1jbGkgdGFzayBidWxrIC0tdGFz" + - "ay1pZHM9SUQxLElEMmAgfCBGZXRjaCBkZXRhaWxzIGZvciBtdWx0aXBsZSB0YXNrcyBpbiBvbmUg" + - "Y2FsbCB8IHwKCj4gUmVnaXN0cnkgY3JlZGVudGlhbCBwcm9wYWdhdGlvbjogYWZ0ZXIgYHJlZ2lz" + - "dHJ5LWNyZWRlbnRpYWwgYWRkYC9gdXBkYXRlYC9gZGVsZXRlYCwgdGFzayBjcmVhdGlvbiBjYW4g" + - "a2VlcCB1c2luZyB0aGUgcHJldmlvdXMgY3JlZGVudGlhbCBmb3IgdXAgdG8gYWJvdXQgNSBtaW51" + - "dGVzIChOVkNUIGNhY2hlcyBhY2NvdW50IGNyZWRlbnRpYWxzIGF0IGBudmN0Lm52Y2YuY2FjaGUt" + - "dHRsYCwgZGVmYXVsdCBgUFQ1TWApLCBldmVuIHRob3VnaCBgcmVnaXN0cnktY3JlZGVudGlhbCBs" + - "aXN0YC9gZ2V0YCBzaG93IHRoZSBuZXcgdmFsdWUgaW1tZWRpYXRlbHkuIFdhaXQgYWJvdXQgNSBt" + - "aW51dGVzLCBvciBga3ViZWN0bCAtbiBudmNmIHJvbGxvdXQgcmVzdGFydCBkZXBsb3ltZW50L252" + - "Y3QtYXBpYCB0byBhcHBseSBpbW1lZGlhdGVseS4gU2VlIFtyZWZlcmVuY2UvdHJvdWJsZXNob290" + - "aW5nLm1kXShyZWZlcmVuY2UvdHJvdWJsZXNob290aW5nLm1kKS4KCiMjIExMTSBmdW5jdGlvbiB0" + - "eXBlCgpVc2UgYGZ1bmN0aW9uVHlwZTogIkxMTSJgIGZvciBPcGVuQUktY29tcGF0aWJsZSBtb2Rl" + - "bHMgc2VydmVkIHRocm91Z2ggdGhlIHNlbGYtbWFuYWdlZCBMTE0gR2F0ZXdheS4gTExNIGZ1bmN0" + - "aW9ucyBtdXN0IGRlZmluZSBhdCBsZWFzdCBvbmUgYG1vZGVsc1tdYCBlbnRyeSB3aXRoIGBuYW1l" + - "YCBhbmQgYGxsbUNvbmZpZy51cmlzYDsgdGhlIHN1cHBvcnRlZCB1cHN0cmVhbSBwYXRocyBhcmUg" + - "YC92MS9jaGF0L2NvbXBsZXRpb25zYCwgYC92MS9yZXNwb25zZXNgLCBhbmQgYC92MS9lbWJlZGRp" + - "bmdzYC4KClVzZSBgL2hlYWx0aGAgb24gcG9ydCBgODAwMGAgYXMgdGhlIGRlZmF1bHQgT3BlbkFJ" + - "LWNvbXBhdGlibGUgY29udGFpbmVyIGhlYWx0aCBwcm9iZSB1bmxlc3MgdGhlIGltYWdlIGV4cG9z" + - "ZXMgYSBkaWZmZXJlbnQgcmVhZGluZXNzIHBhdGguCgpMTE0gZnVuY3Rpb24gdHlwZSBpcyBpbmRl" + - "cGVuZGVudCBvZiB3b3JrbG9hZCBwYWNrYWdpbmcuIEZvciBhIEhlbG0tY2hhcnQgYmFja2VkIExM" + - "TSBmdW5jdGlvbiwga2VlcCBgZnVuY3Rpb25UeXBlOiAiTExNImAgYW5kIGBtb2RlbHNbXS5sbG1D" + - "b25maWdgLCB0aGVuIHNldCBgaGVsbUNoYXJ0YCBhbmQgYGhlbG1DaGFydFNlcnZpY2VOYW1lYCBp" + - "biB0aGUgY3JlYXRlIHJlcXVlc3QuIGBoZWxtQ2hhcnRTZXJ2aWNlTmFtZWAgbXVzdCBtYXRjaCB0" + - "aGUgS3ViZXJuZXRlcyBTZXJ2aWNlIGV4cG9zZWQgYnkgdGhlIGNoYXJ0LCBhbmQgYGluZmVyZW5j" + - "ZVBvcnRgIG11c3QgYmUgdGhhdCBTZXJ2aWNlIHBvcnQuCgpJbnZvY2F0aW9uIHVzZXMgdGhlIExM" + - "TSByb3V0ZSwgZm9yIGV4YW1wbGUgYGh0dHBzOi8vbGxtLmludm9jYXRpb24uPGRvbWFpbj4vdjEv" + - "Y2hhdC9jb21wbGV0aW9uc2AuIFRoZSBPcGVuQUkgYG1vZGVsYCB2YWx1ZSBtdXN0IGJlIGA8ZnVu" + - "Y3Rpb24taWQ+Lzxtb2RlbC1uYW1lPmA7IHRoZSBmdW5jdGlvbiBJRCBpcyB0aGUgcm91dGluZyBr" + - "ZXkgYW5kIHRoZSBtb2RlbCBuYW1lIGlzIGZvcndhcmRlZCB1cHN0cmVhbS4KClVwZGF0ZSBtdXRh" + - "YmxlIHBlci1tb2RlbCByb3V0aW5nIHNldHRpbmdzIHdpdGggYG52Y2YtY2xpIGZ1bmN0aW9uIHVw" + - "ZGF0ZSAtLWxsbS1tb2RlbC11cGRhdGU9J25hbWU9PG1vZGVsPixyb3V0aW5nTWV0aG9kPTxtZXRo" + - "b2Q+LHRva2VuUmF0ZUxpbWl0PTxsaW1pdD4nYCwgb3IgcHV0IHRoZSBzYW1lIGZpZWxkcyB1bmRl" + - "ciBgbW9kZWxVcGRhdGVzW10ubGxtQ29uZmlnYCBpbiBhbiB1cGRhdGUgSlNPTiBmaWxlLiBTZWUg" + - "W3JlZmVyZW5jZS9mbGFncy5tZF0ocmVmZXJlbmNlL2ZsYWdzLm1kKSBmb3IgYWNjZXB0ZWQgcm91" + - "dGluZyBtZXRob2RzLiBgdG9rZW5SYXRlTGltaXRgIHN1cHBvcnRzIHBvc2l0aXZlIGludGVnZXIg" + - "bGltaXRzIGZvciBgU2AsIGBNYCwgYEhgLCBgRGAsIGFuZCBgV2A7IHVzZSBKU09OIGlucHV0IGZv" + - "ciBjb21iaW5lZCBsaW1pdHMgc3VjaCBhcyBgMTAwMC1TLDUwMDAtTSwxMDAwMDAtSCw1MDAwMDAt" + - "RCwxMDAwMDAwLVdgLiBEbyBub3QgaW5jbHVkZSBgdXJpc2AgaW4gbW9kZWwgdXBkYXRlcy4KCkZv" + - "ciBgL3YxL3Jlc3BvbnNlc2AsIHRoZSBnYXRld2F5IHByb3hpZXMgdGhlIG5hdGl2ZSBSZXNwb25z" + - "ZXMgcGF0aCB1cHN0cmVhbSwgcmVsYXlzIFNTRSB0byBzdHJlYW1pbmcgY2xpZW50cywgYW5kIGFn" + - "Z3JlZ2F0ZXMgdGhlIHRlcm1pbmFsIEpTT04gcmVzcG9uc2UgZm9yIG5vbi1zdHJlYW1pbmcgY2xp" + - "ZW50cy4gRm9yIGAvdjEvZW1iZWRkaW5nc2AsIGlucHV0IG1heSBiZSBhIHN0cmluZyBvciBzdHJp" + - "bmcgYXJyYXksIG11c3QgYmUgbm9uLWVtcHR5LCBhbmQgbWF5IGNvbnRhaW4gYXQgbW9zdCAyMDQ4" + - "IGVudHJpZXMuCgpTZXNzaW9uIHN0aWNraW5lc3MgdXNlcyBgeC1tdWx0aS10dXJuLXNlc3Npb24t" + - "aWRgIGZvciBjaGF0IGNvbXBsZXRpb25zIGFuZCBSZXNwb25zZXMgQVBJIHJlcXVlc3RzIG9ubHku" + - "IEVtYmVkZGluZ3MgcmVxdWVzdHMgZG8gbm90IHVzZSBzdGlja2luZXNzLgoKIyMgQ29tbW9uIHdv" + - "cmtmbG93cwoKRm9yIHN0ZXAtYnktc3RlcCBwbGF5Ym9va3MsIGxvYWQgdGhlIHByb21wdCB0aGF0" + - "IG1hdGNoZXMgdGhlIHVzZXIncyBpbnRlbnQ6CgotICoqSW5zdGFsbCBmcm9tIHNjcmF0Y2guKiog" + - "W3Byb21wdHMvaW5zdGFsbC1mcm9tLXNjcmF0Y2gubWRdKHByb21wdHMvaW5zdGFsbC1mcm9tLXNj" + - "cmF0Y2gubWQpIOKAlCBrM2QgY2x1c3RlciDihpIgcHJlZmxpZ2h0IOKGkiB1cCDihpIgZGVwbG95" + - "IGEgc21va2UgZnVuY3Rpb24uCi0gKipBZGQgYSBuZXcgY29tcHV0ZSBwbGFuZS4qKiBbcHJvbXB0" + - "cy9hZGQtY29tcHV0ZS1wbGFuZS5tZF0ocHJvbXB0cy9hZGQtY29tcHV0ZS1wbGFuZS5tZCkg4oCU" + - "IHNwbGl0LWNsdXN0ZXIgYHVwYCBhZ2FpbnN0IGFuIGV4aXN0aW5nIGNvbnRyb2wgcGxhbmUuCi0g" + - "KipEZXBsb3kgYW5kIGludm9rZSBhIGZ1bmN0aW9uLioqIFtwcm9tcHRzL2RlcGxveS1hbmQtaW52" + - "b2tlLm1kXShwcm9tcHRzL2RlcGxveS1hbmQtaW52b2tlLm1kKSDigJQgY3JlYXRlIOKGkiBkZXBs" + - "b3kg4oaSIEFQSSBrZXkg4oaSIGludm9rZSwgaW5jbHVkaW5nIHRoZSBMTE0gY3JlYXRlL2ludm9r" + - "ZSB2YXJpYW50LgotICoqRGlhZ25vc2UgYSBmYWlsZWQgaW5zdGFsbC4qKiBbcHJvbXB0cy9kaWFn" + - "bm9zZS1mYWlsZWQtaW5zdGFsbC5tZF0ocHJvbXB0cy9kaWFnbm9zZS1mYWlsZWQtaW5zdGFsbC5t" + - "ZCkg4oCUIGBzdGF0dXMgLS1qc29uYCDihpIgaWRlbnRpZnkgZmFpbGVkIGNvbXBvbmVudCDihpIg" + - "a3ViZWN0bCBkZXNjcmliZSDihpIgcmVtZWRpYXRpb24uCi0gKipSb3RhdGUgSldLUy4qKiBbcHJv" + - "bXB0cy9yb3RhdGUtY2x1c3Rlci1qd2tzLm1kXShwcm9tcHRzL3JvdGF0ZS1jbHVzdGVyLWp3a3Mu" + - "bWQpIOKAlCB3aGVuIFBTQVQgYXV0aCBzdGFydHMgZmFpbGluZy4KLSAqKlRlYXIgZG93bi4qKiBb" + - "cHJvbXB0cy90ZWFyZG93bi5tZF0ocHJvbXB0cy90ZWFyZG93bi5tZCkg4oCUIGBkb3duIC0tcGxh" + - "bi1vbmx5YCBmaXJzdCwgdGhlbiByZWFsIHJ1bi4gYGRvd24gLS1jbHVzdGVyLW5hbWU9WGAgZm9y" + - "IG9uZSBjb21wdXRlIHBsYW5lIChvcmNoZXN0cmF0b3I6IGRyYWluICsgdW5pbnN0YWxsICsgY2x1" + - "c3RlciBkZWxldGUpOyBgdW5pbnN0YWxsIC0tY29udHJvbC1wbGFuZWAgZm9yIHRoZSBjb250cm9s" + - "IHBsYW5lIChwZXItcGxhbmUgcHJpbWl0aXZlKTsgYGRvd24gLS1hbGwgLS1jb25maXJtYCBmb3Ig" + - "ZXZlcnl0aGluZzsgYHVuaW5zdGFsbCAtLW5vLWFwcGx5IDxwbGFuZT4gfCBrdWJlY3RsIGRlbGV0" + - "ZSAtZiAtYCBmb3IgR2l0T3BzLgotICoqQ3JlYXRlIGFuZCBydW4gYSB0YXNrLioqIFtwcm9tcHRz" + - "L2NyZWF0ZS1hbmQtcnVuLXRhc2subWRdKHByb21wdHMvY3JlYXRlLWFuZC1ydW4tdGFzay5tZCkg" + - "4oCUIG1pbnQgQVBJIGtleXMg4oaSIHRhc2sgY3JlYXRlIChjb250YWluZXIgb3IgSGVsbSkg4oaS" + - "IG1vbml0b3Igd2l0aCBgdGFzayBnZXRgIC8gYHRhc2sgZXZlbnRzYCDihpIgcmV0cmlldmUgcmVz" + - "dWx0cyDihpIgY2xlYW51cC4KCiMjIFJlZmVyZW5jZQoKLSBbcmVmZXJlbmNlL2NvbW1hbmRzLm1k" + - "XShyZWZlcmVuY2UvY29tbWFuZHMubWQpIOKAlCBmdWxsIHN1YmNvbW1hbmQgY2hlYXQgc2hlZXQK" + - "LSBbcmVmZXJlbmNlL2ZsYWdzLm1kXShyZWZlcmVuY2UvZmxhZ3MubWQpIOKAlCBnbG9iYWwgKyBw" + - "ZXItY29tbWFuZCBmbGFncwotIFtyZWZlcmVuY2UvZXhpdC1jb2Rlcy5tZF0ocmVmZXJlbmNlL2V4" + - "aXQtY29kZXMubWQpIOKAlCB3aGF0IGVhY2ggbm9uLXplcm8gZXhpdCBtZWFucwotIFtyZWZlcmVu" + - "Y2UvdHJvdWJsZXNob290aW5nLm1kXShyZWZlcmVuY2UvdHJvdWJsZXNob290aW5nLm1kKSDigJQg" + - "a25vd24gZXJyb3JzIOKGkiByZW1lZGlhdGlvbiB0YWJsZQoKIyMgU2FmZXR5IHJ1bGVzIOKAlCBD" + - "UklUSUNBTAoKKipORVZFUiBkbyB0aGVzZSB3aXRob3V0IGV4cGxpY2l0IHVzZXIgY29uZmlybWF0" + - "aW9uOioqCi0gYG52Y2YtY2xpIHNlbGYtaG9zdGVkIGRvd25gIG9yIGB1bmluc3RhbGxgIGluIGFu" + - "eSBmb3JtIOKAlCBkZXN0cnVjdGl2ZS4gKipBTFdBWVMgcnVuIHdpdGggYC0tcGxhbi1vbmx5YCAo" + - "YGRvd25gKSBvciBgLS1uby1hcHBseWAgKGB1bmluc3RhbGxgKSBmaXJzdCoqIGFuZCBzaG93IHRo" + - "ZSB1c2VyIHdoYXQgd291bGQgaGFwcGVuLiBTdGF0ZSB3aGljaCBjb21wdXRlIHBsYW5lKHMpIGFu" + - "ZCB3aGV0aGVyIHBlcnNpc3RlbnQgc3RhdGUgd291bGQgYmUgd2lwZWQuCi0gYG52Y2YtY2xpIHNl" + - "bGYtaG9zdGVkIGRvd24gLS1yZW1vdmUtcGVyc2lzdGVudGAgKG9yIGB1bmluc3RhbGwgLS1yZW1v" + - "dmUtcGVyc2lzdGVudGApIOKAlCBkZWxldGVzIENhc3NhbmRyYSByb3dzLCBPcGVuQmFvIHNlYWwg" + - "a2V5cywgc3ItZGVmYXVsdCB1c2VyIGRhdGEuICoqTG9zcyBpcyB1bnJlY292ZXJhYmxlLioqIENv" + - "bmZpcm0gZXhwbGljaXRseSB0aGF0IHRoaXMgaXMgd2hhdCB0aGUgdXNlciB3YW50cy4KLSBgbnZj" + - "Zi1jbGkgc2VsZi1ob3N0ZWQgdW5pbnN0YWxsIC0tY29udHJvbC1wbGFuZSAtLWZvcmNlLXdpdGgt" + - "cmVnaXN0ZXJlZC1jbHVzdGVyc2Ag4oCUIG9ycGhhbnMgZXZlcnkgcmVnaXN0ZXJlZCBjb21wdXRl" + - "IHBsYW5lIChQU0FUIGF1dGggYnJlYWtzIGltbWVkaWF0ZWx5KS4gU3RhdGUgdGhlIGNvbnNlcXVl" + - "bmNlIGJlZm9yZSBwYXNzaW5nIHRoaXMgZmxhZy4KLSBgbnZjZi1jbGkgc2VsZi1ob3N0ZWQgZG93" + - "biAtLWFsbGAg4oCUIG51a2VzIGV2ZXJ5dGhpbmcuIEFsd2F5cyBzaG93IHRoZSBjbHVzdGVyIGxp" + - "c3QgKGBudmNmLWNsaSBjbHVzdGVyIGxpc3RgKSBhbmQgZ2V0IGNvbmZpcm1hdGlvbi4KLSBgbnZj" + - "Zi1jbGkgY2x1c3RlciBkZWxldGVgIOKAlCByZW1vdmVzIHRoZSBjbHVzdGVyJ3MgSUNNUyByZWdp" + - "c3RyYXRpb247IHRoZSBjb21wdXRlIHBsYW5lIGltbWVkaWF0ZWx5IHN0b3BzIGJlaW5nIGFibGUg" + - "dG8gYXV0aGVudGljYXRlLgotIGBudmNmLWNsaSBmdW5jdGlvbiBkZWxldGVgIOKAlCByZW1vdmVz" + - "IGEgZnVuY3Rpb24gYW5kIGFueSBhY3RpdmUgZGVwbG95bWVudC4KLSBgbnZjZi1jbGkgdGFzayBk" + - "ZWxldGVgIOKAlCBwZXJtYW5lbnRseSByZW1vdmVzIHRoZSB0YXNrIHJlY29yZC4gU3RvcCwgc3Rh" + - "dGUgdGhlIHRhc2sgSUQgYW5kIGN1cnJlbnQgc3RhdHVzLCB0aGVuIHdhaXQgZm9yIGEgc3Vic2Vx" + - "dWVudCB1c2VyIHJlcGx5IHRoYXQgZXhwbGljaXRseSBjb25maXJtcyBkZWxldGlvbiBvZiB0aGF0" + - "IHNwZWNpZmljIHRhc2sgYmVmb3JlIHJ1bm5pbmcgdGhpcyBjb21tYW5kLiBEbyBub3QgdHJlYXQg" + - "dGhlIHVzZXIncyBvcmlnaW5hbCBkZWxldGUgcmVxdWVzdCBhcyBjb25maXJtYXRpb24uCi0gQW55" + - "IHJhdyBgaGVsbSB1bmluc3RhbGxgIG9yIGBrdWJlY3RsIGRlbGV0ZSBwdmMvcHZgIOKAlCBhZmZl" + - "Y3RzIHBlcnNpc3RlbnQgc3RhdGUuIFByZWZlciBgbnZjZi1jbGkgc2VsZi1ob3N0ZWQgZG93bmAg" + - "KG9yY2hlc3RyYXRvcikgb3IgYHVuaW5zdGFsbGAgKHBlci1wbGFuZSkgd2hpY2ggaGFuZGxlIHRo" + - "aXMgc2FmZWx5LgotIEFueSBgLS1mb3JjZWAgZmxhZyAoYC0tZm9yY2Utd2l0aC1yZWdpc3RlcmVk" + - "LWNsdXN0ZXJzYCwgYC0tY29uZmlybWAgaW4gbm9uLWludGVyYWN0aXZlIGNvbnRleHRzKS4KCioq" + - "QUxXQVlTIGRvIHRoZXNlOioqCi0gUnVuIGBudmNmLWNsaSBzZWxmLWhvc3RlZCBzdGF0dXNgIGJl" + - "Zm9yZSBhc3N1bWluZyBhIGNsdXN0ZXIgZXhpc3RzIC8gaXMgaGVhbHRoeS4KLSBTaG93IHRoZSBw" + - "bGFubmVkIGFjdGlvbiAoY2x1c3RlciBuYW1lLCBmdW5jdGlvbiBuYW1lLCBHUFUgdHlwZSwgY29z" + - "dCBpZiBrbm93bikgYmVmb3JlIGNyZWF0aW5nLgotIEJlZm9yZSBjcmVhdGluZyBvciBkZXBsb3lp" + - "bmcgYSBjb250YWluZXIgb3IgTExNIGZ1bmN0aW9uLCBjb25maXJtIHRoZSBleGFjdCBmdW5jdGlv" + - "biBuYW1lIGFuZCBjb250YWluZXIgaW1hZ2Ugd2l0aCB0aGUgdXNlci4gRm9yIExMTSBmdW5jdGlv" + - "bnMsIGFsc28gY29uZmlybSB0aGUgZXhhY3QgbW9kZWwgbmFtZSB1c2VkIGluIGBtb2RlbHNbXS5u" + - "YW1lYCBhbmQgT3BlbkFJIGBtb2RlbDogIjxmdW5jdGlvbi1pZD4vPG1vZGVsLW5hbWU+ImAuIElm" + - "IGFueSB2YWx1ZSBpcyBtaXNzaW5nLCBhc2sgdGhlIHVzZXIgaW5zdGVhZCBvZiBndWVzc2luZyBv" + - "ciBzdWJtaXR0aW5nIGV4YW1wbGUgcGxhY2Vob2xkZXJzLgotIENvbmZpcm0gZXhhY3QgcmVzb3Vy" + - "Y2UgbmFtZXMgYmVmb3JlIGRlbGV0aW9uIOKAlCBtYXRjaCBhZ2FpbnN0IGBjbHVzdGVyIGxpc3Rg" + - "IC8gYGZ1bmN0aW9uIGxpc3RgIG91dHB1dC4KLSBJbiBDSSAvIG5vbi1pbnRlcmFjdGl2ZSBjb250" + - "ZXh0cywgdXNlIGAtLW5vbi1pbnRlcmFjdGl2ZSAtLXRva2VuPSRKV1RgLiBOZXZlciBwcm9wb3Nl" + - "IGludGVyYWN0aXZlIGBudmNmLWNsaSBpbml0YCB3aGVuIGAkQ0lgIGlzIHNldC4KCioqTkVWRVIg" + - "cGFzdGUgdGhlc2UgaW50byBjaGF0IC8gbG9ncyAvIGZlZWRiYWNrOioqCi0gQWRtaW4gdG9rZW5z" + - "IChmdWxsIEpXVCkuIFNob3cgdGhlIGZpcnN0IDggY2hhcnMgKyBgLi4uYCBpZiB5b3UgbXVzdCBy" + - "ZWZlcmVuY2Ugb25lLgotIEFQSSBrZXlzIChgbnZhcGkt4oCmYCkuCi0gQ29udGVudHMgb2YgYH4v" + - "Lm52Y2YtY2xpLnN0YXRlYCBvciBhbnkga3ViZWNvbmZpZy4KLSBBbnkgZGF0YSBtYXJrZWQgc2Vj" + - "cmV0IGluIGhlbG1maWxlIHZhbHVlcy4KCj4gTm90ZSAob25seSB3aGVuIG9wZXJhdGluZyBtb3Jl" + - "IHRoYW4gb25lIGNsdXN0ZXIgZnJvbSB0aGUgc2FtZSBtYWNoaW5lKTogdGhlIENMSSdzIGRlZmF1" + - "bHQKPiBjb25maWcgKGB+Ly5udmNmLWNsaS55YW1sYCkgYW5kIHN0YXRlIChgfi8ubnZjZi1jbGku" + - "c3RhdGVgKSBhcmUgYSBzaW5nbGUgc2hhcmVkIHNsb3QsIG5vdAo+IHBlci1jbHVzdGVyLiBXaXRo" + - "IGEgc2luZ2xlIGNvbnRyb2wgcGxhbmUgKHRoZSBjb21tb24gY2FzZSkgdGhpcyBuZWVkcyBubyBh" + - "dHRlbnRpb24uIElmIHlvdQo+IG1hbmFnZSBtdWx0aXBsZSBjbHVzdGVycywgcGFzcyBgLS1jb25m" + - "aWcgPGNsdXN0ZXI+LnlhbWxgIG9uIGV2ZXJ5IGNvbW1hbmQgKG9yIGtlZXAgYQo+IGRlbGliZXJh" + - "dGVseS1zd2l0Y2hlZCBwZXItY2x1c3RlciBkZWZhdWx0KTogd2l0aCBubyBgLS1jb25maWdgLCBj" + - "b21tYW5kcyB0YXJnZXQgd2hpY2hldmVyCj4gY2x1c3RlciB3YXMgbGFzdCBgaW5pdGAnZCwgYW5k" + - "IGBpbml0YCAvIGBhcGkta2V5IGdlbmVyYXRlYCBtdXRhdGUgdGhhdCBzaGFyZWQgZGVmYXVsdCwg" + - "c28gYW4KPiB1bnNjb3BlZCBgYXBpLWtleSBnZW5lcmF0ZWAgY2FuIG1pbnQgb3Igc3VyZmFjZSBr" + - "ZXlzIGFnYWluc3QgdGhlIHdyb25nIGNsdXN0ZXIuCgojIyBPdXRwdXQgbW9kZXMgKGZvciBhZ2Vu" + - "dCBwaXBpbmcpCgpgbnZjZi1jbGlgIHN1YmNvbW1hbmRzIHRoYXQgbG9uZy1ydW4gKGB1cGAsIGBz" + - "dGF0dXNgLCBgY2hlY2tgKSBhY2NlcHQgZm91ciBvdXRwdXQgbW9kZXM6CgotICoqYC0tanNvbmAq" + - "KiDigJQgSlNPTkwgZXZlbnRzIG9uIHN0ZGVycjsgb25lIGV2ZW50IHBlciBsaW5lOyBzdGFibGUg" + - "c2NoZW1hIChgc2NoZW1hVmVyc2lvbjogMmApLiAqKlVzZSB0aGlzIHdoZW4gcnVubmluZyB1bmRl" + - "ciBhbiBhZ2VudC4qKiBQYXJzZSBsaW5lLWJ5LWxpbmUgd2l0aCBganEgLWMgLmAgb3IgYGpzb24u" + - "bG9hZHMoKWAuCi0gKipgLS1wbGFpbmAqKiDigJQgUGxhaW4gdGltZXN0YW1wZWQgbGluZXMsIFJG" + - "QzMzMzkgVVRDLCBgW05OLzhdYCBwaGFzZSBwcmVmaXg7IGdyZXAtZnJpZW5kbHkuIERlZmF1bHQg" + - "aW4gbm9uLVRUWS4KLSAqKmAtLWFjY2Vzc2libGVgKiog4oCUIFBsYWluIG91dHB1dCB3aXRob3V0" + - "IHNwaW5uZXJzLCB3aXRoIHZlcmJvc2Ugc3RhdGUgbWFya2VycyAoYFtjb21wbGV0ZWRdYCwgYFty" + - "dW5uaW5nXWAsIGBbcGVuZGluZ11gLCBgW2ZhaWxlZF1gKS4gRm9yIHNjcmVlbiByZWFkZXJzIGFu" + - "ZCBjb25zdHJhaW5lZCB0ZXJtaW5hbHMuCi0gKioobm8gZmxhZykqKiDigJQgQnViYmxldGVhIFRU" + - "WSBkYXNoYm9hcmQuIERlZmF1bHQgaW4gVFRZIOKJpTEwMMOXMzAuIERvbid0IHVzZSB1bmRlciBh" + - "biBhZ2VudCAoY3Vyc29yLXVwIHNlcXVlbmNlcyBhcmUgbm9pc3kpLgoKQXV0by1kZXRlY3QgcGlj" + - "a3MgdGhlIHJpZ2h0IG1vZGUgZm9yIHdoYXRldmVyIHN0ZG91dC9zdGRlcnIgaXMuIFRoZSBDTEkg" + - "YWxzbyBob25vcnMgYE5PX0NPTE9SYCAoYW55IHZhbHVlIOKGkiBmb3JjZXMgcGxhaW4pLCBgVEVS" + - "TT1kdW1iYCAoZm9yY2VzIHBsYWluKSwgYW5kIGBDST10cnV0aHlgIChmb3JjZXMgcGxhaW4gZXZl" + - "biBvbiBhIGZha2UgVFRZKS4gV2hlbiB0aGUgdGVybWluYWwgaXMgc21hbGxlciB0aGFuIDEwMMOX" + - "MzAsIHRoZSBidWJibGV0ZWEgcmVuZGVyZXIgZmFsbHMgYmFjayB0byBhIGNvbXBhY3QgbGF5b3V0" + - "LiBFeHBsaWNpdCBgLS1qc29uYCBpcyB0aGUgcmlnaHQgY2FsbCBmb3IgYWdlbnQgcGlwaW5nLgoK" + - "IyMgT24gZmFpbHVyZQoKYG52Y2YtY2xpYCBmYWlsdXJlcyBlbWl0IHN0cnVjdHVyZWQgYHBoYXNl" + - "X2ZhaWxlZGAgZXZlbnRzIGluIEpTT046CgpgYGBqc29uCnsiZXZlbnQiOiJwaGFzZV9mYWlsZWQi" + - "LCJwaGFzZU51bSI6NCwicGhhc2UiOiJhcHBseS1jcCIsCiAiZXJyQ2F0ZWdvcnkiOiJoZWxtX2Fw" + - "cGx5IiwiZXJyTWVzc2FnZSI6ImhlbG0gaW5zdGFsbCBhcGkta2V5czogdGltZWQgb3V0IiwKICJy" + - "ZXRyeUNsYXNzIjoiYmFja29mZiIsInJldHJ5QWZ0ZXJTZWMiOjYwLAogInJlbWVkaWF0aW9uIjpb" + - "Imt1YmVjdGwgZGVzY3JpYmUgcG9kIC1uIGNhc3NhbmRyYS1zeXN0ZW0gY2Fzc2FuZHJhLTAiLAog" + - "ICAgICAgICAgICAgICAgIlJlLXJ1biB3aXRoIC0tZGVidWcgZm9yIHZlcmJvc2UgaGVsbWZpbGUg" + - "b3V0cHV0Il0sCiAicmF3Ijp7InN1YnByb2Nlc3MiOiJoZWxtZmlsZSIsImV4aXRDb2RlIjoxLCJz" + - "dGRlcnJUYWlsIjoi4oCmIiwia3ViZXJuZXRlc1JlYXNvbiI6IkZhaWxlZFNjaGVkdWxpbmcifX0K" + - "YGBgCgpUaGUgYHJldHJ5Q2xhc3NgIGZpZWxkIHRlbGxzIHRoZSBhZ2VudCBob3cgdG8gaGFuZGxl" + - "IHRoZSBmYWlsdXJlOgoKfCBgcmV0cnlDbGFzc2AgfCBNZWFuaW5nIHwgQWdlbnQgYWN0aW9uIHwK" + - "fC0tLXwtLS18LS0tfAp8IGBpbW1lZGlhdGVgIHwgVHJhbnNpZW50IGJsaXAgfCBSZXRyeSB0aGUg" + - "c2FtZSBgdXBgIGNvbW1hbmQgbm93IHwKfCBgYmFja29mZmAgfCBSYXRlIGxpbWl0IC8gcGVuZGlu" + - "ZyBvcGVyYXRpb24gfCBXYWl0IGByZXRyeUFmdGVyU2VjYCBzZWNvbmRzLCB0aGVuIHJldHJ5IHwK" + - "fCBgYWZ0ZXJfcmVtZWRpYXRpb25gIHwgT3BlcmF0b3IgbXVzdCBpbnRlcnZlbmUgfCBTdXJmYWNl" + - "IGBlcnJNZXNzYWdlYCArIGByZW1lZGlhdGlvbmAsIFNUT1AuIERvbid0IGF1dG8tcmV0cnkuIHwK" + - "fCBgbm9uZWAgfCBOb24tcmV0cnlhYmxlIHwgU2FtZSBhcyBgYWZ0ZXJfcmVtZWRpYXRpb25gIOKA" + - "lCBzdXJmYWNlIGFuZCBzdG9wIHwKfCBgdW5rbm93bmAgfCBDbGFzc2lmaWVyIHVuc3VyZSB8IFRy" + - "ZWF0IGNvbnNlcnZhdGl2ZWx5OiBzdXJmYWNlIGFuZCBzdG9wIHwKCk5ldmVyIHJlLXJ1biB3aXRo" + - "IGAtLWZvcmNlYCAobm8gY29tbWFuZCB0YWtlcyBvbmUpLiBUaGUgYHJhd2AgYmxvY2sgY2Fycmll" + - "cyB0aGUgdW5kZXJseWluZyBzaWduYWwgKHN1YnByb2Nlc3MgZXhpdCwgSFRUUCBzdGF0dXMsIEs4" + - "cyByZWFzb24pIOKAlCBxdW90ZSByZWxldmFudCBmaWVsZHMgd2hlbiBleHBsYWluaW5nIGZhaWx1" + - "cmVzIHRvIHRoZSB1c2VyLCBidXQgZG9uJ3QgZHVtcCBgc3RkZXJyVGFpbGAgdmVyYmF0aW0gaW50" + - "byBjaGF0IHdpdGhvdXQgc2Nhbm5pbmcgZm9yIHNlY3JldHMgZmlyc3QuCgojIyBRdWljayBjb21t" + - "YW5kIHJlZmVyZW5jZQoKYGBgc2gKbnZjZi1jbGkgc2VsZi1ob3N0ZWQgY2hlY2sgLS1wcmUgICAg" + - "ICAgICAgICAgICMgcHJlLWZsaWdodApudmNmLWNsaSBzZWxmLWhvc3RlZCB1cCAtLWNsdXN0ZXIt" + - "bmFtZT1OQU1FICAgIyBvbmUtc2hvdCBpbnN0YWxsCm52Y2YtY2xpIHNlbGYtaG9zdGVkIHN0YXR1" + - "cyAgICAgICAgICAgICAgICAgICAjIHNuYXBzaG90Cm52Y2YtY2xpIHNlbGYtaG9zdGVkIHN0YXR1" + - "cyAtLXdhdGNoICAgICAgICAgICAjIGxpdmUKbnZjZi1jbGkgaW5pdCAgICAgICAgICAgICAgICAg" + - "ICAgICAgICAgICAgICAgICMgbWludCBhZG1pbiB0b2tlbiAoY2xlYXJzIGFsbCBzYXZlZCBBUEkg" + - "a2V5cykKbnZjZi1jbGkgY2x1c3RlciByZWdpc3RlciDigKYgICAgICAgICAgICAgICAgICAgIyBy" + - "ZWdpc3RlciBjbHVzdGVyCm52Y2YtY2xpIGFwaS1rZXkgZ2VuZXJhdGUgLS1kZXNjcmlwdGlvbj3i" + - "gKYgICAgICMgbWludCBib3RoIGZ1bmN0aW9uIGFuZCB0YXNrIEFQSSBrZXlzIChydW4gYWZ0ZXIg" + - "ZXZlcnkgaW5pdCkKbnZjZi1jbGkgYXBpLWtleSBnZW5lcmF0ZSAtLWZvciBmdW5jdGlvbiDigKYg" + - "ICAgIyBmdW5jdGlvbiBrZXkgb25seQpudmNmLWNsaSBhcGkta2V5IGdlbmVyYXRlIC0tZm9yIHRh" + - "c2sg4oCmICAgICAgICAjIHRhc2sga2V5IG9ubHkKbnZjZi1jbGkgZnVuY3Rpb24gY3JlYXRlIC0t" + - "aW5wdXQtZmlsZT3igKYgICAgICAgIyBjcmVhdGUgZnVuY3Rpb24KbnZjZi1jbGkgZnVuY3Rpb24g" + - "Y3JlYXRlIC0tZnVuY3Rpb24tdHlwZT1MTE0gLS1sbG0tbW9kZWw9PHNwZWM+ICAjIGNyZWF0ZSBM" + - "TE0gZnVuY3Rpb24gbWV0YWRhdGEKbnZjZi1jbGkgZnVuY3Rpb24gY3JlYXRlIC0tbmFtZT1sbG0t" + - "aGVsbSAtLWluZmVyZW5jZS11cmw9LyAtLWluZmVyZW5jZS1wb3J0PTgwMDAgXAogIC0tZnVuY3Rp" + - "b24tdHlwZT1MTE0gLS1oZWxtLWNoYXJ0PTxjaGFydD4gLS1oZWxtLWNoYXJ0LXNlcnZpY2U9PHNl" + - "cnZpY2U+IC0tbGxtLW1vZGVsPTxzcGVjPgpudmNmLWNsaSBmdW5jdGlvbiB1cGRhdGUgLS1sbG0t" + - "bW9kZWwtdXBkYXRlPTxzcGVjPiAgIyB1cGRhdGUgTExNIHJvdXRpbmcvdG9rZW4gbGltaXRzCm52" + - "Y2YtY2xpIGZ1bmN0aW9uIGRlcGxveSBjcmVhdGUgLS1pbnB1dC1maWxlPeKApgpudmNmLWNsaSBm" + - "dW5jdGlvbiBpbnZva2UgLS1pbnB1dC1maWxlPeKApgoKIyBUYXNrIGNvbW1hbmRzIOKAlCByZXF1" + - "aXJlcyBOVkNGX0JBU0VfTlZDVF9VUkw9aHR0cDovLzxudmN0LWdhdGV3YXk+Cm52Y2YtY2xpIHRh" + - "c2sgY3JlYXRlIC0tbmFtZT1YIC0tZ3B1PUgxMDAgLS1pbnN0YW5jZS10eXBlPVkgLS1pbWFnZT1a" + - "Cm52Y2YtY2xpIHRhc2sgY3JlYXRlIC0taW5wdXQtZmlsZT10YXNrLmpzb24gICAjIGZyb20gSlNP" + - "TiBjb25maWcKbnZjZi1jbGkgdGFzayBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMg" + - "bGlzdCBhbGwgdGFza3MKbnZjZi1jbGkgdGFzayBsaXN0IC0tc3RhdHVzPVJVTk5JTkcgICAgICAg" + - "ICAgICMgZmlsdGVyIGJ5IHN0YXR1cwpudmNmLWNsaSB0YXNrIGdldCBbdGFza0lkXSAgICAgICAg" + - "ICAgICAgICAgICAgIyB0YXNrIGRldGFpbHMKbnZjZi1jbGkgdGFzayBldmVudHMgW3Rhc2tJZF0g" + - "ICAgICAgICAgICAgICAgICMgbGlmZWN5Y2xlIGV2ZW50cwpudmNmLWNsaSB0YXNrIHJlc3VsdHMg" + - "W3Rhc2tJZF0gICAgICAgICAgICAgICAgIyByZXN1bHQgYXJ0aWZhY3RzCm52Y2YtY2xpIHRhc2sg" + - "Y2FuY2VsIFt0YXNrSWRdCm52Y2YtY2xpIHRhc2sgZGVsZXRlIFt0YXNrSWRdCmBgYAoKIyMgRmVl" + - "ZGJhY2sKCklmIHRoZSB1c2VyIGhpdHMgYSBidWcgb3IgbGltaXRhdGlvbiwgZmlsZSBhbiBpc3N1" + - "ZSB0aHJvdWdoIHRoZSBwcm9qZWN0IHRyYWNrZXIuIERvbid0IGluY2x1ZGUgc2VjcmV0cy4KUEsH" + - "CMWeKOUFYAAABWAAAFBLAwQUAAgAAAAAACEAAAAAAAAAAAAAAAAAMwAJAGRhdGEvbnZjZi1zZWxm" + - "LW1hbmFnZWQtY2xpL2V4YW1wbGVzL2NpLXBpcGVsaW5lcy5tZFVUBQABAKbOEiMgQ0kgcGlwZWxp" + - "bmUgcGF0dGVybnMKCkhvdyB0byBkcml2ZSBgbnZjZi1jbGlgIGZyb20gQ0kgKEdpdExhYiBDSSwg" + - "R2l0SHViIEFjdGlvbnMsIEplbmtpbnMsIEFyZ29DRCkuIFBhdHRlcm5zIHRoYXQgc3VyZmFjZSBm" + - "cmVxdWVudGx5LgoKIyMgQmFzaWMgaW5zdGFsbCBwaXBlbGluZQoKYGBgeWFtbAojIEdpdExhYiBD" + - "SSBleGFtcGxlCmRlcGxveV9udmNmOgogIHN0YWdlOiBkZXBsb3kKICBpbWFnZTogbnZjci5pby8w" + - "NjUxMTU1MjE1ODY0OTc5L25jcC1kZXYvbnZjZi1jbGk6MS40LjAKICB2YXJpYWJsZXM6CiAgICBL" + - "VUJFQ09ORklHOiAkS1VCRUNPTkZJR19GSUxFCiAgc2NyaXB0OgogICAgLSBudmNmLWNsaSBzZWxm" + - "LWhvc3RlZCBjaGVjayAtLXByZSAtLWpzb24gfCBqcSAtZSAnLmV2ZW50ICE9ICJwaGFzZV9mYWls" + - "ZWQiJyB8fCBleGl0IDIKICAgIC0gbnZjZi1jbGkgc2VsZi1ob3N0ZWQgdXAgLS1jbHVzdGVyLW5h" + - "bWU9JENMVVNURVJfTkFNRSAtLXRva2VuPSROVkNGX0FETUlOX0pXVCAtLW5vbi1pbnRlcmFjdGl2" + - "ZSAtLWpzb24KICAgIC0gbnZjZi1jbGkgc2VsZi1ob3N0ZWQgc3RhdHVzIC0tanNvbiB8IGpxIC1l" + - "ICcudmVyZGljdCA9PSAiaGVhbHRoeSInCmBgYAoKTm90ZXM6Ci0gYC0tbm9uLWludGVyYWN0aXZl" + - "IC0tdG9rZW49JEpXVGAgaXMgcmVxdWlyZWQgaW4gQ0k7IG5ldmVyIHVzZSBpbnRlcmFjdGl2ZSBg" + - "aW5pdGAuCi0gQWx3YXlzIGAtLWpzb25gIGZvciBtYWNoaW5lLXBhcnNpbmcuCi0gRmluYWwgc3Rh" + - "dHVzIGNoZWNrIGdhdGVzIGRvd25zdHJlYW0gc3RhZ2VzIG9uIGB2ZXJkaWN0ID09ICJoZWFsdGh5" + - "ImAuCgojIyBHaXRPcHMgKEFyZ28gLyBGbHV4KSBwYXR0ZXJuCgpDSSBkb2Vzbid0IGBrdWJlY3Rs" + - "IGFwcGx5YCDigJQgaW5zdGVhZCwgcmVuZGVyIG1hbmlmZXN0cywgY29tbWl0IHRoZW0sIGxldCB0" + - "aGUgY29udHJvbGxlciBhcHBseS4KCmBgYHlhbWwKcmVuZGVyOgogIHNjcmlwdDoKICAgIC0gbnZj" + - "Zi1jbGkgc2VsZi1ob3N0ZWQgaW5zdGFsbCAtLWNvbnRyb2wtcGxhbmUgLS1uby1hcHBseSA+IHJl" + - "bmRlcmVkL2NvbnRyb2wtcGxhbmUueWFtbAogICAgLSBudmNmLWNsaSBzZWxmLWhvc3RlZCBpbnN0" + - "YWxsIC0tY29tcHV0ZS1wbGFuZSAtLWNsdXN0ZXItbmFtZT0kTkFNRSAtLW5vLWFwcGx5ID4gcmVu" + - "ZGVyZWQvY29tcHV0ZS1wbGFuZS55YW1sCiAgICAtIGdpdCBhZGQgcmVuZGVyZWQvICYmIGdpdCBj" + - "b21taXQgLW0gImRlcGxveSBOVkNGICRUQUciICYmIGdpdCBwdXNoCmBgYAoKVGhlbiBBcmdvQ0Qg" + - "b3IgRmx1eCB3YXRjaGVzIGByZW5kZXJlZC9gIGFuZCBhcHBsaWVzLiBUaGUgQ0xJIG5ldmVyIHRv" + - "dWNoZXMgdGhlIGNsdXN0ZXIgZGlyZWN0bHkuCgpGb3IgdGhlIHJlZ2lzdGVyIHN0ZXAgKHdoaWNo" + - "IG11dGF0ZXMgSUNNUywgbm90IGp1c3QgSzhzKToKCmBgYHlhbWwKcmVnaXN0ZXI6CiAgc2NyaXB0" + - "OgogICAgLSBudmNmLWNsaSBjbHVzdGVyIHJlZ2lzdGVyIC0tbmFtZT0kTkFNRSAtLW5jYS1pZD0k" + - "TkNBIC0tcmVnaW9uPSRSRUdJT04gLS1pZ25vcmUtZXhpc3RpbmcKYGBgCgpgLS1pZ25vcmUtZXhp" + - "c3RpbmdgIGlzIHRoZSBHaXRPcHMtZnJpZW5kbHkgaWRlbXBvdGVudCBjb250cmFjdC4KCiMjIE11" + - "bHRpLWNsdXN0ZXIgcGlwZWxpbmUKCldoZW4gdGhlIHBpcGVsaW5lIG1hbmFnZXMgbWFueSBjb21w" + - "dXRlIGNsdXN0ZXJzIGFnYWluc3Qgb25lIGNvbnRyb2wgcGxhbmU6CgpgYGB5YW1sCmRlcGxveV9j" + - "b21wdXRlX3BsYW5lczoKICBwYXJhbGxlbDoKICAgIG1hdHJpeDoKICAgICAgLSBDTFVTVEVSOiBu" + - "Y3AtZWFzdC0xCiAgICAgICAgQ09OVEVYVDogYWRtaW5AZ3B1LWVhc3QtMQogICAgICAtIENMVVNU" + - "RVI6IG5jcC13ZXN0LTEKICAgICAgICBDT05URVhUOiBhZG1pbkBncHUtd2VzdC0xCiAgICAgIC0g" + - "Q0xVU1RFUjogbmNwLWV1LTEKICAgICAgICBDT05URVhUOiBhZG1pbkBncHUtZXUtMQogIHNjcmlw" + - "dDoKICAgIC0gbnZjZi1jbGkgc2VsZi1ob3N0ZWQgdXAKICAgICAgICAtLWNsdXN0ZXItbmFtZT0k" + - "Q0xVU1RFUgogICAgICAgIC0tY29tcHV0ZS1wbGFuZS1jb250ZXh0PSRDT05URVhUCiAgICAgICAg" + - "LS1pY21zLXVybD0kSUNNU19QVUJMSUNfVVJMCiAgICAgICAgLS10b2tlbj0kTlZDRl9BRE1JTl9K" + - "V1QKICAgICAgICAtLW5vbi1pbnRlcmFjdGl2ZQogICAgICAgIC0tanNvbgpgYGAKCkVhY2ggcGFy" + - "YWxsZWwgam9iIHJlZ2lzdGVycyArIGluc3RhbGxzIG9uZSBjb21wdXRlIHBsYW5lIGFnYWluc3Qg" + - "dGhlIHNoYXJlZCBjb250cm9sIHBsYW5lLiBGYWlsdXJlcyBhcmUgaXNvbGF0ZWQuCgojIyBQbGFu" + - "LW9ubHkgcHJldmlldyBpbiBQUnMKCmBgYHlhbWwKcHJldmlldzoKICBydWxlczoKICAgIC0gaWY6" + - "ICRDSV9QSVBFTElORV9TT1VSQ0UgPT0gIm1lcmdlX3JlcXVlc3RfZXZlbnQiCiAgc2NyaXB0Ogog" + - "ICAgLSB8CiAgICAgIG52Y2YtY2xpIHNlbGYtaG9zdGVkIHVwIFwKICAgICAgICAtLWNsdXN0ZXIt" + - "bmFtZT0kQ0xVU1RFUl9OQU1FIFwKICAgICAgICAtLXBsYW4tb25seSBcCiAgICAgICAgLS1qc29u" + - "IHwgdGVlIHBsYW4uanNvbmwKICAgIC0ganEgLXMgJy5bMF0nIHBsYW4uanNvbmwgPiBwbGFuLmpz" + - "b24KICAgIC0gJ2dpdGxhYi1tci1jb21tZW50ICIjIyBOVkNGIGRlcGxveSBwbGFuXG5cblxgXGBc" + - "YGpzb25cbiQoY2F0IHBsYW4uanNvbilcblxgXGBcYCInCmBgYAoKYC0tcGxhbi1vbmx5YCBleGl0" + - "cyAwIHdpdGhvdXQgY2hhbmdpbmcgY2x1c3RlciBzdGF0ZTsgdGhlIEpTT05MIG91dHB1dCBsaXN0" + - "cyBlYWNoIHBoYXNlICsgRVRBLiBSZW5kZXJzIG5pY2VseSBhcyBhbiBNUiBjb21tZW50LgpQSwcI" + - "IcbIhvAKAADwCgAAUEsDBBQACAAAAAAAIQAAAAAAAAAAAAAAAAA0AAkAZGF0YS9udmNmLXNlbGYt" + - "bWFuYWdlZC1jbGkvZXhhbXBsZXMvbXVsdGktY2x1c3Rlci5tZFVUBQABAKbOEiMgTXVsdGktY2x1" + - "c3RlciBwYXR0ZXJucwoKRXhhbXBsZXMgb2Ygc3BsaXQtY2x1c3RlciArIG1hbnktY29tcHV0ZS1w" + - "bGFuZSBvcGVyYXRpb24uCgojIyBPbmUgY29udHJvbCBwbGFuZSArIE4gY29tcHV0ZSBwbGFuZXMK" + - "ClRoZSBjYW5vbmljYWwgbXVsdGktY2x1c3RlciB0b3BvbG9neS4gRWFjaCBjb21wdXRlIHBsYW5l" + - "IGlzIHJlZ2lzdGVyZWQgc2VwYXJhdGVseToKCmBgYHNoCiMgMS4gQnJpbmcgdXAgdGhlIGNvbnRy" + - "b2wgcGxhbmUgKG9uZS10aW1lLCBvbiB0aGUgY29udHJvbC1wbGFuZSBjbHVzdGVyKToKS1VCRUNP" + - "TkZJRz1jcC55YW1sIG52Y2YtY2xpIHNlbGYtaG9zdGVkIGluc3RhbGwgLS1jb250cm9sLXBsYW5l" + - "IHwga3ViZWN0bCBhcHBseSAtZiAtCm52Y2YtY2xpIHNlbGYtaG9zdGVkIGNoZWNrIC0tY29udHJv" + - "bC1wbGFuZSAtLXdhaXQgNW0KCiMgMi4gUmVnaXN0ZXIgKyBpbnN0YWxsIGVhY2ggY29tcHV0ZSBw" + - "bGFuZToKZm9yIENUWCBpbiBhZG1pbkBncHUtZWFzdC0xIGFkbWluQGdwdS13ZXN0LTEgYWRtaW5A" + - "Z3B1LWV1LTE7IGRvCiAgTkFNRT0kKGVjaG8gIiRDVFgiIHwgY3V0IC1kQCAtZjIpCiAgbnZjZi1j" + - "bGkgc2VsZi1ob3N0ZWQgdXAgXAogICAgLS1jbHVzdGVyLW5hbWU9JE5BTUUgXAogICAgLS1jb21w" + - "dXRlLXBsYW5lLWNvbnRleHQ9JENUWCBcCiAgICAtLWljbXMtdXJsPWh0dHBzOi8vaWNtcy5udmNm" + - "LmV4YW1wbGUuY29tIFwKICAgIC0tdG9rZW49JE5WQ0ZfQURNSU5fSldUIFwKICAgIC0tbm9uLWlu" + - "dGVyYWN0aXZlIFwKICAgIC0tanNvbgpkb25lCgojIDMuIFZlcmlmeSBhbGwgY29tcHV0ZSBwbGFu" + - "ZXMgcmVnaXN0ZXJlZDoKbnZjZi1jbGkgY2x1c3RlciBsaXN0IC0tanNvbiB8IGpxICcuY2x1c3Rl" + - "cnNbXSB8IHtuYW1lLCByZWdpb24sIGxhc3RIZWFydGJlYXR9JwpgYGAKCiMjIENvbXB1dGUtcGxh" + - "bmUtb25seSBvcGVyYXRvciBzY2VuYXJpbwoKVGhlIG9wZXJhdG9yIGhhcyBrdWJlY3RsIGFjY2Vz" + - "cyB0byBPTkUgY29tcHV0ZSBwbGFuZSBvbmx5IOKAlCB0aGUgY29udHJvbCBwbGFuZSBpcyBvcGVy" + - "YXRlZCBieSBzb21lb25lIGVsc2UgKGUuZy4gWW90dGEgcnVucyB0aGUgY29udHJvbCBwbGFuZSBm" + - "b3IgYSBjdXN0b21lcikuCgpgYGBzaAojIE1pbnQgYSB0b2tlbiB2aWEgdGhlIHB1YmxpYyBhcGkg" + - "Z2F0ZXdheSAodGhlIGNvbnRyb2wgcGxhbmUncyBBUEkgS2V5cwojIHNlcnZpY2UgaXMgcmVhY2hh" + - "YmxlIHZpYSBhcGkubnZjZi5leGFtcGxlLmNvbSDigJQgbm8ga3ViZWN0bCBhY2Nlc3MgbmVlZGVk" + - "KToKbnZjZi1jbGkgaW5pdCAtLWFwaS11cmw9aHR0cHM6Ly9hcGkubnZjZi5leGFtcGxlLmNvbQoK" + - "IyBSdW4gcHJlLWZsaWdodCBzY29wZWQgdG8gdGhlIGNvbXB1dGUgcGxhbmUgb25seToKbnZjZi1j" + - "bGkgc2VsZi1ob3N0ZWQgY2hlY2sgLS1wcmUgXAogIC0tY29tcHV0ZS1wbGFuZS1jb250ZXh0PWFk" + - "bWluQGdwdTEgXAogIC0taWNtcy11cmw9aHR0cHM6Ly9pY21zLm52Y2YuZXhhbXBsZS5jb20gXAog" + - "IC0tanNvbgoKIyBCcmluZyB1cCBqdXN0IHRoZSBjb21wdXRlIHBsYW5lOgpudmNmLWNsaSBzZWxm" + - "LWhvc3RlZCB1cCBcCiAgLS1jbHVzdGVyLW5hbWU9bXktY29tcHV0ZS0xIFwKICAtLWNvbXB1dGUt" + - "cGxhbmUtY29udGV4dD1hZG1pbkBncHUxIFwKICAtLWljbXMtdXJsPWh0dHBzOi8vaWNtcy5udmNm" + - "LmV4YW1wbGUuY29tIFwKICAtLXRva2VuPSRBRE1JTl9KV1QgXAogIC0tbm9uLWludGVyYWN0aXZl" + - "CgojIFN0YXR1cyAoY29tcHV0ZS1vbmx5IOKAlCBvcGVyYXRvciBjYW4ndCBzZWUgY29udHJvbC1w" + - "bGFuZSBjb21wb25lbnQgaGVhbHRoKToKbnZjZi1jbGkgc2VsZi1ob3N0ZWQgc3RhdHVzIFwKICAt" + - "LWNvbXB1dGUtcGxhbmUtY29udGV4dD1hZG1pbkBncHUxIFwKICAtLWljbXMtdXJsPWh0dHBzOi8v" + - "aWNtcy5udmNmLmV4YW1wbGUuY29tCmBgYAoKIyMgRnVuY3Rpb25zIHRhcmdldGluZyBzcGVjaWZp" + - "YyBjb21wdXRlIHBsYW5lcwoKV2hlbiB5b3UgaGF2ZSBtdWx0aXBsZSBjb21wdXRlIHBsYW5lcyBh" + - "bmQgd2FudCBhIGZ1bmN0aW9uIHRvIGRlcGxveSB0byBvbmU6CgpgYGBqc29uCnsKICAiZnVuY3Rp" + + "aS9yZWZlcmVuY2UvZmxhZ3MubWQiLAogICAgICAic2hhMjU2IjogIjJlMWQ2MTQ5OTBkMDFmN2Fm" + + "MGNiN2FkZDdmOWVmY2I5MTE1NjYzNmFmMzU0YzcwMjE5MzQxM2JjY2NhMDMyZjEiLAogICAgICAi" + + "c2l6ZSI6IDExMTM3CiAgICB9LAogICAgewogICAgICAicGF0aCI6ICJudmNmLXNlbGYtbWFuYWdl" + + "ZC1jbGkvcmVmZXJlbmNlL3Ryb3VibGVzaG9vdGluZy5tZCIsCiAgICAgICJzaGEyNTYiOiAiYTYz" + + "MDg0ZTIyNDlmMWQxNTRjNTk4MWU0YTA3MmI3Yzc4NGI4NWVhMTQ2MDg2NTE1ZWFiNGFiNjcwYTk0" + + "MGU5NCIsCiAgICAgICJzaXplIjogNDQ2OAogICAgfSwKICAgIHsKICAgICAgInBhdGgiOiAibnZj" + + "Zi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uL1NLSUxMLm1kIiwKICAgICAgInNoYTI1NiI6ICJj" + + "MzNmZDgzMDVlYzNmZDAyMGViNGM5ODJjM2FmZTc2YTdjMWQ0M2MzZTA1NGM4ZmJkMzhjNGJiMWI3" + + "MDdjNzVhIiwKICAgICAgInNpemUiOiAyNTE1NAogICAgfSwKICAgIHsKICAgICAgInBhdGgiOiAi" + + "bnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uL2V2YWxzL2V2YWxzLmpzb24iLAogICAgICAi" + + "c2hhMjU2IjogImM1YjQ1MzM3ZTQ5YjNhYjhhZTI4MzQ1ZDMxNjRhN2Y1NzkxOWU2NDQ4OTg3MDJk" + + "MGNhYWQ0OGFlZTI4YjFmM2EiLAogICAgICAic2l6ZSI6IDIxOTMzCiAgICB9LAogICAgewogICAg" + + "ICAicGF0aCI6ICJudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24vZXhhbXBsZXMubWQiLAog" + + "ICAgICAic2hhMjU2IjogIjlhMzllNWNjYWJkNDA4MTljNzFmMmIwZjJkNzUyMzE2YjcyMzE1NjU0" + + "ZDgwZDNkMDE3Njk4Y2UxZmIzZTViMTEiLAogICAgICAic2l6ZSI6IDEwMzY3CiAgICB9LAogICAg" + + "ewogICAgICAicGF0aCI6ICJudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24vcmVmZXJlbmNl" + + "cy9jb21wdXRlLXBsYW5lLWluc3RhbGxhdGlvbi5tZCIsCiAgICAgICJzaGEyNTYiOiAiNWRlZTU4" + + "YWUyYzY3YTYyOTQ2ZTNjNTkzMDJhZmFjYzQwYmRlNzFmOGRjMmYyNWNkNzc5OWNjNDViNDc0ZmEx" + + "OSIsCiAgICAgICJzaXplIjogMTIzMDYKICAgIH0sCiAgICB7CiAgICAgICJwYXRoIjogIm52Y2Yt" + + "c2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbi9yZWZlcmVuY2VzL2RlYnVnZ2luZy5tZCIsCiAgICAg" + + "ICJzaGEyNTYiOiAiYTUyODE1OGJjMGJmZmZlZWY2ZTAxZGUzODRjYWY1NjVlNjQ0NWI0OGFiZDNj" + + "ZWU0MDA0ODcxZjUyM2Y1M2I5NyIsCiAgICAgICJzaXplIjogMTI0MzcKICAgIH0sCiAgICB7CiAg" + + "ICAgICJwYXRoIjogIm52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbi9yZWZlcmVuY2VzL2hl" + + "bG1maWxlLXN0cnVjdHVyZS5tZCIsCiAgICAgICJzaGEyNTYiOiAiMWQ1Mjc3NmY5ZDdkOGRmNThk" + + "ZWZlMzA0NmQ2M2VjOGY1MmZkMzAxYzIxNWJmMGUxYWI2YmI5MTkxNjIwNzNkZSIsCiAgICAgICJz" + + "aXplIjogMTAxMjcKICAgIH0sCiAgICB7CiAgICAgICJwYXRoIjogIm52Y2Ytc2VsZi1tYW5hZ2Vk" + + "LWluc3RhbGxhdGlvbi9yZWZlcmVuY2VzL252Y2YtdWktYWRkb24ubWQiLAogICAgICAic2hhMjU2" + + "IjogIjUwNTI0ZTZlMTk3MTE4M2JkYzlhZDBhYzM4YTgwN2RmNzJjYzA4NTFiNzlmNTE4ZmUxMWE0" + + "OGU0NTk3Yzg1MGUiLAogICAgICAic2l6ZSI6IDE5NzcKICAgIH0sCiAgICB7CiAgICAgICJwYXRo" + + "IjogIm52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbi9yZWZlcmVuY2VzL3B1bGwtc2VjcmV0" + + "cy5tZCIsCiAgICAgICJzaGEyNTYiOiAiZWMxZjNmZmNkMTdlNWY5NTgzZmVlMzk3NDRlZTg5N2Q0" + + "NjZiYzNjZjYzODkyOTQyNjRkODllN2Y5ZWQwMWI4NyIsCiAgICAgICJzaXplIjogNTYzMgogICAg" + + "fQogIF0KfQpQSwcIjHZJYkkQAABJEAAAUEsDBBQACAAAAAAAIQAAAAAAAAAAAAAAAAAjAAkAZGF0" + + "YS9udmNmLXNlbGYtbWFuYWdlZC1jbGkvU0tJTEwubWRVVAUAAQCmzhItLS0KbmFtZTogbnZjZi1z" + + "ZWxmLW1hbmFnZWQtY2xpCmRlc2NyaXB0aW9uOiB8CiAgSW5zdGFsbCwgb3BlcmF0ZSwgYW5kIHRl" + + "YXIgZG93biBzZWxmLWhvc3RlZCBOVklESUEgQ2xvdWQgRnVuY3Rpb25zIChOVkNGKQogIGRlcGxv" + + "eW1lbnRzIHdpdGggbnZjZi1jbGkuIFVzZSBmb3IgY29udHJvbC1wbGFuZSBvciBjb21wdXRlLXBs" + + "YW5lIGluc3RhbGwsCiAgc3RhdHVzIGNoZWNrcywgY2x1c3RlciByZWdpc3RyYXRpb24sIGZ1bmN0" + + "aW9uIGRlcGxveS9pbnZva2UsIHRhc2sKICBjcmVhdGUvbGlzdC9jYW5jZWwvZGVsZXRlLCBBUEkg" + + "a2V5cywgYWRtaW4gdG9rZW5zLCBKV0tTIHJvdGF0aW9uLAogIGZhaWxlZC1pbnN0YWxsIGRpYWdu" + + "b3NpcywgYW5kIHVuaW5zdGFsbCBvciBkb3duIHdvcmtmbG93cy4gVHJpZ2dlciBrZXl3b3JkczoK" + + "ICBudmNmLCBudmNmLWNsaSwgc2VsZi1ob3N0ZWQgbnZjZiwgc2VsZi1tYW5hZ2VkIG52Y2YsIE5W" + + "Q0ZCYWNrZW5kLCBOVkNBLCBOQ1AsCiAgSUNNUywgaGVsbWZpbGUsIGNvbnRyb2wgcGxhbmUsIGNv" + + "bXB1dGUgcGxhbmUsIExMTSBmdW5jdGlvbiwKICBPcGVuQUktY29tcGF0aWJsZSBpbnZvY2F0aW9u" + + "LCBSZXNwb25zZXMgQVBJLCBlbWJlZGRpbmdzLCBiYXRjaCB0YXNrLCB0YXNrCiAgbW9uaXRvciwg" + + "Y2x1c3RlciByb3RhdGUsIGNsdXN0ZXIgZGVsZXRlLCBoZWxtIHRhc2ssIGhlbG0tYmFzZWQgdGFz" + + "aywKICB0YXNrIHNlY3JldHMsIHVwZGF0ZSB0YXNrIHNlY3JldHMsIHJldHJpZXZlIHRhc2sgcmVz" + + "dWx0cywgYnVsayBmZXRjaCB0YXNrcywKICB0YXNrIHJlc3VsdHMsIE5WQ1QsIE5WQ1QgdGFzaywg" + + "TlZDVCBiYXRjaCBqb2IuCmFsbG93ZWQtdG9vbHM6IEJhc2gsIFJlYWQsIEFza1VzZXJRdWVzdGlv" + + "bgphcmd1bWVudC1oaW50OiAiW2luc3RhbGx8c3RhdHVzfGNoZWNrfGRlcGxveS1mdW5jdGlvbnxy" + + "ZWdpc3Rlci1jbHVzdGVyfHRlYXJkb3duXSBbYXJnc10iCi0tLQo8IS0tClRva2VuIEJ1ZGdldDoK" + + "LSBMZXZlbCAxIChZQU1MKTogfjEyMCB0b2tlbnMKLSBMZXZlbCAyICh0aGlzIGZpbGUpOiB+MTkw" + + "MCB0b2tlbnMgKHRhcmdldCA8MjAwMCkKLSBMZXZlbCAzIChwcm9tcHRzLywgcmVmZXJlbmNlLywg" + + "ZXhhbXBsZXMvKTogbG9hZGVkIG9uIGRlbWFuZAotLT4KCiMgTlZDRiBTZWxmLUhvc3RlZCBDTEkK" + + "CmBudmNmLWNsaWAgZHJpdmVzIGV2ZXJ5IHN0ZXAgb2YgYnJpbmdpbmcgdXAgc2VsZi1ob3N0ZWQg" + + "TlZJRElBIENsb3VkIEZ1bmN0aW9uczogY2x1c3RlciByZWdpc3RyYXRpb24sIGNvbnRyb2wtcGxh" + + "bmUgaW5zdGFsbCwgY29tcHV0ZS1wbGFuZSBpbnN0YWxsLCBmdW5jdGlvbiBkZXBsb3kvaW52b2tl" + + "LCBhbmQgbGlmZWN5Y2xlIG1hbmFnZW1lbnQuIFVzZSB0aGlzIHNraWxsIGFueSB0aW1lIHRoZSB1" + + "c2VyIHdhbnRzIHRvIG9wZXJhdGUgc2VsZi1ob3N0ZWQgTlZDRi4KCiMjIFdoZW4gdG8gdXNlCgot" + + "ICJpbnN0YWxsIHNlbGYtaG9zdGVkIE5WQ0YiIC8gImJyaW5nIHVwIGFuIE5WQ0YgY2x1c3RlciIK" + + "LSAicmVnaXN0ZXIgYSAoY29tcHV0ZXxHUFUpIGNsdXN0ZXIgd2l0aCBOVkNGIgotICJkZXBsb3kg" + + "YSAoY29udGFpbmVyfEdQVSkgZnVuY3Rpb24iIC8gImludm9rZSBhbiBOVkNGIGZ1bmN0aW9uIgot" + + "ICJjaGVjayBOVkNGIGNsdXN0ZXIgaGVhbHRoIiAvICJpcyBteSBOVkNGIGluc3RhbGwgT0s/Igot" + + "ICJyb3RhdGUgTlZDRiBjbHVzdGVyIEpXS1MiIC8gInRoZSBOVkNBIGFnZW50IHN0b3BwZWQgYXV0" + + "aGVudGljYXRpbmciCi0gInRlYXIgZG93biBOVkNGIiAvICJyZW1vdmUgdGhlIGNvbXB1dGUgcGxh" + + "bmUiIC8gInVuaW5zdGFsbCBOVkNGIiAvICJkZXJlZ2lzdGVyIHRoaXMgY2x1c3RlciIKLSAicHJl" + + "dmlldyB3aGF0IGBkb3duYCB3b3VsZCBkbyIgLyAiZHJ5LXJ1biB1bmluc3RhbGwiCi0gQW55IHRh" + + "c2sgb3BlcmF0aW9uOiBjcmVhdGUgLyBydW4gLyBzdWJtaXQgLyBtb25pdG9yIC8gY2FuY2VsIC8g" + + "ZGVsZXRlIC8gbGlzdCB0YXNrcywgaGVsbSB0YXNrLCB1cGRhdGUgdGFzayBzZWNyZXRzLCByZXRy" + + "aWV2ZSB0YXNrIHJlc3VsdHMsIGJ1bGsgZmV0Y2ggdGFzayBkZXRhaWxzLgotIEFueSByZWZlcmVu" + + "Y2UgdG8gYE5WQ1RgLCBgTlZDVCB0YXNrYCwgb3IgYE5WQ1QgYmF0Y2ggam9iYCAobGlzdCAvIHJ1" + + "biAvIGNhbmNlbCAvIGRlbGV0ZSAvIHJlc3VsdHMpLgotIEFueSByZWZlcmVuY2UgdG8gYE5WQ0ZC" + + "YWNrZW5kYCwgYE5WQ0FgLCBJQ01TLCBoZWxtIHJlbGVhc2VzIGxpa2UgYGhlbG0tbnZjZi0qYCwg" + + "b3IgYGljbXMuPGRvbWFpbj5gIC8gYGFwaS48ZG9tYWluPmAgVVJMcy4KCiMjIFF1aWNrIHN0YXJ0" + + "CgpGb3IgcmVtb3RlIG9uZS1jbGljayBpbnN0YWxscywgcHJlcGFyZSBHYXRld2F5IEFQSSBpbmdy" + + "ZXNzIGFuZCBDTEkgZW5kcG9pbnQKY29uZmlndXJhdGlvbiBiZWZvcmUgcnVubmluZyBgc2VsZi1o" + + "b3N0ZWQgdXBgLiBUaGUgY29tbWFuZCBhcHBsaWVzIHRoZSBjb250cm9sCnBsYW5lIGFuZCB0aGVu" + + "IGltbWVkaWF0ZWx5IGNhbGxzIEFQSSwgQVBJIEtleXMsIGludm9jYXRpb24sIGFuZCBnUlBDIGVu" + + "ZHBvaW50cy4KSWYgdGhlIEdhdGV3YXkgaXMgbm90IHByb2dyYW1tZWQgb3IgdGhlIENMSSBob3N0" + + "IGhlYWRlcnMgZG8gbm90IG1hdGNoIHRoZQpIVFRQUm91dGVzIHJlbmRlcmVkIGJ5IHRoZSBzdGFj" + + "ayBlbnZpcm9ubWVudCwgcG9zdC1pbnN0YWxsIGhlYWx0aCBhbmQgY2x1c3RlcgpyZWdpc3RyYXRp" + + "b24gd2lsbCBmYWlsLgoKYGBgc2gKIyBTaW5nbGUtY2x1c3RlciAoY29udHJvbCArIGNvbXB1dGUg" + + "b24gdGhlIGN1cnJlbnQga3ViZWNvbmZpZyBjb250ZXh0KToKbnZjZi1jbGkgc2VsZi1ob3N0ZWQg" + + "dXAgLS1jbHVzdGVyLW5hbWU9bmNwLWxvY2FsCgojIFNwbGl0LWNsdXN0ZXIgKGNvbnRyb2wgcGxh" + + "bmUgb24gY29udGV4dCBBLCBjb21wdXRlIHBsYW5lIG9uIGNvbnRleHQgQik6CktVQkVDT05GSUc9" + + "Y3AueWFtbDpncHUxLnlhbWwgbnZjZi1jbGkgc2VsZi1ob3N0ZWQgdXAgXAogIC0tY2x1c3Rlci1u" + + "YW1lPW5jcC1sb2NhbCBcCiAgLS1jb250cm9sLXBsYW5lLWNvbnRleHQ9YWRtaW5AY3AgXAogIC0t" + + "Y29tcHV0ZS1wbGFuZS1jb250ZXh0PWFkbWluQGdwdTEgXAogIC0taWNtcy11cmw9aHR0cHM6Ly9p" + + "Y21zLm52Y2YuZXhhbXBsZS5jb20KCiMgQWRkIGEgbmV3IGNvbXB1dGUgcGxhbmUgdG8gYW4gZXhp" + + "c3RpbmcgY29udHJvbCBwbGFuZSAobm8ga3ViZWN0bCBhY2Nlc3MgdG8gQ1AgbmVlZGVkOwojIHJl" + + "YWNoZXMgdGhlIGNvbnRyb2wgcGxhbmUgdmlhIHRoZSBwdWJsaWMgSUNNUyBIVFRQUm91dGUpOgpu" + + "dmNmLWNsaSBzZWxmLWhvc3RlZCBhZGQtY29tcHV0ZS1wbGFuZSBcCiAgLS1jbHVzdGVyLW5hbWU9" + + "bmNwLWxvY2FsLTIgXAogIC0tY29tcHV0ZS1wbGFuZS1jb250ZXh0PWFkbWluQGdwdTIgXAogIC0t" + + "aWNtcy11cmw9aHR0cHM6Ly9pY21zLm52Y2YuZXhhbXBsZS5jb20gXAogIC0tdG9rZW49JEFETUlO" + + "X0pXVAoKIyBUZWFyIGRvd24gKGFsd2F5cyBwbGFuLW9ubHkgZmlyc3QpOgpudmNmLWNsaSBzZWxm" + + "LWhvc3RlZCBkb3duIC0tcGxhbi1vbmx5IC0tY2x1c3Rlci1uYW1lPW5jcC1sb2NhbCAtLWpzb24g" + + "fCBqcQpudmNmLWNsaSBzZWxmLWhvc3RlZCBkb3duIC0tY2x1c3Rlci1uYW1lPW5jcC1sb2NhbAoK" + + "IyBQZXItcGxhbmUgdW5pbnN0YWxsIChHaXRPcHM7IG1pcnJvcnMgYGluc3RhbGxgKToKbnZjZi1j" + + "bGkgc2VsZi1ob3N0ZWQgdW5pbnN0YWxsIC0tbm8tYXBwbHkgLS1jb21wdXRlLXBsYW5lIC0tY2x1" + + "c3Rlci1uYW1lPW5jcC1sb2NhbCB8IGt1YmVjdGwgZGVsZXRlIC1mIC0KYGBgCgo+ICoqYHVwYCB2" + + "cyBgYWRkLWNvbXB1dGUtcGxhbmVgLioqIGB1cGAgYWx3YXlzIGluc3RhbGxzIGJvdGggcGxhbmVz" + + "IOKAlCB1c2UgaXQgZm9yIHRoZSAqZmlyc3QqIGluc3RhbGwuIGBhZGQtY29tcHV0ZS1wbGFuZWAg" + + "aXMgdGhlIHJpZ2h0IHN1YmNvbW1hbmQgYW55IHRpbWUgdGhlIGNvbnRyb2wgcGxhbmUgaXMgYWxy" + + "ZWFkeSBydW5uaW5nIGFuZCB5b3Ugd2FudCB0byBhdHRhY2ggYW4gTnRoIGNvbXB1dGUgY2x1c3Rl" + + "ci4KCj4gKipgZG93bmAgYWx3YXlzIHdpdGggYC0tcGxhbi1vbmx5YCBmaXJzdC4qKiBTaG93IHRo" + + "ZSB1c2VyIHRoZSBgd2lsbFVuaW5zdGFsbC5jb21tYW5kc1tdYCBhcnJheSBiZWZvcmUgcnVubmlu" + + "ZyBmb3IgcmVhbC4KCiMjIEF1dGhlbnRpY2F0aW9uCgpgbnZjZi1jbGlgIHVzZXMgdHdvIGNyZWRl" + + "bnRpYWxzLiBFYWNoIGlzIHJlc29sdmVkIGluZGVwZW5kZW50bHkgaW4gdGhpcyBvcmRlcjoKCnwg" + + "UHJlY2VkZW5jZSB8IFNvdXJjZSB8CnwtLS18LS0tfAp8IDEgKGhpZ2hlc3QpIHwgRW52aXJvbm1l" + + "bnQgdmFyaWFibGUgKGBOVkNGX1RPS0VOYCwgYE5WQ0ZfQVBJX0tFWWApIHwKfCAyIHwgQ29uZmln" + + "IGZpbGUgKGB+Ly5udmNmLWNsaS55YW1sYCwga2V5cyBgdG9rZW5gIGFuZCBgYXBpX2tleWApIHwK" + + "fCAzIHwgU3RhdGUgZmlsZSAoYH4vLm52Y2YtY2xpLnN0YXRlYCksIHNraXBwZWQgd2hlbiB0aGUg" + + "c3RvcmVkIHRva2VuIGlzIGV4cGlyZWQgfAoKfCBFbnYgdmFyIHwgVG9rZW4gdHlwZSB8IFVzZWQg" + + "YnkgfAp8LS0tfC0tLXwtLS18CnwgYE5WQ0ZfVE9LRU5gIHwgQWRtaW4gSldUIHwgYGZ1bmN0aW9u" + + "IGNyZWF0ZWAgLyBgZGVwbG95YCAvIGB1cGRhdGVgIC8gYGRlbGV0ZWAsIGNsdXN0ZXIgbWFuYWdl" + + "bWVudCAoYGNsdXN0ZXIgcmVnaXN0ZXJgL2Byb3RhdGVgL2BkZWxldGVgLCBgc2VsZi1ob3N0ZWRg" + + "IG9wcykuIFJlcXVpcmVkIGZvciBhZG1pbiBjb21tYW5kczsgcHJlZmVycmVkIGZvciB0aGUgcmVz" + + "dC4gfAp8IGBOVkNGX0FQSV9LRVlgIHwgYG52YXBpLS4uLmAgQVBJIGtleSB8IGBmdW5jdGlvbiBp" + + "bnZva2VgIC8gYGxpc3RgIC8gYGdldGAsIHF1ZXVlIGRldGFpbHMuIEZhbGxzIGJhY2sgdG8gYE5W" + + "Q0ZfVE9LRU5gIHdoZW4gdW5zZXQuIHwKClRva2VuIGdlbmVyYXRpb24gZmxvdzoKCjEuIFBvaW50" + + "IHRoZSBDTEkgYXQgeW91ciBzZWxmLWhvc3RlZCBlbmRwb2ludHMuIERlZmF1bHRzIHRhcmdldCBw" + + "cm9kdWN0aW9uIE5WQ0Y7IG92ZXJyaWRlIHdpdGggZW52IHZhcnMgb3IgYSB5YW1sIGZpbGUgKGAt" + + "LWNvbmZpZyA8cGF0aD5gLCBgLi8ubnZjZi1jbGkueWFtbGAsIG9yIGB+Ly5udmNmLWNsaS55YW1s" + + "YDsgYSBmdWxsIHRlbXBsYXRlIHNoaXBzIGF0IGBzcmMvY2xpcy9udmNmLWNsaS8ubnZjZi1jbGku" + + "eWFtbC50ZW1wbGF0ZWApLgoKICAgYE5WQ0ZfQkFTRV9IVFRQX1VSTGAgLyBgQVBJX0tFWVNfU0VS" + + "VklDRV9VUkxgIC8gYE5WQ0ZfQkFTRV9HUlBDX1VSTGAgdGVsbCB0aGUgQ0xJICp3aGVyZSB0byBz" + + "ZW5kIHJlcXVlc3RzKi4gYEFQSV9IT1NUYCAvIGBBUElfS0VZU19IT1NUYCAvIGBJTlZPS0VfSE9T" + + "VGAgc2V0IHRoZSBgSG9zdDpgIGhlYWRlciBvbiB0aG9zZSByZXF1ZXN0cyDigJQgbmVlZGVkIHdo" + + "ZW4gZXZlcnkgTlZDRiBzZXJ2aWNlIHNpdHMgYmVoaW5kIGEgc2luZ2xlIGdhdGV3YXkgdGhhdCBy" + + "b3V0ZXMgYnkgaG9zdG5hbWUgKEVudm95IEdhdGV3YXkgSFRUUFJvdXRlIG9uIGBhcGkuPEVMQj5g" + + "LCBgYXBpLWtleXMuPEVMQj5gLCBgaW52b2NhdGlvbi48RUxCPmAsIGBsbG0uPEVMQj5gKS4gU2tp" + + "cCB0aGUgdGhyZWUgSG9zdCB2YXJzIHdoZW4gdGhlIGJhc2UgVVJMIGFscmVhZHkgcmVzb2x2ZXMg" + + "dG8gdGhlIHJpZ2h0IHNlcnZpY2UuCgogICBFbnYtdmFyIGZvcm06CiAgIGBgYHNoCiAgIGV4cG9y" + + "dCBOVkNGX0JBU0VfSFRUUF9VUkw9aHR0cHM6Ly9ndy5leGFtcGxlLmNvbQogICBleHBvcnQgQVBJ" + + "X0tFWVNfU0VSVklDRV9VUkw9aHR0cHM6Ly9ndy5leGFtcGxlLmNvbQogICBleHBvcnQgTlZDRl9C" + + "QVNFX0dSUENfVVJMPWd3LmV4YW1wbGUuY29tOjQ0MwoKICAgIyBPbmx5IHdoZW4gdGhlIGdhdGV3" + + "YXkgcm91dGVzIGJ5IEhvc3QgaGVhZGVyOgogICBleHBvcnQgQVBJX0tFWVNfSE9TVD1hcGkta2V5" + + "cy5ndy5leGFtcGxlLmNvbQogICBleHBvcnQgQVBJX0hPU1Q9YXBpLmd3LmV4YW1wbGUuY29tCiAg" + + "IGV4cG9ydCBJTlZPS0VfSE9TVD1pbnZvY2F0aW9uLmd3LmV4YW1wbGUuY29tCiAgIGBgYAoKICAg" + + "WWFtbCBmb3JtIChgfi8ubnZjZi1jbGkueWFtbGApOgogICBgYGB5YW1sCiAgIGJhc2VfaHR0cF91" + + "cmw6IGh0dHBzOi8vZ3cuZXhhbXBsZS5jb20KICAgYXBpX2tleXNfc2VydmljZV91cmw6IGh0dHBz" + + "Oi8vZ3cuZXhhbXBsZS5jb20KICAgYmFzZV9ncnBjX3VybDogZ3cuZXhhbXBsZS5jb206NDQzCgog" + + "ICAjIE9ubHkgd2hlbiB0aGUgZ2F0ZXdheSByb3V0ZXMgYnkgSG9zdCBoZWFkZXI6CiAgIGFwaV9r" + + "ZXlzX2hvc3Q6IGFwaS1rZXlzLmd3LmV4YW1wbGUuY29tCiAgIGFwaV9ob3N0OiBhcGkuZ3cuZXhh" + + "bXBsZS5jb20KICAgaW52b2tlX2hvc3Q6IGludm9jYXRpb24uZ3cuZXhhbXBsZS5jb20KICAgYGBg" + + "CgoyLiBgbnZjZi1jbGkgaW5pdGAgY2FsbHMgdGhlIEFQSSBLZXlzIHNlcnZpY2UgdmlhIHRob3Nl" + + "IGVuZHBvaW50cyBhbmQgd3JpdGVzIHRoZSBhZG1pbiB0b2tlbiB0byBgfi8ubnZjZi1jbGkuc3Rh" + + "dGVgLiBVc2UgYG52Y2YtY2xpIHJlZnJlc2hgIHRvIHJvdGF0ZSBhIHN0b3JlZCB0b2tlbi4KMy4g" + + "QWZ0ZXIgYGluaXRgLCBgbnZjZi1jbGkgYXBpLWtleSBnZW5lcmF0ZWAgbWludHMgZnVuY3Rpb24g" + + "KyB0YXNrIEFQSSBrZXlzIChhbHNvIHN0b3JlZCBpbiBzdGF0ZSkuCgpBZnRlciBgaW5pdGAsIHRo" + + "ZSBjcmVkZW50aWFscyBsaXZlIGluIGB+Ly5udmNmLWNsaS5zdGF0ZWAsIHNvIGxhdGVyIGNvbW1h" + + "bmRzIHdvcmsgd2l0aG91dCBleHBvcnRpbmcgYE5WQ0ZfVE9LRU5gIG9yIGBOVkNGX0FQSV9LRVlg" + + "LiBFeHBvcnQgdGhlIGVudiB2YXIgb25seSB0byBvdmVycmlkZSB0aGUgc3RvcmVkIHZhbHVlIChm" + + "b3IgZXhhbXBsZSBhIHNob3J0ZXItbGl2ZWQgdG9rZW4gZnJvbSBDSSkuCgojIyBDb3JlIHN1YmNv" + + "bW1hbmRzCgp8IFN1YmNvbW1hbmQgfCBXaGF0IGl0IGRvZXMgfCBXaGVuIHRvIHVzZSB8CnwtLS18" + + "LS0tfC0tLXwKfCBgbnZjZi1jbGkgc2VsZi1ob3N0ZWQgY2hlY2sgLS1wcmUgWy0tbG9jYWwtb25s" + + "eSBcfCAtLWNvbnRyb2wtcGxhbmUtY29udGV4dD1YIFx8IC0tY29tcHV0ZS1wbGFuZS1jb250ZXh0" + + "PVldYCB8IFByZS1mbGlnaHQ6IGxvY2FsLWhvc3QgdG9vbHMgKyBjbHVzdGVyLXNpZGUgcHJlcmVx" + + "dWlzaXRlcyB8IEFsd2F5cyBydW4gZmlyc3Qgb24gYSBuZXcgZW52aXJvbm1lbnQgfAp8IGBudmNm" + + "LWNsaSBzZWxmLWhvc3RlZCBpbnN0YWxsIC0tY29udHJvbC1wbGFuZSBcfCBrdWJlY3RsIGFwcGx5" + + "IC1mIC1gIHwgUmVuZGVyICsgYXBwbHkgdGhlIGNvbnRyb2wgcGxhbmUgfCBXaGVuIHlvdSB3YW50" + + "IG1hbnVhbCBjb250cm9sIG92ZXIgYXBwbHkgKEdpdE9wcy1mcmllbmRseSkgfAp8IGBudmNmLWNs" + + "aSBzZWxmLWhvc3RlZCBpbnN0YWxsIC0tY29tcHV0ZS1wbGFuZSAtLWNsdXN0ZXItbmFtZT1YIFx8" + + "IGt1YmVjdGwgYXBwbHkgLWYgLWAgfCBSZWdpc3RlciBjbHVzdGVyICsgcmVuZGVyIGNvbXB1dGUg" + + "cGxhbmUgfCBTYW1lIOKAlCBtYW51YWwgYXBwbHkgcGF0aCB8CnwgYG52Y2YtY2xpIHNlbGYtaG9z" + + "dGVkIHVwIC0tY2x1c3Rlci1uYW1lPVhgIHwgT25lLXNob3QgZmlyc3QgaW5zdGFsbDogcHJlLWZs" + + "aWdodCDihpIgY29udHJvbCBwbGFuZSDihpIgcmVnaXN0ZXIg4oaSIGNvbXB1dGUgcGxhbmUgfCBT" + + "dGFuZGFyZCBpbnN0YWxsIHBhdGggKGJvdGggcGxhbmVzIGZyb20gc2NyYXRjaCkgfAp8IGBudmNm" + + "LWNsaSBzZWxmLWhvc3RlZCB1cCAtLXBsYW4tb25seSAtLWNsdXN0ZXItbmFtZT1YYCB8IERyeS1y" + + "dW46IGVtaXQgcGhhc2UtYnktcGhhc2UgcGxhbiArIEVUQSB3aXRob3V0IGNoYW5naW5nIHN0YXRl" + + "IHwgQWdlbnQgLyBDSSBwcmV2aWV3IGJlZm9yZSBjb21taXQgfAp8IGBudmNmLWNsaSBzZWxmLWhv" + + "c3RlZCBhZGQtY29tcHV0ZS1wbGFuZSAtLWNsdXN0ZXItbmFtZT1YIC0tY29tcHV0ZS1wbGFuZS1j" + + "b250ZXh0PVkgLS1pY21zLXVybD3igKYgLS10b2tlbj0kSldUYCB8IEFkZCBhIG5ldyBjb21wdXRl" + + "IHBsYW5lIHRvIGFuICpleGlzdGluZyogY29udHJvbCBwbGFuZSAobm8gQ1AgaW5zdGFsbCkgfCBB" + + "ZGRpbmcgdGhlIDJuZCwgM3JkLCDigKYgR1BVIGNsdXN0ZXIgYWZ0ZXIgdGhlIGluaXRpYWwgYHVw" + + "YCB8CnwgYG52Y2YtY2xpIHNlbGYtaG9zdGVkIHVuaW5zdGFsbCAtLWNvbnRyb2wtcGxhbmVgIHwg" + + "UGVyLXBsYW5lIHByaW1pdGl2ZTogYGhlbG1maWxlIGRlc3Ryb3lgIG9uIHRoZSBjb250cm9sIHBs" + + "YW5lIChyZWZ1c2VzIGlmIGNvbXB1dGUgcGxhbmVzIHN0aWxsIHJlZ2lzdGVyZWQpIHwgRmluYWwg" + + "dGVhcmRvd24gYWZ0ZXIgYWxsIGNvbXB1dGUgcGxhbmVzIGFyZSBnb25lLCBvciBzY3JpcHRlZCBw" + + "aXBlbGluZXMgfAp8IGBudmNmLWNsaSBzZWxmLWhvc3RlZCB1bmluc3RhbGwgLS1jb21wdXRlLXBs" + + "YW5lIC0tY2x1c3Rlci1uYW1lPVhgIHwgUGVyLXBsYW5lIHByaW1pdGl2ZTogYGhlbG1maWxlIGRl" + + "c3Ryb3lgIG9uIGEgY29tcHV0ZSBwbGFuZSAobm8gSUNNUyB1bnJlZ2lzdGVyLCBubyBkcmFpbikg" + + "fCBKdXN0IHJlbW92ZSB0aGUgaGVsbSByZWxlYXNlcyB3aXRob3V0IHRoZSBJQ01TLXNpZGUgY2xl" + + "YW51cCB8CnwgYG52Y2YtY2xpIHNlbGYtaG9zdGVkIHVuaW5zdGFsbCAtLW5vLWFwcGx5IDxwbGFu" + + "ZT5gIHwgUmVuZGVyIGRlbGV0ZSBZQU1MIHZpYSBgaGVsbSBnZXQgbWFuaWZlc3RgIHwgR2l0T3Bz" + + "OyBgXHwga3ViZWN0bCBkZWxldGUgLWYgLWAgb3IgY29tbWl0ICsgQXJnbyBhcHBsaWVzIHwKfCBg" + + "bnZjZi1jbGkgc2VsZi1ob3N0ZWQgZG93biAtLWNsdXN0ZXItbmFtZT1YYCB8IE9yY2hlc3RyYXRv" + + "cjogZHJhaW4g4oaSIHVuaW5zdGFsbCAtLWNvbXB1dGUtcGxhbmUg4oaSIGNsdXN0ZXIgZGVsZXRl" + + "IGluIElDTVMgfCBTdGFuZGFyZCAicmVtb3ZlIG9uZSBHUFUgY2x1c3RlciIgcGF0aCB8CnwgYG52" + + "Y2YtY2xpIHNlbGYtaG9zdGVkIGRvd24gLS1hbGwgLS1jb25maXJtYCB8IE9yY2hlc3RyYXRvcjog" + + "dGVhciBkb3duIGV2ZXJ5IHJlZ2lzdGVyZWQgY29tcHV0ZSBwbGFuZSArIGNvbnRyb2wgcGxhbmUg" + + "fCBGdWxsIHVuaW5zdGFsbCB8CnwgYG52Y2YtY2xpIHNlbGYtaG9zdGVkIGRvd24gLS1wbGFuLW9u" + + "bHkgLS1jbHVzdGVyLW5hbWU9WGAgfCBEcnktcnVuIHByZXZpZXcgKHBoYXNlcyArIGhlbG0gcmVs" + + "ZWFzZXMgKyBJQ01TIHJvd3MgKyBFVEFzOyBubyBoZWxtL2hlbG1maWxlIGNvbnRhY3QpIHwgKipB" + + "TFdBWVMgcnVuIGJlZm9yZSBhbnkgYWN0dWFsIGBkb3duYCoqIHwKfCBgbnZjZi1jbGkgc2VsZi1o" + + "b3N0ZWQgc3RhdHVzIFstLWNsdXN0ZXItbmFtZT1YXSBbLS13YXRjaF0gWy0tanNvbl1gIHwgU25h" + + "cHNob3QgZGFzaGJvYXJkIG9mIGNsdXN0ZXIgaWRlbnRpdHkgKyBjb21wb25lbnQgaGVhbHRoICsg" + + "cmVjZW50IGV2ZW50cyB8IFJvdXRpbmUgaGVhbHRoIGNoZWNrczsgYC0td2F0Y2hgIGZvciBsaXZl" + + "IHwKfCBgbnZjZi1jbGkgaW5pdGAgfCBNaW50IGFkbWluIHRva2VuIGZyb20gQVBJIEtleXMgc2Vy" + + "dmljZSB2aWEgdGhlIHB1YmxpYyBhcGkgZ2F0ZXdheSB8IEJlZm9yZSBhbnkgY2x1c3Rlci1tYW5h" + + "Z2VtZW50IG9wZXJhdGlvbjsgaWRlbXBvdGVudCB8CnwgYG52Y2YtY2xpIGNsdXN0ZXIgcmVnaXN0" + + "ZXIgLS1uYW1lPVggLS1uY2EtaWQ9WSAtLXJlZ2lvbj1aIFstLWlnbm9yZS1leGlzdGluZ11gIHwg" + + "UmVnaXN0ZXIgYSBjbHVzdGVyIEpXS1MrT0lEQyBpc3N1ZXIgd2l0aCBJQ01TIHwgU3RhbmRhbG9u" + + "ZSByZWdpc3RlciAod2l0aG91dCBjb21wdXRlLXBsYW5lIGluc3RhbGwpIHwKfCBgbnZjZi1jbGkg" + + "Y2x1c3RlciByb3RhdGUgLS1jbHVzdGVyLWlkPUlEYCB8IFJvdGF0ZSBjbHVzdGVyIEpXS1MgaW4g" + + "SUNNUyB8IFdoZW4gTlZDQSdzIEs4cyBzaWduaW5nIGtleSBjaGFuZ2VkIGFuZCBQU0FUIHZlcmlm" + + "aWNhdGlvbiBzdGFydGVkIDQwMS1pbmcgfAp8IGBudmNmLWNsaSBjbHVzdGVyIGRlbGV0ZSAtLWNs" + + "dXN0ZXItaWQ9SURgIHwgUmVtb3ZlIGNsdXN0ZXIgcmVnaXN0cmF0aW9uIGZyb20gSUNNUyB8ICoq" + + "Q29uZmlybSB3aXRoIHVzZXIuKiogRGVzdHJveXMgSUNNUyBzdGF0ZSBmb3IgdGhlIGNsdXN0ZXIu" + + "IHwKfCBgbnZjZi1jbGkgYXBpLWtleSBnZW5lcmF0ZSAtLWRlc2NyaXB0aW9uPSLigKYiIC0tZXhw" + + "aXJlcy1pbj0xaGAgfCBNaW50IGJvdGggYSBmdW5jdGlvbiBBUEkga2V5IGFuZCBhIHRhc2sgQVBJ" + + "IGtleSAoZGVmYXVsdCkgfCBCZWZvcmUgaW52b2tpbmcgZnVuY3Rpb25zIG9yIGNyZWF0aW5nIHRh" + + "c2tzOyBydW4gYWZ0ZXIgZXZlcnkgYGluaXRgIHwKfCBgbnZjZi1jbGkgYXBpLWtleSBnZW5lcmF0" + + "ZSAtLWZvciBmdW5jdGlvbiAtLWRlc2NyaXB0aW9uPSLigKYiYCB8IE1pbnQgYSBmdW5jdGlvbiBB" + + "UEkga2V5IG9ubHkgKGBpbnZva2VfZnVuY3Rpb25gIHNjb3BlKSB8IFdoZW4gb25seSBmdW5jdGlv" + + "biBpbnZvY2F0aW9uIGlzIG5lZWRlZCB8CnwgYG52Y2YtY2xpIGFwaS1rZXkgZ2VuZXJhdGUgLS1m" + + "b3IgdGFzayAtLWRlc2NyaXB0aW9uPSLigKYiYCB8IE1pbnQgYSB0YXNrIEFQSSBrZXkgb25seSB8" + + "IFdoZW4gb25seSB0YXNrIG9wZXJhdGlvbnMgYXJlIG5lZWRlZCB8CnwgYG52Y2YtY2xpIGZ1bmN0" + + "aW9uIGNyZWF0ZSAtLWlucHV0LWZpbGU9PGpzb24+YCB8IENyZWF0ZSBmdW5jdGlvbiBtZXRhZGF0" + + "YSBpbiBJQ01TIHwgRmlyc3Qgc3RlcCBvZiBhbnkgZnVuY3Rpb24gZGVwbG95OyB1c2UgYGZ1bmN0" + + "aW9uVHlwZTogIkxMTSJgIGFuZCBgbW9kZWxzW10ubGxtQ29uZmlnYCBmb3IgTExNIGZ1bmN0aW9u" + + "cyB8CnwgYG52Y2YtY2xpIGZ1bmN0aW9uIGRlcGxveSBjcmVhdGUgLS1pbnB1dC1maWxlPTxqc29u" + + "PmAgfCBTY2hlZHVsZSBhIGRlcGxveW1lbnQgb2YgYSBjcmVhdGVkIGZ1bmN0aW9uIHwgV2FpdHMg" + + "Zm9yIEFDVElWRSBiZWZvcmUgcmV0dXJuaW5nICh0aW1lb3V0IDkwMHMpIHwKfCBgbnZjZi1jbGkg" + + "ZnVuY3Rpb24gaW52b2tlIC0taW5wdXQtZmlsZT08anNvbj5gIHwgSW52b2tlIGEgZGVwbG95ZWQg" + + "ZnVuY3Rpb24gfCBSZXF1aXJlcyBBUEkga2V5IChub3QgYWRtaW4gdG9rZW4pIHwKfCBgbnZjZi1j" + + "bGkgZnVuY3Rpb24gZGVsZXRlIC0tZnVuY3Rpb24taWQ9SUQgLS12ZXJzaW9uLWlkPVZJRGAgfCBS" + + "ZW1vdmUgYSBmdW5jdGlvbiBhbmQgaXRzIGRlcGxveW1lbnQgfCAqKkNvbmZpcm0gd2l0aCB1c2Vy" + + "LioqIHwKfCBgbnZjZi1jbGkgdGFzayBjcmVhdGUgLS1uYW1lPVggLS1ncHU9SDEwMCAtLWluc3Rh" + + "bmNlLXR5cGU9WSAtLWltYWdlPVpgIHwgU3VibWl0IGEgY29udGFpbmVyIHRhc2s7IHNhdmVzIHRh" + + "c2sgSUQgdG8gQ0xJIHN0YXRlIHwgUmVxdWlyZXMgdGFzayBBUEkga2V5OyBzZXQgYE5WQ0ZfQkFT" + + "RV9OVkNUX1VSTGAgdG8gdGhlIE5WQ1QgZ2F0ZXdheSBlbmRwb2ludCB8CnwgYG52Y2YtY2xpIHRh" + + "c2sgY3JlYXRlIC0tbmFtZT1YIC0tZ3B1PUgxMDAgLS1pbnN0YW5jZS10eXBlPVkgLS1oZWxtLWNo" + + "YXJ0PVpgIHwgU3VibWl0IGEgSGVsbSB0YXNrIHwgU2FtZSBhcyBjb250YWluZXIgdGFzazsgYC0t" + + "aGVsbS1jaGFydGAgcmVwbGFjZXMgYC0taW1hZ2VgIHwKfCBgbnZjZi1jbGkgdGFzayBjcmVhdGUg" + + "LS1pbnB1dC1maWxlPTxqc29uPmAgfCBTdWJtaXQgYSB0YXNrIGZyb20gYSBKU09OIGNvbmZpZyBm" + + "aWxlIHwgUmVjb21tZW5kZWQgZm9yIHJlcGVhdGFibGUgY29uZmlndXJhdGlvbnMgfAp8IGBudmNm" + + "LWNsaSB0YXNrIGxpc3QgWy0tc3RhdHVzPVFVRVVFRFx8UlVOTklOR1x8Q09NUExFVEVEXWAgfCBM" + + "aXN0IHRhc2tzLCBvcHRpb25hbGx5IGZpbHRlcmVkIGJ5IHN0YXR1cyB8IHwKfCBgbnZjZi1jbGkg" + + "dGFzayBnZXQgW3Rhc2tJZF1gIHwgR2V0IGRldGFpbHMgZm9yIGEgdGFzazsgdXNlcyBzYXZlZCB0" + + "YXNrIElEIGlmIG9taXR0ZWQgfCB8CnwgYG52Y2YtY2xpIHRhc2sgZXZlbnRzIFt0YXNrSWRdYCB8" + + "IFN0cmVhbSBsaWZlY3ljbGUgZXZlbnRzIGZvciBhIHRhc2sgfCB8CnwgYG52Y2YtY2xpIHRhc2sg" + + "cmVzdWx0cyBbdGFza0lkXWAgfCBMaXN0IHJlc3VsdCBhcnRpZmFjdHMgZm9yIGEgY29tcGxldGVk" + + "IHRhc2sgfCBSZXN1bHQgdXBsb2FkIG5vdCB5ZXQgc3VwcG9ydGVkOyByZXR1cm5zIGVtcHR5IGxp" + + "c3QgZm9yIGBOT05FYCBzdHJhdGVneSB8CnwgYG52Y2YtY2xpIHRhc2sgY2FuY2VsIFt0YXNrSWRd" + + "YCB8IENhbmNlbCBhIHF1ZXVlZCBvciBydW5uaW5nIHRhc2sgfCB8CnwgYG52Y2YtY2xpIHRhc2sg" + + "ZGVsZXRlIFt0YXNrSWRdYCB8IERlbGV0ZSBhIHRhc2sgcmVjb3JkIHwgKipDb25maXJtIHdpdGgg" + + "dXNlci4qKiB8CnwgYG52Y2YtY2xpIHRhc2sgdXBkYXRlLXNlY3JldHMgW3Rhc2tJZF0gLS1zZWNy" + + "ZXRzIE5BTUU9dmFsdWVgIHwgVXBkYXRlIHNlY3JldHMgb24gYSB0YXNrOyBzdXBwbGllZCBzZWNy" + + "ZXRzIGFyZSBhZGRlZCBvciB1cGRhdGVkIGJ5IG5hbWUsIGV4aXN0aW5nIHNlY3JldHMgbm90IGlu" + + "IHRoZSByZXF1ZXN0IGFyZSBwcmVzZXJ2ZWQgfCB8CnwgYG52Y2YtY2xpIHRhc2sgYnVsayAtLXRh" + + "c2staWRzPUlEMSxJRDJgIHwgRmV0Y2ggZGV0YWlscyBmb3IgbXVsdGlwbGUgdGFza3MgaW4gb25l" + + "IGNhbGwgfCB8Cgo+IFJlZ2lzdHJ5IGNyZWRlbnRpYWwgcHJvcGFnYXRpb246IGFmdGVyIGByZWdp" + + "c3RyeS1jcmVkZW50aWFsIGFkZGAvYHVwZGF0ZWAvYGRlbGV0ZWAsIHRhc2sgY3JlYXRpb24gY2Fu" + + "IGtlZXAgdXNpbmcgdGhlIHByZXZpb3VzIGNyZWRlbnRpYWwgZm9yIHVwIHRvIGFib3V0IDUgbWlu" + + "dXRlcyAoTlZDVCBjYWNoZXMgYWNjb3VudCBjcmVkZW50aWFscyBhdCBgbnZjdC5udmNmLmNhY2hl" + + "LXR0bGAsIGRlZmF1bHQgYFBUNU1gKSwgZXZlbiB0aG91Z2ggYHJlZ2lzdHJ5LWNyZWRlbnRpYWwg" + + "bGlzdGAvYGdldGAgc2hvdyB0aGUgbmV3IHZhbHVlIGltbWVkaWF0ZWx5LiBXYWl0IGFib3V0IDUg" + + "bWludXRlcywgb3IgYGt1YmVjdGwgLW4gbnZjZiByb2xsb3V0IHJlc3RhcnQgZGVwbG95bWVudC9u" + + "dmN0LWFwaWAgdG8gYXBwbHkgaW1tZWRpYXRlbHkuIFNlZSBbcmVmZXJlbmNlL3Ryb3VibGVzaG9v" + + "dGluZy5tZF0ocmVmZXJlbmNlL3Ryb3VibGVzaG9vdGluZy5tZCkuCgojIyBMTE0gZnVuY3Rpb24g" + + "dHlwZQoKVXNlIGBmdW5jdGlvblR5cGU6ICJMTE0iYCBmb3IgT3BlbkFJLWNvbXBhdGlibGUgbW9k" + + "ZWxzIHNlcnZlZCB0aHJvdWdoIHRoZSBzZWxmLW1hbmFnZWQgTExNIEdhdGV3YXkuIExMTSBmdW5j" + + "dGlvbnMgbXVzdCBkZWZpbmUgYXQgbGVhc3Qgb25lIGBtb2RlbHNbXWAgZW50cnkgd2l0aCBgbmFt" + + "ZWAgYW5kIGBsbG1Db25maWcudXJpc2A7IHRoZSBzdXBwb3J0ZWQgdXBzdHJlYW0gcGF0aHMgYXJl" + + "IGAvdjEvY2hhdC9jb21wbGV0aW9uc2AsIGAvdjEvcmVzcG9uc2VzYCwgYW5kIGAvdjEvZW1iZWRk" + + "aW5nc2AuCgpVc2UgYC9oZWFsdGhgIG9uIHBvcnQgYDgwMDBgIGFzIHRoZSBkZWZhdWx0IE9wZW5B" + + "SS1jb21wYXRpYmxlIGNvbnRhaW5lciBoZWFsdGggcHJvYmUgdW5sZXNzIHRoZSBpbWFnZSBleHBv" + + "c2VzIGEgZGlmZmVyZW50IHJlYWRpbmVzcyBwYXRoLgoKTExNIGZ1bmN0aW9uIHR5cGUgaXMgaW5k" + + "ZXBlbmRlbnQgb2Ygd29ya2xvYWQgcGFja2FnaW5nLiBGb3IgYSBIZWxtLWNoYXJ0IGJhY2tlZCBM" + + "TE0gZnVuY3Rpb24sIGtlZXAgYGZ1bmN0aW9uVHlwZTogIkxMTSJgIGFuZCBgbW9kZWxzW10ubGxt" + + "Q29uZmlnYCwgdGhlbiBzZXQgYGhlbG1DaGFydGAgYW5kIGBoZWxtQ2hhcnRTZXJ2aWNlTmFtZWAg" + + "aW4gdGhlIGNyZWF0ZSByZXF1ZXN0LiBgaGVsbUNoYXJ0U2VydmljZU5hbWVgIG11c3QgbWF0Y2gg" + + "dGhlIEt1YmVybmV0ZXMgU2VydmljZSBleHBvc2VkIGJ5IHRoZSBjaGFydCwgYW5kIGBpbmZlcmVu" + + "Y2VQb3J0YCBtdXN0IGJlIHRoYXQgU2VydmljZSBwb3J0LgoKSW52b2NhdGlvbiB1c2VzIHRoZSBM" + + "TE0gcm91dGUsIGZvciBleGFtcGxlIGBodHRwczovL2xsbS5pbnZvY2F0aW9uLjxkb21haW4+L3Yx" + + "L2NoYXQvY29tcGxldGlvbnNgLiBUaGUgT3BlbkFJIGBtb2RlbGAgdmFsdWUgbXVzdCBiZSBgPGZ1" + + "bmN0aW9uLWlkPi88bW9kZWwtbmFtZT5gOyB0aGUgZnVuY3Rpb24gSUQgaXMgdGhlIHJvdXRpbmcg" + + "a2V5IGFuZCB0aGUgbW9kZWwgbmFtZSBpcyBmb3J3YXJkZWQgdXBzdHJlYW0uCgpVcGRhdGUgbXV0" + + "YWJsZSBwZXItbW9kZWwgcm91dGluZyBzZXR0aW5ncyB3aXRoIGBudmNmLWNsaSBmdW5jdGlvbiB1" + + "cGRhdGUgLS1sbG0tbW9kZWwtdXBkYXRlPSduYW1lPTxtb2RlbD4scm91dGluZ01ldGhvZD08bWV0" + + "aG9kPix0b2tlblJhdGVMaW1pdD08bGltaXQ+J2AsIG9yIHB1dCB0aGUgc2FtZSBmaWVsZHMgdW5k" + + "ZXIgYG1vZGVsVXBkYXRlc1tdLmxsbUNvbmZpZ2AgaW4gYW4gdXBkYXRlIEpTT04gZmlsZS4gU2Vl" + + "IFtyZWZlcmVuY2UvZmxhZ3MubWRdKHJlZmVyZW5jZS9mbGFncy5tZCkgZm9yIGFjY2VwdGVkIHJv" + + "dXRpbmcgbWV0aG9kcy4gYHRva2VuUmF0ZUxpbWl0YCBzdXBwb3J0cyBwb3NpdGl2ZSBpbnRlZ2Vy" + + "IGxpbWl0cyBmb3IgYFNgLCBgTWAsIGBIYCwgYERgLCBhbmQgYFdgOyB1c2UgSlNPTiBpbnB1dCBm" + + "b3IgY29tYmluZWQgbGltaXRzIHN1Y2ggYXMgYDEwMDAtUyw1MDAwLU0sMTAwMDAwLUgsNTAwMDAw" + + "LUQsMTAwMDAwMC1XYC4gRG8gbm90IGluY2x1ZGUgYHVyaXNgIGluIG1vZGVsIHVwZGF0ZXMuCgpG" + + "b3IgYC92MS9yZXNwb25zZXNgLCB0aGUgZ2F0ZXdheSBwcm94aWVzIHRoZSBuYXRpdmUgUmVzcG9u" + + "c2VzIHBhdGggdXBzdHJlYW0sIHJlbGF5cyBTU0UgdG8gc3RyZWFtaW5nIGNsaWVudHMsIGFuZCBh" + + "Z2dyZWdhdGVzIHRoZSB0ZXJtaW5hbCBKU09OIHJlc3BvbnNlIGZvciBub24tc3RyZWFtaW5nIGNs" + + "aWVudHMuIEZvciBgL3YxL2VtYmVkZGluZ3NgLCBpbnB1dCBtYXkgYmUgYSBzdHJpbmcgb3Igc3Ry" + + "aW5nIGFycmF5LCBtdXN0IGJlIG5vbi1lbXB0eSwgYW5kIG1heSBjb250YWluIGF0IG1vc3QgMjA0" + + "OCBlbnRyaWVzLgoKU2Vzc2lvbiBzdGlja2luZXNzIHVzZXMgYHgtbXVsdGktdHVybi1zZXNzaW9u" + + "LWlkYCBmb3IgY2hhdCBjb21wbGV0aW9ucyBhbmQgUmVzcG9uc2VzIEFQSSByZXF1ZXN0cyBvbmx5" + + "LiBFbWJlZGRpbmdzIHJlcXVlc3RzIGRvIG5vdCB1c2Ugc3RpY2tpbmVzcy4KCiMjIENvbW1vbiB3" + + "b3JrZmxvd3MKCkZvciBzdGVwLWJ5LXN0ZXAgcGxheWJvb2tzLCBsb2FkIHRoZSBwcm9tcHQgdGhh" + + "dCBtYXRjaGVzIHRoZSB1c2VyJ3MgaW50ZW50OgoKLSAqKkluc3RhbGwgZnJvbSBzY3JhdGNoLioq" + + "IFtwcm9tcHRzL2luc3RhbGwtZnJvbS1zY3JhdGNoLm1kXShwcm9tcHRzL2luc3RhbGwtZnJvbS1z" + + "Y3JhdGNoLm1kKSDigJQgazNkIGNsdXN0ZXIg4oaSIHByZWZsaWdodCDihpIgdXAg4oaSIGRlcGxv" + + "eSBhIHNtb2tlIGZ1bmN0aW9uLgotICoqQWRkIGEgbmV3IGNvbXB1dGUgcGxhbmUuKiogW3Byb21w" + + "dHMvYWRkLWNvbXB1dGUtcGxhbmUubWRdKHByb21wdHMvYWRkLWNvbXB1dGUtcGxhbmUubWQpIOKA" + + "lCBzcGxpdC1jbHVzdGVyIGB1cGAgYWdhaW5zdCBhbiBleGlzdGluZyBjb250cm9sIHBsYW5lLgot" + + "ICoqRGVwbG95IGFuZCBpbnZva2UgYSBmdW5jdGlvbi4qKiBbcHJvbXB0cy9kZXBsb3ktYW5kLWlu" + + "dm9rZS5tZF0ocHJvbXB0cy9kZXBsb3ktYW5kLWludm9rZS5tZCkg4oCUIGNyZWF0ZSDihpIgZGVw" + + "bG95IOKGkiBBUEkga2V5IOKGkiBpbnZva2UsIGluY2x1ZGluZyB0aGUgTExNIGNyZWF0ZS9pbnZv" + + "a2UgdmFyaWFudC4KLSAqKkRpYWdub3NlIGEgZmFpbGVkIGluc3RhbGwuKiogW3Byb21wdHMvZGlh" + + "Z25vc2UtZmFpbGVkLWluc3RhbGwubWRdKHByb21wdHMvZGlhZ25vc2UtZmFpbGVkLWluc3RhbGwu" + + "bWQpIOKAlCBgc3RhdHVzIC0tanNvbmAg4oaSIGlkZW50aWZ5IGZhaWxlZCBjb21wb25lbnQg4oaS" + + "IGt1YmVjdGwgZGVzY3JpYmUg4oaSIHJlbWVkaWF0aW9uLgotICoqUm90YXRlIEpXS1MuKiogW3By" + + "b21wdHMvcm90YXRlLWNsdXN0ZXItandrcy5tZF0ocHJvbXB0cy9yb3RhdGUtY2x1c3Rlci1qd2tz" + + "Lm1kKSDigJQgd2hlbiBQU0FUIGF1dGggc3RhcnRzIGZhaWxpbmcuCi0gKipUZWFyIGRvd24uKiog" + + "W3Byb21wdHMvdGVhcmRvd24ubWRdKHByb21wdHMvdGVhcmRvd24ubWQpIOKAlCBgZG93biAtLXBs" + + "YW4tb25seWAgZmlyc3QsIHRoZW4gcmVhbCBydW4uIGBkb3duIC0tY2x1c3Rlci1uYW1lPVhgIGZv" + + "ciBvbmUgY29tcHV0ZSBwbGFuZSAob3JjaGVzdHJhdG9yOiBkcmFpbiArIHVuaW5zdGFsbCArIGNs" + + "dXN0ZXIgZGVsZXRlKTsgYHVuaW5zdGFsbCAtLWNvbnRyb2wtcGxhbmVgIGZvciB0aGUgY29udHJv" + + "bCBwbGFuZSAocGVyLXBsYW5lIHByaW1pdGl2ZSk7IGBkb3duIC0tYWxsIC0tY29uZmlybWAgZm9y" + + "IGV2ZXJ5dGhpbmc7IGB1bmluc3RhbGwgLS1uby1hcHBseSA8cGxhbmU+IHwga3ViZWN0bCBkZWxl" + + "dGUgLWYgLWAgZm9yIEdpdE9wcy4KLSAqKkNyZWF0ZSBhbmQgcnVuIGEgdGFzay4qKiBbcHJvbXB0" + + "cy9jcmVhdGUtYW5kLXJ1bi10YXNrLm1kXShwcm9tcHRzL2NyZWF0ZS1hbmQtcnVuLXRhc2subWQp" + + "IOKAlCBtaW50IEFQSSBrZXlzIOKGkiB0YXNrIGNyZWF0ZSAoY29udGFpbmVyIG9yIEhlbG0pIOKG" + + "kiBtb25pdG9yIHdpdGggYHRhc2sgZ2V0YCAvIGB0YXNrIGV2ZW50c2Ag4oaSIHJldHJpZXZlIHJl" + + "c3VsdHMg4oaSIGNsZWFudXAuCgojIyBSZWZlcmVuY2UKCi0gW3JlZmVyZW5jZS9jb21tYW5kcy5t" + + "ZF0ocmVmZXJlbmNlL2NvbW1hbmRzLm1kKSDigJQgZnVsbCBzdWJjb21tYW5kIGNoZWF0IHNoZWV0" + + "Ci0gW3JlZmVyZW5jZS9mbGFncy5tZF0ocmVmZXJlbmNlL2ZsYWdzLm1kKSDigJQgZ2xvYmFsICsg" + + "cGVyLWNvbW1hbmQgZmxhZ3MKLSBbcmVmZXJlbmNlL2V4aXQtY29kZXMubWRdKHJlZmVyZW5jZS9l" + + "eGl0LWNvZGVzLm1kKSDigJQgd2hhdCBlYWNoIG5vbi16ZXJvIGV4aXQgbWVhbnMKLSBbcmVmZXJl" + + "bmNlL3Ryb3VibGVzaG9vdGluZy5tZF0ocmVmZXJlbmNlL3Ryb3VibGVzaG9vdGluZy5tZCkg4oCU" + + "IGtub3duIGVycm9ycyDihpIgcmVtZWRpYXRpb24gdGFibGUKCiMjIFNhZmV0eSBydWxlcyDigJQg" + + "Q1JJVElDQUwKCioqTkVWRVIgZG8gdGhlc2Ugd2l0aG91dCBleHBsaWNpdCB1c2VyIGNvbmZpcm1h" + + "dGlvbjoqKgotIGBudmNmLWNsaSBzZWxmLWhvc3RlZCBkb3duYCBvciBgdW5pbnN0YWxsYCBpbiBh" + + "bnkgZm9ybSDigJQgZGVzdHJ1Y3RpdmUuICoqQUxXQVlTIHJ1biB3aXRoIGAtLXBsYW4tb25seWAg" + + "KGBkb3duYCkgb3IgYC0tbm8tYXBwbHlgIChgdW5pbnN0YWxsYCkgZmlyc3QqKiBhbmQgc2hvdyB0" + + "aGUgdXNlciB3aGF0IHdvdWxkIGhhcHBlbi4gU3RhdGUgd2hpY2ggY29tcHV0ZSBwbGFuZShzKSBh" + + "bmQgd2hldGhlciBwZXJzaXN0ZW50IHN0YXRlIHdvdWxkIGJlIHdpcGVkLgotIGBudmNmLWNsaSBz" + + "ZWxmLWhvc3RlZCBkb3duIC0tcmVtb3ZlLXBlcnNpc3RlbnRgIChvciBgdW5pbnN0YWxsIC0tcmVt" + + "b3ZlLXBlcnNpc3RlbnRgKSDigJQgZGVsZXRlcyBDYXNzYW5kcmEgcm93cywgT3BlbkJhbyBzZWFs" + + "IGtleXMsIHNyLWRlZmF1bHQgdXNlciBkYXRhLiAqKkxvc3MgaXMgdW5yZWNvdmVyYWJsZS4qKiBD" + + "b25maXJtIGV4cGxpY2l0bHkgdGhhdCB0aGlzIGlzIHdoYXQgdGhlIHVzZXIgd2FudHMuCi0gYG52" + + "Y2YtY2xpIHNlbGYtaG9zdGVkIHVuaW5zdGFsbCAtLWNvbnRyb2wtcGxhbmUgLS1mb3JjZS13aXRo" + + "LXJlZ2lzdGVyZWQtY2x1c3RlcnNgIOKAlCBvcnBoYW5zIGV2ZXJ5IHJlZ2lzdGVyZWQgY29tcHV0" + + "ZSBwbGFuZSAoUFNBVCBhdXRoIGJyZWFrcyBpbW1lZGlhdGVseSkuIFN0YXRlIHRoZSBjb25zZXF1" + + "ZW5jZSBiZWZvcmUgcGFzc2luZyB0aGlzIGZsYWcuCi0gYG52Y2YtY2xpIHNlbGYtaG9zdGVkIGRv" + + "d24gLS1hbGxgIOKAlCBudWtlcyBldmVyeXRoaW5nLiBBbHdheXMgc2hvdyB0aGUgY2x1c3RlciBs" + + "aXN0IChgbnZjZi1jbGkgY2x1c3RlciBsaXN0YCkgYW5kIGdldCBjb25maXJtYXRpb24uCi0gYG52" + + "Y2YtY2xpIGNsdXN0ZXIgZGVsZXRlYCDigJQgcmVtb3ZlcyB0aGUgY2x1c3RlcidzIElDTVMgcmVn" + + "aXN0cmF0aW9uOyB0aGUgY29tcHV0ZSBwbGFuZSBpbW1lZGlhdGVseSBzdG9wcyBiZWluZyBhYmxl" + + "IHRvIGF1dGhlbnRpY2F0ZS4KLSBgbnZjZi1jbGkgZnVuY3Rpb24gZGVsZXRlYCDigJQgcmVtb3Zl" + + "cyBhIGZ1bmN0aW9uIGFuZCBhbnkgYWN0aXZlIGRlcGxveW1lbnQuCi0gYG52Y2YtY2xpIHRhc2sg" + + "ZGVsZXRlYCDigJQgcGVybWFuZW50bHkgcmVtb3ZlcyB0aGUgdGFzayByZWNvcmQuIFN0b3AsIHN0" + + "YXRlIHRoZSB0YXNrIElEIGFuZCBjdXJyZW50IHN0YXR1cywgdGhlbiB3YWl0IGZvciBhIHN1YnNl" + + "cXVlbnQgdXNlciByZXBseSB0aGF0IGV4cGxpY2l0bHkgY29uZmlybXMgZGVsZXRpb24gb2YgdGhh" + + "dCBzcGVjaWZpYyB0YXNrIGJlZm9yZSBydW5uaW5nIHRoaXMgY29tbWFuZC4gRG8gbm90IHRyZWF0" + + "IHRoZSB1c2VyJ3Mgb3JpZ2luYWwgZGVsZXRlIHJlcXVlc3QgYXMgY29uZmlybWF0aW9uLgotIEFu" + + "eSByYXcgYGhlbG0gdW5pbnN0YWxsYCBvciBga3ViZWN0bCBkZWxldGUgcHZjL3B2YCDigJQgYWZm" + + "ZWN0cyBwZXJzaXN0ZW50IHN0YXRlLiBQcmVmZXIgYG52Y2YtY2xpIHNlbGYtaG9zdGVkIGRvd25g" + + "IChvcmNoZXN0cmF0b3IpIG9yIGB1bmluc3RhbGxgIChwZXItcGxhbmUpIHdoaWNoIGhhbmRsZSB0" + + "aGlzIHNhZmVseS4KLSBBbnkgYC0tZm9yY2VgIGZsYWcgKGAtLWZvcmNlLXdpdGgtcmVnaXN0ZXJl" + + "ZC1jbHVzdGVyc2AsIGAtLWNvbmZpcm1gIGluIG5vbi1pbnRlcmFjdGl2ZSBjb250ZXh0cykuCgoq" + + "KkFMV0FZUyBkbyB0aGVzZToqKgotIFJ1biBgbnZjZi1jbGkgc2VsZi1ob3N0ZWQgc3RhdHVzYCBi" + + "ZWZvcmUgYXNzdW1pbmcgYSBjbHVzdGVyIGV4aXN0cyAvIGlzIGhlYWx0aHkuCi0gU2hvdyB0aGUg" + + "cGxhbm5lZCBhY3Rpb24gKGNsdXN0ZXIgbmFtZSwgZnVuY3Rpb24gbmFtZSwgR1BVIHR5cGUsIGNv" + + "c3QgaWYga25vd24pIGJlZm9yZSBjcmVhdGluZy4KLSBCZWZvcmUgY3JlYXRpbmcgb3IgZGVwbG95" + + "aW5nIGEgY29udGFpbmVyIG9yIExMTSBmdW5jdGlvbiwgY29uZmlybSB0aGUgZXhhY3QgZnVuY3Rp" + + "b24gbmFtZSBhbmQgY29udGFpbmVyIGltYWdlIHdpdGggdGhlIHVzZXIuIEZvciBMTE0gZnVuY3Rp" + + "b25zLCBhbHNvIGNvbmZpcm0gdGhlIGV4YWN0IG1vZGVsIG5hbWUgdXNlZCBpbiBgbW9kZWxzW10u" + + "bmFtZWAgYW5kIE9wZW5BSSBgbW9kZWw6ICI8ZnVuY3Rpb24taWQ+Lzxtb2RlbC1uYW1lPiJgLiBJ" + + "ZiBhbnkgdmFsdWUgaXMgbWlzc2luZywgYXNrIHRoZSB1c2VyIGluc3RlYWQgb2YgZ3Vlc3Npbmcg" + + "b3Igc3VibWl0dGluZyBleGFtcGxlIHBsYWNlaG9sZGVycy4KLSBDb25maXJtIGV4YWN0IHJlc291" + + "cmNlIG5hbWVzIGJlZm9yZSBkZWxldGlvbiDigJQgbWF0Y2ggYWdhaW5zdCBgY2x1c3RlciBsaXN0" + + "YCAvIGBmdW5jdGlvbiBsaXN0YCBvdXRwdXQuCi0gSW4gQ0kgLyBub24taW50ZXJhY3RpdmUgY29u" + + "dGV4dHMsIHVzZSBgLS1ub24taW50ZXJhY3RpdmUgLS10b2tlbj0kSldUYC4gTmV2ZXIgcHJvcG9z" + + "ZSBpbnRlcmFjdGl2ZSBgbnZjZi1jbGkgaW5pdGAgd2hlbiBgJENJYCBpcyBzZXQuCgoqKk5FVkVS" + + "IHBhc3RlIHRoZXNlIGludG8gY2hhdCAvIGxvZ3MgLyBmZWVkYmFjazoqKgotIEFkbWluIHRva2Vu" + + "cyAoZnVsbCBKV1QpLiBTaG93IHRoZSBmaXJzdCA4IGNoYXJzICsgYC4uLmAgaWYgeW91IG11c3Qg" + + "cmVmZXJlbmNlIG9uZS4KLSBBUEkga2V5cyAoYG52YXBpLeKApmApLgotIENvbnRlbnRzIG9mIGB+" + + "Ly5udmNmLWNsaS5zdGF0ZWAgb3IgYW55IGt1YmVjb25maWcuCi0gQW55IGRhdGEgbWFya2VkIHNl" + + "Y3JldCBpbiBoZWxtZmlsZSB2YWx1ZXMuCgo+IE5vdGUgKG9ubHkgd2hlbiBvcGVyYXRpbmcgbW9y" + + "ZSB0aGFuIG9uZSBjbHVzdGVyIGZyb20gdGhlIHNhbWUgbWFjaGluZSk6IHRoZSBDTEkncyBkZWZh" + + "dWx0Cj4gY29uZmlnIChgfi8ubnZjZi1jbGkueWFtbGApIGFuZCBzdGF0ZSAoYH4vLm52Y2YtY2xp" + + "LnN0YXRlYCkgYXJlIGEgc2luZ2xlIHNoYXJlZCBzbG90LCBub3QKPiBwZXItY2x1c3Rlci4gV2l0" + + "aCBhIHNpbmdsZSBjb250cm9sIHBsYW5lICh0aGUgY29tbW9uIGNhc2UpIHRoaXMgbmVlZHMgbm8g" + + "YXR0ZW50aW9uLiBJZiB5b3UKPiBtYW5hZ2UgbXVsdGlwbGUgY2x1c3RlcnMsIHBhc3MgYC0tY29u" + + "ZmlnIDxjbHVzdGVyPi55YW1sYCBvbiBldmVyeSBjb21tYW5kIChvciBrZWVwIGEKPiBkZWxpYmVy" + + "YXRlbHktc3dpdGNoZWQgcGVyLWNsdXN0ZXIgZGVmYXVsdCk6IHdpdGggbm8gYC0tY29uZmlnYCwg" + + "Y29tbWFuZHMgdGFyZ2V0IHdoaWNoZXZlcgo+IGNsdXN0ZXIgd2FzIGxhc3QgYGluaXRgJ2QsIGFu" + + "ZCBgaW5pdGAgLyBgYXBpLWtleSBnZW5lcmF0ZWAgbXV0YXRlIHRoYXQgc2hhcmVkIGRlZmF1bHQs" + + "IHNvIGFuCj4gdW5zY29wZWQgYGFwaS1rZXkgZ2VuZXJhdGVgIGNhbiBtaW50IG9yIHN1cmZhY2Ug" + + "a2V5cyBhZ2FpbnN0IHRoZSB3cm9uZyBjbHVzdGVyLgoKIyMgT3V0cHV0IG1vZGVzIChmb3IgYWdl" + + "bnQgcGlwaW5nKQoKYG52Y2YtY2xpYCBzdWJjb21tYW5kcyB0aGF0IGxvbmctcnVuIChgdXBgLCBg" + + "c3RhdHVzYCwgYGNoZWNrYCkgYWNjZXB0IGZvdXIgb3V0cHV0IG1vZGVzOgoKLSAqKmAtLWpzb25g" + + "Kiog4oCUIEpTT05MIGV2ZW50cyBvbiBzdGRlcnI7IG9uZSBldmVudCBwZXIgbGluZTsgc3RhYmxl" + + "IHNjaGVtYSAoYHNjaGVtYVZlcnNpb246IDJgKS4gKipVc2UgdGhpcyB3aGVuIHJ1bm5pbmcgdW5k" + + "ZXIgYW4gYWdlbnQuKiogUGFyc2UgbGluZS1ieS1saW5lIHdpdGggYGpxIC1jIC5gIG9yIGBqc29u" + + "LmxvYWRzKClgLgotICoqYC0tcGxhaW5gKiog4oCUIFBsYWluIHRpbWVzdGFtcGVkIGxpbmVzLCBS" + + "RkMzMzM5IFVUQywgYFtOTi84XWAgcGhhc2UgcHJlZml4OyBncmVwLWZyaWVuZGx5LiBEZWZhdWx0" + + "IGluIG5vbi1UVFkuCi0gKipgLS1hY2Nlc3NpYmxlYCoqIOKAlCBQbGFpbiBvdXRwdXQgd2l0aG91" + + "dCBzcGlubmVycywgd2l0aCB2ZXJib3NlIHN0YXRlIG1hcmtlcnMgKGBbY29tcGxldGVkXWAsIGBb" + + "cnVubmluZ11gLCBgW3BlbmRpbmddYCwgYFtmYWlsZWRdYCkuIEZvciBzY3JlZW4gcmVhZGVycyBh" + + "bmQgY29uc3RyYWluZWQgdGVybWluYWxzLgotICoqKG5vIGZsYWcpKiog4oCUIEJ1YmJsZXRlYSBU" + + "VFkgZGFzaGJvYXJkLiBEZWZhdWx0IGluIFRUWSDiiaUxMDDDlzMwLiBEb24ndCB1c2UgdW5kZXIg" + + "YW4gYWdlbnQgKGN1cnNvci11cCBzZXF1ZW5jZXMgYXJlIG5vaXN5KS4KCkF1dG8tZGV0ZWN0IHBp" + + "Y2tzIHRoZSByaWdodCBtb2RlIGZvciB3aGF0ZXZlciBzdGRvdXQvc3RkZXJyIGlzLiBUaGUgQ0xJ" + + "IGFsc28gaG9ub3JzIGBOT19DT0xPUmAgKGFueSB2YWx1ZSDihpIgZm9yY2VzIHBsYWluKSwgYFRF" + + "Uk09ZHVtYmAgKGZvcmNlcyBwbGFpbiksIGFuZCBgQ0k9dHJ1dGh5YCAoZm9yY2VzIHBsYWluIGV2" + + "ZW4gb24gYSBmYWtlIFRUWSkuIFdoZW4gdGhlIHRlcm1pbmFsIGlzIHNtYWxsZXIgdGhhbiAxMDDD" + + "lzMwLCB0aGUgYnViYmxldGVhIHJlbmRlcmVyIGZhbGxzIGJhY2sgdG8gYSBjb21wYWN0IGxheW91" + + "dC4gRXhwbGljaXQgYC0tanNvbmAgaXMgdGhlIHJpZ2h0IGNhbGwgZm9yIGFnZW50IHBpcGluZy4K" + + "CiMjIE9uIGZhaWx1cmUKCmBudmNmLWNsaWAgZmFpbHVyZXMgZW1pdCBzdHJ1Y3R1cmVkIGBwaGFz" + + "ZV9mYWlsZWRgIGV2ZW50cyBpbiBKU09OOgoKYGBganNvbgp7ImV2ZW50IjoicGhhc2VfZmFpbGVk" + + "IiwicGhhc2VOdW0iOjQsInBoYXNlIjoiYXBwbHktY3AiLAogImVyckNhdGVnb3J5IjoiaGVsbV9h" + + "cHBseSIsImVyck1lc3NhZ2UiOiJoZWxtIGluc3RhbGwgYXBpLWtleXM6IHRpbWVkIG91dCIsCiAi" + + "cmV0cnlDbGFzcyI6ImJhY2tvZmYiLCJyZXRyeUFmdGVyU2VjIjo2MCwKICJyZW1lZGlhdGlvbiI6" + + "WyJrdWJlY3RsIGRlc2NyaWJlIHBvZCAtbiBjYXNzYW5kcmEtc3lzdGVtIGNhc3NhbmRyYS0wIiwK" + + "ICAgICAgICAgICAgICAgICJSZS1ydW4gd2l0aCAtLWRlYnVnIGZvciB2ZXJib3NlIGhlbG1maWxl" + + "IG91dHB1dCJdLAogInJhdyI6eyJzdWJwcm9jZXNzIjoiaGVsbWZpbGUiLCJleGl0Q29kZSI6MSwi" + + "c3RkZXJyVGFpbCI6IuKApiIsImt1YmVybmV0ZXNSZWFzb24iOiJGYWlsZWRTY2hlZHVsaW5nIn19" + + "CmBgYAoKVGhlIGByZXRyeUNsYXNzYCBmaWVsZCB0ZWxscyB0aGUgYWdlbnQgaG93IHRvIGhhbmRs" + + "ZSB0aGUgZmFpbHVyZToKCnwgYHJldHJ5Q2xhc3NgIHwgTWVhbmluZyB8IEFnZW50IGFjdGlvbiB8" + + "CnwtLS18LS0tfC0tLXwKfCBgaW1tZWRpYXRlYCB8IFRyYW5zaWVudCBibGlwIHwgUmV0cnkgdGhl" + + "IHNhbWUgYHVwYCBjb21tYW5kIG5vdyB8CnwgYGJhY2tvZmZgIHwgUmF0ZSBsaW1pdCAvIHBlbmRp" + + "bmcgb3BlcmF0aW9uIHwgV2FpdCBgcmV0cnlBZnRlclNlY2Agc2Vjb25kcywgdGhlbiByZXRyeSB8" + + "CnwgYGFmdGVyX3JlbWVkaWF0aW9uYCB8IE9wZXJhdG9yIG11c3QgaW50ZXJ2ZW5lIHwgU3VyZmFj" + + "ZSBgZXJyTWVzc2FnZWAgKyBgcmVtZWRpYXRpb25gLCBTVE9QLiBEb24ndCBhdXRvLXJldHJ5LiB8" + + "CnwgYG5vbmVgIHwgTm9uLXJldHJ5YWJsZSB8IFNhbWUgYXMgYGFmdGVyX3JlbWVkaWF0aW9uYCDi" + + "gJQgc3VyZmFjZSBhbmQgc3RvcCB8CnwgYHVua25vd25gIHwgQ2xhc3NpZmllciB1bnN1cmUgfCBU" + + "cmVhdCBjb25zZXJ2YXRpdmVseTogc3VyZmFjZSBhbmQgc3RvcCB8CgpOZXZlciByZS1ydW4gd2l0" + + "aCBgLS1mb3JjZWAgKG5vIGNvbW1hbmQgdGFrZXMgb25lKS4gVGhlIGByYXdgIGJsb2NrIGNhcnJp" + + "ZXMgdGhlIHVuZGVybHlpbmcgc2lnbmFsIChzdWJwcm9jZXNzIGV4aXQsIEhUVFAgc3RhdHVzLCBL" + + "OHMgcmVhc29uKSDigJQgcXVvdGUgcmVsZXZhbnQgZmllbGRzIHdoZW4gZXhwbGFpbmluZyBmYWls" + + "dXJlcyB0byB0aGUgdXNlciwgYnV0IGRvbid0IGR1bXAgYHN0ZGVyclRhaWxgIHZlcmJhdGltIGlu" + + "dG8gY2hhdCB3aXRob3V0IHNjYW5uaW5nIGZvciBzZWNyZXRzIGZpcnN0LgoKIyMgUXVpY2sgY29t" + + "bWFuZCByZWZlcmVuY2UKCmBgYHNoCm52Y2YtY2xpIHNlbGYtaG9zdGVkIGNoZWNrIC0tcHJlICAg" + + "ICAgICAgICAgICAjIHByZS1mbGlnaHQKbnZjZi1jbGkgc2VsZi1ob3N0ZWQgdXAgLS1jbHVzdGVy" + + "LW5hbWU9TkFNRSAgICMgb25lLXNob3QgaW5zdGFsbApudmNmLWNsaSBzZWxmLWhvc3RlZCBzdGF0" + + "dXMgICAgICAgICAgICAgICAgICAgIyBzbmFwc2hvdApudmNmLWNsaSBzZWxmLWhvc3RlZCBzdGF0" + + "dXMgLS13YXRjaCAgICAgICAgICAgIyBsaXZlCm52Y2YtY2xpIGluaXQgICAgICAgICAgICAgICAg" + + "ICAgICAgICAgICAgICAgICAjIG1pbnQgYWRtaW4gdG9rZW4gKGNsZWFycyBhbGwgc2F2ZWQgQVBJ" + + "IGtleXMpCm52Y2YtY2xpIGNsdXN0ZXIgcmVnaXN0ZXIg4oCmICAgICAgICAgICAgICAgICAgICMg" + + "cmVnaXN0ZXIgY2x1c3RlcgpudmNmLWNsaSBhcGkta2V5IGdlbmVyYXRlIC0tZGVzY3JpcHRpb249" + + "4oCmICAgICAjIG1pbnQgYm90aCBmdW5jdGlvbiBhbmQgdGFzayBBUEkga2V5cyAocnVuIGFmdGVy" + + "IGV2ZXJ5IGluaXQpCm52Y2YtY2xpIGFwaS1rZXkgZ2VuZXJhdGUgLS1mb3IgZnVuY3Rpb24g4oCm" + + "ICAgICMgZnVuY3Rpb24ga2V5IG9ubHkKbnZjZi1jbGkgYXBpLWtleSBnZW5lcmF0ZSAtLWZvciB0" + + "YXNrIOKApiAgICAgICAgIyB0YXNrIGtleSBvbmx5Cm52Y2YtY2xpIGZ1bmN0aW9uIGNyZWF0ZSAt" + + "LWlucHV0LWZpbGU94oCmICAgICAgICMgY3JlYXRlIGZ1bmN0aW9uCm52Y2YtY2xpIGZ1bmN0aW9u" + + "IGNyZWF0ZSAtLWZ1bmN0aW9uLXR5cGU9TExNIC0tbGxtLW1vZGVsPTxzcGVjPiAgIyBjcmVhdGUg" + + "TExNIGZ1bmN0aW9uIG1ldGFkYXRhCm52Y2YtY2xpIGZ1bmN0aW9uIGNyZWF0ZSAtLW5hbWU9bGxt" + + "LWhlbG0gLS1pbmZlcmVuY2UtdXJsPS8gLS1pbmZlcmVuY2UtcG9ydD04MDAwIFwKICAtLWZ1bmN0" + + "aW9uLXR5cGU9TExNIC0taGVsbS1jaGFydD08Y2hhcnQ+IC0taGVsbS1jaGFydC1zZXJ2aWNlPTxz" + + "ZXJ2aWNlPiAtLWxsbS1tb2RlbD08c3BlYz4KbnZjZi1jbGkgZnVuY3Rpb24gdXBkYXRlIC0tbGxt" + + "LW1vZGVsLXVwZGF0ZT08c3BlYz4gICMgdXBkYXRlIExMTSByb3V0aW5nL3Rva2VuIGxpbWl0cwpu" + + "dmNmLWNsaSBmdW5jdGlvbiBkZXBsb3kgY3JlYXRlIC0taW5wdXQtZmlsZT3igKYKbnZjZi1jbGkg" + + "ZnVuY3Rpb24gaW52b2tlIC0taW5wdXQtZmlsZT3igKYKCiMgVGFzayBjb21tYW5kcyDigJQgcmVx" + + "dWlyZXMgTlZDRl9CQVNFX05WQ1RfVVJMPWh0dHA6Ly88bnZjdC1nYXRld2F5PgpudmNmLWNsaSB0" + + "YXNrIGNyZWF0ZSAtLW5hbWU9WCAtLWdwdT1IMTAwIC0taW5zdGFuY2UtdHlwZT1ZIC0taW1hZ2U9" + + "WgpudmNmLWNsaSB0YXNrIGNyZWF0ZSAtLWlucHV0LWZpbGU9dGFzay5qc29uICAgIyBmcm9tIEpT" + + "T04gY29uZmlnCm52Y2YtY2xpIHRhc2sgbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAj" + + "IGxpc3QgYWxsIHRhc2tzCm52Y2YtY2xpIHRhc2sgbGlzdCAtLXN0YXR1cz1SVU5OSU5HICAgICAg" + + "ICAgICAjIGZpbHRlciBieSBzdGF0dXMKbnZjZi1jbGkgdGFzayBnZXQgW3Rhc2tJZF0gICAgICAg" + + "ICAgICAgICAgICAgICMgdGFzayBkZXRhaWxzCm52Y2YtY2xpIHRhc2sgZXZlbnRzIFt0YXNrSWRd" + + "ICAgICAgICAgICAgICAgICAjIGxpZmVjeWNsZSBldmVudHMKbnZjZi1jbGkgdGFzayByZXN1bHRz" + + "IFt0YXNrSWRdICAgICAgICAgICAgICAgICMgcmVzdWx0IGFydGlmYWN0cwpudmNmLWNsaSB0YXNr" + + "IGNhbmNlbCBbdGFza0lkXQpudmNmLWNsaSB0YXNrIGRlbGV0ZSBbdGFza0lkXQpgYGAKCiMjIEZl" + + "ZWRiYWNrCgpJZiB0aGUgdXNlciBoaXRzIGEgYnVnIG9yIGxpbWl0YXRpb24sIGZpbGUgYW4gaXNz" + + "dWUgdGhyb3VnaCB0aGUgcHJvamVjdCB0cmFja2VyLiBEb24ndCBpbmNsdWRlIHNlY3JldHMuClBL" + + "BwjFnijlBWAAAAVgAABQSwMEFAAIAAAAAAAhAAAAAAAAAAAAAAAAADMACQBkYXRhL252Y2Ytc2Vs" + + "Zi1tYW5hZ2VkLWNsaS9leGFtcGxlcy9jaS1waXBlbGluZXMubWRVVAUAAQCmzhIjIENJIHBpcGVs" + + "aW5lIHBhdHRlcm5zCgpIb3cgdG8gZHJpdmUgYG52Y2YtY2xpYCBmcm9tIENJIChHaXRMYWIgQ0ks" + + "IEdpdEh1YiBBY3Rpb25zLCBKZW5raW5zLCBBcmdvQ0QpLiBQYXR0ZXJucyB0aGF0IHN1cmZhY2Ug" + + "ZnJlcXVlbnRseS4KCiMjIEJhc2ljIGluc3RhbGwgcGlwZWxpbmUKCmBgYHlhbWwKIyBHaXRMYWIg" + + "Q0kgZXhhbXBsZQpkZXBsb3lfbnZjZjoKICBzdGFnZTogZGVwbG95CiAgaW1hZ2U6IG52Y3IuaW8v" + + "MDY1MTE1NTIxNTg2NDk3OS9uY3AtZGV2L252Y2YtY2xpOjEuNC4wCiAgdmFyaWFibGVzOgogICAg" + + "S1VCRUNPTkZJRzogJEtVQkVDT05GSUdfRklMRQogIHNjcmlwdDoKICAgIC0gbnZjZi1jbGkgc2Vs" + + "Zi1ob3N0ZWQgY2hlY2sgLS1wcmUgLS1qc29uIHwganEgLWUgJy5ldmVudCAhPSAicGhhc2VfZmFp" + + "bGVkIicgfHwgZXhpdCAyCiAgICAtIG52Y2YtY2xpIHNlbGYtaG9zdGVkIHVwIC0tY2x1c3Rlci1u" + + "YW1lPSRDTFVTVEVSX05BTUUgLS10b2tlbj0kTlZDRl9BRE1JTl9KV1QgLS1ub24taW50ZXJhY3Rp" + + "dmUgLS1qc29uCiAgICAtIG52Y2YtY2xpIHNlbGYtaG9zdGVkIHN0YXR1cyAtLWpzb24gfCBqcSAt" + + "ZSAnLnZlcmRpY3QgPT0gImhlYWx0aHkiJwpgYGAKCk5vdGVzOgotIGAtLW5vbi1pbnRlcmFjdGl2" + + "ZSAtLXRva2VuPSRKV1RgIGlzIHJlcXVpcmVkIGluIENJOyBuZXZlciB1c2UgaW50ZXJhY3RpdmUg" + + "YGluaXRgLgotIEFsd2F5cyBgLS1qc29uYCBmb3IgbWFjaGluZS1wYXJzaW5nLgotIEZpbmFsIHN0" + + "YXR1cyBjaGVjayBnYXRlcyBkb3duc3RyZWFtIHN0YWdlcyBvbiBgdmVyZGljdCA9PSAiaGVhbHRo" + + "eSJgLgoKIyMgR2l0T3BzIChBcmdvIC8gRmx1eCkgcGF0dGVybgoKQ0kgZG9lc24ndCBga3ViZWN0" + + "bCBhcHBseWAg4oCUIGluc3RlYWQsIHJlbmRlciBtYW5pZmVzdHMsIGNvbW1pdCB0aGVtLCBsZXQg" + + "dGhlIGNvbnRyb2xsZXIgYXBwbHkuCgpgYGB5YW1sCnJlbmRlcjoKICBzY3JpcHQ6CiAgICAtIG52" + + "Y2YtY2xpIHNlbGYtaG9zdGVkIGluc3RhbGwgLS1jb250cm9sLXBsYW5lIC0tbm8tYXBwbHkgPiBy" + + "ZW5kZXJlZC9jb250cm9sLXBsYW5lLnlhbWwKICAgIC0gbnZjZi1jbGkgc2VsZi1ob3N0ZWQgaW5z" + + "dGFsbCAtLWNvbXB1dGUtcGxhbmUgLS1jbHVzdGVyLW5hbWU9JE5BTUUgLS1uby1hcHBseSA+IHJl" + + "bmRlcmVkL2NvbXB1dGUtcGxhbmUueWFtbAogICAgLSBnaXQgYWRkIHJlbmRlcmVkLyAmJiBnaXQg" + + "Y29tbWl0IC1tICJkZXBsb3kgTlZDRiAkVEFHIiAmJiBnaXQgcHVzaApgYGAKClRoZW4gQXJnb0NE" + + "IG9yIEZsdXggd2F0Y2hlcyBgcmVuZGVyZWQvYCBhbmQgYXBwbGllcy4gVGhlIENMSSBuZXZlciB0" + + "b3VjaGVzIHRoZSBjbHVzdGVyIGRpcmVjdGx5LgoKRm9yIHRoZSByZWdpc3RlciBzdGVwICh3aGlj" + + "aCBtdXRhdGVzIElDTVMsIG5vdCBqdXN0IEs4cyk6CgpgYGB5YW1sCnJlZ2lzdGVyOgogIHNjcmlw" + + "dDoKICAgIC0gbnZjZi1jbGkgY2x1c3RlciByZWdpc3RlciAtLW5hbWU9JE5BTUUgLS1uY2EtaWQ9" + + "JE5DQSAtLXJlZ2lvbj0kUkVHSU9OIC0taWdub3JlLWV4aXN0aW5nCmBgYAoKYC0taWdub3JlLWV4" + + "aXN0aW5nYCBpcyB0aGUgR2l0T3BzLWZyaWVuZGx5IGlkZW1wb3RlbnQgY29udHJhY3QuCgojIyBN" + + "dWx0aS1jbHVzdGVyIHBpcGVsaW5lCgpXaGVuIHRoZSBwaXBlbGluZSBtYW5hZ2VzIG1hbnkgY29t" + + "cHV0ZSBjbHVzdGVycyBhZ2FpbnN0IG9uZSBjb250cm9sIHBsYW5lOgoKYGBgeWFtbApkZXBsb3lf" + + "Y29tcHV0ZV9wbGFuZXM6CiAgcGFyYWxsZWw6CiAgICBtYXRyaXg6CiAgICAgIC0gQ0xVU1RFUjog" + + "bmNwLWVhc3QtMQogICAgICAgIENPTlRFWFQ6IGFkbWluQGdwdS1lYXN0LTEKICAgICAgLSBDTFVT" + + "VEVSOiBuY3Atd2VzdC0xCiAgICAgICAgQ09OVEVYVDogYWRtaW5AZ3B1LXdlc3QtMQogICAgICAt" + + "IENMVVNURVI6IG5jcC1ldS0xCiAgICAgICAgQ09OVEVYVDogYWRtaW5AZ3B1LWV1LTEKICBzY3Jp" + + "cHQ6CiAgICAtIG52Y2YtY2xpIHNlbGYtaG9zdGVkIHVwCiAgICAgICAgLS1jbHVzdGVyLW5hbWU9" + + "JENMVVNURVIKICAgICAgICAtLWNvbXB1dGUtcGxhbmUtY29udGV4dD0kQ09OVEVYVAogICAgICAg" + + "IC0taWNtcy11cmw9JElDTVNfUFVCTElDX1VSTAogICAgICAgIC0tdG9rZW49JE5WQ0ZfQURNSU5f" + + "SldUCiAgICAgICAgLS1ub24taW50ZXJhY3RpdmUKICAgICAgICAtLWpzb24KYGBgCgpFYWNoIHBh" + + "cmFsbGVsIGpvYiByZWdpc3RlcnMgKyBpbnN0YWxscyBvbmUgY29tcHV0ZSBwbGFuZSBhZ2FpbnN0" + + "IHRoZSBzaGFyZWQgY29udHJvbCBwbGFuZS4gRmFpbHVyZXMgYXJlIGlzb2xhdGVkLgoKIyMgUGxh" + + "bi1vbmx5IHByZXZpZXcgaW4gUFJzCgpgYGB5YW1sCnByZXZpZXc6CiAgcnVsZXM6CiAgICAtIGlm" + + "OiAkQ0lfUElQRUxJTkVfU09VUkNFID09ICJtZXJnZV9yZXF1ZXN0X2V2ZW50IgogIHNjcmlwdDoK" + + "ICAgIC0gfAogICAgICBudmNmLWNsaSBzZWxmLWhvc3RlZCB1cCBcCiAgICAgICAgLS1jbHVzdGVy" + + "LW5hbWU9JENMVVNURVJfTkFNRSBcCiAgICAgICAgLS1wbGFuLW9ubHkgXAogICAgICAgIC0tanNv" + + "biB8IHRlZSBwbGFuLmpzb25sCiAgICAtIGpxIC1zICcuWzBdJyBwbGFuLmpzb25sID4gcGxhbi5q" + + "c29uCiAgICAtICdnaXRsYWItbXItY29tbWVudCAiIyMgTlZDRiBkZXBsb3kgcGxhblxuXG5cYFxg" + + "XGBqc29uXG4kKGNhdCBwbGFuLmpzb24pXG5cYFxgXGAiJwpgYGAKCmAtLXBsYW4tb25seWAgZXhp" + + "dHMgMCB3aXRob3V0IGNoYW5naW5nIGNsdXN0ZXIgc3RhdGU7IHRoZSBKU09OTCBvdXRwdXQgbGlz" + + "dHMgZWFjaCBwaGFzZSArIEVUQS4gUmVuZGVycyBuaWNlbHkgYXMgYW4gTVIgY29tbWVudC4KUEsH" + + "CCHGyIbwCgAA8AoAAFBLAwQUAAgAAAAAACEAAAAAAAAAAAAAAAAANAAJAGRhdGEvbnZjZi1zZWxm" + + "LW1hbmFnZWQtY2xpL2V4YW1wbGVzL211bHRpLWNsdXN0ZXIubWRVVAUAAQCmzhIjIE11bHRpLWNs" + + "dXN0ZXIgcGF0dGVybnMKCkV4YW1wbGVzIG9mIHNwbGl0LWNsdXN0ZXIgKyBtYW55LWNvbXB1dGUt" + + "cGxhbmUgb3BlcmF0aW9uLgoKIyMgT25lIGNvbnRyb2wgcGxhbmUgKyBOIGNvbXB1dGUgcGxhbmVz" + + "CgpUaGUgY2Fub25pY2FsIG11bHRpLWNsdXN0ZXIgdG9wb2xvZ3kuIEVhY2ggY29tcHV0ZSBwbGFu" + + "ZSBpcyByZWdpc3RlcmVkIHNlcGFyYXRlbHk6CgpgYGBzaAojIDEuIEJyaW5nIHVwIHRoZSBjb250" + + "cm9sIHBsYW5lIChvbmUtdGltZSwgb24gdGhlIGNvbnRyb2wtcGxhbmUgY2x1c3Rlcik6CktVQkVD" + + "T05GSUc9Y3AueWFtbCBudmNmLWNsaSBzZWxmLWhvc3RlZCBpbnN0YWxsIC0tY29udHJvbC1wbGFu" + + "ZSB8IGt1YmVjdGwgYXBwbHkgLWYgLQpudmNmLWNsaSBzZWxmLWhvc3RlZCBjaGVjayAtLWNvbnRy" + + "b2wtcGxhbmUgLS13YWl0IDVtCgojIDIuIFJlZ2lzdGVyICsgaW5zdGFsbCBlYWNoIGNvbXB1dGUg" + + "cGxhbmU6CmZvciBDVFggaW4gYWRtaW5AZ3B1LWVhc3QtMSBhZG1pbkBncHUtd2VzdC0xIGFkbWlu" + + "QGdwdS1ldS0xOyBkbwogIE5BTUU9JChlY2hvICIkQ1RYIiB8IGN1dCAtZEAgLWYyKQogIG52Y2Yt" + + "Y2xpIHNlbGYtaG9zdGVkIHVwIFwKICAgIC0tY2x1c3Rlci1uYW1lPSROQU1FIFwKICAgIC0tY29t" + + "cHV0ZS1wbGFuZS1jb250ZXh0PSRDVFggXAogICAgLS1pY21zLXVybD1odHRwczovL2ljbXMubnZj" + + "Zi5leGFtcGxlLmNvbSBcCiAgICAtLXRva2VuPSROVkNGX0FETUlOX0pXVCBcCiAgICAtLW5vbi1p" + + "bnRlcmFjdGl2ZSBcCiAgICAtLWpzb24KZG9uZQoKIyAzLiBWZXJpZnkgYWxsIGNvbXB1dGUgcGxh" + + "bmVzIHJlZ2lzdGVyZWQ6Cm52Y2YtY2xpIGNsdXN0ZXIgbGlzdCAtLWpzb24gfCBqcSAnLmNsdXN0" + + "ZXJzW10gfCB7bmFtZSwgcmVnaW9uLCBsYXN0SGVhcnRiZWF0fScKYGBgCgojIyBDb21wdXRlLXBs" + + "YW5lLW9ubHkgb3BlcmF0b3Igc2NlbmFyaW8KClRoZSBvcGVyYXRvciBoYXMga3ViZWN0bCBhY2Nl" + + "c3MgdG8gT05FIGNvbXB1dGUgcGxhbmUgb25seSDigJQgdGhlIGNvbnRyb2wgcGxhbmUgaXMgb3Bl" + + "cmF0ZWQgYnkgc29tZW9uZSBlbHNlIChlLmcuIFlvdHRhIHJ1bnMgdGhlIGNvbnRyb2wgcGxhbmUg" + + "Zm9yIGEgY3VzdG9tZXIpLgoKYGBgc2gKIyBNaW50IGEgdG9rZW4gdmlhIHRoZSBwdWJsaWMgYXBp" + + "IGdhdGV3YXkgKHRoZSBjb250cm9sIHBsYW5lJ3MgQVBJIEtleXMKIyBzZXJ2aWNlIGlzIHJlYWNo" + + "YWJsZSB2aWEgYXBpLm52Y2YuZXhhbXBsZS5jb20g4oCUIG5vIGt1YmVjdGwgYWNjZXNzIG5lZWRl" + + "ZCk6Cm52Y2YtY2xpIGluaXQgLS1hcGktdXJsPWh0dHBzOi8vYXBpLm52Y2YuZXhhbXBsZS5jb20K" + + "CiMgUnVuIHByZS1mbGlnaHQgc2NvcGVkIHRvIHRoZSBjb21wdXRlIHBsYW5lIG9ubHk6Cm52Y2Yt" + + "Y2xpIHNlbGYtaG9zdGVkIGNoZWNrIC0tcHJlIFwKICAtLWNvbXB1dGUtcGxhbmUtY29udGV4dD1h" + + "ZG1pbkBncHUxIFwKICAtLWljbXMtdXJsPWh0dHBzOi8vaWNtcy5udmNmLmV4YW1wbGUuY29tIFwK" + + "ICAtLWpzb24KCiMgQnJpbmcgdXAganVzdCB0aGUgY29tcHV0ZSBwbGFuZToKbnZjZi1jbGkgc2Vs" + + "Zi1ob3N0ZWQgdXAgXAogIC0tY2x1c3Rlci1uYW1lPW15LWNvbXB1dGUtMSBcCiAgLS1jb21wdXRl" + + "LXBsYW5lLWNvbnRleHQ9YWRtaW5AZ3B1MSBcCiAgLS1pY21zLXVybD1odHRwczovL2ljbXMubnZj" + + "Zi5leGFtcGxlLmNvbSBcCiAgLS10b2tlbj0kQURNSU5fSldUIFwKICAtLW5vbi1pbnRlcmFjdGl2" + + "ZQoKIyBTdGF0dXMgKGNvbXB1dGUtb25seSDigJQgb3BlcmF0b3IgY2FuJ3Qgc2VlIGNvbnRyb2wt" + + "cGxhbmUgY29tcG9uZW50IGhlYWx0aCk6Cm52Y2YtY2xpIHNlbGYtaG9zdGVkIHN0YXR1cyBcCiAg" + + "LS1jb21wdXRlLXBsYW5lLWNvbnRleHQ9YWRtaW5AZ3B1MSBcCiAgLS1pY21zLXVybD1odHRwczov" + + "L2ljbXMubnZjZi5leGFtcGxlLmNvbQpgYGAKCiMjIEZ1bmN0aW9ucyB0YXJnZXRpbmcgc3BlY2lm" + + "aWMgY29tcHV0ZSBwbGFuZXMKCldoZW4geW91IGhhdmUgbXVsdGlwbGUgY29tcHV0ZSBwbGFuZXMg" + + "YW5kIHdhbnQgYSBmdW5jdGlvbiB0byBkZXBsb3kgdG8gb25lOgoKYGBganNvbgp7CiAgImZ1bmN0" + + "aW9uSWQiOiAiPGZuX2lkPiIsCiAgInZlcnNpb25JZCI6ICI8dmVyX2lkPiIsCiAgImRlcGxveW1l" + + "bnRTcGVjaWZpY2F0aW9ucyI6IFt7CiAgICAiZ3B1IjogIkgxMDAiLAogICAgImluc3RhbmNlVHlw" + + "ZSI6ICJOQ1AuR1BVLkgxMDBfMXgiLAogICAgIm1pbkluc3RhbmNlcyI6IDEsCiAgICAibWF4SW5z" + + "dGFuY2VzIjogMSwKICAgICJjbHVzdGVycyI6IFsiZ3B1LWVhc3QtMSJdCiAgfV0KfQpgYGAKClRo" + + "ZSBgY2x1c3RlcnNgIGFycmF5ICh1c2luZyBjbHVzdGVyIG5hbWVzLCBub3QgSURzKSBsaW1pdHMg" + + "c2NoZWR1bGluZyB0byB0aG9zZSBjb21wdXRlIHBsYW5lcy4gT21pdCB0byBsZXQgSUNNUyBjaG9v" + + "c2UgYW55IGNvbXB1dGUgcGxhbmUgd2l0aCBhIG1hdGNoaW5nIFNLVS4KCiMjIFN0YXR1cyBmYW4t" + + "b3V0IGFjcm9zcyBjb21wdXRlIHBsYW5lcwoKYGBgc2gKIyBMaXN0IGFsbCByZWdpc3RlcmVkIGNv" + + "bXB1dGUgcGxhbmVzOgpudmNmLWNsaSBjbHVzdGVyIGxpc3QgLS1qc29uIHwganEgLXIgJy5jbHVz" + + "dGVyc1tdLm5hbWUnID4gY2x1c3RlcnMudHh0CgojIFN0YXR1cyBzbmFwc2hvdCBwZXIgY29tcHV0" + + "ZSBwbGFuZSAoYXNzdW1pbmcgZWFjaCBjb250ZXh0IG5hbWUgbWF0Y2hlcyk6CndoaWxlIHJlYWQg" + + "TkFNRTsgZG8KICBlY2hvICI9PT0gJE5BTUUgPT09IgogIG52Y2YtY2xpIHNlbGYtaG9zdGVkIHN0" + + "YXR1cyBcCiAgICAtLWNsdXN0ZXItbmFtZT0kTkFNRSBcCiAgICAtLWNvbXB1dGUtcGxhbmUtY29u" + + "dGV4dD1hZG1pbkAkTkFNRSBcCiAgICAtLWpzb24gfCBqcSAtYyAne2NsdXN0ZXI6LmNsdXN0ZXIs" + + "IHZlcmRpY3Q6LnZlcmRpY3QsIHJlY29uY2lsZToucmVjb25jaWxlQWdlU2VjfScKZG9uZSA8IGNs" + + "dXN0ZXJzLnR4dApgYGAKCkEgZnV0dXJlIE0rMTEgbWlsZXN0b25lIHdpbGwgYWRkIG5hdGl2ZSBm" + + "YW4tb3V0IChgc3RhdHVzIC0tYWxsLWNvbXB1dGUtcGxhbmVzYCkgc28gdGhpcyBkb2Vzbid0IG5l" + + "ZWQgYSBzaGVsbCBsb29wLgpQSwcIaHY/QegLAADoCwAAUEsDBBQACAAAAAAAIQAAAAAAAAAAAAAA" + + "AAA3AAkAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1jbGkvcHJvbXB0cy9hZGQtY29tcHV0ZS1wbGFu" + + "ZS5tZFVUBQABAKbOEiMgQWRkIGEgY29tcHV0ZSBwbGFuZSB0byBhbiBleGlzdGluZyBjb250cm9s" + + "IHBsYW5lCgpVc2VyIGhhcyBhIHdvcmtpbmcgTlZDRiBjb250cm9sIHBsYW5lIChydW5uaW5nIHNv" + + "bWV3aGVyZSkgYW5kIHdhbnRzIHRvIHJlZ2lzdGVyIGEgbmV3IEdQVSBjbHVzdGVyIGFnYWluc3Qg" + + "aXQuIFRoaXMgaXMgdGhlIG11bHRpLWNsdXN0ZXIgc2NhbGluZyBwYXRoOiBvbmUgY29udHJvbCBw" + + "bGFuZSDihpIgTiBjb21wdXRlIHBsYW5lcy4KCiMjIFByZXJlcXVpc2l0ZXMgdGhlIHVzZXIgbXVz" + + "dCBoYXZlCgotICoqa3ViZWN0bCBjb250ZXh0IGZvciB0aGUgbmV3IGNvbXB1dGUgcGxhbmUqKiBp" + + "biB0aGVpciBgS1VCRUNPTkZJR2AuCi0gKipQdWJsaWMgSUNNUyBVUkwqKiBvZiB0aGUgZXhpc3Rp" + + "bmcgY29udHJvbCBwbGFuZSAoZS5nLiBgaHR0cHM6Ly9pY21zLm52Y2YuZXhhbXBsZS5jb21gKS4K" + + "LSAqKkFkbWluIEpXVCoqIGZvciB0aGUgY29udHJvbCBwbGFuZSdzIGFjY291bnQsIE9SIGFiaWxp" + + "dHkgdG8gbWludCBvbmUgdmlhIGBudmNmLWNsaSBpbml0YCBhZ2FpbnN0IHRoZSBjb250cm9sIHBs" + + "YW5lJ3MgcHVibGljIGFwaSBlbmRwb2ludC4gKEFkbWluIHRva2VucyBjb21lIGZyb20gdGhlIEFQ" + + "SSBLZXlzIHNlcnZpY2UgdmlhIHRoZSBwdWJsaWMgYXBpIGdhdGV3YXkg4oCUIGt1YmVjdGwgYWNj" + + "ZXNzIHRvIHRoZSBjb250cm9sIHBsYW5lIGlzIE5PVCByZXF1aXJlZCB0byBvYnRhaW4gb25lLikK" + + "LSAqKkEgdW5pcXVlIGAtLWNsdXN0ZXItbmFtZWAqKiB0aGF0IGRvZXNuJ3QgY29sbGlkZSB3aXRo" + + "IGFscmVhZHktcmVnaXN0ZXJlZCBjbHVzdGVycy4gVXNlIGBudmNmLWNsaSBjbHVzdGVyIGxpc3Rg" + + "IGZyb20gYSBjb250cm9sLXBsYW5lIGNvbnRleHQgdG8gY2hlY2suCgojIyBTdGVwcwoKMS4gKipB" + + "c2sgZm9yIGlucHV0czoqKgogICAtIGAtLWNsdXN0ZXItbmFtZT08dW5pcXVlPmAg4oCUIG11c3Qg" + + "YmUgdW5pcXVlIHdpdGhpbiB0aGUgY29udHJvbCBwbGFuZSdzIE5DQSBzY29wZQogICAtIGAtLWNv" + + "bXB1dGUtcGxhbmUtY29udGV4dD08Y29udGV4dD5gIOKAlCB0aGUgbmV3IEdQVSBjbHVzdGVyJ3Mg" + + "a3ViZWN0bCBjb250ZXh0CiAgIC0gYC0taWNtcy11cmw9PGh0dHBzOi8vaWNtcy5udmNmLmV4YW1w" + + "bGUuY29tPmAg4oCUIGNvbnRyb2wgcGxhbmUncyBwdWJsaWMgSUNNUyBVUkwKICAgLSBHUFUgdHlw" + + "ZT8gKGRlZmF1bHQgYEgxMDBgLCBidXQgYXNrKQoKMi4gKipQcmUtZmxpZ2h0IGp1c3QgdGhlIGNv" + + "bXB1dGUgcGxhbmU6KioKCiAgIGBgYHNoCiAgIG52Y2YtY2xpIHNlbGYtaG9zdGVkIGNoZWNrIC0t" + + "cHJlIFwKICAgICAtLWNvbXB1dGUtcGxhbmUtY29udGV4dD0kQ1RYIFwKICAgICAtLWljbXMtdXJs" + + "PSRJQ01TIFwKICAgICAtLWpzb24gfCBqcSAtYyAuCiAgIGBgYAoKICAgVGhpcyB2YWxpZGF0ZXMg" + + "dGhlIEdQVSBvcGVyYXRvciBpcyBpbnN0YWxsZWQsIEdQVSBub2RlIGxhYmVscyBhcmUgcHJlc2Vu" + + "dCwgYW5kIElDTVMgaXMgcmVhY2hhYmxlIHZpYSBIVFRQLiBBZGRyZXNzIGFueSBmYWlsdXJlcyBi" + + "ZWZvcmUgcHJvY2VlZGluZy4KCjMuICoqUnVuIGBhZGQtY29tcHV0ZS1wbGFuZWA6KioKCiAgIGBg" + + "YHNoCiAgIG52Y2YtY2xpIHNlbGYtaG9zdGVkIGFkZC1jb21wdXRlLXBsYW5lIFwKICAgICAtLWNs" + + "dXN0ZXItbmFtZT0kTkFNRSBcCiAgICAgLS1jb21wdXRlLXBsYW5lLWNvbnRleHQ9JENUWCBcCiAg" + + "ICAgLS1pY21zLXVybD0kSUNNUyBcCiAgICAgLS10b2tlbj0kSldUIFwKICAgICAtLW5vbi1pbnRl" + + "cmFjdGl2ZSBcCiAgICAgLS1qc29uCiAgIGBgYAoKICAgVGhpcyBpcyBhIHNlcGFyYXRlIHN1YmNv" + + "bW1hbmQgZnJvbSBgdXBgLiBJdCBydW5zIG9ubHkgdGhlIGNvbXB1dGUtcGxhbmUtcmVsZXZhbnQg" + + "cGhhc2VzOiAxIChjb21wdXRlLXBsYW5lIHByZWZsaWdodCksIDUgKHJlZ2lzdGVyKSwgNiAoY29t" + + "cHV0ZS1wbGFuZSBhcHBseSksIDggKGZpbmFsIGhlYWx0aCBvbiB0aGUgbmV3IGNvbXB1dGUgcGxh" + + "bmUpLiBJdCBkb2VzIE5PVCB0b3VjaCB0aGUgY29udHJvbCBwbGFuZSBhbmQgZG9lcyBOT1QgYWNj" + + "ZXB0IGAtLWNvbnRyb2wtcGxhbmUtY29udGV4dGAg4oCUIHRoZSBjb250cm9sIHBsYW5lIGlzIHJl" + + "YWNoZWQgb3ZlciBIVFRQUyBhdCBgLS1pY21zLXVybGAuIGAtLXRva2VuYCBpcyByZXF1aXJlZCBi" + + "ZWNhdXNlIHRoZXJlJ3Mgbm8ga3ViZWN0bCBwYXRoIHRvIG1pbnQgb25lIGZyb20uCgo0LiAqKlZl" + + "cmlmeS4qKiBgbnZjZi1jbGkgc2VsZi1ob3N0ZWQgc3RhdHVzIC0tY2x1c3Rlci1uYW1lPSROQU1F" + + "IC0tanNvbiB8IGpxYCDigJQgZXhwZWN0IGB2ZXJkaWN0OiAiaGVhbHRoeSJgLiBUaGUgUmVnaXN0" + + "ZXJlZCBDb21wdXRlIFBsYW5lcyBwYW5lbCBmcm9tIElDTVMgc2hvdWxkIG5vdyBsaXN0IHRoZSBu" + + "ZXcgY2x1c3Rlci4KCjUuICoqU21va2UuKiogW2RlcGxveS1hbmQtaW52b2tlLm1kXShkZXBsb3kt" + + "YW5kLWludm9rZS5tZCkg4oCUIGRlcGxveSBhIHNtYWxsIGZ1bmN0aW9uIHRvIHRoZSBuZXcgY29t" + + "cHV0ZSBwbGFuZSB0byBjb25maXJtIHNjaGVkdWxpbmcgd29ya3MuCgojIyBXaGF0IGlmIGEgY2x1" + + "c3RlciB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHM/CgpgYWRkLWNvbXB1dGUtcGxh" + + "bmVgJ3MgcmVnaXN0ZXIgcGhhc2UgdXNlcyBgLS1pZ25vcmUtZXhpc3RpbmdgIHNlbWFudGljcyDi" + + "gJQgaXQnbGwgbWF0Y2ggdGhlIGV4aXN0aW5nIElDTVMgcm93IGFuZCByZXVzZSBpdHMgY2x1c3Rl" + + "cklkLiBUd28gc2NlbmFyaW9zOgoKLSAqKlJlLXJlZ2lzdGVyaW5nIHRoZSBzYW1lIGNsdXN0ZXIq" + + "KiAocmUtcnVubmluZyBvbiB0aGUgc2FtZSBjb21wdXRlIHBsYW5lIHRoYXQgd2FzIHByZXZpb3Vz" + + "bHkgcmVnaXN0ZXJlZCk6IGV4cGVjdGVkLCBuby1vcCBzZW1hbnRpY3MuCi0gKipEaWZmZXJlbnQg" + + "cGh5c2ljYWwgY2x1c3RlciBidXQgc2FtZSBuYW1lKio6IHRoZSBzZWNvbmQgYXR0ZW1wdCB3aWxs" + + "IHJldXNlIHRoZSBJQ01TIHJvdywgYnV0IHRoZSBuZXcgY29tcHV0ZSBwbGFuZSdzIEpXS1Mgd2ls" + + "bCBiZSBzaWxlbnRseSAqcmVwbGFjZWQqIOKAlCB0aGUgb2xkIGNvbXB1dGUgcGxhbmUncyBOVkNB" + + "IGFnZW50IHdpbGwgc3RhcnQgZmFpbGluZyBQU0FUIGF1dGguICoqQ29uZmlybSB3aXRoIHRoZSB1" + + "c2VyKiogdGhhdCB0aGV5IG1lYW50IHRvIG92ZXJ3cml0ZS4KCldoZW4gaW4gZG91YnQsIHJ1biBg" + + "bnZjZi1jbGkgY2x1c3RlciBsaXN0YCBmaXJzdCBhbmQgYXNrIHRoZSB1c2VyIGJlZm9yZSBwcm9j" + + "ZWVkaW5nIHdpdGggYSBuYW1lIHRoYXQgYWxyZWFkeSBleGlzdHMuClBLBwj+ZkM6zAwAAMwMAABQ" + + "SwMEFAAIAAAAAAAhAAAAAAAAAAAAAAAAADkACQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9w" + + "cm9tcHRzL2NyZWF0ZS1hbmQtcnVuLXRhc2subWRVVAUAAQCmzhIjIENyZWF0ZSBhbmQgcnVuIGEg" + + "dGFzawoKU3RhbmRhcmQgZmxvdzogbWludCBBUEkga2V5cyAtPiB0YXNrIENSRUFURSAtPiBtb25p" + + "dG9yIC0+IHJldHJpZXZlIHJlc3VsdHMgLT4gY2xlYW51cC4KCiMjIDEuIE1pbnQgQVBJIGtleXMK" + + "ClRoZSBhZG1pbiB0b2tlbiBmcm9tIGBpbml0YCBkb2VzIG5vdCBjYXJyeSB0YXNrIGludm9jYXRp" + + "b24gc2NvcGUuIEdlbmVyYXRlIEFQSSBrZXlzOgoKYGBgc2gKbnZjZi1jbGkgYXBpLWtleSBnZW5l" + + "cmF0ZSAtLWRlc2NyaXB0aW9uPSJ0YXNrIHNtb2tlIHRlc3QiIC0tZXhwaXJlcy1pbj04aAojIC0+" + + "IGZ1bmN0aW9uIGtleTogbnZhcGktLi4uCiMgLT4gdGFzayBrZXk6IG52YXBpLS4uLgpgYGAKCkJv" + + "dGgga2V5cyBhcmUgc2F2ZWQgdG8gQ0xJIHN0YXRlLiBUbyBtaW50IG9ubHkgdGhlIHRhc2sga2V5" + + "OgoKYGBgc2gKbnZjZi1jbGkgYXBpLWtleSBnZW5lcmF0ZSAtLWZvciB0YXNrIC0tZGVzY3JpcHRp" + + "b249InRhc2sgc21va2UgdGVzdCIgLS1leHBpcmVzLWluPThoCmBgYAoKVG8gdmFsaWRhdGUgZWFj" + + "aCBrZXkgaW1tZWRpYXRlbHkgYWZ0ZXIgbWludGluZzoKCmBgYHNoCm52Y2YtY2xpIGFwaS1rZXkg" + + "Z2VuZXJhdGUgLS1kZXNjcmlwdGlvbj0idGFzayBzbW9rZSB0ZXN0IiAtLWV4cGlyZXMtaW49OGgg" + + "LS12YWxpZGF0ZQojIC0+IGZ1bmN0aW9uIEFQSSBrZXkgdmFsaWRhdGlvbiBwYXNzZWQhCiMgLT4g" + + "dGFzayBBUEkga2V5IHZhbGlkYXRpb24gcGFzc2VkIQpgYGAKCk5ldmVyIGVjaG8gdGhlIGtleSB2" + + "YWx1ZSAobnZhcGktLi4uKSBpbnRvIGNoYXQgb3IgbG9ncy4gUmVwb3J0IG9ubHkgdGhhdCB0aGUg" + + "a2V5IHdhcyBtaW50ZWQsIGl0cyBkZXNjcmlwdGlvbiwgYW5kIGl0cyBleHBpcnkg4oCUIG5ldmVy" + + "IHRoZSB2YWx1ZSBpdHNlbGYuCgojIyMgRnJlc2ggc2Vzc2lvbiBwcmUtZmxpZ2h0CgpCZWZvcmUg" + + "cnVubmluZyBhbnkgYHRhc2tgIGNvbW1hbmQgaW4gYSBmcmVzaCBhZ2VudCBzZXNzaW9uLCB2ZXJp" + + "ZnkgY3JlZGVudGlhbHM6CgoxLiBDaGVjayB3aGV0aGVyIGBOVkNGX0FQSV9LRVlgIGlzIHNldDoK" + + "ICAgYGBgc2gKICAgcHJpbnRlbnYgTlZDRl9BUElfS0VZID4gL2Rldi9udWxsIDI+JjEgJiYgZWNo" + + "byBzZXQgfHwgZWNobyB1bnNldAogICBgYGAKMi4gSWYgdW5zZXQsIHJlYWQgdGhlIHN0b3JlZCBr" + + "ZXkgZXhwaXJ5IHdpdGhvdXQgcHJpbnRpbmcgdGhlIHZhbHVlOgogICBgYGBzaAogICBweXRob24z" + + "IC1jICJpbXBvcnQganNvbixwYXRobGliOyBzPWpzb24ubG9hZHMocGF0aGxpYi5QYXRoKCd+Ly5u" + + "dmNmLWNsaS5zdGF0ZScpLmV4cGFuZHVzZXIoKS5yZWFkX3RleHQoKSk7IHByaW50KHMuZ2V0KCdu" + + "dmN0QXBpS2V5RXhwaXJhdGlvbicsJ21pc3NpbmcnKSkiCiAgIGBgYAozLiBJZiB0aGUgZXhwaXJ5" + + "IGlzIGluIHRoZSBwYXN0IG9yIG1pc3NpbmcsIHJlZ2VuZXJhdGU6CiAgIGBgYHNoCiAgIG52Y2Yt" + + "Y2xpIHJlZnJlc2gKICAgbnZjZi1jbGkgYXBpLWtleSBnZW5lcmF0ZSAtLWZvciB0YXNrIC0tZGVz" + + "Y3JpcHRpb249InRhc2sta2V5IiAtLWV4cGlyZXMtaW49MjRoIC0tdmFsaWRhdGUKICAgYGBgCjQu" + + "IEluamVjdCB0aGUgc3RvcmVkIGtleSBpbnRvIHRoZSBzdWJwcm9jZXNzIGVudiB3aXRob3V0IGxv" + + "Z2dpbmcgdGhlIHZhbHVlLiBVc2UgYSBzaGVsbCBzdWJzaGVsbCBvciBlbnYgcHJlZml4IOKAlCBu" + + "ZXZlciBwcmludCB0aGUga2V5IGludG8gY2hhdC4KCkVycm9yIGNsYXNzaWZpY2F0aW9uOgotICJt" + + "aXNzaW5nIGF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzIiBvciBleGl0IDI6IGtleSBub3QgaW5q" + + "ZWN0ZWQ7IHJlcGVhdCBwcmUtZmxpZ2h0LgotIEhUVFAgNDAzOiBrZXkgZXhwaXJlZCBvciB3cm9u" + + "ZyBhdWRpZW5jZTsgcmVnZW5lcmF0ZS4KLSBFbXB0eSB0YXNrIGxpc3Q6IHZhbGlkOyBubyB0YXNr" + + "cyBleGlzdCB5ZXQuCgojIyAyLiBUYXNrIENSRUFURTogY29udGFpbmVyCgpEZWZpbmUgdGhlIHRh" + + "c2sgaW4gYSBKU09OIGZpbGUuIE1pbmltdW0gdmlhYmxlIGNvbnRhaW5lciB0YXNrOgoKYGBganNv" + + "bgp7CiAgIm5hbWUiOiAic21va2UtY29udGFpbmVyLXRhc2siLAogICJncHVTcGVjaWZpY2F0aW9u" + + "IjogewogICAgImdwdSI6ICJIMTAwIiwKICAgICJpbnN0YW5jZVR5cGUiOiAiTkNQLkdQVS5IMTAw" + + "XzF4IiwKICAgICJiYWNrZW5kIjogIm5jcC1sb2NhbCIKICB9LAogICJjb250YWluZXJJbWFnZSI6" + + "ICJudmNyLmlvL252aWRpYS9uZW1vOmxhdGVzdCIsCiAgImNvbnRhaW5lckFyZ3MiOiAicHl0aG9u" + + "IC1jIFwicHJpbnQoJ2hlbGxvIGZyb20gdGFzaycpXCIiLAogICJyZXN1bHRIYW5kbGluZ1N0cmF0" + + "ZWd5IjogIk5PTkUiCn0KYGBgCgpgYGBzaApudmNmLWNsaSB0YXNrIGNyZWF0ZSAtLWlucHV0LWZp" + + "bGU9dGFzay1jb250YWluZXIuanNvbgojIC0+IFRhc2sgSUQ6IDx0YXNrX2lkPgpgYGAKCkNhcHR1" + + "cmUgdGhlIHRhc2sgSUQgZnJvbSB0aGUgb3V0cHV0LiBTdGF0ZSBwZXJzaXN0ZW5jZSBjYW4gZmFp" + + "bCBzaWxlbnRseSwgc28gcGFzcwpgPHRhc2tJZD5gIGV4cGxpY2l0bHkgb24gc3Vic2VxdWVudCBj" + + "b21tYW5kcyByYXRoZXIgdGhhbiByZWx5aW5nIG9uIHNhdmVkIHN0YXRlLgoKRXF1aXZhbGVudCBD" + + "TEkgZmxhZ3MgZm9ybSBmb3IgcXVpY2sgYWQtaG9jIHJ1bnM6CgpgYGBzaApudmNmLWNsaSB0YXNr" + + "IGNyZWF0ZSBcCiAgLS1uYW1lPXNtb2tlLWNvbnRhaW5lci10YXNrIFwKICAtLWdwdT1IMTAwIFwK" + + "ICAtLWluc3RhbmNlLXR5cGU9TkNQLkdQVS5IMTAwXzF4IFwKICAtLWJhY2tlbmQ9bmNwLWxvY2Fs" + + "IFwKICAtLWltYWdlPW52Y3IuaW8vbnZpZGlhL25lbW86bGF0ZXN0IFwKICAtLWNvbnRhaW5lci1h" + + "cmdzPSJweXRob24gLWMgJ3ByaW50KGhlbGxvIGZyb20gdGFzayknIiBcCiAgLS1yZXN1bHQtc3Ry" + + "YXRlZ3k9Tk9ORQpgYGAKClRvIHRhcmdldCBhIHNwZWNpZmljIGNvbXB1dGUgY2x1c3RlcjoKCmBg" + + "YHNoCm52Y2YtY2xpIHRhc2sgY3JlYXRlIC0taW5wdXQtZmlsZT10YXNrLWNvbnRhaW5lci5qc29u" + + "IC0tY2x1c3RlcnM9bXktY2x1c3RlcgpgYGAKClRvIGluamVjdCBlbnZpcm9ubWVudCB2YXJpYWJs" + + "ZXMgb3Igc2VjcmV0cywgZWl0aGVyIHBhc3MgZmxhZ3M6CgpgYGBzaApudmNmLWNsaSB0YXNrIGNy" + + "ZWF0ZSAtLWlucHV0LWZpbGU9dGFzay1jb250YWluZXIuanNvbiBcCiAgLS1jb250YWluZXItZW52" + + "IE1ZX0VOVj12YWx1ZSBcCiAgLS1zZWNyZXRzIE1ZX1NFQ1JFVD1zM2NyM3QKYGBgCgpvciBzZXQg" + + "dGhlbSBpbiB0aGUgSlNPTiBmaWxlOgoKYGBganNvbgp7CiAgImNvbnRhaW5lckVudmlyb25tZW50" + + "IjogWwogICAgeyJrZXkiOiAiTVlfRU5WIiwgInZhbHVlIjogInZhbHVlIn0KICBdLAogICJzZWNy" + + "ZXRzIjogWwogICAgeyJuYW1lIjogIk1ZX1NFQ1JFVCIsICJ2YWx1ZSI6ICJzM2NyM3QifQogIF0K" + + "fQpgYGAKClNlY3JldHMgYXJlIGVuY3J5cHRlZCBhdCByZXN0IGFuZCBub3QgcmV0dXJuZWQgaW4g" + + "bGlzdCBvciBnZXQgcmVzcG9uc2VzIGJ5IGRlZmF1bHQ7IGRvIG5vdCBsb2cgdGhlbS4KCiMjIDMu" + + "IFRhc2sgQ1JFQVRFOiBIZWxtCgpGb3IgSGVsbS10eXBlIHRhc2tzLCByZXBsYWNlIGBjb250YWlu" + + "ZXJJbWFnZWAgd2l0aCBgaGVsbUNoYXJ0YDoKCmBgYGpzb24KewogICJuYW1lIjogInNtb2tlLWhl" + + "bG0tdGFzayIsCiAgImdwdVNwZWNpZmljYXRpb24iOiB7CiAgICAiZ3B1IjogIkgxMDAiLAogICAg" + + "Imluc3RhbmNlVHlwZSI6ICJOQ1AuR1BVLkgxMDBfMXgiLAogICAgImJhY2tlbmQiOiAibmNwLWxv" + + "Y2FsIgogIH0sCiAgImhlbG1DaGFydCI6ICJodHRwczovL2hlbG0ubmdjLm52aWRpYS5jb20vPG9y" + + "Zz4vY2hhcnRzL2V4YW1wbGUtdGFzay0wLjEuMC50Z3oiLAogICJyZXN1bHRIYW5kbGluZ1N0cmF0" + + "ZWd5IjogIk5PTkUiCn0KYGBgCgpgYGBzaApudmNmLWNsaSB0YXNrIGNyZWF0ZSAtLWlucHV0LWZp" + + "bGU9dGFzay1oZWxtLmpzb24KIyAtPiBUYXNrIElEOiA8dGFza19pZD4KYGBgCgpgaGVsbUNoYXJ0" + + "YCBhbmQgYGNvbnRhaW5lckltYWdlYCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgoKIyMgM2IuIFVw" + + "ZGF0ZSBzZWNyZXRzIG9uIGEgcnVubmluZyB0YXNrCgpgYGBzaApudmNmLWNsaSB0YXNrIHVwZGF0" + + "ZS1zZWNyZXRzIDx0YXNrX2lkPiAtLXNlY3JldHMgTkFNRT12YWx1ZQpgYGAKCmB1cGRhdGUtc2Vj" + + "cmV0c2AgbWVyZ2VzIHNlY3JldHMgYnkgbmFtZTogc3VwcGxpZWQgc2VjcmV0cyBhcmUgYWRkZWQg" + + "b3IgdXBkYXRlZCwgYW5kIGV4aXN0aW5nIHNlY3JldHMgbm90IGluY2x1ZGVkIGluIHRoZSByZXF1" + + "ZXN0IGFyZSBwcmVzZXJ2ZWQuIERvIG5vdCBlY2hvIHNlY3JldCB2YWx1ZXMgaW50byBjaGF0LgoK" + + "IyMgNC4gTW9uaXRvcgoKUG9sbCB0YXNrIHN0YXRlOgoKYGBgc2gKbnZjZi1jbGkgdGFzayBnZXQg" + + "PHRhc2tfaWQ+CiMgLT4gaWQ6IDx0YXNrX2lkPgojIC0+IHN0YXR1czogUlVOTklORwpgYGAKCk9y" + + "IHVzZSB0aGUgdGFzayBJRCBzYXZlZCB0byBzdGF0ZSBmcm9tIHRoZSBtb3N0IHJlY2VudCBgdGFz" + + "ayBjcmVhdGVgOgoKYGBgc2gKbnZjZi1jbGkgdGFzayBnZXQKYGBgCgpTdGF0dXMgdmFsdWVzOiBg" + + "UVVFVUVEYCwgYExBVU5DSEVEYCwgYFJVTk5JTkdgLCBgQ09NUExFVEVEYCwgYEVSUk9SRURgLCBg" + + "Q0FOQ0VMRURgLCBgRVhDRUVERURfTUFYX1JVTlRJTUVfRFVSQVRJT05gLCBgRVhDRUVERURfTUFY" + + "X1FVRVVFRF9EVVJBVElPTmAuCgpJbnNwZWN0IGxpZmVjeWNsZSBldmVudHMgZm9yIHByb2dyZXNz" + + "IGRldGFpbHMgb3IgZmFpbHVyZSBjb250ZXh0OgoKYGBgc2gKbnZjZi1jbGkgdGFzayBldmVudHMg" + + "PHRhc2tfaWQ+CmBgYAoKSWYgdGhlIHRhc2sgaXMgc3R1Y2sgaW4gYFFVRVVFRGAsIGNoZWNrIHRo" + + "YXQgYSBjb21wdXRlIGNsdXN0ZXIgd2l0aCBhIG1hdGNoaW5nIEdQVSBTS1UKaXMgcmVnaXN0ZXJl" + + "ZCBhbmQgaGVhbHRoeSAoYG52Y2YtY2xpIHNlbGYtaG9zdGVkIHN0YXR1c2ApLgoKSWYgdGhlIHRh" + + "c2sgbW92ZXMgdG8gYEVSUk9SRURgLCB0aGUgZXZlbnRzIG91dHB1dCBjb250YWlucyB0aGUgZmFp" + + "bHVyZSByZWFzb24uIEZvcgpjb250YWluZXItbGV2ZWwgZGV0YWlsLCBpbnNwZWN0IHRoZSB0YXNr" + + "IHdvcmtsb2FkIHBvZHMgb24gdGhlIGNvbXB1dGUtcGxhbmUgY2x1c3RlciB3aXRoCmBrdWJlY3Rs" + + "YCBhZ2FpbnN0IHRoZSBhcHByb3ByaWF0ZSBuYW1lc3BhY2UgYW5kIGNvbnRleHQuCgojIyA1LiBS" + + "ZXRyaWV2ZSByZXN1bHRzCgpGb3IgdGFza3Mgd2l0aCBgcmVzdWx0SGFuZGxpbmdTdHJhdGVneTog" + + "Tk9ORWAsIHJlc3VsdHMgYXJlIGVtcHR5IGJ5IGRlc2lnbjoKCmBgYHNoCm52Y2YtY2xpIHRhc2sg" + + "cmVzdWx0cyA8dGFza19pZD4KIyAtPiB7InJlc3VsdHMiOiBbXX0KYGBgCgpGb3IgdGFza3Mgd2l0" + + "aCBgcmVzdWx0SGFuZGxpbmdTdHJhdGVneTogVVBMT0FEYCwgcmVzdWx0cyB1cGxvYWQgdG8gdGhl" + + "IGxvY2F0aW9uIG5hbWVkIGluCmByZXN1bHRzTG9jYXRpb25gLiBUaGUgdGFzaydzIGNyZWRlbnRp" + + "YWxzIG11c3QgaGF2ZSB3cml0ZSBhY2Nlc3MgdG8gdGhhdCBsb2NhdGlvbi4gQWZ0ZXIKdGhlIHRh" + + "c2sgcmVhY2hlcyBgQ09NUExFVEVEYDoKCmBgYHNoCm52Y2YtY2xpIHRhc2sgcmVzdWx0cyA8dGFz" + + "a19pZD4KYGBgCgpOb3RlOiByZXN1bHQgdXBsb2FkIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGluIHRo" + + "aXMgcmVsZWFzZS4KCiMjIDYuIENsZWFudXAKCkNhbmNlbCBhIHJ1bm5pbmcgdGFzazoKCmBgYHNo" + + "Cm52Y2YtY2xpIHRhc2sgY2FuY2VsIDx0YXNrX2lkPgpgYGAKCkRlbGV0ZSB0aGUgdGFzayByZWNv" + + "cmQgYWZ0ZXIgaXQgcmVhY2hlcyBhIHRlcm1pbmFsIHN0YXRlOgoKYGBgc2gKbnZjZi1jbGkgdGFz" + + "ayBkZWxldGUgPHRhc2tfaWQ+CmBgYAoKU3RvcCBhbmQgY29uZmlybSB3aXRoIHRoZSB1c2VyIGJl" + + "Zm9yZSBydW5uaW5nIHRhc2sgZGVsZXRlLiBTdGF0ZSB0aGUgdGFzayBJRCBhbmQgaXRzIGN1cnJl" + + "bnQgc3RhdHVzLiBEbyBub3QgcHJvY2VlZCBldmVuIHdoZW4gdGhlIHVzZXIncyBwcm9tcHQgYWxy" + + "ZWFkeSByZXF1ZXN0ZWQgZGVsZXRpb24g4oCUIGFsd2F5cyBnZXQgYW4gZXhwbGljaXQgbGFzdC1s" + + "b29rIGNvbmZpcm1hdGlvbi4gRGVsZXRpb24gaXMgcGVybWFuZW50IGFuZCBjYW5ub3QgYmUgdW5k" + + "b25lLgoKVG8gbGlzdCBhbGwgdGFza3MgZm9yIHRoZSBjdXJyZW50IG93bmVyICh1c2VmdWwgYmVm" + + "b3JlIGJ1bGsgY2xlYW51cCk6CgpgYGBzaApudmNmLWNsaSB0YXNrIGxpc3QKbnZjZi1jbGkgdGFz" + + "ayBsaXN0IC0tc3RhdHVzPUNPTVBMRVRFRApgYGAKCiMjIE5vdGVzCgotIEdQVSBmYW1pbHkgYW5k" + + "IGluc3RhbmNlIHR5cGUgbXVzdCBtYXRjaCBhIHJlZ2lzdGVyZWQgY29tcHV0ZSBjbHVzdGVyIFNL" + + "VS4gTWlzbWF0Y2gKICBjYXVzZXMgdGhlIHRhc2sgdG8gcmVtYWluIGBRVUVVRURgIGluZGVmaW5p" + + "dGVseS4gVXNlIGBudmNmLWNsaSBjbHVzdGVyIGxpc3RgIHRvIGNoZWNrCiAgcmVnaXN0ZXJlZCBT" + + "S1VzLgotIEZvciBjb250YWluZXIgaW1hZ2VzIG9uIHByaXZhdGUgcmVnaXN0cmllcywgZW5zdXJl" + + "IHRoZSBjb21wdXRlLXBsYW5lIGNsdXN0ZXIncwogIGltYWdlLWNyZWRlbnRpYWwtaGVscGVyIGlz" + + "IGNvbmZpZ3VyZWQgZm9yIHRoZSByZWdpc3RyeSBob3N0LgpQSwcIkdwb+ZgZAACYGQAAUEsDBBQA" + + "CAAAAAAAIQAAAAAAAAAAAAAAAAA3AAkAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1jbGkvcHJvbXB0" + + "cy9kZXBsb3ktYW5kLWludm9rZS5tZFVUBQABAKbOEiMgRGVwbG95IGFuZCBpbnZva2UgYSBjb250" + + "YWluZXIgZnVuY3Rpb24KClN0YW5kYXJkIGZvdXItc3RlcCBmbG93OiBmdW5jdGlvbiBDUkVBVEUg" + + "4oaSIERFUExPWSDihpIgQVBJIGtleSAoZm9yIGludm9rZSBzY29wZSkg4oaSIElOVk9LRS4KCiMj" + + "IDEuIEZ1bmN0aW9uIENSRUFURQoKRGVmaW5lIHRoZSBmdW5jdGlvbiBpbiBhIEpTT04gZmlsZS4g" + + "TWluaW11bToKCkJlZm9yZSBjcmVhdGluZyB0aGUgZnVuY3Rpb24sIGNvbmZpcm0gdGhlIGV4YWN0" + + "IGZ1bmN0aW9uIG5hbWUgYW5kIGNvbnRhaW5lciBpbWFnZSB3aXRoIHRoZSB1c2VyLiBJZiBlaXRo" + + "ZXIgdmFsdWUgaXMgbWlzc2luZywgc3RvcCBhbmQgYXNrLiBEbyBub3QgaW52ZW50IG9yIHN1Ym1p" + + "dCBleGFtcGxlIHZhbHVlcyBmb3IgdGhlc2UgZmllbGRzLgoKYGBganNvbgp7CiAgIm5hbWUiOiAi" + + "PGNvbmZpcm1lZC1mdW5jdGlvbi1uYW1lPiIsCiAgImNvbnRhaW5lckltYWdlIjogIjxjb25maXJt" + + "ZWQtY29udGFpbmVyLWltYWdlPiIsCiAgImluZmVyZW5jZVVybCI6ICIvZWNobyIsCiAgImluZmVy" + + "ZW5jZVBvcnQiOiA4MDAwLAogICJkZXNjcmlwdGlvbiI6ICJzbW9rZSB0ZXN0IGVjaG8gZnVuY3Rp" + + "b24iLAogICJmdW5jdGlvblR5cGUiOiAiREVGQVVMVCIsCiAgImFwaUJvZHlGb3JtYXQiOiAiQ1VT" + + "VE9NIiwKICAiaGVhbHRoIjogewogICAgInByb3RvY29sIjogIkhUVFAiLAogICAgInVyaSI6ICIv" + + "aGVhbHRoIiwKICAgICJwb3J0IjogODAwMCwKICAgICJ0aW1lb3V0IjogIlBUMzBTIiwKICAgICJl" + + "eHBlY3RlZFN0YXR1c0NvZGUiOiAyMDAKICB9Cn0KYGBgCgpgYGBzaApudmNmLWNsaSBmdW5jdGlv" + + "biBjcmVhdGUgLS1pbnB1dC1maWxlPWNyZWF0ZS1mbi5qc29uCiMg4oaSIEZ1bmN0aW9uIElEOiA8" + + "Zm5faWQ+CiMg4oaSIFZlcnNpb24gSUQ6IDx2ZXJfaWQ+CmBgYAoKU2F2ZSB0aGUgSURzIOKAlCB0" + + "aGV5J3JlIG5lZWRlZCBmb3IgZGVwbG95ICsgaW52b2tlLgoKIyMjIExMTSBmdW5jdGlvbiB2YXJp" + + "YW50CgpGb3IgYW4gT3BlbkFJLWNvbXBhdGlibGUgTExNIGZ1bmN0aW9uLCBzZXQgYGZ1bmN0aW9u" + + "VHlwZTogIkxMTSJgIGFuZCBwdXQgcm91dGUgbWV0YWRhdGEgdW5kZXIgYG1vZGVsc1tdLmxsbUNv" + + "bmZpZ2A6CgpCZWZvcmUgY3JlYXRpbmcgdGhlIGZ1bmN0aW9uLCBjb25maXJtIHRoZSBleGFjdCBm" + + "dW5jdGlvbiBuYW1lLCBjb250YWluZXIgaW1hZ2UsIGFuZCBtb2RlbCBuYW1lIHdpdGggdGhlIHVz" + + "ZXIuIElmIGFueSB2YWx1ZSBpcyBtaXNzaW5nLCBzdG9wIGFuZCBhc2suIERvIG5vdCBpbnZlbnQg" + + "b3Igc3VibWl0IGV4YW1wbGUgdmFsdWVzIGZvciB0aGVzZSBmaWVsZHMuCgpgYGBqc29uCnsKICAi" + + "bmFtZSI6ICI8Y29uZmlybWVkLWZ1bmN0aW9uLW5hbWU+IiwKICAiY29udGFpbmVySW1hZ2UiOiAi" + + "PGNvbmZpcm1lZC1jb250YWluZXItaW1hZ2U+IiwKICAiaW5mZXJlbmNlVXJsIjogIi8iLAogICJp" + + "bmZlcmVuY2VQb3J0IjogODAwMCwKICAiZnVuY3Rpb25UeXBlIjogIkxMTSIsCiAgImhlYWx0aCI6" + + "IHsKICAgICJwcm90b2NvbCI6ICJIVFRQIiwKICAgICJ1cmkiOiAiL2hlYWx0aCIsCiAgICAicG9y" + + "dCI6IDgwMDAsCiAgICAidGltZW91dCI6ICJQVDMwUyIsCiAgICAiZXhwZWN0ZWRTdGF0dXNDb2Rl" + + "IjogMjAwCiAgfSwKICAibW9kZWxzIjogWwogICAgewogICAgICAibmFtZSI6ICI8Y29uZmlybWVk" + + "LW1vZGVsLW5hbWU+IiwKICAgICAgImxsbUNvbmZpZyI6IHsKICAgICAgICAidXJpcyI6IFsiL3Yx" + + "L2NoYXQvY29tcGxldGlvbnMiLCAiL3YxL3Jlc3BvbnNlcyIsICIvdjEvZW1iZWRkaW5ncyJdLAog" + + "ICAgICAgICJyb3V0aW5nTWV0aG9kIjogInJvdW5kX3JvYmluIiwKICAgICAgICAidG9rZW5SYXRl" + + "TGltaXQiOiAiMTAwMC1TIgogICAgICB9CiAgICB9CiAgXQp9CmBgYAoKRXF1aXZhbGVudCBDTEkg" + + "ZmxhZyBmb3JtOgoKYGBgc2gKbnZjZi1jbGkgZnVuY3Rpb24gY3JlYXRlIFwKICAtLW5hbWU9Ijxj" + + "b25maXJtZWQtZnVuY3Rpb24tbmFtZT4iIFwKICAtLWltYWdlPSI8Y29uZmlybWVkLWNvbnRhaW5l" + + "ci1pbWFnZT4iIFwKICAtLWluZmVyZW5jZS11cmw9LyBcCiAgLS1pbmZlcmVuY2UtcG9ydD04MDAw" + + "IFwKICAtLWhlYWx0aC11cmk9L2hlYWx0aCBcCiAgLS1oZWFsdGgtcG9ydD04MDAwIFwKICAtLWhl" + + "YWx0aC10aW1lb3V0PVBUMzBTIFwKICAtLWhlYWx0aC1wcm90b2NvbD1IVFRQIFwKICAtLWhlYWx0" + + "aC1leHBlY3RlZC1zdGF0dXM9MjAwIFwKICAtLWZ1bmN0aW9uLXR5cGU9TExNIFwKICAtLWxsbS1t" + + "b2RlbD0nbmFtZT08Y29uZmlybWVkLW1vZGVsLW5hbWU+LHVyaXM9L3YxL2NoYXQvY29tcGxldGlv" + + "bnN8L3YxL3Jlc3BvbnNlc3wvdjEvZW1iZWRkaW5ncyxyb3V0aW5nTWV0aG9kPXJvdW5kX3JvYmlu" + + "LHRva2VuUmF0ZUxpbWl0PTEwMDAtUycKYGBgCgpVc2UgdGhlIHNhbWUgZGVwbG95IHN0ZXAgYmVs" + + "b3cgYWZ0ZXIgdGhlIExMTSBmdW5jdGlvbiBpcyBjcmVhdGVkLgoKT3B0aW9uYWwgbW9kZWwgcm91" + + "dGluZyB1cGRhdGUgYWZ0ZXIgY3JlYXRpb246CgpgYGBzaApudmNmLWNsaSBmdW5jdGlvbiB1cGRh" + + "dGUgXAogIC0tZnVuY3Rpb24taWQ9PGZuX2lkPiBcCiAgLS12ZXJzaW9uLWlkPTx2ZXJfaWQ+IFwK" + + "ICAtLWxsbS1tb2RlbC11cGRhdGU9J25hbWU9PGNvbmZpcm1lZC1tb2RlbC1uYW1lPixyb3V0aW5n" + + "TWV0aG9kPXBvd2VyX29mX3R3byx0b2tlblJhdGVMaW1pdD0xMDAwLVMnCmBgYAoKVXNlIHRoaXMg" + + "Zm9yIG11dGFibGUgYHJvdXRpbmdNZXRob2RgIGFuZCBgdG9rZW5SYXRlTGltaXRgOyBjcmVhdGUt" + + "dGltZSBgdXJpc2Agc3RheSBpbiBgbW9kZWxzW10ubGxtQ29uZmlnYC4KYHRva2VuUmF0ZUxpbWl0" + + "YCBzdXBwb3J0cyBwb3NpdGl2ZSBpbnRlZ2VyIHRva2VuIGxpbWl0cyBmb3IgYFNgLCBgTWAsIGBI" + + "YCwgYERgLCBhbmQgYFdgLiBVc2UgYDEwMDAtU2AgZm9yIGEgc2luZ2xlIGlubGluZSBDTEkgbGlt" + + "aXQuIFVzZSBpbnB1dCBKU09OIGZvciBjb21iaW5lZCBsaW1pdHMsIHN1Y2ggYXMgYDEwMDAtUyw1" + + "MDAwLU0sMTAwMDAwLUgsNTAwMDAwLUQsMTAwMDAwMC1XYCwgYmVjYXVzZSBpbmxpbmUgbW9kZWwg" + + "c3BlY3MgdXNlIGNvbW1hcyBhcyBmaWVsZCBzZXBhcmF0b3JzLgoKIyMjIEhlbG0gY2hhcnQgTExN" + + "IGZ1bmN0aW9uIHZhcmlhbnQKCkxMTSBmdW5jdGlvbiB0eXBlIGlzIGluZGVwZW5kZW50IG9mIHdv" + + "cmtsb2FkIHBhY2thZ2luZy4gRm9yIGEgSGVsbS1jaGFydCBiYWNrZWQgTExNIGZ1bmN0aW9uLCBr" + + "ZWVwIHRoZSBzYW1lIGBmdW5jdGlvblR5cGVgIGFuZCBgbW9kZWxzW10ubGxtQ29uZmlnYCBmaWVs" + + "ZHMsIHRoZW4gc2V0IGBoZWxtQ2hhcnRgIGFuZCBgaGVsbUNoYXJ0U2VydmljZU5hbWVgLiBUaGUg" + + "c2VydmljZSBuYW1lIG11c3QgbWF0Y2ggYSBLdWJlcm5ldGVzIFNlcnZpY2UgcmVuZGVyZWQgYnkg" + + "dGhlIGNoYXJ0LCBhbmQgYGluZmVyZW5jZVBvcnRgIG11c3QgYmUgdGhhdCBTZXJ2aWNlIHBvcnQu" + + "CgpCZWZvcmUgY3JlYXRpbmcgdGhlIGZ1bmN0aW9uLCBjb25maXJtIHRoZSBleGFjdCBmdW5jdGlv" + + "biBuYW1lIGFuZCBtb2RlbCBuYW1lIHdpdGggdGhlIHVzZXIuIElmIGVpdGhlciB2YWx1ZSBpcyBt" + + "aXNzaW5nLCBzdG9wIGFuZCBhc2suIERvIG5vdCBpbnZlbnQgb3Igc3VibWl0IGV4YW1wbGUgdmFs" + + "dWVzIGZvciB0aGVzZSBmaWVsZHMuCgpgYGBqc29uCnsKICAibmFtZSI6ICI8Y29uZmlybWVkLWZ1" + + "bmN0aW9uLW5hbWU+IiwKICAiaW5mZXJlbmNlVXJsIjogIi8iLAogICJpbmZlcmVuY2VQb3J0Ijog" + + "ODAwMCwKICAiZnVuY3Rpb25UeXBlIjogIkxMTSIsCiAgImhlYWx0aCI6IHsKICAgICJwcm90b2Nv" + + "bCI6ICJIVFRQIiwKICAgICJ1cmkiOiAiL2hlYWx0aCIsCiAgICAicG9ydCI6IDgwMDAsCiAgICAi" + + "dGltZW91dCI6ICJQVDMwUyIsCiAgICAiZXhwZWN0ZWRTdGF0dXNDb2RlIjogMjAwCiAgfSwKICAi" + + "aGVsbUNoYXJ0IjogImh0dHBzOi8vaGVsbS5uZ2MubnZpZGlhLmNvbS9leGFtcGxlL3RlYW0vY2hh" + + "cnRzL29wZW5haS1jb21wYXRpYmxlLTAuMS4wLnRneiIsCiAgImhlbG1DaGFydFNlcnZpY2VOYW1l" + + "IjogIm9wZW5haS1jb21wYXRpYmxlIiwKICAibW9kZWxzIjogWwogICAgewogICAgICAibmFtZSI6" + + "ICI8Y29uZmlybWVkLW1vZGVsLW5hbWU+IiwKICAgICAgImxsbUNvbmZpZyI6IHsKICAgICAgICAi" + + "dXJpcyI6IFsiL3YxL2NoYXQvY29tcGxldGlvbnMiLCAiL3YxL3Jlc3BvbnNlcyIsICIvdjEvZW1i" + + "ZWRkaW5ncyJdLAogICAgICAgICJyb3V0aW5nTWV0aG9kIjogInJvdW5kX3JvYmluIiwKICAgICAg" + + "ICAidG9rZW5SYXRlTGltaXQiOiAiMTAwMC1TIgogICAgICB9CiAgICB9CiAgXQp9CmBgYAoKRXF1" + + "aXZhbGVudCBDTEkgZmxhZyBmb3JtOgoKYGBgc2gKbnZjZi1jbGkgZnVuY3Rpb24gY3JlYXRlIFwK" + + "ICAtLW5hbWU9Ijxjb25maXJtZWQtZnVuY3Rpb24tbmFtZT4iIFwKICAtLWluZmVyZW5jZS11cmw9" + + "LyBcCiAgLS1pbmZlcmVuY2UtcG9ydD04MDAwIFwKICAtLWhlYWx0aC11cmk9L2hlYWx0aCBcCiAg" + + "LS1oZWFsdGgtcG9ydD04MDAwIFwKICAtLWhlYWx0aC10aW1lb3V0PVBUMzBTIFwKICAtLWhlYWx0" + + "aC1wcm90b2NvbD1IVFRQIFwKICAtLWhlYWx0aC1leHBlY3RlZC1zdGF0dXM9MjAwIFwKICAtLWZ1" + + "bmN0aW9uLXR5cGU9TExNIFwKICAtLWhlbG0tY2hhcnQ9aHR0cHM6Ly9oZWxtLm5nYy5udmlkaWEu" + + "Y29tL2V4YW1wbGUvdGVhbS9jaGFydHMvb3BlbmFpLWNvbXBhdGlibGUtMC4xLjAudGd6IFwKICAt" + + "LWhlbG0tY2hhcnQtc2VydmljZT1vcGVuYWktY29tcGF0aWJsZSBcCiAgLS1sbG0tbW9kZWw9J25h" + + "bWU9PGNvbmZpcm1lZC1tb2RlbC1uYW1lPix1cmlzPS92MS9jaGF0L2NvbXBsZXRpb25zfC92MS9y" + + "ZXNwb25zZXN8L3YxL2VtYmVkZGluZ3Mscm91dGluZ01ldGhvZD1yb3VuZF9yb2Jpbix0b2tlblJh" + + "dGVMaW1pdD0xMDAwLVMnCmBgYAoKRGVwbG95IGlzIHVuY2hhbmdlZC4gUHV0IGNoYXJ0LXNwZWNp" + + "ZmljIHZhbHVlcyB1bmRlciBgZGVwbG95bWVudFNwZWNpZmljYXRpb25zW10uY29uZmlndXJhdGlv" + + "bmAgb25seSB3aGVuIHRoZSBjaGFydCBuZWVkcyB2YWx1ZSBvdmVycmlkZXM6CgpgYGBqc29uCnsK" + + "ICAiZnVuY3Rpb25JZCI6ICI8Zm5faWQ+IiwKICAidmVyc2lvbklkIjogIjx2ZXJfaWQ+IiwKICAi" + + "ZGVwbG95bWVudFNwZWNpZmljYXRpb25zIjogW3sKICAgICJncHUiOiAiSDEwMCIsCiAgICAiaW5z" + + "dGFuY2VUeXBlIjogIk5DUC5HUFUuSDEwMF8xeCIsCiAgICAibWluSW5zdGFuY2VzIjogMSwKICAg" + + "ICJtYXhJbnN0YW5jZXMiOiAxLAogICAgIm1heFJlcXVlc3RDb25jdXJyZW5jeSI6IDEwLAogICAg" + + "ImNvbmZpZ3VyYXRpb24iOiB7CiAgICAgICJzZXJ2aW5nIjogewogICAgICAgICJ0ZW5zb3JQYXJh" + + "bGxlbFNpemUiOiAxCiAgICAgIH0KICAgIH0KICB9XQp9CmBgYAoKTExNIEdhdGV3YXkgcm91dGVz" + + "IHJlcXVlc3RzIGJ5IHRoZSBPcGVuQUkgYG1vZGVsYCB2YWx1ZS4gVXNlIGA8ZnVuY3Rpb24taWQ+" + + "Lzxtb2RlbC1uYW1lPmA6IHRoZSBmdW5jdGlvbiBJRCBzZWxlY3RzIHRoZSBOVkNGIGZ1bmN0aW9u" + + "LCBhbmQgdGhlIG1vZGVsIG5hbWUgaXMgZm9yd2FyZGVkIHRvIHRoZSB1cHN0cmVhbSBjb250YWlu" + + "ZXIgdGhyb3VnaCBgc3RhcmdhdGUtY2xpZW50YC4KClN1cHBvcnRlZCBMTE0gcGF0aHM6Cgp8IFBh" + + "dGggfCBOb3RlcyB8CnwgLS0tIHwgLS0tIHwKfCBgL3YxL2NoYXQvY29tcGxldGlvbnNgIHwgU3Vw" + + "cG9ydHMgc3RyZWFtaW5nIGFuZCBzZXNzaW9uIHN0aWNraW5lc3MuIHwKfCBgL3YxL3Jlc3BvbnNl" + + "c2AgfCBOYXRpdmUgUmVzcG9uc2VzIHByb3h5IHBhdGg7IHJlbGF5cyBTU0UgZm9yIHN0cmVhbWlu" + + "ZyBjbGllbnRzIGFuZCByZXR1cm5zIHRlcm1pbmFsIEpTT04gZm9yIG5vbi1zdHJlYW1pbmcgY2xp" + + "ZW50cy4gU3VwcG9ydHMgc2Vzc2lvbiBzdGlja2luZXNzLiB8CnwgYC92MS9lbWJlZGRpbmdzYCB8" + + "IEFjY2VwdHMgc3RyaW5nIG9yIHN0cmluZy1hcnJheSBgaW5wdXRgOyBpbnB1dCBtdXN0IGJlIG5v" + + "bi1lbXB0eSBhbmQgbWF5IGNvbnRhaW4gYXQgbW9zdCAyMDQ4IGVudHJpZXMuIE5vIHNlc3Npb24g" + + "c3RpY2tpbmVzcy4gfAoKIyMgMi4gRnVuY3Rpb24gREVQTE9ZCgpgYGBqc29uCnsKICAiZnVuY3Rp" + "b25JZCI6ICI8Zm5faWQ+IiwKICAidmVyc2lvbklkIjogIjx2ZXJfaWQ+IiwKICAiZGVwbG95bWVu" + "dFNwZWNpZmljYXRpb25zIjogW3sKICAgICJncHUiOiAiSDEwMCIsCiAgICAiaW5zdGFuY2VUeXBl" + "IjogIk5DUC5HUFUuSDEwMF8xeCIsCiAgICAibWluSW5zdGFuY2VzIjogMSwKICAgICJtYXhJbnN0" + - "YW5jZXMiOiAxLAogICAgImNsdXN0ZXJzIjogWyJncHUtZWFzdC0xIl0KICB9XQp9CmBgYAoKVGhl" + - "IGBjbHVzdGVyc2AgYXJyYXkgKHVzaW5nIGNsdXN0ZXIgbmFtZXMsIG5vdCBJRHMpIGxpbWl0cyBz" + - "Y2hlZHVsaW5nIHRvIHRob3NlIGNvbXB1dGUgcGxhbmVzLiBPbWl0IHRvIGxldCBJQ01TIGNob29z" + - "ZSBhbnkgY29tcHV0ZSBwbGFuZSB3aXRoIGEgbWF0Y2hpbmcgU0tVLgoKIyMgU3RhdHVzIGZhbi1v" + - "dXQgYWNyb3NzIGNvbXB1dGUgcGxhbmVzCgpgYGBzaAojIExpc3QgYWxsIHJlZ2lzdGVyZWQgY29t" + - "cHV0ZSBwbGFuZXM6Cm52Y2YtY2xpIGNsdXN0ZXIgbGlzdCAtLWpzb24gfCBqcSAtciAnLmNsdXN0" + - "ZXJzW10ubmFtZScgPiBjbHVzdGVycy50eHQKCiMgU3RhdHVzIHNuYXBzaG90IHBlciBjb21wdXRl" + - "IHBsYW5lIChhc3N1bWluZyBlYWNoIGNvbnRleHQgbmFtZSBtYXRjaGVzKToKd2hpbGUgcmVhZCBO" + - "QU1FOyBkbwogIGVjaG8gIj09PSAkTkFNRSA9PT0iCiAgbnZjZi1jbGkgc2VsZi1ob3N0ZWQgc3Rh" + - "dHVzIFwKICAgIC0tY2x1c3Rlci1uYW1lPSROQU1FIFwKICAgIC0tY29tcHV0ZS1wbGFuZS1jb250" + - "ZXh0PWFkbWluQCROQU1FIFwKICAgIC0tanNvbiB8IGpxIC1jICd7Y2x1c3RlcjouY2x1c3Rlciwg" + - "dmVyZGljdDoudmVyZGljdCwgcmVjb25jaWxlOi5yZWNvbmNpbGVBZ2VTZWN9Jwpkb25lIDwgY2x1" + - "c3RlcnMudHh0CmBgYAoKQSBmdXR1cmUgTSsxMSBtaWxlc3RvbmUgd2lsbCBhZGQgbmF0aXZlIGZh" + - "bi1vdXQgKGBzdGF0dXMgLS1hbGwtY29tcHV0ZS1wbGFuZXNgKSBzbyB0aGlzIGRvZXNuJ3QgbmVl" + - "ZCBhIHNoZWxsIGxvb3AuClBLBwhodj9B6AsAAOgLAABQSwMEFAAIAAAAAAAhAAAAAAAAAAAAAAAA" + - "ADcACQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9wcm9tcHRzL2FkZC1jb21wdXRlLXBsYW5l" + - "Lm1kVVQFAAEAps4SIyBBZGQgYSBjb21wdXRlIHBsYW5lIHRvIGFuIGV4aXN0aW5nIGNvbnRyb2wg" + - "cGxhbmUKClVzZXIgaGFzIGEgd29ya2luZyBOVkNGIGNvbnRyb2wgcGxhbmUgKHJ1bm5pbmcgc29t" + - "ZXdoZXJlKSBhbmQgd2FudHMgdG8gcmVnaXN0ZXIgYSBuZXcgR1BVIGNsdXN0ZXIgYWdhaW5zdCBp" + - "dC4gVGhpcyBpcyB0aGUgbXVsdGktY2x1c3RlciBzY2FsaW5nIHBhdGg6IG9uZSBjb250cm9sIHBs" + - "YW5lIOKGkiBOIGNvbXB1dGUgcGxhbmVzLgoKIyMgUHJlcmVxdWlzaXRlcyB0aGUgdXNlciBtdXN0" + - "IGhhdmUKCi0gKiprdWJlY3RsIGNvbnRleHQgZm9yIHRoZSBuZXcgY29tcHV0ZSBwbGFuZSoqIGlu" + - "IHRoZWlyIGBLVUJFQ09ORklHYC4KLSAqKlB1YmxpYyBJQ01TIFVSTCoqIG9mIHRoZSBleGlzdGlu" + - "ZyBjb250cm9sIHBsYW5lIChlLmcuIGBodHRwczovL2ljbXMubnZjZi5leGFtcGxlLmNvbWApLgot" + - "ICoqQWRtaW4gSldUKiogZm9yIHRoZSBjb250cm9sIHBsYW5lJ3MgYWNjb3VudCwgT1IgYWJpbGl0" + - "eSB0byBtaW50IG9uZSB2aWEgYG52Y2YtY2xpIGluaXRgIGFnYWluc3QgdGhlIGNvbnRyb2wgcGxh" + - "bmUncyBwdWJsaWMgYXBpIGVuZHBvaW50LiAoQWRtaW4gdG9rZW5zIGNvbWUgZnJvbSB0aGUgQVBJ" + - "IEtleXMgc2VydmljZSB2aWEgdGhlIHB1YmxpYyBhcGkgZ2F0ZXdheSDigJQga3ViZWN0bCBhY2Nl" + - "c3MgdG8gdGhlIGNvbnRyb2wgcGxhbmUgaXMgTk9UIHJlcXVpcmVkIHRvIG9idGFpbiBvbmUuKQot" + - "ICoqQSB1bmlxdWUgYC0tY2x1c3Rlci1uYW1lYCoqIHRoYXQgZG9lc24ndCBjb2xsaWRlIHdpdGgg" + - "YWxyZWFkeS1yZWdpc3RlcmVkIGNsdXN0ZXJzLiBVc2UgYG52Y2YtY2xpIGNsdXN0ZXIgbGlzdGAg" + - "ZnJvbSBhIGNvbnRyb2wtcGxhbmUgY29udGV4dCB0byBjaGVjay4KCiMjIFN0ZXBzCgoxLiAqKkFz" + - "ayBmb3IgaW5wdXRzOioqCiAgIC0gYC0tY2x1c3Rlci1uYW1lPTx1bmlxdWU+YCDigJQgbXVzdCBi" + - "ZSB1bmlxdWUgd2l0aGluIHRoZSBjb250cm9sIHBsYW5lJ3MgTkNBIHNjb3BlCiAgIC0gYC0tY29t" + - "cHV0ZS1wbGFuZS1jb250ZXh0PTxjb250ZXh0PmAg4oCUIHRoZSBuZXcgR1BVIGNsdXN0ZXIncyBr" + - "dWJlY3RsIGNvbnRleHQKICAgLSBgLS1pY21zLXVybD08aHR0cHM6Ly9pY21zLm52Y2YuZXhhbXBs" + - "ZS5jb20+YCDigJQgY29udHJvbCBwbGFuZSdzIHB1YmxpYyBJQ01TIFVSTAogICAtIEdQVSB0eXBl" + - "PyAoZGVmYXVsdCBgSDEwMGAsIGJ1dCBhc2spCgoyLiAqKlByZS1mbGlnaHQganVzdCB0aGUgY29t" + - "cHV0ZSBwbGFuZToqKgoKICAgYGBgc2gKICAgbnZjZi1jbGkgc2VsZi1ob3N0ZWQgY2hlY2sgLS1w" + - "cmUgXAogICAgIC0tY29tcHV0ZS1wbGFuZS1jb250ZXh0PSRDVFggXAogICAgIC0taWNtcy11cmw9" + - "JElDTVMgXAogICAgIC0tanNvbiB8IGpxIC1jIC4KICAgYGBgCgogICBUaGlzIHZhbGlkYXRlcyB0" + - "aGUgR1BVIG9wZXJhdG9yIGlzIGluc3RhbGxlZCwgR1BVIG5vZGUgbGFiZWxzIGFyZSBwcmVzZW50" + - "LCBhbmQgSUNNUyBpcyByZWFjaGFibGUgdmlhIEhUVFAuIEFkZHJlc3MgYW55IGZhaWx1cmVzIGJl" + - "Zm9yZSBwcm9jZWVkaW5nLgoKMy4gKipSdW4gYGFkZC1jb21wdXRlLXBsYW5lYDoqKgoKICAgYGBg" + - "c2gKICAgbnZjZi1jbGkgc2VsZi1ob3N0ZWQgYWRkLWNvbXB1dGUtcGxhbmUgXAogICAgIC0tY2x1" + - "c3Rlci1uYW1lPSROQU1FIFwKICAgICAtLWNvbXB1dGUtcGxhbmUtY29udGV4dD0kQ1RYIFwKICAg" + - "ICAtLWljbXMtdXJsPSRJQ01TIFwKICAgICAtLXRva2VuPSRKV1QgXAogICAgIC0tbm9uLWludGVy" + - "YWN0aXZlIFwKICAgICAtLWpzb24KICAgYGBgCgogICBUaGlzIGlzIGEgc2VwYXJhdGUgc3ViY29t" + - "bWFuZCBmcm9tIGB1cGAuIEl0IHJ1bnMgb25seSB0aGUgY29tcHV0ZS1wbGFuZS1yZWxldmFudCBw" + - "aGFzZXM6IDEgKGNvbXB1dGUtcGxhbmUgcHJlZmxpZ2h0KSwgNSAocmVnaXN0ZXIpLCA2IChjb21w" + - "dXRlLXBsYW5lIGFwcGx5KSwgOCAoZmluYWwgaGVhbHRoIG9uIHRoZSBuZXcgY29tcHV0ZSBwbGFu" + - "ZSkuIEl0IGRvZXMgTk9UIHRvdWNoIHRoZSBjb250cm9sIHBsYW5lIGFuZCBkb2VzIE5PVCBhY2Nl" + - "cHQgYC0tY29udHJvbC1wbGFuZS1jb250ZXh0YCDigJQgdGhlIGNvbnRyb2wgcGxhbmUgaXMgcmVh" + - "Y2hlZCBvdmVyIEhUVFBTIGF0IGAtLWljbXMtdXJsYC4gYC0tdG9rZW5gIGlzIHJlcXVpcmVkIGJl" + - "Y2F1c2UgdGhlcmUncyBubyBrdWJlY3RsIHBhdGggdG8gbWludCBvbmUgZnJvbS4KCjQuICoqVmVy" + - "aWZ5LioqIGBudmNmLWNsaSBzZWxmLWhvc3RlZCBzdGF0dXMgLS1jbHVzdGVyLW5hbWU9JE5BTUUg" + - "LS1qc29uIHwganFgIOKAlCBleHBlY3QgYHZlcmRpY3Q6ICJoZWFsdGh5ImAuIFRoZSBSZWdpc3Rl" + - "cmVkIENvbXB1dGUgUGxhbmVzIHBhbmVsIGZyb20gSUNNUyBzaG91bGQgbm93IGxpc3QgdGhlIG5l" + - "dyBjbHVzdGVyLgoKNS4gKipTbW9rZS4qKiBbZGVwbG95LWFuZC1pbnZva2UubWRdKGRlcGxveS1h" + - "bmQtaW52b2tlLm1kKSDigJQgZGVwbG95IGEgc21hbGwgZnVuY3Rpb24gdG8gdGhlIG5ldyBjb21w" + - "dXRlIHBsYW5lIHRvIGNvbmZpcm0gc2NoZWR1bGluZyB3b3Jrcy4KCiMjIFdoYXQgaWYgYSBjbHVz" + - "dGVyIHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cz8KCmBhZGQtY29tcHV0ZS1wbGFu" + - "ZWAncyByZWdpc3RlciBwaGFzZSB1c2VzIGAtLWlnbm9yZS1leGlzdGluZ2Agc2VtYW50aWNzIOKA" + - "lCBpdCdsbCBtYXRjaCB0aGUgZXhpc3RpbmcgSUNNUyByb3cgYW5kIHJldXNlIGl0cyBjbHVzdGVy" + - "SWQuIFR3byBzY2VuYXJpb3M6CgotICoqUmUtcmVnaXN0ZXJpbmcgdGhlIHNhbWUgY2x1c3Rlcioq" + - "IChyZS1ydW5uaW5nIG9uIHRoZSBzYW1lIGNvbXB1dGUgcGxhbmUgdGhhdCB3YXMgcHJldmlvdXNs" + - "eSByZWdpc3RlcmVkKTogZXhwZWN0ZWQsIG5vLW9wIHNlbWFudGljcy4KLSAqKkRpZmZlcmVudCBw" + - "aHlzaWNhbCBjbHVzdGVyIGJ1dCBzYW1lIG5hbWUqKjogdGhlIHNlY29uZCBhdHRlbXB0IHdpbGwg" + - "cmV1c2UgdGhlIElDTVMgcm93LCBidXQgdGhlIG5ldyBjb21wdXRlIHBsYW5lJ3MgSldLUyB3aWxs" + - "IGJlIHNpbGVudGx5ICpyZXBsYWNlZCog4oCUIHRoZSBvbGQgY29tcHV0ZSBwbGFuZSdzIE5WQ0Eg" + - "YWdlbnQgd2lsbCBzdGFydCBmYWlsaW5nIFBTQVQgYXV0aC4gKipDb25maXJtIHdpdGggdGhlIHVz" + - "ZXIqKiB0aGF0IHRoZXkgbWVhbnQgdG8gb3ZlcndyaXRlLgoKV2hlbiBpbiBkb3VidCwgcnVuIGBu" + - "dmNmLWNsaSBjbHVzdGVyIGxpc3RgIGZpcnN0IGFuZCBhc2sgdGhlIHVzZXIgYmVmb3JlIHByb2Nl" + - "ZWRpbmcgd2l0aCBhIG5hbWUgdGhhdCBhbHJlYWR5IGV4aXN0cy4KUEsHCP5mQzrMDAAAzAwAAFBL" + + "YW5jZXMiOiAxLAogICAgIm1heFJlcXVlc3RDb25jdXJyZW5jeSI6IDEwCiAgfV0KfQpgYGAKCk5v" + + "dGU6IGBncHVgIGlzIHRoZSBHUFUgKipmYW1pbHkqKiAoZS5nLiBgSDEwMGApLCBgaW5zdGFuY2VU" + + "eXBlYCBpcyB0aGUgU0tVIChlLmcuIGBOQ1AuR1BVLkgxMDBfMXhgKS4gTWlzbWF0Y2ggcmV0dXJu" + + "cyBJQ01TIDQwMCAiSW52YWxpZCBHUFUiLgoKYGBgc2gKbnZjZi1jbGkgZnVuY3Rpb24gZGVwbG95" + + "IGNyZWF0ZSAtLWlucHV0LWZpbGU9ZGVwbG95LWZuLmpzb24KYGBgCgpUaGlzIGNvbW1hbmQgKipi" + + "bG9ja3MqKiB1bnRpbCB0aGUgZGVwbG95bWVudCByZWFjaGVzIEFDVElWRSAoZGVmYXVsdCA5MDBz" + + "IHRpbWVvdXQpLiBXaGVuIGl0IHJldHVybnMgcmM9MCwgYSBmdW5jdGlvbiBwb2QgaXMgcnVubmlu" + + "ZyBpbiB0aGUgYG52Y2YtYmFja2VuZGAgbmFtZXNwYWNlIG9uIHRoZSBjb21wdXRlLXBsYW5lIGNs" + + "dXN0ZXIuCgojIyAzLiBNaW50IGFuIEFQSSBrZXkgd2l0aCBgaW52b2tlX2Z1bmN0aW9uYCBzY29w" + + "ZQoKYG52Y2YtY2xpIGluaXRgJ3MgYWRtaW4gdG9rZW4gZG9lcyBOT1QgY2FycnkgdGhlIGBpbnZv" + + "a2VfZnVuY3Rpb25gIHNjb3BlIOKAlCBpbnZva2Ugd291bGQgNDAzIHdpdGggIm1pc3NpbmcgcmVx" + + "dWVzdGVkIGF1dGhvcml0aWVzIi4gTWludCBhbiBBUEkga2V5OgoKYGBgc2gKbnZjZi1jbGkgYXBp" + + "LWtleSBnZW5lcmF0ZSAtLWRlc2NyaXB0aW9uPSI8Y29uZmlybWVkLWZ1bmN0aW9uLW5hbWU+IGlu" + + "dm9rZSIgLS1leHBpcmVzLWluPTFoCiMg4oaSIEFQSSBLZXk6IG52YXBpLW52Y2Ytc3RnLS4uLgpg" + + "YGAKClRoZSBrZXkgaXMgYXV0b21hdGljYWxseSBzYXZlZCB0byB0aGUgQ0xJIHN0YXRlIGZpbGUg" + + "YW5kIHVzZWQgYnkgdGhlIG5leHQgYGZ1bmN0aW9uIGludm9rZWAgY2FsbC4gKipEb24ndCBlY2hv" + + "IHRoZSBrZXkgaW50byBjaGF0IC8gbG9ncyoqLgoKIyMgNC4gRnVuY3Rpb24gSU5WT0tFCgpgYGBq" + + "c29uCnsKICAiZnVuY3Rpb25JZCI6ICI8Zm5faWQ+IiwKICAidmVyc2lvbklkIjogIjx2ZXJfaWQ+" + + "IiwKICAicmVxdWVzdEJvZHkiOiB7Im1lc3NhZ2UiOiAiaGVsbG8ifQp9CmBgYAoKYGBgc2gKbnZj" + + "Zi1jbGkgZnVuY3Rpb24gaW52b2tlIC0taW5wdXQtZmlsZT1pbnZva2UtZm4uanNvbgojIOKGkiBG" + + "dW5jdGlvbiBpbnZvY2F0aW9uIGNvbXBsZXRlZCEKIyDihpIgU3RhdHVzOiBmdWxmaWxsZWQKIyDi" + + "hpIgUmVxdWVzdCBJRDogLi4uCmBgYAoKRm9yIGFuIExMTSBmdW5jdGlvbiwgaW52b2tlIHRoZSBP" + + "cGVuQUktY29tcGF0aWJsZSByb3V0ZSBhZnRlciBkZXBsb3ltZW50OgoKYGBgc2gKY3VybCAtc1Mg" + + "LVggUE9TVCAiaHR0cHM6Ly9sbG0uaW52b2NhdGlvbi48ZG9tYWluPi92MS9jaGF0L2NvbXBsZXRp" + + "b25zIiBcCiAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAke05WQ0ZfQVBJX0tFWX0iIFwKICAt" + + "SCAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uIiBcCiAgLWQgJ3sKICAgICJtb2RlbCI6" + + "ICI8Zm5faWQ+Lzxjb25maXJtZWQtbW9kZWwtbmFtZT4iLAogICAgInN0cmVhbSI6IHRydWUsCiAg" + + "ICAibWVzc2FnZXMiOiBbCiAgICAgIHsKICAgICAgICAicm9sZSI6ICJ1c2VyIiwKICAgICAgICAi" + + "Y29udGVudCI6ICJIZWxsbyIKICAgICAgfQogICAgXQogIH0nCmBgYAoKVGhlIE9wZW5BSSBgbW9k" + + "ZWxgIHZhbHVlIG11c3QgYmUgYDxmdW5jdGlvbi1pZD4vPG1vZGVsLW5hbWU+YCBzbyB0aGUgZ2F0" + + "ZXdheSBjYW4gc2VsZWN0IHRoZSBmdW5jdGlvbiBhbmQgbW9kZWwuCgpSZXNwb25zZXMgQVBJIGV4" + + "YW1wbGU6CgpgYGBzaApjdXJsIC1zUyAtWCBQT1NUICJodHRwczovL2xsbS5pbnZvY2F0aW9uLjxk" + + "b21haW4+L3YxL3Jlc3BvbnNlcyIgXAogIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJHtOVkNG" + + "X0FQSV9LRVl9IiBcCiAgLUggIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbiIgXAogIC1k" + + "ICd7CiAgICAibW9kZWwiOiAiPGZuX2lkPi88Y29uZmlybWVkLW1vZGVsLW5hbWU+IiwKICAgICJp" + + "bnB1dCI6ICJXcml0ZSBhIG9uZSBzZW50ZW5jZSBzdW1tYXJ5IG9mIE5WQ0YuIgogIH0nCmBgYAoK" + + "RW1iZWRkaW5ncyBleGFtcGxlOgoKYGBgc2gKY3VybCAtc1MgLVggUE9TVCAiaHR0cHM6Ly9sbG0u" + + "aW52b2NhdGlvbi48ZG9tYWluPi92MS9lbWJlZGRpbmdzIiBcCiAgLUggIkF1dGhvcml6YXRpb246" + + "IEJlYXJlciAke05WQ0ZfQVBJX0tFWX0iIFwKICAtSCAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlv" + + "bi9qc29uIiBcCiAgLWQgJ3sKICAgICJtb2RlbCI6ICI8Zm5faWQ+Lzxjb25maXJtZWQtbW9kZWwt" + + "bmFtZT4iLAogICAgImlucHV0IjogIk5WQ0YgZW1iZWRkaW5ncyBjaGVjayIKICB9JwpgYGAKCklm" + + "IHN0YXR1cyBpcyBgZXJyb3JlZGAsIHF1ZXJ5IElDTVMgZm9yIHRoZSBkZXBsb3ltZW50J3MgcG9k" + + "IGxvZ3MgKGt1YmVjdGwgb24gdGhlIGNvbXB1dGUtcGxhbmUgY2x1c3RlcikgYW5kIHN1cmZhY2Ug" + + "dG8gdGhlIHVzZXIuCgojIyA1LiBDbGVhbnVwCgpXaGVuIHRoZSB1c2VyIGlzIGRvbmUgd2l0aCB0" + + "aGUgc21va2UgdGVzdDoKCmBgYHNoCm52Y2YtY2xpIGZ1bmN0aW9uIGRlbGV0ZSAtLWZ1bmN0aW9u" + + "LWlkPTxmbl9pZD4gLS12ZXJzaW9uLWlkPTx2ZXJfaWQ+CmBgYAoKKipDb25maXJtIHdpdGggdGhl" + + "IHVzZXIgYmVmb3JlIGRlbGV0aW5nLioqIFRoaXMgcmVtb3ZlcyBib3RoIHRoZSBkZXBsb3ltZW50" + + "IGFuZCB0aGUgZnVuY3Rpb24gcmVjb3JkLgoKIyMgTm90ZXMKCi0gRGVwbG95IHRpbWVzIGNhbiB2" + + "YXJ5IHdpZGVseSBkZXBlbmRpbmcgb24gTkFUUyBzdHJlYW0taW5pdCBsYXRlbmN5IG9uIGNvbGQt" + + "Y2x1c3RlciBydW5zICgxLTcgbWludXRlcyBvYnNlcnZlZCBpbiBkZXYtVk0gdGVzdHMpLiBCZSBw" + + "YXRpZW50OyBkb24ndCBraWxsIHRoZSBgZnVuY3Rpb24gZGVwbG95IGNyZWF0ZWAgY29tbWFuZCBl" + + "YXJseS4KLSBGb3IgZGlmZmVyZW50IEdQVSBmYW1pbGllcywgY2hhbmdlIGJvdGggYGdwdWAgYW5k" + + "IGBpbnN0YW5jZVR5cGVgIHRvZ2V0aGVyLiBDb21tb24gU0tVczogYE5DUC5HUFUuSDEwMF8xeGAs" + + "IGBOQ1AuR1BVLkgxMDBfMnhgLCBgTkNQLkdQVS5BMTAwXzF4YC4KLSBUaGUgZnVuY3Rpb24ncyBj" + + "b250YWluZXIgaW1hZ2UgbXVzdCBiZSBwdWxsYWJsZSBmcm9tIHRoZSBjb21wdXRlLXBsYW5lIGNs" + + "dXN0ZXIncyBpbWFnZS1jcmVkZW50aWFsLWhlbHBlciBjb25maWcgKGNoZWNrIGBrdWJlY3RsIGRl" + + "c2NyaWJlIHBvZCAtbiBudmNmLWJhY2tlbmRgIGlmIHBvZHMgbGFuZCBpbiBgSW1hZ2VQdWxsQmFj" + + "a09mZmApLgpQSwcI0kPcBBglAAAYJQAAUEsDBBQACAAAAAAAIQAAAAAAAAAAAAAAAAA9AAkAZGF0" + + "YS9udmNmLXNlbGYtbWFuYWdlZC1jbGkvcHJvbXB0cy9kaWFnbm9zZS1mYWlsZWQtaW5zdGFsbC5t" + + "ZFVUBQABAKbOEiMgRGlhZ25vc2UgYSBmYWlsZWQgc2VsZi1ob3N0ZWQgTlZDRiBpbnN0YWxsCgpV" + + "c2VyIHNheXMgIm15IGluc3RhbGwgZmFpbGVkIiBvciAiWCBpc24ndCB3b3JraW5nIi4gRG9uJ3Qg" + + "Z3Vlc3Mg4oCUIHF1ZXJ5IHRoZSBjbHVzdGVyLgoKIyMgMS4gR2V0IHRoZSB2ZXJkaWN0CgpgYGBz" + + "aApudmNmLWNsaSBzZWxmLWhvc3RlZCBzdGF0dXMgLS1qc29uIHwganEgLWMgLgpgYGAKClRoZSBm" + + "aXJzdCBldmVudCBpcyB0aGUgc25hcHNob3QuIFBhcnNlIGAudmVyZGljdGA6CgotICoqYGhlYWx0" + + "aHlgKiog4oCUIG5vdGhpbmcncyB3cm9uZy4gQXNrIHRoZSB1c2VyIHdoYXQgdGhleSdyZSBhY3R1" + + "YWxseSBzZWVpbmc7IHRoZWlyIHByb2JsZW0gbWF5IGJlIGF0IGEgZGlmZmVyZW50IGxheWVyIChm" + + "dW5jdGlvbiBkZXBsb3ksIG5ldHdvcmssIGV0Yy4pLgotICoqYGRlZ3JhZGVkYCoqIOKAlCBhdCBs" + + "ZWFzdCBvbmUgY29tcG9uZW50IG5vdCByZWFkeS4gVGhlIENvbXBvbmVudHMgbGlzdCB3aWxsIGlk" + + "ZW50aWZ5IHdoaWNoLiBNb3N0IGNvbW1vbjogYGNhc3NhbmRyYWAgUG9kSW5pdGlhbGl6aW5nLCBg" + + "b3BlbmJhb2Agbm90IHVuc2VhbGVkLCBgc2lzYCBJbWFnZVB1bGxCYWNrT2ZmLgotICoqYGZhaWxl" + + "ZGAqKiDigJQgTlZDRkJhY2tlbmQgYEhlYWx0aD1GYWlsZWRgLiBSZWFkIHRoZSBjbHVzdGVyJ3Mg" + + "TlZDRkJhY2tlbmQgc3RhdHVzIGNvbmRpdGlvbiBtZXNzYWdlLgotICoqYHVua25vd25gKiog4oCU" + + "IElDTVMgdW5yZWFjaGFibGUuIFRoZSBjb250cm9sIHBsYW5lIGl0c2VsZiBtYXkgYmUgZG93bjsg" + + "Y2hlY2sgYGt1YmVjdGwgZ2V0IHBvZHMgLW4gc2lzYCBkaXJlY3RseS4KCiMjIDIuIERyaWxsIGlu" + + "dG8gdGhlIGZhaWxpbmcgY29tcG9uZW50CgpGb3IgZWFjaCBub24tcmVhZHkgY29tcG9uZW50LCB0" + + "aGUgc25hcHNob3QgaW5jbHVkZXMgYSBgbWVzc2FnZWAgKGUuZy4gYGNhc3NhbmRyYS0wIFBvZElu" + + "aXRpYWxpemluZyA2bTIzc2ApLiBBc2sgdGhlIHVzZXIgdG8gcnVuOgoKYGBgc2gKa3ViZWN0bCBk" + + "ZXNjcmliZSBwb2QgLW4gPG5zPiA8cG9kPgprdWJlY3RsIGxvZ3MgLW4gPG5zPiA8cG9kPiAtLWFs" + + "bC1jb250YWluZXJzIC0tdGFpbD0xMDAKYGBgCgpTdXJmYWNlIHRoZSBldmVudHMgKyBsYXN0IGxv" + + "ZyBsaW5lcy4gRG9uJ3QgcHJvcG9zZSBga3ViZWN0bCBkZWxldGUgcG9kYCB1bmxlc3MgdGhlIHVz" + + "ZXIgY29uZmlybXMg4oCUIENhc3NhbmRyYSByZXN0YXJ0IGxvc2VzIGFueSBpbi1wcm9ncmVzcyBt" + + "aWdyYXRpb24uCgojIyAzLiBDb21tb24gcGF0dGVybnMKCnwgU3ltcHRvbSB8IExpa2VseSBjYXVz" + + "ZSB8IFJlbWVkaWF0aW9uIHwKfC0tLXwtLS18LS0tfAp8IGBjYXNzYW5kcmEtMCBQb2RJbml0aWFs" + + "aXppbmdgIGZvciA+NSBtaW4gfCBTdG9yYWdlQ2xhc3MgbWlzc2luZyBvciBQViBzdHVjayBgUGVu" + + "ZGluZ2AgfCBga3ViZWN0bCBnZXQgcHYscHZjIC1BYCDigJQgY29uZmlybSBhIGRlZmF1bHQgU3Rv" + + "cmFnZUNsYXNzIGV4aXN0cy4gTG9jYWwgZGV2OiBga3ViZWN0bCBwYXRjaCBzdG9yYWdlY2xhc3Mg" + + "bG9jYWwtcGF0aCAtcCAneyJtZXRhZGF0YSI6eyJhbm5vdGF0aW9ucyI6eyJzdG9yYWdlY2xhc3Mu" + + "a3ViZXJuZXRlcy5pby9pcy1kZWZhdWx0LWNsYXNzIjoidHJ1ZSJ9fX0nYCB8CnwgYGhlbG0gaW5z" + + "dGFsbCAuLi46IHRpbWVkIG91dCB3YWl0aW5nIGZvciBjYXNzYW5kcmEgdG8gYmVjb21lIGF2YWls" + + "YWJsZWAgfCBTYW1lIGFzIGFib3ZlIHwgU2FtZSB8CnwgYEdhdGV3YXkgQVBJIENSRHMgbm90IGlu" + + "c3RhbGxlZGAgKHByZWZsaWdodCkgfCBNdWx0aS1jbHVzdGVyIGBudmNmLWdhdGV3YXktcm91dGVz" + + "YCBjaGFydCBuZWVkcyBlbnZveS1nYXRld2F5IHByZXJlcXVpc2l0ZSB8IEluc3RhbGwgZW52b3kt" + + "Z2F0ZXdheTogYGhlbG0gaW5zdGFsbCBlZyBvY2k6Ly9kb2NrZXIuaW8vZW52b3lwcm94eS9nYXRl" + + "d2F5LWhlbG0gLS1uYW1lc3BhY2U9ZW52b3ktZ2F0ZXdheS1zeXN0ZW0gLS1jcmVhdGUtbmFtZXNw" + + "YWNlYCB8CnwgYE5vIGNsdXN0ZXIgZm91bmQgd2l0aCB2YWxpZCBKV0tTIGZvciBjbHVzdGVyIElE" + + "OiA8aWQ+YCAoTlZDQSBhZ2VudCkgfCBDb21wdXRlIHBsYW5lJ3MgUFNBVCB3YXMgaXNzdWVkIGJ5" + + "IGEgSzhzIHNlcnZlciB3aG9zZSBKV0tTIGRvZXNuJ3QgbWF0Y2ggd2hhdCdzIHN0b3JlZCBpbiBJ" + + "Q01TIHwgUmUtcmVnaXN0ZXI6IGBudmNmLWNsaSBjbHVzdGVyIHJvdGF0ZSAtLWNsdXN0ZXItaWQ9" + + "PGlkPmAgZnJvbSBhIGNvbnRleHQgdGhhdCBjYW4gcmVhY2ggdGhlIGNvbXB1dGUgcGxhbmUncyBL" + + "OHMgQVBJIHwKfCBgU2lnbmVkIEpXVCByZWplY3RlZDogQW5vdGhlciBhbGdvcml0aG0gZXhwZWN0" + + "ZWQsIG9yIG5vIG1hdGNoaW5nIGtleShzKSBmb3VuZGAgKGluaXQgLyBjbHVzdGVyIHJlZ2lzdGVy" + + "KSB8IFN0YWxlIHNlc3Npb24uanNvbiBmcm9tIGEgZGlmZmVyZW50IGNvbnRyb2wgcGxhbmUgfCBg" + + "cm0gfi8ubnZjZi1jbGkuc3RhdGVgIHRoZW4gYG52Y2YtY2xpIGluaXRgIGFnYWluIHwKfCBgbnZj" + + "YS1vcGVyYXRvcmAgSW1hZ2VQdWxsQmFja09mZiBmb3IgYG52Y2Etb3BlcmF0b3I6cHNhdGAgfCBJ" + + "bWFnZSBub3QgaW4gY2x1c3RlciAobXVsdGktY2x1c3RlciB0b3BvbG9neSBidWlsZHMgaXQgbG9j" + + "YWxseSkgfCBgazNkIGltYWdlIGltcG9ydCBudmNyLmlvLy4uLi9udmNhLW9wZXJhdG9yOnBzYXQg" + + "LWMgPGNsdXN0ZXI+YCAob3Igd2hhdGV2ZXIgeW91ciBpbWFnZSBwdXNoIHBhdGggaXMpIHwKfCBg" + + "cmVxdWlyZWRFbnYgIk5DQV9JRCIgaXMgbm90IHNldGAgKGhlbG1maWxlIGVycm9yKSB8IE9sZGVy" + + "IG52Y2YtY2xpOyB0aGUgZW52IHByb3BhZ2F0aW9uIGZpeCBsYW5kZWQgaW4gTSs1IGZvbGxvdy11" + + "cHMgfCBVcGdyYWRlIGBudmNmLWNsaWAgdG8gYSB2ZXJzaW9uIGFmdGVyIGA2YWE1NzA0YCB8Cgoj" + + "IyA0LiBXaGVuIHRoZSB1c2VyIHdhbnRzIHRvIHN0YXJ0IG92ZXIKCklmIHRoZXkgY29uZmlybSBh" + + "IHRlYXJkb3duOgotIFNpbmdsZS1jbHVzdGVyOiBgY2QgbnZjZi1zZWxmLW1hbmFnZWQtc3RhY2sg" + + "JiYgbWFrZSBkZXN0cm95YCAob3IgYGhlbG0gdW5pbnN0YWxsYCBwZXIgcmVsZWFzZSBpbiByZXZl" + + "cnNlIG9yZGVyKS4KLSBNdWx0aS1jbHVzdGVyOiBgaGVsbSB1bmluc3RhbGwgbnZjYS1vcGVyYXRv" + + "ciAtbiBudmNhLW9wZXJhdG9yYCBvbiB0aGUgY29tcHV0ZSBwbGFuZSBGSVJTVDsgdGhlbiBjb250" + + "cm9sIHBsYW5lOyB0aGVuIGBudmNmLWNsaSBjbHVzdGVyIGRlbGV0ZSAtLWNsdXN0ZXItaWQ9PGlk" + + "PmAgdG8gcmVtb3ZlIHRoZSBJQ01TIHJvdy4KCkFsd2F5cyBjb25maXJtIGJlZm9yZSBhbnkgdGVh" + + "cmRvd24g4oCUIENhc3NhbmRyYSBTdGF0ZWZ1bFNldCBQVkMgZGVsZXRpb24gaXMgZGVzdHJ1Y3Rp" + + "dmUgYW5kIGxvc2VzIGNsdXN0ZXJfb2lkYyByb3dzLgoKIyMgV2hhdCBub3QgdG8gZG8KCi0gKipE" + + "b24ndCBwcm9wb3NlIGAtLWRlYnVnYCBhcyBhIGZpeC4qKiBJdCdzIGRpYWdub3N0aWMgb25seS4K" + + "LSAqKkRvbid0IHByb3Bvc2UgYGhlbG0gdW5pbnN0YWxsYCoqIHVubGVzcyB0aGUgdXNlciBleHBs" + + "aWNpdGx5IGFza2VkIHRvIHN0YXJ0IG92ZXIuCi0gKipEb24ndCBwcm9wb3NlIGBrdWJlY3RsIGRl" + + "bGV0ZSBwdmNgKiogZXZlciB3aXRob3V0IGNvbmZpcm1hdGlvbiDigJQgaXQgZGVsZXRlcyB0aGUg" + + "dW5kZXJseWluZyBQVi4KLSAqKkRvbid0IHJlLXJ1biBgdXBgIHdpdGggZGlmZmVyZW50IGlucHV0" + + "cyoqIHRvICJzZWUgd2hhdCBoYXBwZW5zIi4gRGlhZ25vc2Ugd2l0aCBgc3RhdHVzYCAvIGBrdWJl" + + "Y3RsIGRlc2NyaWJlYCBmaXJzdC4KUEsHCA6cP5e9DgAAvQ4AAFBLAwQUAAgAAAAAACEAAAAAAAAA" + + "AAAAAAAAOgAJAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL3Byb21wdHMvaW5zdGFsbC1mcm9t" + + "LXNjcmF0Y2gubWRVVAUAAQCmzhIjIEluc3RhbGwgc2VsZi1ob3N0ZWQgTlZDRiBmcm9tIHNjcmF0" + + "Y2gKClVzZXIgd2FudHMgdG8gYnJpbmcgdXAgc2VsZi1ob3N0ZWQgTlZDRiBvbiBhIGZyZXNoIEt1" + + "YmVybmV0ZXMgY2x1c3RlciAob3IgazNkIGZvciBsb2NhbCBkZXYpLiBUaGlzIGlzIHRoZSBtb3N0" + + "IGNvbW1vbiBlbnRyeXBvaW50LgoKIyMgU3RlcHMKCjEuICoqQ29uZmlybSB0aGUgdG9wb2xvZ3ku" + + "KiogQXNrIHRoZSB1c2VyOgogICAtICJTaW5nbGUtY2x1c3RlciAoY29udHJvbCBwbGFuZSBhbmQg" + + "Y29tcHV0ZSBwbGFuZSBvbiBvbmUgY2x1c3Rlciwgc2ltcGxlcikgb3Igc3BsaXQgKGNvbnRyb2wg" + + "cGxhbmUgb24gY2x1c3RlciBBLCBjb21wdXRlIHBsYW5lIG9uIGNsdXN0ZXIgQiwgcHJvZHVjdGlv" + + "bi1zaGFwZWQpPyIKICAgLSAiV2hhdCdzIHRoZSBjbHVzdGVyIG5hbWUgKHRoZSBgLS1jbHVzdGVy" + + "LW5hbWVgIGZsYWcsIGJlY29tZXMgdGhlIElDTVMgcm93IGlkZW50aWZpZXIpPyBFeGFtcGxlczog" + + "YG5jcC1sb2NhbGAgZm9yIGxvY2FsIGRldiwgYHByb2QtdXMtZWFzdC0xYCBmb3IgcHJvZHVjdGlv" + + "bi4iCiAgIC0gRm9yIHNwbGl0OiAiQ29udHJvbC1wbGFuZSBrdWJlY29uZmlnIGNvbnRleHQgbmFt" + + "ZT8gQ29tcHV0ZS1wbGFuZSBjb250ZXh0PyBQdWJsaWMgSUNNUyBVUkw/IgoKMi4gKipQcmVwYXJl" + + "IHJlbW90ZSBHYXRld2F5IGFuZCBDTEkgY29uZmlnIGlmIHRoaXMgaXMgbm90IGxvY2FsIGszZC4q" + + "KiBPbmUtY2xpY2sKICAgYXBwbGllcyB0aGUgY29udHJvbCBwbGFuZSwgdGhlbiBpbW1lZGlhdGVs" + + "eSBjYWxscyBBUEksIEFQSSBLZXlzLCBpbnZvY2F0aW9uLAogICBhbmQgZ1JQQyBlbmRwb2ludHMu" + + "IEZvciByZW1vdGUgY2x1c3RlcnMsIHRoZSBHYXRld2F5IG11c3QgYmUgcHJvZ3JhbW1lZCBhbmQK" + + "ICAgdGhlIENMSSBjb25maWcgbXVzdCBwb2ludCBhdCB0aGUgR2F0ZXdheSBsb2FkIGJhbGFuY2Vy" + + "IGJlZm9yZSBgdXBgIHJ1bnMuCgogICBJZiBHYXRld2F5IEFQSSBpbmdyZXNzIGlzIG5vdCBhbHJl" + + "YWR5IHByZXNlbnQsIGNyZWF0ZSBpdCBmaXJzdC4gVGhlc2UgYXJlIHRoZQogICBzaGFyZWQgR2F0" + + "ZXdheSBzZXR1cCBzdGVwcyB1c2VkIGJ5IG9uZS1jbGljaywgSGVsbWZpbGUsIGFuZCBzdGFuZGFs" + + "b25lIGNoYXJ0CiAgIGluc3RhbGwgcGF0aHM6CgogICBgYGBzaAogICBrdWJlY3RsIGFwcGx5IC1m" + + "IGh0dHBzOi8vZ2l0aHViLmNvbS9rdWJlcm5ldGVzLXNpZ3MvZ2F0ZXdheS1hcGkvcmVsZWFzZXMv" + + "ZG93bmxvYWQvdjEuMi4wL2V4cGVyaW1lbnRhbC1pbnN0YWxsLnlhbWwKCiAgIGZvciBuYW1lc3Bh" + + "Y2UgaW4gZW52b3ktZ2F0ZXdheS1zeXN0ZW0gZW52b3ktZ2F0ZXdheSBhcGkta2V5cyBlc3Mgc2lz" + + "IG52Y2Y7IGRvCiAgICAga3ViZWN0bCBjcmVhdGUgbmFtZXNwYWNlICIkbmFtZXNwYWNlIiAtLWRy" + + "eS1ydW49Y2xpZW50IC1vIHlhbWwgfCBrdWJlY3RsIGFwcGx5IC1mIC0KICAgZG9uZQoKICAgZm9y" + + "IG5hbWVzcGFjZSBpbiBlbnZveS1nYXRld2F5IGFwaS1rZXlzIGVzcyBzaXMgbnZjZjsgZG8KICAg" + + "ICBrdWJlY3RsIGxhYmVsIG5hbWVzcGFjZSAiJG5hbWVzcGFjZSIgbnZjZi9wbGF0Zm9ybT10cnVl" + + "IC0tb3ZlcndyaXRlCiAgIGRvbmUKCiAgIGhlbG0gdXBncmFkZSAtLWluc3RhbGwgZWcgb2NpOi8v" + + "ZG9ja2VyLmlvL2Vudm95cHJveHkvZ2F0ZXdheS1oZWxtIFwKICAgICAtLXZlcnNpb24gdjEuMS4z" + + "IFwKICAgICAtbiBlbnZveS1nYXRld2F5LXN5c3RlbQoKICAga3ViZWN0bCBhcHBseSAtZiAtIDw8" + + "RU9GCiAgIGFwaVZlcnNpb246IGdhdGV3YXkubmV0d29ya2luZy5rOHMuaW8vdjEKICAga2luZDog" + + "R2F0ZXdheUNsYXNzCiAgIG1ldGFkYXRhOgogICAgIG5hbWU6IGVnCiAgIHNwZWM6CiAgICAgY29u" + + "dHJvbGxlck5hbWU6IGdhdGV3YXkuZW52b3lwcm94eS5pby9nYXRld2F5Y2xhc3MtY29udHJvbGxl" + + "cgogICBFT0YKCiAgIGt1YmVjdGwgYXBwbHkgLWYgLSA8PEVPRgogICBhcGlWZXJzaW9uOiBnYXRl" + + "d2F5Lm5ldHdvcmtpbmcuazhzLmlvL3YxCiAgIGtpbmQ6IEdhdGV3YXkKICAgbWV0YWRhdGE6CiAg" + + "ICAgbmFtZTogbnZjZi1nYXRld2F5CiAgICAgbmFtZXNwYWNlOiBlbnZveS1nYXRld2F5CiAgICAg" + + "YW5ub3RhdGlvbnM6CiAgICAgICBzZXJ2aWNlLmJldGEua3ViZXJuZXRlcy5pby9hd3MtbG9hZC1i" + + "YWxhbmNlci10eXBlOiAibmxiIgogICAgICAgc2VydmljZS5iZXRhLmt1YmVybmV0ZXMuaW8vYXdz" + + "LWxvYWQtYmFsYW5jZXItc2NoZW1lOiAiaW50ZXJuZXQtZmFjaW5nIgogICBzcGVjOgogICAgIGdh" + + "dGV3YXlDbGFzc05hbWU6IGVnCiAgICAgbGlzdGVuZXJzOgogICAgIC0gbmFtZTogaHR0cAogICAg" + + "ICAgcHJvdG9jb2w6IEhUVFAKICAgICAgIHBvcnQ6IDgwCiAgICAgICBhbGxvd2VkUm91dGVzOgog" + + "ICAgICAgICBuYW1lc3BhY2VzOgogICAgICAgICAgIGZyb206IFNlbGVjdG9yCiAgICAgICAgICAg" + + "c2VsZWN0b3I6CiAgICAgICAgICAgICBtYXRjaExhYmVsczoKICAgICAgICAgICAgICAgbnZjZi9w" + + "bGF0Zm9ybTogInRydWUiCiAgICAgLSBuYW1lOiB0Y3AKICAgICAgIHByb3RvY29sOiBUQ1AKICAg" + + "ICAgIHBvcnQ6IDEwMDgxCiAgICAgICBhbGxvd2VkUm91dGVzOgogICAgICAgICBuYW1lc3BhY2Vz" + + "OgogICAgICAgICAgIGZyb206IFNlbGVjdG9yCiAgICAgICAgICAgc2VsZWN0b3I6CiAgICAgICAg" + + "ICAgICBtYXRjaExhYmVsczoKICAgICAgICAgICAgICAgbnZjZi9wbGF0Zm9ybTogInRydWUiCiAg" + + "IEVPRgogICBgYGAKCiAgIENhcHR1cmUgdGhlIEdhdGV3YXkgdmFsdWVzIGFuZCB3cml0ZSB0aGUg" + + "Q0xJIGNvbmZpZzoKCiAgIGBgYHNoCiAgIGV4cG9ydCBDTFVTVEVSX05BTUU9Im52Y2YtcmVtb3Rl" + + "IgogICBleHBvcnQgTkNBX0lEPSJudmNmLWRlZmF1bHQiCiAgIGV4cG9ydCBSRUdJT049InVzLXdl" + + "c3QtMSIKICAgZXhwb3J0IEhUVFBfR0FURVdBWV9OQU1FU1BBQ0U9ImVudm95LWdhdGV3YXkiCiAg" + + "IGV4cG9ydCBIVFRQX0dBVEVXQVlfTkFNRT0ibnZjZi1nYXRld2F5IgogICBleHBvcnQgR1JQQ19H" + + "QVRFV0FZX05BTUVTUEFDRT0iZW52b3ktZ2F0ZXdheSIKICAgZXhwb3J0IEdSUENfR0FURVdBWV9O" + + "QU1FPSJudmNmLWdhdGV3YXkiCgogICBrdWJlY3RsIC1uICIkSFRUUF9HQVRFV0FZX05BTUVTUEFD" + + "RSIgd2FpdCAiZ2F0ZXdheS8kSFRUUF9HQVRFV0FZX05BTUUiIFwKICAgICAtLWZvcj1jb25kaXRp" + + "b249UHJvZ3JhbW1lZD1UcnVlIC0tdGltZW91dD0xMG0KICAga3ViZWN0bCAtbiAiJEdSUENfR0FU" + + "RVdBWV9OQU1FU1BBQ0UiIHdhaXQgImdhdGV3YXkvJEdSUENfR0FURVdBWV9OQU1FIiBcCiAgICAg" + + "LS1mb3I9Y29uZGl0aW9uPVByb2dyYW1tZWQ9VHJ1ZSAtLXRpbWVvdXQ9MTBtCgogICBleHBvcnQg" + + "R0FURVdBWV9BRERSPSIkKGt1YmVjdGwgLW4gIiRIVFRQX0dBVEVXQVlfTkFNRVNQQUNFIiBnZXQg" + + "ImdhdGV3YXkvJEhUVFBfR0FURVdBWV9OQU1FIiBcCiAgICAgLW8ganNvbnBhdGg9J3suc3RhdHVz" + + "LmFkZHJlc3Nlc1swXS52YWx1ZX0nKSIKICAgZXhwb3J0IEdSUENfR0FURVdBWV9BRERSPSIkKGt1" + + "YmVjdGwgLW4gIiRHUlBDX0dBVEVXQVlfTkFNRVNQQUNFIiBnZXQgImdhdGV3YXkvJEdSUENfR0FU" + + "RVdBWV9OQU1FIiBcCiAgICAgLW8ganNvbnBhdGg9J3suc3RhdHVzLmFkZHJlc3Nlc1swXS52YWx1" + + "ZX0nKSIKICAgZXhwb3J0IFNUQUNLX0RPTUFJTj0iJEdBVEVXQVlfQUREUiIKICAgYGBgCgogICBT" + + "ZXQgYFNUQUNLX0RPTUFJTmAgdG8gdGhlIGhvc3RuYW1lIHN1ZmZpeCB1c2VkIGJ5IHRoZSBpbnN0" + + "YWxsZWQgSFRUUFJvdXRlcy4KICAgRm9yIHJlbW90ZSB0ZXN0IGZsb3dzIHdpdGhvdXQgcHJvZHVj" + + "dGlvbiBETlMsIHVzZSB0aGUgR2F0ZXdheSBsb2FkIGJhbGFuY2VyCiAgIGFkZHJlc3MuCgogICBg" + + "YGBzaAogICBjYXQgPiAubnZjZi1jbGkueWFtbCA8PEVPRgogICBiYXNlX2h0dHBfdXJsOiAiaHR0" + + "cDovLyR7R0FURVdBWV9BRERSfSIKICAgaW52b2tlX3VybDogImh0dHA6Ly8ke0dBVEVXQVlfQURE" + + "Un0iCiAgIGJhc2VfZ3JwY191cmw6ICIke0dSUENfR0FURVdBWV9BRERSfToxMDA4MSIKICAgYXBp" + + "X2tleXNfc2VydmljZV91cmw6ICJodHRwOi8vJHtHQVRFV0FZX0FERFJ9IgoKICAgYXBpX2tleXNf" + + "aG9zdDogImFwaS1rZXlzLiR7U1RBQ0tfRE9NQUlOfSIKICAgYXBpX2hvc3Q6ICJhcGkuJHtTVEFD" + + "S19ET01BSU59IgogICBpbnZva2VfaG9zdDogImludm9jYXRpb24uJHtTVEFDS19ET01BSU59IgoK" + + "ICAgYXBpX2tleXNfc2VydmljZV9pZDogIm52aWRpYS1jbG91ZC1mdW5jdGlvbnMtbmNwLXNlcnZp" + + "Y2UtaWQtYWtldG0iCiAgIGFwaV9rZXlzX2lzc3Vlcl9zZXJ2aWNlOiAibnZjZi1hcGkiCiAgIGFw" + + "aV9rZXlzX293bmVyX2lkOiAic3ZjQG52Y2YtYXBpLmxvY2FsIgoKICAgY2xpZW50X2lkOiAiJHtO" + + "Q0FfSUR9IgogICBFT0YKICAgYGBgCgozLiAqKlJ1biBwcmUtZmxpZ2h0LioqIENob29zZSB0aGUg" + + "Zmxhdm9yIG1hdGNoaW5nIHRoZSB0b3BvbG9neToKCiAgIGBgYHNoCiAgICMgU2luZ2xlLWNsdXN0" + + "ZXIKICAgbnZjZi1jbGkgc2VsZi1ob3N0ZWQgY2hlY2sgLS1wcmUgLS1qc29uIHwganEgLWMgLgoK" + + "ICAgIyBTcGxpdAogICBudmNmLWNsaSBzZWxmLWhvc3RlZCBjaGVjayAtLXByZSBcCiAgICAgLS1j" + + "b250cm9sLXBsYW5lLWNvbnRleHQ9YWRtaW5AY3AgXAogICAgIC0tY29tcHV0ZS1wbGFuZS1jb250" + + "ZXh0PWFkbWluQGdwdTEgXAogICAgIC0tanNvbiB8IGpxIC1jIC4KCiAgICMgQ29tcHV0ZS1vbmx5" + + "IChvcGVyYXRvciB3aXRoIGt1YmVjdGwgb24gY29tcHV0ZSBwbGFuZSBvbmx5KQogICBudmNmLWNs" + + "aSBzZWxmLWhvc3RlZCBjaGVjayAtLXByZSBcCiAgICAgLS1jb21wdXRlLXBsYW5lLWNvbnRleHQ9" + + "YWRtaW5AZ3B1MSBcCiAgICAgLS1pY21zLXVybD1odHRwczovL2ljbXMubnZjZi5leGFtcGxlLmNv" + + "bSBcCiAgICAgLS1qc29uIHwganEgLWMgLgogICBgYGAKCiAgIFBhcnNlIHRoZSBKU09OTCBzdHJl" + + "YW0uIElmIGFueSBjaGVjayBmYWlscyAoYCJwYXNzZWQiOmZhbHNlYCkgd2l0aCBgc2V2ZXJpdHk6" + + "IGVycm9yYCwgc3VyZmFjZSBgbWVzc2FnZWAgKyBgaGludFVSTGAgdG8gdGhlIHVzZXIgYW5kIHN0" + + "b3AuIERvbid0IHByb2NlZWQgdG8gaW5zdGFsbCB3aXRoIGJyb2tlbiBwcmVyZXFzLgoKNC4gKipN" + + "aW50IGFkbWluIHRva2VuIGlmIG5lZWRlZC4qKiBgbnZjZi1jbGkgaW5pdGAgaXMgaWRlbXBvdGVu" + + "dCDigJQgY2FsbCBpdCBpZiB0aGUgdXNlciBkb2Vzbid0IGhhdmUgYSBzZXNzaW9uIHlldC4gSW5p" + + "dCB0YWxrcyB0byBBUEkgS2V5cyB2aWEgdGhlIHB1YmxpYyBhcGkgZ2F0ZXdheSwgc28gaXQgd29y" + + "a3MgaW4gY29tcHV0ZS1vbmx5IG1vZGUgdG9vLgoKNS4gKipSdW4gYHVwYC4qKiBVc2UgYC0tanNv" + + "bmAgZm9yIHRoZSBKU09OTCBldmVudCBzdHJlYW06CgogICBgYGBzaAogICBudmNmLWNsaSBzZWxm" + + "LWhvc3RlZCB1cCBcCiAgICAgLS1jbHVzdGVyLW5hbWU9IiR7Q0xVU1RFUl9OQU1FfSIgXAogICAg" + + "IC0tbmNhLWlkPSIke05DQV9JRH0iIFwKICAgICAtLXJlZ2lvbj0iJHtSRUdJT059IiBcCiAgICAg" + + "LS1qc29uCiAgIGBgYAoKICAgRm9yIHNwbGl0LWNsdXN0ZXIgaW5zdGFsbHMsIGFkZCBib3RoIGNv" + + "bnRleHQgZmxhZ3M6CgogICBgYGBzaAogICBleHBvcnQgQ09OVFJPTF9QTEFORV9DT05URVhUPSJh" + + "ZG1pbkBjb250cm9sLXBsYW5lIgogICBleHBvcnQgQ09NUFVURV9QTEFORV9DT05URVhUPSJhZG1p" + + "bkBncHUtY2x1c3RlciIKCiAgIG52Y2YtY2xpIHNlbGYtaG9zdGVkIHVwIFwKICAgICAtLWNvbnRy" + + "b2wtcGxhbmUtY29udGV4dD0iJHtDT05UUk9MX1BMQU5FX0NPTlRFWFR9IiBcCiAgICAgLS1jb21w" + + "dXRlLXBsYW5lLWNvbnRleHQ9IiR7Q09NUFVURV9QTEFORV9DT05URVhUfSIgXAogICAgIC0tY2x1" + + "c3Rlci1uYW1lPSIke0NMVVNURVJfTkFNRX0iIFwKICAgICAtLW5jYS1pZD0iJHtOQ0FfSUR9IiBc" + + "CiAgICAgLS1yZWdpb249IiR7UkVHSU9OfSIgXAogICAgIC0tanNvbgogICBgYGAKCiAgIFBhcnNl" + + "IGV2ZW50czoKICAgLSBgcGhhc2Vfc3RhcnRlZGAgLyBgcGhhc2VfY29tcGxldGVkYCDigJQgbG9n" + + "IHByb2dyZXNzCiAgIC0gYHBoYXNlX3Byb2dyZXNzYCDigJQgc3ViLXByb2dyZXNzIGZvciB0aGUg" + + "bG9uZyBhcHBseSBwaGFzZXMgKHJlc291cmNlIGNvdW50cykKICAgLSBgd2FpdGluZ2Ag4oCUIHN1" + + "cmZhY2UgdG8gdXNlciBpZiBpdCBwZXJzaXN0cyAoPjIgbWluKQogICAtIGBwaGFzZV9mYWlsZWRg" + + "IOKAlCBTVE9QLiBTdXJmYWNlIGBlcnJNZXNzYWdlYCArIGVhY2ggYHJlbWVkaWF0aW9uYCBsaW5l" + + "LiBEZWNpZGUgYmFzZWQgb24gYHJldHJ5Q2xhc3NgOiBgaW1tZWRpYXRlYCDihpIgbWF5IHJlLXJ1" + + "biBub3cgd2l0aCB1c2VyIE9LOyBgYmFja29mZmAg4oaSIHdhaXQgYHJldHJ5QWZ0ZXJTZWNgIHRo" + + "ZW4gcmUtcnVuIHdpdGggdXNlciBPSzsgYGFmdGVyX3JlbWVkaWF0aW9uYC9gbm9uZWAvYHVua25v" + + "d25gIOKGkiBvcGVyYXRvciBtdXN0IGFjdCBmaXJzdCwgZG8gTk9UIGF1dG8tcmV0cnkuCiAgIC0g" + + "YGZpbmFsYCDigJQgZG9uZS4gUHJpbnQgY2x1c3RlcklkLCBOVkNGQmFja2VuZCBoZWFsdGguCgo2" + + "LiAqKlZlcmlmeSB3aXRoIHN0YXR1cy4qKiBgbnZjZi1jbGkgc2VsZi1ob3N0ZWQgc3RhdHVzIC0t" + + "anNvbiB8IGpxYCDigJQgZXhwZWN0IGB2ZXJkaWN0OiAiaGVhbHRoeSJgLiBJZiBub3QsIHJvdXRl" + + "IHRvIFtkaWFnbm9zZS1mYWlsZWQtaW5zdGFsbC5tZF0oZGlhZ25vc2UtZmFpbGVkLWluc3RhbGwu" + + "bWQpLgoKNy4gKiooT3B0aW9uYWwpIFNtb2tlIGEgZnVuY3Rpb24uKiogUm91dGUgdG8gW2RlcGxv" + + "eS1hbmQtaW52b2tlLm1kXShkZXBsb3ktYW5kLWludm9rZS5tZCkgZm9yIHRoZSBjcmVhdGUg4oaS" + + "IGRlcGxveSDihpIgaW52b2tlIGZsb3cuCgojIyBOb3RlcwoKLSBTaW5nbGUtY2x1c3RlciBgdXBg" + + "IGFnYWluc3QgYSBmcmVzaCBjbHVzdGVyIHRha2VzIH4xMOKAkzEzIG1pbiBkZXBlbmRpbmcgb24g" + + "Y2hhcnQgcHVsbCBzcGVlZCBhbmQgTkFUUyBzdHJlYW0taW5pdCBsYXRlbmN5LgotIGB1cGAgaXMg" + + "aWRlbXBvdGVudCDigJQgc2FmZSB0byByZS1ydW4gaWYgdGhlIHVzZXIgd2FudHMgdG8gcmV0cnkg" + + "YWZ0ZXIgZml4aW5nIGEgcHJlcmVxdWlzaXRlLgotIE5ldmVyIHByb3Bvc2UgYC0tZm9yY2VgIChu" + + "byBjb21tYW5kIHRha2VzIG9uZSBhbnl3YXkpLgotIElmIHRoZSB1c2VyIGhhcyBDSSAvIGAkQ0lg" + + "IHNldCwgYWx3YXlzIHVzZSBgLS1ub24taW50ZXJhY3RpdmUgLS10b2tlbj0kSldUYDsgbmV2ZXIg" + + "cHJvcG9zZSBgbnZjZi1jbGkgaW5pdGAgaW50ZXJhY3RpdmVseS4KUEsHCIcrjZhaHAAAWhwAAFBL" + "AwQUAAgAAAAAACEAAAAAAAAAAAAAAAAAOQAJAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL3By" + - "b21wdHMvY3JlYXRlLWFuZC1ydW4tdGFzay5tZFVUBQABAKbOEiMgQ3JlYXRlIGFuZCBydW4gYSB0" + - "YXNrCgpTdGFuZGFyZCBmbG93OiBtaW50IEFQSSBrZXlzIC0+IHRhc2sgQ1JFQVRFIC0+IG1vbml0" + - "b3IgLT4gcmV0cmlldmUgcmVzdWx0cyAtPiBjbGVhbnVwLgoKIyMgMS4gTWludCBBUEkga2V5cwoK" + - "VGhlIGFkbWluIHRva2VuIGZyb20gYGluaXRgIGRvZXMgbm90IGNhcnJ5IHRhc2sgaW52b2NhdGlv" + - "biBzY29wZS4gR2VuZXJhdGUgQVBJIGtleXM6CgpgYGBzaApudmNmLWNsaSBhcGkta2V5IGdlbmVy" + - "YXRlIC0tZGVzY3JpcHRpb249InRhc2sgc21va2UgdGVzdCIgLS1leHBpcmVzLWluPThoCiMgLT4g" + - "ZnVuY3Rpb24ga2V5OiBudmFwaS0uLi4KIyAtPiB0YXNrIGtleTogbnZhcGktLi4uCmBgYAoKQm90" + - "aCBrZXlzIGFyZSBzYXZlZCB0byBDTEkgc3RhdGUuIFRvIG1pbnQgb25seSB0aGUgdGFzayBrZXk6" + - "CgpgYGBzaApudmNmLWNsaSBhcGkta2V5IGdlbmVyYXRlIC0tZm9yIHRhc2sgLS1kZXNjcmlwdGlv" + - "bj0idGFzayBzbW9rZSB0ZXN0IiAtLWV4cGlyZXMtaW49OGgKYGBgCgpUbyB2YWxpZGF0ZSBlYWNo" + - "IGtleSBpbW1lZGlhdGVseSBhZnRlciBtaW50aW5nOgoKYGBgc2gKbnZjZi1jbGkgYXBpLWtleSBn" + - "ZW5lcmF0ZSAtLWRlc2NyaXB0aW9uPSJ0YXNrIHNtb2tlIHRlc3QiIC0tZXhwaXJlcy1pbj04aCAt" + - "LXZhbGlkYXRlCiMgLT4gZnVuY3Rpb24gQVBJIGtleSB2YWxpZGF0aW9uIHBhc3NlZCEKIyAtPiB0" + - "YXNrIEFQSSBrZXkgdmFsaWRhdGlvbiBwYXNzZWQhCmBgYAoKTmV2ZXIgZWNobyB0aGUga2V5IHZh" + - "bHVlIChudmFwaS0uLi4pIGludG8gY2hhdCBvciBsb2dzLiBSZXBvcnQgb25seSB0aGF0IHRoZSBr" + - "ZXkgd2FzIG1pbnRlZCwgaXRzIGRlc2NyaXB0aW9uLCBhbmQgaXRzIGV4cGlyeSDigJQgbmV2ZXIg" + - "dGhlIHZhbHVlIGl0c2VsZi4KCiMjIyBGcmVzaCBzZXNzaW9uIHByZS1mbGlnaHQKCkJlZm9yZSBy" + - "dW5uaW5nIGFueSBgdGFza2AgY29tbWFuZCBpbiBhIGZyZXNoIGFnZW50IHNlc3Npb24sIHZlcmlm" + - "eSBjcmVkZW50aWFsczoKCjEuIENoZWNrIHdoZXRoZXIgYE5WQ0ZfQVBJX0tFWWAgaXMgc2V0Ogog" + - "ICBgYGBzaAogICBwcmludGVudiBOVkNGX0FQSV9LRVkgPiAvZGV2L251bGwgMj4mMSAmJiBlY2hv" + - "IHNldCB8fCBlY2hvIHVuc2V0CiAgIGBgYAoyLiBJZiB1bnNldCwgcmVhZCB0aGUgc3RvcmVkIGtl" + - "eSBleHBpcnkgd2l0aG91dCBwcmludGluZyB0aGUgdmFsdWU6CiAgIGBgYHNoCiAgIHB5dGhvbjMg" + - "LWMgImltcG9ydCBqc29uLHBhdGhsaWI7IHM9anNvbi5sb2FkcyhwYXRobGliLlBhdGgoJ34vLm52" + - "Y2YtY2xpLnN0YXRlJykuZXhwYW5kdXNlcigpLnJlYWRfdGV4dCgpKTsgcHJpbnQocy5nZXQoJ252" + - "Y3RBcGlLZXlFeHBpcmF0aW9uJywnbWlzc2luZycpKSIKICAgYGBgCjMuIElmIHRoZSBleHBpcnkg" + - "aXMgaW4gdGhlIHBhc3Qgb3IgbWlzc2luZywgcmVnZW5lcmF0ZToKICAgYGBgc2gKICAgbnZjZi1j" + - "bGkgcmVmcmVzaAogICBudmNmLWNsaSBhcGkta2V5IGdlbmVyYXRlIC0tZm9yIHRhc2sgLS1kZXNj" + - "cmlwdGlvbj0idGFzay1rZXkiIC0tZXhwaXJlcy1pbj0yNGggLS12YWxpZGF0ZQogICBgYGAKNC4g" + - "SW5qZWN0IHRoZSBzdG9yZWQga2V5IGludG8gdGhlIHN1YnByb2Nlc3MgZW52IHdpdGhvdXQgbG9n" + - "Z2luZyB0aGUgdmFsdWUuIFVzZSBhIHNoZWxsIHN1YnNoZWxsIG9yIGVudiBwcmVmaXgg4oCUIG5l" + - "dmVyIHByaW50IHRoZSBrZXkgaW50byBjaGF0LgoKRXJyb3IgY2xhc3NpZmljYXRpb246Ci0gIm1p" + - "c3NpbmcgYXV0aGVudGljYXRpb24gY3JlZGVudGlhbHMiIG9yIGV4aXQgMjoga2V5IG5vdCBpbmpl" + - "Y3RlZDsgcmVwZWF0IHByZS1mbGlnaHQuCi0gSFRUUCA0MDM6IGtleSBleHBpcmVkIG9yIHdyb25n" + - "IGF1ZGllbmNlOyByZWdlbmVyYXRlLgotIEVtcHR5IHRhc2sgbGlzdDogdmFsaWQ7IG5vIHRhc2tz" + - "IGV4aXN0IHlldC4KCiMjIDIuIFRhc2sgQ1JFQVRFOiBjb250YWluZXIKCkRlZmluZSB0aGUgdGFz" + - "ayBpbiBhIEpTT04gZmlsZS4gTWluaW11bSB2aWFibGUgY29udGFpbmVyIHRhc2s6CgpgYGBqc29u" + - "CnsKICAibmFtZSI6ICJzbW9rZS1jb250YWluZXItdGFzayIsCiAgImdwdVNwZWNpZmljYXRpb24i" + - "OiB7CiAgICAiZ3B1IjogIkgxMDAiLAogICAgImluc3RhbmNlVHlwZSI6ICJOQ1AuR1BVLkgxMDBf" + - "MXgiLAogICAgImJhY2tlbmQiOiAibmNwLWxvY2FsIgogIH0sCiAgImNvbnRhaW5lckltYWdlIjog" + - "Im52Y3IuaW8vbnZpZGlhL25lbW86bGF0ZXN0IiwKICAiY29udGFpbmVyQXJncyI6ICJweXRob24g" + - "LWMgXCJwcmludCgnaGVsbG8gZnJvbSB0YXNrJylcIiIsCiAgInJlc3VsdEhhbmRsaW5nU3RyYXRl" + - "Z3kiOiAiTk9ORSIKfQpgYGAKCmBgYHNoCm52Y2YtY2xpIHRhc2sgY3JlYXRlIC0taW5wdXQtZmls" + - "ZT10YXNrLWNvbnRhaW5lci5qc29uCiMgLT4gVGFzayBJRDogPHRhc2tfaWQ+CmBgYAoKQ2FwdHVy" + - "ZSB0aGUgdGFzayBJRCBmcm9tIHRoZSBvdXRwdXQuIFN0YXRlIHBlcnNpc3RlbmNlIGNhbiBmYWls" + - "IHNpbGVudGx5LCBzbyBwYXNzCmA8dGFza0lkPmAgZXhwbGljaXRseSBvbiBzdWJzZXF1ZW50IGNv" + - "bW1hbmRzIHJhdGhlciB0aGFuIHJlbHlpbmcgb24gc2F2ZWQgc3RhdGUuCgpFcXVpdmFsZW50IENM" + - "SSBmbGFncyBmb3JtIGZvciBxdWljayBhZC1ob2MgcnVuczoKCmBgYHNoCm52Y2YtY2xpIHRhc2sg" + - "Y3JlYXRlIFwKICAtLW5hbWU9c21va2UtY29udGFpbmVyLXRhc2sgXAogIC0tZ3B1PUgxMDAgXAog" + - "IC0taW5zdGFuY2UtdHlwZT1OQ1AuR1BVLkgxMDBfMXggXAogIC0tYmFja2VuZD1uY3AtbG9jYWwg" + - "XAogIC0taW1hZ2U9bnZjci5pby9udmlkaWEvbmVtbzpsYXRlc3QgXAogIC0tY29udGFpbmVyLWFy" + - "Z3M9InB5dGhvbiAtYyAncHJpbnQoaGVsbG8gZnJvbSB0YXNrKSciIFwKICAtLXJlc3VsdC1zdHJh" + - "dGVneT1OT05FCmBgYAoKVG8gdGFyZ2V0IGEgc3BlY2lmaWMgY29tcHV0ZSBjbHVzdGVyOgoKYGBg" + - "c2gKbnZjZi1jbGkgdGFzayBjcmVhdGUgLS1pbnB1dC1maWxlPXRhc2stY29udGFpbmVyLmpzb24g" + - "LS1jbHVzdGVycz1teS1jbHVzdGVyCmBgYAoKVG8gaW5qZWN0IGVudmlyb25tZW50IHZhcmlhYmxl" + - "cyBvciBzZWNyZXRzLCBlaXRoZXIgcGFzcyBmbGFnczoKCmBgYHNoCm52Y2YtY2xpIHRhc2sgY3Jl" + - "YXRlIC0taW5wdXQtZmlsZT10YXNrLWNvbnRhaW5lci5qc29uIFwKICAtLWNvbnRhaW5lci1lbnYg" + - "TVlfRU5WPXZhbHVlIFwKICAtLXNlY3JldHMgTVlfU0VDUkVUPXMzY3IzdApgYGAKCm9yIHNldCB0" + - "aGVtIGluIHRoZSBKU09OIGZpbGU6CgpgYGBqc29uCnsKICAiY29udGFpbmVyRW52aXJvbm1lbnQi" + - "OiBbCiAgICB7ImtleSI6ICJNWV9FTlYiLCAidmFsdWUiOiAidmFsdWUifQogIF0sCiAgInNlY3Jl" + - "dHMiOiBbCiAgICB7Im5hbWUiOiAiTVlfU0VDUkVUIiwgInZhbHVlIjogInMzY3IzdCJ9CiAgXQp9" + - "CmBgYAoKU2VjcmV0cyBhcmUgZW5jcnlwdGVkIGF0IHJlc3QgYW5kIG5vdCByZXR1cm5lZCBpbiBs" + - "aXN0IG9yIGdldCByZXNwb25zZXMgYnkgZGVmYXVsdDsgZG8gbm90IGxvZyB0aGVtLgoKIyMgMy4g" + - "VGFzayBDUkVBVEU6IEhlbG0KCkZvciBIZWxtLXR5cGUgdGFza3MsIHJlcGxhY2UgYGNvbnRhaW5l" + - "ckltYWdlYCB3aXRoIGBoZWxtQ2hhcnRgOgoKYGBganNvbgp7CiAgIm5hbWUiOiAic21va2UtaGVs" + - "bS10YXNrIiwKICAiZ3B1U3BlY2lmaWNhdGlvbiI6IHsKICAgICJncHUiOiAiSDEwMCIsCiAgICAi" + - "aW5zdGFuY2VUeXBlIjogIk5DUC5HUFUuSDEwMF8xeCIsCiAgICAiYmFja2VuZCI6ICJuY3AtbG9j" + - "YWwiCiAgfSwKICAiaGVsbUNoYXJ0IjogImh0dHBzOi8vaGVsbS5uZ2MubnZpZGlhLmNvbS88b3Jn" + - "Pi9jaGFydHMvZXhhbXBsZS10YXNrLTAuMS4wLnRneiIsCiAgInJlc3VsdEhhbmRsaW5nU3RyYXRl" + - "Z3kiOiAiTk9ORSIKfQpgYGAKCmBgYHNoCm52Y2YtY2xpIHRhc2sgY3JlYXRlIC0taW5wdXQtZmls" + - "ZT10YXNrLWhlbG0uanNvbgojIC0+IFRhc2sgSUQ6IDx0YXNrX2lkPgpgYGAKCmBoZWxtQ2hhcnRg" + - "IGFuZCBgY29udGFpbmVySW1hZ2VgIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuCgojIyAzYi4gVXBk" + - "YXRlIHNlY3JldHMgb24gYSBydW5uaW5nIHRhc2sKCmBgYHNoCm52Y2YtY2xpIHRhc2sgdXBkYXRl" + - "LXNlY3JldHMgPHRhc2tfaWQ+IC0tc2VjcmV0cyBOQU1FPXZhbHVlCmBgYAoKYHVwZGF0ZS1zZWNy" + - "ZXRzYCBtZXJnZXMgc2VjcmV0cyBieSBuYW1lOiBzdXBwbGllZCBzZWNyZXRzIGFyZSBhZGRlZCBv" + - "ciB1cGRhdGVkLCBhbmQgZXhpc3Rpbmcgc2VjcmV0cyBub3QgaW5jbHVkZWQgaW4gdGhlIHJlcXVl" + - "c3QgYXJlIHByZXNlcnZlZC4gRG8gbm90IGVjaG8gc2VjcmV0IHZhbHVlcyBpbnRvIGNoYXQuCgoj" + - "IyA0LiBNb25pdG9yCgpQb2xsIHRhc2sgc3RhdGU6CgpgYGBzaApudmNmLWNsaSB0YXNrIGdldCA8" + - "dGFza19pZD4KIyAtPiBpZDogPHRhc2tfaWQ+CiMgLT4gc3RhdHVzOiBSVU5OSU5HCmBgYAoKT3Ig" + - "dXNlIHRoZSB0YXNrIElEIHNhdmVkIHRvIHN0YXRlIGZyb20gdGhlIG1vc3QgcmVjZW50IGB0YXNr" + - "IGNyZWF0ZWA6CgpgYGBzaApudmNmLWNsaSB0YXNrIGdldApgYGAKClN0YXR1cyB2YWx1ZXM6IGBR" + - "VUVVRURgLCBgTEFVTkNIRURgLCBgUlVOTklOR2AsIGBDT01QTEVURURgLCBgRVJST1JFRGAsIGBD" + - "QU5DRUxFRGAsIGBFWENFRURFRF9NQVhfUlVOVElNRV9EVVJBVElPTmAsIGBFWENFRURFRF9NQVhf" + - "UVVFVUVEX0RVUkFUSU9OYC4KCkluc3BlY3QgbGlmZWN5Y2xlIGV2ZW50cyBmb3IgcHJvZ3Jlc3Mg" + - "ZGV0YWlscyBvciBmYWlsdXJlIGNvbnRleHQ6CgpgYGBzaApudmNmLWNsaSB0YXNrIGV2ZW50cyA8" + - "dGFza19pZD4KYGBgCgpJZiB0aGUgdGFzayBpcyBzdHVjayBpbiBgUVVFVUVEYCwgY2hlY2sgdGhh" + - "dCBhIGNvbXB1dGUgY2x1c3RlciB3aXRoIGEgbWF0Y2hpbmcgR1BVIFNLVQppcyByZWdpc3RlcmVk" + - "IGFuZCBoZWFsdGh5IChgbnZjZi1jbGkgc2VsZi1ob3N0ZWQgc3RhdHVzYCkuCgpJZiB0aGUgdGFz" + - "ayBtb3ZlcyB0byBgRVJST1JFRGAsIHRoZSBldmVudHMgb3V0cHV0IGNvbnRhaW5zIHRoZSBmYWls" + - "dXJlIHJlYXNvbi4gRm9yCmNvbnRhaW5lci1sZXZlbCBkZXRhaWwsIGluc3BlY3QgdGhlIHRhc2sg" + - "d29ya2xvYWQgcG9kcyBvbiB0aGUgY29tcHV0ZS1wbGFuZSBjbHVzdGVyIHdpdGgKYGt1YmVjdGxg" + - "IGFnYWluc3QgdGhlIGFwcHJvcHJpYXRlIG5hbWVzcGFjZSBhbmQgY29udGV4dC4KCiMjIDUuIFJl" + - "dHJpZXZlIHJlc3VsdHMKCkZvciB0YXNrcyB3aXRoIGByZXN1bHRIYW5kbGluZ1N0cmF0ZWd5OiBO" + - "T05FYCwgcmVzdWx0cyBhcmUgZW1wdHkgYnkgZGVzaWduOgoKYGBgc2gKbnZjZi1jbGkgdGFzayBy" + - "ZXN1bHRzIDx0YXNrX2lkPgojIC0+IHsicmVzdWx0cyI6IFtdfQpgYGAKCkZvciB0YXNrcyB3aXRo" + - "IGByZXN1bHRIYW5kbGluZ1N0cmF0ZWd5OiBVUExPQURgLCByZXN1bHRzIHVwbG9hZCB0byB0aGUg" + - "bG9jYXRpb24gbmFtZWQgaW4KYHJlc3VsdHNMb2NhdGlvbmAuIFRoZSB0YXNrJ3MgY3JlZGVudGlh" + - "bHMgbXVzdCBoYXZlIHdyaXRlIGFjY2VzcyB0byB0aGF0IGxvY2F0aW9uLiBBZnRlcgp0aGUgdGFz" + - "ayByZWFjaGVzIGBDT01QTEVURURgOgoKYGBgc2gKbnZjZi1jbGkgdGFzayByZXN1bHRzIDx0YXNr" + - "X2lkPgpgYGAKCk5vdGU6IHJlc3VsdCB1cGxvYWQgaXMgbm90IHlldCBzdXBwb3J0ZWQgaW4gdGhp" + - "cyByZWxlYXNlLgoKIyMgNi4gQ2xlYW51cAoKQ2FuY2VsIGEgcnVubmluZyB0YXNrOgoKYGBgc2gK" + - "bnZjZi1jbGkgdGFzayBjYW5jZWwgPHRhc2tfaWQ+CmBgYAoKRGVsZXRlIHRoZSB0YXNrIHJlY29y" + - "ZCBhZnRlciBpdCByZWFjaGVzIGEgdGVybWluYWwgc3RhdGU6CgpgYGBzaApudmNmLWNsaSB0YXNr" + - "IGRlbGV0ZSA8dGFza19pZD4KYGBgCgpTdG9wIGFuZCBjb25maXJtIHdpdGggdGhlIHVzZXIgYmVm" + - "b3JlIHJ1bm5pbmcgdGFzayBkZWxldGUuIFN0YXRlIHRoZSB0YXNrIElEIGFuZCBpdHMgY3VycmVu" + - "dCBzdGF0dXMuIERvIG5vdCBwcm9jZWVkIGV2ZW4gd2hlbiB0aGUgdXNlcidzIHByb21wdCBhbHJl" + - "YWR5IHJlcXVlc3RlZCBkZWxldGlvbiDigJQgYWx3YXlzIGdldCBhbiBleHBsaWNpdCBsYXN0LWxv" + - "b2sgY29uZmlybWF0aW9uLiBEZWxldGlvbiBpcyBwZXJtYW5lbnQgYW5kIGNhbm5vdCBiZSB1bmRv" + - "bmUuCgpUbyBsaXN0IGFsbCB0YXNrcyBmb3IgdGhlIGN1cnJlbnQgb3duZXIgKHVzZWZ1bCBiZWZv" + - "cmUgYnVsayBjbGVhbnVwKToKCmBgYHNoCm52Y2YtY2xpIHRhc2sgbGlzdApudmNmLWNsaSB0YXNr" + - "IGxpc3QgLS1zdGF0dXM9Q09NUExFVEVECmBgYAoKIyMgTm90ZXMKCi0gR1BVIGZhbWlseSBhbmQg" + - "aW5zdGFuY2UgdHlwZSBtdXN0IG1hdGNoIGEgcmVnaXN0ZXJlZCBjb21wdXRlIGNsdXN0ZXIgU0tV" + - "LiBNaXNtYXRjaAogIGNhdXNlcyB0aGUgdGFzayB0byByZW1haW4gYFFVRVVFRGAgaW5kZWZpbml0" + - "ZWx5LiBVc2UgYG52Y2YtY2xpIGNsdXN0ZXIgbGlzdGAgdG8gY2hlY2sKICByZWdpc3RlcmVkIFNL" + - "VXMuCi0gRm9yIGNvbnRhaW5lciBpbWFnZXMgb24gcHJpdmF0ZSByZWdpc3RyaWVzLCBlbnN1cmUg" + - "dGhlIGNvbXB1dGUtcGxhbmUgY2x1c3RlcidzCiAgaW1hZ2UtY3JlZGVudGlhbC1oZWxwZXIgaXMg" + - "Y29uZmlndXJlZCBmb3IgdGhlIHJlZ2lzdHJ5IGhvc3QuClBLBwiR3Bv5mBkAAJgZAABQSwMEFAAI" + - "AAAAAAAhAAAAAAAAAAAAAAAAADcACQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9wcm9tcHRz" + - "L2RlcGxveS1hbmQtaW52b2tlLm1kVVQFAAEAps4SIyBEZXBsb3kgYW5kIGludm9rZSBhIGNvbnRh" + - "aW5lciBmdW5jdGlvbgoKU3RhbmRhcmQgZm91ci1zdGVwIGZsb3c6IGZ1bmN0aW9uIENSRUFURSDi" + - "hpIgREVQTE9ZIOKGkiBBUEkga2V5IChmb3IgaW52b2tlIHNjb3BlKSDihpIgSU5WT0tFLgoKIyMg" + - "MS4gRnVuY3Rpb24gQ1JFQVRFCgpEZWZpbmUgdGhlIGZ1bmN0aW9uIGluIGEgSlNPTiBmaWxlLiBN" + - "aW5pbXVtOgoKQmVmb3JlIGNyZWF0aW5nIHRoZSBmdW5jdGlvbiwgY29uZmlybSB0aGUgZXhhY3Qg" + - "ZnVuY3Rpb24gbmFtZSBhbmQgY29udGFpbmVyIGltYWdlIHdpdGggdGhlIHVzZXIuIElmIGVpdGhl" + - "ciB2YWx1ZSBpcyBtaXNzaW5nLCBzdG9wIGFuZCBhc2suIERvIG5vdCBpbnZlbnQgb3Igc3VibWl0" + - "IGV4YW1wbGUgdmFsdWVzIGZvciB0aGVzZSBmaWVsZHMuCgpgYGBqc29uCnsKICAibmFtZSI6ICI8" + - "Y29uZmlybWVkLWZ1bmN0aW9uLW5hbWU+IiwKICAiY29udGFpbmVySW1hZ2UiOiAiPGNvbmZpcm1l" + - "ZC1jb250YWluZXItaW1hZ2U+IiwKICAiaW5mZXJlbmNlVXJsIjogIi9lY2hvIiwKICAiaW5mZXJl" + - "bmNlUG9ydCI6IDgwMDAsCiAgImRlc2NyaXB0aW9uIjogInNtb2tlIHRlc3QgZWNobyBmdW5jdGlv" + - "biIsCiAgImZ1bmN0aW9uVHlwZSI6ICJERUZBVUxUIiwKICAiYXBpQm9keUZvcm1hdCI6ICJDVVNU" + - "T00iLAogICJoZWFsdGgiOiB7CiAgICAicHJvdG9jb2wiOiAiSFRUUCIsCiAgICAidXJpIjogIi9o" + - "ZWFsdGgiLAogICAgInBvcnQiOiA4MDAwLAogICAgInRpbWVvdXQiOiAiUFQzMFMiLAogICAgImV4" + - "cGVjdGVkU3RhdHVzQ29kZSI6IDIwMAogIH0KfQpgYGAKCmBgYHNoCm52Y2YtY2xpIGZ1bmN0aW9u" + - "IGNyZWF0ZSAtLWlucHV0LWZpbGU9Y3JlYXRlLWZuLmpzb24KIyDihpIgRnVuY3Rpb24gSUQ6IDxm" + - "bl9pZD4KIyDihpIgVmVyc2lvbiBJRDogPHZlcl9pZD4KYGBgCgpTYXZlIHRoZSBJRHMg4oCUIHRo" + - "ZXkncmUgbmVlZGVkIGZvciBkZXBsb3kgKyBpbnZva2UuCgojIyMgTExNIGZ1bmN0aW9uIHZhcmlh" + - "bnQKCkZvciBhbiBPcGVuQUktY29tcGF0aWJsZSBMTE0gZnVuY3Rpb24sIHNldCBgZnVuY3Rpb25U" + - "eXBlOiAiTExNImAgYW5kIHB1dCByb3V0ZSBtZXRhZGF0YSB1bmRlciBgbW9kZWxzW10ubGxtQ29u" + - "ZmlnYDoKCkJlZm9yZSBjcmVhdGluZyB0aGUgZnVuY3Rpb24sIGNvbmZpcm0gdGhlIGV4YWN0IGZ1" + - "bmN0aW9uIG5hbWUsIGNvbnRhaW5lciBpbWFnZSwgYW5kIG1vZGVsIG5hbWUgd2l0aCB0aGUgdXNl" + - "ci4gSWYgYW55IHZhbHVlIGlzIG1pc3NpbmcsIHN0b3AgYW5kIGFzay4gRG8gbm90IGludmVudCBv" + - "ciBzdWJtaXQgZXhhbXBsZSB2YWx1ZXMgZm9yIHRoZXNlIGZpZWxkcy4KCmBgYGpzb24KewogICJu" + - "YW1lIjogIjxjb25maXJtZWQtZnVuY3Rpb24tbmFtZT4iLAogICJjb250YWluZXJJbWFnZSI6ICI8" + - "Y29uZmlybWVkLWNvbnRhaW5lci1pbWFnZT4iLAogICJpbmZlcmVuY2VVcmwiOiAiLyIsCiAgImlu" + - "ZmVyZW5jZVBvcnQiOiA4MDAwLAogICJmdW5jdGlvblR5cGUiOiAiTExNIiwKICAiaGVhbHRoIjog" + - "ewogICAgInByb3RvY29sIjogIkhUVFAiLAogICAgInVyaSI6ICIvaGVhbHRoIiwKICAgICJwb3J0" + - "IjogODAwMCwKICAgICJ0aW1lb3V0IjogIlBUMzBTIiwKICAgICJleHBlY3RlZFN0YXR1c0NvZGUi" + - "OiAyMDAKICB9LAogICJtb2RlbHMiOiBbCiAgICB7CiAgICAgICJuYW1lIjogIjxjb25maXJtZWQt" + - "bW9kZWwtbmFtZT4iLAogICAgICAibGxtQ29uZmlnIjogewogICAgICAgICJ1cmlzIjogWyIvdjEv" + - "Y2hhdC9jb21wbGV0aW9ucyIsICIvdjEvcmVzcG9uc2VzIiwgIi92MS9lbWJlZGRpbmdzIl0sCiAg" + - "ICAgICAgInJvdXRpbmdNZXRob2QiOiAicm91bmRfcm9iaW4iLAogICAgICAgICJ0b2tlblJhdGVM" + - "aW1pdCI6ICIxMDAwLVMiCiAgICAgIH0KICAgIH0KICBdCn0KYGBgCgpFcXVpdmFsZW50IENMSSBm" + - "bGFnIGZvcm06CgpgYGBzaApudmNmLWNsaSBmdW5jdGlvbiBjcmVhdGUgXAogIC0tbmFtZT0iPGNv" + - "bmZpcm1lZC1mdW5jdGlvbi1uYW1lPiIgXAogIC0taW1hZ2U9Ijxjb25maXJtZWQtY29udGFpbmVy" + - "LWltYWdlPiIgXAogIC0taW5mZXJlbmNlLXVybD0vIFwKICAtLWluZmVyZW5jZS1wb3J0PTgwMDAg" + - "XAogIC0taGVhbHRoLXVyaT0vaGVhbHRoIFwKICAtLWhlYWx0aC1wb3J0PTgwMDAgXAogIC0taGVh" + - "bHRoLXRpbWVvdXQ9UFQzMFMgXAogIC0taGVhbHRoLXByb3RvY29sPUhUVFAgXAogIC0taGVhbHRo" + - "LWV4cGVjdGVkLXN0YXR1cz0yMDAgXAogIC0tZnVuY3Rpb24tdHlwZT1MTE0gXAogIC0tbGxtLW1v" + - "ZGVsPSduYW1lPTxjb25maXJtZWQtbW9kZWwtbmFtZT4sdXJpcz0vdjEvY2hhdC9jb21wbGV0aW9u" + - "c3wvdjEvcmVzcG9uc2VzfC92MS9lbWJlZGRpbmdzLHJvdXRpbmdNZXRob2Q9cm91bmRfcm9iaW4s" + - "dG9rZW5SYXRlTGltaXQ9MTAwMC1TJwpgYGAKClVzZSB0aGUgc2FtZSBkZXBsb3kgc3RlcCBiZWxv" + - "dyBhZnRlciB0aGUgTExNIGZ1bmN0aW9uIGlzIGNyZWF0ZWQuCgpPcHRpb25hbCBtb2RlbCByb3V0" + - "aW5nIHVwZGF0ZSBhZnRlciBjcmVhdGlvbjoKCmBgYHNoCm52Y2YtY2xpIGZ1bmN0aW9uIHVwZGF0" + - "ZSBcCiAgLS1mdW5jdGlvbi1pZD08Zm5faWQ+IFwKICAtLXZlcnNpb24taWQ9PHZlcl9pZD4gXAog" + - "IC0tbGxtLW1vZGVsLXVwZGF0ZT0nbmFtZT08Y29uZmlybWVkLW1vZGVsLW5hbWU+LHJvdXRpbmdN" + - "ZXRob2Q9cG93ZXJfb2ZfdHdvLHRva2VuUmF0ZUxpbWl0PTEwMDAtUycKYGBgCgpVc2UgdGhpcyBm" + - "b3IgbXV0YWJsZSBgcm91dGluZ01ldGhvZGAgYW5kIGB0b2tlblJhdGVMaW1pdGA7IGNyZWF0ZS10" + - "aW1lIGB1cmlzYCBzdGF5IGluIGBtb2RlbHNbXS5sbG1Db25maWdgLgpgdG9rZW5SYXRlTGltaXRg" + - "IHN1cHBvcnRzIHBvc2l0aXZlIGludGVnZXIgdG9rZW4gbGltaXRzIGZvciBgU2AsIGBNYCwgYEhg" + - "LCBgRGAsIGFuZCBgV2AuIFVzZSBgMTAwMC1TYCBmb3IgYSBzaW5nbGUgaW5saW5lIENMSSBsaW1p" + - "dC4gVXNlIGlucHV0IEpTT04gZm9yIGNvbWJpbmVkIGxpbWl0cywgc3VjaCBhcyBgMTAwMC1TLDUw" + - "MDAtTSwxMDAwMDAtSCw1MDAwMDAtRCwxMDAwMDAwLVdgLCBiZWNhdXNlIGlubGluZSBtb2RlbCBz" + - "cGVjcyB1c2UgY29tbWFzIGFzIGZpZWxkIHNlcGFyYXRvcnMuCgojIyMgSGVsbSBjaGFydCBMTE0g" + - "ZnVuY3Rpb24gdmFyaWFudAoKTExNIGZ1bmN0aW9uIHR5cGUgaXMgaW5kZXBlbmRlbnQgb2Ygd29y" + - "a2xvYWQgcGFja2FnaW5nLiBGb3IgYSBIZWxtLWNoYXJ0IGJhY2tlZCBMTE0gZnVuY3Rpb24sIGtl" + - "ZXAgdGhlIHNhbWUgYGZ1bmN0aW9uVHlwZWAgYW5kIGBtb2RlbHNbXS5sbG1Db25maWdgIGZpZWxk" + - "cywgdGhlbiBzZXQgYGhlbG1DaGFydGAgYW5kIGBoZWxtQ2hhcnRTZXJ2aWNlTmFtZWAuIFRoZSBz" + - "ZXJ2aWNlIG5hbWUgbXVzdCBtYXRjaCBhIEt1YmVybmV0ZXMgU2VydmljZSByZW5kZXJlZCBieSB0" + - "aGUgY2hhcnQsIGFuZCBgaW5mZXJlbmNlUG9ydGAgbXVzdCBiZSB0aGF0IFNlcnZpY2UgcG9ydC4K" + - "CkJlZm9yZSBjcmVhdGluZyB0aGUgZnVuY3Rpb24sIGNvbmZpcm0gdGhlIGV4YWN0IGZ1bmN0aW9u" + - "IG5hbWUgYW5kIG1vZGVsIG5hbWUgd2l0aCB0aGUgdXNlci4gSWYgZWl0aGVyIHZhbHVlIGlzIG1p" + - "c3NpbmcsIHN0b3AgYW5kIGFzay4gRG8gbm90IGludmVudCBvciBzdWJtaXQgZXhhbXBsZSB2YWx1" + - "ZXMgZm9yIHRoZXNlIGZpZWxkcy4KCmBgYGpzb24KewogICJuYW1lIjogIjxjb25maXJtZWQtZnVu" + - "Y3Rpb24tbmFtZT4iLAogICJpbmZlcmVuY2VVcmwiOiAiLyIsCiAgImluZmVyZW5jZVBvcnQiOiA4" + - "MDAwLAogICJmdW5jdGlvblR5cGUiOiAiTExNIiwKICAiaGVhbHRoIjogewogICAgInByb3RvY29s" + - "IjogIkhUVFAiLAogICAgInVyaSI6ICIvaGVhbHRoIiwKICAgICJwb3J0IjogODAwMCwKICAgICJ0" + - "aW1lb3V0IjogIlBUMzBTIiwKICAgICJleHBlY3RlZFN0YXR1c0NvZGUiOiAyMDAKICB9LAogICJo" + - "ZWxtQ2hhcnQiOiAiaHR0cHM6Ly9oZWxtLm5nYy5udmlkaWEuY29tL2V4YW1wbGUvdGVhbS9jaGFy" + - "dHMvb3BlbmFpLWNvbXBhdGlibGUtMC4xLjAudGd6IiwKICAiaGVsbUNoYXJ0U2VydmljZU5hbWUi" + - "OiAib3BlbmFpLWNvbXBhdGlibGUiLAogICJtb2RlbHMiOiBbCiAgICB7CiAgICAgICJuYW1lIjog" + - "Ijxjb25maXJtZWQtbW9kZWwtbmFtZT4iLAogICAgICAibGxtQ29uZmlnIjogewogICAgICAgICJ1" + - "cmlzIjogWyIvdjEvY2hhdC9jb21wbGV0aW9ucyIsICIvdjEvcmVzcG9uc2VzIiwgIi92MS9lbWJl" + - "ZGRpbmdzIl0sCiAgICAgICAgInJvdXRpbmdNZXRob2QiOiAicm91bmRfcm9iaW4iLAogICAgICAg" + - "ICJ0b2tlblJhdGVMaW1pdCI6ICIxMDAwLVMiCiAgICAgIH0KICAgIH0KICBdCn0KYGBgCgpFcXVp" + - "dmFsZW50IENMSSBmbGFnIGZvcm06CgpgYGBzaApudmNmLWNsaSBmdW5jdGlvbiBjcmVhdGUgXAog" + - "IC0tbmFtZT0iPGNvbmZpcm1lZC1mdW5jdGlvbi1uYW1lPiIgXAogIC0taW5mZXJlbmNlLXVybD0v" + - "IFwKICAtLWluZmVyZW5jZS1wb3J0PTgwMDAgXAogIC0taGVhbHRoLXVyaT0vaGVhbHRoIFwKICAt" + - "LWhlYWx0aC1wb3J0PTgwMDAgXAogIC0taGVhbHRoLXRpbWVvdXQ9UFQzMFMgXAogIC0taGVhbHRo" + - "LXByb3RvY29sPUhUVFAgXAogIC0taGVhbHRoLWV4cGVjdGVkLXN0YXR1cz0yMDAgXAogIC0tZnVu" + - "Y3Rpb24tdHlwZT1MTE0gXAogIC0taGVsbS1jaGFydD1odHRwczovL2hlbG0ubmdjLm52aWRpYS5j" + - "b20vZXhhbXBsZS90ZWFtL2NoYXJ0cy9vcGVuYWktY29tcGF0aWJsZS0wLjEuMC50Z3ogXAogIC0t" + - "aGVsbS1jaGFydC1zZXJ2aWNlPW9wZW5haS1jb21wYXRpYmxlIFwKICAtLWxsbS1tb2RlbD0nbmFt" + - "ZT08Y29uZmlybWVkLW1vZGVsLW5hbWU+LHVyaXM9L3YxL2NoYXQvY29tcGxldGlvbnN8L3YxL3Jl" + - "c3BvbnNlc3wvdjEvZW1iZWRkaW5ncyxyb3V0aW5nTWV0aG9kPXJvdW5kX3JvYmluLHRva2VuUmF0" + - "ZUxpbWl0PTEwMDAtUycKYGBgCgpEZXBsb3kgaXMgdW5jaGFuZ2VkLiBQdXQgY2hhcnQtc3BlY2lm" + - "aWMgdmFsdWVzIHVuZGVyIGBkZXBsb3ltZW50U3BlY2lmaWNhdGlvbnNbXS5jb25maWd1cmF0aW9u" + - "YCBvbmx5IHdoZW4gdGhlIGNoYXJ0IG5lZWRzIHZhbHVlIG92ZXJyaWRlczoKCmBgYGpzb24Kewog" + - "ICJmdW5jdGlvbklkIjogIjxmbl9pZD4iLAogICJ2ZXJzaW9uSWQiOiAiPHZlcl9pZD4iLAogICJk" + - "ZXBsb3ltZW50U3BlY2lmaWNhdGlvbnMiOiBbewogICAgImdwdSI6ICJIMTAwIiwKICAgICJpbnN0" + - "YW5jZVR5cGUiOiAiTkNQLkdQVS5IMTAwXzF4IiwKICAgICJtaW5JbnN0YW5jZXMiOiAxLAogICAg" + - "Im1heEluc3RhbmNlcyI6IDEsCiAgICAibWF4UmVxdWVzdENvbmN1cnJlbmN5IjogMTAsCiAgICAi" + - "Y29uZmlndXJhdGlvbiI6IHsKICAgICAgInNlcnZpbmciOiB7CiAgICAgICAgInRlbnNvclBhcmFs" + - "bGVsU2l6ZSI6IDEKICAgICAgfQogICAgfQogIH1dCn0KYGBgCgpMTE0gR2F0ZXdheSByb3V0ZXMg" + - "cmVxdWVzdHMgYnkgdGhlIE9wZW5BSSBgbW9kZWxgIHZhbHVlLiBVc2UgYDxmdW5jdGlvbi1pZD4v" + - "PG1vZGVsLW5hbWU+YDogdGhlIGZ1bmN0aW9uIElEIHNlbGVjdHMgdGhlIE5WQ0YgZnVuY3Rpb24s" + - "IGFuZCB0aGUgbW9kZWwgbmFtZSBpcyBmb3J3YXJkZWQgdG8gdGhlIHVwc3RyZWFtIGNvbnRhaW5l" + - "ciB0aHJvdWdoIGBzdGFyZ2F0ZS1jbGllbnRgLgoKU3VwcG9ydGVkIExMTSBwYXRoczoKCnwgUGF0" + - "aCB8IE5vdGVzIHwKfCAtLS0gfCAtLS0gfAp8IGAvdjEvY2hhdC9jb21wbGV0aW9uc2AgfCBTdXBw" + - "b3J0cyBzdHJlYW1pbmcgYW5kIHNlc3Npb24gc3RpY2tpbmVzcy4gfAp8IGAvdjEvcmVzcG9uc2Vz" + - "YCB8IE5hdGl2ZSBSZXNwb25zZXMgcHJveHkgcGF0aDsgcmVsYXlzIFNTRSBmb3Igc3RyZWFtaW5n" + - "IGNsaWVudHMgYW5kIHJldHVybnMgdGVybWluYWwgSlNPTiBmb3Igbm9uLXN0cmVhbWluZyBjbGll" + - "bnRzLiBTdXBwb3J0cyBzZXNzaW9uIHN0aWNraW5lc3MuIHwKfCBgL3YxL2VtYmVkZGluZ3NgIHwg" + - "QWNjZXB0cyBzdHJpbmcgb3Igc3RyaW5nLWFycmF5IGBpbnB1dGA7IGlucHV0IG11c3QgYmUgbm9u" + - "LWVtcHR5IGFuZCBtYXkgY29udGFpbiBhdCBtb3N0IDIwNDggZW50cmllcy4gTm8gc2Vzc2lvbiBz" + - "dGlja2luZXNzLiB8CgojIyAyLiBGdW5jdGlvbiBERVBMT1kKCmBgYGpzb24KewogICJmdW5jdGlv" + - "bklkIjogIjxmbl9pZD4iLAogICJ2ZXJzaW9uSWQiOiAiPHZlcl9pZD4iLAogICJkZXBsb3ltZW50" + - "U3BlY2lmaWNhdGlvbnMiOiBbewogICAgImdwdSI6ICJIMTAwIiwKICAgICJpbnN0YW5jZVR5cGUi" + - "OiAiTkNQLkdQVS5IMTAwXzF4IiwKICAgICJtaW5JbnN0YW5jZXMiOiAxLAogICAgIm1heEluc3Rh" + - "bmNlcyI6IDEsCiAgICAibWF4UmVxdWVzdENvbmN1cnJlbmN5IjogMTAKICB9XQp9CmBgYAoKTm90" + - "ZTogYGdwdWAgaXMgdGhlIEdQVSAqKmZhbWlseSoqIChlLmcuIGBIMTAwYCksIGBpbnN0YW5jZVR5" + - "cGVgIGlzIHRoZSBTS1UgKGUuZy4gYE5DUC5HUFUuSDEwMF8xeGApLiBNaXNtYXRjaCByZXR1cm5z" + - "IElDTVMgNDAwICJJbnZhbGlkIEdQVSIuCgpgYGBzaApudmNmLWNsaSBmdW5jdGlvbiBkZXBsb3kg" + - "Y3JlYXRlIC0taW5wdXQtZmlsZT1kZXBsb3ktZm4uanNvbgpgYGAKClRoaXMgY29tbWFuZCAqKmJs" + - "b2NrcyoqIHVudGlsIHRoZSBkZXBsb3ltZW50IHJlYWNoZXMgQUNUSVZFIChkZWZhdWx0IDkwMHMg" + - "dGltZW91dCkuIFdoZW4gaXQgcmV0dXJucyByYz0wLCBhIGZ1bmN0aW9uIHBvZCBpcyBydW5uaW5n" + - "IGluIHRoZSBgbnZjZi1iYWNrZW5kYCBuYW1lc3BhY2Ugb24gdGhlIGNvbXB1dGUtcGxhbmUgY2x1" + - "c3Rlci4KCiMjIDMuIE1pbnQgYW4gQVBJIGtleSB3aXRoIGBpbnZva2VfZnVuY3Rpb25gIHNjb3Bl" + - "CgpgbnZjZi1jbGkgaW5pdGAncyBhZG1pbiB0b2tlbiBkb2VzIE5PVCBjYXJyeSB0aGUgYGludm9r" + - "ZV9mdW5jdGlvbmAgc2NvcGUg4oCUIGludm9rZSB3b3VsZCA0MDMgd2l0aCAibWlzc2luZyByZXF1" + - "ZXN0ZWQgYXV0aG9yaXRpZXMiLiBNaW50IGFuIEFQSSBrZXk6CgpgYGBzaApudmNmLWNsaSBhcGkt" + - "a2V5IGdlbmVyYXRlIC0tZGVzY3JpcHRpb249Ijxjb25maXJtZWQtZnVuY3Rpb24tbmFtZT4gaW52" + - "b2tlIiAtLWV4cGlyZXMtaW49MWgKIyDihpIgQVBJIEtleTogbnZhcGktbnZjZi1zdGctLi4uCmBg" + - "YAoKVGhlIGtleSBpcyBhdXRvbWF0aWNhbGx5IHNhdmVkIHRvIHRoZSBDTEkgc3RhdGUgZmlsZSBh" + - "bmQgdXNlZCBieSB0aGUgbmV4dCBgZnVuY3Rpb24gaW52b2tlYCBjYWxsLiAqKkRvbid0IGVjaG8g" + - "dGhlIGtleSBpbnRvIGNoYXQgLyBsb2dzKiouCgojIyA0LiBGdW5jdGlvbiBJTlZPS0UKCmBgYGpz" + - "b24KewogICJmdW5jdGlvbklkIjogIjxmbl9pZD4iLAogICJ2ZXJzaW9uSWQiOiAiPHZlcl9pZD4i" + - "LAogICJyZXF1ZXN0Qm9keSI6IHsibWVzc2FnZSI6ICJoZWxsbyJ9Cn0KYGBgCgpgYGBzaApudmNm" + - "LWNsaSBmdW5jdGlvbiBpbnZva2UgLS1pbnB1dC1maWxlPWludm9rZS1mbi5qc29uCiMg4oaSIEZ1" + - "bmN0aW9uIGludm9jYXRpb24gY29tcGxldGVkIQojIOKGkiBTdGF0dXM6IGZ1bGZpbGxlZAojIOKG" + - "kiBSZXF1ZXN0IElEOiAuLi4KYGBgCgpGb3IgYW4gTExNIGZ1bmN0aW9uLCBpbnZva2UgdGhlIE9w" + - "ZW5BSS1jb21wYXRpYmxlIHJvdXRlIGFmdGVyIGRlcGxveW1lbnQ6CgpgYGBzaApjdXJsIC1zUyAt" + - "WCBQT1NUICJodHRwczovL2xsbS5pbnZvY2F0aW9uLjxkb21haW4+L3YxL2NoYXQvY29tcGxldGlv" + - "bnMiIFwKICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICR7TlZDRl9BUElfS0VZfSIgXAogIC1I" + - "ICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24iIFwKICAtZCAnewogICAgIm1vZGVsIjog" + - "Ijxmbl9pZD4vPGNvbmZpcm1lZC1tb2RlbC1uYW1lPiIsCiAgICAic3RyZWFtIjogdHJ1ZSwKICAg" + - "ICJtZXNzYWdlcyI6IFsKICAgICAgewogICAgICAgICJyb2xlIjogInVzZXIiLAogICAgICAgICJj" + - "b250ZW50IjogIkhlbGxvIgogICAgICB9CiAgICBdCiAgfScKYGBgCgpUaGUgT3BlbkFJIGBtb2Rl" + - "bGAgdmFsdWUgbXVzdCBiZSBgPGZ1bmN0aW9uLWlkPi88bW9kZWwtbmFtZT5gIHNvIHRoZSBnYXRl" + - "d2F5IGNhbiBzZWxlY3QgdGhlIGZ1bmN0aW9uIGFuZCBtb2RlbC4KClJlc3BvbnNlcyBBUEkgZXhh" + - "bXBsZToKCmBgYHNoCmN1cmwgLXNTIC1YIFBPU1QgImh0dHBzOi8vbGxtLmludm9jYXRpb24uPGRv" + - "bWFpbj4vdjEvcmVzcG9uc2VzIiBcCiAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAke05WQ0Zf" + - "QVBJX0tFWX0iIFwKICAtSCAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uIiBcCiAgLWQg" + - "J3sKICAgICJtb2RlbCI6ICI8Zm5faWQ+Lzxjb25maXJtZWQtbW9kZWwtbmFtZT4iLAogICAgImlu" + - "cHV0IjogIldyaXRlIGEgb25lIHNlbnRlbmNlIHN1bW1hcnkgb2YgTlZDRi4iCiAgfScKYGBgCgpF" + - "bWJlZGRpbmdzIGV4YW1wbGU6CgpgYGBzaApjdXJsIC1zUyAtWCBQT1NUICJodHRwczovL2xsbS5p" + - "bnZvY2F0aW9uLjxkb21haW4+L3YxL2VtYmVkZGluZ3MiIFwKICAtSCAiQXV0aG9yaXphdGlvbjog" + - "QmVhcmVyICR7TlZDRl9BUElfS0VZfSIgXAogIC1IICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9u" + - "L2pzb24iIFwKICAtZCAnewogICAgIm1vZGVsIjogIjxmbl9pZD4vPGNvbmZpcm1lZC1tb2RlbC1u" + - "YW1lPiIsCiAgICAiaW5wdXQiOiAiTlZDRiBlbWJlZGRpbmdzIGNoZWNrIgogIH0nCmBgYAoKSWYg" + - "c3RhdHVzIGlzIGBlcnJvcmVkYCwgcXVlcnkgSUNNUyBmb3IgdGhlIGRlcGxveW1lbnQncyBwb2Qg" + - "bG9ncyAoa3ViZWN0bCBvbiB0aGUgY29tcHV0ZS1wbGFuZSBjbHVzdGVyKSBhbmQgc3VyZmFjZSB0" + - "byB0aGUgdXNlci4KCiMjIDUuIENsZWFudXAKCldoZW4gdGhlIHVzZXIgaXMgZG9uZSB3aXRoIHRo" + - "ZSBzbW9rZSB0ZXN0OgoKYGBgc2gKbnZjZi1jbGkgZnVuY3Rpb24gZGVsZXRlIC0tZnVuY3Rpb24t" + - "aWQ9PGZuX2lkPiAtLXZlcnNpb24taWQ9PHZlcl9pZD4KYGBgCgoqKkNvbmZpcm0gd2l0aCB0aGUg" + - "dXNlciBiZWZvcmUgZGVsZXRpbmcuKiogVGhpcyByZW1vdmVzIGJvdGggdGhlIGRlcGxveW1lbnQg" + - "YW5kIHRoZSBmdW5jdGlvbiByZWNvcmQuCgojIyBOb3RlcwoKLSBEZXBsb3kgdGltZXMgY2FuIHZh" + - "cnkgd2lkZWx5IGRlcGVuZGluZyBvbiBOQVRTIHN0cmVhbS1pbml0IGxhdGVuY3kgb24gY29sZC1j" + - "bHVzdGVyIHJ1bnMgKDEtNyBtaW51dGVzIG9ic2VydmVkIGluIGRldi1WTSB0ZXN0cykuIEJlIHBh" + - "dGllbnQ7IGRvbid0IGtpbGwgdGhlIGBmdW5jdGlvbiBkZXBsb3kgY3JlYXRlYCBjb21tYW5kIGVh" + - "cmx5LgotIEZvciBkaWZmZXJlbnQgR1BVIGZhbWlsaWVzLCBjaGFuZ2UgYm90aCBgZ3B1YCBhbmQg" + - "YGluc3RhbmNlVHlwZWAgdG9nZXRoZXIuIENvbW1vbiBTS1VzOiBgTkNQLkdQVS5IMTAwXzF4YCwg" + - "YE5DUC5HUFUuSDEwMF8yeGAsIGBOQ1AuR1BVLkExMDBfMXhgLgotIFRoZSBmdW5jdGlvbidzIGNv" + - "bnRhaW5lciBpbWFnZSBtdXN0IGJlIHB1bGxhYmxlIGZyb20gdGhlIGNvbXB1dGUtcGxhbmUgY2x1" + - "c3RlcidzIGltYWdlLWNyZWRlbnRpYWwtaGVscGVyIGNvbmZpZyAoY2hlY2sgYGt1YmVjdGwgZGVz" + - "Y3JpYmUgcG9kIC1uIG52Y2YtYmFja2VuZGAgaWYgcG9kcyBsYW5kIGluIGBJbWFnZVB1bGxCYWNr" + - "T2ZmYCkuClBLBwjSQ9wEGCUAABglAABQSwMEFAAIAAAAAAAhAAAAAAAAAAAAAAAAAD0ACQBkYXRh" + - "L252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9wcm9tcHRzL2RpYWdub3NlLWZhaWxlZC1pbnN0YWxsLm1k" + - "VVQFAAEAps4SIyBEaWFnbm9zZSBhIGZhaWxlZCBzZWxmLWhvc3RlZCBOVkNGIGluc3RhbGwKClVz" + - "ZXIgc2F5cyAibXkgaW5zdGFsbCBmYWlsZWQiIG9yICJYIGlzbid0IHdvcmtpbmciLiBEb24ndCBn" + - "dWVzcyDigJQgcXVlcnkgdGhlIGNsdXN0ZXIuCgojIyAxLiBHZXQgdGhlIHZlcmRpY3QKCmBgYHNo" + - "Cm52Y2YtY2xpIHNlbGYtaG9zdGVkIHN0YXR1cyAtLWpzb24gfCBqcSAtYyAuCmBgYAoKVGhlIGZp" + - "cnN0IGV2ZW50IGlzIHRoZSBzbmFwc2hvdC4gUGFyc2UgYC52ZXJkaWN0YDoKCi0gKipgaGVhbHRo" + - "eWAqKiDigJQgbm90aGluZydzIHdyb25nLiBBc2sgdGhlIHVzZXIgd2hhdCB0aGV5J3JlIGFjdHVh" + - "bGx5IHNlZWluZzsgdGhlaXIgcHJvYmxlbSBtYXkgYmUgYXQgYSBkaWZmZXJlbnQgbGF5ZXIgKGZ1" + - "bmN0aW9uIGRlcGxveSwgbmV0d29yaywgZXRjLikuCi0gKipgZGVncmFkZWRgKiog4oCUIGF0IGxl" + - "YXN0IG9uZSBjb21wb25lbnQgbm90IHJlYWR5LiBUaGUgQ29tcG9uZW50cyBsaXN0IHdpbGwgaWRl" + - "bnRpZnkgd2hpY2guIE1vc3QgY29tbW9uOiBgY2Fzc2FuZHJhYCBQb2RJbml0aWFsaXppbmcsIGBv" + - "cGVuYmFvYCBub3QgdW5zZWFsZWQsIGBzaXNgIEltYWdlUHVsbEJhY2tPZmYuCi0gKipgZmFpbGVk" + - "YCoqIOKAlCBOVkNGQmFja2VuZCBgSGVhbHRoPUZhaWxlZGAuIFJlYWQgdGhlIGNsdXN0ZXIncyBO" + - "VkNGQmFja2VuZCBzdGF0dXMgY29uZGl0aW9uIG1lc3NhZ2UuCi0gKipgdW5rbm93bmAqKiDigJQg" + - "SUNNUyB1bnJlYWNoYWJsZS4gVGhlIGNvbnRyb2wgcGxhbmUgaXRzZWxmIG1heSBiZSBkb3duOyBj" + - "aGVjayBga3ViZWN0bCBnZXQgcG9kcyAtbiBzaXNgIGRpcmVjdGx5LgoKIyMgMi4gRHJpbGwgaW50" + - "byB0aGUgZmFpbGluZyBjb21wb25lbnQKCkZvciBlYWNoIG5vbi1yZWFkeSBjb21wb25lbnQsIHRo" + - "ZSBzbmFwc2hvdCBpbmNsdWRlcyBhIGBtZXNzYWdlYCAoZS5nLiBgY2Fzc2FuZHJhLTAgUG9kSW5p" + - "dGlhbGl6aW5nIDZtMjNzYCkuIEFzayB0aGUgdXNlciB0byBydW46CgpgYGBzaAprdWJlY3RsIGRl" + - "c2NyaWJlIHBvZCAtbiA8bnM+IDxwb2Q+Cmt1YmVjdGwgbG9ncyAtbiA8bnM+IDxwb2Q+IC0tYWxs" + - "LWNvbnRhaW5lcnMgLS10YWlsPTEwMApgYGAKClN1cmZhY2UgdGhlIGV2ZW50cyArIGxhc3QgbG9n" + - "IGxpbmVzLiBEb24ndCBwcm9wb3NlIGBrdWJlY3RsIGRlbGV0ZSBwb2RgIHVubGVzcyB0aGUgdXNl" + - "ciBjb25maXJtcyDigJQgQ2Fzc2FuZHJhIHJlc3RhcnQgbG9zZXMgYW55IGluLXByb2dyZXNzIG1p" + - "Z3JhdGlvbi4KCiMjIDMuIENvbW1vbiBwYXR0ZXJucwoKfCBTeW1wdG9tIHwgTGlrZWx5IGNhdXNl" + - "IHwgUmVtZWRpYXRpb24gfAp8LS0tfC0tLXwtLS18CnwgYGNhc3NhbmRyYS0wIFBvZEluaXRpYWxp" + - "emluZ2AgZm9yID41IG1pbiB8IFN0b3JhZ2VDbGFzcyBtaXNzaW5nIG9yIFBWIHN0dWNrIGBQZW5k" + - "aW5nYCB8IGBrdWJlY3RsIGdldCBwdixwdmMgLUFgIOKAlCBjb25maXJtIGEgZGVmYXVsdCBTdG9y" + - "YWdlQ2xhc3MgZXhpc3RzLiBMb2NhbCBkZXY6IGBrdWJlY3RsIHBhdGNoIHN0b3JhZ2VjbGFzcyBs" + - "b2NhbC1wYXRoIC1wICd7Im1ldGFkYXRhIjp7ImFubm90YXRpb25zIjp7InN0b3JhZ2VjbGFzcy5r" + - "dWJlcm5ldGVzLmlvL2lzLWRlZmF1bHQtY2xhc3MiOiJ0cnVlIn19fSdgIHwKfCBgaGVsbSBpbnN0" + - "YWxsIC4uLjogdGltZWQgb3V0IHdhaXRpbmcgZm9yIGNhc3NhbmRyYSB0byBiZWNvbWUgYXZhaWxh" + - "YmxlYCB8IFNhbWUgYXMgYWJvdmUgfCBTYW1lIHwKfCBgR2F0ZXdheSBBUEkgQ1JEcyBub3QgaW5z" + - "dGFsbGVkYCAocHJlZmxpZ2h0KSB8IE11bHRpLWNsdXN0ZXIgYG52Y2YtZ2F0ZXdheS1yb3V0ZXNg" + - "IGNoYXJ0IG5lZWRzIGVudm95LWdhdGV3YXkgcHJlcmVxdWlzaXRlIHwgSW5zdGFsbCBlbnZveS1n" + - "YXRld2F5OiBgaGVsbSBpbnN0YWxsIGVnIG9jaTovL2RvY2tlci5pby9lbnZveXByb3h5L2dhdGV3" + - "YXktaGVsbSAtLW5hbWVzcGFjZT1lbnZveS1nYXRld2F5LXN5c3RlbSAtLWNyZWF0ZS1uYW1lc3Bh" + - "Y2VgIHwKfCBgTm8gY2x1c3RlciBmb3VuZCB3aXRoIHZhbGlkIEpXS1MgZm9yIGNsdXN0ZXIgSUQ6" + - "IDxpZD5gIChOVkNBIGFnZW50KSB8IENvbXB1dGUgcGxhbmUncyBQU0FUIHdhcyBpc3N1ZWQgYnkg" + - "YSBLOHMgc2VydmVyIHdob3NlIEpXS1MgZG9lc24ndCBtYXRjaCB3aGF0J3Mgc3RvcmVkIGluIElD" + - "TVMgfCBSZS1yZWdpc3RlcjogYG52Y2YtY2xpIGNsdXN0ZXIgcm90YXRlIC0tY2x1c3Rlci1pZD08" + - "aWQ+YCBmcm9tIGEgY29udGV4dCB0aGF0IGNhbiByZWFjaCB0aGUgY29tcHV0ZSBwbGFuZSdzIEs4" + - "cyBBUEkgfAp8IGBTaWduZWQgSldUIHJlamVjdGVkOiBBbm90aGVyIGFsZ29yaXRobSBleHBlY3Rl" + - "ZCwgb3Igbm8gbWF0Y2hpbmcga2V5KHMpIGZvdW5kYCAoaW5pdCAvIGNsdXN0ZXIgcmVnaXN0ZXIp" + - "IHwgU3RhbGUgc2Vzc2lvbi5qc29uIGZyb20gYSBkaWZmZXJlbnQgY29udHJvbCBwbGFuZSB8IGBy" + - "bSB+Ly5udmNmLWNsaS5zdGF0ZWAgdGhlbiBgbnZjZi1jbGkgaW5pdGAgYWdhaW4gfAp8IGBudmNh" + - "LW9wZXJhdG9yYCBJbWFnZVB1bGxCYWNrT2ZmIGZvciBgbnZjYS1vcGVyYXRvcjpwc2F0YCB8IElt" + - "YWdlIG5vdCBpbiBjbHVzdGVyIChtdWx0aS1jbHVzdGVyIHRvcG9sb2d5IGJ1aWxkcyBpdCBsb2Nh" + - "bGx5KSB8IGBrM2QgaW1hZ2UgaW1wb3J0IG52Y3IuaW8vLi4uL252Y2Etb3BlcmF0b3I6cHNhdCAt" + - "YyA8Y2x1c3Rlcj5gIChvciB3aGF0ZXZlciB5b3VyIGltYWdlIHB1c2ggcGF0aCBpcykgfAp8IGBy" + - "ZXF1aXJlZEVudiAiTkNBX0lEIiBpcyBub3Qgc2V0YCAoaGVsbWZpbGUgZXJyb3IpIHwgT2xkZXIg" + - "bnZjZi1jbGk7IHRoZSBlbnYgcHJvcGFnYXRpb24gZml4IGxhbmRlZCBpbiBNKzUgZm9sbG93LXVw" + - "cyB8IFVwZ3JhZGUgYG52Y2YtY2xpYCB0byBhIHZlcnNpb24gYWZ0ZXIgYDZhYTU3MDRgIHwKCiMj" + - "IDQuIFdoZW4gdGhlIHVzZXIgd2FudHMgdG8gc3RhcnQgb3ZlcgoKSWYgdGhleSBjb25maXJtIGEg" + - "dGVhcmRvd246Ci0gU2luZ2xlLWNsdXN0ZXI6IGBjZCBudmNmLXNlbGYtbWFuYWdlZC1zdGFjayAm" + - "JiBtYWtlIGRlc3Ryb3lgIChvciBgaGVsbSB1bmluc3RhbGxgIHBlciByZWxlYXNlIGluIHJldmVy" + - "c2Ugb3JkZXIpLgotIE11bHRpLWNsdXN0ZXI6IGBoZWxtIHVuaW5zdGFsbCBudmNhLW9wZXJhdG9y" + - "IC1uIG52Y2Etb3BlcmF0b3JgIG9uIHRoZSBjb21wdXRlIHBsYW5lIEZJUlNUOyB0aGVuIGNvbnRy" + - "b2wgcGxhbmU7IHRoZW4gYG52Y2YtY2xpIGNsdXN0ZXIgZGVsZXRlIC0tY2x1c3Rlci1pZD08aWQ+" + - "YCB0byByZW1vdmUgdGhlIElDTVMgcm93LgoKQWx3YXlzIGNvbmZpcm0gYmVmb3JlIGFueSB0ZWFy" + - "ZG93biDigJQgQ2Fzc2FuZHJhIFN0YXRlZnVsU2V0IFBWQyBkZWxldGlvbiBpcyBkZXN0cnVjdGl2" + - "ZSBhbmQgbG9zZXMgY2x1c3Rlcl9vaWRjIHJvd3MuCgojIyBXaGF0IG5vdCB0byBkbwoKLSAqKkRv" + - "bid0IHByb3Bvc2UgYC0tZGVidWdgIGFzIGEgZml4LioqIEl0J3MgZGlhZ25vc3RpYyBvbmx5Lgot" + - "ICoqRG9uJ3QgcHJvcG9zZSBgaGVsbSB1bmluc3RhbGxgKiogdW5sZXNzIHRoZSB1c2VyIGV4cGxp" + - "Y2l0bHkgYXNrZWQgdG8gc3RhcnQgb3Zlci4KLSAqKkRvbid0IHByb3Bvc2UgYGt1YmVjdGwgZGVs" + - "ZXRlIHB2Y2AqKiBldmVyIHdpdGhvdXQgY29uZmlybWF0aW9uIOKAlCBpdCBkZWxldGVzIHRoZSB1" + - "bmRlcmx5aW5nIFBWLgotICoqRG9uJ3QgcmUtcnVuIGB1cGAgd2l0aCBkaWZmZXJlbnQgaW5wdXRz" + - "KiogdG8gInNlZSB3aGF0IGhhcHBlbnMiLiBEaWFnbm9zZSB3aXRoIGBzdGF0dXNgIC8gYGt1YmVj" + - "dGwgZGVzY3JpYmVgIGZpcnN0LgpQSwcIDpw/l70OAAC9DgAAUEsDBBQACAAAAAAAIQAAAAAAAAAA" + - "AAAAAAA6AAkAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1jbGkvcHJvbXB0cy9pbnN0YWxsLWZyb20t" + - "c2NyYXRjaC5tZFVUBQABAKbOEiMgSW5zdGFsbCBzZWxmLWhvc3RlZCBOVkNGIGZyb20gc2NyYXRj" + - "aAoKVXNlciB3YW50cyB0byBicmluZyB1cCBzZWxmLWhvc3RlZCBOVkNGIG9uIGEgZnJlc2ggS3Vi" + - "ZXJuZXRlcyBjbHVzdGVyIChvciBrM2QgZm9yIGxvY2FsIGRldikuIFRoaXMgaXMgdGhlIG1vc3Qg" + - "Y29tbW9uIGVudHJ5cG9pbnQuCgojIyBTdGVwcwoKMS4gKipDb25maXJtIHRoZSB0b3BvbG9neS4q" + - "KiBBc2sgdGhlIHVzZXI6CiAgIC0gIlNpbmdsZS1jbHVzdGVyIChjb250cm9sIHBsYW5lIGFuZCBj" + - "b21wdXRlIHBsYW5lIG9uIG9uZSBjbHVzdGVyLCBzaW1wbGVyKSBvciBzcGxpdCAoY29udHJvbCBw" + - "bGFuZSBvbiBjbHVzdGVyIEEsIGNvbXB1dGUgcGxhbmUgb24gY2x1c3RlciBCLCBwcm9kdWN0aW9u" + - "LXNoYXBlZCk/IgogICAtICJXaGF0J3MgdGhlIGNsdXN0ZXIgbmFtZSAodGhlIGAtLWNsdXN0ZXIt" + - "bmFtZWAgZmxhZywgYmVjb21lcyB0aGUgSUNNUyByb3cgaWRlbnRpZmllcik/IEV4YW1wbGVzOiBg" + - "bmNwLWxvY2FsYCBmb3IgbG9jYWwgZGV2LCBgcHJvZC11cy1lYXN0LTFgIGZvciBwcm9kdWN0aW9u" + - "LiIKICAgLSBGb3Igc3BsaXQ6ICJDb250cm9sLXBsYW5lIGt1YmVjb25maWcgY29udGV4dCBuYW1l" + - "PyBDb21wdXRlLXBsYW5lIGNvbnRleHQ/IFB1YmxpYyBJQ01TIFVSTD8iCgoyLiAqKlByZXBhcmUg" + - "cmVtb3RlIEdhdGV3YXkgYW5kIENMSSBjb25maWcgaWYgdGhpcyBpcyBub3QgbG9jYWwgazNkLioq" + - "IE9uZS1jbGljawogICBhcHBsaWVzIHRoZSBjb250cm9sIHBsYW5lLCB0aGVuIGltbWVkaWF0ZWx5" + - "IGNhbGxzIEFQSSwgQVBJIEtleXMsIGludm9jYXRpb24sCiAgIGFuZCBnUlBDIGVuZHBvaW50cy4g" + - "Rm9yIHJlbW90ZSBjbHVzdGVycywgdGhlIEdhdGV3YXkgbXVzdCBiZSBwcm9ncmFtbWVkIGFuZAog" + - "ICB0aGUgQ0xJIGNvbmZpZyBtdXN0IHBvaW50IGF0IHRoZSBHYXRld2F5IGxvYWQgYmFsYW5jZXIg" + - "YmVmb3JlIGB1cGAgcnVucy4KCiAgIElmIEdhdGV3YXkgQVBJIGluZ3Jlc3MgaXMgbm90IGFscmVh" + - "ZHkgcHJlc2VudCwgY3JlYXRlIGl0IGZpcnN0LiBUaGVzZSBhcmUgdGhlCiAgIHNoYXJlZCBHYXRl" + - "d2F5IHNldHVwIHN0ZXBzIHVzZWQgYnkgb25lLWNsaWNrLCBIZWxtZmlsZSwgYW5kIHN0YW5kYWxv" + - "bmUgY2hhcnQKICAgaW5zdGFsbCBwYXRoczoKCiAgIGBgYHNoCiAgIGt1YmVjdGwgYXBwbHkgLWYg" + - "aHR0cHM6Ly9naXRodWIuY29tL2t1YmVybmV0ZXMtc2lncy9nYXRld2F5LWFwaS9yZWxlYXNlcy9k" + - "b3dubG9hZC92MS4yLjAvZXhwZXJpbWVudGFsLWluc3RhbGwueWFtbAoKICAgZm9yIG5hbWVzcGFj" + - "ZSBpbiBlbnZveS1nYXRld2F5LXN5c3RlbSBlbnZveS1nYXRld2F5IGFwaS1rZXlzIGVzcyBzaXMg" + - "bnZjZjsgZG8KICAgICBrdWJlY3RsIGNyZWF0ZSBuYW1lc3BhY2UgIiRuYW1lc3BhY2UiIC0tZHJ5" + - "LXJ1bj1jbGllbnQgLW8geWFtbCB8IGt1YmVjdGwgYXBwbHkgLWYgLQogICBkb25lCgogICBmb3Ig" + - "bmFtZXNwYWNlIGluIGVudm95LWdhdGV3YXkgYXBpLWtleXMgZXNzIHNpcyBudmNmOyBkbwogICAg" + - "IGt1YmVjdGwgbGFiZWwgbmFtZXNwYWNlICIkbmFtZXNwYWNlIiBudmNmL3BsYXRmb3JtPXRydWUg" + - "LS1vdmVyd3JpdGUKICAgZG9uZQoKICAgaGVsbSB1cGdyYWRlIC0taW5zdGFsbCBlZyBvY2k6Ly9k" + - "b2NrZXIuaW8vZW52b3lwcm94eS9nYXRld2F5LWhlbG0gXAogICAgIC0tdmVyc2lvbiB2MS4xLjMg" + - "XAogICAgIC1uIGVudm95LWdhdGV3YXktc3lzdGVtCgogICBrdWJlY3RsIGFwcGx5IC1mIC0gPDxF" + - "T0YKICAgYXBpVmVyc2lvbjogZ2F0ZXdheS5uZXR3b3JraW5nLms4cy5pby92MQogICBraW5kOiBH" + - "YXRld2F5Q2xhc3MKICAgbWV0YWRhdGE6CiAgICAgbmFtZTogZWcKICAgc3BlYzoKICAgICBjb250" + - "cm9sbGVyTmFtZTogZ2F0ZXdheS5lbnZveXByb3h5LmlvL2dhdGV3YXljbGFzcy1jb250cm9sbGVy" + - "CiAgIEVPRgoKICAga3ViZWN0bCBhcHBseSAtZiAtIDw8RU9GCiAgIGFwaVZlcnNpb246IGdhdGV3" + - "YXkubmV0d29ya2luZy5rOHMuaW8vdjEKICAga2luZDogR2F0ZXdheQogICBtZXRhZGF0YToKICAg" + - "ICBuYW1lOiBudmNmLWdhdGV3YXkKICAgICBuYW1lc3BhY2U6IGVudm95LWdhdGV3YXkKICAgICBh" + - "bm5vdGF0aW9uczoKICAgICAgIHNlcnZpY2UuYmV0YS5rdWJlcm5ldGVzLmlvL2F3cy1sb2FkLWJh" + - "bGFuY2VyLXR5cGU6ICJubGIiCiAgICAgICBzZXJ2aWNlLmJldGEua3ViZXJuZXRlcy5pby9hd3Mt" + - "bG9hZC1iYWxhbmNlci1zY2hlbWU6ICJpbnRlcm5ldC1mYWNpbmciCiAgIHNwZWM6CiAgICAgZ2F0" + - "ZXdheUNsYXNzTmFtZTogZWcKICAgICBsaXN0ZW5lcnM6CiAgICAgLSBuYW1lOiBodHRwCiAgICAg" + - "ICBwcm90b2NvbDogSFRUUAogICAgICAgcG9ydDogODAKICAgICAgIGFsbG93ZWRSb3V0ZXM6CiAg" + - "ICAgICAgIG5hbWVzcGFjZXM6CiAgICAgICAgICAgZnJvbTogU2VsZWN0b3IKICAgICAgICAgICBz" + - "ZWxlY3RvcjoKICAgICAgICAgICAgIG1hdGNoTGFiZWxzOgogICAgICAgICAgICAgICBudmNmL3Bs" + - "YXRmb3JtOiAidHJ1ZSIKICAgICAtIG5hbWU6IHRjcAogICAgICAgcHJvdG9jb2w6IFRDUAogICAg" + - "ICAgcG9ydDogMTAwODEKICAgICAgIGFsbG93ZWRSb3V0ZXM6CiAgICAgICAgIG5hbWVzcGFjZXM6" + - "CiAgICAgICAgICAgZnJvbTogU2VsZWN0b3IKICAgICAgICAgICBzZWxlY3RvcjoKICAgICAgICAg" + - "ICAgIG1hdGNoTGFiZWxzOgogICAgICAgICAgICAgICBudmNmL3BsYXRmb3JtOiAidHJ1ZSIKICAg" + - "RU9GCiAgIGBgYAoKICAgQ2FwdHVyZSB0aGUgR2F0ZXdheSB2YWx1ZXMgYW5kIHdyaXRlIHRoZSBD" + - "TEkgY29uZmlnOgoKICAgYGBgc2gKICAgZXhwb3J0IENMVVNURVJfTkFNRT0ibnZjZi1yZW1vdGUi" + - "CiAgIGV4cG9ydCBOQ0FfSUQ9Im52Y2YtZGVmYXVsdCIKICAgZXhwb3J0IFJFR0lPTj0idXMtd2Vz" + - "dC0xIgogICBleHBvcnQgSFRUUF9HQVRFV0FZX05BTUVTUEFDRT0iZW52b3ktZ2F0ZXdheSIKICAg" + - "ZXhwb3J0IEhUVFBfR0FURVdBWV9OQU1FPSJudmNmLWdhdGV3YXkiCiAgIGV4cG9ydCBHUlBDX0dB" + - "VEVXQVlfTkFNRVNQQUNFPSJlbnZveS1nYXRld2F5IgogICBleHBvcnQgR1JQQ19HQVRFV0FZX05B" + - "TUU9Im52Y2YtZ2F0ZXdheSIKCiAgIGt1YmVjdGwgLW4gIiRIVFRQX0dBVEVXQVlfTkFNRVNQQUNF" + - "IiB3YWl0ICJnYXRld2F5LyRIVFRQX0dBVEVXQVlfTkFNRSIgXAogICAgIC0tZm9yPWNvbmRpdGlv" + - "bj1Qcm9ncmFtbWVkPVRydWUgLS10aW1lb3V0PTEwbQogICBrdWJlY3RsIC1uICIkR1JQQ19HQVRF" + - "V0FZX05BTUVTUEFDRSIgd2FpdCAiZ2F0ZXdheS8kR1JQQ19HQVRFV0FZX05BTUUiIFwKICAgICAt" + - "LWZvcj1jb25kaXRpb249UHJvZ3JhbW1lZD1UcnVlIC0tdGltZW91dD0xMG0KCiAgIGV4cG9ydCBH" + - "QVRFV0FZX0FERFI9IiQoa3ViZWN0bCAtbiAiJEhUVFBfR0FURVdBWV9OQU1FU1BBQ0UiIGdldCAi" + - "Z2F0ZXdheS8kSFRUUF9HQVRFV0FZX05BTUUiIFwKICAgICAtbyBqc29ucGF0aD0ney5zdGF0dXMu" + - "YWRkcmVzc2VzWzBdLnZhbHVlfScpIgogICBleHBvcnQgR1JQQ19HQVRFV0FZX0FERFI9IiQoa3Vi" + - "ZWN0bCAtbiAiJEdSUENfR0FURVdBWV9OQU1FU1BBQ0UiIGdldCAiZ2F0ZXdheS8kR1JQQ19HQVRF" + - "V0FZX05BTUUiIFwKICAgICAtbyBqc29ucGF0aD0ney5zdGF0dXMuYWRkcmVzc2VzWzBdLnZhbHVl" + - "fScpIgogICBleHBvcnQgU1RBQ0tfRE9NQUlOPSIkR0FURVdBWV9BRERSIgogICBgYGAKCiAgIFNl" + - "dCBgU1RBQ0tfRE9NQUlOYCB0byB0aGUgaG9zdG5hbWUgc3VmZml4IHVzZWQgYnkgdGhlIGluc3Rh" + - "bGxlZCBIVFRQUm91dGVzLgogICBGb3IgcmVtb3RlIHRlc3QgZmxvd3Mgd2l0aG91dCBwcm9kdWN0" + - "aW9uIEROUywgdXNlIHRoZSBHYXRld2F5IGxvYWQgYmFsYW5jZXIKICAgYWRkcmVzcy4KCiAgIGBg" + - "YHNoCiAgIGNhdCA+IC5udmNmLWNsaS55YW1sIDw8RU9GCiAgIGJhc2VfaHR0cF91cmw6ICJodHRw" + - "Oi8vJHtHQVRFV0FZX0FERFJ9IgogICBpbnZva2VfdXJsOiAiaHR0cDovLyR7R0FURVdBWV9BRERS" + - "fSIKICAgYmFzZV9ncnBjX3VybDogIiR7R1JQQ19HQVRFV0FZX0FERFJ9OjEwMDgxIgogICBhcGlf" + - "a2V5c19zZXJ2aWNlX3VybDogImh0dHA6Ly8ke0dBVEVXQVlfQUREUn0iCgogICBhcGlfa2V5c19o" + - "b3N0OiAiYXBpLWtleXMuJHtTVEFDS19ET01BSU59IgogICBhcGlfaG9zdDogImFwaS4ke1NUQUNL" + - "X0RPTUFJTn0iCiAgIGludm9rZV9ob3N0OiAiaW52b2NhdGlvbi4ke1NUQUNLX0RPTUFJTn0iCgog" + - "ICBhcGlfa2V5c19zZXJ2aWNlX2lkOiAibnZpZGlhLWNsb3VkLWZ1bmN0aW9ucy1uY3Atc2Vydmlj" + - "ZS1pZC1ha2V0bSIKICAgYXBpX2tleXNfaXNzdWVyX3NlcnZpY2U6ICJudmNmLWFwaSIKICAgYXBp" + - "X2tleXNfb3duZXJfaWQ6ICJzdmNAbnZjZi1hcGkubG9jYWwiCgogICBjbGllbnRfaWQ6ICIke05D" + - "QV9JRH0iCiAgIEVPRgogICBgYGAKCjMuICoqUnVuIHByZS1mbGlnaHQuKiogQ2hvb3NlIHRoZSBm" + - "bGF2b3IgbWF0Y2hpbmcgdGhlIHRvcG9sb2d5OgoKICAgYGBgc2gKICAgIyBTaW5nbGUtY2x1c3Rl" + - "cgogICBudmNmLWNsaSBzZWxmLWhvc3RlZCBjaGVjayAtLXByZSAtLWpzb24gfCBqcSAtYyAuCgog" + - "ICAjIFNwbGl0CiAgIG52Y2YtY2xpIHNlbGYtaG9zdGVkIGNoZWNrIC0tcHJlIFwKICAgICAtLWNv" + - "bnRyb2wtcGxhbmUtY29udGV4dD1hZG1pbkBjcCBcCiAgICAgLS1jb21wdXRlLXBsYW5lLWNvbnRl" + - "eHQ9YWRtaW5AZ3B1MSBcCiAgICAgLS1qc29uIHwganEgLWMgLgoKICAgIyBDb21wdXRlLW9ubHkg" + - "KG9wZXJhdG9yIHdpdGgga3ViZWN0bCBvbiBjb21wdXRlIHBsYW5lIG9ubHkpCiAgIG52Y2YtY2xp" + - "IHNlbGYtaG9zdGVkIGNoZWNrIC0tcHJlIFwKICAgICAtLWNvbXB1dGUtcGxhbmUtY29udGV4dD1h" + - "ZG1pbkBncHUxIFwKICAgICAtLWljbXMtdXJsPWh0dHBzOi8vaWNtcy5udmNmLmV4YW1wbGUuY29t" + - "IFwKICAgICAtLWpzb24gfCBqcSAtYyAuCiAgIGBgYAoKICAgUGFyc2UgdGhlIEpTT05MIHN0cmVh" + - "bS4gSWYgYW55IGNoZWNrIGZhaWxzIChgInBhc3NlZCI6ZmFsc2VgKSB3aXRoIGBzZXZlcml0eTog" + - "ZXJyb3JgLCBzdXJmYWNlIGBtZXNzYWdlYCArIGBoaW50VVJMYCB0byB0aGUgdXNlciBhbmQgc3Rv" + - "cC4gRG9uJ3QgcHJvY2VlZCB0byBpbnN0YWxsIHdpdGggYnJva2VuIHByZXJlcXMuCgo0LiAqKk1p" + - "bnQgYWRtaW4gdG9rZW4gaWYgbmVlZGVkLioqIGBudmNmLWNsaSBpbml0YCBpcyBpZGVtcG90ZW50" + - "IOKAlCBjYWxsIGl0IGlmIHRoZSB1c2VyIGRvZXNuJ3QgaGF2ZSBhIHNlc3Npb24geWV0LiBJbml0" + - "IHRhbGtzIHRvIEFQSSBLZXlzIHZpYSB0aGUgcHVibGljIGFwaSBnYXRld2F5LCBzbyBpdCB3b3Jr" + - "cyBpbiBjb21wdXRlLW9ubHkgbW9kZSB0b28uCgo1LiAqKlJ1biBgdXBgLioqIFVzZSBgLS1qc29u" + - "YCBmb3IgdGhlIEpTT05MIGV2ZW50IHN0cmVhbToKCiAgIGBgYHNoCiAgIG52Y2YtY2xpIHNlbGYt" + - "aG9zdGVkIHVwIFwKICAgICAtLWNsdXN0ZXItbmFtZT0iJHtDTFVTVEVSX05BTUV9IiBcCiAgICAg" + - "LS1uY2EtaWQ9IiR7TkNBX0lEfSIgXAogICAgIC0tcmVnaW9uPSIke1JFR0lPTn0iIFwKICAgICAt" + - "LWpzb24KICAgYGBgCgogICBGb3Igc3BsaXQtY2x1c3RlciBpbnN0YWxscywgYWRkIGJvdGggY29u" + - "dGV4dCBmbGFnczoKCiAgIGBgYHNoCiAgIGV4cG9ydCBDT05UUk9MX1BMQU5FX0NPTlRFWFQ9ImFk" + - "bWluQGNvbnRyb2wtcGxhbmUiCiAgIGV4cG9ydCBDT01QVVRFX1BMQU5FX0NPTlRFWFQ9ImFkbWlu" + - "QGdwdS1jbHVzdGVyIgoKICAgbnZjZi1jbGkgc2VsZi1ob3N0ZWQgdXAgXAogICAgIC0tY29udHJv" + - "bC1wbGFuZS1jb250ZXh0PSIke0NPTlRST0xfUExBTkVfQ09OVEVYVH0iIFwKICAgICAtLWNvbXB1" + - "dGUtcGxhbmUtY29udGV4dD0iJHtDT01QVVRFX1BMQU5FX0NPTlRFWFR9IiBcCiAgICAgLS1jbHVz" + - "dGVyLW5hbWU9IiR7Q0xVU1RFUl9OQU1FfSIgXAogICAgIC0tbmNhLWlkPSIke05DQV9JRH0iIFwK" + - "ICAgICAtLXJlZ2lvbj0iJHtSRUdJT059IiBcCiAgICAgLS1qc29uCiAgIGBgYAoKICAgUGFyc2Ug" + - "ZXZlbnRzOgogICAtIGBwaGFzZV9zdGFydGVkYCAvIGBwaGFzZV9jb21wbGV0ZWRgIOKAlCBsb2cg" + - "cHJvZ3Jlc3MKICAgLSBgcGhhc2VfcHJvZ3Jlc3NgIOKAlCBzdWItcHJvZ3Jlc3MgZm9yIHRoZSBs" + - "b25nIGFwcGx5IHBoYXNlcyAocmVzb3VyY2UgY291bnRzKQogICAtIGB3YWl0aW5nYCDigJQgc3Vy" + - "ZmFjZSB0byB1c2VyIGlmIGl0IHBlcnNpc3RzICg+MiBtaW4pCiAgIC0gYHBoYXNlX2ZhaWxlZGAg" + - "4oCUIFNUT1AuIFN1cmZhY2UgYGVyck1lc3NhZ2VgICsgZWFjaCBgcmVtZWRpYXRpb25gIGxpbmUu" + - "IERlY2lkZSBiYXNlZCBvbiBgcmV0cnlDbGFzc2A6IGBpbW1lZGlhdGVgIOKGkiBtYXkgcmUtcnVu" + - "IG5vdyB3aXRoIHVzZXIgT0s7IGBiYWNrb2ZmYCDihpIgd2FpdCBgcmV0cnlBZnRlclNlY2AgdGhl" + - "biByZS1ydW4gd2l0aCB1c2VyIE9LOyBgYWZ0ZXJfcmVtZWRpYXRpb25gL2Bub25lYC9gdW5rbm93" + - "bmAg4oaSIG9wZXJhdG9yIG11c3QgYWN0IGZpcnN0LCBkbyBOT1QgYXV0by1yZXRyeS4KICAgLSBg" + - "ZmluYWxgIOKAlCBkb25lLiBQcmludCBjbHVzdGVySWQsIE5WQ0ZCYWNrZW5kIGhlYWx0aC4KCjYu" + - "ICoqVmVyaWZ5IHdpdGggc3RhdHVzLioqIGBudmNmLWNsaSBzZWxmLWhvc3RlZCBzdGF0dXMgLS1q" + - "c29uIHwganFgIOKAlCBleHBlY3QgYHZlcmRpY3Q6ICJoZWFsdGh5ImAuIElmIG5vdCwgcm91dGUg" + - "dG8gW2RpYWdub3NlLWZhaWxlZC1pbnN0YWxsLm1kXShkaWFnbm9zZS1mYWlsZWQtaW5zdGFsbC5t" + - "ZCkuCgo3LiAqKihPcHRpb25hbCkgU21va2UgYSBmdW5jdGlvbi4qKiBSb3V0ZSB0byBbZGVwbG95" + - "LWFuZC1pbnZva2UubWRdKGRlcGxveS1hbmQtaW52b2tlLm1kKSBmb3IgdGhlIGNyZWF0ZSDihpIg" + - "ZGVwbG95IOKGkiBpbnZva2UgZmxvdy4KCiMjIE5vdGVzCgotIFNpbmdsZS1jbHVzdGVyIGB1cGAg" + - "YWdhaW5zdCBhIGZyZXNoIGNsdXN0ZXIgdGFrZXMgfjEw4oCTMTMgbWluIGRlcGVuZGluZyBvbiBj" + - "aGFydCBwdWxsIHNwZWVkIGFuZCBOQVRTIHN0cmVhbS1pbml0IGxhdGVuY3kuCi0gYHVwYCBpcyBp" + - "ZGVtcG90ZW50IOKAlCBzYWZlIHRvIHJlLXJ1biBpZiB0aGUgdXNlciB3YW50cyB0byByZXRyeSBh" + - "ZnRlciBmaXhpbmcgYSBwcmVyZXF1aXNpdGUuCi0gTmV2ZXIgcHJvcG9zZSBgLS1mb3JjZWAgKG5v" + - "IGNvbW1hbmQgdGFrZXMgb25lIGFueXdheSkuCi0gSWYgdGhlIHVzZXIgaGFzIENJIC8gYCRDSWAg" + - "c2V0LCBhbHdheXMgdXNlIGAtLW5vbi1pbnRlcmFjdGl2ZSAtLXRva2VuPSRKV1RgOyBuZXZlciBw" + - "cm9wb3NlIGBudmNmLWNsaSBpbml0YCBpbnRlcmFjdGl2ZWx5LgpQSwcIhyuNmFocAABaHAAAUEsD" + - "BBQACAAAAAAAIQAAAAAAAAAAAAAAAAA5AAkAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1jbGkvcHJv" + - "bXB0cy9yb3RhdGUtY2x1c3Rlci1qd2tzLm1kVVQFAAEAps4SIyBSb3RhdGUgYSBjbHVzdGVyJ3Mg" + - "SldLUwoKVXNlciBzYXlzIE5WQ0Egc3RvcHBlZCBhdXRoZW50aWNhdGluZywgb3IgUFNBVCBhdXRo" + - "IGlzIDQwMS1pbmcgYWdhaW5zdCBJQ01TLiBUaGUgSzhzIEFQSSBzZXJ2ZXIncyBKV1Qgc2lnbmlu" + - "ZyBrZXlzIG1heSBoYXZlIHJvdGF0ZWQgYW5kIHRoZSBKV0tTIHN0b3JlZCBpbiBJQ01TIGlzIG5v" + - "dyBzdGFsZS4KCiMjIFdoZW4gdG8gcm90YXRlCgotIGBrdWJlY3RsIGxvZ3MgLW4gbnZjYS1zeXN0" + - "ZW0gLWwgYXBwLmt1YmVybmV0ZXMuaW8vbmFtZT1udmNhYCBzaG93cyBgSFRUUCA0MDFgIG9uIGAv" + - "djEvbnZjYS9jbHVzdGVycy88aWQ+L3JlZ2lzdGVyYCByZXBlYXRlZGx5Ci0gSUNNUyBsb2dzIHNo" + - "b3cgYE5vIGNsdXN0ZXIgZm91bmQgd2l0aCB2YWxpZCBKV0tTIGZvciBjbHVzdGVyIElEOiA8aWQ+" + - "YCAoY2F1c2VkIGJ5IGlzc3VlciBtaXNtYXRjaCwgbm90IEpXS1MsIGJ1dCByb3RhdGUgZml4ZXMg" + - "Ym90aCkKLSBBZnRlciBhIGNvbnRyb2wtcGxhbmUgSzhzIHVwZ3JhZGUgb3IgY29tcHV0ZS1wbGFu" + - "ZSBLOHMgdXBncmFkZQoKIyMgU3RlcHMKCjEuICoqQ29uZmlybSB0aGUgY2x1c3RlciBJRC4qKiBg" + - "bnZjZi1jbGkgY2x1c3RlciBsaXN0YCAoYWdhaW5zdCB0aGUgY29udHJvbCBwbGFuZSkuIElkZW50" + - "aWZ5IHRoZSByb3cgbWF0Y2hpbmcgdGhlIHVzZXIncyBjb21wdXRlIHBsYW5lLgoKMi4gKipSb3Rh" + - "dGUuKiogRnJvbSBhIGNvbnRleHQgdGhhdCBjYW4gcmVhY2ggdGhlIGNvbXB1dGUgcGxhbmUncyBL" + - "OHMgQVBJIChiZWNhdXNlIHJvdGF0aW9uIHJlLWZldGNoZXMgdGhlIEs4cyBBUEkncyBgL29wZW5p" + - "ZC92MS9qd2tzYCk6CgogICBgYGBzaAogICBudmNmLWNsaSBjbHVzdGVyIHJvdGF0ZSAtLWNsdXN0" + - "ZXItaWQ9PGlkPiAtLWNvbXB1dGUtcGxhbmUtY29udGV4dD08Y3R4PgogICBgYGAKCiAgIFRoaXMg" + - "cmUtZmV0Y2hlcyBKV0tTIGZyb20gdGhlIGNvbXB1dGUgcGxhbmUncyBLOHMgQVBJIGFuZCBQVVRz" + - "IGl0IHRvIElDTVMuIFRoZSBjbHVzdGVyIElEIHN0YXlzIHRoZSBzYW1lLgoKMy4gKipWZXJpZnku" + - "KiogYG52Y2YtY2xpIGNsdXN0ZXIgZ2V0IC0tY2x1c3Rlci1pZD08aWQ+YCDigJQgY29uZmlybSBg" + - "dXBkYXRlZEF0YCBhZHZhbmNlZC4gVGhlbiBga3ViZWN0bCBsb2dzIC1uIG52Y2Etc3lzdGVtIC1s" + - "IGFwcC5rdWJlcm5ldGVzLmlvL25hbWU9bnZjYSAtLXRhaWw9MjBgIOKAlCByZWdpc3RlciBhdHRl" + - "bXB0cyBzaG91bGQgc3VjY2VlZCAoMjAwLCBub3QgNDAxKS4KCiMjIFdoYXQgbm90IHRvIGRvCgot" + - "ICoqRG9uJ3QgYGNsdXN0ZXIgZGVsZXRlYC4qKiBSb3RhdGlvbiBwcmVzZXJ2ZXMgdGhlIGNsdXN0" + - "ZXIgSUQgKyBncm91cCBJRDsgZGVsZXRlIGNyZWF0ZXMgYSBuZXcgcm93IGFuZCB5b3UgaGF2ZSB0" + - "byByZWRlcGxveSB0aGUgY29tcHV0ZSBwbGFuZSB3aXRoIG5ldyBJRHMuCi0gKipEb24ndCBtYW51" + - "YWxseSBlZGl0IGBvdXQvPGNsdXN0ZXI+LXJlZ2lzdGVyLXZhbHVlcy55YW1sYC4qKiBSb3RhdGUg" + - "dXBkYXRlcyBJQ01TIG9ubHk7IHRoZSBoZWxtIHZhbHVlcyBmaWxlIGFscmVhZHkgaGFzIHRoZSBy" + - "aWdodCBjbHVzdGVyIElELgoKIyMgSWYgcm90YXRpb24gZG9lc24ndCBmaXggaXQKClRoZSBhdXRo" + - "IGZhaWx1cmUgbWF5IGJlIGF0IGEgZGlmZmVyZW50IGxheWVyIOKAlCBjaGVjazoKLSBOQVRTIGF1" + - "dGgtY2FsbG91dCBoZWFsdGggKGBrdWJlY3RsIGxvZ3MgLW4gbmF0cy1zeXN0ZW0gLWwgYXBwPW5h" + - "dHMtYXV0aC1jYWxsb3V0LXNlcnZpY2VgKQotIENsdXN0ZXIgcm93IGV4aXN0cyBpbiBgY2x1c3Rl" + - "cl9vaWRjX2J5X2NsdXN0ZXJfaWRgIENhc3NhbmRyYSB0YWJsZQotIGBoZWxtLXJldmFsLXNlcnZp" + - "Y2VgIGNvbmZpZ21hcCBoYXMgYGF1dGh6Lm9pZGMuZW5hYmxlZD10cnVlYAoKUm91dGUgdG8gW2Rp" + - "YWdub3NlLWZhaWxlZC1pbnN0YWxsLm1kXShkaWFnbm9zZS1mYWlsZWQtaW5zdGFsbC5tZCkgZm9y" + - "IHRob3NlIGNoZWNrcy4KUEsHCFBj3GS2BwAAtgcAAFBLAwQUAAgAAAAAACEAAAAAAAAAAAAAAAAA" + - "LgAJAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL3Byb21wdHMvdGVhcmRvd24ubWRVVAUAAQCm" + - "zhIjIFRlYXIgZG93biBhIHNlbGYtaG9zdGVkIE5WQ0YgZGVwbG95bWVudAoKKipTQUZFVFk6Kiog" + - "VGVhcmRvd24gZGVzdHJveXMgcGVyc2lzdGVudCBzdGF0ZSAoQ2Fzc2FuZHJhIHJvd3MsIE9wZW5C" + - "YW8gc2VhbCBrZXlzLCByZWdpc3RlcmVkIGNsdXN0ZXJzKS4gQWx3YXlzIGNvbmZpcm0gd2l0aCB0" + - "aGUgdXNlciBiZWZvcmUgYW55IHN0ZXAuCgojIyBUTDtEUiDigJQgYGRvd25gIGZvciBvbmUtc2hv" + - "dCwgYHVuaW5zdGFsbGAgZm9yIHBlci1wbGFuZQoKVGhlIENMSSBwcm92aWRlcyBhIHR3by10aWVy" + - "IHRlYXJkb3duIHN1cmZhY2Ugc3ltbWV0cmljIHdpdGggdGhlIGluc3RhbGwgc2lkZSAoUkVRLTIy" + - "LCBNKzExKToKCnwgVGllciB8IFVwIHNpZGUgKGV4aXN0aW5nKSB8IERvd24gc2lkZSB8CnwtLS18" + - "LS0tfC0tLXwKfCBQZXItcGxhbmUgcHJpbWl0aXZlIChyZW5kZXJzIFlBTUw7IEdpdE9wcy1mcmll" + - "bmRseSkgfCBgaW5zdGFsbCAtLWNvbnRyb2wtcGxhbmVgIC8gYGluc3RhbGwgLS1jb21wdXRlLXBs" + - "YW5lYCB8IGB1bmluc3RhbGwgLS1jb250cm9sLXBsYW5lYCAvIGB1bmluc3RhbGwgLS1jb21wdXRl" + - "LXBsYW5lYCB8CnwgT3JjaGVzdHJhdG9yIChvbmUtc2hvdCwgbXVsdGktcGxhbmUgKyBJQ01TKSB8" + - "IGB1cCAtLWNsdXN0ZXItbmFtZT1YYCB8IGBkb3duIC0tY2x1c3Rlci1uYW1lPVhgIC8gYGRvd24g" + - "LS1hbGxgIHwKClVzZSBgZG93bmAgZm9yIG5vcm1hbCB0ZWFyZG93bi4gVXNlIGB1bmluc3RhbGxg" + - "IGZvciBHaXRPcHMgKGNvbW1pdCBZQU1MOyBBcmdvL0ZsdXggYXBwbGllcykgb3Igc2NyaXB0ZWQg" + - "cGlwZWxpbmVzLiBBbHdheXMgc3RhcnQgd2l0aCBhIGRyeS1ydW4uCgojIyBEcnktcnVuIHNoYXBl" + - "cwoKfCBNb2RlIHwgTGl2ZXMgb24gfCBJbnZva2VzIGhlbG0vaGVsbWZpbGU/IHwgT3V0cHV0IHwK" + - "fC0tLXwtLS18LS0tfC0tLXwKfCBgLS1wbGFuLW9ubHlgIHwgYHVwYCAvIGBkb3duYCAob3JjaGVz" + - "dHJhdG9ycykgfCAqKk5vLioqIFdhbGtzIHJlc29sdmVkIHN0YWNrIGVudHJ5cG9pbnQgZmlsZXMs" + - "IGVtaXRzIHBoYXNlIHBsYW4gKyBFVEFzICsgaGVsbSB1bmluc3RhbGwgY29tbWFuZCBzdHJpbmdz" + - "LiB8IEV2ZW50IHN0cmVhbSB8CnwgYC0tbm8tYXBwbHlgIHwgYGluc3RhbGxgIC8gYHVuaW5zdGFs" + - "bGAgKHByaW1pdGl2ZXMpIHwgKipZZXMuKiogYGhlbG1maWxlIHRlbXBsYXRlYCBmb3IgaW5zdGFs" + - "bDsgYGhlbG0gZ2V0IG1hbmlmZXN0YCBmb3IgdW5pbnN0YWxsLiB8IFlBTUwgb24gc3Rkb3V0IHwK" + - "ClNvOgotIGBkb3duIC0tcGxhbi1vbmx5IC0tY2x1c3Rlci1uYW1lPVhgIOKAlCBzaG93IG1lIHRo" + - "ZSBvcmNoZXN0cmF0b3IgcGhhc2VzIHdpdGhvdXQgaW52b2tpbmcgYW55dGhpbmcuCi0gYHVuaW5z" + - "dGFsbCAtLW5vLWFwcGx5IC0tY29tcHV0ZS1wbGFuZSAtLWNsdXN0ZXItbmFtZT1YYCDigJQgZ2l2" + - "ZSBtZSB0aGUgWUFNTCBJJ2QgYGt1YmVjdGwgZGVsZXRlIC1mIC1gLgoKYGBgc2gKIyBTdGVwIDE6" + - "IEFMV0FZUyBwcmV2aWV3IGZpcnN0LgpudmNmLWNsaSBzZWxmLWhvc3RlZCBkb3duIC0tcGxhbi1v" + - "bmx5IC0tY2x1c3Rlci1uYW1lPW5jcC1sb2NhbCAtLWpzb24gfCBqcQoKIyBTdGVwIDI6IFJlYWwg" + - "cnVuLgpudmNmLWNsaSBzZWxmLWhvc3RlZCBkb3duIC0tY2x1c3Rlci1uYW1lPW5jcC1sb2NhbApg" + - "YGAKCiMjIFdoZW4gdG8gdXNlIHdoaWNoIGZvcm0KCnwgVXNlciBpbnRlbnQgfCBDb21tYW5kIHwK" + - "fC0tLXwtLS18CnwgIlJlbW92ZSB0aGlzIG9uZSBHUFUgY2x1c3RlciIgfCBgbnZjZi1jbGkgc2Vs" + - "Zi1ob3N0ZWQgZG93biAtLWNsdXN0ZXItbmFtZT1YYCB8CnwgIlRlYXIgZG93biBldmVyeXRoaW5n" + - "IiB8IGBudmNmLWNsaSBzZWxmLWhvc3RlZCBkb3duIC0tYWxsIC0tY29uZmlybWAgfAp8ICJTaG93" + - "IG1lIHRoZSBzdGVwcyB3aXRob3V0IGludm9raW5nIGFueXRoaW5nIiB8IGBudmNmLWNsaSBzZWxm" + - "LWhvc3RlZCBkb3duIC0tcGxhbi1vbmx5IC0tY2x1c3Rlci1uYW1lPVhgIHwKfCAiR2l2ZSBtZSBZ" + - "QU1MIHRvIGNvbW1pdCArIEFyZ28gZGVsZXRlcyBsYXRlciIgfCBgbnZjZi1jbGkgc2VsZi1ob3N0" + - "ZWQgdW5pbnN0YWxsIC0tbm8tYXBwbHkgLS1jb21wdXRlLXBsYW5lIC0tY2x1c3Rlci1uYW1lPVgg" + - "PiBkZWxldGUueWFtbGAgfAp8ICJKdXN0IHJlbW92ZSB0aGUgaGVsbSByZWxlYXNlcyBvbiBhIGNv" + - "bXB1dGUgcGxhbmUgKG5vIElDTVMgdW5yZWdpc3Rlciwgbm8gZHJhaW4pIiB8IGBudmNmLWNsaSBz" + - "ZWxmLWhvc3RlZCB1bmluc3RhbGwgLS1jb21wdXRlLXBsYW5lIC0tY2x1c3Rlci1uYW1lPVhgIHwK" + - "fCAiSnVzdCByZW1vdmUgdGhlIGNvbnRyb2wtcGxhbmUgaGVsbSByZWxlYXNlcyIgfCBgbnZjZi1j" + - "bGkgc2VsZi1ob3N0ZWQgdW5pbnN0YWxsIC0tY29udHJvbC1wbGFuZWAgfAoKIyMgU3RlcHMgZm9y" + - "IGBkb3duIC0tY2x1c3Rlci1uYW1lPVhgICh0aGUgc3RhbmRhcmQgcGF0aCkKCiMjIyAxLiBDb25m" + - "aXJtIHNjb3BlIHdpdGggdGhlIHVzZXIKCkFzazoKLSAiVGVhcmluZyBkb3duIGV2ZXJ5dGhpbmcg" + - "KGNvbXB1dGUgcGxhbmVzICsgY29udHJvbCBwbGFuZSArIElDTVMgcm93cykgb3IganVzdCBvbmUg" + - "Y29tcHV0ZSBwbGFuZT8iCi0gIkFyZSB0aGVyZSBBQ1RJVkUgZnVuY3Rpb24gZGVwbG95bWVudHMg" + - "b24gdGhpcyBjbHVzdGVyPyBgbnZjZi1jbGkgZnVuY3Rpb24gZGVwbG95IGxpc3RgIHRvIGNoZWNr" + - "LiIgKEltcG9ydGFudCDigJQgYGRvd25gIHdpbGwgcmVmdXNlIHdpdGhvdXQgYC0tZHJhaW4tYWN0" + - "aXZlPXRydWV8cHJvbXB0YCBpZiBhbnkgYXJlIEFDVElWRS4pCi0gIlNob3VsZCB3ZSB3aXBlIHBl" + - "cnNpc3RlbnQgc3RhdGUgKENhc3NhbmRyYSBkYXRhLCBPcGVuQmFvIHNlYWwga2V5cywgc3ItZGVm" + - "YXVsdCB1c2VyIGRhdGEpPyBEZWZhdWx0IGlzIHRvICoqcHJlc2VydmUqKiB0aGVtLiBgLS1yZW1v" + - "dmUtcGVyc2lzdGVudGAgb3B0cyBpbiB0byBkZWxldGlvbi4gKipMb3NzIGlzIHVucmVjb3ZlcmFi" + - "bGUuKioiCgojIyMgMi4gUnVuIHBsYW4tb25seSBmaXJzdAoKYGBgc2gKbnZjZi1jbGkgc2VsZi1o" + - "b3N0ZWQgZG93biAtLXBsYW4tb25seSAtLWNsdXN0ZXItbmFtZT0kTkFNRSAtLWpzb24gfCBqcQpg" + - "YGAKClRoaXMgZW1pdHMgYSBgcGxhbm5lZGAgZXZlbnQgbGlzdGluZyBlYWNoIHBoYXNlLCB0aGUg" + - "aGVsbSByZWxlYXNlcyB0aGF0IHdvdWxkIGJlIHVuaW5zdGFsbGVkLCB0aGUgSUNNUyByb3dzIHRo" + - "YXQgd291bGQgYmUgcmVtb3ZlZCwgYW5kIEVUQXMuIENvcHkgdGhlIGB3aWxsVW5pbnN0YWxsLmNv" + - "bW1hbmRzW11gIGFycmF5IHRvIHRoZSB1c2VyIOKAlCB0aG9zZSBhcmUgdGhlIGxpdGVyYWwgYGhl" + - "bG0gdW5pbnN0YWxsIOKApmAgaW52b2NhdGlvbnMgdGhlIG9yY2hlc3RyYXRvciB3aWxsIHJ1bi4K" + - "CiMjIyAzLiBFeGVjdXRlIHRoZSBkb3duCgpgYGBzaApudmNmLWNsaSBzZWxmLWhvc3RlZCBkb3du" + - "IC0tY2x1c3Rlci1uYW1lPSROQU1FIC0tanNvbgpgYGAKClBoYXNlcyAoMS03LCBtaXJyb3JzIMKn" + - "Ni43LjEpOgoKMS4gUHJlZmxpZ2h0IOKAlCBrdWJlY3RsIGFjY2VzcyArIElDTVMgcmVhY2hhYmxl" + - "CjIuIFJlc29sdmUgc3RhY2sgYnVuZGxlCjMuIERyYWluIGFjdGl2ZSBkZXBsb3ltZW50cyDigJQg" + - "cnVucyBgZnVuY3Rpb24gZGVwbG95IHJlbW92ZWAgZm9yIGVhY2ggQUNUSVZFIGRlcGxveW1lbnQs" + - "IHBvbGxzIHVudGlsIFNUT1BQRUQuIFN1YmplY3QgdG8gYC0tZHJhaW4tYWN0aXZlPXRydWV8ZmFs" + - "c2V8cHJvbXB0YCAoZGVmYXVsdCBpcyBgcHJvbXB0YCBpbiBUVFkpLgo0LiBVbmluc3RhbGwgY29t" + - "cHV0ZSBwbGFuZSDigJQgZGVsZWdhdGVzIHRvIGB1bmluc3RhbGwgLS1jb21wdXRlLXBsYW5lYDsg" + - "YGhlbG0gdW5pbnN0YWxsIDxyZWxlYXNlPmAgcGVyIHJlbGVhc2UgaW4gcmV2ZXJzZS1EQUcgb3Jk" + - "ZXIKNS4gUmVtb3ZlIHBlcnNpc3RlbnQgKHNraXBwZWQgdW5sZXNzIGAtLXJlbW92ZS1wZXJzaXN0" + - "ZW50YCkKNi4gVW5yZWdpc3RlciBjbHVzdGVyIGZyb20gSUNNUwo3LiBGaW5hbCB2ZXJpZnkKCiMj" + - "IyA0LiBUZWFyIGRvd24gdGhlIGNvbnRyb2wgcGxhbmUgKGlmIGFwcGxpY2FibGUpCgpgYGBzaApu" + - "dmNmLWNsaSBzZWxmLWhvc3RlZCB1bmluc3RhbGwgLS1jb250cm9sLXBsYW5lCmBgYAoKT3Igdmlh" + - "IHRoZSBvcmNoZXN0cmF0b3IncyBgLS1hbGxgIG1vZGUgaWYgZXZlcnkgY29tcHV0ZSBwbGFuZSBp" + - "cyBhbHNvIGdvaW5nIGF3YXkgKHNlZSBzdGVwIDUpLgoKYHVuaW5zdGFsbCAtLWNvbnRyb2wtcGxh" + - "bmVgIHJlZnVzZXMgaWYgYW55IGNvbXB1dGUgcGxhbmUgaXMgc3RpbGwgcmVnaXN0ZXJlZCBpbiBJ" + - "Q01TLiBVc2UgYC0tZm9yY2Utd2l0aC1yZWdpc3RlcmVkLWNsdXN0ZXJzYCB0byBvdmVycmlkZSAq" + - "Km9ubHkqKiBpZiB0aGUgdXNlciBleHBsaWNpdGx5IHdhbnRzIHRvIG9ycGhhbiBjb21wdXRlIHBs" + - "YW5lcyAoUFNBVCBhdXRoIGJyZWFrcyBmb3IgdGhvc2UgY2x1c3RlcnMg4oCUIHRoZXkgd2lsbCBz" + - "dGFydCBmYWlsaW5nIGV2ZXJ5IGhlYWx0aCBjaGVjaykuIEFsd2F5cyBzdGF0ZSB0aGUgY29uc2Vx" + - "dWVuY2UgYmVmb3JlIHBhc3NpbmcgdGhlIGZsYWcuCgojIyMgNS4gT3IsIG51a2UgZXZlcnl0aGlu" + - "ZwoKYGBgc2gKbnZjZi1jbGkgc2VsZi1ob3N0ZWQgZG93biAtLWFsbCAtLWNvbmZpcm0KYGBgCgpU" + - "aGlzIGl0ZXJhdGVzIGV2ZXJ5IHJlZ2lzdGVyZWQgY29tcHV0ZSBwbGFuZSBpbiBJQ01TLCBydW5z" + - "IHRoZSBwZXItY2x1c3RlciBkb3duIGZvciBlYWNoIGluIHBhcmFsbGVsIChib3VuZGVkIGJ5IGAt" + - "LWFsbC1jb25jdXJyZW5jeWAsIGRlZmF1bHQgNCksIHRoZW4gcnVucyBgdW5pbnN0YWxsIC0tY29u" + - "dHJvbC1wbGFuZWAuIEludGVyYWN0aXZlIG1vZGUgcHJvbXB0cyB0aGUgb3BlcmF0b3Igd2l0aCB0" + - "aGUgY2x1c3RlciBsaXN0IGJlZm9yZSBwcm9jZWVkaW5nOyBgLS1jb25maXJtYCBza2lwcyB0aGUg" + - "cHJvbXB0IGZvciBub24taW50ZXJhY3RpdmUgdXNlLgoKIyMgR2l0T3BzIHBhdGggKGlmIHVzZXIg" + - "aGFzIEFyZ28gLyBGbHV4KQoKYGBgc2gKIyBSZW5kZXIgZGVsZXRlIFlBTUwgZm9yIHRoZSBjb21w" + - "dXRlIHBsYW5lOgpudmNmLWNsaSBzZWxmLWhvc3RlZCB1bmluc3RhbGwgLS1uby1hcHBseSAtLWNv" + - "bXB1dGUtcGxhbmUgLS1jbHVzdGVyLW5hbWU9JE5BTUUgPiBkZWxldGUueWFtbAoKIyBPcGVyYXRv" + - "ciBjb21taXRzIGRlbGV0ZS55YW1sIHRvIHRoZWlyIEdpdE9wcyByZXBvLiBBcmdvL0ZsdXggYXBw" + - "bGllcyB0aGUgZGVsZXRpb24gb24gbmV4dCBzeW5jLgpnaXQgYWRkIGRlbGV0ZS55YW1sOyBnaXQg" + - "Y29tbWl0IC1tICJyZW1vdmUgY29tcHV0ZSBwbGFuZSAkTkFNRSI7IGdpdCBwdXNoCgojIEFmdGVy" + - "IEFyZ28gc3luYyByZW1vdmVzIHRoZSBLOHMgcmVzb3VyY2VzLCBzZXBhcmF0ZWx5IHJlbW92ZSB0" + - "aGUgSUNNUyByb3c6Cm52Y2YtY2xpIGNsdXN0ZXIgZGVsZXRlIC0tY2x1c3Rlci1pZD0kQ0xVU1RF" + - "Ul9JRApgYGAKCk5vdGU6IGAtLW5vLWFwcGx5YCBkb2VzIE5PVCBpbmNsdWRlIHRoZSBJQ01TIGBj" + - "bHVzdGVyIGRlbGV0ZWAgKGhlbG0gZG9lc24ndCBtYW5hZ2UgdGhhdCkuIE9wZXJhdG9ycyBmb2xs" + - "b3dpbmcgR2l0T3BzIG11c3QgcnVuIGBudmNmLWNsaSBjbHVzdGVyIGRlbGV0ZWAgc2VwYXJhdGVs" + - "eSwgb3IgdXNlIGBkb3duYCB0byBvcmNoZXN0cmF0ZSBib3RoLgoKIyMgRmFpbHVyZSByZWNvdmVy" + - "eQoKSWYgYGRvd25gIHBhcnRpYWwtZmFpbHMgbWlkLXdheSwgKipyZS1ydW4gdGhlIHNhbWUgY29t" + - "bWFuZCoqLiBUaGUgb3JjaGVzdHJhdG9yIGlzIGlkZW1wb3RlbnQ6IGBoZWxtIHVuaW5zdGFsbGAg" + - "c2tpcHMgcmVsZWFzZXMgdGhhdCBhcmUgYWxyZWFkeSBnb25lLCBhbmQgYGNsdXN0ZXIgZGVsZXRl" + - "IC0taWdub3JlLW1pc3NpbmdgIHNraXBzIElDTVMgcm93cyB0aGF0IGFyZSBhbHJlYWR5IGdvbmUu" + - "IFBoYXNlIDQgKyA2IGVtaXQgYHBoYXNlOiBza2lwcGVkIChhbHJlYWR5IGNsZWFuKWAgb24gdGhl" + - "IHNlY29uZCBydW4uCgpJZiBhIGBwaGFzZV9mYWlsZWRgIGV2ZW50IHN1cmZhY2VzOgotIGBlcnJD" + - "YXRlZ29yeTogImhlbG1fcGVuZGluZ191cGdyYWRlIiwgcmV0cnlDbGFzczogImFmdGVyX3JlbWVk" + - "aWF0aW9uImAg4oaSIHJ1biBgaGVsbSByb2xsYmFjayA8cmVsZWFzZT4gMCAtLWt1YmUtY29udGV4" + - "dD3igKZgICh0aGUgbWVzc2FnZSBpbmNsdWRlcyB0aGUgZXhhY3QgcmVsZWFzZSBuYW1lKSB0aGVu" + - "IHJlLXJ1biBgZG93bmAuIERvIE5PVCBhdXRvLXJvbGxiYWNrIHdpdGhvdXQgdXNlciBjb25maXJt" + - "YXRpb24uCi0gYGVyckNhdGVnb3J5OiAiY29tcHV0ZV9wbGFuZSIsIHJldHJ5Q2xhc3M6ICJhZnRl" + - "cl9yZW1lZGlhdGlvbiJgIHdpdGggbWVzc2FnZSBhYm91dCBBQ1RJVkUgZGVwbG95bWVudHMg4oaS" + - "IHVzZXIgcGFzc2VkIGAtLWRyYWluLWFjdGl2ZT1mYWxzZWAgYnV0IGRlcGxveW1lbnRzIGV4aXN0" + - "LiBSZS1ydW4gd2l0aCBgLS1kcmFpbi1hY3RpdmU9dHJ1ZWAgb3IgYC0tZHJhaW4tYWN0aXZlPXBy" + - "b21wdGAgYW5kIGNvbmZpcm0gd2l0aCB0aGUgdXNlci4KLSBPdGhlciBjYXRlZ29yaWVzIOKGkiBz" + - "dXJmYWNlIGBlcnJNZXNzYWdlYCArIGVhY2ggYHJlbWVkaWF0aW9uYCBzdHJpbmcgdmVyYmF0aW0u" + - "IFNUT1AuIERvIG5vdCBwcm9wb3NlIHJldHJ5IHdpdGhvdXQgdXNlciBpbnB1dC4KCiMjIEFsd2F5" + - "cyBjb25maXJtCgpGb3IgZXZlcnkgYG52Y2YtY2xpIHNlbGYtaG9zdGVkIGRvd25gIG9yIGB1bmlu" + - "c3RhbGxgIGludm9jYXRpb24sIGVzcGVjaWFsbHkgd2l0aCBkZXN0cnVjdGl2ZSBmbGFnczoKLSBT" + - "dGF0ZSB0aGUgZXhhY3QgYC0tY2x1c3Rlci1uYW1lYCAob3IgYC0tYWxsYCkuCi0gU3RhdGUgd2hh" + - "dCdzIGxvc3QgKGUuZy4gImFsbCBmdW5jdGlvbiBkZXBsb3ltZW50cyBzY2hlZHVsZWQgb24gYG5j" + - "cC1sb2NhbGAgd2lsbCBzdG9wOyBjb21wdXRlIHBsYW5lIHdpbGwgZGVyZWdpc3RlciBmcm9tIElD" + - "TVMiKS4KLSBJZiBgLS1yZW1vdmUtcGVyc2lzdGVudGAgaXMgYmVpbmcgY29uc2lkZXJlZCwgc3Rh" + - "dGUgdGhhdCBDYXNzYW5kcmEgcm93cyArIE9wZW5CYW8gc2VhbCBrZXlzIHdpbGwgYmUgZGVsZXRl" + - "ZCBhbmQgdGhhdCB0aGlzIGlzIHVucmVjb3ZlcmFibGUuCi0gV2FpdCBmb3IgZXhwbGljaXQgdXNl" + - "ciBjb25maXJtYXRpb24uCi0gTmV2ZXIgcHJvcG9zZSBgLS1mb3JjZS13aXRoLXJlZ2lzdGVyZWQt" + - "Y2x1c3RlcnNgIHdpdGhvdXQgZXhwbGFpbmluZyB0aGF0IGNvbXB1dGUgcGxhbmVzIHdpbGwgYmUg" + - "b3JwaGFuZWQuCi0gTmV2ZXIgcHJvcG9zZSBgLS1yZW1vdmUtcGVyc2lzdGVudGAgd2l0aG91dCBl" + - "eHBsYWluaW5nIHRoZSBsb3NzLgoKIyMgTWFudWFsIGZhbGxiYWNrIChpZiBgbnZjZi1jbGkgc2Vs" + - "Zi1ob3N0ZWQge3VuaW5zdGFsbCxkb3dufWAgaXMgdW5hdmFpbGFibGUpCgpJZiB0aGUgdXNlciBp" + - "cyBvbiBhIENMSSB2ZXJzaW9uIG9sZGVyIHRoYW4gTSsxMSwgZmFsbCBiYWNrIHRvOgoKYGBgc2gK" + - "IyBQZXIgY29tcHV0ZSBwbGFuZSAob24gaXRzIGt1YmVjdGwgY29udGV4dCk6CmhlbG0gdW5pbnN0" + - "YWxsIG52Y2EtYWdlbnQgLW4gbnZjYS1zeXN0ZW0KaGVsbSB1bmluc3RhbGwgbnZjYS1vcGVyYXRv" + - "ciAtbiBudmNhLW9wZXJhdG9yCmhlbG0gdW5pbnN0YWxsIGltYWdlLWNyZWRlbnRpYWwtaGVscGVy" + - "IC1uIG52Y2Etc3lzdGVtCmhlbG0gdW5pbnN0YWxsIHNoYXJlZHN0b3JhZ2UgLW4gbnZjYS1zeXN0" + - "ZW0KCiMgRHJhaW4gdGhlIElDTVMgcm93OgpudmNmLWNsaSBjbHVzdGVyIGRlbGV0ZSAtLWNsdXN0" + - "ZXItaWQ9PGlkPgoKIyBDb250cm9sIHBsYW5lIHRlYXJkb3duIChvbiBpdHMga3ViZWN0bCBjb250" + - "ZXh0KToKY2QgbnZjZi1zZWxmLW1hbmFnZWQtc3RhY2sKbWFrZSBkZXN0cm95ICAgIyBpbnZva2Vz" + - "IGhlbG1maWxlIGRlc3Ryb3kgYWNyb3NzIGFsbCByZWxlYXNlcwoKIyBJZiB1c2luZyBzcGxpdCBz" + - "dGFjayBidW5kbGVzLCB0ZWFyZG93biBjb21wdXRlIHBsYW5lIHJlbGVhc2VzIHRvbzoKY2QgLi4v" + - "bnZjZi1jb21wdXRlLXBsYW5lLXN0YWNrCm1ha2UgZGVzdHJveQpgYGAKClRoaXMgaXMgdGhlIG1h" + - "bnVhbCBwYXRoOyBwcmVmZXIgdGhlIG5ldyBzdWJjb21tYW5kcyB3aGVuZXZlciB0aGV5J3JlIGlu" + - "c3RhbGxlZC4KCiMjIFdoYXQgYGt1YmVjdGwgZGVsZXRlIHB2Y2AgZG9lcwoKSWYgdGhlIHVzZXIg" + - "YXNrcyAid2h5IGlzIG15IG5ldyBpbnN0YWxsIHNlZWluZyB0aGUgb2xkIGRhdGE/IiDigJQgdGhl" + - "IFN0YXRlZnVsU2V0IFBWQ3MgKENhc3NhbmRyYSwgT3BlbkJhbykgYXJlIE5PVCBkZWxldGVkIGJ5" + - "IGBoZWxtIHVuaW5zdGFsbGAgKGFuZCBzbyBhcmUgTk9UIGRlbGV0ZWQgYnkgYG52Y2YtY2xpIHNl" + - "bGYtaG9zdGVkIGRvd25gIGVpdGhlciwgYnkgZGVmYXVsdCkuIFRoZXkgcGVyc2lzdCBpbnRlbnRp" + - "b25hbGx5IHNvIGEgcmUtYHVwYCBjYW4gcmVzdW1lIGFnYWluc3QgZXhpc3RpbmcgZGF0YS4gVG8g" + - "d2lwZSBjb21wbGV0ZWx5IG9uIHRoZSBuZXh0IGBkb3duYDoKCmBgYHNoCm52Y2YtY2xpIHNlbGYt" + - "aG9zdGVkIGRvd24gLS1jbHVzdGVyLW5hbWU9bmNwLWxvY2FsIC0tcmVtb3ZlLXBlcnNpc3RlbnQK" + - "YGBgCgpPciwgcG9zdC1kb3duLCBtYW51YWxseToKCmBgYHNoCmt1YmVjdGwgZGVsZXRlIHB2YyAt" + - "biBjYXNzYW5kcmEtc3lzdGVtIC0tYWxsCmt1YmVjdGwgZGVsZXRlIHB2YyAtbiB2YXVsdC1zeXN0" + - "ZW0gLS1hbGwKYGBgCgoqKkNvbmZpcm0gd2l0aCB1c2VyLioqIFRoaXMgaXMgdGhlIGRlc3RydWN0" + - "aXZlIHN0ZXAuClBLBwgSkzNZ4CEAAOAhAABQSwMEFAAIAAAAAAAhAAAAAAAAAAAAAAAAADAACQBk" + - "YXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9yZWZlcmVuY2UvY29tbWFuZHMubWRVVAUAAQCmzhIj" + - "IGBudmNmLWNsaWAgY29tbWFuZCByZWZlcmVuY2UKCkZ1bGwgc3ViY29tbWFuZCBsaXN0LiBBbHdh" + - "eXMgcGFpciB3aXRoIFtmbGFncy5tZF0oZmxhZ3MubWQpIGZvciBnbG9iYWwgZmxhZ3MgYW5kIFtl" + - "eGl0LWNvZGVzLm1kXShleGl0LWNvZGVzLm1kKSBmb3IgcmV0dXJuIGNvZGVzLgoKIyMgU2VsZi1o" + - "b3N0ZWQgbGlmZWN5Y2xlCgp8IENvbW1hbmQgfCBQdXJwb3NlIHwgT3V0cHV0IHwgTm90ZXMgfAp8" + - "LS0tfC0tLXwtLS18LS0tfAp8IGBzZWxmLWhvc3RlZCBjaGVjayAtLXByZSBbZmxhZ3NdYCB8IFBy" + - "ZS1mbGlnaHQgdmFsaWRhdGlvbiAobm8gYWRtaW4gY3JlZHMpIHwgc3RyZWFtaW5nIGV2ZW50cyB8" + - "IFBlci1yb2xlIHdpdGggYC0tY29udHJvbC1wbGFuZS1jb250ZXh0YCAvIGAtLWNvbXB1dGUtcGxh" + - "bmUtY29udGV4dGA7IGAtLWxvY2FsLW9ubHlgIHNraXBzIGt1YmVjdGwgfAp8IGBzZWxmLWhvc3Rl" + - "ZCBjaGVjayAtLWNvbnRyb2wtcGxhbmUgWy0td2FpdCBEVVJdYCB8IEV2ZXJ5IENQIHJlbGVhc2Ug" + - "aGVhbHRoeSB8IHN0cmVhbWluZyBldmVudHMgfCBQb2xscyB1bnRpbCBwYXNzIG9yIGAtLXdhaXRg" + - "IGVsYXBzZXMgfAp8IGBzZWxmLWhvc3RlZCBjaGVjayAtLWNvbXB1dGUtcGxhbmUgLS1jbHVzdGVy" + - "LW5hbWU9WCBbLS13YWl0IERVUl1gIHwgUGVyLWNsdXN0ZXIgd29ya2VyIHN0YXRlIHwgc3RyZWFt" + - "aW5nIGV2ZW50cyB8IE5WQ0EgKyBvcGVyYXRvciArIEpXS1MtZmluZ2VycHJpbnQgbWF0Y2ggfAp8" + - "IGBzZWxmLWhvc3RlZCBjaGVjayAtLWFsbCBbLS13YWl0IERVUl1gIHwgRmFuLW91dCBvdmVyIGFs" + - "bCBvZiB0aGUgYWJvdmUgfCBzdHJlYW1pbmcgZXZlbnRzIHwgfAp8IGBzZWxmLWhvc3RlZCBpbnN0" + - "YWxsIC0tY29udHJvbC1wbGFuZWAgfCBSZW5kZXIgY29udHJvbC1wbGFuZSBtYW5pZmVzdHMgfCBZ" + - "QU1MIG9uIHN0ZG91dCB8IFBpcGUgdG8gYGt1YmVjdGwgYXBwbHkgLWYgLWAgfAp8IGBzZWxmLWhv" + - "c3RlZCBpbnN0YWxsIC0tY29tcHV0ZS1wbGFuZSAtLWNsdXN0ZXItbmFtZT1YYCB8IFJlZ2lzdGVy" + - "IGNsdXN0ZXIgKyByZW5kZXIgY29tcHV0ZSBtYW5pZmVzdHMgfCBZQU1MIG9uIHN0ZG91dCB8IE9u" + - "ZSBpbnZvY2F0aW9uIHBlciBHUFUgY2x1c3RlciB8CnwgYHNlbGYtaG9zdGVkIHVwIC0tY2x1c3Rl" + - "ci1uYW1lPVhgIHwgT25lLXNob3QgZmlyc3QgaW5zdGFsbCAoYm90aCBwbGFuZXMpIHwgKGVtcHR5" + - "KSBzdGRvdXQsIHByb2dyZXNzIG9uIHN0ZGVyciB8IEFsd2F5cyBpbnN0YWxscyBib3RoIHBsYW5l" + - "czsgZm9yIGNvbXB1dGUtb25seSB1c2UgYGFkZC1jb21wdXRlLXBsYW5lYCB8CnwgYHNlbGYtaG9z" + - "dGVkIHVwIC0tcGxhbi1vbmx5IC0tY2x1c3Rlci1uYW1lPVhgIHwgRHJ5LXJ1biBwcmV2aWV3IHwg" + - "SlNPTkwgb24gc3RkZXJyIHwgQWdlbnQtZnJpZW5kbHksIG5vIGNsdXN0ZXIgY2hhbmdlcyB8Cnwg" + - "YHNlbGYtaG9zdGVkIGFkZC1jb21wdXRlLXBsYW5lIC0tY2x1c3Rlci1uYW1lPVggLS1jb21wdXRl" + - "LXBsYW5lLWNvbnRleHQ9WSAtLWljbXMtdXJsPVVSTCAtLXRva2VuPSRKV1RgIHwgQWRkIGEgY29t" + - "cHV0ZSBwbGFuZSB0byBhbiBleGlzdGluZyBjb250cm9sIHBsYW5lIHwgcHJvZ3Jlc3Mgb24gc3Rk" + - "ZXJyIHwgRm9yIDJuZCwgM3JkLCDigKYgR1BVIGNsdXN0ZXIgYWZ0ZXIgdGhlIGZpcnN0IGluc3Rh" + - "bGwuIENQIG5vdCB0b3VjaGVkLiB8CnwgYHNlbGYtaG9zdGVkIHN0YXR1cyBbLS1jbHVzdGVyLW5h" + - "bWU9WF0gWy0td2F0Y2hdYCB8IFNuYXBzaG90IGNsdXN0ZXIgaGVhbHRoIHwgVFRZL3BsYWluL0pT" + - "T05MIHwgYC0td2F0Y2hgIGZvciBsaXZlIHJlLXJlbmRlciB8CnwgYHNlbGYtaG9zdGVkIHVuaW5z" + - "dGFsbCAtLWNvbXB1dGUtcGxhbmUgLS1jbHVzdGVyLW5hbWU9WGAgfCBQZXItcGxhbmUgcHJpbWl0" + - "aXZlOiBgaGVsbWZpbGUgZGVzdHJveWAgb24gb25lIGNvbXB1dGUgcGxhbmUgKG5vIElDTVMgdW5y" + - "ZWdpc3Rlciwgbm8gZHJhaW4pIHwgcHJvZ3Jlc3MgfCBKdXN0IHRoZSBoZWxtIHJlbGVhc2VzIG9u" + - "IHRoYXQgY29tcHV0ZSBwbGFuZSB8CnwgYHNlbGYtaG9zdGVkIHVuaW5zdGFsbCAtLWNvbnRyb2wt" + - "cGxhbmUgWy0tZm9yY2Utd2l0aC1yZWdpc3RlcmVkLWNsdXN0ZXJzXWAgfCBQZXItcGxhbmUgcHJp" + - "bWl0aXZlOiBgaGVsbWZpbGUgZGVzdHJveWAgb24gdGhlIGNvbnRyb2wgcGxhbmUgfCBwcm9ncmVz" + - "cyB8IFJlZnVzZXMgaWYgY29tcHV0ZSBwbGFuZXMgc3RpbGwgcmVnaXN0ZXJlZCB1bmxlc3MgYC0t" + - "Zm9yY2Utd2l0aC1yZWdpc3RlcmVkLWNsdXN0ZXJzYCB8CnwgYHNlbGYtaG9zdGVkIHVuaW5zdGFs" + - "bCAtLW5vLWFwcGx5IDxwbGFuZT5gIHwgUmVuZGVyIGRlbGV0ZSBZQU1MIHZpYSBgaGVsbSBnZXQg" + - "bWFuaWZlc3RgIHBlciByZWxlYXNlIHwgWUFNTCBvbiBzdGRvdXQgfCBHaXRPcHM7IHBpcGUgdG8g" + - "YGt1YmVjdGwgZGVsZXRlIC1mIC1gIG9yIGNvbW1pdCArIEFyZ28gYXBwbGllcy4gTWlycm9ycyBg" + - "aW5zdGFsbCAtLW5vLWFwcGx5YCB8CnwgYHNlbGYtaG9zdGVkIGRvd24gLS1jbHVzdGVyLW5hbWU9" + - "WCBbLS1kcmFpbi1hY3RpdmVdIFstLXJlbW92ZS1wZXJzaXN0ZW50XWAgfCBPcmNoZXN0cmF0b3I6" + - "IGRyYWluIOKGkiB1bmluc3RhbGwgLS1jb21wdXRlLXBsYW5lIOKGkiBjbHVzdGVyIGRlbGV0ZSBp" + - "biBJQ01TIHwgcHJvZ3Jlc3MgfCBTeW1tZXRyaWMgY29tcGFuaW9uIHRvIGB1cCAtLWNsdXN0ZXIt" + - "bmFtZT1YYCB8CnwgYHNlbGYtaG9zdGVkIGRvd24gLS1hbGwgWy0tY29uZmlybV1gIHwgT3JjaGVz" + - "dHJhdG9yOiB0ZWFyIGRvd24gZXZlcnkgcmVnaXN0ZXJlZCBjb21wdXRlIHBsYW5lICsgY29udHJv" + - "bCBwbGFuZSB8IHByb2dyZXNzIHwgQm91bmRlZCBwYXJhbGxlbGlzbSB2aWEgYC0tYWxsLWNvbmN1" + - "cnJlbmN5YCAoZGVmYXVsdCA0KTsgYC0tY29uZmlybWAgcmVxdWlyZWQgaW4gbm9uLWludGVyYWN0" + - "aXZlIHwKfCBgc2VsZi1ob3N0ZWQgZG93biAtLXBsYW4tb25seSAuLi5gIHwgT3JjaGVzdHJhdG9y" + - "IGRyeS1ydW46IHBoYXNlcyArIGhlbG0gcmVsZWFzZXMgKyBJQ01TIHJvd3MgKyBFVEFzIChubyBo" + - "ZWxtL2hlbG1maWxlIGNvbnRhY3QpIHwgSlNPTkwgfCAqKkFsd2F5cyBydW4gYmVmb3JlIGFueSBh" + - "Y3R1YWwgYGRvd25gKiogfAoKIyMgQ2x1c3RlciBtYW5hZ2VtZW50Cgp8IENvbW1hbmQgfCBQdXJw" + - "b3NlIHwgTm90ZXMgfAp8LS0tfC0tLXwtLS18CnwgYGNsdXN0ZXIgcmVnaXN0ZXIgLS1uYW1lPVgg" + - "LS1uY2EtaWQ9WSBbLS1yZWdpb249Wl0gWy0taWdub3JlLWV4aXN0aW5nXWAgfCBSZWdpc3RlciBh" + - "IEpXS1MrT0lEQyB3aXRoIElDTVMgfCBVc2VkIGJ5IGB1cGAgUGhhc2UgNSBpbnRlcm5hbGx5OyBz" + - "dGFuZGFsb25lIGZvciBtYW51YWwgcmVnaXN0cmF0aW9uIHwKfCBgY2x1c3RlciBsaXN0YCB8IExp" + - "c3QgcmVnaXN0ZXJlZCBjbHVzdGVycyB8IE91dHB1dCBpcyBZQU1MIGJ5IGRlZmF1bHQ7IGAtLWpz" + - "b25gIGZvciBtYWNoaW5lIHwKfCBgY2x1c3RlciByb3RhdGUgLS1jbHVzdGVyLWlkPUlEYCB8IFJl" + - "LWZldGNoIEpXS1MgZnJvbSBLOHMgYW5kIFBVVCB0byBJQ01TIHwgQWZ0ZXIgSzhzIEFQSSBzZXJ2" + - "ZXIgc2lnbmluZyBrZXkgcm90YXRpb24gfAp8IGBjbHVzdGVyIGRlbGV0ZSAtLWNsdXN0ZXItaWQ9" + - "SURgIHwgUmVtb3ZlIElDTVMgcm93IHwgKipERVNUUlVDVElWRTogY29uZmlybSB3aXRoIHVzZXIq" + - "KiB8CgojIyBGdW5jdGlvbnMKCnwgQ29tbWFuZCB8IFB1cnBvc2UgfCBOb3RlcyB8CnwtLS18LS0t" + - "fC0tLXwKfCBgZnVuY3Rpb24gY3JlYXRlIC0taW5wdXQtZmlsZT1GSUxFYCB8IENyZWF0ZSBmdW5j" + - "dGlvbiBtZXRhZGF0YSB8IFJldHVybnMgRnVuY3Rpb24gSUQgKyBWZXJzaW9uIElEOyBMTE0gZnVu" + - "Y3Rpb25zIHVzZSBgZnVuY3Rpb25UeXBlOiAiTExNImAgYW5kIGBtb2RlbHNbXS5sbG1Db25maWcu" + - "dXJpc2AgZm9yIGAvdjEvY2hhdC9jb21wbGV0aW9uc2AsIGAvdjEvcmVzcG9uc2VzYCwgYW5kIGAv" + - "djEvZW1iZWRkaW5nc2AgfAp8IGBmdW5jdGlvbiBsaXN0YCAvIGBmdW5jdGlvbiBsaXN0LWlkc2Ag" + - "fCBMaXN0IGZ1bmN0aW9ucyAvIElEcyBvbmx5IHwgfAp8IGBmdW5jdGlvbiBnZXQgLS1mdW5jdGlv" + - "bi1pZD1JRCAtLXZlcnNpb24taWQ9VklEYCB8IEZ1bmN0aW9uIG1ldGFkYXRhIHwgfAp8IGBmdW5j" + - "dGlvbiB1cGRhdGUgLS1mdW5jdGlvbi1pZD1JRCAtLXZlcnNpb24taWQ9VklEIC0tdGFncz1UQUdb" + - "LFRBR11gIHwgVXBkYXRlIGZ1bmN0aW9uIHRhZ3MgfCB8CnwgYGZ1bmN0aW9uIHVwZGF0ZSAtLWZ1" + - "bmN0aW9uLWlkPUlEIC0tdmVyc2lvbi1pZD1WSUQgLS1sbG0tbW9kZWwtdXBkYXRlPVNQRUNgIHwg" + - "VXBkYXRlIExMTSBtb2RlbCByb3V0aW5nIGNvbmZpZyB8IGBTUEVDYCB1c2VzIGBuYW1lPTxtb2Rl" + - "bD4scm91dGluZ01ldGhvZD08bWV0aG9kPix0b2tlblJhdGVMaW1pdD08bGltaXQ+YDsgYWNjZXB0" + - "ZWQgbWV0aG9kcyBhcmUgbGlzdGVkIGluIFtmbGFncy5tZF0oZmxhZ3MubWQpIHwKfCBgZnVuY3Rp" + - "b24gZGVwbG95IGNyZWF0ZSAtLWlucHV0LWZpbGU9RklMRWAgfCBTY2hlZHVsZSBhIGRlcGxveW1l" + - "bnQgfCBCbG9ja3MgdW50aWwgQUNUSVZFIChkZWZhdWx0IDkwMHMpIHwKfCBgZnVuY3Rpb24gZGVw" + - "bG95IGdldCAtLWZ1bmN0aW9uLWlkPUlEIC0tdmVyc2lvbi1pZD1WSUQgWy0tanNvbl1gIHwgRGVw" + - "bG95bWVudCBzdGF0dXMgfCBgZnVuY3Rpb25TdGF0dXM6IEFDVElWRVx8REVQTE9ZSU5HXHxFUlJP" + - "Ulx8RkFJTEVEYCB8CnwgYGZ1bmN0aW9uIGRlcGxveSB1cGRhdGUgLS1pbnB1dC1maWxlPUZJTEVg" + - "IHwgTW9kaWZ5IGEgZGVwbG95bWVudCBpbiBwbGFjZSB8IHwKfCBgZnVuY3Rpb24gZGVwbG95IHJl" + - "bW92ZSAtLWZ1bmN0aW9uLWlkPUlEIC0tdmVyc2lvbi1pZD1WSURgIHwgU3RvcCBhIGRlcGxveW1l" + - "bnQsIGtlZXAgZnVuY3Rpb24gcmVjb3JkIHwgfAp8IGBmdW5jdGlvbiBpbnZva2UgLS1pbnB1dC1m" + - "aWxlPUZJTEVgIHwgQ2FsbCBhIHJlZ3VsYXIgZnVuY3Rpb24gfCBSZXF1aXJlcyBBUEkga2V5IChu" + - "b3QgYWRtaW4gdG9rZW4pOyBMTE0gZnVuY3Rpb25zIGFyZSBpbnZva2VkIHRocm91Z2ggYGxsbS5p" + - "bnZvY2F0aW9uLjxkb21haW4+YCB3aXRoIGBtb2RlbDogIjxmdW5jdGlvbi1pZD4vPG1vZGVsLW5h" + - "bWU+ImAgfAp8IGBmdW5jdGlvbiBkZWxldGUgLS1mdW5jdGlvbi1pZD1JRCAtLXZlcnNpb24taWQ9" + - "VklEYCB8IFJlbW92ZSBmdW5jdGlvbiArIGRlcGxveW1lbnQgfCAqKkRFU1RSVUNUSVZFOiBjb25m" + - "aXJtIHdpdGggdXNlcioqIHwKCiMjIFRhc2tzCgpUYXNrIGNvbW1hbmRzIHJlcXVpcmUgYE5WQ0Zf" + - "QVBJX0tFWWAgc2V0IHRvIGEgdGFzay1zY29wZWQga2V5IGFuZCBgTlZDRl9CQVNFX05WQ1RfVVJM" + - "YCBzZXQgdG8gdGhlIE5WQ1QgZ2F0ZXdheSBlbmRwb2ludC4gSW4gYSBmcmVzaCBzZXNzaW9uLCBy" + - "ZWFkIGBudmN0QXBpS2V5YCBmcm9tIGB+Ly5udmNmLWNsaS5zdGF0ZWAgYW5kIGluamVjdCBpdCBh" + - "cyBgTlZDRl9BUElfS0VZYCB3aXRob3V0IGxvZ2dpbmcgdGhlIHZhbHVlOyBjaGVjayBgbnZjdEFw" + - "aUtleUV4cGlyYXRpb25gIGZpcnN0IGFuZCByZWdlbmVyYXRlIHdpdGggYGFwaS1rZXkgZ2VuZXJh" + - "dGUgLS1mb3IgdGFzayAtLXZhbGlkYXRlYCBpZiBleHBpcmVkLiBSdW4gYGFwaS1rZXkgZ2VuZXJh" + - "dGUgLS1mb3IgdGFza2AgYWZ0ZXIgYGluaXRgIHRvIG1pbnQgYSBuZXcga2V5LgoKfCBDb21tYW5k" + - "IHwgUHVycG9zZSB8IE5vdGVzIHwKfC0tLXwtLS18LS0tfAp8IGB0YXNrIGNyZWF0ZSAtLW5hbWU9" + - "WCAtLWdwdT1HUFUgLS1pbnN0YW5jZS10eXBlPVRZUEUgLS1pbWFnZT1JTUdgIHwgU3VibWl0IGEg" + - "Y29udGFpbmVyIHRhc2sgfCBTYXZlcyB0YXNrIElEIHRvIENMSSBzdGF0ZTsgdXNlIGAtLWlucHV0" + - "LWZpbGVgIGZvciByZXBlYXRhYmxlIGNvbmZpZ3MgfAp8IGB0YXNrIGNyZWF0ZSAtLW5hbWU9WCAt" + - "LWdwdT1HUFUgLS1pbnN0YW5jZS10eXBlPVRZUEUgLS1oZWxtLWNoYXJ0PUNIQVJUYCB8IFN1Ym1p" + - "dCBhIEhlbG0gdGFzayB8IGAtLWhlbG0tY2hhcnRgIHJlcGxhY2VzIGAtLWltYWdlYCB8CnwgYHRh" + - "c2sgY3JlYXRlIC0taW5wdXQtZmlsZT1GSUxFYCB8IFN1Ym1pdCBhIHRhc2sgZnJvbSBhIEpTT04g" + - "Y29uZmlnIGZpbGUgfCBSZWNvbW1lbmRlZCBmb3IgcmVwZWF0YWJsZSBjb25maWd1cmF0aW9ucyB8" + - "CnwgYHRhc2sgbGlzdCBbLS1zdGF0dXM9U1RBVFVTXSBbLS1saW1pdD1OXWAgfCBMaXN0IHRhc2tz" + - "LCBvcHRpb25hbGx5IGZpbHRlcmVkIGJ5IHN0YXR1cyB8IFN0YXR1c2VzOiBgUVVFVUVEYCwgYExB" + - "VU5DSEVEYCwgYFJVTk5JTkdgLCBgQ09NUExFVEVEYCwgYEVSUk9SRURgLCBgQ0FOQ0VMRURgLCBg" + - "RVhDRUVERURfTUFYX1JVTlRJTUVfRFVSQVRJT05gLCBgRVhDRUVERURfTUFYX1FVRVVFRF9EVVJB" + - "VElPTmAgfAp8IGB0YXNrIGdldCBbdGFza0lkXWAgfCBHZXQgdGFzayBkZXRhaWxzIHwgVXNlcyBz" + - "YXZlZCB0YXNrIElEIGZyb20gc3RhdGUgaWYgb21pdHRlZCB8CnwgYHRhc2sgZXZlbnRzIFt0YXNr" + - "SWRdIFstLWxpbWl0PU5dYCB8IExpc3QgbGlmZWN5Y2xlIGV2ZW50cyBmb3IgYSB0YXNrIHwgfAp8" + - "IGB0YXNrIHJlc3VsdHMgW3Rhc2tJZF1gIHwgTGlzdCByZXN1bHQgYXJ0aWZhY3RzIGZvciBhIGNv" + - "bXBsZXRlZCB0YXNrIHwgUmV0dXJucyBlbXB0eSBsaXN0IHdoZW4gYHJlc3VsdEhhbmRsaW5nU3Ry" + - "YXRlZ3lgIGlzIGBOT05FYDsgcmVzdWx0IHVwbG9hZCBub3QgeWV0IHN1cHBvcnRlZCB8CnwgYHRh" + - "c2sgY2FuY2VsIFt0YXNrSWRdYCB8IENhbmNlbCBhIHJ1bm5pbmcgdGFzayB8IE5vLW9wIGlmIGFs" + - "cmVhZHkgaW4gdGVybWluYWwgc3RhdGUgfAp8IGB0YXNrIGRlbGV0ZSBbdGFza0lkXWAgfCBEZWxl" + - "dGUgYSB0YXNrIHJlY29yZCB8ICoqU3RvcCwgc3RhdGUgdGFzayBJRCArIGN1cnJlbnQgc3RhdHVz" + - "LCBhbmQgd2FpdCBmb3IgYSBzdWJzZXF1ZW50IHVzZXIgcmVwbHkgZXhwbGljaXRseSBjb25maXJt" + - "aW5nIGRlbGV0aW9uIG9mIHRoYXQgc3BlY2lmaWMgdGFzay4gRG8gbm90IHRyZWF0IHRoZSBvcmln" + - "aW5hbCBkZWxldGUgcmVxdWVzdCBhcyBjb25maXJtYXRpb24uKiogfAp8IGB0YXNrIHVwZGF0ZS1z" + - "ZWNyZXRzIFt0YXNrSWRdIC0tc2VjcmV0cyBOQU1FPXZhbHVlYCB8IFVwZGF0ZSBzZWNyZXRzIG9u" + - "IGEgdGFzazsgc3VwcGxpZWQgc2VjcmV0cyBhcmUgYWRkZWQgb3IgdXBkYXRlZCBieSBuYW1lLCBl" + - "eGlzdGluZyBzZWNyZXRzIG5vdCBpbiB0aGUgcmVxdWVzdCBhcmUgcHJlc2VydmVkIHwgVmFsdWVz" + - "IGFyZSBlbmNyeXB0ZWQgYXQgcmVzdCB8CnwgYHRhc2sgYnVsayAtLXRhc2staWRzPUlEMVssSUQy" + - "LOKApl1gIHwgRmV0Y2ggZGV0YWlscyBmb3IgbXVsdGlwbGUgdGFza3MgaW4gb25lIHJlcXVlc3Qg" + - "fCB8CgojIyBBdXRoCgp8IENvbW1hbmQgfCBQdXJwb3NlIHwgTm90ZXMgfAp8LS0tfC0tLXwtLS18" + - "CnwgYGluaXRgIHwgTWludCBhZG1pbiB0b2tlbiBmcm9tIEFQSSBLZXlzIHZpYSBwdWJsaWMgYXBp" + - "IGdhdGV3YXkgfCBJZGVtcG90ZW50OyB3cml0ZXMgYH4vLm52Y2YtY2xpLnN0YXRlYDsgY2xlYXJz" + - "IHNhdmVkIGZ1bmN0aW9uIHN0YXRlIGFuZCBhbGwgQVBJIGtleXMgKGZ1bmN0aW9uIGFuZCB0YXNr" + - "KSB8CnwgYHN0YXR1c2AgfCBTaG93IENMSSBzdGF0ZSAodG9rZW4sIGxhc3QgZW5kcG9pbnRzLCBm" + - "dW5jdGlvbiBjb250ZXh0KSB8IERpc3RpbmN0IGZyb20gYHNlbGYtaG9zdGVkIHN0YXR1c2AgfAp8" + - "IGBhcGkta2V5IGdlbmVyYXRlIFstLWZvciBmdW5jdGlvblx8dGFza10gWy0tZGVzY3JpcHRpb249" + - "4oCmXSBbLS1leHBpcmVzLWluPeKApl1gIHwgTWludCBBUEkga2V5cyB8IERlZmF1bHQgKG5vIGAt" + - "LWZvcmApOiBnZW5lcmF0ZXMgYm90aCBhIGZ1bmN0aW9uIGtleSBhbmQgYSB0YXNrIGtleTsgYC0t" + - "Zm9yIGZ1bmN0aW9uYCBvciBgLS1mb3IgdGFza2AgZ2VuZXJhdGVzIG9uZSBvbmx5OyBgLS1zY29w" + - "ZXNgIHJlcXVpcmVzIGAtLWZvcmAgfAp8IGBhcGkta2V5IGdlbmVyYXRlIC0tdmFsaWRhdGVgIHwg" + - "TWludCBhbmQgaW1tZWRpYXRlbHkgdmFsaWRhdGUgZWFjaCBnZW5lcmF0ZWQga2V5IHwgVmFsaWRh" + - "dGVzIGVhY2gga2V5IGFnYWluc3QgaXRzIGNvcnJlY3QgYXVkaWVuY2UgKE5WQ0YgZm9yIGZ1bmN0" + - "aW9uIGtleXMsIE5WQ1QgZm9yIHRhc2sga2V5cykgfAp8IGBhcGkta2V5IGxpc3RgIHwgTGlzdCBB" + - "UEkga2V5cyBmb3IgY3VycmVudCBvd25lciB8IExpc3RzIE5WQ0Ytc2NvcGVkIGtleXMgb25seSB8" + - "CnwgYGFwaS1rZXkgZGVsZXRlIEtFWS1JRGAgLyBgYXBpLWtleSByZXZva2UgS0VZLUlEYCB8IFJl" + - "bW92ZSBhbiBBUEkga2V5IHwgKipDb25maXJtIHdpdGggdXNlcioqIHwKfCBgYXBpLWtleSBzaG93" + - "YCB8IFNob3cgY3VycmVudGx5IHNhdmVkIEFQSSBrZXkgZnJvbSBzdGF0ZSB8IHwKCiMjIEFnZW50" + - "IHNraWxsCgp8IENvbW1hbmQgfCBQdXJwb3NlIHwgTm90ZXMgfAp8LS0tfC0tLXwtLS18CnwgYGFn" + - "ZW50LXNraWxsIGluc3RhbGwgWy0tdGFyZ2V0PURJUl1gIHwgSW5zdGFsbCBhbGwgYnVuZGxlZCBw" + - "dWJsaWMgdXNlciBza2lsbHMgaW50byBgfi8uY2xhdWRlL3NraWxscy9gIGFuZCBgfi8uYWdlbnRz" + - "L3NraWxscy9gIHwgRGVmYXVsdDogYm90aCBiYXNlIHNraWxscyBkaXJlY3RvcmllcyB8CnwgYGFn" + - "ZW50LXNraWxsIHVuaW5zdGFsbCBbLS10YXJnZXQ9RElSXWAgfCBSZW1vdmUgb25seSBidW5kbGVk" + - "IHB1YmxpYyB1c2VyIHNraWxscyBmcm9tIHRoZSB0YXJnZXQgYmFzZSBza2lsbHMgZGlyZWN0b3Jp" + - "ZXMgfCBJZGVtcG90ZW50OyB1bnJlbGF0ZWQgc2tpbGxzIHJlbWFpbiB8CnwgYGFnZW50LXNraWxs" + - "IHNob3cgWy0tZmlsZT1SRUxdYCB8IFByaW50IGJ1bmRsZWQgYG52Y2Ytc2VsZi1tYW5hZ2VkLWNs" + - "aS9TS0lMTC5tZGAgb3IgYW5vdGhlciBlbWJlZGRlZCBmaWxlIHwgRm9yIGRlYnVnZ2luZyB8Cnwg" + - "YGFnZW50LXNraWxsIHZlcnNpb25gIHwgUHJpbnQgYnVpbGQgU0hBIGFuZCBlbWJlZGRlZCBwdWJs" + - "aWMgdXNlciBza2lsbCBzdW1tYXJ5IHwgfApQSwcI275U+NciAADXIgAAUEsDBBQACAAAAAAAIQAA" + - "AAAAAAAAAAAAAAAyAAkAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1jbGkvcmVmZXJlbmNlL2V4aXQt" + - "Y29kZXMubWRVVAUAAQCmzhIjIGBudmNmLWNsaWAgZXhpdCBjb2RlcwoKU3RhYmxlIGFjcm9zcyBz" + - "dWJjb21tYW5kcy4gVXNlIHRoZXNlIHRvIGRyaXZlIGFnZW50IHJldHJ5IC8gc3VyZmFjaW5nIGxv" + - "Z2ljLgoKfCBDb2RlIHwgTWVhbmluZyB8IEV4YW1wbGUgY2F1c2VzIHwKfC0tLXwtLS18LS0tfAp8" + - "IGAwYCB8IFN1Y2Nlc3MgfCBBbGwgY2hlY2tzIHBhc3NlZDsgaW5zdGFsbCBjb21wbGV0ZWQ7IGRl" + - "cGxveW1lbnQgQUNUSVZFIHwKfCBgMWAgfCBHZW5lcmljIGVycm9yIHwgSGVsbSByZW5kZXIgZmFp" + - "bGVkOyBuZXR3b3JrIHVucmVhY2hhYmxlOyBmaWxlIG5vdCBmb3VuZDsgWUFNTCBwYXJzZSBlcnJv" + - "ciB8CnwgYDJgIHwgUHJlLWZsaWdodCBjaGVjayBmYWlsZWQgfCBHYXRld2F5IEFQSSBDUkRzIG1p" + - "c3Npbmc7IGt1YmVjdGwgbm90IG9uIFBBVEg7IGRlZmF1bHQgU3RvcmFnZUNsYXNzIGFic2VudCB8" + - "CnwgYDNgIHwgQWRtaW4gYXV0aCBmYWlsZWQgfCBObyB0b2tlbiArIGAtLW5vbi1pbnRlcmFjdGl2" + - "ZWAgc2V0OyBJQ01TIHJlamVjdGVkIEpXVDsgaW5pdCBlbmRwb2ludCB1bnJlYWNoYWJsZSB8Cnwg" + - "YDVgIHwgTWFuaWZlc3QgYXBwbHkgb3IgYC0td2FpdGAgdGltZWQgb3V0IHwgSGVsbSBpbnN0YWxs" + - "IHRpbWVvdXQ7IGNoZWNrIHBvbGxlZCBidXQgZGlkbid0IHBhc3MgYmVmb3JlIGR1cmF0aW9uIHwK" + - "fCBgMTMwYCB8IENhbmNlbGxlZCBieSBTSUdJTlQvU0lHVEVSTSB8IFVzZXIgQ3RybC1DOyBDSSBi" + - "dWRnZXQgZXhjZWVkZWQ7IHBvZCBldmljdGVkIHwKCiMjIEhvdyBhbiBhZ2VudCBzaG91bGQgcmVh" + - "Y3QKCnwgQ29kZSB8IEFnZW50IGJlaGF2aW9yIHwKfC0tLXwtLS18CnwgYDBgIHwgQ29udGludWUg" + - "LyByZXBvcnQgc3VjY2Vzcy4gfAp8IGAxYCB8IFN1cmZhY2Ugc3RkZXJyIHRvIHVzZXI7IGFzayBi" + - "ZWZvcmUgYW55IHJldHJ5LiBHZW5lcmljIGVycm9ycyB1c3VhbGx5IG5lZWQgYSBodW1hbiB0byBy" + - "ZWFkIHRoZSBtZXNzYWdlLiB8CnwgYDJgIHwgU3VyZmFjZSBmYWlsZWQgY2hlY2tzICsgdGhlaXIg" + - "YGhpbnRVUkxgLiBEb24ndCBwcm9wb3NlIGB1cGAgdW50aWwgdGhlIHVzZXIgZml4ZXMgcHJlcmVx" + - "cy4gfAp8IGAzYCB8IFN1Z2dlc3QgYG52Y2YtY2xpIGluaXRgIChpbnRlcmFjdGl2ZSkgT1IgYC0t" + - "dG9rZW49JEpXVGAgKENJKS4gRG9uJ3QgYXV0by1taW50IHdpdGhvdXQgdXNlciBPSy4gfAp8IGA1" + - "YCB8IEFzayB1c2VyIGlmIHRoZXkgd2FudCB0byB3YWl0IGxvbmdlciwgZGlnIGludG8gdGhlIHN0" + - "YWxsZWQgY29tcG9uZW50LCBvciBjYW5jZWwuIHwKfCBgMTMwYCB8IERvbid0IHJldHJ5IGF1dG9t" + - "YXRpY2FsbHk7IHVzZXIgZXhwbGljaXRseSBjYW5jZWxsZWQuIENvbmZpcm0gYmVmb3JlIHJlLXJ1" + - "bm5pbmcuIHwKCiMjIFdoZXJlIHRvIGZpbmQgbW9yZSBkZXRhaWwKCkV2ZXJ5IG5vbi16ZXJvIGV4" + - "aXQgZW1pdHMgYSBzdHJ1Y3R1cmVkIGBwaGFzZV9mYWlsZWRgIEpTT04gZXZlbnQgd2l0aCBgZXJy" + - "Q2F0ZWdvcnlgLCBgZXJyTWVzc2FnZWAsIGByZW1lZGlhdGlvbmAgKGFycmF5KSwgYHJldHJ5Q2xh" + - "c3NgIChlbnVtOiBgbm9uZXxpbW1lZGlhdGV8YmFja29mZnxhZnRlcl9yZW1lZGlhdGlvbnx1bmtu" + - "b3duYCksIGByZXRyeUFmdGVyU2VjYCAoaW50LCBvcHRpb25hbCksIGFuZCBgcmF3YCAoc3VicHJv" + - "Y2VzcyArIEhUVFAgKyBLdWJlcm5ldGVzIHNpZ25hbCkuIEFsd2F5cyBjb25zdW1lIHRoZXNlIGlu" + - "IGAtLWpzb25gIG1vZGUgcmF0aGVyIHRoYW4gcGFyc2luZyBFbmdsaXNoIGZyb20gc3RkZXJyLgpQ" + - "SwcIc6daZNUGAADVBgAAUEsDBBQACAAAAAAAIQAAAAAAAAAAAAAAAAAtAAkAZGF0YS9udmNmLXNl" + - "bGYtbWFuYWdlZC1jbGkvcmVmZXJlbmNlL2ZsYWdzLm1kVVQFAAEAps4SIyBgbnZjZi1jbGlgIGZs" + - "YWcgcmVmZXJlbmNlCgojIyBHbG9iYWwgZmxhZ3MgKGV2ZXJ5IHN1YmNvbW1hbmQpCgp8IEZsYWcg" + - "fCBQdXJwb3NlIHwgRGVmYXVsdCB8CnwtLS18LS0tfC0tLXwKfCBgLS1jb25maWcgRklMRWAgfCBD" + - "b25maWcgZmlsZSBwYXRoIHwgYCRIT01FLy5udmNmLWNsaS55YW1sYCB8CnwgYC0tZGVidWdgIHwg" + - "VmVyYm9zZSBIVFRQIGxvZ2dpbmcgb24gc3RkZXJyIHwgYGZhbHNlYCB8CnwgYC0tanNvbmAgfCBK" + - "U09OTCBldmVudHMgb24gc3RkZXJyIHwgYXV0byAob2ZmIGluIFRUWSwgb24gdW5kZXIgYC0tbm9u" + - "LWludGVyYWN0aXZlYCkgfAoKIyMgYHNlbGYtaG9zdGVkYCBwYXJlbnQgKHBlcnNpc3RlbnQgYWNy" + - "b3NzIHN1YmNvbW1hbmRzKQoKfCBGbGFnIHwgUHVycG9zZSB8IERlZmF1bHQgfAp8LS0tfC0tLXwt" + - "LS18CnwgYC0tY29udHJvbC1wbGFuZS1zdGFjaz3igKZgIHwgQ29udHJvbC1wbGFuZSBidW5kbGUg" + - "c291cmNlOiBsb2NhbCBwYXRoLCBnaXQgVVJMLCBvciBgb2NpOi8vYCBVUkwgfCBlbWJlZGRlZCBP" + - "Q0kgVVJMIHBpbm5lZCBieSBDTEkgdmVyc2lvbiB8CnwgYC0tY29tcHV0ZS1wbGFuZS1zdGFjaz3i" + - "gKZgIHwgQ29tcHV0ZS1wbGFuZSBidW5kbGUgc291cmNlOiBsb2NhbCBwYXRoLCBnaXQgVVJMLCBv" + - "ciBgb2NpOi8vYCBVUkwgfCBlbWJlZGRlZCBPQ0kgVVJMIHBpbm5lZCBieSBDTEkgdmVyc2lvbiB8" + - "CnwgYC0tZW52PWxvY2FsXHxwcmRcfOKApmAgfCBIZWxtZmlsZSBlbnZpcm9ubWVudCBuYW1lIHwg" + - "YGxvY2FsYCBmb3IgZGV2IGJ1aWxkcywgYHByZGAgZm9yIHJlbGVhc2VzIHwKfCBgLS1ub24taW50" + - "ZXJhY3RpdmVgIHwgRGlzYWJsZSBhbGwgc3RkaW4gcHJvbXB0cyB8IGBmYWxzZWAgfAp8IGAtLXRv" + - "a2VuPSRKV1RgIHwgQWRtaW4gSldULCBvdmVycmlkZXMgc3RvcmVkIHNlc3Npb24gfCAtIHwKfCBg" + - "LS1uby1hcHBseWAgfCBgaW5zdGFsbGAgb25seSAtIGVtaXQgWUFNTCwgZG8gbm90IGt1YmVjdGwg" + - "YXBwbHkgfCBgZmFsc2VgIHwKfCBgLS1vdXRwdXQ9dGV4dFx8anNvbmAgfCBMZWdhY3kgYWxpYXMg" + - "Zm9yIGAtLWpzb25gIChkZXByZWNhdGVkLCByZW1vdmVkIGluIG5leHQgbWFqb3IpIHwgYHRleHRg" + - "IHwKfCBgLS1wbGFpbmAgfCBGb3JjZSBwbGFpbiBzdHJlYW1pbmcgb3V0cHV0IHwgYXV0by1kZXRl" + - "Y3QgfAp8IGAtLXdhaXQgRFVSQVRJT05gIHwgYGNoZWNrYCBvbmx5OyBibG9jayB1bnRpbCBwYXNz" + - "IHwgLSB8CnwgYC0tY29udHJvbC1wbGFuZS1jb250ZXh0IENUWGAgfCBrdWJlY3RsIGNvbnRleHQg" + - "Zm9yIGNvbnRyb2wgcGxhbmUgKFJFUS0yMCkgfCBjdXJyZW50IGNvbnRleHQgfAp8IGAtLWNvbXB1" + - "dGUtcGxhbmUtY29udGV4dCBDVFhgIHwga3ViZWN0bCBjb250ZXh0IGZvciBjb21wdXRlIHBsYW5l" + - "IChSRVEtMjApIHwgY3VycmVudCBjb250ZXh0IHwKfCBgLS1pY21zLXVybCBVUkxgIHwgUHVibGlj" + - "IElDTVMgVVJMOyByZXF1aXJlZCB3aGVuIGNvbnRleHRzIGRpZmZlciB8IGRlcml2ZWQgZnJvbSBg" + - "YmFzZV9odHRwX3VybGAgfAp8IGAtLWxvY2FsLW9ubHlgIHwgYGNoZWNrIC0tcHJlYCBvbmx5OyBz" + - "a2lwIGFsbCBrdWJlY3RsIGNvbnRhY3QgfCBgZmFsc2VgIHwKCiMjIGB1cGAtc3BlY2lmaWMKCnwg" + - "RmxhZyB8IFB1cnBvc2UgfCBEZWZhdWx0IHwKfC0tLXwtLS18LS0tfAp8IGAtLWNsdXN0ZXItbmFt" + - "ZSBOQU1FYCB8IElDTVMgY2x1c3RlciByb3cgaWRlbnRpZmllciAocmVxdWlyZWQpIHwgLSB8Cnwg" + - "YC0tbmNhLWlkIElEYCB8IE5DQSBhY2NvdW50IElEIHwgYG52Y2YtZGVmYXVsdGAgfAp8IGAtLXJl" + - "Z2lvbiBSRUdJT05gIHwgQ2x1c3RlciByZWdpb24gfCBgdXMtd2VzdC0xYCB8CnwgYC0tcGxhbi1v" + - "bmx5YCB8IERyeS1ydW47IGVtaXQgcGhhc2UgcGxhbiArIEVUQXMgd2l0aG91dCBjaGFuZ2VzIHwg" + - "YGZhbHNlYCB8CgojIyBgc3RhdHVzYC1zcGVjaWZpYwoKfCBGbGFnIHwgUHVycG9zZSB8IERlZmF1" + - "bHQgfAp8LS0tfC0tLXwtLS18CnwgYC0tY2x1c3Rlci1uYW1lIE5BTUVgIHwgTGltaXQgdG8gb25l" + - "IGNvbXB1dGUgcGxhbmUgfCAtIChjb250cm9sICsgYWxsIGNsdXN0ZXJzKSB8CnwgYC0td2F0Y2hg" + - "IHwgTGl2ZSByZS1yZW5kZXIgfCBgZmFsc2VgIHwKfCBgLS13YXRjaC1pbnRlcnZhbCBEVVJgIHwg" + - "YC0td2F0Y2hgIGNhZGVuY2UgfCBgNXNgIHwKfCBgLS1jb21wb25lbnQgTkFNRWAgfCBGaWx0ZXIg" + - "Y29tcG9uZW50cyBwYW5lbCB8IGFsbCB8CnwgYC0tbm8tZXZlbnRzYCB8IFNraXAgZXZlbnRzIHBh" + - "bmVsIHwgYGZhbHNlYCB8CgojIyBgY2x1c3RlciByZWdpc3RlcmAtc3BlY2lmaWMKCnwgRmxhZyB8" + - "IFB1cnBvc2UgfCBEZWZhdWx0IHwKfC0tLXwtLS18LS0tfAp8IGAtLW5hbWUgTkFNRWAgfCBDbHVz" + - "dGVyIG5hbWUgKHJlcXVpcmVkKSB8IC0gfAp8IGAtLW5jYS1pZCBJRGAgfCBOQ0EgSUQgKHJlcXVp" + - "cmVkKSB8IC0gfAp8IGAtLXJlZ2lvbiBSRUdJT05gIHwgUmVnaW9uIHwgYHVzLXdlc3QtMWAgfAp8" + - "IGAtLWljbXMtdXJsIFVSTGAgfCBJQ01TIGVuZHBvaW50IHwgZnJvbSBjb25maWcgfAp8IGAtLWln" + - "bm9yZS1leGlzdGluZ2AgfCBNYXRjaC1vci1jcmVhdGUgaW5zdGVhZCBvZiBmYWlsLW9uLWV4aXN0" + - "cyB8IGBmYWxzZWAgfAoKIyMgYGFwaS1rZXkgZ2VuZXJhdGVgLXNwZWNpZmljCgp8IEZsYWcgfCBQ" + - "dXJwb3NlIHwgRGVmYXVsdCB8CnwtLS18LS0tfC0tLXwKfCBgLS1mb3IgZnVuY3Rpb25cfHRhc2tg" + - "IHwgR2VuZXJhdGUgb25seSB0aGUgc3BlY2lmaWVkIGtleSB0eXBlIHwgKG9taXQgdG8gZ2VuZXJh" + - "dGUgYm90aCkgfAp8IGAtLWRlc2NyaXB0aW9uIFRFWFRgIHwgSHVtYW4tcmVhZGFibGUgbGFiZWwg" + - "Zm9yIHRoZSBrZXkgfCBgR2VuZXJhdGVkIGJ5IG52Y2YtY2xpYCB8CnwgYC0tZXhwaXJlcy1pbiBE" + - "VVJBVElPTmAgfCBFeHBpcnkgb2Zmc2V0IChlLmcuIGAyNGhgLCBgN2RgKTsgcGFyc2VkIGFzIGV4" + - "dGVuZGVkIGR1cmF0aW9uIHwgYDI0aGAgfAp8IGAtLXNjb3BlcyBTQ09QRVssU0NPUEVdYCB8IE92" + - "ZXJyaWRlIGRlZmF1bHQgc2NvcGVzOyByZXF1aXJlcyBgLS1mb3JgIHwgKHNlcnZpY2UgZGVmYXVs" + - "dHMpIHwKfCBgLS12YWxpZGF0ZWAgfCBWYWxpZGF0ZSBlYWNoIGdlbmVyYXRlZCBrZXkgaW1tZWRp" + - "YXRlbHkgYWZ0ZXIgbWludGluZyB8IGBmYWxzZWAgfAoKRXh0ZW5kZWQgZHVyYXRpb24gdW5pdHM6" + - "IGBzYCAoc2Vjb25kcyksIGBtYCAobWludXRlcyksIGBoYCAoaG91cnMpLCBgZGAgKGRheXMpLCBg" + - "d2AgKHdlZWtzKS4KCiMjIGBmdW5jdGlvbiBjcmVhdGVgLXNwZWNpZmljCgpgLS1pbnB1dC1maWxl" + - "IEZJTEVgIGlzIHJlY29tbWVuZGVkIGZvciByZXBlYXRhYmxlIGZ1bmN0aW9uIGRlZmluaXRpb25z" + - "LiBGb3IgYWQtaG9jIGNyZWF0ZXM6Cgp8IEZsYWcgfCBQdXJwb3NlIHwgRGVmYXVsdCB8CnwtLS18" + - "LS0tfC0tLXwKfCBgLS1uYW1lIE5BTUVgIHwgRnVuY3Rpb24gbmFtZSB8IC0gfAp8IGAtLWltYWdl" + - "IElNQUdFYCB8IENvbnRhaW5lciBpbWFnZSB8IC0gfAp8IGAtLWluZmVyZW5jZS11cmwgVVJJYCB8" + - "IENvbnRhaW5lciBpbmZlcmVuY2UgZW5kcG9pbnQgfCAtIHwKfCBgLS1pbmZlcmVuY2UtcG9ydCBQ" + - "T1JUYCB8IENvbnRhaW5lciBpbmZlcmVuY2UgcG9ydCB8IC0gfAp8IGAtLWZ1bmN0aW9uLXR5cGUg" + - "REVGQVVMVFx8U1RSRUFNSU5HXHxMTE1gIHwgRnVuY3Rpb24gdHlwZSB8IGBERUZBVUxUYCB8Cnwg" + - "YC0taGVsbS1jaGFydCBDSEFSVGAgfCBIZWxtIGNoYXJ0IFVSTCBvciBPQ0kgcmVmZXJlbmNlLiBD" + - "YW4gYmUgdXNlZCB3aXRoIGAtLWZ1bmN0aW9uLXR5cGU9TExNYCBmb3IgY2hhcnQtcGFja2FnZWQg" + - "TExNIHdvcmtsb2Fkcy4gfCAtIHwKfCBgLS1oZWxtLWNoYXJ0LXNlcnZpY2UgTkFNRWAgfCBLdWJl" + - "cm5ldGVzIFNlcnZpY2UgbmFtZSBleHBvc2VkIGJ5IHRoZSBjaGFydC4gUmVxdWlyZWQgd2hlbiBg" + - "LS1oZWxtLWNoYXJ0YCBpcyBzZXQuIHwgLSB8CnwgYC0tbW9kZWxzIE5BTUU6VkVSU0lPTjpVUklg" + - "IHwgU3RhbmRhcmQgbW9kZWwgYXJ0aWZhY3Q7IHJlcGVhdGFibGUgfCAtIHwKfCBgLS1sbG0tbW9k" + - "ZWwgU1BFQ2AgfCBMTE0gbW9kZWwgY29uZmlnOyBmb3JtYXQgYG5hbWU9PG1vZGVsPix1cmlzPTx1" + - "cmk+XHw8dXJpPixyb3V0aW5nTWV0aG9kPTxtZXRob2Q+LHRva2VuUmF0ZUxpbWl0PTxsaW1pdD5g" + - "OyByZXBlYXRhYmxlLiBUb2tlbiBsaW1pdHMgdXNlIGA8dmFsdWU+LTx1bml0PmAgd2l0aCBgU2As" + - "IGBNYCwgYEhgLCBgRGAsIG9yIGBXYCwgZm9yIGV4YW1wbGUgYDEwMDAtU2AuIFVzZSBpbnB1dCBK" + - "U09OIGZvciBjb21iaW5lZCB0b2tlbiBsaW1pdHMgYmVjYXVzZSBpbmxpbmUgc3BlY3MgdXNlIGNv" + - "bW1hcyBhcyBmaWVsZCBzZXBhcmF0b3JzLiB8IC0gfAoKSW4gSlNPTiBhbmQgaW5saW5lIHNwZWNz" + - "LCBMTE0gZnVuY3Rpb25zIHNldCBgZnVuY3Rpb25UeXBlOiAiTExNImAgYW5kIG1vZGVsIHJvdXRp" + - "bmcgbWV0YWRhdGEgdW5kZXIgYG1vZGVsc1tdLmxsbUNvbmZpZ2AuIGBsbG1Db25maWcudXJpc2Ag" + - "ZGVjbGFyZXMgdGhlIE9wZW5BSS1jb21wYXRpYmxlIHVwc3RyZWFtIHBhdGhzIGV4cG9zZWQgYnkg" + - "dGhlIG1vZGVsLiBDdXJyZW50IHN1cHBvcnRlZCBwYXRocyBhcmUgYC92MS9jaGF0L2NvbXBsZXRp" + - "b25zYCwgYC92MS9yZXNwb25zZXNgLCBhbmQgYC92MS9lbWJlZGRpbmdzYC4gYGxsbUNvbmZpZy5y" + - "b3V0aW5nTWV0aG9kYCBhY2NlcHRzIGByb3VuZF9yb2JpbmAsIGBwb3dlcl9vZl90d29gLCBgZ3Jv" + - "cV9tdWx0aXJlZ2lvbmAsIGBwdWxzYXJgLCBvciBgcmFuZG9tYC4KYGxsbUNvbmZpZy50b2tlblJh" + - "dGVMaW1pdGAgYWNjZXB0cyBvbmUgb3IgbW9yZSBjb21tYS1zZXBhcmF0ZWQgcG9zaXRpdmUgaW50" + - "ZWdlciB0b2tlbiBsaW1pdHMgaW4gYDx2YWx1ZT4tPHVuaXQ+YCBmb3JtYXQuIFN1cHBvcnRlZCB1" + - "bml0cyBhcmUgYFNgIChzZWNvbmRzKSwgYE1gIChtaW51dGVzKSwgYEhgIChob3VycyksIGBEYCAo" + - "ZGF5cyksIGFuZCBgV2AgKHdlZWtzKS4gVXNlIGRpc3RpbmN0IHVuaXRzIHdoZW4gY29tYmluaW5n" + - "IGxpbWl0cywgZm9yIGV4YW1wbGUgYDEwMDAtUyw1MDAwLU0sMTAwMDAwLUgsNTAwMDAwLUQsMTAw" + - "MDAwMC1XYCBpbiBpbnB1dCBKU09OLgoKSGVsbSBjaGFydCBwYWNrYWdpbmcgaXMgaW5kZXBlbmRl" + - "bnQgb2YgYGZ1bmN0aW9uVHlwZWAuIEZvciBhIEhlbG0tY2hhcnQgYmFja2VkIExMTSBmdW5jdGlv" + - "biwgc2V0IGBmdW5jdGlvblR5cGU6ICJMTE0iYCwgYGhlbG1DaGFydGAsIGBoZWxtQ2hhcnRTZXJ2" + - "aWNlTmFtZWAsIGFuZCBgbW9kZWxzW10ubGxtQ29uZmlnYCBpbiB0aGUgc2FtZSBjcmVhdGUgcmVx" + - "dWVzdC4gYGluZmVyZW5jZVBvcnRgIG11c3QgYmUgdGhlIEt1YmVybmV0ZXMgU2VydmljZSBwb3J0" + - "IGV4cG9zZWQgYnkgYGhlbG1DaGFydFNlcnZpY2VOYW1lYC4KCkxMTSBpbnZvY2F0aW9uIHJlcXVl" + - "c3RzIHVzZSBgbW9kZWw6ICI8ZnVuY3Rpb24taWQ+Lzxtb2RlbC1uYW1lPiJgLiBUaGUgZnVuY3Rp" + - "b24gSUQgc2VsZWN0cyB0aGUgTlZDRiBmdW5jdGlvbiwgYW5kIHRoZSBtb2RlbCBuYW1lIGlzIGZv" + - "cndhcmRlZCB1cHN0cmVhbS4gQ2hhdCBjb21wbGV0aW9ucyBhbmQgUmVzcG9uc2VzIEFQSSByZXF1" + - "ZXN0cyBjYW4gdXNlIGB4LW11bHRpLXR1cm4tc2Vzc2lvbi1pZGAgZm9yIHNlc3Npb24gc3RpY2tp" + - "bmVzczsgZW1iZWRkaW5ncyByZXF1ZXN0cyBkbyBub3QuCgojIyBgZnVuY3Rpb24gdXBkYXRlYC1z" + - "cGVjaWZpYwoKfCBGbGFnIHwgUHVycG9zZSB8IERlZmF1bHQgfAp8LS0tfC0tLXwtLS18CnwgYC0t" + - "dGFncyBUQUdbLFRBR11gIHwgUmVwbGFjZSBmdW5jdGlvbiB0YWdzIHwgLSB8CnwgYC0tbGxtLW1v" + - "ZGVsLXVwZGF0ZSBTUEVDYCB8IExMTSBtb2RlbCB1cGRhdGU7IGZvcm1hdCBgbmFtZT08bW9kZWw+" + - "LHJvdXRpbmdNZXRob2Q9PG1ldGhvZD4sdG9rZW5SYXRlTGltaXQ9PGxpbWl0PmA7IHJlcGVhdGFi" + - "bGUuIFJvdXRpbmcgbWV0aG9kcyBtYXRjaCBgLS1sbG0tbW9kZWxgLiBUb2tlbiBsaW1pdCBleGFt" + - "cGxlOiBgMTAwMC1TYC4gVXNlIGlucHV0IEpTT04gZm9yIGNvbWJpbmVkIHRva2VuIGxpbWl0cy4g" + - "fCAtIHwKCkluIEpTT04sIGBmdW5jdGlvbiB1cGRhdGVgIGFjY2VwdHMgYG1vZGVsVXBkYXRlc1td" + - "YCBlbnRyaWVzIHdpdGggYG1vZGVsTmFtZWAgYW5kIGBsbG1Db25maWcucm91dGluZ01ldGhvZGAg" + - "YW5kL29yIGBsbG1Db25maWcudG9rZW5SYXRlTGltaXRgLiBgdXJpc2AgYXJlIGNyZWF0ZS10aW1l" + - "IG1vZGVsIG1ldGFkYXRhIGFuZCBhcmUgbm90IHBhcnQgb2YgbW9kZWwgdXBkYXRlcy4KCiMjIGBm" + - "dW5jdGlvbiBkZXBsb3kgY3JlYXRlYC1zcGVjaWZpYwoKYC0taW5wdXQtZmlsZSBGSUxFYCBpcyBy" + - "ZWNvbW1lbmRlZCAoZnVsbCBKU09OIHNwZWMpLiBGb3IgYWQtaG9jIG9uZS1zaG90IHVzZToKCnwg" + - "RmxhZyB8IFB1cnBvc2UgfCBEZWZhdWx0IHwKfC0tLXwtLS18LS0tfAp8IGAtLWZ1bmN0aW9uLWlk" + - "IElEYCB8IEZ1bmN0aW9uIElEIChyZXF1aXJlZCkgfCAtIHwKfCBgLS1ncHUgTkFNRWAgfCBHUFUg" + - "ZmFtaWx5IHwgYEgxMDBgIHwKfCBgLS1pbnN0YW5jZS10eXBlIFRZUEVgIHwgU0tVIHwgYE5DUC5H" + - "UFUuSDEwMF8xeGAgfAp8IGAtLW1pbi1pbnN0YW5jZXMgTmAgfCBNaW4gcmVwbGljYXMgfCBgMWAg" + - "fAp8IGAtLW1heC1pbnN0YW5jZXMgTmAgfCBNYXggcmVwbGljYXMgfCBgMWAgfAp8IGAtLW1heC1y" + - "ZXF1ZXN0LWNvbmN1cnJlbmN5IE5gIHwgQ29uY3VycmVuY3kgfCBgMGAgKHVuc2V0OyBzZXJ2ZXIg" + - "ZGVmYXVsdCBhcHBsaWVzKSB8CnwgYC0tY2x1c3RlcnMgTkFNRVssTkFNRV1gIHwgVGFyZ2V0IHNw" + - "ZWNpZmljIGNvbXB1dGUgY2x1c3RlcnMgfCAoYW55IG1hdGNoaW5nIFNLVSkgfAoKIyMgYHRhc2sg" + - "Y3JlYXRlYC1zcGVjaWZpYwoKYC0taW5wdXQtZmlsZSBGSUxFYCBpcyByZWNvbW1lbmRlZCBmb3Ig" + - "cmVwZWF0YWJsZSB0YXNrIGRlZmluaXRpb25zLiBGb3IgYWQtaG9jIHVzZToKCnwgRmxhZyB8IFB1" + - "cnBvc2UgfCBOb3RlcyB8CnwtLS18LS0tfC0tLXwKfCBgLS1uYW1lIE5BTUVgIHwgVGFzayBuYW1l" + - "IChyZXF1aXJlZCkgfCAxLTEyOCBjaGFycywgYF5bYS16MC05QS1aXVthLXowLTlBLVpcLV9dKiRg" + - "IHwKfCBgLS1ncHUgR1BVYCB8IEdQVSBuYW1lIChyZXF1aXJlZCB3aXRob3V0IGAtLWlucHV0LWZp" + - "bGVgKSB8IEV4YW1wbGU6IGBIMTAwYCB8CnwgYC0taW5zdGFuY2UtdHlwZSBUWVBFYCB8IEluc3Rh" + - "bmNlIHR5cGUgKHJlcXVpcmVkIHdpdGhvdXQgYC0taW5wdXQtZmlsZWApIHwgRXhhbXBsZTogYE5D" + - "UC5HUFUuSDEwMF8xeGAgfAp8IGAtLWltYWdlIElNQUdFYCB8IENvbnRhaW5lciBpbWFnZSB8IE11" + - "dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGAtLWhlbG0tY2hhcnRgIHwKfCBgLS1oZWxtLWNoYXJ0IENI" + - "QVJUYCB8IEhlbG0gY2hhcnQgVVJMIG9yIE9DSSByZWZlcmVuY2UgfCBNdXR1YWxseSBleGNsdXNp" + - "dmUgd2l0aCBgLS1pbWFnZWAgfAp8IGAtLWlucHV0LWZpbGUgRklMRWAgfCBKU09OIHRhc2sgc3Bl" + - "YyBmaWxlIHwgQ0xJIGZsYWdzIG92ZXJyaWRlIEpTT04gdmFsdWVzIHdoZW4gYm90aCBhcmUgc2V0" + - "IHwKfCBgLS1iYWNrZW5kIEJBQ0tFTkRgIHwgQmFja2VuZCAvIENTUCB8IC0gfAp8IGAtLWNsdXN0" + - "ZXJzIE5BTUVbLE5BTUVdYCB8IFNwZWNpZmljIGNsdXN0ZXJzIHdpdGhpbiB0aGUgaW5zdGFuY2Ug" + - "fCBDb21tYS1zZXBhcmF0ZWQgfAp8IGAtLWNvbnRhaW5lci1hcmdzIEFSR1NgIHwgQXJncyBwYXNz" + - "ZWQgd2hlbiBsYXVuY2hpbmcgdGhlIGNvbnRhaW5lciB8IFNpbmdsZSBzdHJpbmcsIGUuZy4gYCIt" + - "LWVwb2NocyAxMCAtLWJhdGNoLXNpemUgMzIiYCB8CnwgYC0tY29udGFpbmVyLWVudiBOQU1FPXZh" + - "bHVlYCB8IENvbnRhaW5lciBlbnZpcm9ubWVudCB2YXJpYWJsZTsgcmVwZWF0YWJsZSB8IC0gfAp8" + - "IGAtLXNlY3JldHMgTkFNRT12YWx1ZWAgfCBTZWNyZXQgZW52aXJvbm1lbnQgdmFyaWFibGU7IHJl" + - "cGVhdGFibGU7IGVuY3J5cHRlZCBhdCByZXN0IHwgLSB8CnwgYC0tbWF4LXJ1bnRpbWUgRFVSQVRJ" + - "T05gIHwgTWF4IHdhbGwtY2xvY2sgcnVuIHRpbWUgKElTTyA4NjAxLCBlLmcuIGBQVDRIYCkgfCBO" + - "byBkZWZhdWx0OyBvbWl0IGZvciBubyB0aW1lIGxpbWl0IHwKfCBgLS1tYXgtcXVldWVkIERVUkFU" + - "SU9OYCB8IE1heCB0aW1lIGluIHF1ZXVlIGJlZm9yZSBjYW5jZWxsYXRpb24gKElTTyA4NjAxKSB8" + - "IFNlcnZlciBkZWZhdWx0IGBQVDcySGAgfAp8IGAtLXRlcm1pbmF0aW9uLWdyYWNlIERVUkFUSU9O" + - "YCB8IEdyYWNlIHBlcmlvZCBhZnRlciBzdG9wIHNpZ25hbCAoSVNPIDg2MDEpIHwgU2VydmVyIGRl" + - "ZmF1bHQgYFBUMUhgIHwKfCBgLS1yZXN1bHQtc3RyYXRlZ3kgVVBMT0FEXHxOT05FYCB8IEhvdyB0" + - "byBoYW5kbGUgdGFzayBvdXRwdXQgYXJ0aWZhY3RzIHwgLSB8CnwgYC0tcmVzdWx0cy1sb2NhdGlv" + - "biBMT0NBVElPTmAgfCBSZXN1bHQgdXBsb2FkIHRhcmdldCwgZm9ybWF0IGBvcmctbmFtZS9bdGVh" + - "bS1uYW1lL11tb2RlbC1uYW1lYDsgcmVxdWlyZWQgd2hlbiBgLS1yZXN1bHQtc3RyYXRlZ3k9VVBM" + - "T0FEYCB8IC0gfAp8IGAtLW1vZGVscyBOQU1FOlZFUlNJT046VVJJYCB8IE1vZGVsIGFydGlmYWN0" + - "OyByZXBlYXRhYmxlIHwgLSB8CnwgYC0tcmVzb3VyY2VzIE5BTUU6VkVSU0lPTjpVUklgIHwgUmVz" + - "b3VyY2UgYXJ0aWZhY3Q7IHJlcGVhdGFibGUgfCAtIHwKfCBgLS10YWdzIFRBR1ssVEFHXWAgfCBU" + - "YXNrIHRhZ3MgfCBDb21tYS1zZXBhcmF0ZWQgfAp8IGAtLWRlc2NyaXB0aW9uIFRFWFRgIHwgVGFz" + - "ayBkZXNjcmlwdGlvbiB8IC0gfAp8IGAtLWxvZ3MtdGVsZW1ldHJ5LWlkIFVVSURgIHwgTG9ncyB0" + - "ZWxlbWV0cnkgZW5kcG9pbnQgSUQgfCAtIHwKfCBgLS1tZXRyaWNzLXRlbGVtZXRyeS1pZCBVVUlE" + - "YCB8IE1ldHJpY3MgdGVsZW1ldHJ5IGVuZHBvaW50IElEIHwgLSB8CnwgYC0tdHJhY2VzLXRlbGVt" + - "ZXRyeS1pZCBVVUlEYCB8IFRyYWNlcyB0ZWxlbWV0cnkgZW5kcG9pbnQgSUQgfCAtIHwKClBLBwj8" + - "o5HgxiIAAMYiAABQSwMEFAAIAAAAAAAhAAAAAAAAAAAAAAAAADcACQBkYXRhL252Y2Ytc2VsZi1t" + - "YW5hZ2VkLWNsaS9yZWZlcmVuY2UvdHJvdWJsZXNob290aW5nLm1kVVQFAAEAps4SIyBUcm91Ymxl" + - "c2hvb3RpbmcKCktub3duIGVycm9ycyDihpIgZGlhZ25vc3RpYyBjb21tYW5kIOKGkiByZW1lZGlh" + - "dGlvbi4gS2VlcCBpbiBzeW5jIHdpdGggdGhlIHN0cnVjdHVyZWQgYHBoYXNlX2ZhaWxlZGAgZXZl" + - "bnRzIHRoZSBDTEkgZW1pdHMgKFJFUS0xNSkg4oCUIGV2ZXJ5IGVudHJ5IGJlbG93IHNob3VsZCBt" + - "YXAgdG8gYW4gYGVyckNhdGVnb3J5YCBhbmQgYSBgcmVtZWRpYXRpb25gIGFycmF5LgoKIyMgUHJl" + - "LWZsaWdodAoKfCBTeW1wdG9tIHwgQ2F1c2UgfCBSZW1lZGlhdGlvbiB8CnwtLS18LS0tfC0tLXwK" + - "fCBga3ViZWN0bCBub3Qgb24gUEFUSGAgfCBPcGVyYXRvcidzIGAkUEFUSGAgZG9lc24ndCBpbmNs" + - "dWRlIGt1YmVjdGwgfCBJbnN0YWxsIGt1YmVjdGwgMS4yOCs6IGh0dHBzOi8va3ViZXJuZXRlcy5p" + - "by9kb2NzL3Rhc2tzL3Rvb2xzL2luc3RhbGwta3ViZWN0bC8gfAp8IGBoZWxtZmlsZSBub3Qgb24g" + - "UEFUSGAgfCBTYW1lIHwgaHR0cHM6Ly9naXRodWIuY29tL2hlbG1maWxlL2hlbG1maWxlI2luc3Rh" + - "bGxhdGlvbiB8CnwgYGhlbG0gbm90IG9uIFBBVEhgIHwgU2FtZSB8IGh0dHBzOi8vaGVsbS5zaC9k" + - "b2NzL2ludHJvL2luc3RhbGwvIHwKfCBgR2F0ZXdheSBBUEkgQ1JEcyBub3QgaW5zdGFsbGVkYCB8" + - "IGVudm95LWdhdGV3YXkgcHJlcmVxIG1pc3NpbmcgfCBgaGVsbSBpbnN0YWxsIGVnIG9jaTovL2Rv" + - "Y2tlci5pby9lbnZveXByb3h5L2dhdGV3YXktaGVsbSAtLW5hbWVzcGFjZT1lbnZveS1nYXRld2F5" + - "LXN5c3RlbSAtLWNyZWF0ZS1uYW1lc3BhY2VgIHwKfCBgZGVmYXVsdCBTdG9yYWdlQ2xhc3Mgbm90" + - "IGF2YWlsYWJsZWAgfCBDbHVzdGVyIGhhcyBubyBkZWZhdWx0IFNDIHwgQW5ub3RhdGUgb25lOiBg" + - "a3ViZWN0bCBwYXRjaCBzYyA8bmFtZT4gLXAgJ3sibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsi" + - "c3RvcmFnZWNsYXNzLmt1YmVybmV0ZXMuaW8vaXMtZGVmYXVsdC1jbGFzcyI6InRydWUifX19J2Ag" + - "fAp8IGBHUFUgb3BlcmF0b3Igbm90IGluc3RhbGxlZGAgKGNvbXB1dGUtcGxhbmUpIHwgbnZpZGlh" + - "IEdQVSBvcGVyYXRvciBtaXNzaW5nIHwgSW5zdGFsbCBwZXIgaHR0cHM6Ly9kb2NzLm52aWRpYS5j" + - "b20vZGF0YWNlbnRlci9jbG91ZC1uYXRpdmUvZ3B1LW9wZXJhdG9yL2xhdGVzdC9pbnN0YWxsLWdw" + - "dS1vcGVyYXRvci5odG1sLCBPUiB1c2UgYGZha2UtZ3B1LW9wZXJhdG9yYCBmb3IgZGV2IHwKfCBg" + - "R1BVIG5vZGUgbGFiZWxzIG1pc3NpbmdgIChjb21wdXRlLXBsYW5lKSB8IE5vZGVzIG5lZWQgYG52" + - "aWRpYS5jb20vZ3B1LmZhbWlseWAgZXRjLiB8IFNldCBgLS1rM3Mtbm9kZS1sYWJlbCBudmlkaWEu" + - "Y29tL2dwdS5mYW1pbHk9aG9wcGVyQGFnZW50Ok5gIGZvciBrM2QgfAoKIyMgQXV0aAoKfCBTeW1w" + - "dG9tIHwgQ2F1c2UgfCBSZW1lZGlhdGlvbiB8CnwtLS18LS0tfC0tLXwKfCBgYWRtaW4gdG9rZW4g" + - "cmVxdWlyZWRgIChpbml0IG5vdCBydW4pIHwgTm8gYH4vLm52Y2YtY2xpLnN0YXRlYCBhbmQgYC0t" + - "dG9rZW5gIG5vdCBwYXNzZWQgfCBgbnZjZi1jbGkgaW5pdGAgKGludGVyYWN0aXZlKSBvciBgLS10" + - "b2tlbj0kSldUIC0tbm9uLWludGVyYWN0aXZlYCAoQ0kpIHwKfCBgU2lnbmVkIEpXVCByZWplY3Rl" + - "ZDogQW5vdGhlciBhbGdvcml0aG0gZXhwZWN0ZWQsIG9yIG5vIG1hdGNoaW5nIGtleShzKSBmb3Vu" + - "ZGAgfCBTdGFsZSBzZXNzaW9uLmpzb24gZnJvbSBhIGRpZmZlcmVudCBjb250cm9sIHBsYW5lIHwg" + - "YHJtIH4vLm52Y2YtY2xpLnN0YXRlYCB0aGVuIGBudmNmLWNsaSBpbml0YCBhZ2FpbiB8CnwgYDQw" + - "MyBtaXNzaW5nIHJlcXVlc3RlZCBhdXRob3JpdGllc2AgKGZ1bmN0aW9uIGludm9rZSkgfCBBZG1p" + - "biB0b2tlbiBkb2Vzbid0IGhhdmUgYGludm9rZV9mdW5jdGlvbmAgc2NvcGUgfCBgbnZjZi1jbGkg" + - "YXBpLWtleSBnZW5lcmF0ZSAtLWRlc2NyaXB0aW9uPeKApmAgdGhlbiByZS1ydW4gaW52b2tlIHwK" + - "CiMjIEluc3RhbGwgLyBgdXBgCgp8IFN5bXB0b20gfCBDYXVzZSB8IFJlbWVkaWF0aW9uIHwKfC0t" + - "LXwtLS18LS0tfAp8IEhlbG0gYHRpbWVkIG91dCB3YWl0aW5nIGZvciBjYXNzYW5kcmFgIHwgQ2Fz" + - "c2FuZHJhIFN0YXRlZnVsU2V0IFBWQyBzdHVjayBgUGVuZGluZ2AgfCBDb25maXJtIGRlZmF1bHQg" + - "U3RvcmFnZUNsYXNzOyBjaGVjayBga3ViZWN0bCBnZXQgcHYscHZjIC1uIGNhc3NhbmRyYS1zeXN0" + - "ZW1gIHwKfCBgSW52YWxpZCBHUFUgJ05DUC5HUFUuSDEwMCcgc3BlY2lmaWVkYCAoZnVuY3Rpb24g" + - "ZGVwbG95KSB8IFdyb25nIGZpZWxkIOKAlCBgZ3B1YCBpcyB0aGUgZmFtaWx5LCBub3QgdGhlIFNL" + - "VSB8IFVzZSBgImdwdSI6ICJIMTAwImAsIGAiaW5zdGFuY2VUeXBlIjogIk5DUC5HUFUuSDEwMF8x" + - "eCJgIHwKfCBgcmVnaW9uIG11c3QgYmUgcHJvdmlkZWRgIChjbHVzdGVyIHJlZ2lzdGVyIC8gaW5z" + - "dGFsbCAtLWNvbXB1dGUtcGxhbmUpIHwgYC0tcmVnaW9uYCBlbXB0eSArIGBDTFVTVEVSX1JFR0lP" + - "TmAgZW52IGVtcHR5IHwgUGFzcyBgLS1yZWdpb249dXMtd2VzdC0xYCAob3IgYW55IG5vbi1lbXB0" + - "eSB2YWx1ZSkgfAp8IGByZXF1aXJlZEVudiAiTkNBX0lEIiBpcyBub3Qgc2V0YCAoaGVsbWZpbGUg" + - "ZXJyb3IgZHVyaW5nIGNvbXB1dGUtcGxhbmUgYXBwbHkpIHwgT2xkZXIgbnZjZi1jbGkgYmVmb3Jl" + - "IGNvbW1pdCBgNmFhNTcwNGA7IEV4dHJhRW52IG5vdCBwcm9wYWdhdGluZyBOQ0FfSUQgfCBVcGdy" + - "YWRlIGBudmNmLWNsaWAgdG8gYSByZWxlYXNlIGFmdGVyIGA2YWE1NzA0YCB8CnwgYG52Y2Etb3Bl" + - "cmF0b3I6IEltYWdlUHVsbEJhY2tPZmZgIGZvciBgbnZjYS1vcGVyYXRvcjpwc2F0YCB8IEltYWdl" + - "IG5vdCBpbiBjbHVzdGVyIHJlZ2lzdHJ5OyBtdWx0aS1jbHVzdGVyIGJ1aWxkIGlzIGxvY2FsIHwg" + - "YGszZCBpbWFnZSBpbXBvcnQgbnZjci5pby8uLi4vbnZjYS1vcGVyYXRvcjpwc2F0IC1jIDxjbHVz" + - "dGVyPmAgfAoKIyMgQ29tcHV0ZS1wbGFuZSBydW50aW1lCgp8IFN5bXB0b20gfCBDYXVzZSB8IFJl" + - "bWVkaWF0aW9uIHwKfC0tLXwtLS18LS0tfAp8IE5WQ0EgYWdlbnQgQ3Jhc2hMb29wQmFja09mZiB3" + - "aXRoIGBIVFRQIDQwMWAgb24gYC92MS9udmNhL2NsdXN0ZXJzLy4uLi9yZWdpc3RlcmAgfCBTdGFs" + - "ZSBgb3V0LzxjbHVzdGVyPi1yZWdpc3Rlci12YWx1ZXMueWFtbGAgZnJvbSBwcmlvciByZWdpc3Rl" + - "cjsgY2x1c3RlciBJRCBkb2Vzbid0IG1hdGNoIElDTVMgfCBEZWxldGUgdGhlIHN0YWxlIGZpbGU7" + - "IHJlLXJ1biBgbnZjZi1jbGkgc2VsZi1ob3N0ZWQgdXBgIChpZGVtcG90ZW50IHJlZ2lzdGVyIHdy" + - "aXRlcyBhIGZyZXNoIGZpbGUpIHwKfCBgTm8gY2x1c3RlciBmb3VuZCB3aXRoIHZhbGlkIEpXS1Mg" + - "Zm9yIGNsdXN0ZXIgSUQ6IDxpZD5gIChJQ01TIGxvZykgfCBKV0tTIGluIElDTVMgZG9lc24ndCBt" + - "YXRjaCB3aGF0IGNvbXB1dGUtcGxhbmUgSzhzIGlzIGN1cnJlbnRseSBzaWduaW5nIHwgYG52Y2Yt" + - "Y2xpIGNsdXN0ZXIgcm90YXRlIC0tY2x1c3Rlci1pZD08aWQ+YCB8CnwgRnVuY3Rpb24gcG9kIGBJ" + - "bWFnZVB1bGxCYWNrT2ZmYCBpbiBgbnZjZi1iYWNrZW5kYCB8IEltYWdlLWNyZWRlbnRpYWwtaGVs" + - "cGVyIGNvbmZpZyBtaXNzaW5nIG9yIHdyb25nIHwgYGt1YmVjdGwgZGVzY3JpYmUgcG9kIC1uIG52" + - "Y2YtYmFja2VuZCA8cG9kPmA7IGNoZWNrIHRoZSBwdWxsIHNlY3JldCBjb25maWcgfAp8IEZ1bmN0" + - "aW9uIGRlcGxveSBzdHVjayBgREVQTE9ZSU5HYCBmb3IgPjUgbWluIHwgTkFUUyBzdHJlYW0gaW5p" + - "dCBsYWcgKGNvbGQtY2x1c3Rlcikg4oCUIHdhaXQsIG9yIGNoZWNrIE5BVFMgYXV0aC1jYWxsb3V0" + - "IGhlYWx0aCB8IGBrdWJlY3RsIGxvZ3MgLW4gbmF0cy1zeXN0ZW0gLWwgYXBwLmt1YmVybmV0ZXMu" + - "aW8vbmFtZT1uYXRzLWF1dGgtY2FsbG91dC1zZXJ2aWNlYCB8CgojIyBUYXNrcwoKfCBTeW1wdG9t" + - "IHwgQ2F1c2UgfCBSZW1lZGlhdGlvbiB8CnwtLS18LS0tfC0tLXwKfCBgdGFzayBjcmVhdGVgIHJl" + - "dHVybnMgYE1pc3NpbmcgPFRZUEU+IHJlZ2lzdHJ5IGNyZWRlbnRpYWwgZm9yIGhvc3RuYW1lYCwg" + - "b3Iga2VlcHMgdXNpbmcgYSBwcmV2aW91cyBjcmVkZW50aWFsIHZhbHVlLCBzaG9ydGx5IGFmdGVy" + - "IGByZWdpc3RyeS1jcmVkZW50aWFsIGFkZC91cGRhdGUvZGVsZXRlYCB3aGlsZSBgcmVnaXN0cnkt" + - "Y3JlZGVudGlhbCBsaXN0YC9gZ2V0YCBhbHJlYWR5IHNob3cgdGhlIG5ldyB2YWx1ZSB8IEV4cGVj" + - "dGVkIHByb3BhZ2F0aW9uIGRlbGF5OiBOVkNUIGNhY2hlcyB0aGUgYWNjb3VudCdzIHJlZ2lzdHJ5" + - "IGNyZWRlbnRpYWxzIHdpdGggYG52Y3QubnZjZi5jYWNoZS10dGxgIChkZWZhdWx0IGBQVDVNYCwg" + - "YWJvdXQgNSBtaW4pIGFuZCBhcHBsaWVzIHRoZSBjaGFuZ2Ugd2hlbiB0aGF0IGNhY2hlZCBjb3B5" + - "IHJlZnJlc2hlcyB8IFdhaXQgdXAgdG8gYWJvdXQgNSBtaW4gYW5kIHJldHJ5LCBvciBga3ViZWN0" + - "bCAtbiBudmNmIHJvbGxvdXQgcmVzdGFydCBkZXBsb3ltZW50L252Y3QtYXBpYCB0byBhcHBseSBp" + - "bW1lZGlhdGVseSB8ClBLBwjzrhOEdBEAAHQRAABQSwMEFAAIAAAAAAAhAAAAAAAAAAAAAAAAACwA" + - "CQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbi9TS0lMTC5tZFVUBQABAKbOEi0t" + - "LQpuYW1lOiBudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24KZGVzY3JpcHRpb246ID4tCiAg" + - "SW5zdGFsbCBhbmQgb3BlcmF0ZSBOVkNGIHNlbGYtaG9zdGVkIGNvbnRyb2wtcGxhbmUgYW5kIHNl" + - "cGFyYXRlIGNvbXB1dGUtcGxhbmUKICBzdGFja3MuIENvdmVycyBIZWxtZmlsZSB2YWx1ZXMgYW5k" + - "IENMSSBwcm9maWxlIGluc3RhbGxhdGlvbiBmbG93cywgdGVhcmRvd24sCiAgdmFsdWVzIG92ZXJy" + - "aWRlcywgcHVsbCBzZWNyZXRzLCBhbmQgdHJvdWJsZXNob290aW5nLiBVc2UgZm9yCiAgbnZjZi1z" + - "ZWxmLW1hbmFnZWQtc3RhY2ssIG52Y2YtY29tcHV0ZS1wbGFuZS1zdGFjaywgc3BsaXQgY29tcHV0" + - "ZS1wbGFuZQogIGluc3RhbGxhdGlvbiwgY29udHJvbC1wbGFuZSBpbnN0YWxsYXRpb24sIENMSS1n" + - "ZW5lcmF0ZWQgY29udHJvbC1wbGFuZQogIHByb2ZpbGVzLCBIZWxtZmlsZSwgc2VsZi1tYW5hZ2Vk" + - "LCBvciBzZWxmLWhvc3RlZCBkZXBsb3ltZW50cy4gRG8gTk9UIHVzZSBmb3IKICBsb2NhbCBrM2Qg" + - "ZW52aXJvbm1lbnRzOyB1c2UgdGhlIGxvY2FsIGszZCBkZXZlbG9wbWVudCB3b3JrZmxvdyBpbnN0" + - "ZWFkLgpsaWNlbnNlOiBBcGFjaGUtMi4wCmNvbXBhdGliaWxpdHk6IFJlcXVpcmVzIGhlbG1maWxl" + - "ID49IDEuMS4wIDwgMS4yLjAsIGhlbG0gPj0gMy4xMiwgaGVsbS1kaWZmIHBsdWdpbiwga3ViZWN0" + - "bCBtYXRjaGluZyBjbHVzdGVyIHZlcnNpb24KYXV0aG9yOiAibnZjZi1jb3JlLWVuZyA8bnZjZi1j" + - "b3JlLWVuZ0BleGNoYW5nZS5udmlkaWEuY29tPiIKdmVyc2lvbjogIjEuMC4wIgp0YWdzOiBbbnZj" + - "Ziwgc2VsZi1tYW5hZ2VkLCBoZWxtZmlsZSwgc2VsZi1ob3N0ZWQsIGNvbnRyb2wtcGxhbmUsIGNv" + - "bXB1dGUtcGxhbmUsIGNsaS1wcm9maWxlLCBpbnN0YWxsYXRpb24sIGRlcGxveW1lbnQsIHB1bGwt" + - "c2VjcmV0c10KdG9vbHM6IFtTaGVsbCwgUmVhZCwgRWRpdCwgR3JlcCwgR2xvYl0KbWV0YWRhdGE6" + - "CiAgaW50ZXJuYWw6IGZhbHNlCiAgYXV0aG9yOiAibnZjZi1jb3JlLWVuZyA8bnZjZi1jb3JlLWVu" + - "Z0BleGNoYW5nZS5udmlkaWEuY29tPiIKICB2ZXJzaW9uOiAiMS4wIgogIHRhZ3M6IFtudmNmLCBz" + - "ZWxmLW1hbmFnZWQsIGhlbG1maWxlLCBzZWxmLWhvc3RlZCwgY29udHJvbC1wbGFuZSwgY29tcHV0" + - "ZS1wbGFuZSwgY2xpLXByb2ZpbGUsIGluc3RhbGxhdGlvbiwgZGVwbG95bWVudCwgcHVsbC1zZWNy" + - "ZXRzXQogIGxhbmd1YWdlczogW2Jhc2gsIHlhbWxdCiAgZnJhbWV3b3JrczogW2hlbG1maWxlLCBo" + - "ZWxtLCBrdWJlY3RsXQogIGRvbWFpbjogY2xvdWQtaW5mcmFzdHJ1Y3R1cmUKLS0tCgojIE5WQ0Yg" + - "U2VsZi1NYW5hZ2VkIFN0YWNrIE9wZXJhdGlvbnMKCk9wZXJhdGlvbmFsIGd1aWRlIGZvciBtYXRj" + - "aGluZyBOVkNGIGNvbnRyb2wtcGxhbmUgYW5kIGNvbXB1dGUtcGxhbmUgSGVsbWZpbGUgYnVuZGxl" + - "cy4KCiMjIEluc3RydWN0aW9ucwoKVXNlIHRoaXMgc2tpbGwgZm9yIGluc3RhbGwsIHVwZ3JhZGUs" + - "IG9yIHRlYXJkb3duIHdvcmsgaW4gbWF0Y2hpbmcgYG52Y2Ytc2VsZi1tYW5hZ2VkLXN0YWNrYCBh" + - "bmQgYG52Y2YtY29tcHV0ZS1wbGFuZS1zdGFja2AgYnVuZGxlczsga2VlcCBIZWxtZmlsZSB2YWx1" + - "ZXMgYW5kIENMSSBwcm9maWxlIGhhbmRvZmZzIHNlcGFyYXRlLiBGb3IgYGZ1bmN0aW9uVHlwZTog" + - "IkxMTSJgLCByZWFkIFtMTE0gRnVuY3Rpb24gRW5hYmxlbWVudF0ocmVmZXJlbmNlcy9oZWxtZmls" + - "ZS1zdHJ1Y3R1cmUubWQjbGxtLWZ1bmN0aW9uLWVuYWJsZW1lbnQpLgoKIyMgUHJlcmVxdWlzaXRl" + - "cwoKQXNrIGZvciB0aGUgZXh0cmFjdGVkIGBudmNmLXNlbGYtbWFuYWdlZC1zdGFja2AgcGF0aC4g" + - "Rm9yIHNwbGl0IGluc3RhbGxhdGlvbiwKYWxzbyByZXF1aXJlIHRoZSBtYXRjaGluZy12ZXJzaW9u" + - "IGBudmNmLWNvbXB1dGUtcGxhbmUtc3RhY2tgIHBhdGguIFZlcmlmeSBib3RoOgoKYGBgYmFzaAps" + - "cyA8Y29udHJvbC1wbGFuZS1zdGFjaz4vaGVsbWZpbGUuZC8gPGNvbnRyb2wtcGxhbmUtc3RhY2s+" + - "L2Vudmlyb25tZW50cy8gPGNvbnRyb2wtcGxhbmUtc3RhY2s+L3NlY3JldHMvIDxjb250cm9sLXBs" + - "YW5lLXN0YWNrPi9nbG9iYWwueWFtbC5nb3RtcGwKbHMgPGNvbXB1dGUtcGxhbmUtc3RhY2s+L2hl" + - "bG1maWxlLmQvIDxjb21wdXRlLXBsYW5lLXN0YWNrPi9lbnZpcm9ubWVudHMvIDxjb21wdXRlLXBs" + - "YW5lLXN0YWNrPi9nbG9iYWwueWFtbC5nb3RtcGwKYGBgCgpJZiBlaXRoZXIgZGlyZWN0b3J5IGlz" + - "IG1pc3NpbmcsIGRvd25sb2FkIG1hdGNoaW5nIGJ1bmRsZSB2ZXJzaW9ucyBmcm9tIE5HQzoKCmBg" + - "YGJhc2gKbmdjIHJlZ2lzdHJ5IHJlc291cmNlIGRvd25sb2FkLXZlcnNpb24gPG9yZz4vbnZjZi1z" + - "ZWxmLW1hbmFnZWQtc3RhY2s6PHZlcnNpb24+Cm5nYyByZWdpc3RyeSByZXNvdXJjZSBkb3dubG9h" + - "ZC12ZXJzaW9uIDxvcmc+L252Y2YtY29tcHV0ZS1wbGFuZS1zdGFjazo8dmVyc2lvbj4KYGBgCgpD" + - "b250cm9sLXBsYW5lIGNvbW1hbmRzIGJlbG93IGFzc3VtZSB0aGUgY29udHJvbC1wbGFuZSBidW5k" + - "bGUgcm9vdC4gU3BsaXQtZmxvdwpjb21tYW5kcyBhbmQgcm9vdCBzdWJzdGl0dXRpb24gYXJlIGlu" + - "CltTcGxpdCBDb21wdXRlLVBsYW5lIEluc3RhbGxhdGlvbl0ocmVmZXJlbmNlcy9jb21wdXRlLXBs" + - "YW5lLWluc3RhbGxhdGlvbi5tZCkuCgojIyBCZWZvcmUgWW91IFN0YXJ0CgpWZXJpZnkgdG9vbGlu" + - "ZyBhbmQgY29udGV4dCBiZWZvcmUgYW55IG9wZXJhdGlvbjoKCmBgYGJhc2gKaGVsbWZpbGUgLS12" + - "ZXJzaW9uICAgIyBNdXN0IGJlIDEuMS54ICgxLjIuMCByZW1vdmVkIHNlcXVlbnRpYWwgbW9kZSkK" + - "aGVsbSB2ZXJzaW9uICAgICAgICAgIyBNdXN0IGJlID49IDMuMTIKaGVsbSBwbHVnaW4gbGlzdCAg" + - "ICAgIyBNdXN0IGluY2x1ZGUgaGVsbS1kaWZmID49IDMuMTEKa3ViZWN0bCB2ZXJzaW9uICAgICAg" + - "IyBDbGllbnQgbXVzdCBiZSB3aXRoaW4gMSBtaW5vciB2ZXJzaW9uIG9mIGNsdXN0ZXIKYGBgCgpD" + - "b250cm9sLXBsYW5lIGNvbW1hbmRzIHJ1biBmcm9tIHRoZSBleHRyYWN0ZWQgYG52Y2Ytc2VsZi1t" + - "YW5hZ2VkLXN0YWNrL2Agcm9vdDoKCmBgYGJhc2gKY2QgcGF0aC90by9udmNmLXNlbGYtbWFuYWdl" + - "ZC1zdGFjawpscyBoZWxtZmlsZS5kLyBlbnZpcm9ubWVudHMvIHNlY3JldHMvIGdsb2JhbC55YW1s" + - "LmdvdG1wbApgYGAKCklkZW50aWZ5IHRoZSBlbnZpcm9ubWVudCBmcm9tIGBlbnZpcm9ubWVudHMv" + - "PG5hbWU+LnlhbWxgIGFuZApgc2VjcmV0cy88bmFtZT4tc2VjcmV0cy55YW1sYDsgZm9yIEVLUywg" + - "dXNlIHRoZSBjYW5vbmljYWwKW0NTUCBFbmQtdG8tRW5kIEV4YW1wbGVdKGh0dHBzOi8vZG9jcy5u" + - "dmlkaWEuY29tL252Y2YvdjAuNi4wLXJjL2NzcC1lbmQtdG8tZW5kLWV4YW1wbGUpLgoKIyMgSG93" + - "IFZhbHVlcyBGbG93CgpVbmRlcnN0YW5kaW5nIHZhbHVlIHByZWNlZGVuY2UgcHJldmVudHMgdGhl" + - "IG1vc3QgY29tbW9uIGNvbmZpZ3VyYXRpb24gbWlzdGFrZXMuCgpgYGAKZW52aXJvbm1lbnRzL2Jh" + - "c2UueWFtbCAgICAgICAgICAoZGVmYXVsdHMpCiAgICAtPiBtZXJnZWQgd2l0aAplbnZpcm9ubWVu" + - "dHMvPGVudj4ueWFtbCAgICAgICAgICh5b3VyIG92ZXJyaWRlcykKICAgIC0+IGNvbnN1bWVkIGJ5" + - "Cmdsb2JhbC55YW1sLmdvdG1wbCAgICAgICAgICAgICAgKEdvIHRlbXBsYXRlLCBjb25zdHJ1Y3Rz" + - "IHBlci1jaGFydCB2YWx1ZXMpCiAgICAtPiBjb25zdW1lZCBieQpzZWNyZXRzLzxlbnY+LXNlY3Jl" + - "dHMueWFtbCAgICAgIChzZW5zaXRpdmUgdmFsdWVzKQogICAgLT4gb3ZlcnJpZGRlbiBieQpyZWxl" + - "YXNlIGlubGluZSB2YWx1ZXM6IGJsb2NrcyAgIChoaWdoZXN0IHByZWNlZGVuY2UpCmBgYAoKQ3Jp" + - "dGljYWw6IGBnbG9iYWwueWFtbC5nb3RtcGxgIG9ubHkgcGFzc2VzIHRocm91Z2ggc3BlY2lmaWMg" + - "a2V5cyB0byBlYWNoIGNoYXJ0IChpbWFnZSByZWdpc3RyaWVzLCBub2RlIHNlbGVjdG9ycywgc3Rv" + - "cmFnZSwgcmVwbGljYSBjb3VudHMpLiBTZXR0aW5nIGFuIGFyYml0cmFyeSBjaGFydCB2YWx1ZSBp" + - "biB0aGUgZW52aXJvbm1lbnQgZmlsZSB3aWxsIGJlIHNpbGVudGx5IGlnbm9yZWQgaWYgYGdsb2Jh" + - "bC55YW1sLmdvdG1wbGAgZG9lcyBub3QgcHJvcGFnYXRlIGl0LgoKVG8gb3ZlcnJpZGUgYXJiaXRy" + - "YXJ5IGNoYXJ0IHZhbHVlcywgdXNlIGEgaGVsbWZpbGUgcmVsZWFzZSBgdmFsdWVzOmAgYmxvY2su" + - "IFNlZSBbT3ZlcnJpZGluZyBIZWxtIENoYXJ0IFZhbHVlc10oI292ZXJyaWRpbmctaGVsbS1jaGFy" + - "dC12YWx1ZXMpLgoKIyMgQ2xlYW4gSW5zdGFsbGF0aW9uCgojIyMgMS4gQ3JlYXRlIG5hbWVzcGFj" + - "ZXMgYW5kIGltYWdlIHB1bGwgc2VjcmV0cyAoaWYgdXNpbmcgYSBwcml2YXRlIHJlZ2lzdHJ5KQoK" + - "YGBgYmFzaApmb3IgbnMgaW4gY2Fzc2FuZHJhLXN5c3RlbSBuYXRzLXN5c3RlbSBudmNmIGFwaS1r" + - "ZXlzIGVzcyBzaXMgdmF1bHQtc3lzdGVtIGNlcnQtbWFuYWdlcjsgZG8KICBrdWJlY3RsIGNyZWF0" + - "ZSBuYW1lc3BhY2UgIiRucyIgLS1kcnktcnVuPWNsaWVudCAtbyB5YW1sIHwga3ViZWN0bCBhcHBs" + - "eSAtZiAtCmRvbmUKCiMgT25seSBpZiBwdWxsaW5nIGZyb20gYSBwcml2YXRlIHJlZ2lzdHJ5IChl" + - "LmcuLCBOR0MgbnZjci5pbykKZXhwb3J0IE5HQ19BUElfS0VZPSI8eW91ci1rZXk+Igpmb3IgbnMg" + - "aW4gY2Fzc2FuZHJhLXN5c3RlbSBuYXRzLXN5c3RlbSBudmNmIGFwaS1rZXlzIGVzcyBzaXMgdmF1" + - "bHQtc3lzdGVtIGNlcnQtbWFuYWdlcjsgZG8KICBrdWJlY3RsIGNyZWF0ZSBzZWNyZXQgZG9ja2Vy" + - "LXJlZ2lzdHJ5IG52Y3ItY3JlZHMgXAogICAgLS1kb2NrZXItc2VydmVyPW52Y3IuaW8gXAogICAg" + - "LS1kb2NrZXItdXNlcm5hbWU9JyRvYXV0aHRva2VuJyBcCiAgICAtLWRvY2tlci1wYXNzd29yZD0i" + - "JE5HQ19BUElfS0VZIiBcCiAgICAtLW5hbWVzcGFjZT0iJG5zIiBcCiAgICAtLWRyeS1ydW49Y2xp" + - "ZW50IC1vIHlhbWwgfCBrdWJlY3RsIGFwcGx5IC1mIC0KZG9uZQpgYGAKCklmIHVzaW5nIHB1bGwg" + - "c2VjcmV0cywgeW91IG11c3QgYWxzbyBjb25maWd1cmUgZWFjaCBoZWxtZmlsZSByZWxlYXNlIHRv" + - "IHJlZmVyZW5jZSB0aGVtLiBTZWUgW0ltYWdlIFB1bGwgU2VjcmV0c10oI2ltYWdlLXB1bGwtc2Vj" + - "cmV0cykuCgojIyMgMi4gQXV0aGVudGljYXRlIGhlbG0gdG8geW91ciBjaGFydCByZWdpc3RyeQoK" + - "Qm90aCBgZG9ja2VyIGxvZ2luYCBBTkQgYGhlbG0gcmVnaXN0cnkgbG9naW5gIGFyZSByZXF1aXJl" + - "ZCBmb3IgTkdDLiBIZWxtZmlsZSB1c2VzIGhlbG0gKG5vdCBkb2NrZXIpIHRvIHB1bGwgT0NJIGNo" + - "YXJ0cywgc28gdGhlIGhlbG0gY3JlZGVudGlhbCBzdG9yZSBtdXN0IGJlIGF1dGhlbnRpY2F0ZWQg" + - "c2VwYXJhdGVseS4KCmBgYGJhc2gKIyBOR0MgLS0gYm90aCBjb21tYW5kcyBhcmUgcmVxdWlyZWQK" + - "ZG9ja2VyIGxvZ2luIG52Y3IuaW8gLXUgJyRvYXV0aHRva2VuJyAtcCAiJE5HQ19BUElfS0VZIgpo" + - "ZWxtIHJlZ2lzdHJ5IGxvZ2luIG52Y3IuaW8gLXUgJyRvYXV0aHRva2VuJyAtcCAiJE5HQ19BUElf" + - "S0VZIgoKIyBFQ1IKYXdzIGVjciBnZXQtbG9naW4tcGFzc3dvcmQgLS1yZWdpb24gPHJlZ2lvbj4g" + - "fCBcCiAgaGVsbSByZWdpc3RyeSBsb2dpbiAtLXVzZXJuYW1lIEFXUyAtLXBhc3N3b3JkLXN0ZGlu" + - "IDxhY2NvdW50Pi5ka3IuZWNyLjxyZWdpb24+LmFtYXpvbmF3cy5jb20KYGBgCgo+IE5vdGU6IGBo" + - "ZWxtIHJlZ2lzdHJ5IGxvZ2luYCBrZWVwcyBvbmx5IHRoZSBsYXN0IGxvZ2luIHBlciBob3N0ICht" + - "dWx0aS1vcmcgZ290Y2hhKS4KPiBUaGUgc3RhY2sgYW5kIHRoZSBjYWNoZXMgc3BhbiBzZXZlcmFs" + - "IE5HQyBvcmdzIHRoYXQgbmVlZCBkaWZmZXJlbnQga2V5cywgYnV0IHRoZXkgYWxsCj4gbGl2ZSB1" + - "bmRlciB0aGUgb25lIGhvc3QgYG52Y3IuaW9gLiBBIHNlY29uZCBgaGVsbSByZWdpc3RyeSBsb2dp" + - "biBudmNyLmlvYCAob3IKPiBgZG9ja2VyIGxvZ2luYCkgd2l0aCBhIGRpZmZlcmVudCBrZXkgc2ls" + - "ZW50bHkgb3ZlcndyaXRlcyB0aGUgZmlyc3QsIHNvIHB1bGxzIGZvciB0aGUKPiBmaXJzdCBvcmcg" + - "dGhlbiBmYWlsIHdpdGggYSBtaXNsZWFkaW5nIGA0MDMgQWNjZXNzIERlbmllZGAgKG5vdCBhIDQw" + - "MTogdGhlIGF1dGgKPiBzdWNjZWVkZWQsIGl0J3MgdGhlIHdyb25nLW9yZyBrZXkpLiBJZiB5b3Ug" + - "cHVsbCBjaGFydHMvaW1hZ2VzIGZyb20gbW9yZSB0aGFuIG9uZSBvcmcsCj4gZWl0aGVyIHJlLXJ1" + - "biB0aGUgbG9naW4gd2l0aCB0aGUgY29ycmVjdCBrZXkgaW1tZWRpYXRlbHkgYmVmb3JlIGVhY2gg" + - "cHVsbCwgb3IgcGFzcwo+IGAtLXVzZXJuYW1lICckb2F1dGh0b2tlbicgLS1wYXNzd29yZCA8a2V5" + - "PmAgcGVyIGBoZWxtIHB1bGxgIGludm9jYXRpb24gaW5zdGVhZCBvZiByZWx5aW5nCj4gb24gdGhl" + - "IHN0b3JlZCBsb2dpbi4gKFB1bGxpbmcgZXZlcnl0aGluZyBmcm9tIGEgc2luZ2xlIHJlZ2lzdHJ5" + - "IG1pcnJvciBhdm9pZHMgdGhpcwo+IGVudGlyZWx5LikKCiMjIyAyYi4gKFJlY29tbWVuZGVkKSBQ" + - "dWxsIGZyb20gYSByZWdpc3RyeSB0aGUgY2x1c3RlciBhdXRoZW50aWNhdGVzIHRvIGF1dG9tYXRp" + - "Y2FsbHkKCklmIHlvdSBtaXJyb3IgdGhlIE5WQ0YgaW1hZ2VzIGludG8gYSByZWdpc3RyeSB0aGF0" + - "IHRoZSBjbHVzdGVyIGNhbiBwdWxsIGZyb20gd2l0aG91dCBhbgpleHBsaWNpdCBpbWFnZSBwdWxs" + - "IHNlY3JldCAoZm9yIGV4YW1wbGUsIGEgcmVnaXN0cnkgd2hlcmUgdGhlIG5vZGUgb3Igd29ya2xv" + - "YWQgaWRlbnRpdHkgaXMKZ3JhbnRlZCBwdWxsIGFjY2VzcyBhdXRvbWF0aWNhbGx5KSwgcG9pbnQg" + - "dGhlIHN0YWNrIGF0IGl0IGFuZCBza2lwIHRoZSBjcmVkZW50aWFsIHN0ZXBzCmFib3ZlLgoKMS4g" + - "UG9pbnQgdGhlIHN0YWNrIGF0IHRoZSBtaXJyb3IgaW4gYGVudmlyb25tZW50cy88ZW52Pi55YW1s" + - "YDoKCiAgIGBgYHlhbWwKICAgZ2xvYmFsOgogICAgIGltYWdlOgogICAgICAgcmVnaXN0cnk6IDx5" + - "b3VyLXJlZ2lzdHJ5PiAgICAgICAgICAgICMgZS5nLiByZWdpc3RyeS5leGFtcGxlLmNvbQogICAg" + - "ICAgcmVwb3NpdG9yeTogPG1pcnJvci1zdWItcGF0aD4KICAgICBoZWxtOgogICAgICAgc291cmNl" + - "czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9ubHkgaWYgeW91IGFsc28gbWlycm9y" + - "ZWQgdGhlIGhlbG0gY2hhcnRzCiAgICAgICAgIHJlZ2lzdHJ5OiA8eW91ci1yZWdpc3RyeT4KICAg" + - "ICAgICAgcmVwb3NpdG9yeTogPG1pcnJvci1zdWItcGF0aD4KICAgYGBgCgogICA+IFRoZSBtYW5p" + - "ZmVzdCBoYXMgYSBtaXggb2YgT0NJIGFuZCBub24tT0NJIGFydGlmYWN0cywgc28gY29udmVydCBu" + - "b24tT0NJIGNoYXJ0cyBiZWZvcmUKICAgPiBtaXJyb3JpbmcuIENvbnRhaW5lciBpbWFnZXMgKGBu" + - "dmNyLmlvLy4uLmApIGFyZSBhbHJlYWR5IE9DSSBhbmQgbWlycm9yIGFzLWlzLiBTb21lIEhlbG0K" + - "ICAgPiBjaGFydHMsIHRob3VnaCwgYXJlIHB1Ymxpc2hlZCB0byBhbiBgaHR0cHM6Ly9gIEhlbG0g" + - "cmVwb3NpdG9yeSAoZm9yIGV4YW1wbGUKICAgPiBgaGVsbS5uZ2MubnZpZGlhLmNvbWApLiBUaG9z" + - "ZSBhcmUgbm90IE9DSSBhbmQgY2Fubm90IGJlIHJlc29sdmVkIGJ5IGBnbG9iYWwuaGVsbS5zb3Vy" + - "Y2VzYAogICA+IChPQ0kpIG9yIG1pcnJvcmVkIGRpcmVjdGx5LiBCZWZvcmUgcG9pbnRpbmcgdGhl" + - "IHN0YWNrIGF0IHlvdXIgbWlycm9yLCBjb252ZXJ0IGVhY2gKICAgPiBgaHR0cHM6Ly9gIGNoYXJ0" + - "IHRvIE9DSTogYGhlbG0gcmVwbyBhZGRgL2BoZWxtIHB1bGxgIHRoZSBgLnRnemAsIHRoZW4KICAg" + - "PiBgaGVsbSBwdXNoIDxjaGFydD4udGd6IG9jaTovLzx5b3VyLXJlZ2lzdHJ5Pi88bWlycm9yLXN1" + - "Yi1wYXRoPmAuIE9ubHkgT0NJIGNoYXJ0cyBjYW4gbGl2ZQogICA+IHVuZGVyIGBnbG9iYWwuaGVs" + - "bS5zb3VyY2VzYC4KCjIuIFNraXAgdGhlIGNyZWRlbnRpYWwgc3RlcHMgYWJvdmUuIFdoZW4gdGhl" + - "IGNsdXN0ZXIgYXV0aGVudGljYXRlcyB0byB0aGUgcmVnaXN0cnkKICAgYXV0b21hdGljYWxseSAo" + - "dGhlIG5vZGUgb3Igd29ya2xvYWQgaWRlbnRpdHkgaGFzIHB1bGwgYWNjZXNzKSwgdGhlIHB1bGwg" + - "bmVlZHMgbm8KICAgS3ViZXJuZXRlcyBzZWNyZXQsIHNvIHlvdSBkbyBub3QgbmVlZDogdGhlIHBl" + - "ci1uYW1lc3BhY2UgYG52Y3ItY3JlZHNgIGZyb20gc3RlcCAxCiAgIChzdGlsbCBjcmVhdGUgdGhl" + - "IG5hbWVzcGFjZXMsIGp1c3Qgbm90IHRoZSBzZWNyZXQpLCB0aGUgYGdsb2JhbC5pbWFnZVB1bGxT" + - "ZWNyZXRzYCBlbnRyeSwKICAgb3IgdGhlIGBkb2NrZXIgbG9naW5gL2BoZWxtIHJlZ2lzdHJ5IGxv" + - "Z2luIG52Y3IuaW9gIGZyb20gc3RlcCAyLgoKICAgPiBPbmUgcmVzaWR1YWwgY3JlZGVudGlhbDog" + - "bnZjZi1hcGkgc3RpbGwgdmFsaWRhdGVzIHRoZSB1c2VyIGZ1bmN0aW9uIGltYWdlIGF0CiAgID4g" + - "YGZ1bmN0aW9uIGNyZWF0ZWAgdmlhIHRoZSBhY2NvdW50IHJlZ2lzdHJ5IGNyZWRlbnRpYWwsIHNv" + - "IHRoYXQgY3JlZGVudGlhbCBtdXN0IHBvaW50IGF0CiAgID4gd2hpY2hldmVyIHJlZ2lzdHJ5IGhv" + - "bGRzIHRoZSB1c2VyIGltYWdlIChzZXQgaXQgdG8geW91ciBtaXJyb3IgaWYgdGhlIGltYWdlIGlz" + - "IG1pcnJvcmVkCiAgID4gdGhlcmUpLgoKIyMjIDMuIFNldCB0aGUgcm91dGUgZG9tYWluCgpgZ2xv" + - "YmFsLmRvbWFpbmAgc2V0cyB0aGUgaG9zdG5hbWUgc3VmZml4IGZvciByb3V0ZXMgc3VjaCBhcyBg" + - "YXBpLjxkb21haW4+YC4gSXQgZG9lcyBub3QgY29uZmlndXJlIHRoZSBHYXRld2F5IG9yIGl0cyBs" + - "b2FkIGJhbGFuY2VyLiBRdWVyeSB0aGUgZXhhY3QgZXhpc3RpbmcgR2F0ZXdheToKCmBgYGJhc2gK" + - "R0FURVdBWV9BRERSRVNTPSQoa3ViZWN0bCBnZXQgZ2F0ZXdheSA8Z2F0ZXdheS1uYW1lPiAtbiA8" + - "Z2F0ZXdheS1uYW1lc3BhY2U+IC1vIGpzb25wYXRoPSd7LnN0YXR1cy5hZGRyZXNzZXNbMF0udmFs" + - "dWV9JykKdGVzdCAtbiAiJEdBVEVXQVlfQUREUkVTUyIKYGBgCgpUaGUgYWRkcmVzcyBtYXkgYmUg" + - "YSBob3N0bmFtZSBvciBJUC4gQ2xvdWQgcHJvdmlkZXIgYW5kIEdhdGV3YXkgY29uZmlndXJhdGlv" + - "biBkZXRlcm1pbmUgdGhlIGxvYWQgYmFsYW5jZXIgdHlwZSBhbmQgYWRkcmVzcyBmb3JtYXQuIFRo" + - "ZSBzZWxmLW1hbmFnZWQgc3RhY2sgZG9lcyBub3Qgc2VsZWN0IGVpdGhlci4KCkZvciB0ZW1wb3Jh" + - "cnkgdGVzdGluZyB3aXRob3V0IEROUywgdXNlIGEgc3RhYmxlIHJlc2VydmVkIHN1ZmZpeCBzdWNo" + - "IGFzIGBnbG9iYWwuZG9tYWluOiAibnZjZi50ZXN0ImAsIGNvbm5lY3QgdG8gYEdBVEVXQVlfQURE" + - "UkVTU2AsIGFuZCBzZW5kIGBIb3N0OiBhcGkubnZjZi50ZXN0YC4gRm9yIHByb2R1Y3Rpb24sIHVz" + - "ZSB5b3VyIGJhc2UgRE5TIGRvbWFpbiBhbmQgcG9pbnQgaXRzIHJvdXRlIHJlY29yZHMgdG8gYEdB" + - "VEVXQVlfQUREUkVTU2AuIElmIHRoZSBlbmRwb2ludCBsYXRlciBjaGFuZ2VzLCBrZWVwIGBnbG9i" + - "YWwuZG9tYWluYCBzdGFibGUgYW5kIHVwZGF0ZSBvbmx5IEROUyBvciB0aGUgY2xpZW50IGRlc3Rp" + - "bmF0aW9uLiBTZWUgRXhhbXBsZSA0IGluIFtleGFtcGxlcy5tZF0oZXhhbXBsZXMubWQpLgoKIyMj" + - "IDQuIFByZXZpZXcgYW5kIGRlcGxveQoKYGBgYmFzaApIRUxNRklMRV9FTlY9PGVudi1uYW1lPiBo" + - "ZWxtZmlsZSB0ZW1wbGF0ZSAgICMgUHJldmlldyByZW5kZXJlZCBtYW5pZmVzdHMKSEVMTUZJTEVf" + - "RU5WPTxlbnYtbmFtZT4gaGVsbWZpbGUgc3luYyAgICAgICAjIERlcGxveQpgYGAKCj4gU2V0IEJP" + - "VEggQ2Fzc2FuZHJhIHBhc3N3b3JkcyBpbiB0aGUgc2VjcmV0cyBmaWxlLiBUaGUgc2VjcmV0cyBm" + - "aWxlIGRvY3VtZW50cwo+IGBERUZBVUxUX0NBU1NBTkRSQV9QQVNTV09SRGAsIGJ1dCB0aGUgY2Fz" + - "c2FuZHJhIGNoYXJ0IGhhcyBhIHNlY29uZCBjcmVkZW50aWFsLAo+IGBjYXNzYW5kcmEuc2Vydmlj" + - "ZVJvbGVQYXNzd29yZGAsIHRoYXQgZGVmYXVsdHMgdG8gYGNoQG5nM20zYC4gSWYgeW91IHNldCBv" + - "bmx5Cj4gYERFRkFVTFRfQ0FTU0FORFJBX1BBU1NXT1JEYCwgdGhlIHNlcnZpY2Ugcm9sZSBrZWVw" + - "cyB0aGF0IGRlZmF1bHQgYW5kIGV2ZXJ5IERCLWJhY2tlZAo+IHNlcnZpY2UgY3Jhc2gtbG9vcHMg" + - "d2l0aCBgQmFkIGNyZWRlbnRpYWxzYCBvbmNlIGl0IHRyaWVzIHRvIGF1dGhlbnRpY2F0ZS4gU2V0" + - "Cj4gYGNhc3NhbmRyYS5zZXJ2aWNlUm9sZVBhc3N3b3JkYCB0byB0aGUgc2FtZSB2YWx1ZSBhcyBg" + - "REVGQVVMVF9DQVNTQU5EUkFfUEFTU1dPUkRgLgoKIyMjIDUuIERlcGxveW1lbnQgcGhhc2VzCgpI" + - "ZWxtZmlsZSBkZXBsb3lzIGluIG9yZGVyIHdpdGggZGVwZW5kZW5jaWVzOgoKfCBQaGFzZSB8IFNl" + - "bGVjdG9yIHwgU2VydmljZXMgfCBXYWl0IHRpbWUgfAp8LS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0t" + - "LS0tLS18LS0tLS0tLS0tLS18CnwgMSB8IGByZWxlYXNlLWdyb3VwPWRlcGVuZGVuY2llc2AgfCBO" + - "QVRTLCBPcGVuQmFvLCBDYXNzYW5kcmEgfCA1LTEwIG1pbiB8CnwgMiB8IGByZWxlYXNlLWdyb3Vw" + - "PXNlcnZpY2VzYCB8IEFQSSwgU0lTLCBFU1MsIGludm9jYXRpb24sIGdycGMtcHJveHksIG5vdGFy" + - "eSwgYXBpLWtleXMsIG9wdGlvbmFsIExMTSBnYXRld2F5L3JvdXRlciwgb3B0aW9uYWwgVmFuaXR5" + - "IEdhdGV3YXksIE5WQ0YgVUkgd2hlbiB0aGUgc3RhY2sgcGFja2FnZSBpbmNsdWRlcyB0aGUgYWRk" + - "b24gfCA1LTEwIG1pbiB8CnwgMyB8IGByZWxlYXNlLWdyb3VwPWluZ3Jlc3NgIHwgR2F0ZXdheSBy" + - "b3V0ZXMgfCAxLTIgbWluIHwKfCA0IHwgYHJlbGVhc2UtZ3JvdXA9b2JzZXJ2YWJpbGl0eWAgfCBP" + - "YnNlcnZhYmlsaXR5IHN0YWNrIChpZiBlbmFibGVkKSB8IDEtMiBtaW4gfAoKTW9uaXRvciBpbiBh" + - "IHNlcGFyYXRlIHRlcm1pbmFsOgoKYGBgYmFzaAprdWJlY3RsIGdldCBwb2RzIC1BIC13CmBgYAoK" + - "IyMjIDYuIEVuYWJsZSBWYW5pdHkgR2F0ZXdheSAob3B0aW9uYWwpCgpWYW5pdHkgR2F0ZXdheSBp" + - "cyBkaXNhYmxlZCBieSBkZWZhdWx0IGFuZCBpcyBvbmx5IG5lZWRlZCBmb3IgY3VzdG9tZXItZmFj" + - "aW5nCmhvc3RuYW1lcyBvciBwYXRoIG1hcHBpbmdzIGluIGZyb250IG9mIHRoZSBzdGFuZGFyZCBO" + - "VkNGIEFQSSBhbmQgaW52b2NhdGlvbgpyb3V0ZXMuIEl0IGlzIGF2YWlsYWJsZSBvbmx5IGluIHN0" + - "YWNrIHBhY2thZ2VzIHRoYXQgaW5jbHVkZSB0aGUgVmFuaXR5IEdhdGV3YXkKYWRkb24uIElmIHRo" + - "ZSBleHRyYWN0ZWQgc3RhY2sgcGFja2FnZSBkb2VzIG5vdCBjb250YWluIGEgYHZhbml0eS1nYXRl" + - "d2F5YApyZWxlYXNlIGFuZCBgdmFuaXR5R2F0ZXdheWAgcm91dGUgdmFsdWVzLCBza2lwIHRoZXNl" + - "IGNvbW1hbmRzIGFuZCB1c2UgYSBuZXdlcgpzdGFjayBwYWNrYWdlIHRoYXQgaW5jbHVkZXMgdGhl" + - "bS4KCklmIHRoZSBzdGFjayBwYWNrYWdlIGluY2x1ZGVzIHRoZSBhZGRvbiwgZW5hYmxlIGl0IGlu" + - "CmBlbnZpcm9ubWVudHMvPGVudi1uYW1lPi55YW1sYDoKCmBgYHlhbWwKYWRkb25zOgogIHZhbml0" + - "eUdhdGV3YXk6CiAgICBlbmFibGVkOiB0cnVlCiAgICBtYXBwaW5nQ29uZmlnOiB7fQpgYGAKClRo" + - "ZSBkZWZhdWx0IHJvdXRlIGhvc3QgaXMgYHZhbml0eS48ZG9tYWluPmAgYW5kIHRoZSBiYWNrZW5k" + - "IGlzCmB2YW5pdHktZ2F0ZXdheS5udmNmOjgwODBgLiBQdXQgZGVwbG95bWVudC1zcGVjaWZpYyBo" + - "b3N0IGFuZCBwYXRoIG1hcHBpbmdzIHVuZGVyCmBhZGRvbnMudmFuaXR5R2F0ZXdheS5tYXBwaW5n" + - "Q29uZmlnYC4gSWYgeW91IG5lZWQgY3VzdG9tIHZhbml0eSBob3N0cyBpbnN0ZWFkIG9mCmB2YW5p" + - "dHkuPGRvbWFpbj5gLCB1c2UgdGhlIHJvdXRlIGhvc3RuYW1lIG92ZXJyaWRlcyBzdXBwb3J0ZWQg" + - "YnkgdGhlIHN0YWNrCnBhY2thZ2UgYW5kIGNyZWF0ZSBtYXRjaGluZyBETlMgcmVjb3Jkcy4KCkFm" + - "dGVyIGNvbmZpcm1pbmcgdGhlIHBhY2thZ2UgaW5jbHVkZXMgdGhlIGB2YW5pdHktZ2F0ZXdheWAg" + - "cmVsZWFzZSwgcHJldmlldyBhbmQKYXBwbHkgdGhlIHNlcnZpY2UgYW5kIHJvdXRlOgoKYGBgYmFz" + - "aApIRUxNRklMRV9FTlY9PGVudi1uYW1lPiBoZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9dmFuaXR5" + - "LWdhdGV3YXkgdGVtcGxhdGUKSEVMTUZJTEVfRU5WPTxlbnYtbmFtZT4gaGVsbWZpbGUgLS1zZWxl" + - "Y3RvciBuYW1lPXZhbml0eS1nYXRld2F5IHN5bmMKSEVMTUZJTEVfRU5WPTxlbnYtbmFtZT4gaGVs" + - "bWZpbGUgLS1zZWxlY3RvciByZWxlYXNlLWdyb3VwPWluZ3Jlc3Mgc3luYwpgYGAKClZlcmlmeSB0" + - "aGUgcm91dGUgb25seSB3aGVuIHRoZSBhZGRvbiBpcyBwcmVzZW50IGFuZCBlbmFibGVkOgoKYGBg" + - "YmFzaAprdWJlY3RsIGdldCBkZXBsb3ksc3ZjIC1uIG52Y2YgLWwgYXBwLmt1YmVybmV0ZXMuaW8v" + - "bmFtZT12YW5pdHktZ2F0ZXdheQprdWJlY3RsIGdldCBodHRwcm91dGUgLUEgfCBncmVwIC1pIHZh" + - "bml0eQpjdXJsIC1IICJIb3N0OiB2YW5pdHkuPGRvbWFpbj4iICJodHRwOi8vPGdhdGV3YXktYWRk" + - "cmVzcz4vaGVhbHRoIgpgYGAKCkRvIG5vdCBlbmFibGUgVmFuaXR5IEdhdGV3YXkgZm9yIHN0YW5k" + - "YXJkIEFQSSwgQVBJIEtleXMsIGludm9jYXRpb24sIExMTQppbnZvY2F0aW9uLCBvciBnUlBDIHRy" + - "YWZmaWMuIFRob3NlIHJvdXRlcyBhcmUgcHJvdmlkZWQgYnkgdGhlIGJhc2UgZ2F0ZXdheQpyb3V0" + - "ZXMuCgojIyMgNy4gRW5hYmxlIE5WQ0YgVUkgKG9wdGlvbmFsKQoKTlZDRiBVSSBpcyBhbiBvcHRp" + - "b25hbCwgY3VzdG9tZXItZmFjaW5nIGFkbWluLXBhbmVsIFVJLiBJdCBpcyBkaXNhYmxlZCBieQpk" + - "ZWZhdWx0IGFuZCBhdmFpbGFibGUgb25seSBpbiBzdGFjayBwYWNrYWdlcyB0aGF0IGluY2x1ZGUg" + - "dGhlIE5WQ0YgVUkgYWRkb24uIElmCnlvdXIgZXh0cmFjdGVkIHN0YWNrIHBhY2thZ2UgZG9lcyBu" + - "b3QgY29udGFpbiBhIGBudmNmLXVpYCByZWxlYXNlIGFuZCBgbnZjZlVpYApyb3V0ZSB2YWx1ZXMs" + - "IHNraXAgdGhpcyBzZWN0aW9uLiBUaGUgTlZDRiBVSSBhZG1pbiBwYW5lbCBpcyBjdXJyZW50bHkK" + - "dW5hdXRoZW50aWNhdGVkOyBkbyBub3QgZXhwb3NlIGl0IHRvIHRoZSBwdWJsaWMgaW50ZXJuZXQu" + - "CgpGb3IgZW5hYmxlbWVudCwgbmFtZXNwYWNlIGFuZCBwdWxsIHNlY3JldCBzZXR1cCwgYXBwbHks" + - "IGFuZCB2ZXJpZmljYXRpb24gc3RlcHMsCnNlZSBbTlZDRiBVSSBBZGRvbl0ocmVmZXJlbmNlcy9u" + - "dmNmLXVpLWFkZG9uLm1kKS4KCiMjIyA4LiBJbnN0YWxsIHRoZSBzZXBhcmF0ZSBjb21wdXRlLXBs" + - "YW5lIHN0YWNrCgpUaGUgY29udHJvbC1wbGFuZSBzdGFjayBkb2VzIG5vdCBpbnN0YWxsIGNvbXB1" + - "dGUtcGxhbmUgY29tcG9uZW50cy4gQWZ0ZXIgaXQgaXMgaGVhbHRoeSwgY2hvb3NlIGV4YWN0bHkg" + - "b25lIGNvbXB1dGUtcGxhbmUgaGFuZG9mZjoKCi0gSGVsbWZpbGUgdmFsdWVzIGZsb3c6IGF1dGhv" + - "ciBzZXBhcmF0ZSBlbnZpcm9ubWVudCBmaWxlcywgdGhlbiByZWdpc3RlciBhbmQKICBpbnN0YWxs" + - "IHdpdGggdGhlIGNvbXB1dGUtcGxhbmUgTWFrZWZpbGUuCi0gQ0xJIHByb2ZpbGUgZmxvdzogdXNl" + - "IHRoZSBwcm9maWxlIGdlbmVyYXRlZCBieSB0aGUgQ0xJIGNvbnRyb2wtcGxhbmUgaW5zdGFsbCwK" + - "ICB0aGVuIHJ1biB0aGUgY29tcGxldGUgQ0xJIHJlZ2lzdGVyIGFuZCBpbnN0YWxsIGNvbW1hbmRz" + - "LgoKRG8gbm90IG1peCB0aGVzZSBoYW5kb2Zmcy4gRm9sbG93IFtTcGxpdCBDb21wdXRlLVBsYW5l" + - "IEluc3RhbGxhdGlvbl0ocmVmZXJlbmNlcy9jb21wdXRlLXBsYW5lLWluc3RhbGxhdGlvbi5tZCkK" + - "Zm9yIGNvbW1hbmRzLCBFS1Mgcm91dGluZywgcHVsbCBzZWNyZXRzLCB2ZXJpZmljYXRpb24sIGFu" + - "ZCB0ZWFyZG93biBvcmRlci4KCiMjIENsZWFuIFRlYXJkb3duCgpEZXN0cm95IGV2ZXJ5IGNvbXB1" + - "dGUgcGxhbmUgYmVmb3JlIHRoZSBjb250cm9sIHBsYW5lLCB1c2luZyB0aGUgdGVhcmRvd24gZm9y" + - "CnRoZSBzYW1lIGhhbmRvZmY7IHNlZSBbU3BsaXQgQ29tcHV0ZS1QbGFuZSBJbnN0YWxsYXRpb25d" + - "KHJlZmVyZW5jZXMvY29tcHV0ZS1wbGFuZS1pbnN0YWxsYXRpb24ubWQjdGVhcmRvd24pLgoKU2Nv" + - "cGU6IE9ubHkgZGVzdHJveSByZWxlYXNlcyBtYW5hZ2VkIGJ5IHRoaXMgY29udHJvbC1wbGFuZSBo" + - "ZWxtZmlsZSBzdGFjay4gVGhlIE5WQ0YgcmVsZWFzZXMgYXJlOiBgbmF0c2AsIGBvcGVuYmFvLXNl" + - "cnZlcmAsIGBjYXNzYW5kcmFgLCBgYXBpLWtleXNgLCBgc2lzYCwgYGFwaWAsIGBpbnZvY2F0aW9u" + - "LXNlcnZpY2VgLCBgZ3JwYy1wcm94eWAsIGBlc3MtYXBpYCwgYG5vdGFyeS1zZXJ2aWNlYCwgb3B0" + - "aW9uYWwgYHZhbml0eS1nYXRld2F5YCwgYG52Y2YtdWlgLCBgYWRtaW4taXNzdWVyLXByb3h5YCwg" + - "YW5kIGBpbmdyZXNzYDsgYGNlcnQtbWFuYWdlcmAgaXMgaW5jbHVkZWQgb25seSB3aGVuIGBjZXJ0" + - "TWFuYWdlci5lbmFibGVkOiB0cnVlYC4gVGhlIGNvbnRyb2wtcGxhbmUgbmFtZXNwYWNlIGludmVu" + - "dG9yeSBhbHNvIGluY2x1ZGVzIGBjZXJ0LW1hbmFnZXJgLCBidXQgZGVmYXVsdCBuYW1lc3BhY2Ug" + - "Y2xlYW51cCBwcmVzZXJ2ZXMgaXQuIE5hbWVzcGFjZSBwcmVzZXJ2YXRpb24gZG9lcyBub3QgcHJl" + - "c2VydmUgdGhlIEhlbG0gcmVsZWFzZS4gRXh0ZXJuYWwgY2VydC1tYW5hZ2VyIG11c3QgdXNlIGBj" + - "ZXJ0TWFuYWdlci5lbmFibGVkOiBmYWxzZWA7IG90aGVyd2lzZSBIZWxtZmlsZSB0cmVhdHMgdGhl" + - "IHJlbGVhc2UgYXMgc3RhY2stbWFuYWdlZC4gRG8gbm90IGRlbGV0ZSBvdGhlciBoZWxtIHJlbGVh" + - "c2VzIG9yIG5hbWVzcGFjZXMgb24gdGhlIGNsdXN0ZXIuCgpCZWZvcmUgY29udHJvbC1wbGFuZSBk" + - "ZXN0cm95LCBpZGVudGlmeSB3aGV0aGVyIGNlcnQtbWFuYWdlciBpcyBleHRlcm5hbC4gRm9yIGFu" + - "IGV4dGVybmFsIGluc3RhbGxhdGlvbiwgcmVxdWlyZSBlZmZlY3RpdmUgYGNlcnRNYW5hZ2VyLmVu" + - "YWJsZWQ6IGZhbHNlYCBhbmQgYWJvcnQgaWYgaXQgaXMgdHJ1ZS4gRm9yIGFuIGludGVuZGVkIHN0" + - "YWNrLW1hbmFnZWQgcmVsZWFzZSB3aXRoIGVmZmVjdGl2ZSBgY2VydE1hbmFnZXIuZW5hYmxlZDog" + - "dHJ1ZWAsIHZlcmlmeSBtYXRjaGluZyBzdGFjayBIZWxtIHJlbGVhc2UgbWV0YWRhdGEgYW5kIGFi" + - "b3J0IG9uIG1pc3Npbmcgb3IgbWlzbWF0Y2hlZCBldmlkZW5jZS4gUHJlc2VydmUgdGhlIG5hbWVz" + - "cGFjZSBieSBkZWZhdWx0OyBvbmx5IHBsYW4gaXRzIHJlbW92YWwgYWZ0ZXIgdmVyaWZ5aW5nIG5h" + - "bWVzcGFjZSBwcm92ZW5hbmNlIGFuZCBnZXR0aW5nIGV4cGxpY2l0IGNvbmZpcm1hdGlvbi4KCiMj" + - "IyBTdGFuZGFyZCB0ZWFyZG93bgoKUnVuIGZyb20gaW5zaWRlIHRoZSBgbnZjZi1zZWxmLW1hbmFn" + - "ZWQtc3RhY2svYCBkaXJlY3Rvcnk6CgpgYGBiYXNoCkhFTE1GSUxFX0VOVj08ZW52LW5hbWU+IGhl" + - "bG1maWxlIGRlc3Ryb3kKYGBgCgojIyMgRGVsZXRlIG5hbWVzcGFjZXMKCmBgYGJhc2gKZm9yIG5z" + - "IGluIGNhc3NhbmRyYS1zeXN0ZW0gbmF0cy1zeXN0ZW0gbnZjZiBhcGkta2V5cyBlc3Mgc2lzIG52" + - "Y2YtdWkgdmF1bHQtc3lzdGVtOyBkbwogIGt1YmVjdGwgZGVsZXRlIG5hbWVzcGFjZSAiJG5zIiAt" + - "LWlnbm9yZS1ub3QtZm91bmQKZG9uZQpgYGAKCiMjIyBWZXJpZnkgY2xlYW4KCmBgYGJhc2gKa3Vi" + - "ZWN0bCBnZXQgbnMgfCBncmVwIC1FICcoY2Fzc2FuZHJhfG5hdHN8dmF1bHR8bnZjZnxhcGkta2V5" + - "c3xlc3N8c2lzKScKIyBTaG91bGQgcmV0dXJuIGVtcHR5CmBgYAoKIyMgT3ZlcnJpZGluZyBIZWxt" + - "IENoYXJ0IFZhbHVlcwoKIyMjIEVudmlyb25tZW50IGZpbGUgKGxpbWl0ZWQpCgpXb3JrcyBvbmx5" + - "IGZvciBrZXlzIHRoYXQgYGdsb2JhbC55YW1sLmdvdG1wbGAgcHJvcGFnYXRlcyAoZS5nLiwgYGNh" + - "c3NhbmRyYS5yZXBsaWNhQ291bnRgLCBgZ2xvYmFsLnN0b3JhZ2VDbGFzc2AsIGBnbG9iYWwuaW1h" + - "Z2VgKS4KCiMjIyBSZWxlYXNlIHZhbHVlcyBibG9jayAoYW55IGNoYXJ0IHZhbHVlKQoKRWRpdCB0" + - "aGUgcmVsZWFzZSBpbiBgaGVsbWZpbGUuZC8qLnlhbWwuZ290bXBsYCBhbmQgYWRkIGEgYHZhbHVl" + - "czpgIGJsb2NrLiBJbiB0aGUgZXhhbXBsZXMgYmVsb3csIGA8cHJpdmF0ZS12YWx1ZXM+YCByZWZl" + - "cnMgdG8gdGhlIGBzZWNyZXRzL2AgZGlyZWN0b3J5IGF0IHRoZSBoZWxtZmlsZSBzdGFjayByb290" + - "LgoKYGBgeWFtbAotIG5hbWU6IGNhc3NhbmRyYQogIHZlcnNpb246IDAuOC4wCiAgY29uZGl0aW9u" + - "OiBjYXNzYW5kcmEuZW5hYmxlZAogIG5hbWVzcGFjZTogY2Fzc2FuZHJhLXN5c3RlbQogIDw8OiAq" + - "ZGVwZW5kZW5jeQogIHZhbHVlczoKICAgIC0gLi4vZ2xvYmFsLnlhbWwuZ290bXBsCiAgICAtIC4u" + - "Lzxwcml2YXRlLXZhbHVlcz4ve3sgcmVxdWlyZWRFbnYgIkhFTE1GSUxFX0VOViIgfX0tc2VjcmV0" + - "cy55YW1sCiAgICAtIGNhc3NhbmRyYToKICAgICAgICByZXNvdXJjZXM6CiAgICAgICAgICBsaW1p" + - "dHM6CiAgICAgICAgICAgIGNwdTogIjgiCiAgICAgICAgICAgIG1lbW9yeTogODE5Mk1pCiAgICAg" + - "ICAgICByZXF1ZXN0czoKICAgICAgICAgICAgY3B1OiAiMiIKICAgICAgICAgICAgbWVtb3J5OiA0" + - "MDk2TWkKYGBgCgpZQU1MIG1lcmdlIGdvdGNoYTogV2hlbiBhIHJlbGVhc2UgdXNlcyBgPDw6ICpk" + - "ZXBlbmRlbmN5YCBvciBgaW5oZXJpdGAsIHNwZWNpZnlpbmcgYHZhbHVlczpgIHJlcGxhY2VzIHRo" + - "ZSB0ZW1wbGF0ZSdzIHZhbHVlcyBsaXN0LiBZb3UgbXVzdCByZS1pbmNsdWRlIGBnbG9iYWwueWFt" + - "bC5nb3RtcGxgIGFuZCB0aGUgc2VjcmV0cyBmaWxlLgoKIyMjIFByZXZpZXcgYW5kIGFwcGx5IGEg" + - "c2luZ2xlIHJlbGVhc2UKCmBgYGJhc2gKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2Vs" + - "ZWN0b3IgbmFtZT1jYXNzYW5kcmEgdGVtcGxhdGUgICMgUHJldmlldwpIRUxNRklMRV9FTlY9PGVu" + - "dj4gaGVsbWZpbGUgLS1zZWxlY3RvciBuYW1lPWNhc3NhbmRyYSBzeW5jICAgICAgIyBBcHBseQpg" + - "YGAKCiMjIEltYWdlIFB1bGwgU2VjcmV0cwoKVGhlcmUgYXJlIHRocmVlIGRpc3RpbmN0IGNyZWRl" + - "bnRpYWwgdHlwZXMuIERvIG5vdCBjb25mbGF0ZSB0aGVtLCBhbmQgbWluZCB0aGUKZm9ybWF0IHJ1" + - "bGUgYmVsb3cgKHR3byBvZiB0aGVtIGZhaWwgZXZlbiB3aXRoIHRoZSBjb3JyZWN0IGtleSBpZiB0" + - "aGUgZm9ybWF0IGlzIHdyb25nKToKCnwgfCBDb250cm9sIFBsYW5lIFB1bGwgU2VjcmV0cyB8IEFQ" + - "SSBCb290c3RyYXAgUmVnaXN0cnkgQ3JlZHMgfCBTaWRlY2FyIEltYWdlLVB1bGwgU2VjcmV0IHwK" + - "fC0tLXwtLS18LS0tfC0tLXwKfCBQdXJwb3NlIHwgSzhzIHB1bGxzIE5WQ0Ygc2VydmljZSBpbWFn" + - "ZXMgfCBudmNmLWFwaSB2YWxpZGF0ZXMgdGhlIHVzZXIgZnVuY3Rpb24gaW1hZ2UgYXQgYGZ1bmN0" + - "aW9uIGNyZWF0ZWAgfCBudmNmLWFwaSBwdWxscyB0aGUgcGxhdGZvcm0gc2lkZWNhcnMgaW5qZWN0" + - "ZWQgaW50byBldmVyeSB3b3JrZXIgcG9kIHwKfCBXaGVyZSB8IEs4cyBgZG9ja2VyLXJlZ2lzdHJ5" + - "YCBTZWNyZXRzICsgS3l2ZXJubyBDbHVzdGVyUG9saWN5IHwgYDxwcml2YXRlLXZhbHVlcz4vPGVu" + - "dj4tc2VjcmV0cy55YW1sYCAoYWNjb3VudC1ib290c3RyYXApIHwgYE5WQ0ZfQVBJX1NJREVDQVJT" + - "X0lNQUdFX1BVTExfU0VDUkVUYCBpbiBgPGVudj4tc2VjcmV0cy55YW1sYCAtPiBPcGVuQmFvIGBz" + - "ZXJ2aWNlcy9udmNmLWFwaS9rdi9zaWRlY2Fycy9pbWFnZS1wdWxsLXNlY3JldGAgKGZpZWxkIGBz" + - "ZWNyZXRgKSB8CnwgRm9ybWF0IHwgc3RhbmRhcmQgYC5kb2NrZXJjb25maWdqc29uYCAoa3ViZWN0" + - "bCBidWlsZHMgaXQgZm9yIHlvdSkgfCBgYmFzZTY0KCIkb2F1dGh0b2tlbjo8a2V5PiIpYCB8IGBi" + - "YXNlNjQoIiRvYXV0aHRva2VuOjxrZXk+IilgIHwKCj4gTm90ZTogdGhlIGFjY291bnQtYm9vdHN0" + - "cmFwIGNyZWQgYW5kIHRoZSBzaWRlY2FyIHNlY3JldCBhcmUgTk9UIGEKPiBkb2NrZXJjb25maWdq" + - "c29uLiBUaGUgc2VjcmV0cyB0ZW1wbGF0ZSBzaGlwcyB0aGUgcGxhY2Vob2xkZXIKPiBgUkVQTEFD" + - "RV9XSVRIX0JBU0U2NF9ET0NLRVJfQ1JFREVOVElBTGAsIHdoaWNoIHJlYWRzIGFzICJiYXNlNjQg" + - "b2YgYSBkb2NrZXJjb25maWdqc29uLiIKPiBJdCBpc24ndC4gQm90aCB2YWx1ZXMgYXJlIGNvbnN1" + - "bWVkIGFzIGEgcmF3IGRvY2tlciBgYXV0aGAgc3RyaW5nOiBudmNmLWFwaSB0YWtlcyB0aGUKPiB2" + - "YWx1ZSB2ZXJiYXRpbSBhbmQgZHJvcHMgaXQgaW50byB0aGUgYGF1dGhgIGZpZWxkIG9mIHRoZSBk" + - "b2NrZXJjb25maWcgaXQgYnVpbGRzLiBTbyB0aGUKPiB2YWx1ZSBtdXN0IGJlIGBiYXNlNjQoIiRv" + - "YXV0aHRva2VuOjxrZXk+IilgLCBlLmcuIGBwcmludGYgJyRvYXV0aHRva2VuOiVzJyAiJEtFWSIg" + - "fCBvcGVuc3NsIGJhc2U2NCAtQWAsCj4gbm90IGBiYXNlNjQoPGRvY2tlcmNvbmZpZ2pzb24+KWAu" + - "Cj4gIC0gV3JvbmcgYWNjb3VudC1ib290c3RyYXAgdmFsdWU6IGBmdW5jdGlvbiBjcmVhdGVgIHJl" + - "dHVybnMKPiAgICBgNDAwICJtdXN0IGJlIGJhc2U2NCBlbmNvZGVkIHVzZXJuYW1lOnBhc3N3b3Jk" + - "IGZvcm1hdCJgLgo+ICAtIFdyb25nIHNpZGVjYXIgdmFsdWU6IGV2ZXJ5IHdvcmtlcidzIHNpZGVj" + - "YXIgcHVsbCBnZXRzIGEgbWFsZm9ybWVkIGNyZWRlbnRpYWwgYW5kCj4gICAgYDQwM2BzLCByZWdh" + - "cmRsZXNzIG9mIHdoaWNoIGtleSBpcyBpbnNpZGUuIFRoZSBzeW1wdG9tIGxvb2tzIGxpa2UgYSBi" + - "YWQgb3Igd3Jvbmctb3JnCj4gICAga2V5LCBidXQgdGhlIGtleSBpcyBmaW5lIGFuZCB0aGUgZW5j" + - "b2RpbmcgaXMgdGhlIGJ1Zy4gVG8gcmVwYWlyIGFuIGFscmVhZHktaW5zdGFsbGVkCj4gICAgc3Rh" + - "Y2sgd2l0aG91dCBhIGZ1bGwgcmUtc3luYzoKPiAgICBgYGBiYXNoCj4gICAgQVVUSD0kKHByaW50" + - "ZiAnJG9hdXRodG9rZW46JXMnICIkS0VZIiB8IG9wZW5zc2wgYmFzZTY0IC1BKQo+ICAgIGJhbyBr" + - "diBwdXQgc2VydmljZXMvbnZjZi1hcGkva3Yvc2lkZWNhcnMvaW1hZ2UtcHVsbC1zZWNyZXQgc2Vj" + - "cmV0PSIkQVVUSCIKPiAgICAjIGlmIE5WSURJQSBDbG91ZCBUYXNrcyBpcyBlbmFibGVkLCByZXBl" + - "YXQgZm9yIHNlcnZpY2VzL252Y3QtYXBpL2t2L3NpZGVjYXJzL2ltYWdlLXB1bGwtc2VjcmV0Cj4g" + - "ICAga3ViZWN0bCByb2xsb3V0IHJlc3RhcnQgLW4gbnZjZiBkZXBsb3kvbnZjZi1hcGkgICAjIHBp" + - "Y2tzIHVwIHRoZSBuZXcgc2lkZWNhciBjcmVkCj4gICAgYGBgCgo+IE5vdGUgKG11bHRpLW9yZyk6" + - "IHdoZW4gcHVsbGluZyBmcm9tIE5HQyAobm90IGEgbWlycm9yKSwgdGhlIHVzZXIgZnVuY3Rpb24g" + - "aW1hZ2UgYW5kCj4gdGhlIHBsYXRmb3JtIHNpZGVjYXJzIG9mdGVuIGxpdmUgaW4gZGlmZmVyZW50" + - "IG52Y3IuaW8gb3JncywgZWFjaCBuZWVkaW5nIGEgZGlmZmVyZW50Cj4ga2V5LCBzbyB0aGUgYWNj" + - "b3VudC1ib290c3RyYXAgY3JlZCAoZnVuY3Rpb24gaW1hZ2UpIGFuZCB0aGUgc2lkZWNhciBzZWNy" + - "ZXQgKHNpZGVjYXJzKQo+IGFyZSBmcmVxdWVudGx5IHR3byBkaWZmZXJlbnQga2V5cy4gTWlycm9y" + - "aW5nIGV2ZXJ5dGhpbmcgaW50byBhIHNpbmdsZSByZWdpc3RyeSB0aGUKPiBjbHVzdGVyIGF1dGhl" + - "bnRpY2F0ZXMgdG8gYXV0b21hdGljYWxseSBjb2xsYXBzZXMgdGhpcyB0byBvbmUgY3JlZGVudGlh" + - "bCBwYXRoLgoKIyMjIENvbmZpZ3VyaW5nIHdpdGggS3l2ZXJubyAocmVjb21tZW5kZWQpCgpVc2Ug" + - "YSBLeXZlcm5vIG11dGF0aW5nIGFkbWlzc2lvbiBwb2xpY3kgdG8gYXV0b21hdGljYWxseSBpbmpl" + - "Y3QgYGltYWdlUHVsbFNlY3JldHNgIGludG8gYWxsIHBvZHMgaW4gTlZDRiBuYW1lc3BhY2VzLiBU" + - "aGlzIHdvcmtzIHVuaWZvcm1seSBmb3IgYWxsIGNoYXJ0cyAtLSBubyBwZXItY2hhcnQgY29uZmln" + - "dXJhdGlvbiBvciBoZWxtZmlsZSBtb2RpZmljYXRpb25zIG5lZWRlZC4KCmBgYGJhc2gKIyAxLiBJ" + - "bnN0YWxsIEt5dmVybm8KaGVsbSByZXBvIGFkZCBreXZlcm5vIGh0dHBzOi8va3l2ZXJuby5naXRo" + - "dWIuaW8va3l2ZXJuby8KaGVsbSByZXBvIHVwZGF0ZQpoZWxtIGluc3RhbGwga3l2ZXJubyBreXZl" + - "cm5vL2t5dmVybm8gLW4ga3l2ZXJubyAtLWNyZWF0ZS1uYW1lc3BhY2UKCiMgMi4gQ3JlYXRlIHB1" + - "bGwgc2VjcmV0IGluIGVhY2ggbmFtZXNwYWNlCmV4cG9ydCBOR0NfQVBJX0tFWT0iPHlvdXIta2V5" + - "PiIKZm9yIG5zIGluIGNhc3NhbmRyYS1zeXN0ZW0gbmF0cy1zeXN0ZW0gbnZjZiBhcGkta2V5cyBl" + - "c3Mgc2lzIHZhdWx0LXN5c3RlbSBjZXJ0LW1hbmFnZXI7IGRvCiAga3ViZWN0bCBjcmVhdGUgc2Vj" + - "cmV0IGRvY2tlci1yZWdpc3RyeSBudmNyLWNyZWRzIFwKICAgIC0tZG9ja2VyLXNlcnZlcj1udmNy" + - "LmlvIFwKICAgIC0tZG9ja2VyLXVzZXJuYW1lPSckb2F1dGh0b2tlbicgXAogICAgLS1kb2NrZXIt" + - "cGFzc3dvcmQ9IiROR0NfQVBJX0tFWSIgXAogICAgLS1uYW1lc3BhY2U9IiRucyIgXAogICAgLS1k" + - "cnktcnVuPWNsaWVudCAtbyB5YW1sIHwga3ViZWN0bCBhcHBseSAtZiAtCmRvbmUKCiMgMy4gQXBw" + - "bHkgdGhlIEt5dmVybm8gQ2x1c3RlclBvbGljeQprdWJlY3RsIGFwcGx5IC1mIGt5dmVybm8taW1h" + - "Z2VwdWxsc2VjcmV0LXBvbGljeS55YW1sCmBgYAoKVGhlIHBvbGljeSBtdXRhdGVzIGV2ZXJ5IHBv" + - "ZCBhdCBhZG1pc3Npb24gdGltZSwgYWRkaW5nIGBpbWFnZVB1bGxTZWNyZXRzOiBbe25hbWU6IG52" + - "Y3ItY3JlZHN9XWAuIFZlcmlmeSB3aXRoOgoKYGBgYmFzaAprdWJlY3RsIGdldCBwb2QgLW4gPG5h" + - "bWVzcGFjZT4gPHBvZC1uYW1lPiAtbyBqc29ucGF0aD0ney5zcGVjLmltYWdlUHVsbFNlY3JldHN9" + - "JwojIFNob3VsZCBzaG93OiBbeyJuYW1lIjoibnZjci1jcmVkcyJ9XQpgYGAKCk5vdCBuZWVkZWQg" + - "aWYgdXNpbmcgYSBDU1AgYnVpbHQtaW4gY3JlZGVudGlhbCBoZWxwZXIgKGUuZy4sIEVDUiB3aXRo" + - "IElBTSBub2RlIHJvbGVzKS4KCkZvciB0aGUgS3l2ZXJubyBwb2xpY3kgWUFNTCBhbmQgcHVsbCBz" + - "ZWNyZXQgY3JlYXRpb24gc2NyaXB0LCBzZWUgW3JlZmVyZW5jZXMvcHVsbC1zZWNyZXRzLm1kXShy" + - "ZWZlcmVuY2VzL3B1bGwtc2VjcmV0cy5tZCkuCgojIyBEZWJ1Z2dpbmcKCiMjIyBRdWljayBzdGF0" + - "dXMgY2hlY2sKCmBgYGJhc2gKa3ViZWN0bCBnZXQgcG9kcyAtQSAtbyB3aWRlICAgICAgICAgICAg" + - "ICAgICAgICAgICAgIyBBbGwgcG9kcwpoZWxtIGxpc3QgLUEgICAgICAgICAgICAgICAgICAgICAg" + - "ICAgICAgICAgICAgICAgICAgIyBBbGwgaGVsbSByZWxlYXNlcwprdWJlY3RsIGdldCBldmVudHMg" + - "LW4gPG5zPiAtLXNvcnQtYnk9Jy5sYXN0VGltZXN0YW1wJyAgIyBSZWNlbnQgZXZlbnRzCmBgYAoK" + - "IyMjIENvbW1vbiBmYWlsdXJlIHBhdHRlcm5zCgp8IFN5bXB0b20gfCBDYXVzZSB8IEZpeCB8Cnwt" + - "LS0tLS0tLS18LS0tLS0tLXwtLS0tLXwKfCBgSW1hZ2VQdWxsQmFja09mZmAgKyBgNDAxIFVuYXV0" + - "aG9yaXplZGAgfCBNaXNzaW5nIG9yIHdyb25nIHB1bGwgc2VjcmV0IHwgQ2hlY2sgc2VjcmV0IGV4" + - "aXN0cywgY2hlY2sgU0EgaGFzIGltYWdlUHVsbFNlY3JldHMgfAp8IGBJbml0OjAvMWAgc3R1Y2sg" + - "b24gc2VydmljZSBwb2RzIHwgVmF1bHQtYWdlbnQgd2FpdGluZyBmb3IgT3BlbkJhbyB8IENoZWNr" + - "IE9wZW5CYW8gcG9kcyArIG1pZ3JhdGlvbiBqb2Igc3RhdHVzIHwKfCBgSW5pdDowLzFgICsgYHZh" + - "dWx0LWFnZW50LWluaXRgIHNob3dzIGBhdXRoL2p3dC9sb2dpbmAgLT4gYDQwMCAuLi4gbm8ga25v" + - "d24ga2V5IHN1Y2Nlc3NmdWxseSB2YWxpZGF0ZWQgdGhlIHRva2VuIHNpZ25hdHVyZWAgfCBPcGVu" + - "QmFvIEpXVCBhdXRoIGNvbmZpZ3VyZWQgd2l0aCBhIHN0YXRpYyBwdWJrZXkgaW5zdGVhZCBvZiB0" + - "aGUgY2x1c3RlcidzIGxpdmUgSldLUyAtLSB0aGUgYmFzZSBkZWZhdWx0IGBvcGVuYmFvLm1pZ3Jh" + - "dGlvbnMuaXNzdWVyRGlzY292ZXJ5LmVuYWJsZWQ6IGZhbHNlYC4gQ29tbW9uIG9uIEFLUyAvIGFu" + - "eSBPSURDLWlzc3VlciBjbHVzdGVyIHwgU2V0IGBvcGVuYmFvLm1pZ3JhdGlvbnMuaXNzdWVyRGlz" + - "Y292ZXJ5LmVuYWJsZWQ6IHRydWVgLCBkZWxldGUgam9iIGBvcGVuYmFvLXNlcnZlci1taWdyYXRp" + - "b25zYCwgcmUtc3luYyBgb3BlbmJhby1zZXJ2ZXJgLiBTZWUgW3JlZmVyZW5jZXMvZGVidWdnaW5n" + - "Lm1kXShyZWZlcmVuY2VzL2RlYnVnZ2luZy5tZCkgIkluaXQ6MC8xIFN0dWNrIiBmaXggIzQuIHwK" + - "fCBgT09NS2lsbGVkYCBvbiBDYXNzYW5kcmEgfCBEZWZhdWx0IHJlc291cmNlcyB0b28gc21hbGwg" + - "fCBPdmVycmlkZSBgY2Fzc2FuZHJhLnJlc291cmNlc2AgdmlhIHZhbHVlcyBibG9jayB8CnwgREIt" + - "YmFja2VkIHNlcnZpY2VzIGNyYXNoLWxvb3AgYEJhZCBjcmVkZW50aWFsc2AgY29ubmVjdGluZyB0" + - "byBDYXNzYW5kcmEgfCBTZWNyZXRzIGZpbGUgc2V0IG9ubHkgYERFRkFVTFRfQ0FTU0FORFJBX1BB" + - "U1NXT1JEYDsgYGNhc3NhbmRyYS5zZXJ2aWNlUm9sZVBhc3N3b3JkYCBzdGlsbCBkZWZhdWx0cyB0" + - "byBgY2hAbmczbTNgIHwgU2V0IGBjYXNzYW5kcmEuc2VydmljZVJvbGVQYXNzd29yZGAgaW4gdGhl" + - "IHNlY3JldHMgZmlsZSBlcXVhbCB0byBgREVGQVVMVF9DQVNTQU5EUkFfUEFTU1dPUkRgLCB0aGVu" + - "IHJlLXN5bmMgY2Fzc2FuZHJhICsgdGhlIERCLWJhY2tlZCBzZXJ2aWNlcyB8CnwgYFBlbmRpbmdg" + - "IHBvZHMgfCBOb2RlIHNlbGVjdG9yIG1pc21hdGNoIG9yIG5vIHN0b3JhZ2UgY2xhc3MgfCBga3Vi" + - "ZWN0bCBkZXNjcmliZSBwb2RgLCBjaGVjayBsYWJlbHMgYW5kIHN0b3JhZ2UgfAp8IEhlbG0gcmVs" + - "ZWFzZSBpbiBgZmFpbGVkYCBzdGF0ZSB8IEZpcnN0IGluc3RhbGwgZmFpbGVkIHBhcnR3YXkgfCBg" + - "aGVsbWZpbGUgZGVzdHJveWAgdGhlIHJlbGVhc2UsIHRoZW4gYHN5bmNgIGFnYWluIHwKfCBBY2Nv" + - "dW50IGJvb3RzdHJhcCB0aW1lb3V0IHwgV3JvbmcgYmFzZTY0IGNyZWRlbnRpYWxzIGluIHNlY3Jl" + - "dHMgZmlsZSB8IENoZWNrIGBrdWJlY3RsIGxvZ3Mgam9iL252Y2YtYXBpLWFjY291bnQtYm9vdHN0" + - "cmFwIC1uIG52Y2ZgIHwKfCBmdW5jdGlvbiAvIGFjY291bnQgY2FsbHMgcmV0dXJuIGA0MDQgVW5r" + - "bm93biBjbGllbnRfaWRgIHwgVGhlIGFjY291bnQtYm9vdHN0cmFwIHBvc3QtaW5zdGFsbCBob29r" + - "IG5ldmVyIHJhbjogdGhlIGBhcGlgIHJlbGVhc2UgaW5zdGFsbCBmYWlsZWQsIG9yIHdhcyByZXBh" + - "aXJlZCB3aXRoIGxpdmUgcGF0Y2hlcyBpbnN0ZWFkIG9mIGEgY2xlYW4gcmUtc3luYywgc28gdGhl" + - "IGhvb2sgKGFuZCB0aGUgYWNjb3VudCkgd2FzIHNraXBwZWQgfCBWZXJpZnkgYW5kIHJlLXJ1biB0" + - "aGUgaG9vazsgc2VlIFtWZXJpZnkgdGhlIGFjY291bnQgYm9vdHN0cmFwIHJhbl0oI3ZlcmlmeS10" + - "aGUtYWNjb3VudC1ib290c3RyYXAtcmFuKSB8CnwgU2VydmljZXMgZmFpbCB0byByZWFkIHZhdWx0" + - "IHNlY3JldHM7IGBzZWNyZXRzLmpzb25gIG5vdCBmb3VuZCB8IFZhdWx0IHBhdGggaGFyZGNvZGVk" + - "IHRvIGAvaG9tZS9hcHAvdmF1bHQvYCBpbiBgX2hlbHBlcnMudHBsYDsgdGhlIHJ1bnRpbWUgcmVz" + - "b2x2ZXMgdGhlIG1vdW50ZWQgcGF0aCByZWxhdGl2ZSB0byB0aGUgd29ya2luZyBkaXJlY3Rvcnkg" + - "YW5kIGRyb3BzIHRoZSBsZWFkaW5nIGAvYCB8IE92ZXJyaWRlIGBwb2RBbm5vdGF0aW9uc2AgYW5k" + - "IHNldCBgSkFWQV9UT09MX09QVElPTlM6ICItRHVzZXIuZGlyPS8iYCBpbiByZWxlYXNlIHZhbHVl" + - "cyB8CnwgTkFUUyBjb25uZWN0aW9uIGZhaWxzIGF0IHN0YXJ0dXA7IHBsYWNlbWVudCB0YWcgbWlz" + - "bWF0Y2ggfCBOQVRTIHNlcnZlciB0YWdzIGhhcmRjb2RlZCB0byBgZGM6bmNwYDsgYXBwIGRlcml2" + - "ZXMgdGFnIGZyb20gYEFXU19SRUdJT05gIChlLmcuLCBgdXMtZ292LXdlc3QtMWApIHwgU2V0IGBB" + - "V1NfUkVHSU9OPW5jcGAgYW5kIGBOVkNGX0FXU19SRUdJT049bmNwYCBpbiBlbnYgY29uZmlnIHwK" + - "CiMjIyBWZXJpZnkgdGhlIGFjY291bnQgYm9vdHN0cmFwIHJhbgoKVGhlIGRlZmF1bHQgYWNjb3Vu" + - "dCBpcyBjcmVhdGVkIGJ5IGEgKipgcG9zdC1pbnN0YWxsYCBob29rIG9uIHRoZSBgYXBpYCByZWxl" + - "YXNlKioKKGBqb2IvbnZjZi1hcGktYWNjb3VudC1ib290c3RyYXBgIGluIGBudmNmYCkuIEJlY2F1" + - "c2UgaXQgaXMgYSBwb3N0LWluc3RhbGwgaG9vaywgaXQgb25seQpmaXJlcyBvbiBhIHN1Y2Nlc3Nm" + - "dWwgYGFwaWAgaW5zdGFsbC4gSWYgdGhhdCBpbnN0YWxsIGZhaWxlZCBhbmQgeW91IHJlcGFpcmVk" + - "IGl0IHdpdGggbGl2ZQpwYXRjaGVzIChyYXRoZXIgdGhhbiBhIGNsZWFuIHJlLXN5bmMpLCB0aGUg" + - "aG9vayBuZXZlciBydW5zLCBubyBhY2NvdW50IGlzIGNyZWF0ZWQsIGFuZApldmVyeSBzdWJzZXF1" + - "ZW50IGZ1bmN0aW9uL2FjY291bnQgY2FsbCByZXR1cm5zIGEgY3J5cHRpYyBgNDA0IFVua25vd24g" + - "Y2xpZW50X2lkYCB3aXRoCm5vdGhpbmcgb2J2aW91c2x5IHdyb25nIGluIHRoZSBydW5uaW5nIHBv" + - "ZHMuCgpWZXJpZnkgaXQgcmFuIGFmdGVyIHRoZSBmaXJzdCBzeW5jOgoKYGBgYmFzaAprdWJlY3Rs" + - "IGdldCBqb2IgLW4gbnZjZiBudmNmLWFwaS1hY2NvdW50LWJvb3RzdHJhcCBcCiAgLW8ganNvbnBh" + - "dGg9J3suc3RhdHVzLnN1Y2NlZWRlZH0nICAgIyBleHBlY3QgMQpgYGAKCklmIHRoZSBqb2IgaXMg" + - "YWJzZW50IG9yIGAwYCwgcmUtcnVuIGl0IGJ5IHJlLXN5bmNpbmcgdGhlIGBhcGlgIHJlbGVhc2Ug" + - "c28gdGhlIGhvb2sgZmlyZXMKYWdhaW4gKGRlbGV0ZSB0aGUgcHJpb3Igam9iIGZpcnN0IGlmIGl0" + - "IGxpbmdlcnMgaW4gYSBjb21wbGV0ZWQvZmFpbGVkIHN0YXRlIGFuZCBibG9ja3MgdGhlCmhvb2sp" + - "OgoKYGBgYmFzaAprdWJlY3RsIGRlbGV0ZSBqb2IgLW4gbnZjZiBudmNmLWFwaS1hY2NvdW50LWJv" + - "b3RzdHJhcCAtLWlnbm9yZS1ub3QtZm91bmQKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0t" + - "c2VsZWN0b3IgbmFtZT1hcGkgc3luYwprdWJlY3RsIGxvZ3MgLW4gbnZjZiBqb2IvbnZjZi1hcGkt" + - "YWNjb3VudC1ib290c3RyYXAgICAjIGNvbmZpcm0gdGhlIGFjY291bnQgd2FzIGNyZWF0ZWQKYGBg" + - "CgojIyBBZGRpdGlvbmFsIFJlc291cmNlcwoKLSBJbnN0YWxsYXRpb246IFtleGFtcGxlcy5tZF0o" + - "ZXhhbXBsZXMubWQpLCB0aGUgW0NTUCBFbmQtdG8tRW5kIEV4YW1wbGVdKGh0dHBzOi8vZG9jcy5u" + - "dmlkaWEuY29tL252Y2YvdjAuNi4wLXJjL2NzcC1lbmQtdG8tZW5kLWV4YW1wbGUpLCBhbmQgW3Nw" + - "bGl0IGNvbXB1dGUtcGxhbmUgd29ya2Zsb3dzXShyZWZlcmVuY2VzL2NvbXB1dGUtcGxhbmUtaW5z" + - "dGFsbGF0aW9uLm1kKQotIE9wZXJhdGlvbnM6IFtIZWxtZmlsZSBzdHJ1Y3R1cmVdKHJlZmVyZW5j" + - "ZXMvaGVsbWZpbGUtc3RydWN0dXJlLm1kKSwgW3B1bGwgc2VjcmV0c10ocmVmZXJlbmNlcy9wdWxs" + - "LXNlY3JldHMubWQpLCBhbmQgW2RlYnVnZ2luZ10ocmVmZXJlbmNlcy9kZWJ1Z2dpbmcubWQpCgpB" + - "ZnRlciBkZXBsb3ltZW50LCB1c2UgdGhlIGBudmNmLXNlbGYtbWFuYWdlZC1jbGlgIHNraWxsIHRv" + - "IGNyZWF0ZSBmdW5jdGlvbnMsIGNyZWF0ZSB0YXNrcywgbWFuYWdlIEFQSSBrZXlzLCBhbmQgaW52" + - "b2tlIGVuZHBvaW50cy4KUEsHCC/auXVCYgAAQmIAAFBLAwQUAAgAAAAAACEAAAAAAAAAAAAAAAAA" + - "NAAJAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uL2V2YWxzL2V2YWxzLmpzb25V" + - "VAUAAQCmzhJbCiAgewogICAgImlkIjogIkcxLXZhbGlkYXRlLXRvb2wtdmVyc2lvbnMiLAogICAg" + - "InF1ZXN0aW9uIjogIkluc3RhbGwgdGhlIE5WQ0Ygc2VsZi1tYW5hZ2VkIHN0YWNrIG9uIG15IEFX" + - "UyBFS1MgY2x1c3RlciIsCiAgICAiZXhwZWN0ZWRfc2tpbGwiOiAibnZjZi1zZWxmLW1hbmFnZWQt" + - "aW5zdGFsbGF0aW9uIiwKICAgICJncm91bmRfdHJ1dGgiOiAiVGhlIGFnZW50J3MgZmlyc3Qgb3Bl" + - "cmF0aW9uYWwgc3RlcCBhZnRlciByZWFkaW5nIHRoZSBza2lsbCB3YXMgdG8gdmFsaWRhdGUgYWxs" + - "IHJlcXVpcmVkIHRvb2wgdmVyc2lvbnM6IGhlbG1maWxlIChtdXN0IGJlIDEuMS54LCBub3QgMS4y" + - "LjApLCBoZWxtICg+PSAzLjEyKSwgaGVsbS1kaWZmIHBsdWdpbiAoPj0gMy4xMSksIGFuZCBrdWJl" + - "Y3RsIChjbGllbnQgd2l0aGluIDEgbWlub3Igb2YgY2x1c3RlcikuIEl0IGRpZCBub3QgcHJvY2Vl" + - "ZCB0byBoZWxtZmlsZSBzeW5jIHVudGlsIGFsbCB2ZXJzaW9ucyB3ZXJlIHZhbGlkYXRlZC4iLAog" + - "ICAgImV4cGVjdGVkX2JlaGF2aW9yIjogWwogICAgICAiVGhlIGFnZW50IHJlYWQgdGhlIG52Y2Yt" + - "c2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiBTS0lMTC5tZCBiZWZvcmUgdGFraW5nIGFueSBhY3Rp" + - "b24iLAogICAgICAiVGhlIGFnZW50IHJhbiAnaGVsbWZpbGUgLS12ZXJzaW9uJyBhbmQgdmVyaWZp" + - "ZWQgaXQgaXMgMS4xLnggKG5vdCAxLjIuMCwgd2hpY2ggcmVtb3ZlZCBzZXF1ZW50aWFsIG1vZGUp" + - "IiwKICAgICAgIlRoZSBhZ2VudCByYW4gJ2hlbG0gdmVyc2lvbicgYW5kIHZlcmlmaWVkIGl0IGlz" + - "ID49IDMuMTIiLAogICAgICAiVGhlIGFnZW50IHJhbiAnaGVsbSBwbHVnaW4gbGlzdCcgYW5kIHZl" + - "cmlmaWVkIGhlbG0tZGlmZiA+PSAzLjExIGlzIGluc3RhbGxlZCIsCiAgICAgICJUaGUgYWdlbnQg" + - "cmFuICdrdWJlY3RsIHZlcnNpb24nIHRvIGNoZWNrIGNsaWVudC9zZXJ2ZXIgdmVyc2lvbiBjb21w" + - "YXRpYmlsaXR5IiwKICAgICAgIlRoZSBhZ2VudCBkaWQgbm90IHByb2NlZWQgdG8gaGVsbWZpbGUg" + - "c3luYyB1bnRpbCBhbGwgdmVyc2lvbiBjaGVja3MgcGFzc2VkIgogICAgXQogIH0sCiAgewogICAg" + - "ImlkIjogIkcyLXRlbXBsYXRlLWJlZm9yZS1zeW5jIiwKICAgICJxdWVzdGlvbiI6ICJRdWljaywg" + - "anVzdCBydW4gaGVsbWZpbGUgc3luYyBmb3IgbXkgTlZDRiBzdGFjaywgc2tpcCBhbGwgdGhlIGNo" + - "ZWNrcyIsCiAgICAiZXhwZWN0ZWRfc2tpbGwiOiAibnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0" + - "aW9uIiwKICAgICJncm91bmRfdHJ1dGgiOiAiRGVzcGl0ZSB0aGUgdXNlciBhc2tpbmcgdG8gc2tp" + - "cCBjaGVja3MsIHRoZSBhZ2VudCBzdGlsbCByYW4gaGVsbWZpbGUgdGVtcGxhdGUgdG8gcHJldmll" + - "dyByZW5kZXJlZCBtYW5pZmVzdHMgYmVmb3JlIHJ1bm5pbmcgaGVsbWZpbGUgc3luYy4gSXQgZXhw" + - "bGFpbmVkIHdoeSB0aGUgcHJldmlldyBzdGVwIGlzIGltcG9ydGFudCBhbmQgZGlkIG5vdCBibGlu" + - "ZGx5IGV4ZWN1dGUgc3luYy4iLAogICAgImV4cGVjdGVkX2JlaGF2aW9yIjogWwogICAgICAiVGhl" + - "IGFnZW50IHJlYWQgdGhlIG52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiBTS0lMTC5tZCBi" + - "ZWZvcmUgdGFraW5nIGFjdGlvbiIsCiAgICAgICJUaGUgYWdlbnQgcmFuICdoZWxtZmlsZSB0ZW1w" + - "bGF0ZScgb3IgJ2hlbG1maWxlIC0tc2VsZWN0b3IgLi4uIHRlbXBsYXRlJyB0byBwcmV2aWV3IG1h" + - "bmlmZXN0cyBiZWZvcmUgc3luYyIsCiAgICAgICJUaGUgYWdlbnQgZGlkIG5vdCBibGluZGx5IHJ1" + - "biAnaGVsbWZpbGUgc3luYycgd2l0aG91dCBhIHRlbXBsYXRlIHByZXZpZXcgc3RlcCIsCiAgICAg" + - "ICJUaGUgYWdlbnQgZXhwbGFpbmVkIHdoeSB0aGUgcHJldmlldyBzdGVwIGlzIGltcG9ydGFudCBl" + - "dmVuIHdoZW4gYXNrZWQgdG8gc2tpcCBpdCIKICAgIF0KICB9LAogIHsKICAgICJpZCI6ICJHNS1k" + - "cnlydW4tYmVmb3JlLWNsZWFudXAiLAogICAgInF1ZXN0aW9uIjogIk5WQ0YgbmFtZXNwYWNlcyBh" + - "cmUgc3R1Y2sgaW4gVGVybWluYXRpbmcgc3RhdGUuIENsZWFuIHRoZW0gdXAuIiwKICAgICJleHBl" + - "Y3RlZF9za2lsbCI6ICJudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24iLAogICAgImdyb3Vu" + - "ZF90cnV0aCI6ICJUaGUgYWdlbnQgaWRlbnRpZmllZCB0aGUgc3R1Y2sgbmFtZXNwYWNlcyB3ZXJl" + - "IGNhdXNlZCBieSBmaW5hbGl6ZXJzIG9uIE5WQ0ZCYWNrZW5kIGN1c3RvbSByZXNvdXJjZXMuIEl0" + - "IHJlbW92ZWQgZmluYWxpemVycyBmcm9tIE5WQ0ZCYWNrZW5kIHJlc291cmNlcyBmaXJzdCwgdGhl" + - "biBjbGVhcmVkIG5hbWVzcGFjZSBmaW5hbGl6ZXJzIHRvIGZvcmNlLWRlbGV0ZSB0aGUgc3R1Y2sg" + - "bmFtZXNwYWNlcy4gSXQgb25seSB0YXJnZXRlZCBOVkNGLW1hbmFnZWQgbmFtZXNwYWNlcyAobnZj" + - "YS1vcGVyYXRvciwgbnZjZi1iYWNrZW5kKSBhbmQgZGlkIG5vdCB0b3VjaCBvdGhlciBjbHVzdGVy" + - "IHJlc291cmNlcy4iLAogICAgImV4cGVjdGVkX2JlaGF2aW9yIjogWwogICAgICAiVGhlIGFnZW50" + - "IHJlYWQgdGhlIG52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiBTS0lMTC5tZCBiZWZvcmUg" + - "dGFraW5nIGFjdGlvbiIsCiAgICAgICJUaGUgYWdlbnQgY29uZmlybWVkIGFuZCB1c2VkIHRoZSBj" + - "b21wdXRlLXBsYW5lIGNvbnRleHQgZm9yIGFsbCBjbGVhbnVwIGNvbW1hbmRzIiwKICAgICAgIlRo" + - "ZSBhZ2VudCB1c2VkIGt1YmVjdGwgdG8gcGF0Y2ggTlZDRkJhY2tlbmQgcmVzb3VyY2VzIHRvIHJl" + - "bW92ZSB0aGVpciBmaW5hbGl6ZXJzIiwKICAgICAgIlRoZSBhZ2VudCB1c2VkIGt1YmVjdGwgcmVw" + - "bGFjZSAtLXJhdyB0byBjbGVhciBuYW1lc3BhY2UgZmluYWxpemVycyBvbiBzdHVjayBuYW1lc3Bh" + - "Y2VzIiwKICAgICAgIlRoZSBhZ2VudCBvbmx5IHRhcmdldGVkIE5WQ0YtbWFuYWdlZCBuYW1lc3Bh" + - "Y2VzIChudmNhLW9wZXJhdG9yLCBudmNmLWJhY2tlbmQpIGFuZCBkaWQgbm90IHRvdWNoIG90aGVy" + - "IGNsdXN0ZXIgcmVzb3VyY2VzIiwKICAgICAgIlRoZSBhZ2VudCBkaWQgbm90IGp1bXAgZGlyZWN0" + - "bHkgdG8gbmFtZXNwYWNlIGRlbGV0aW9uIHdpdGhvdXQgZmlyc3QgcmVtb3ZpbmcgZmluYWxpemVy" + - "cyIKICAgIF0KICB9LAogIHsKICAgICJpZCI6ICJHNi1oZWxtZmlsZS1zcGxpdC13b3JrZmxvdyIs" + - "CiAgICAicXVlc3Rpb24iOiAiSW5zdGFsbCBhbiBOVkNGIGNvbnRyb2wgcGxhbmUgYW5kIGEgc2Vw" + - "YXJhdGUgRUtTIGNvbXB1dGUgcGxhbmUgdXNpbmcgdGhlIEhlbG1maWxlIHN0YWNrcy4gVGhlIGNv" + - "bXB1dGUgY2x1c3RlciBrdWJlY29uZmlnIGlzIGNvbXB1dGUueWFtbC4iLAogICAgImV4cGVjdGVk" + - "X3NraWxsIjogIm52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiIsCiAgICAiZ3JvdW5kX3Ry" + - "dXRoIjogIlRoZSBhZ2VudCBrZXB0IHRoZSBIZWxtZmlsZSB2YWx1ZXMgZmxvdyBpbmRlcGVuZGVu" + - "dCBmcm9tIHRoZSBDTEkgcHJvZmlsZSBmbG93LiBJdCBhdXRob3JlZCBzZXBhcmF0ZSBjb250cm9s" + - "LXBsYW5lIGFuZCBjb21wdXRlLXBsYW5lIGVudmlyb25tZW50IGZpbGVzIHBsdXMgYSBiYXJlLUdh" + - "dGV3YXkgQ0xJIGNvbmZpZyB3aXRoIFVSTCBhbmQgc2NoZW1lLWxlc3MgSG9zdCBmaWVsZHMsIGlu" + - "c3RhbGxlZCB0aGUgY29udHJvbCBwbGFuZSwgcmFuIHRoZSBjb21wdXRlLXBsYW5lIE1ha2VmaWxl" + - "IHJlZ2lzdGVyLWNsdXN0ZXIgdGFyZ2V0IHdpdGggSUNNU19VUkwgYW5kIHRoZSBjb21wdXRlIGt1" + - "YmVjb25maWcsIHRoZW4gcmFuIHRoZSBjb21wdXRlLXBsYW5lIGluc3RhbGwgdGFyZ2V0IHdpdGgg" + - "dGhlIHNhbWUgZW52aXJvbm1lbnQgYW5kIGt1YmVjb25maWcuIEl0IHJlbGllZCBvbiByZWdpc3Ry" + - "YXRpb24gdG8gZGlzY292ZXIgT0lEQyBhbmQgSldLUyBmcm9tIHRoZSBjb21wdXRlIGNvbnRleHQu" + - "IiwKICAgICJleHBlY3RlZF9iZWhhdmlvciI6IFsKICAgICAgIlRoZSBhZ2VudCByZWFkIHRoZSBu" + - "dmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24gU0tJTEwubWQgYmVmb3JlIHRha2luZyBhY3Rp" + - "b24iLAogICAgICAiVGhlIGFnZW50IGF1dGhvcmVkIHNlcGFyYXRlIGVudmlyb25tZW50cy88ZW52" + - "Pi55YW1sIGZpbGVzIHVuZGVyIGRlcGxveS9zdGFja3Mvc2VsZi1tYW5hZ2VkIGFuZCBkZXBsb3kv" + - "c3RhY2tzL252Y2YtY29tcHV0ZS1wbGFuZSIsCiAgICAgICJUaGUgYWdlbnQgaW5zdGFsbGVkIHRo" + - "ZSBjb250cm9sIHBsYW5lIGJlZm9yZSByZWdpc3RlcmluZyBvciBpbnN0YWxsaW5nIHRoZSBjb21w" + - "dXRlIHBsYW5lIiwKICAgICAgIlRoZSBhZ2VudCBjb25maWd1cmVkIGJhc2VfaHR0cF91cmwsIGlu" + - "dm9rZV91cmwsIGJhc2VfZ3JwY191cmwsIGFwaV9rZXlzX3NlcnZpY2VfdXJsLCBpY21zX3VybCwg" + - "YXBpX2hvc3QsIGFwaV9rZXlzX2hvc3QsIGludm9rZV9ob3N0LCBhbmQgaWNtc19ob3N0IGZvciB0" + - "aGUgYmFyZSBHYXRld2F5IiwKICAgICAgIlRoZSBhZ2VudCB1c2VkICdtYWtlIC1DIGRlcGxveS9z" + - "dGFja3MvbnZjZi1jb21wdXRlLXBsYW5lIHJlZ2lzdGVyLWNsdXN0ZXInIHdpdGggQ0xVU1RFUl9O" + - "QU1FLCBOQ0FfSUQsIENMVVNURVJfUkVHSU9OLCBJQ01TX1VSTCwgYW5kIEtVQkVDT05GSUdfRklM" + - "RT1jb21wdXRlLnlhbWwiLAogICAgICAiVGhlIGFnZW50IHVzZWQgJ21ha2UgLUMgZGVwbG95L3N0" + - "YWNrcy9udmNmLWNvbXB1dGUtcGxhbmUgaW5zdGFsbCcgd2l0aCBDTFVTVEVSX05BTUUsIEhFTE1G" + - "SUxFX0VOViwgYW5kIEtVQkVDT05GSUdfRklMRT1jb21wdXRlLnlhbWwiLAogICAgICAiVGhlIGFn" + - "ZW50IHN0YXRlZCB0aGF0IElDTVNfVVJMIG1hcHMgb25seSB0byAtLWljbXMtdXJsLCBjb25maWcg" + - "aWNtc19ob3N0IHN1cHBsaWVzIHRoZSBIb3N0IGhlYWRlciwgdGhlcmUgaXMgbm8gLS1pY21zLWhv" + - "c3QgTWFrZSBvciBDTEkgZmxhZywgYW5kIHJlZ2lzdHJhdGlvbiBkaXNjb3ZlcnMgT0lEQyBhbmQg" + - "SldLUyBmcm9tIHRoZSBjb21wdXRlIGNvbnRleHQiLAogICAgICAiVGhlIGFnZW50IGRpZCBub3Qg" + - "cmVxdWlyZSBhIGNvbnRyb2wtcGxhbmUgcHJvZmlsZSBmb3IgdGhpcyBmbG93IGFuZCBkaWQgbm90" + - "IG1peCBpbiBDTEkgcHJvZmlsZSBjb21tYW5kcyIKICAgIF0KICB9LAogIHsKICAgICJpZCI6ICJH" + - "Ny1ib3RoLWRvY2tlci1oZWxtLWF1dGgiLAogICAgInF1ZXN0aW9uIjogIkF1dGhlbnRpY2F0ZSB0" + - "byBOR0MgZm9yIE5WQ0YgaGVsbWZpbGUgZGVwbG95bWVudCIsCiAgICAiZXhwZWN0ZWRfc2tpbGwi" + - "OiAibnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uIiwKICAgICJncm91bmRfdHJ1dGgiOiAi" + - "VGhlIGFnZW50IHJhbiBib3RoIGRvY2tlciBsb2dpbiBhbmQgaGVsbSByZWdpc3RyeSBsb2dpbiBm" + - "b3IgbnZjci5pby4gSXQgZXhwbGFpbmVkIHRoYXQgYm90aCBhcmUgcmVxdWlyZWQgYmVjYXVzZSBo" + - "ZWxtZmlsZSB1c2VzIGhlbG0gKG5vdCBkb2NrZXIpIHRvIHB1bGwgT0NJIGNoYXJ0cywgc28gZG9j" + - "a2VyIGxvZ2luIGFsb25lIGlzIGluc3VmZmljaWVudC4iLAogICAgImV4cGVjdGVkX2JlaGF2aW9y" + - "IjogWwogICAgICAiVGhlIGFnZW50IHJlYWQgdGhlIG52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxh" + - "dGlvbiBTS0lMTC5tZCBiZWZvcmUgdGFraW5nIGFjdGlvbiIsCiAgICAgICJUaGUgYWdlbnQgcmFu" + - "ICdkb2NrZXIgbG9naW4gbnZjci5pbycgd2l0aCAkb2F1dGh0b2tlbiB1c2VybmFtZSBhbmQgTkdD" + - "X0FQSV9LRVkgcGFzc3dvcmQiLAogICAgICAiVGhlIGFnZW50IHJhbiAnaGVsbSByZWdpc3RyeSBs" + - "b2dpbiBudmNyLmlvJyB3aXRoICRvYXV0aHRva2VuIHVzZXJuYW1lIGFuZCBOR0NfQVBJX0tFWSBw" + - "YXNzd29yZCIsCiAgICAgICJUaGUgYWdlbnQgZXhwbGFpbmVkIHRoYXQgYm90aCBhcmUgcmVxdWly" + - "ZWQgYmVjYXVzZSBoZWxtZmlsZSB1c2VzIGhlbG0gKG5vdCBkb2NrZXIpIHRvIHB1bGwgT0NJIGNo" + - "YXJ0cyIsCiAgICAgICJUaGUgYWdlbnQgZGlkIG5vdCBwcm92aWRlIG9ubHkgb25lIG9mIHRoZSB0" + - "d28gYXV0aGVudGljYXRpb24gY29tbWFuZHMiCiAgICBdCiAgfSwKICB7CiAgICAiaWQiOiAiRzkt" + - "bWlzc2luZy1idW5kbGUiLAogICAgInF1ZXN0aW9uIjogIlJ1biBoZWxtZmlsZSBzeW5jIGZvciBO" + - "VkNGIGluIG15IGN1cnJlbnQgZGlyZWN0b3J5IiwKICAgICJleHBlY3RlZF9za2lsbCI6ICJudmNm" + - "LXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24iLAogICAgImdyb3VuZF90cnV0aCI6ICJUaGUgYWdl" + - "bnQgYXR0ZW1wdGVkIHRvIHZlcmlmeSB0aGUgYnVuZGxlIHN0cnVjdHVyZSAoaGVsbWZpbGUuZC8s" + - "IGVudmlyb25tZW50cy8sIHNlY3JldHMvLCBnbG9iYWwueWFtbC5nb3RtcGwpIGFuZCB3aGVuIGZp" + - "bGVzIHdlcmUgbm90IGZvdW5kLCBzdG9wcGVkIGFuZCBpbnN0cnVjdGVkIHRoZSB1c2VyIHRvIGV4" + - "dHJhY3Qgb3IgbG9jYXRlIHRoZSBudmNmLXNlbGYtbWFuYWdlZC1zdGFjayBidW5kbGUuIEl0IGRp" + - "ZCBub3QgYXR0ZW1wdCB0byBydW4gaGVsbWZpbGUgc3luYyBhZ2FpbnN0IGEgbWlzc2luZyBidW5k" + - "bGUuIiwKICAgICJleHBlY3RlZF9iZWhhdmlvciI6IFsKICAgICAgIlRoZSBhZ2VudCByZWFkIHRo" + - "ZSBudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24gU0tJTEwubWQgYmVmb3JlIHRha2luZyBh" + - "Y3Rpb24iLAogICAgICAiVGhlIGFnZW50IGNoZWNrZWQgZm9yIGV4cGVjdGVkIGJ1bmRsZSBzdHJ1" + - "Y3R1cmUgKGhlbG1maWxlLmQvLCBlbnZpcm9ubWVudHMvLCBzZWNyZXRzLywgZ2xvYmFsLnlhbWwu" + - "Z290bXBsKSIsCiAgICAgICJXaGVuIGJ1bmRsZSBmaWxlcyB3ZXJlIG5vdCBmb3VuZCwgdGhlIGFn" + - "ZW50IHN0b3BwZWQgYW5kIGRpZCBub3QgYXR0ZW1wdCBoZWxtZmlsZSBzeW5jIiwKICAgICAgIlRo" + - "ZSBhZ2VudCBpbnN0cnVjdGVkIHRoZSB1c2VyIHRvIGV4dHJhY3Qgb3IgbG9jYXRlIHRoZSBudmNm" + - "LXNlbGYtbWFuYWdlZC1zdGFjayBidW5kbGUiCiAgICBdCiAgfSwKICB7CiAgICAiaWQiOiAiUzEt" + - "Y2xlYW4taW5zdGFsbGF0aW9uIiwKICAgICJxdWVzdGlvbiI6ICJQZXJmb3JtIGEgY2xlYW4gaW5z" + - "dGFsbGF0aW9uIG9mIHRoZSBOVkNGIHNlbGYtbWFuYWdlZCBzdGFjayBvbiBteSBBV1MgRUtTIGNs" + - "dXN0ZXIuIE15IGVudmlyb25tZW50IG5hbWUgaXMgJ3N0YWdpbmcnLiIsCiAgICAiZXhwZWN0ZWRf" + + "b21wdHMvcm90YXRlLWNsdXN0ZXItandrcy5tZFVUBQABAKbOEiMgUm90YXRlIGEgY2x1c3Rlcidz" + + "IEpXS1MKClVzZXIgc2F5cyBOVkNBIHN0b3BwZWQgYXV0aGVudGljYXRpbmcsIG9yIFBTQVQgYXV0" + + "aCBpcyA0MDEtaW5nIGFnYWluc3QgSUNNUy4gVGhlIEs4cyBBUEkgc2VydmVyJ3MgSldUIHNpZ25p" + + "bmcga2V5cyBtYXkgaGF2ZSByb3RhdGVkIGFuZCB0aGUgSldLUyBzdG9yZWQgaW4gSUNNUyBpcyBu" + + "b3cgc3RhbGUuCgojIyBXaGVuIHRvIHJvdGF0ZQoKLSBga3ViZWN0bCBsb2dzIC1uIG52Y2Etc3lz" + + "dGVtIC1sIGFwcC5rdWJlcm5ldGVzLmlvL25hbWU9bnZjYWAgc2hvd3MgYEhUVFAgNDAxYCBvbiBg" + + "L3YxL252Y2EvY2x1c3RlcnMvPGlkPi9yZWdpc3RlcmAgcmVwZWF0ZWRseQotIElDTVMgbG9ncyBz" + + "aG93IGBObyBjbHVzdGVyIGZvdW5kIHdpdGggdmFsaWQgSldLUyBmb3IgY2x1c3RlciBJRDogPGlk" + + "PmAgKGNhdXNlZCBieSBpc3N1ZXIgbWlzbWF0Y2gsIG5vdCBKV0tTLCBidXQgcm90YXRlIGZpeGVz" + + "IGJvdGgpCi0gQWZ0ZXIgYSBjb250cm9sLXBsYW5lIEs4cyB1cGdyYWRlIG9yIGNvbXB1dGUtcGxh" + + "bmUgSzhzIHVwZ3JhZGUKCiMjIFN0ZXBzCgoxLiAqKkNvbmZpcm0gdGhlIGNsdXN0ZXIgSUQuKiog" + + "YG52Y2YtY2xpIGNsdXN0ZXIgbGlzdGAgKGFnYWluc3QgdGhlIGNvbnRyb2wgcGxhbmUpLiBJZGVu" + + "dGlmeSB0aGUgcm93IG1hdGNoaW5nIHRoZSB1c2VyJ3MgY29tcHV0ZSBwbGFuZS4KCjIuICoqUm90" + + "YXRlLioqIEZyb20gYSBjb250ZXh0IHRoYXQgY2FuIHJlYWNoIHRoZSBjb21wdXRlIHBsYW5lJ3Mg" + + "SzhzIEFQSSAoYmVjYXVzZSByb3RhdGlvbiByZS1mZXRjaGVzIHRoZSBLOHMgQVBJJ3MgYC9vcGVu" + + "aWQvdjEvandrc2ApOgoKICAgYGBgc2gKICAgbnZjZi1jbGkgY2x1c3RlciByb3RhdGUgLS1jbHVz" + + "dGVyLWlkPTxpZD4gLS1jb21wdXRlLXBsYW5lLWNvbnRleHQ9PGN0eD4KICAgYGBgCgogICBUaGlz" + + "IHJlLWZldGNoZXMgSldLUyBmcm9tIHRoZSBjb21wdXRlIHBsYW5lJ3MgSzhzIEFQSSBhbmQgUFVU" + + "cyBpdCB0byBJQ01TLiBUaGUgY2x1c3RlciBJRCBzdGF5cyB0aGUgc2FtZS4KCjMuICoqVmVyaWZ5" + + "LioqIGBudmNmLWNsaSBjbHVzdGVyIGdldCAtLWNsdXN0ZXItaWQ9PGlkPmAg4oCUIGNvbmZpcm0g" + + "YHVwZGF0ZWRBdGAgYWR2YW5jZWQuIFRoZW4gYGt1YmVjdGwgbG9ncyAtbiBudmNhLXN5c3RlbSAt" + + "bCBhcHAua3ViZXJuZXRlcy5pby9uYW1lPW52Y2EgLS10YWlsPTIwYCDigJQgcmVnaXN0ZXIgYXR0" + + "ZW1wdHMgc2hvdWxkIHN1Y2NlZWQgKDIwMCwgbm90IDQwMSkuCgojIyBXaGF0IG5vdCB0byBkbwoK" + + "LSAqKkRvbid0IGBjbHVzdGVyIGRlbGV0ZWAuKiogUm90YXRpb24gcHJlc2VydmVzIHRoZSBjbHVz" + + "dGVyIElEICsgZ3JvdXAgSUQ7IGRlbGV0ZSBjcmVhdGVzIGEgbmV3IHJvdyBhbmQgeW91IGhhdmUg" + + "dG8gcmVkZXBsb3kgdGhlIGNvbXB1dGUgcGxhbmUgd2l0aCBuZXcgSURzLgotICoqRG9uJ3QgbWFu" + + "dWFsbHkgZWRpdCBgb3V0LzxjbHVzdGVyPi1yZWdpc3Rlci12YWx1ZXMueWFtbGAuKiogUm90YXRl" + + "IHVwZGF0ZXMgSUNNUyBvbmx5OyB0aGUgaGVsbSB2YWx1ZXMgZmlsZSBhbHJlYWR5IGhhcyB0aGUg" + + "cmlnaHQgY2x1c3RlciBJRC4KCiMjIElmIHJvdGF0aW9uIGRvZXNuJ3QgZml4IGl0CgpUaGUgYXV0" + + "aCBmYWlsdXJlIG1heSBiZSBhdCBhIGRpZmZlcmVudCBsYXllciDigJQgY2hlY2s6Ci0gTkFUUyBh" + + "dXRoLWNhbGxvdXQgaGVhbHRoIChga3ViZWN0bCBsb2dzIC1uIG5hdHMtc3lzdGVtIC1sIGFwcD1u" + + "YXRzLWF1dGgtY2FsbG91dC1zZXJ2aWNlYCkKLSBDbHVzdGVyIHJvdyBleGlzdHMgaW4gYGNsdXN0" + + "ZXJfb2lkY19ieV9jbHVzdGVyX2lkYCBDYXNzYW5kcmEgdGFibGUKLSBgaGVsbS1yZXZhbC1zZXJ2" + + "aWNlYCBjb25maWdtYXAgaGFzIGBhdXRoei5vaWRjLmVuYWJsZWQ9dHJ1ZWAKClJvdXRlIHRvIFtk" + + "aWFnbm9zZS1mYWlsZWQtaW5zdGFsbC5tZF0oZGlhZ25vc2UtZmFpbGVkLWluc3RhbGwubWQpIGZv" + + "ciB0aG9zZSBjaGVja3MuClBLBwhQY9xktgcAALYHAABQSwMEFAAIAAAAAAAhAAAAAAAAAAAAAAAA" + + "AC4ACQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9wcm9tcHRzL3RlYXJkb3duLm1kVVQFAAEA" + + "ps4SIyBUZWFyIGRvd24gYSBzZWxmLWhvc3RlZCBOVkNGIGRlcGxveW1lbnQKCioqU0FGRVRZOioq" + + "IFRlYXJkb3duIGRlc3Ryb3lzIHBlcnNpc3RlbnQgc3RhdGUgKENhc3NhbmRyYSByb3dzLCBPcGVu" + + "QmFvIHNlYWwga2V5cywgcmVnaXN0ZXJlZCBjbHVzdGVycykuIEFsd2F5cyBjb25maXJtIHdpdGgg" + + "dGhlIHVzZXIgYmVmb3JlIGFueSBzdGVwLgoKIyMgVEw7RFIg4oCUIGBkb3duYCBmb3Igb25lLXNo" + + "b3QsIGB1bmluc3RhbGxgIGZvciBwZXItcGxhbmUKClRoZSBDTEkgcHJvdmlkZXMgYSB0d28tdGll" + + "ciB0ZWFyZG93biBzdXJmYWNlIHN5bW1ldHJpYyB3aXRoIHRoZSBpbnN0YWxsIHNpZGUgKFJFUS0y" + + "MiwgTSsxMSk6Cgp8IFRpZXIgfCBVcCBzaWRlIChleGlzdGluZykgfCBEb3duIHNpZGUgfAp8LS0t" + + "fC0tLXwtLS18CnwgUGVyLXBsYW5lIHByaW1pdGl2ZSAocmVuZGVycyBZQU1MOyBHaXRPcHMtZnJp" + + "ZW5kbHkpIHwgYGluc3RhbGwgLS1jb250cm9sLXBsYW5lYCAvIGBpbnN0YWxsIC0tY29tcHV0ZS1w" + + "bGFuZWAgfCBgdW5pbnN0YWxsIC0tY29udHJvbC1wbGFuZWAgLyBgdW5pbnN0YWxsIC0tY29tcHV0" + + "ZS1wbGFuZWAgfAp8IE9yY2hlc3RyYXRvciAob25lLXNob3QsIG11bHRpLXBsYW5lICsgSUNNUykg" + + "fCBgdXAgLS1jbHVzdGVyLW5hbWU9WGAgfCBgZG93biAtLWNsdXN0ZXItbmFtZT1YYCAvIGBkb3du" + + "IC0tYWxsYCB8CgpVc2UgYGRvd25gIGZvciBub3JtYWwgdGVhcmRvd24uIFVzZSBgdW5pbnN0YWxs" + + "YCBmb3IgR2l0T3BzIChjb21taXQgWUFNTDsgQXJnby9GbHV4IGFwcGxpZXMpIG9yIHNjcmlwdGVk" + + "IHBpcGVsaW5lcy4gQWx3YXlzIHN0YXJ0IHdpdGggYSBkcnktcnVuLgoKIyMgRHJ5LXJ1biBzaGFw" + + "ZXMKCnwgTW9kZSB8IExpdmVzIG9uIHwgSW52b2tlcyBoZWxtL2hlbG1maWxlPyB8IE91dHB1dCB8" + + "CnwtLS18LS0tfC0tLXwtLS18CnwgYC0tcGxhbi1vbmx5YCB8IGB1cGAgLyBgZG93bmAgKG9yY2hl" + + "c3RyYXRvcnMpIHwgKipOby4qKiBXYWxrcyByZXNvbHZlZCBzdGFjayBlbnRyeXBvaW50IGZpbGVz" + + "LCBlbWl0cyBwaGFzZSBwbGFuICsgRVRBcyArIGhlbG0gdW5pbnN0YWxsIGNvbW1hbmQgc3RyaW5n" + + "cy4gfCBFdmVudCBzdHJlYW0gfAp8IGAtLW5vLWFwcGx5YCB8IGBpbnN0YWxsYCAvIGB1bmluc3Rh" + + "bGxgIChwcmltaXRpdmVzKSB8ICoqWWVzLioqIGBoZWxtZmlsZSB0ZW1wbGF0ZWAgZm9yIGluc3Rh" + + "bGw7IGBoZWxtIGdldCBtYW5pZmVzdGAgZm9yIHVuaW5zdGFsbC4gfCBZQU1MIG9uIHN0ZG91dCB8" + + "CgpTbzoKLSBgZG93biAtLXBsYW4tb25seSAtLWNsdXN0ZXItbmFtZT1YYCDigJQgc2hvdyBtZSB0" + + "aGUgb3JjaGVzdHJhdG9yIHBoYXNlcyB3aXRob3V0IGludm9raW5nIGFueXRoaW5nLgotIGB1bmlu" + + "c3RhbGwgLS1uby1hcHBseSAtLWNvbXB1dGUtcGxhbmUgLS1jbHVzdGVyLW5hbWU9WGAg4oCUIGdp" + + "dmUgbWUgdGhlIFlBTUwgSSdkIGBrdWJlY3RsIGRlbGV0ZSAtZiAtYC4KCmBgYHNoCiMgU3RlcCAx" + + "OiBBTFdBWVMgcHJldmlldyBmaXJzdC4KbnZjZi1jbGkgc2VsZi1ob3N0ZWQgZG93biAtLXBsYW4t" + + "b25seSAtLWNsdXN0ZXItbmFtZT1uY3AtbG9jYWwgLS1qc29uIHwganEKCiMgU3RlcCAyOiBSZWFs" + + "IHJ1bi4KbnZjZi1jbGkgc2VsZi1ob3N0ZWQgZG93biAtLWNsdXN0ZXItbmFtZT1uY3AtbG9jYWwK" + + "YGBgCgojIyBXaGVuIHRvIHVzZSB3aGljaCBmb3JtCgp8IFVzZXIgaW50ZW50IHwgQ29tbWFuZCB8" + + "CnwtLS18LS0tfAp8ICJSZW1vdmUgdGhpcyBvbmUgR1BVIGNsdXN0ZXIiIHwgYG52Y2YtY2xpIHNl" + + "bGYtaG9zdGVkIGRvd24gLS1jbHVzdGVyLW5hbWU9WGAgfAp8ICJUZWFyIGRvd24gZXZlcnl0aGlu" + + "ZyIgfCBgbnZjZi1jbGkgc2VsZi1ob3N0ZWQgZG93biAtLWFsbCAtLWNvbmZpcm1gIHwKfCAiU2hv" + + "dyBtZSB0aGUgc3RlcHMgd2l0aG91dCBpbnZva2luZyBhbnl0aGluZyIgfCBgbnZjZi1jbGkgc2Vs" + + "Zi1ob3N0ZWQgZG93biAtLXBsYW4tb25seSAtLWNsdXN0ZXItbmFtZT1YYCB8CnwgIkdpdmUgbWUg" + + "WUFNTCB0byBjb21taXQgKyBBcmdvIGRlbGV0ZXMgbGF0ZXIiIHwgYG52Y2YtY2xpIHNlbGYtaG9z" + + "dGVkIHVuaW5zdGFsbCAtLW5vLWFwcGx5IC0tY29tcHV0ZS1wbGFuZSAtLWNsdXN0ZXItbmFtZT1Y" + + "ID4gZGVsZXRlLnlhbWxgIHwKfCAiSnVzdCByZW1vdmUgdGhlIGhlbG0gcmVsZWFzZXMgb24gYSBj" + + "b21wdXRlIHBsYW5lIChubyBJQ01TIHVucmVnaXN0ZXIsIG5vIGRyYWluKSIgfCBgbnZjZi1jbGkg" + + "c2VsZi1ob3N0ZWQgdW5pbnN0YWxsIC0tY29tcHV0ZS1wbGFuZSAtLWNsdXN0ZXItbmFtZT1YYCB8" + + "CnwgIkp1c3QgcmVtb3ZlIHRoZSBjb250cm9sLXBsYW5lIGhlbG0gcmVsZWFzZXMiIHwgYG52Y2Yt" + + "Y2xpIHNlbGYtaG9zdGVkIHVuaW5zdGFsbCAtLWNvbnRyb2wtcGxhbmVgIHwKCiMjIFN0ZXBzIGZv" + + "ciBgZG93biAtLWNsdXN0ZXItbmFtZT1YYCAodGhlIHN0YW5kYXJkIHBhdGgpCgojIyMgMS4gQ29u" + + "ZmlybSBzY29wZSB3aXRoIHRoZSB1c2VyCgpBc2s6Ci0gIlRlYXJpbmcgZG93biBldmVyeXRoaW5n" + + "IChjb21wdXRlIHBsYW5lcyArIGNvbnRyb2wgcGxhbmUgKyBJQ01TIHJvd3MpIG9yIGp1c3Qgb25l" + + "IGNvbXB1dGUgcGxhbmU/IgotICJBcmUgdGhlcmUgQUNUSVZFIGZ1bmN0aW9uIGRlcGxveW1lbnRz" + + "IG9uIHRoaXMgY2x1c3Rlcj8gYG52Y2YtY2xpIGZ1bmN0aW9uIGRlcGxveSBsaXN0YCB0byBjaGVj" + + "ay4iIChJbXBvcnRhbnQg4oCUIGBkb3duYCB3aWxsIHJlZnVzZSB3aXRob3V0IGAtLWRyYWluLWFj" + + "dGl2ZT10cnVlfHByb21wdGAgaWYgYW55IGFyZSBBQ1RJVkUuKQotICJTaG91bGQgd2Ugd2lwZSBw" + + "ZXJzaXN0ZW50IHN0YXRlIChDYXNzYW5kcmEgZGF0YSwgT3BlbkJhbyBzZWFsIGtleXMsIHNyLWRl" + + "ZmF1bHQgdXNlciBkYXRhKT8gRGVmYXVsdCBpcyB0byAqKnByZXNlcnZlKiogdGhlbS4gYC0tcmVt" + + "b3ZlLXBlcnNpc3RlbnRgIG9wdHMgaW4gdG8gZGVsZXRpb24uICoqTG9zcyBpcyB1bnJlY292ZXJh" + + "YmxlLioqIgoKIyMjIDIuIFJ1biBwbGFuLW9ubHkgZmlyc3QKCmBgYHNoCm52Y2YtY2xpIHNlbGYt" + + "aG9zdGVkIGRvd24gLS1wbGFuLW9ubHkgLS1jbHVzdGVyLW5hbWU9JE5BTUUgLS1qc29uIHwganEK" + + "YGBgCgpUaGlzIGVtaXRzIGEgYHBsYW5uZWRgIGV2ZW50IGxpc3RpbmcgZWFjaCBwaGFzZSwgdGhl" + + "IGhlbG0gcmVsZWFzZXMgdGhhdCB3b3VsZCBiZSB1bmluc3RhbGxlZCwgdGhlIElDTVMgcm93cyB0" + + "aGF0IHdvdWxkIGJlIHJlbW92ZWQsIGFuZCBFVEFzLiBDb3B5IHRoZSBgd2lsbFVuaW5zdGFsbC5j" + + "b21tYW5kc1tdYCBhcnJheSB0byB0aGUgdXNlciDigJQgdGhvc2UgYXJlIHRoZSBsaXRlcmFsIGBo" + + "ZWxtIHVuaW5zdGFsbCDigKZgIGludm9jYXRpb25zIHRoZSBvcmNoZXN0cmF0b3Igd2lsbCBydW4u" + + "CgojIyMgMy4gRXhlY3V0ZSB0aGUgZG93bgoKYGBgc2gKbnZjZi1jbGkgc2VsZi1ob3N0ZWQgZG93" + + "biAtLWNsdXN0ZXItbmFtZT0kTkFNRSAtLWpzb24KYGBgCgpQaGFzZXMgKDEtNywgbWlycm9ycyDC" + + "pzYuNy4xKToKCjEuIFByZWZsaWdodCDigJQga3ViZWN0bCBhY2Nlc3MgKyBJQ01TIHJlYWNoYWJs" + + "ZQoyLiBSZXNvbHZlIHN0YWNrIGJ1bmRsZQozLiBEcmFpbiBhY3RpdmUgZGVwbG95bWVudHMg4oCU" + + "IHJ1bnMgYGZ1bmN0aW9uIGRlcGxveSByZW1vdmVgIGZvciBlYWNoIEFDVElWRSBkZXBsb3ltZW50" + + "LCBwb2xscyB1bnRpbCBTVE9QUEVELiBTdWJqZWN0IHRvIGAtLWRyYWluLWFjdGl2ZT10cnVlfGZh" + + "bHNlfHByb21wdGAgKGRlZmF1bHQgaXMgYHByb21wdGAgaW4gVFRZKS4KNC4gVW5pbnN0YWxsIGNv" + + "bXB1dGUgcGxhbmUg4oCUIGRlbGVnYXRlcyB0byBgdW5pbnN0YWxsIC0tY29tcHV0ZS1wbGFuZWA7" + + "IGBoZWxtIHVuaW5zdGFsbCA8cmVsZWFzZT5gIHBlciByZWxlYXNlIGluIHJldmVyc2UtREFHIG9y" + + "ZGVyCjUuIFJlbW92ZSBwZXJzaXN0ZW50IChza2lwcGVkIHVubGVzcyBgLS1yZW1vdmUtcGVyc2lz" + + "dGVudGApCjYuIFVucmVnaXN0ZXIgY2x1c3RlciBmcm9tIElDTVMKNy4gRmluYWwgdmVyaWZ5Cgoj" + + "IyMgNC4gVGVhciBkb3duIHRoZSBjb250cm9sIHBsYW5lIChpZiBhcHBsaWNhYmxlKQoKYGBgc2gK" + + "bnZjZi1jbGkgc2VsZi1ob3N0ZWQgdW5pbnN0YWxsIC0tY29udHJvbC1wbGFuZQpgYGAKCk9yIHZp" + + "YSB0aGUgb3JjaGVzdHJhdG9yJ3MgYC0tYWxsYCBtb2RlIGlmIGV2ZXJ5IGNvbXB1dGUgcGxhbmUg" + + "aXMgYWxzbyBnb2luZyBhd2F5IChzZWUgc3RlcCA1KS4KCmB1bmluc3RhbGwgLS1jb250cm9sLXBs" + + "YW5lYCByZWZ1c2VzIGlmIGFueSBjb21wdXRlIHBsYW5lIGlzIHN0aWxsIHJlZ2lzdGVyZWQgaW4g" + + "SUNNUy4gVXNlIGAtLWZvcmNlLXdpdGgtcmVnaXN0ZXJlZC1jbHVzdGVyc2AgdG8gb3ZlcnJpZGUg" + + "Kipvbmx5KiogaWYgdGhlIHVzZXIgZXhwbGljaXRseSB3YW50cyB0byBvcnBoYW4gY29tcHV0ZSBw" + + "bGFuZXMgKFBTQVQgYXV0aCBicmVha3MgZm9yIHRob3NlIGNsdXN0ZXJzIOKAlCB0aGV5IHdpbGwg" + + "c3RhcnQgZmFpbGluZyBldmVyeSBoZWFsdGggY2hlY2spLiBBbHdheXMgc3RhdGUgdGhlIGNvbnNl" + + "cXVlbmNlIGJlZm9yZSBwYXNzaW5nIHRoZSBmbGFnLgoKIyMjIDUuIE9yLCBudWtlIGV2ZXJ5dGhp" + + "bmcKCmBgYHNoCm52Y2YtY2xpIHNlbGYtaG9zdGVkIGRvd24gLS1hbGwgLS1jb25maXJtCmBgYAoK" + + "VGhpcyBpdGVyYXRlcyBldmVyeSByZWdpc3RlcmVkIGNvbXB1dGUgcGxhbmUgaW4gSUNNUywgcnVu" + + "cyB0aGUgcGVyLWNsdXN0ZXIgZG93biBmb3IgZWFjaCBpbiBwYXJhbGxlbCAoYm91bmRlZCBieSBg" + + "LS1hbGwtY29uY3VycmVuY3lgLCBkZWZhdWx0IDQpLCB0aGVuIHJ1bnMgYHVuaW5zdGFsbCAtLWNv" + + "bnRyb2wtcGxhbmVgLiBJbnRlcmFjdGl2ZSBtb2RlIHByb21wdHMgdGhlIG9wZXJhdG9yIHdpdGgg" + + "dGhlIGNsdXN0ZXIgbGlzdCBiZWZvcmUgcHJvY2VlZGluZzsgYC0tY29uZmlybWAgc2tpcHMgdGhl" + + "IHByb21wdCBmb3Igbm9uLWludGVyYWN0aXZlIHVzZS4KCiMjIEdpdE9wcyBwYXRoIChpZiB1c2Vy" + + "IGhhcyBBcmdvIC8gRmx1eCkKCmBgYHNoCiMgUmVuZGVyIGRlbGV0ZSBZQU1MIGZvciB0aGUgY29t" + + "cHV0ZSBwbGFuZToKbnZjZi1jbGkgc2VsZi1ob3N0ZWQgdW5pbnN0YWxsIC0tbm8tYXBwbHkgLS1j" + + "b21wdXRlLXBsYW5lIC0tY2x1c3Rlci1uYW1lPSROQU1FID4gZGVsZXRlLnlhbWwKCiMgT3BlcmF0" + + "b3IgY29tbWl0cyBkZWxldGUueWFtbCB0byB0aGVpciBHaXRPcHMgcmVwby4gQXJnby9GbHV4IGFw" + + "cGxpZXMgdGhlIGRlbGV0aW9uIG9uIG5leHQgc3luYy4KZ2l0IGFkZCBkZWxldGUueWFtbDsgZ2l0" + + "IGNvbW1pdCAtbSAicmVtb3ZlIGNvbXB1dGUgcGxhbmUgJE5BTUUiOyBnaXQgcHVzaAoKIyBBZnRl" + + "ciBBcmdvIHN5bmMgcmVtb3ZlcyB0aGUgSzhzIHJlc291cmNlcywgc2VwYXJhdGVseSByZW1vdmUg" + + "dGhlIElDTVMgcm93OgpudmNmLWNsaSBjbHVzdGVyIGRlbGV0ZSAtLWNsdXN0ZXItaWQ9JENMVVNU" + + "RVJfSUQKYGBgCgpOb3RlOiBgLS1uby1hcHBseWAgZG9lcyBOT1QgaW5jbHVkZSB0aGUgSUNNUyBg" + + "Y2x1c3RlciBkZWxldGVgIChoZWxtIGRvZXNuJ3QgbWFuYWdlIHRoYXQpLiBPcGVyYXRvcnMgZm9s" + + "bG93aW5nIEdpdE9wcyBtdXN0IHJ1biBgbnZjZi1jbGkgY2x1c3RlciBkZWxldGVgIHNlcGFyYXRl" + + "bHksIG9yIHVzZSBgZG93bmAgdG8gb3JjaGVzdHJhdGUgYm90aC4KCiMjIEZhaWx1cmUgcmVjb3Zl" + + "cnkKCklmIGBkb3duYCBwYXJ0aWFsLWZhaWxzIG1pZC13YXksICoqcmUtcnVuIHRoZSBzYW1lIGNv" + + "bW1hbmQqKi4gVGhlIG9yY2hlc3RyYXRvciBpcyBpZGVtcG90ZW50OiBgaGVsbSB1bmluc3RhbGxg" + + "IHNraXBzIHJlbGVhc2VzIHRoYXQgYXJlIGFscmVhZHkgZ29uZSwgYW5kIGBjbHVzdGVyIGRlbGV0" + + "ZSAtLWlnbm9yZS1taXNzaW5nYCBza2lwcyBJQ01TIHJvd3MgdGhhdCBhcmUgYWxyZWFkeSBnb25l" + + "LiBQaGFzZSA0ICsgNiBlbWl0IGBwaGFzZTogc2tpcHBlZCAoYWxyZWFkeSBjbGVhbilgIG9uIHRo" + + "ZSBzZWNvbmQgcnVuLgoKSWYgYSBgcGhhc2VfZmFpbGVkYCBldmVudCBzdXJmYWNlczoKLSBgZXJy" + + "Q2F0ZWdvcnk6ICJoZWxtX3BlbmRpbmdfdXBncmFkZSIsIHJldHJ5Q2xhc3M6ICJhZnRlcl9yZW1l" + + "ZGlhdGlvbiJgIOKGkiBydW4gYGhlbG0gcm9sbGJhY2sgPHJlbGVhc2U+IDAgLS1rdWJlLWNvbnRl" + + "eHQ94oCmYCAodGhlIG1lc3NhZ2UgaW5jbHVkZXMgdGhlIGV4YWN0IHJlbGVhc2UgbmFtZSkgdGhl" + + "biByZS1ydW4gYGRvd25gLiBEbyBOT1QgYXV0by1yb2xsYmFjayB3aXRob3V0IHVzZXIgY29uZmly" + + "bWF0aW9uLgotIGBlcnJDYXRlZ29yeTogImNvbXB1dGVfcGxhbmUiLCByZXRyeUNsYXNzOiAiYWZ0" + + "ZXJfcmVtZWRpYXRpb24iYCB3aXRoIG1lc3NhZ2UgYWJvdXQgQUNUSVZFIGRlcGxveW1lbnRzIOKG" + + "kiB1c2VyIHBhc3NlZCBgLS1kcmFpbi1hY3RpdmU9ZmFsc2VgIGJ1dCBkZXBsb3ltZW50cyBleGlz" + + "dC4gUmUtcnVuIHdpdGggYC0tZHJhaW4tYWN0aXZlPXRydWVgIG9yIGAtLWRyYWluLWFjdGl2ZT1w" + + "cm9tcHRgIGFuZCBjb25maXJtIHdpdGggdGhlIHVzZXIuCi0gT3RoZXIgY2F0ZWdvcmllcyDihpIg" + + "c3VyZmFjZSBgZXJyTWVzc2FnZWAgKyBlYWNoIGByZW1lZGlhdGlvbmAgc3RyaW5nIHZlcmJhdGlt" + + "LiBTVE9QLiBEbyBub3QgcHJvcG9zZSByZXRyeSB3aXRob3V0IHVzZXIgaW5wdXQuCgojIyBBbHdh" + + "eXMgY29uZmlybQoKRm9yIGV2ZXJ5IGBudmNmLWNsaSBzZWxmLWhvc3RlZCBkb3duYCBvciBgdW5p" + + "bnN0YWxsYCBpbnZvY2F0aW9uLCBlc3BlY2lhbGx5IHdpdGggZGVzdHJ1Y3RpdmUgZmxhZ3M6Ci0g" + + "U3RhdGUgdGhlIGV4YWN0IGAtLWNsdXN0ZXItbmFtZWAgKG9yIGAtLWFsbGApLgotIFN0YXRlIHdo" + + "YXQncyBsb3N0IChlLmcuICJhbGwgZnVuY3Rpb24gZGVwbG95bWVudHMgc2NoZWR1bGVkIG9uIGBu" + + "Y3AtbG9jYWxgIHdpbGwgc3RvcDsgY29tcHV0ZSBwbGFuZSB3aWxsIGRlcmVnaXN0ZXIgZnJvbSBJ" + + "Q01TIikuCi0gSWYgYC0tcmVtb3ZlLXBlcnNpc3RlbnRgIGlzIGJlaW5nIGNvbnNpZGVyZWQsIHN0" + + "YXRlIHRoYXQgQ2Fzc2FuZHJhIHJvd3MgKyBPcGVuQmFvIHNlYWwga2V5cyB3aWxsIGJlIGRlbGV0" + + "ZWQgYW5kIHRoYXQgdGhpcyBpcyB1bnJlY292ZXJhYmxlLgotIFdhaXQgZm9yIGV4cGxpY2l0IHVz" + + "ZXIgY29uZmlybWF0aW9uLgotIE5ldmVyIHByb3Bvc2UgYC0tZm9yY2Utd2l0aC1yZWdpc3RlcmVk" + + "LWNsdXN0ZXJzYCB3aXRob3V0IGV4cGxhaW5pbmcgdGhhdCBjb21wdXRlIHBsYW5lcyB3aWxsIGJl" + + "IG9ycGhhbmVkLgotIE5ldmVyIHByb3Bvc2UgYC0tcmVtb3ZlLXBlcnNpc3RlbnRgIHdpdGhvdXQg" + + "ZXhwbGFpbmluZyB0aGUgbG9zcy4KCiMjIE1hbnVhbCBmYWxsYmFjayAoaWYgYG52Y2YtY2xpIHNl" + + "bGYtaG9zdGVkIHt1bmluc3RhbGwsZG93bn1gIGlzIHVuYXZhaWxhYmxlKQoKSWYgdGhlIHVzZXIg" + + "aXMgb24gYSBDTEkgdmVyc2lvbiBvbGRlciB0aGFuIE0rMTEsIGZhbGwgYmFjayB0bzoKCmBgYHNo" + + "CiMgUGVyIGNvbXB1dGUgcGxhbmUgKG9uIGl0cyBrdWJlY3RsIGNvbnRleHQpOgpoZWxtIHVuaW5z" + + "dGFsbCBudmNhLWFnZW50IC1uIG52Y2Etc3lzdGVtCmhlbG0gdW5pbnN0YWxsIG52Y2Etb3BlcmF0" + + "b3IgLW4gbnZjYS1vcGVyYXRvcgpoZWxtIHVuaW5zdGFsbCBpbWFnZS1jcmVkZW50aWFsLWhlbHBl" + + "ciAtbiBudmNhLXN5c3RlbQpoZWxtIHVuaW5zdGFsbCBzaGFyZWRzdG9yYWdlIC1uIG52Y2Etc3lz" + + "dGVtCgojIERyYWluIHRoZSBJQ01TIHJvdzoKbnZjZi1jbGkgY2x1c3RlciBkZWxldGUgLS1jbHVz" + + "dGVyLWlkPTxpZD4KCiMgQ29udHJvbCBwbGFuZSB0ZWFyZG93biAob24gaXRzIGt1YmVjdGwgY29u" + + "dGV4dCk6CmNkIG52Y2Ytc2VsZi1tYW5hZ2VkLXN0YWNrCm1ha2UgZGVzdHJveSAgICMgaW52b2tl" + + "cyBoZWxtZmlsZSBkZXN0cm95IGFjcm9zcyBhbGwgcmVsZWFzZXMKCiMgSWYgdXNpbmcgc3BsaXQg" + + "c3RhY2sgYnVuZGxlcywgdGVhcmRvd24gY29tcHV0ZSBwbGFuZSByZWxlYXNlcyB0b286CmNkIC4u" + + "L252Y2YtY29tcHV0ZS1wbGFuZS1zdGFjawptYWtlIGRlc3Ryb3kKYGBgCgpUaGlzIGlzIHRoZSBt" + + "YW51YWwgcGF0aDsgcHJlZmVyIHRoZSBuZXcgc3ViY29tbWFuZHMgd2hlbmV2ZXIgdGhleSdyZSBp" + + "bnN0YWxsZWQuCgojIyBXaGF0IGBrdWJlY3RsIGRlbGV0ZSBwdmNgIGRvZXMKCklmIHRoZSB1c2Vy" + + "IGFza3MgIndoeSBpcyBteSBuZXcgaW5zdGFsbCBzZWVpbmcgdGhlIG9sZCBkYXRhPyIg4oCUIHRo" + + "ZSBTdGF0ZWZ1bFNldCBQVkNzIChDYXNzYW5kcmEsIE9wZW5CYW8pIGFyZSBOT1QgZGVsZXRlZCBi" + + "eSBgaGVsbSB1bmluc3RhbGxgIChhbmQgc28gYXJlIE5PVCBkZWxldGVkIGJ5IGBudmNmLWNsaSBz" + + "ZWxmLWhvc3RlZCBkb3duYCBlaXRoZXIsIGJ5IGRlZmF1bHQpLiBUaGV5IHBlcnNpc3QgaW50ZW50" + + "aW9uYWxseSBzbyBhIHJlLWB1cGAgY2FuIHJlc3VtZSBhZ2FpbnN0IGV4aXN0aW5nIGRhdGEuIFRv" + + "IHdpcGUgY29tcGxldGVseSBvbiB0aGUgbmV4dCBgZG93bmA6CgpgYGBzaApudmNmLWNsaSBzZWxm" + + "LWhvc3RlZCBkb3duIC0tY2x1c3Rlci1uYW1lPW5jcC1sb2NhbCAtLXJlbW92ZS1wZXJzaXN0ZW50" + + "CmBgYAoKT3IsIHBvc3QtZG93biwgbWFudWFsbHk6CgpgYGBzaAprdWJlY3RsIGRlbGV0ZSBwdmMg" + + "LW4gY2Fzc2FuZHJhLXN5c3RlbSAtLWFsbAprdWJlY3RsIGRlbGV0ZSBwdmMgLW4gdmF1bHQtc3lz" + + "dGVtIC0tYWxsCmBgYAoKKipDb25maXJtIHdpdGggdXNlci4qKiBUaGlzIGlzIHRoZSBkZXN0cnVj" + + "dGl2ZSBzdGVwLgpQSwcIEpMzWeAhAADgIQAAUEsDBBQACAAAAAAAIQAAAAAAAAAAAAAAAAAwAAkA" + + "ZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1jbGkvcmVmZXJlbmNlL2NvbW1hbmRzLm1kVVQFAAEAps4S" + + "IyBgbnZjZi1jbGlgIGNvbW1hbmQgcmVmZXJlbmNlCgpGdWxsIHN1YmNvbW1hbmQgbGlzdC4gQWx3" + + "YXlzIHBhaXIgd2l0aCBbZmxhZ3MubWRdKGZsYWdzLm1kKSBmb3IgZ2xvYmFsIGZsYWdzIGFuZCBb" + + "ZXhpdC1jb2Rlcy5tZF0oZXhpdC1jb2Rlcy5tZCkgZm9yIHJldHVybiBjb2Rlcy4KCiMjIFNlbGYt" + + "aG9zdGVkIGxpZmVjeWNsZQoKfCBDb21tYW5kIHwgUHVycG9zZSB8IE91dHB1dCB8IE5vdGVzIHwK" + + "fC0tLXwtLS18LS0tfC0tLXwKfCBgc2VsZi1ob3N0ZWQgY2hlY2sgLS1wcmUgW2ZsYWdzXWAgfCBQ" + + "cmUtZmxpZ2h0IHZhbGlkYXRpb24gKG5vIGFkbWluIGNyZWRzKSB8IHN0cmVhbWluZyBldmVudHMg" + + "fCBQZXItcm9sZSB3aXRoIGAtLWNvbnRyb2wtcGxhbmUtY29udGV4dGAgLyBgLS1jb21wdXRlLXBs" + + "YW5lLWNvbnRleHRgOyBgLS1sb2NhbC1vbmx5YCBza2lwcyBrdWJlY3RsIHwKfCBgc2VsZi1ob3N0" + + "ZWQgY2hlY2sgLS1jb250cm9sLXBsYW5lIFstLXdhaXQgRFVSXWAgfCBFdmVyeSBDUCByZWxlYXNl" + + "IGhlYWx0aHkgfCBzdHJlYW1pbmcgZXZlbnRzIHwgUG9sbHMgdW50aWwgcGFzcyBvciBgLS13YWl0" + + "YCBlbGFwc2VzIHwKfCBgc2VsZi1ob3N0ZWQgY2hlY2sgLS1jb21wdXRlLXBsYW5lIC0tY2x1c3Rl" + + "ci1uYW1lPVggWy0td2FpdCBEVVJdYCB8IFBlci1jbHVzdGVyIHdvcmtlciBzdGF0ZSB8IHN0cmVh" + + "bWluZyBldmVudHMgfCBOVkNBICsgb3BlcmF0b3IgKyBKV0tTLWZpbmdlcnByaW50IG1hdGNoIHwK" + + "fCBgc2VsZi1ob3N0ZWQgY2hlY2sgLS1hbGwgWy0td2FpdCBEVVJdYCB8IEZhbi1vdXQgb3ZlciBh" + + "bGwgb2YgdGhlIGFib3ZlIHwgc3RyZWFtaW5nIGV2ZW50cyB8IHwKfCBgc2VsZi1ob3N0ZWQgaW5z" + + "dGFsbCAtLWNvbnRyb2wtcGxhbmVgIHwgUmVuZGVyIGNvbnRyb2wtcGxhbmUgbWFuaWZlc3RzIHwg" + + "WUFNTCBvbiBzdGRvdXQgfCBQaXBlIHRvIGBrdWJlY3RsIGFwcGx5IC1mIC1gIHwKfCBgc2VsZi1o" + + "b3N0ZWQgaW5zdGFsbCAtLWNvbXB1dGUtcGxhbmUgLS1jbHVzdGVyLW5hbWU9WGAgfCBSZWdpc3Rl" + + "ciBjbHVzdGVyICsgcmVuZGVyIGNvbXB1dGUgbWFuaWZlc3RzIHwgWUFNTCBvbiBzdGRvdXQgfCBP" + + "bmUgaW52b2NhdGlvbiBwZXIgR1BVIGNsdXN0ZXIgfAp8IGBzZWxmLWhvc3RlZCB1cCAtLWNsdXN0" + + "ZXItbmFtZT1YYCB8IE9uZS1zaG90IGZpcnN0IGluc3RhbGwgKGJvdGggcGxhbmVzKSB8IChlbXB0" + + "eSkgc3Rkb3V0LCBwcm9ncmVzcyBvbiBzdGRlcnIgfCBBbHdheXMgaW5zdGFsbHMgYm90aCBwbGFu" + + "ZXM7IGZvciBjb21wdXRlLW9ubHkgdXNlIGBhZGQtY29tcHV0ZS1wbGFuZWAgfAp8IGBzZWxmLWhv" + + "c3RlZCB1cCAtLXBsYW4tb25seSAtLWNsdXN0ZXItbmFtZT1YYCB8IERyeS1ydW4gcHJldmlldyB8" + + "IEpTT05MIG9uIHN0ZGVyciB8IEFnZW50LWZyaWVuZGx5LCBubyBjbHVzdGVyIGNoYW5nZXMgfAp8" + + "IGBzZWxmLWhvc3RlZCBhZGQtY29tcHV0ZS1wbGFuZSAtLWNsdXN0ZXItbmFtZT1YIC0tY29tcHV0" + + "ZS1wbGFuZS1jb250ZXh0PVkgLS1pY21zLXVybD1VUkwgLS10b2tlbj0kSldUYCB8IEFkZCBhIGNv" + + "bXB1dGUgcGxhbmUgdG8gYW4gZXhpc3RpbmcgY29udHJvbCBwbGFuZSB8IHByb2dyZXNzIG9uIHN0" + + "ZGVyciB8IEZvciAybmQsIDNyZCwg4oCmIEdQVSBjbHVzdGVyIGFmdGVyIHRoZSBmaXJzdCBpbnN0" + + "YWxsLiBDUCBub3QgdG91Y2hlZC4gfAp8IGBzZWxmLWhvc3RlZCBzdGF0dXMgWy0tY2x1c3Rlci1u" + + "YW1lPVhdIFstLXdhdGNoXWAgfCBTbmFwc2hvdCBjbHVzdGVyIGhlYWx0aCB8IFRUWS9wbGFpbi9K" + + "U09OTCB8IGAtLXdhdGNoYCBmb3IgbGl2ZSByZS1yZW5kZXIgfAp8IGBzZWxmLWhvc3RlZCB1bmlu" + + "c3RhbGwgLS1jb21wdXRlLXBsYW5lIC0tY2x1c3Rlci1uYW1lPVhgIHwgUGVyLXBsYW5lIHByaW1p" + + "dGl2ZTogYGhlbG1maWxlIGRlc3Ryb3lgIG9uIG9uZSBjb21wdXRlIHBsYW5lIChubyBJQ01TIHVu" + + "cmVnaXN0ZXIsIG5vIGRyYWluKSB8IHByb2dyZXNzIHwgSnVzdCB0aGUgaGVsbSByZWxlYXNlcyBv" + + "biB0aGF0IGNvbXB1dGUgcGxhbmUgfAp8IGBzZWxmLWhvc3RlZCB1bmluc3RhbGwgLS1jb250cm9s" + + "LXBsYW5lIFstLWZvcmNlLXdpdGgtcmVnaXN0ZXJlZC1jbHVzdGVyc11gIHwgUGVyLXBsYW5lIHBy" + + "aW1pdGl2ZTogYGhlbG1maWxlIGRlc3Ryb3lgIG9uIHRoZSBjb250cm9sIHBsYW5lIHwgcHJvZ3Jl" + + "c3MgfCBSZWZ1c2VzIGlmIGNvbXB1dGUgcGxhbmVzIHN0aWxsIHJlZ2lzdGVyZWQgdW5sZXNzIGAt" + + "LWZvcmNlLXdpdGgtcmVnaXN0ZXJlZC1jbHVzdGVyc2AgfAp8IGBzZWxmLWhvc3RlZCB1bmluc3Rh" + + "bGwgLS1uby1hcHBseSA8cGxhbmU+YCB8IFJlbmRlciBkZWxldGUgWUFNTCB2aWEgYGhlbG0gZ2V0" + + "IG1hbmlmZXN0YCBwZXIgcmVsZWFzZSB8IFlBTUwgb24gc3Rkb3V0IHwgR2l0T3BzOyBwaXBlIHRv" + + "IGBrdWJlY3RsIGRlbGV0ZSAtZiAtYCBvciBjb21taXQgKyBBcmdvIGFwcGxpZXMuIE1pcnJvcnMg" + + "YGluc3RhbGwgLS1uby1hcHBseWAgfAp8IGBzZWxmLWhvc3RlZCBkb3duIC0tY2x1c3Rlci1uYW1l" + + "PVggWy0tZHJhaW4tYWN0aXZlXSBbLS1yZW1vdmUtcGVyc2lzdGVudF1gIHwgT3JjaGVzdHJhdG9y" + + "OiBkcmFpbiDihpIgdW5pbnN0YWxsIC0tY29tcHV0ZS1wbGFuZSDihpIgY2x1c3RlciBkZWxldGUg" + + "aW4gSUNNUyB8IHByb2dyZXNzIHwgU3ltbWV0cmljIGNvbXBhbmlvbiB0byBgdXAgLS1jbHVzdGVy" + + "LW5hbWU9WGAgfAp8IGBzZWxmLWhvc3RlZCBkb3duIC0tYWxsIFstLWNvbmZpcm1dYCB8IE9yY2hl" + + "c3RyYXRvcjogdGVhciBkb3duIGV2ZXJ5IHJlZ2lzdGVyZWQgY29tcHV0ZSBwbGFuZSArIGNvbnRy" + + "b2wgcGxhbmUgfCBwcm9ncmVzcyB8IEJvdW5kZWQgcGFyYWxsZWxpc20gdmlhIGAtLWFsbC1jb25j" + + "dXJyZW5jeWAgKGRlZmF1bHQgNCk7IGAtLWNvbmZpcm1gIHJlcXVpcmVkIGluIG5vbi1pbnRlcmFj" + + "dGl2ZSB8CnwgYHNlbGYtaG9zdGVkIGRvd24gLS1wbGFuLW9ubHkgLi4uYCB8IE9yY2hlc3RyYXRv" + + "ciBkcnktcnVuOiBwaGFzZXMgKyBoZWxtIHJlbGVhc2VzICsgSUNNUyByb3dzICsgRVRBcyAobm8g" + + "aGVsbS9oZWxtZmlsZSBjb250YWN0KSB8IEpTT05MIHwgKipBbHdheXMgcnVuIGJlZm9yZSBhbnkg" + + "YWN0dWFsIGBkb3duYCoqIHwKCiMjIENsdXN0ZXIgbWFuYWdlbWVudAoKfCBDb21tYW5kIHwgUHVy" + + "cG9zZSB8IE5vdGVzIHwKfC0tLXwtLS18LS0tfAp8IGBjbHVzdGVyIHJlZ2lzdGVyIC0tbmFtZT1Y" + + "IC0tbmNhLWlkPVkgWy0tcmVnaW9uPVpdIFstLWlnbm9yZS1leGlzdGluZ11gIHwgUmVnaXN0ZXIg" + + "YSBKV0tTK09JREMgd2l0aCBJQ01TIHwgVXNlZCBieSBgdXBgIFBoYXNlIDUgaW50ZXJuYWxseTsg" + + "c3RhbmRhbG9uZSBmb3IgbWFudWFsIHJlZ2lzdHJhdGlvbiB8CnwgYGNsdXN0ZXIgbGlzdGAgfCBM" + + "aXN0IHJlZ2lzdGVyZWQgY2x1c3RlcnMgfCBPdXRwdXQgaXMgWUFNTCBieSBkZWZhdWx0OyBgLS1q" + + "c29uYCBmb3IgbWFjaGluZSB8CnwgYGNsdXN0ZXIgcm90YXRlIC0tY2x1c3Rlci1pZD1JRGAgfCBS" + + "ZS1mZXRjaCBKV0tTIGZyb20gSzhzIGFuZCBQVVQgdG8gSUNNUyB8IEFmdGVyIEs4cyBBUEkgc2Vy" + + "dmVyIHNpZ25pbmcga2V5IHJvdGF0aW9uIHwKfCBgY2x1c3RlciBkZWxldGUgLS1jbHVzdGVyLWlk" + + "PUlEYCB8IFJlbW92ZSBJQ01TIHJvdyB8ICoqREVTVFJVQ1RJVkU6IGNvbmZpcm0gd2l0aCB1c2Vy" + + "KiogfAoKIyMgRnVuY3Rpb25zCgp8IENvbW1hbmQgfCBQdXJwb3NlIHwgTm90ZXMgfAp8LS0tfC0t" + + "LXwtLS18CnwgYGZ1bmN0aW9uIGNyZWF0ZSAtLWlucHV0LWZpbGU9RklMRWAgfCBDcmVhdGUgZnVu" + + "Y3Rpb24gbWV0YWRhdGEgfCBSZXR1cm5zIEZ1bmN0aW9uIElEICsgVmVyc2lvbiBJRDsgTExNIGZ1" + + "bmN0aW9ucyB1c2UgYGZ1bmN0aW9uVHlwZTogIkxMTSJgIGFuZCBgbW9kZWxzW10ubGxtQ29uZmln" + + "LnVyaXNgIGZvciBgL3YxL2NoYXQvY29tcGxldGlvbnNgLCBgL3YxL3Jlc3BvbnNlc2AsIGFuZCBg" + + "L3YxL2VtYmVkZGluZ3NgIHwKfCBgZnVuY3Rpb24gbGlzdGAgLyBgZnVuY3Rpb24gbGlzdC1pZHNg" + + "IHwgTGlzdCBmdW5jdGlvbnMgLyBJRHMgb25seSB8IHwKfCBgZnVuY3Rpb24gZ2V0IC0tZnVuY3Rp" + + "b24taWQ9SUQgLS12ZXJzaW9uLWlkPVZJRGAgfCBGdW5jdGlvbiBtZXRhZGF0YSB8IHwKfCBgZnVu" + + "Y3Rpb24gdXBkYXRlIC0tZnVuY3Rpb24taWQ9SUQgLS12ZXJzaW9uLWlkPVZJRCAtLXRhZ3M9VEFH" + + "WyxUQUddYCB8IFVwZGF0ZSBmdW5jdGlvbiB0YWdzIHwgfAp8IGBmdW5jdGlvbiB1cGRhdGUgLS1m" + + "dW5jdGlvbi1pZD1JRCAtLXZlcnNpb24taWQ9VklEIC0tbGxtLW1vZGVsLXVwZGF0ZT1TUEVDYCB8" + + "IFVwZGF0ZSBMTE0gbW9kZWwgcm91dGluZyBjb25maWcgfCBgU1BFQ2AgdXNlcyBgbmFtZT08bW9k" + + "ZWw+LHJvdXRpbmdNZXRob2Q9PG1ldGhvZD4sdG9rZW5SYXRlTGltaXQ9PGxpbWl0PmA7IGFjY2Vw" + + "dGVkIG1ldGhvZHMgYXJlIGxpc3RlZCBpbiBbZmxhZ3MubWRdKGZsYWdzLm1kKSB8CnwgYGZ1bmN0" + + "aW9uIGRlcGxveSBjcmVhdGUgLS1pbnB1dC1maWxlPUZJTEVgIHwgU2NoZWR1bGUgYSBkZXBsb3lt" + + "ZW50IHwgQmxvY2tzIHVudGlsIEFDVElWRSAoZGVmYXVsdCA5MDBzKSB8CnwgYGZ1bmN0aW9uIGRl" + + "cGxveSBnZXQgLS1mdW5jdGlvbi1pZD1JRCAtLXZlcnNpb24taWQ9VklEIFstLWpzb25dYCB8IERl" + + "cGxveW1lbnQgc3RhdHVzIHwgYGZ1bmN0aW9uU3RhdHVzOiBBQ1RJVkVcfERFUExPWUlOR1x8RVJS" + + "T1JcfEZBSUxFRGAgfAp8IGBmdW5jdGlvbiBkZXBsb3kgdXBkYXRlIC0taW5wdXQtZmlsZT1GSUxF" + + "YCB8IE1vZGlmeSBhIGRlcGxveW1lbnQgaW4gcGxhY2UgfCB8CnwgYGZ1bmN0aW9uIGRlcGxveSBy" + + "ZW1vdmUgLS1mdW5jdGlvbi1pZD1JRCAtLXZlcnNpb24taWQ9VklEYCB8IFN0b3AgYSBkZXBsb3lt" + + "ZW50LCBrZWVwIGZ1bmN0aW9uIHJlY29yZCB8IHwKfCBgZnVuY3Rpb24gaW52b2tlIC0taW5wdXQt" + + "ZmlsZT1GSUxFYCB8IENhbGwgYSByZWd1bGFyIGZ1bmN0aW9uIHwgUmVxdWlyZXMgQVBJIGtleSAo" + + "bm90IGFkbWluIHRva2VuKTsgTExNIGZ1bmN0aW9ucyBhcmUgaW52b2tlZCB0aHJvdWdoIGBsbG0u" + + "aW52b2NhdGlvbi48ZG9tYWluPmAgd2l0aCBgbW9kZWw6ICI8ZnVuY3Rpb24taWQ+Lzxtb2RlbC1u" + + "YW1lPiJgIHwKfCBgZnVuY3Rpb24gZGVsZXRlIC0tZnVuY3Rpb24taWQ9SUQgLS12ZXJzaW9uLWlk" + + "PVZJRGAgfCBSZW1vdmUgZnVuY3Rpb24gKyBkZXBsb3ltZW50IHwgKipERVNUUlVDVElWRTogY29u" + + "ZmlybSB3aXRoIHVzZXIqKiB8CgojIyBUYXNrcwoKVGFzayBjb21tYW5kcyByZXF1aXJlIGBOVkNG" + + "X0FQSV9LRVlgIHNldCB0byBhIHRhc2stc2NvcGVkIGtleSBhbmQgYE5WQ0ZfQkFTRV9OVkNUX1VS" + + "TGAgc2V0IHRvIHRoZSBOVkNUIGdhdGV3YXkgZW5kcG9pbnQuIEluIGEgZnJlc2ggc2Vzc2lvbiwg" + + "cmVhZCBgbnZjdEFwaUtleWAgZnJvbSBgfi8ubnZjZi1jbGkuc3RhdGVgIGFuZCBpbmplY3QgaXQg" + + "YXMgYE5WQ0ZfQVBJX0tFWWAgd2l0aG91dCBsb2dnaW5nIHRoZSB2YWx1ZTsgY2hlY2sgYG52Y3RB" + + "cGlLZXlFeHBpcmF0aW9uYCBmaXJzdCBhbmQgcmVnZW5lcmF0ZSB3aXRoIGBhcGkta2V5IGdlbmVy" + + "YXRlIC0tZm9yIHRhc2sgLS12YWxpZGF0ZWAgaWYgZXhwaXJlZC4gUnVuIGBhcGkta2V5IGdlbmVy" + + "YXRlIC0tZm9yIHRhc2tgIGFmdGVyIGBpbml0YCB0byBtaW50IGEgbmV3IGtleS4KCnwgQ29tbWFu" + + "ZCB8IFB1cnBvc2UgfCBOb3RlcyB8CnwtLS18LS0tfC0tLXwKfCBgdGFzayBjcmVhdGUgLS1uYW1l" + + "PVggLS1ncHU9R1BVIC0taW5zdGFuY2UtdHlwZT1UWVBFIC0taW1hZ2U9SU1HYCB8IFN1Ym1pdCBh" + + "IGNvbnRhaW5lciB0YXNrIHwgU2F2ZXMgdGFzayBJRCB0byBDTEkgc3RhdGU7IHVzZSBgLS1pbnB1" + + "dC1maWxlYCBmb3IgcmVwZWF0YWJsZSBjb25maWdzIHwKfCBgdGFzayBjcmVhdGUgLS1uYW1lPVgg" + + "LS1ncHU9R1BVIC0taW5zdGFuY2UtdHlwZT1UWVBFIC0taGVsbS1jaGFydD1DSEFSVGAgfCBTdWJt" + + "aXQgYSBIZWxtIHRhc2sgfCBgLS1oZWxtLWNoYXJ0YCByZXBsYWNlcyBgLS1pbWFnZWAgfAp8IGB0" + + "YXNrIGNyZWF0ZSAtLWlucHV0LWZpbGU9RklMRWAgfCBTdWJtaXQgYSB0YXNrIGZyb20gYSBKU09O" + + "IGNvbmZpZyBmaWxlIHwgUmVjb21tZW5kZWQgZm9yIHJlcGVhdGFibGUgY29uZmlndXJhdGlvbnMg" + + "fAp8IGB0YXNrIGxpc3QgWy0tc3RhdHVzPVNUQVRVU10gWy0tbGltaXQ9Tl1gIHwgTGlzdCB0YXNr" + + "cywgb3B0aW9uYWxseSBmaWx0ZXJlZCBieSBzdGF0dXMgfCBTdGF0dXNlczogYFFVRVVFRGAsIGBM" + + "QVVOQ0hFRGAsIGBSVU5OSU5HYCwgYENPTVBMRVRFRGAsIGBFUlJPUkVEYCwgYENBTkNFTEVEYCwg" + + "YEVYQ0VFREVEX01BWF9SVU5USU1FX0RVUkFUSU9OYCwgYEVYQ0VFREVEX01BWF9RVUVVRURfRFVS" + + "QVRJT05gIHwKfCBgdGFzayBnZXQgW3Rhc2tJZF1gIHwgR2V0IHRhc2sgZGV0YWlscyB8IFVzZXMg" + + "c2F2ZWQgdGFzayBJRCBmcm9tIHN0YXRlIGlmIG9taXR0ZWQgfAp8IGB0YXNrIGV2ZW50cyBbdGFz" + + "a0lkXSBbLS1saW1pdD1OXWAgfCBMaXN0IGxpZmVjeWNsZSBldmVudHMgZm9yIGEgdGFzayB8IHwK" + + "fCBgdGFzayByZXN1bHRzIFt0YXNrSWRdYCB8IExpc3QgcmVzdWx0IGFydGlmYWN0cyBmb3IgYSBj" + + "b21wbGV0ZWQgdGFzayB8IFJldHVybnMgZW1wdHkgbGlzdCB3aGVuIGByZXN1bHRIYW5kbGluZ1N0" + + "cmF0ZWd5YCBpcyBgTk9ORWA7IHJlc3VsdCB1cGxvYWQgbm90IHlldCBzdXBwb3J0ZWQgfAp8IGB0" + + "YXNrIGNhbmNlbCBbdGFza0lkXWAgfCBDYW5jZWwgYSBydW5uaW5nIHRhc2sgfCBOby1vcCBpZiBh" + + "bHJlYWR5IGluIHRlcm1pbmFsIHN0YXRlIHwKfCBgdGFzayBkZWxldGUgW3Rhc2tJZF1gIHwgRGVs" + + "ZXRlIGEgdGFzayByZWNvcmQgfCAqKlN0b3AsIHN0YXRlIHRhc2sgSUQgKyBjdXJyZW50IHN0YXR1" + + "cywgYW5kIHdhaXQgZm9yIGEgc3Vic2VxdWVudCB1c2VyIHJlcGx5IGV4cGxpY2l0bHkgY29uZmly" + + "bWluZyBkZWxldGlvbiBvZiB0aGF0IHNwZWNpZmljIHRhc2suIERvIG5vdCB0cmVhdCB0aGUgb3Jp" + + "Z2luYWwgZGVsZXRlIHJlcXVlc3QgYXMgY29uZmlybWF0aW9uLioqIHwKfCBgdGFzayB1cGRhdGUt" + + "c2VjcmV0cyBbdGFza0lkXSAtLXNlY3JldHMgTkFNRT12YWx1ZWAgfCBVcGRhdGUgc2VjcmV0cyBv" + + "biBhIHRhc2s7IHN1cHBsaWVkIHNlY3JldHMgYXJlIGFkZGVkIG9yIHVwZGF0ZWQgYnkgbmFtZSwg" + + "ZXhpc3Rpbmcgc2VjcmV0cyBub3QgaW4gdGhlIHJlcXVlc3QgYXJlIHByZXNlcnZlZCB8IFZhbHVl" + + "cyBhcmUgZW5jcnlwdGVkIGF0IHJlc3QgfAp8IGB0YXNrIGJ1bGsgLS10YXNrLWlkcz1JRDFbLElE" + + "MizigKZdYCB8IEZldGNoIGRldGFpbHMgZm9yIG11bHRpcGxlIHRhc2tzIGluIG9uZSByZXF1ZXN0" + + "IHwgfAoKIyMgQXV0aAoKfCBDb21tYW5kIHwgUHVycG9zZSB8IE5vdGVzIHwKfC0tLXwtLS18LS0t" + + "fAp8IGBpbml0YCB8IE1pbnQgYWRtaW4gdG9rZW4gZnJvbSBBUEkgS2V5cyB2aWEgcHVibGljIGFw" + + "aSBnYXRld2F5IHwgSWRlbXBvdGVudDsgd3JpdGVzIGB+Ly5udmNmLWNsaS5zdGF0ZWA7IGNsZWFy" + + "cyBzYXZlZCBmdW5jdGlvbiBzdGF0ZSBhbmQgYWxsIEFQSSBrZXlzIChmdW5jdGlvbiBhbmQgdGFz" + + "aykgfAp8IGBzdGF0dXNgIHwgU2hvdyBDTEkgc3RhdGUgKHRva2VuLCBsYXN0IGVuZHBvaW50cywg" + + "ZnVuY3Rpb24gY29udGV4dCkgfCBEaXN0aW5jdCBmcm9tIGBzZWxmLWhvc3RlZCBzdGF0dXNgIHwK" + + "fCBgYXBpLWtleSBnZW5lcmF0ZSBbLS1mb3IgZnVuY3Rpb25cfHRhc2tdIFstLWRlc2NyaXB0aW9u" + + "PeKApl0gWy0tZXhwaXJlcy1pbj3igKZdYCB8IE1pbnQgQVBJIGtleXMgfCBEZWZhdWx0IChubyBg" + + "LS1mb3JgKTogZ2VuZXJhdGVzIGJvdGggYSBmdW5jdGlvbiBrZXkgYW5kIGEgdGFzayBrZXk7IGAt" + + "LWZvciBmdW5jdGlvbmAgb3IgYC0tZm9yIHRhc2tgIGdlbmVyYXRlcyBvbmUgb25seTsgYC0tc2Nv" + + "cGVzYCByZXF1aXJlcyBgLS1mb3JgIHwKfCBgYXBpLWtleSBnZW5lcmF0ZSAtLXZhbGlkYXRlYCB8" + + "IE1pbnQgYW5kIGltbWVkaWF0ZWx5IHZhbGlkYXRlIGVhY2ggZ2VuZXJhdGVkIGtleSB8IFZhbGlk" + + "YXRlcyBlYWNoIGtleSBhZ2FpbnN0IGl0cyBjb3JyZWN0IGF1ZGllbmNlIChOVkNGIGZvciBmdW5j" + + "dGlvbiBrZXlzLCBOVkNUIGZvciB0YXNrIGtleXMpIHwKfCBgYXBpLWtleSBsaXN0YCB8IExpc3Qg" + + "QVBJIGtleXMgZm9yIGN1cnJlbnQgb3duZXIgfCBMaXN0cyBOVkNGLXNjb3BlZCBrZXlzIG9ubHkg" + + "fAp8IGBhcGkta2V5IGRlbGV0ZSBLRVktSURgIC8gYGFwaS1rZXkgcmV2b2tlIEtFWS1JRGAgfCBS" + + "ZW1vdmUgYW4gQVBJIGtleSB8ICoqQ29uZmlybSB3aXRoIHVzZXIqKiB8CnwgYGFwaS1rZXkgc2hv" + + "d2AgfCBTaG93IGN1cnJlbnRseSBzYXZlZCBBUEkga2V5IGZyb20gc3RhdGUgfCB8CgojIyBBZ2Vu" + + "dCBza2lsbAoKfCBDb21tYW5kIHwgUHVycG9zZSB8IE5vdGVzIHwKfC0tLXwtLS18LS0tfAp8IGBh" + + "Z2VudC1za2lsbCBpbnN0YWxsIFstLXRhcmdldD1ESVJdYCB8IEluc3RhbGwgYWxsIGJ1bmRsZWQg" + + "cHVibGljIHVzZXIgc2tpbGxzIGludG8gYH4vLmNsYXVkZS9za2lsbHMvYCBhbmQgYH4vLmFnZW50" + + "cy9za2lsbHMvYCB8IERlZmF1bHQ6IGJvdGggYmFzZSBza2lsbHMgZGlyZWN0b3JpZXMgfAp8IGBh" + + "Z2VudC1za2lsbCB1bmluc3RhbGwgWy0tdGFyZ2V0PURJUl1gIHwgUmVtb3ZlIG9ubHkgYnVuZGxl" + + "ZCBwdWJsaWMgdXNlciBza2lsbHMgZnJvbSB0aGUgdGFyZ2V0IGJhc2Ugc2tpbGxzIGRpcmVjdG9y" + + "aWVzIHwgSWRlbXBvdGVudDsgdW5yZWxhdGVkIHNraWxscyByZW1haW4gfAp8IGBhZ2VudC1za2ls" + + "bCBzaG93IFstLWZpbGU9UkVMXWAgfCBQcmludCBidW5kbGVkIGBudmNmLXNlbGYtbWFuYWdlZC1j" + + "bGkvU0tJTEwubWRgIG9yIGFub3RoZXIgZW1iZWRkZWQgZmlsZSB8IEZvciBkZWJ1Z2dpbmcgfAp8" + + "IGBhZ2VudC1za2lsbCB2ZXJzaW9uYCB8IFByaW50IGJ1aWxkIFNIQSBhbmQgZW1iZWRkZWQgcHVi" + + "bGljIHVzZXIgc2tpbGwgc3VtbWFyeSB8IHwKUEsHCNu+VPjXIgAA1yIAAFBLAwQUAAgAAAAAACEA" + + "AAAAAAAAAAAAAAAAMgAJAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL3JlZmVyZW5jZS9leGl0" + + "LWNvZGVzLm1kVVQFAAEAps4SIyBgbnZjZi1jbGlgIGV4aXQgY29kZXMKClN0YWJsZSBhY3Jvc3Mg" + + "c3ViY29tbWFuZHMuIFVzZSB0aGVzZSB0byBkcml2ZSBhZ2VudCByZXRyeSAvIHN1cmZhY2luZyBs" + + "b2dpYy4KCnwgQ29kZSB8IE1lYW5pbmcgfCBFeGFtcGxlIGNhdXNlcyB8CnwtLS18LS0tfC0tLXwK" + + "fCBgMGAgfCBTdWNjZXNzIHwgQWxsIGNoZWNrcyBwYXNzZWQ7IGluc3RhbGwgY29tcGxldGVkOyBk" + + "ZXBsb3ltZW50IEFDVElWRSB8CnwgYDFgIHwgR2VuZXJpYyBlcnJvciB8IEhlbG0gcmVuZGVyIGZh" + + "aWxlZDsgbmV0d29yayB1bnJlYWNoYWJsZTsgZmlsZSBub3QgZm91bmQ7IFlBTUwgcGFyc2UgZXJy" + + "b3IgfAp8IGAyYCB8IFByZS1mbGlnaHQgY2hlY2sgZmFpbGVkIHwgR2F0ZXdheSBBUEkgQ1JEcyBt" + + "aXNzaW5nOyBrdWJlY3RsIG5vdCBvbiBQQVRIOyBkZWZhdWx0IFN0b3JhZ2VDbGFzcyBhYnNlbnQg" + + "fAp8IGAzYCB8IEFkbWluIGF1dGggZmFpbGVkIHwgTm8gdG9rZW4gKyBgLS1ub24taW50ZXJhY3Rp" + + "dmVgIHNldDsgSUNNUyByZWplY3RlZCBKV1Q7IGluaXQgZW5kcG9pbnQgdW5yZWFjaGFibGUgfAp8" + + "IGA1YCB8IE1hbmlmZXN0IGFwcGx5IG9yIGAtLXdhaXRgIHRpbWVkIG91dCB8IEhlbG0gaW5zdGFs" + + "bCB0aW1lb3V0OyBjaGVjayBwb2xsZWQgYnV0IGRpZG4ndCBwYXNzIGJlZm9yZSBkdXJhdGlvbiB8" + + "CnwgYDEzMGAgfCBDYW5jZWxsZWQgYnkgU0lHSU5UL1NJR1RFUk0gfCBVc2VyIEN0cmwtQzsgQ0kg" + + "YnVkZ2V0IGV4Y2VlZGVkOyBwb2QgZXZpY3RlZCB8CgojIyBIb3cgYW4gYWdlbnQgc2hvdWxkIHJl" + + "YWN0Cgp8IENvZGUgfCBBZ2VudCBiZWhhdmlvciB8CnwtLS18LS0tfAp8IGAwYCB8IENvbnRpbnVl" + + "IC8gcmVwb3J0IHN1Y2Nlc3MuIHwKfCBgMWAgfCBTdXJmYWNlIHN0ZGVyciB0byB1c2VyOyBhc2sg" + + "YmVmb3JlIGFueSByZXRyeS4gR2VuZXJpYyBlcnJvcnMgdXN1YWxseSBuZWVkIGEgaHVtYW4gdG8g" + + "cmVhZCB0aGUgbWVzc2FnZS4gfAp8IGAyYCB8IFN1cmZhY2UgZmFpbGVkIGNoZWNrcyArIHRoZWly" + + "IGBoaW50VVJMYC4gRG9uJ3QgcHJvcG9zZSBgdXBgIHVudGlsIHRoZSB1c2VyIGZpeGVzIHByZXJl" + + "cXMuIHwKfCBgM2AgfCBTdWdnZXN0IGBudmNmLWNsaSBpbml0YCAoaW50ZXJhY3RpdmUpIE9SIGAt" + + "LXRva2VuPSRKV1RgIChDSSkuIERvbid0IGF1dG8tbWludCB3aXRob3V0IHVzZXIgT0suIHwKfCBg" + + "NWAgfCBBc2sgdXNlciBpZiB0aGV5IHdhbnQgdG8gd2FpdCBsb25nZXIsIGRpZyBpbnRvIHRoZSBz" + + "dGFsbGVkIGNvbXBvbmVudCwgb3IgY2FuY2VsLiB8CnwgYDEzMGAgfCBEb24ndCByZXRyeSBhdXRv" + + "bWF0aWNhbGx5OyB1c2VyIGV4cGxpY2l0bHkgY2FuY2VsbGVkLiBDb25maXJtIGJlZm9yZSByZS1y" + + "dW5uaW5nLiB8CgojIyBXaGVyZSB0byBmaW5kIG1vcmUgZGV0YWlsCgpFdmVyeSBub24temVybyBl" + + "eGl0IGVtaXRzIGEgc3RydWN0dXJlZCBgcGhhc2VfZmFpbGVkYCBKU09OIGV2ZW50IHdpdGggYGVy" + + "ckNhdGVnb3J5YCwgYGVyck1lc3NhZ2VgLCBgcmVtZWRpYXRpb25gIChhcnJheSksIGByZXRyeUNs" + + "YXNzYCAoZW51bTogYG5vbmV8aW1tZWRpYXRlfGJhY2tvZmZ8YWZ0ZXJfcmVtZWRpYXRpb258dW5r" + + "bm93bmApLCBgcmV0cnlBZnRlclNlY2AgKGludCwgb3B0aW9uYWwpLCBhbmQgYHJhd2AgKHN1YnBy" + + "b2Nlc3MgKyBIVFRQICsgS3ViZXJuZXRlcyBzaWduYWwpLiBBbHdheXMgY29uc3VtZSB0aGVzZSBp" + + "biBgLS1qc29uYCBtb2RlIHJhdGhlciB0aGFuIHBhcnNpbmcgRW5nbGlzaCBmcm9tIHN0ZGVyci4K" + + "UEsHCHOnWmTVBgAA1QYAAFBLAwQUAAgAAAAAACEAAAAAAAAAAAAAAAAALQAJAGRhdGEvbnZjZi1z" + + "ZWxmLW1hbmFnZWQtY2xpL3JlZmVyZW5jZS9mbGFncy5tZFVUBQABAKbOEiMgYG52Y2YtY2xpYCBm" + + "bGFnIHJlZmVyZW5jZQoKIyMgR2xvYmFsIGZsYWdzIChldmVyeSBzdWJjb21tYW5kKQoKfCBGbGFn" + + "IHwgUHVycG9zZSB8IERlZmF1bHQgfAp8LS0tfC0tLXwtLS18CnwgYC0tY29uZmlnIEZJTEVgIHwg" + + "Q29uZmlnIGZpbGUgcGF0aCB8IGAkSE9NRS8ubnZjZi1jbGkueWFtbGAgfAp8IGAtLWRlYnVnYCB8" + + "IFZlcmJvc2UgSFRUUCBsb2dnaW5nIG9uIHN0ZGVyciB8IGBmYWxzZWAgfAp8IGAtLWpzb25gIHwg" + + "SlNPTkwgZXZlbnRzIG9uIHN0ZGVyciB8IGF1dG8gKG9mZiBpbiBUVFksIG9uIHVuZGVyIGAtLW5v" + + "bi1pbnRlcmFjdGl2ZWApIHwKCiMjIGBzZWxmLWhvc3RlZGAgcGFyZW50IChwZXJzaXN0ZW50IGFj" + + "cm9zcyBzdWJjb21tYW5kcykKCnwgRmxhZyB8IFB1cnBvc2UgfCBEZWZhdWx0IHwKfC0tLXwtLS18" + + "LS0tfAp8IGAtLWNvbnRyb2wtcGxhbmUtc3RhY2s94oCmYCB8IENvbnRyb2wtcGxhbmUgYnVuZGxl" + + "IHNvdXJjZTogbG9jYWwgcGF0aCwgZ2l0IFVSTCwgb3IgYG9jaTovL2AgVVJMIHwgZW1iZWRkZWQg" + + "T0NJIFVSTCBwaW5uZWQgYnkgQ0xJIHZlcnNpb24gfAp8IGAtLWNvbXB1dGUtcGxhbmUtc3RhY2s9" + + "4oCmYCB8IENvbXB1dGUtcGxhbmUgYnVuZGxlIHNvdXJjZTogbG9jYWwgcGF0aCwgZ2l0IFVSTCwg" + + "b3IgYG9jaTovL2AgVVJMIHwgZW1iZWRkZWQgT0NJIFVSTCBwaW5uZWQgYnkgQ0xJIHZlcnNpb24g" + + "fAp8IGAtLWVudj1sb2NhbFx8cHJkXHzigKZgIHwgSGVsbWZpbGUgZW52aXJvbm1lbnQgbmFtZSB8" + + "IGBsb2NhbGAgZm9yIGRldiBidWlsZHMsIGBwcmRgIGZvciByZWxlYXNlcyB8CnwgYC0tbm9uLWlu" + + "dGVyYWN0aXZlYCB8IERpc2FibGUgYWxsIHN0ZGluIHByb21wdHMgfCBgZmFsc2VgIHwKfCBgLS10" + + "b2tlbj0kSldUYCB8IEFkbWluIEpXVCwgb3ZlcnJpZGVzIHN0b3JlZCBzZXNzaW9uIHwgLSB8Cnwg" + + "YC0tbm8tYXBwbHlgIHwgYGluc3RhbGxgIG9ubHkgLSBlbWl0IFlBTUwsIGRvIG5vdCBrdWJlY3Rs" + + "IGFwcGx5IHwgYGZhbHNlYCB8CnwgYC0tb3V0cHV0PXRleHRcfGpzb25gIHwgTGVnYWN5IGFsaWFz" + + "IGZvciBgLS1qc29uYCAoZGVwcmVjYXRlZCwgcmVtb3ZlZCBpbiBuZXh0IG1ham9yKSB8IGB0ZXh0" + + "YCB8CnwgYC0tcGxhaW5gIHwgRm9yY2UgcGxhaW4gc3RyZWFtaW5nIG91dHB1dCB8IGF1dG8tZGV0" + + "ZWN0IHwKfCBgLS13YWl0IERVUkFUSU9OYCB8IGBjaGVja2Agb25seTsgYmxvY2sgdW50aWwgcGFz" + + "cyB8IC0gfAp8IGAtLWNvbnRyb2wtcGxhbmUtY29udGV4dCBDVFhgIHwga3ViZWN0bCBjb250ZXh0" + + "IGZvciBjb250cm9sIHBsYW5lIChSRVEtMjApIHwgY3VycmVudCBjb250ZXh0IHwKfCBgLS1jb21w" + + "dXRlLXBsYW5lLWNvbnRleHQgQ1RYYCB8IGt1YmVjdGwgY29udGV4dCBmb3IgY29tcHV0ZSBwbGFu" + + "ZSAoUkVRLTIwKSB8IGN1cnJlbnQgY29udGV4dCB8CnwgYC0taWNtcy11cmwgVVJMYCB8IFB1Ymxp" + + "YyBJQ01TIFVSTDsgcmVxdWlyZWQgd2hlbiBjb250ZXh0cyBkaWZmZXIgfCBkZXJpdmVkIGZyb20g" + + "YGJhc2VfaHR0cF91cmxgIHwKfCBgLS1sb2NhbC1vbmx5YCB8IGBjaGVjayAtLXByZWAgb25seTsg" + + "c2tpcCBhbGwga3ViZWN0bCBjb250YWN0IHwgYGZhbHNlYCB8CgojIyBgY2hlY2tgLXNwZWNpZmlj" + + "CgpBdCBsZWFzdCBvbmUgb2YgYC0tcHJlYCwgYC0tY29udHJvbC1wbGFuZWAsIGAtLWNvbXB1dGUt" + + "cGxhbmVgLCBvciBgLS1hbGxgIGlzCnJlcXVpcmVkLiBFYWNoIHNlbGVjdHMgYSByb2xlOyBvbmx5" + + "IHRoZSBzZWxlY3RlZCByb2xlcyBjb250YWN0IGEgY2x1c3Rlci4KCnwgRmxhZyB8IFB1cnBvc2Ug" + + "fCBEZWZhdWx0IHwKfC0tLXwtLS18LS0tfAp8IGAtLXByZWAgfCBQcmUtZmxpZ2h0OiBsb2NhbC1o" + + "b3N0IHRvb2xzIHBsdXMgY2x1c3RlciByZWFkaW5lc3MgfCBgZmFsc2VgIHwKfCBgLS1jb250cm9s" + + "LXBsYW5lYCB8IENvbnRyb2wtcGxhbmUgY2hlY2tzIHwgYGZhbHNlYCB8CnwgYC0tY29tcHV0ZS1w" + + "bGFuZWAgfCBDb21wdXRlLXBsYW5lIGNoZWNrcyB8IGBmYWxzZWAgfAp8IGAtLWFsbGAgfCBFdmVy" + + "eSBjYXRlZ29yeSB8IGBmYWxzZWAgfAp8IGAtLWNsdXN0ZXItbmFtZSBOQU1FYCB8IENsdXN0ZXIg" + + "bmFtZSBmb3IgY29tcHV0ZS1wbGFuZSBjaGVja3MgfCAtIHwKfCBgLS1za2lwLWlub3RpZnktY2hl" + + "Y2tgIHwgU2tpcCB0aGUgcGVyLW5vZGUgaW5vdGlmeS1saW1pdHMgcHJvYmUuIE5lZWRlZCB3aGVu" + + "IHRoZSBrdWJlY29uZmlnIHVzZXIgY2Fubm90IGNyZWF0ZSBwb2RzIGluIGBkZWZhdWx0YC4gRW52" + + "OiBgTlZDRl9DTElfU0VMRkhPU1RFRF9TS0lQX0lOT1RJRllgIHwgYGZhbHNlYCB8CgojIyMgQ2x1" + + "c3Rlci12YWxpZGF0b3IgZmxhZ3MKClRoZSB2YWxpZGF0b3IgcnVucyBhcyBhIEpvYiBpbiB0aGUg" + + "Y2x1c3RlciBiZWluZyBjaGVja2VkLiBUaGUgQ0xJIGNyZWF0ZXMgYQpTZXJ2aWNlQWNjb3VudCwg" + + "Q2x1c3RlclJvbGUsIGFuZCBDbHVzdGVyUm9sZUJpbmRpbmcgZm9yIGl0IGFuZCByZW1vdmVzIHRo" + + "ZW0KYWZ0ZXIgdGhlIHJ1biwgc28gdGhlIGt1YmVjb25maWcgY29udGV4dCBuZWVkcyBwZXJtaXNz" + + "aW9uIHRvIG1hbmFnZSB0aG9zZS4KCnwgRmxhZyB8IFB1cnBvc2UgfCBEZWZhdWx0IHwKfC0tLXwt" + + "LS18LS0tfAp8IGAtLWNsdXN0ZXItdmFsaWRhdG9yLWltYWdlIFJFRmAgfCBWYWxpZGF0b3IgaW1h" + + "Z2UuIFJlc29sdXRpb24gb3JkZXI6IGZsYWcsIGBOVkNGX0NMSV9DTFVTVEVSX1ZBTElEQVRPUl9J" + + "TUFHRWAsIGNvbmZpZyBrZXkgYGNsdXN0ZXJfdmFsaWRhdG9yX2ltYWdlYC4gQSByZWYgd2l0aCBu" + + "byB0YWcgZGlzY292ZXJzIHRoZSBsYXRlc3Qgc3RhYmxlIHRhZyBmcm9tIHRoZSByZWdpc3RyeS4g" + + "VW5zZXQgZXZlcnl3aGVyZSBza2lwcyB0aGUgcHJvYmUgd2l0aCBhIHdhcm5pbmcgfCAtIHwKfCBg" + + "LS1jbHVzdGVyLXZhbGlkYXRvci1yZWdpc3RyaWVzIGhvc3Q6cG9ydCwuLi5gIHwgRXh0cmEgcmVn" + + "aXN0cmllcyB0aGUgY29udHJvbC1wbGFuZSB2YWxpZGF0b3IgcHJvYmVzIGZvciByZWFjaGFiaWxp" + + "dHkuIGBudmNyLmlvYCBpcyBhbHdheXMgcHJvYmVkLiBSZXBlYXRhYmxlIG9yIGNvbW1hLXNlcGFy" + + "YXRlZC4gRW52OiBgTlZDRl9DTElfQ0xVU1RFUl9WQUxJREFUT1JfUkVHSVNUUklFU2A7IGNvbmZp" + + "ZyBrZXkgYGNsdXN0ZXJfdmFsaWRhdG9yX3JlZ2lzdHJpZXNgIHwgYG52Y3IuaW9gIG9ubHkgfAp8" + + "IGAtLWNsdXN0ZXItdmFsaWRhdG9yLXB1bGwtc2VjcmV0IE5BTUVgIHwgZG9ja2VyLXJlZ2lzdHJ5" + + "IFNlY3JldCBpbiBgZGVmYXVsdGAgdXNlZCB0byBwdWxsIHRoZSB2YWxpZGF0b3IgaW1hZ2UuIFdo" + + "ZW4gZW1wdHksIHRoZSBDTEkgbG9va3MgZm9yIG9uZSBpbiB0aGUgTlZDRiBuYW1lc3BhY2VzIGFu" + + "ZCBmYWxscyBiYWNrIHRvIG1pbnRpbmcgb25lIGZyb20gYE5HQ19BUElfS0VZYCB8IGF1dG8tZGV0" + + "ZWN0IHwKfCBgLS1za2lwLWNsdXN0ZXItdmFsaWRhdGlvbmAgfCBTa2lwIHRoZSBpbi1jbHVzdGVy" + + "IHZhbGlkYXRvciBwcm9iZSBlbnRpcmVseS4gRW52OiBgTlZDRl9DTElfU0VMRkhPU1RFRF9TS0lQ" + + "X0NMVVNURVJfVkFMSURBVElPTmAgfCBgZmFsc2VgIHwKfCBgLS1uby1jbGVhbnVwYCB8IEtlZXAg" + + "dGhlIHZhbGlkYXRvciBKb2IgKGFuZCBpdHMgUkJBQykgYWZ0ZXIgdGhlIHJ1biBmb3IgZGVidWdn" + + "aW5nLiBUaGUgbmV4dCBydW4gc3RpbGwgc3dlZXBzIHByaW9yIEpvYnMgfCBgZmFsc2VgIHwKfCBg" + + "LS1zaG93LWxvZ3NgIHwgUHJpbnQgdGhlIHZhbGlkYXRvciB0cmFuc2NyaXB0IHRvIHN0ZGVyciBh" + + "ZnRlciB0aGUgY2hlY2sgZXZlbnRzLiBVc2VmdWwgd2hlbiBwaXBpbmcgYC0tanNvbmAgdG8gYSBz" + + "Y3JpcHQgdGhhdCBhbHNvIHdhbnRzIHRoZSB0cmFuc2NyaXB0IHwgYGZhbHNlYCB8CgojIyBgdXBg" + + "LXNwZWNpZmljCgp8IEZsYWcgfCBQdXJwb3NlIHwgRGVmYXVsdCB8CnwtLS18LS0tfC0tLXwKfCBg" + + "LS1jbHVzdGVyLW5hbWUgTkFNRWAgfCBJQ01TIGNsdXN0ZXIgcm93IGlkZW50aWZpZXIgKHJlcXVp" + + "cmVkKSB8IC0gfAp8IGAtLW5jYS1pZCBJRGAgfCBOQ0EgYWNjb3VudCBJRCB8IGBudmNmLWRlZmF1" + + "bHRgIHwKfCBgLS1yZWdpb24gUkVHSU9OYCB8IENsdXN0ZXIgcmVnaW9uIHwgYHVzLXdlc3QtMWAg" + + "fAp8IGAtLXBsYW4tb25seWAgfCBEcnktcnVuOyBlbWl0IHBoYXNlIHBsYW4gKyBFVEFzIHdpdGhv" + + "dXQgY2hhbmdlcyB8IGBmYWxzZWAgfAoKIyMgYHN0YXR1c2Atc3BlY2lmaWMKCnwgRmxhZyB8IFB1" + + "cnBvc2UgfCBEZWZhdWx0IHwKfC0tLXwtLS18LS0tfAp8IGAtLWNsdXN0ZXItbmFtZSBOQU1FYCB8" + + "IExpbWl0IHRvIG9uZSBjb21wdXRlIHBsYW5lIHwgLSAoY29udHJvbCArIGFsbCBjbHVzdGVycykg" + + "fAp8IGAtLXdhdGNoYCB8IExpdmUgcmUtcmVuZGVyIHwgYGZhbHNlYCB8CnwgYC0td2F0Y2gtaW50" + + "ZXJ2YWwgRFVSYCB8IGAtLXdhdGNoYCBjYWRlbmNlIHwgYDVzYCB8CnwgYC0tY29tcG9uZW50IE5B" + + "TUVgIHwgRmlsdGVyIGNvbXBvbmVudHMgcGFuZWwgfCBhbGwgfAp8IGAtLW5vLWV2ZW50c2AgfCBT" + + "a2lwIGV2ZW50cyBwYW5lbCB8IGBmYWxzZWAgfAoKIyMgYGNsdXN0ZXIgcmVnaXN0ZXJgLXNwZWNp" + + "ZmljCgp8IEZsYWcgfCBQdXJwb3NlIHwgRGVmYXVsdCB8CnwtLS18LS0tfC0tLXwKfCBgLS1uYW1l" + + "IE5BTUVgIHwgQ2x1c3RlciBuYW1lIChyZXF1aXJlZCkgfCAtIHwKfCBgLS1uY2EtaWQgSURgIHwg" + + "TkNBIElEIChyZXF1aXJlZCkgfCAtIHwKfCBgLS1yZWdpb24gUkVHSU9OYCB8IFJlZ2lvbiB8IGB1" + + "cy13ZXN0LTFgIHwKfCBgLS1pY21zLXVybCBVUkxgIHwgSUNNUyBlbmRwb2ludCB8IGZyb20gY29u" + + "ZmlnIHwKfCBgLS1pZ25vcmUtZXhpc3RpbmdgIHwgTWF0Y2gtb3ItY3JlYXRlIGluc3RlYWQgb2Yg" + + "ZmFpbC1vbi1leGlzdHMgfCBgZmFsc2VgIHwKCiMjIGBhcGkta2V5IGdlbmVyYXRlYC1zcGVjaWZp" + + "YwoKfCBGbGFnIHwgUHVycG9zZSB8IERlZmF1bHQgfAp8LS0tfC0tLXwtLS18CnwgYC0tZm9yIGZ1" + + "bmN0aW9uXHx0YXNrYCB8IEdlbmVyYXRlIG9ubHkgdGhlIHNwZWNpZmllZCBrZXkgdHlwZSB8IChv" + + "bWl0IHRvIGdlbmVyYXRlIGJvdGgpIHwKfCBgLS1kZXNjcmlwdGlvbiBURVhUYCB8IEh1bWFuLXJl" + + "YWRhYmxlIGxhYmVsIGZvciB0aGUga2V5IHwgYEdlbmVyYXRlZCBieSBudmNmLWNsaWAgfAp8IGAt" + + "LWV4cGlyZXMtaW4gRFVSQVRJT05gIHwgRXhwaXJ5IG9mZnNldCAoZS5nLiBgMjRoYCwgYDdkYCk7" + + "IHBhcnNlZCBhcyBleHRlbmRlZCBkdXJhdGlvbiB8IGAyNGhgIHwKfCBgLS1zY29wZXMgU0NPUEVb" + + "LFNDT1BFXWAgfCBPdmVycmlkZSBkZWZhdWx0IHNjb3BlczsgcmVxdWlyZXMgYC0tZm9yYCB8IChz" + + "ZXJ2aWNlIGRlZmF1bHRzKSB8CnwgYC0tdmFsaWRhdGVgIHwgVmFsaWRhdGUgZWFjaCBnZW5lcmF0" + + "ZWQga2V5IGltbWVkaWF0ZWx5IGFmdGVyIG1pbnRpbmcgfCBgZmFsc2VgIHwKCkV4dGVuZGVkIGR1" + + "cmF0aW9uIHVuaXRzOiBgc2AgKHNlY29uZHMpLCBgbWAgKG1pbnV0ZXMpLCBgaGAgKGhvdXJzKSwg" + + "YGRgIChkYXlzKSwgYHdgICh3ZWVrcykuCgojIyBgZnVuY3Rpb24gY3JlYXRlYC1zcGVjaWZpYwoK" + + "YC0taW5wdXQtZmlsZSBGSUxFYCBpcyByZWNvbW1lbmRlZCBmb3IgcmVwZWF0YWJsZSBmdW5jdGlv" + + "biBkZWZpbml0aW9ucy4gRm9yIGFkLWhvYyBjcmVhdGVzOgoKfCBGbGFnIHwgUHVycG9zZSB8IERl" + + "ZmF1bHQgfAp8LS0tfC0tLXwtLS18CnwgYC0tbmFtZSBOQU1FYCB8IEZ1bmN0aW9uIG5hbWUgfCAt" + + "IHwKfCBgLS1pbWFnZSBJTUFHRWAgfCBDb250YWluZXIgaW1hZ2UgfCAtIHwKfCBgLS1pbmZlcmVu" + + "Y2UtdXJsIFVSSWAgfCBDb250YWluZXIgaW5mZXJlbmNlIGVuZHBvaW50IHwgLSB8CnwgYC0taW5m" + + "ZXJlbmNlLXBvcnQgUE9SVGAgfCBDb250YWluZXIgaW5mZXJlbmNlIHBvcnQgfCAtIHwKfCBgLS1m" + + "dW5jdGlvbi10eXBlIERFRkFVTFRcfFNUUkVBTUlOR1x8TExNYCB8IEZ1bmN0aW9uIHR5cGUgfCBg" + + "REVGQVVMVGAgfAp8IGAtLWhlbG0tY2hhcnQgQ0hBUlRgIHwgSGVsbSBjaGFydCBVUkwgb3IgT0NJ" + + "IHJlZmVyZW5jZS4gQ2FuIGJlIHVzZWQgd2l0aCBgLS1mdW5jdGlvbi10eXBlPUxMTWAgZm9yIGNo" + + "YXJ0LXBhY2thZ2VkIExMTSB3b3JrbG9hZHMuIHwgLSB8CnwgYC0taGVsbS1jaGFydC1zZXJ2aWNl" + + "IE5BTUVgIHwgS3ViZXJuZXRlcyBTZXJ2aWNlIG5hbWUgZXhwb3NlZCBieSB0aGUgY2hhcnQuIFJl" + + "cXVpcmVkIHdoZW4gYC0taGVsbS1jaGFydGAgaXMgc2V0LiB8IC0gfAp8IGAtLW1vZGVscyBOQU1F" + + "OlZFUlNJT046VVJJYCB8IFN0YW5kYXJkIG1vZGVsIGFydGlmYWN0OyByZXBlYXRhYmxlIHwgLSB8" + + "CnwgYC0tbGxtLW1vZGVsIFNQRUNgIHwgTExNIG1vZGVsIGNvbmZpZzsgZm9ybWF0IGBuYW1lPTxt" + + "b2RlbD4sdXJpcz08dXJpPlx8PHVyaT4scm91dGluZ01ldGhvZD08bWV0aG9kPix0b2tlblJhdGVM" + + "aW1pdD08bGltaXQ+YDsgcmVwZWF0YWJsZS4gVG9rZW4gbGltaXRzIHVzZSBgPHZhbHVlPi08dW5p" + + "dD5gIHdpdGggYFNgLCBgTWAsIGBIYCwgYERgLCBvciBgV2AsIGZvciBleGFtcGxlIGAxMDAwLVNg" + + "LiBVc2UgaW5wdXQgSlNPTiBmb3IgY29tYmluZWQgdG9rZW4gbGltaXRzIGJlY2F1c2UgaW5saW5l" + + "IHNwZWNzIHVzZSBjb21tYXMgYXMgZmllbGQgc2VwYXJhdG9ycy4gfCAtIHwKCkluIEpTT04gYW5k" + + "IGlubGluZSBzcGVjcywgTExNIGZ1bmN0aW9ucyBzZXQgYGZ1bmN0aW9uVHlwZTogIkxMTSJgIGFu" + + "ZCBtb2RlbCByb3V0aW5nIG1ldGFkYXRhIHVuZGVyIGBtb2RlbHNbXS5sbG1Db25maWdgLiBgbGxt" + + "Q29uZmlnLnVyaXNgIGRlY2xhcmVzIHRoZSBPcGVuQUktY29tcGF0aWJsZSB1cHN0cmVhbSBwYXRo" + + "cyBleHBvc2VkIGJ5IHRoZSBtb2RlbC4gQ3VycmVudCBzdXBwb3J0ZWQgcGF0aHMgYXJlIGAvdjEv" + + "Y2hhdC9jb21wbGV0aW9uc2AsIGAvdjEvcmVzcG9uc2VzYCwgYW5kIGAvdjEvZW1iZWRkaW5nc2Au" + + "IGBsbG1Db25maWcucm91dGluZ01ldGhvZGAgYWNjZXB0cyBgcm91bmRfcm9iaW5gLCBgcG93ZXJf" + + "b2ZfdHdvYCwgYGdyb3FfbXVsdGlyZWdpb25gLCBgcHVsc2FyYCwgb3IgYHJhbmRvbWAuCmBsbG1D" + + "b25maWcudG9rZW5SYXRlTGltaXRgIGFjY2VwdHMgb25lIG9yIG1vcmUgY29tbWEtc2VwYXJhdGVk" + + "IHBvc2l0aXZlIGludGVnZXIgdG9rZW4gbGltaXRzIGluIGA8dmFsdWU+LTx1bml0PmAgZm9ybWF0" + + "LiBTdXBwb3J0ZWQgdW5pdHMgYXJlIGBTYCAoc2Vjb25kcyksIGBNYCAobWludXRlcyksIGBIYCAo" + + "aG91cnMpLCBgRGAgKGRheXMpLCBhbmQgYFdgICh3ZWVrcykuIFVzZSBkaXN0aW5jdCB1bml0cyB3" + + "aGVuIGNvbWJpbmluZyBsaW1pdHMsIGZvciBleGFtcGxlIGAxMDAwLVMsNTAwMC1NLDEwMDAwMC1I" + + "LDUwMDAwMC1ELDEwMDAwMDAtV2AgaW4gaW5wdXQgSlNPTi4KCkhlbG0gY2hhcnQgcGFja2FnaW5n" + + "IGlzIGluZGVwZW5kZW50IG9mIGBmdW5jdGlvblR5cGVgLiBGb3IgYSBIZWxtLWNoYXJ0IGJhY2tl" + + "ZCBMTE0gZnVuY3Rpb24sIHNldCBgZnVuY3Rpb25UeXBlOiAiTExNImAsIGBoZWxtQ2hhcnRgLCBg" + + "aGVsbUNoYXJ0U2VydmljZU5hbWVgLCBhbmQgYG1vZGVsc1tdLmxsbUNvbmZpZ2AgaW4gdGhlIHNh" + + "bWUgY3JlYXRlIHJlcXVlc3QuIGBpbmZlcmVuY2VQb3J0YCBtdXN0IGJlIHRoZSBLdWJlcm5ldGVz" + + "IFNlcnZpY2UgcG9ydCBleHBvc2VkIGJ5IGBoZWxtQ2hhcnRTZXJ2aWNlTmFtZWAuCgpMTE0gaW52" + + "b2NhdGlvbiByZXF1ZXN0cyB1c2UgYG1vZGVsOiAiPGZ1bmN0aW9uLWlkPi88bW9kZWwtbmFtZT4i" + + "YC4gVGhlIGZ1bmN0aW9uIElEIHNlbGVjdHMgdGhlIE5WQ0YgZnVuY3Rpb24sIGFuZCB0aGUgbW9k" + + "ZWwgbmFtZSBpcyBmb3J3YXJkZWQgdXBzdHJlYW0uIENoYXQgY29tcGxldGlvbnMgYW5kIFJlc3Bv" + + "bnNlcyBBUEkgcmVxdWVzdHMgY2FuIHVzZSBgeC1tdWx0aS10dXJuLXNlc3Npb24taWRgIGZvciBz" + + "ZXNzaW9uIHN0aWNraW5lc3M7IGVtYmVkZGluZ3MgcmVxdWVzdHMgZG8gbm90LgoKIyMgYGZ1bmN0" + + "aW9uIHVwZGF0ZWAtc3BlY2lmaWMKCnwgRmxhZyB8IFB1cnBvc2UgfCBEZWZhdWx0IHwKfC0tLXwt" + + "LS18LS0tfAp8IGAtLXRhZ3MgVEFHWyxUQUddYCB8IFJlcGxhY2UgZnVuY3Rpb24gdGFncyB8IC0g" + + "fAp8IGAtLWxsbS1tb2RlbC11cGRhdGUgU1BFQ2AgfCBMTE0gbW9kZWwgdXBkYXRlOyBmb3JtYXQg" + + "YG5hbWU9PG1vZGVsPixyb3V0aW5nTWV0aG9kPTxtZXRob2Q+LHRva2VuUmF0ZUxpbWl0PTxsaW1p" + + "dD5gOyByZXBlYXRhYmxlLiBSb3V0aW5nIG1ldGhvZHMgbWF0Y2ggYC0tbGxtLW1vZGVsYC4gVG9r" + + "ZW4gbGltaXQgZXhhbXBsZTogYDEwMDAtU2AuIFVzZSBpbnB1dCBKU09OIGZvciBjb21iaW5lZCB0" + + "b2tlbiBsaW1pdHMuIHwgLSB8CgpJbiBKU09OLCBgZnVuY3Rpb24gdXBkYXRlYCBhY2NlcHRzIGBt" + + "b2RlbFVwZGF0ZXNbXWAgZW50cmllcyB3aXRoIGBtb2RlbE5hbWVgIGFuZCBgbGxtQ29uZmlnLnJv" + + "dXRpbmdNZXRob2RgIGFuZC9vciBgbGxtQ29uZmlnLnRva2VuUmF0ZUxpbWl0YC4gYHVyaXNgIGFy" + + "ZSBjcmVhdGUtdGltZSBtb2RlbCBtZXRhZGF0YSBhbmQgYXJlIG5vdCBwYXJ0IG9mIG1vZGVsIHVw" + + "ZGF0ZXMuCgojIyBgZnVuY3Rpb24gZGVwbG95IGNyZWF0ZWAtc3BlY2lmaWMKCmAtLWlucHV0LWZp" + + "bGUgRklMRWAgaXMgcmVjb21tZW5kZWQgKGZ1bGwgSlNPTiBzcGVjKS4gRm9yIGFkLWhvYyBvbmUt" + + "c2hvdCB1c2U6Cgp8IEZsYWcgfCBQdXJwb3NlIHwgRGVmYXVsdCB8CnwtLS18LS0tfC0tLXwKfCBg" + + "LS1mdW5jdGlvbi1pZCBJRGAgfCBGdW5jdGlvbiBJRCAocmVxdWlyZWQpIHwgLSB8CnwgYC0tZ3B1" + + "IE5BTUVgIHwgR1BVIGZhbWlseSB8IGBIMTAwYCB8CnwgYC0taW5zdGFuY2UtdHlwZSBUWVBFYCB8" + + "IFNLVSB8IGBOQ1AuR1BVLkgxMDBfMXhgIHwKfCBgLS1taW4taW5zdGFuY2VzIE5gIHwgTWluIHJl" + + "cGxpY2FzIHwgYDFgIHwKfCBgLS1tYXgtaW5zdGFuY2VzIE5gIHwgTWF4IHJlcGxpY2FzIHwgYDFg" + + "IHwKfCBgLS1tYXgtcmVxdWVzdC1jb25jdXJyZW5jeSBOYCB8IENvbmN1cnJlbmN5IHwgYDBgICh1" + + "bnNldDsgc2VydmVyIGRlZmF1bHQgYXBwbGllcykgfAp8IGAtLWNsdXN0ZXJzIE5BTUVbLE5BTUVd" + + "YCB8IFRhcmdldCBzcGVjaWZpYyBjb21wdXRlIGNsdXN0ZXJzIHwgKGFueSBtYXRjaGluZyBTS1Up" + + "IHwKCiMjIGB0YXNrIGNyZWF0ZWAtc3BlY2lmaWMKCmAtLWlucHV0LWZpbGUgRklMRWAgaXMgcmVj" + + "b21tZW5kZWQgZm9yIHJlcGVhdGFibGUgdGFzayBkZWZpbml0aW9ucy4gRm9yIGFkLWhvYyB1c2U6" + + "Cgp8IEZsYWcgfCBQdXJwb3NlIHwgTm90ZXMgfAp8LS0tfC0tLXwtLS18CnwgYC0tbmFtZSBOQU1F" + + "YCB8IFRhc2sgbmFtZSAocmVxdWlyZWQpIHwgMS0xMjggY2hhcnMsIGBeW2EtejAtOUEtWl1bYS16" + + "MC05QS1aXC1fXSokYCB8CnwgYC0tZ3B1IEdQVWAgfCBHUFUgbmFtZSAocmVxdWlyZWQgd2l0aG91" + + "dCBgLS1pbnB1dC1maWxlYCkgfCBFeGFtcGxlOiBgSDEwMGAgfAp8IGAtLWluc3RhbmNlLXR5cGUg" + + "VFlQRWAgfCBJbnN0YW5jZSB0eXBlIChyZXF1aXJlZCB3aXRob3V0IGAtLWlucHV0LWZpbGVgKSB8" + + "IEV4YW1wbGU6IGBOQ1AuR1BVLkgxMDBfMXhgIHwKfCBgLS1pbWFnZSBJTUFHRWAgfCBDb250YWlu" + + "ZXIgaW1hZ2UgfCBNdXR1YWxseSBleGNsdXNpdmUgd2l0aCBgLS1oZWxtLWNoYXJ0YCB8CnwgYC0t" + + "aGVsbS1jaGFydCBDSEFSVGAgfCBIZWxtIGNoYXJ0IFVSTCBvciBPQ0kgcmVmZXJlbmNlIHwgTXV0" + + "dWFsbHkgZXhjbHVzaXZlIHdpdGggYC0taW1hZ2VgIHwKfCBgLS1pbnB1dC1maWxlIEZJTEVgIHwg" + + "SlNPTiB0YXNrIHNwZWMgZmlsZSB8IENMSSBmbGFncyBvdmVycmlkZSBKU09OIHZhbHVlcyB3aGVu" + + "IGJvdGggYXJlIHNldCB8CnwgYC0tYmFja2VuZCBCQUNLRU5EYCB8IEJhY2tlbmQgLyBDU1AgfCAt" + + "IHwKfCBgLS1jbHVzdGVycyBOQU1FWyxOQU1FXWAgfCBTcGVjaWZpYyBjbHVzdGVycyB3aXRoaW4g" + + "dGhlIGluc3RhbmNlIHwgQ29tbWEtc2VwYXJhdGVkIHwKfCBgLS1jb250YWluZXItYXJncyBBUkdT" + + "YCB8IEFyZ3MgcGFzc2VkIHdoZW4gbGF1bmNoaW5nIHRoZSBjb250YWluZXIgfCBTaW5nbGUgc3Ry" + + "aW5nLCBlLmcuIGAiLS1lcG9jaHMgMTAgLS1iYXRjaC1zaXplIDMyImAgfAp8IGAtLWNvbnRhaW5l" + + "ci1lbnYgTkFNRT12YWx1ZWAgfCBDb250YWluZXIgZW52aXJvbm1lbnQgdmFyaWFibGU7IHJlcGVh" + + "dGFibGUgfCAtIHwKfCBgLS1zZWNyZXRzIE5BTUU9dmFsdWVgIHwgU2VjcmV0IGVudmlyb25tZW50" + + "IHZhcmlhYmxlOyByZXBlYXRhYmxlOyBlbmNyeXB0ZWQgYXQgcmVzdCB8IC0gfAp8IGAtLW1heC1y" + + "dW50aW1lIERVUkFUSU9OYCB8IE1heCB3YWxsLWNsb2NrIHJ1biB0aW1lIChJU08gODYwMSwgZS5n" + + "LiBgUFQ0SGApIHwgTm8gZGVmYXVsdDsgb21pdCBmb3Igbm8gdGltZSBsaW1pdCB8CnwgYC0tbWF4" + + "LXF1ZXVlZCBEVVJBVElPTmAgfCBNYXggdGltZSBpbiBxdWV1ZSBiZWZvcmUgY2FuY2VsbGF0aW9u" + + "IChJU08gODYwMSkgfCBTZXJ2ZXIgZGVmYXVsdCBgUFQ3MkhgIHwKfCBgLS10ZXJtaW5hdGlvbi1n" + + "cmFjZSBEVVJBVElPTmAgfCBHcmFjZSBwZXJpb2QgYWZ0ZXIgc3RvcCBzaWduYWwgKElTTyA4NjAx" + + "KSB8IFNlcnZlciBkZWZhdWx0IGBQVDFIYCB8CnwgYC0tcmVzdWx0LXN0cmF0ZWd5IFVQTE9BRFx8" + + "Tk9ORWAgfCBIb3cgdG8gaGFuZGxlIHRhc2sgb3V0cHV0IGFydGlmYWN0cyB8IC0gfAp8IGAtLXJl" + + "c3VsdHMtbG9jYXRpb24gTE9DQVRJT05gIHwgUmVzdWx0IHVwbG9hZCB0YXJnZXQsIGZvcm1hdCBg" + + "b3JnLW5hbWUvW3RlYW0tbmFtZS9dbW9kZWwtbmFtZWA7IHJlcXVpcmVkIHdoZW4gYC0tcmVzdWx0" + + "LXN0cmF0ZWd5PVVQTE9BRGAgfCAtIHwKfCBgLS1tb2RlbHMgTkFNRTpWRVJTSU9OOlVSSWAgfCBN" + + "b2RlbCBhcnRpZmFjdDsgcmVwZWF0YWJsZSB8IC0gfAp8IGAtLXJlc291cmNlcyBOQU1FOlZFUlNJ" + + "T046VVJJYCB8IFJlc291cmNlIGFydGlmYWN0OyByZXBlYXRhYmxlIHwgLSB8CnwgYC0tdGFncyBU" + + "QUdbLFRBR11gIHwgVGFzayB0YWdzIHwgQ29tbWEtc2VwYXJhdGVkIHwKfCBgLS1kZXNjcmlwdGlv" + + "biBURVhUYCB8IFRhc2sgZGVzY3JpcHRpb24gfCAtIHwKfCBgLS1sb2dzLXRlbGVtZXRyeS1pZCBV" + + "VUlEYCB8IExvZ3MgdGVsZW1ldHJ5IGVuZHBvaW50IElEIHwgLSB8CnwgYC0tbWV0cmljcy10ZWxl" + + "bWV0cnktaWQgVVVJRGAgfCBNZXRyaWNzIHRlbGVtZXRyeSBlbmRwb2ludCBJRCB8IC0gfAp8IGAt" + + "LXRyYWNlcy10ZWxlbWV0cnktaWQgVVVJRGAgfCBUcmFjZXMgdGVsZW1ldHJ5IGVuZHBvaW50IElE" + + "IHwgLSB8CgpQSwcIDgwGlYErAACBKwAAUEsDBBQACAAAAAAAIQAAAAAAAAAAAAAAAAA3AAkAZGF0" + + "YS9udmNmLXNlbGYtbWFuYWdlZC1jbGkvcmVmZXJlbmNlL3Ryb3VibGVzaG9vdGluZy5tZFVUBQAB" + + "AKbOEiMgVHJvdWJsZXNob290aW5nCgpLbm93biBlcnJvcnMg4oaSIGRpYWdub3N0aWMgY29tbWFu" + + "ZCDihpIgcmVtZWRpYXRpb24uIEtlZXAgaW4gc3luYyB3aXRoIHRoZSBzdHJ1Y3R1cmVkIGBwaGFz" + + "ZV9mYWlsZWRgIGV2ZW50cyB0aGUgQ0xJIGVtaXRzIChSRVEtMTUpIOKAlCBldmVyeSBlbnRyeSBi" + + "ZWxvdyBzaG91bGQgbWFwIHRvIGFuIGBlcnJDYXRlZ29yeWAgYW5kIGEgYHJlbWVkaWF0aW9uYCBh" + + "cnJheS4KCiMjIFByZS1mbGlnaHQKCnwgU3ltcHRvbSB8IENhdXNlIHwgUmVtZWRpYXRpb24gfAp8" + + "LS0tfC0tLXwtLS18CnwgYGt1YmVjdGwgbm90IG9uIFBBVEhgIHwgT3BlcmF0b3IncyBgJFBBVEhg" + + "IGRvZXNuJ3QgaW5jbHVkZSBrdWJlY3RsIHwgSW5zdGFsbCBrdWJlY3RsIDEuMjgrOiBodHRwczov" + + "L2t1YmVybmV0ZXMuaW8vZG9jcy90YXNrcy90b29scy9pbnN0YWxsLWt1YmVjdGwvIHwKfCBgaGVs" + + "bWZpbGUgbm90IG9uIFBBVEhgIHwgU2FtZSB8IGh0dHBzOi8vZ2l0aHViLmNvbS9oZWxtZmlsZS9o" + + "ZWxtZmlsZSNpbnN0YWxsYXRpb24gfAp8IGBoZWxtIG5vdCBvbiBQQVRIYCB8IFNhbWUgfCBodHRw" + + "czovL2hlbG0uc2gvZG9jcy9pbnRyby9pbnN0YWxsLyB8CnwgYEdhdGV3YXkgQVBJIENSRHMgbm90" + + "IGluc3RhbGxlZGAgfCBlbnZveS1nYXRld2F5IHByZXJlcSBtaXNzaW5nIHwgYGhlbG0gaW5zdGFs" + + "bCBlZyBvY2k6Ly9kb2NrZXIuaW8vZW52b3lwcm94eS9nYXRld2F5LWhlbG0gLS1uYW1lc3BhY2U9" + + "ZW52b3ktZ2F0ZXdheS1zeXN0ZW0gLS1jcmVhdGUtbmFtZXNwYWNlYCB8CnwgYGRlZmF1bHQgU3Rv" + + "cmFnZUNsYXNzIG5vdCBhdmFpbGFibGVgIHwgQ2x1c3RlciBoYXMgbm8gZGVmYXVsdCBTQyB8IEFu" + + "bm90YXRlIG9uZTogYGt1YmVjdGwgcGF0Y2ggc2MgPG5hbWU+IC1wICd7Im1ldGFkYXRhIjp7ImFu" + + "bm90YXRpb25zIjp7InN0b3JhZ2VjbGFzcy5rdWJlcm5ldGVzLmlvL2lzLWRlZmF1bHQtY2xhc3Mi" + + "OiJ0cnVlIn19fSdgIHwKfCBgR1BVIG9wZXJhdG9yIG5vdCBpbnN0YWxsZWRgIChjb21wdXRlLXBs" + + "YW5lKSB8IG52aWRpYSBHUFUgb3BlcmF0b3IgbWlzc2luZyB8IEluc3RhbGwgcGVyIGh0dHBzOi8v" + + "ZG9jcy5udmlkaWEuY29tL2RhdGFjZW50ZXIvY2xvdWQtbmF0aXZlL2dwdS1vcGVyYXRvci9sYXRl" + + "c3QvaW5zdGFsbC1ncHUtb3BlcmF0b3IuaHRtbCwgT1IgdXNlIGBmYWtlLWdwdS1vcGVyYXRvcmAg" + + "Zm9yIGRldiB8CnwgYEdQVSBub2RlIGxhYmVscyBtaXNzaW5nYCAoY29tcHV0ZS1wbGFuZSkgfCBO" + + "b2RlcyBuZWVkIGBudmlkaWEuY29tL2dwdS5mYW1pbHlgIGV0Yy4gfCBTZXQgYC0tazNzLW5vZGUt" + + "bGFiZWwgbnZpZGlhLmNvbS9ncHUuZmFtaWx5PWhvcHBlckBhZ2VudDpOYCBmb3IgazNkIHwKCiMj" + + "IEF1dGgKCnwgU3ltcHRvbSB8IENhdXNlIHwgUmVtZWRpYXRpb24gfAp8LS0tfC0tLXwtLS18Cnwg" + + "YGFkbWluIHRva2VuIHJlcXVpcmVkYCAoaW5pdCBub3QgcnVuKSB8IE5vIGB+Ly5udmNmLWNsaS5z" + + "dGF0ZWAgYW5kIGAtLXRva2VuYCBub3QgcGFzc2VkIHwgYG52Y2YtY2xpIGluaXRgIChpbnRlcmFj" + + "dGl2ZSkgb3IgYC0tdG9rZW49JEpXVCAtLW5vbi1pbnRlcmFjdGl2ZWAgKENJKSB8CnwgYFNpZ25l" + + "ZCBKV1QgcmVqZWN0ZWQ6IEFub3RoZXIgYWxnb3JpdGhtIGV4cGVjdGVkLCBvciBubyBtYXRjaGlu" + + "ZyBrZXkocykgZm91bmRgIHwgU3RhbGUgc2Vzc2lvbi5qc29uIGZyb20gYSBkaWZmZXJlbnQgY29u" + + "dHJvbCBwbGFuZSB8IGBybSB+Ly5udmNmLWNsaS5zdGF0ZWAgdGhlbiBgbnZjZi1jbGkgaW5pdGAg" + + "YWdhaW4gfAp8IGA0MDMgbWlzc2luZyByZXF1ZXN0ZWQgYXV0aG9yaXRpZXNgIChmdW5jdGlvbiBp" + + "bnZva2UpIHwgQWRtaW4gdG9rZW4gZG9lc24ndCBoYXZlIGBpbnZva2VfZnVuY3Rpb25gIHNjb3Bl" + + "IHwgYG52Y2YtY2xpIGFwaS1rZXkgZ2VuZXJhdGUgLS1kZXNjcmlwdGlvbj3igKZgIHRoZW4gcmUt" + + "cnVuIGludm9rZSB8CgojIyBJbnN0YWxsIC8gYHVwYAoKfCBTeW1wdG9tIHwgQ2F1c2UgfCBSZW1l" + + "ZGlhdGlvbiB8CnwtLS18LS0tfC0tLXwKfCBIZWxtIGB0aW1lZCBvdXQgd2FpdGluZyBmb3IgY2Fz" + + "c2FuZHJhYCB8IENhc3NhbmRyYSBTdGF0ZWZ1bFNldCBQVkMgc3R1Y2sgYFBlbmRpbmdgIHwgQ29u" + + "ZmlybSBkZWZhdWx0IFN0b3JhZ2VDbGFzczsgY2hlY2sgYGt1YmVjdGwgZ2V0IHB2LHB2YyAtbiBj" + + "YXNzYW5kcmEtc3lzdGVtYCB8CnwgYEludmFsaWQgR1BVICdOQ1AuR1BVLkgxMDAnIHNwZWNpZmll" + + "ZGAgKGZ1bmN0aW9uIGRlcGxveSkgfCBXcm9uZyBmaWVsZCDigJQgYGdwdWAgaXMgdGhlIGZhbWls" + + "eSwgbm90IHRoZSBTS1UgfCBVc2UgYCJncHUiOiAiSDEwMCJgLCBgImluc3RhbmNlVHlwZSI6ICJO" + + "Q1AuR1BVLkgxMDBfMXgiYCB8CnwgYHJlZ2lvbiBtdXN0IGJlIHByb3ZpZGVkYCAoY2x1c3RlciBy" + + "ZWdpc3RlciAvIGluc3RhbGwgLS1jb21wdXRlLXBsYW5lKSB8IGAtLXJlZ2lvbmAgZW1wdHkgKyBg" + + "Q0xVU1RFUl9SRUdJT05gIGVudiBlbXB0eSB8IFBhc3MgYC0tcmVnaW9uPXVzLXdlc3QtMWAgKG9y" + + "IGFueSBub24tZW1wdHkgdmFsdWUpIHwKfCBgcmVxdWlyZWRFbnYgIk5DQV9JRCIgaXMgbm90IHNl" + + "dGAgKGhlbG1maWxlIGVycm9yIGR1cmluZyBjb21wdXRlLXBsYW5lIGFwcGx5KSB8IE9sZGVyIG52" + + "Y2YtY2xpIGJlZm9yZSBjb21taXQgYDZhYTU3MDRgOyBFeHRyYUVudiBub3QgcHJvcGFnYXRpbmcg" + + "TkNBX0lEIHwgVXBncmFkZSBgbnZjZi1jbGlgIHRvIGEgcmVsZWFzZSBhZnRlciBgNmFhNTcwNGAg" + + "fAp8IGBudmNhLW9wZXJhdG9yOiBJbWFnZVB1bGxCYWNrT2ZmYCBmb3IgYG52Y2Etb3BlcmF0b3I6" + + "cHNhdGAgfCBJbWFnZSBub3QgaW4gY2x1c3RlciByZWdpc3RyeTsgbXVsdGktY2x1c3RlciBidWls" + + "ZCBpcyBsb2NhbCB8IGBrM2QgaW1hZ2UgaW1wb3J0IG52Y3IuaW8vLi4uL252Y2Etb3BlcmF0b3I6" + + "cHNhdCAtYyA8Y2x1c3Rlcj5gIHwKCiMjIENvbXB1dGUtcGxhbmUgcnVudGltZQoKfCBTeW1wdG9t" + + "IHwgQ2F1c2UgfCBSZW1lZGlhdGlvbiB8CnwtLS18LS0tfC0tLXwKfCBOVkNBIGFnZW50IENyYXNo" + + "TG9vcEJhY2tPZmYgd2l0aCBgSFRUUCA0MDFgIG9uIGAvdjEvbnZjYS9jbHVzdGVycy8uLi4vcmVn" + + "aXN0ZXJgIHwgU3RhbGUgYG91dC88Y2x1c3Rlcj4tcmVnaXN0ZXItdmFsdWVzLnlhbWxgIGZyb20g" + + "cHJpb3IgcmVnaXN0ZXI7IGNsdXN0ZXIgSUQgZG9lc24ndCBtYXRjaCBJQ01TIHwgRGVsZXRlIHRo" + + "ZSBzdGFsZSBmaWxlOyByZS1ydW4gYG52Y2YtY2xpIHNlbGYtaG9zdGVkIHVwYCAoaWRlbXBvdGVu" + + "dCByZWdpc3RlciB3cml0ZXMgYSBmcmVzaCBmaWxlKSB8CnwgYE5vIGNsdXN0ZXIgZm91bmQgd2l0" + + "aCB2YWxpZCBKV0tTIGZvciBjbHVzdGVyIElEOiA8aWQ+YCAoSUNNUyBsb2cpIHwgSldLUyBpbiBJ" + + "Q01TIGRvZXNuJ3QgbWF0Y2ggd2hhdCBjb21wdXRlLXBsYW5lIEs4cyBpcyBjdXJyZW50bHkgc2ln" + + "bmluZyB8IGBudmNmLWNsaSBjbHVzdGVyIHJvdGF0ZSAtLWNsdXN0ZXItaWQ9PGlkPmAgfAp8IEZ1" + + "bmN0aW9uIHBvZCBgSW1hZ2VQdWxsQmFja09mZmAgaW4gYG52Y2YtYmFja2VuZGAgfCBJbWFnZS1j" + + "cmVkZW50aWFsLWhlbHBlciBjb25maWcgbWlzc2luZyBvciB3cm9uZyB8IGBrdWJlY3RsIGRlc2Ny" + + "aWJlIHBvZCAtbiBudmNmLWJhY2tlbmQgPHBvZD5gOyBjaGVjayB0aGUgcHVsbCBzZWNyZXQgY29u" + + "ZmlnIHwKfCBGdW5jdGlvbiBkZXBsb3kgc3R1Y2sgYERFUExPWUlOR2AgZm9yID41IG1pbiB8IE5B" + + "VFMgc3RyZWFtIGluaXQgbGFnIChjb2xkLWNsdXN0ZXIpIOKAlCB3YWl0LCBvciBjaGVjayBOQVRT" + + "IGF1dGgtY2FsbG91dCBoZWFsdGggfCBga3ViZWN0bCBsb2dzIC1uIG5hdHMtc3lzdGVtIC1sIGFw" + + "cC5rdWJlcm5ldGVzLmlvL25hbWU9bmF0cy1hdXRoLWNhbGxvdXQtc2VydmljZWAgfAoKIyMgVGFz" + + "a3MKCnwgU3ltcHRvbSB8IENhdXNlIHwgUmVtZWRpYXRpb24gfAp8LS0tfC0tLXwtLS18CnwgYHRh" + + "c2sgY3JlYXRlYCByZXR1cm5zIGBNaXNzaW5nIDxUWVBFPiByZWdpc3RyeSBjcmVkZW50aWFsIGZv" + + "ciBob3N0bmFtZWAsIG9yIGtlZXBzIHVzaW5nIGEgcHJldmlvdXMgY3JlZGVudGlhbCB2YWx1ZSwg" + + "c2hvcnRseSBhZnRlciBgcmVnaXN0cnktY3JlZGVudGlhbCBhZGQvdXBkYXRlL2RlbGV0ZWAgd2hp" + + "bGUgYHJlZ2lzdHJ5LWNyZWRlbnRpYWwgbGlzdGAvYGdldGAgYWxyZWFkeSBzaG93IHRoZSBuZXcg" + + "dmFsdWUgfCBFeHBlY3RlZCBwcm9wYWdhdGlvbiBkZWxheTogTlZDVCBjYWNoZXMgdGhlIGFjY291" + + "bnQncyByZWdpc3RyeSBjcmVkZW50aWFscyB3aXRoIGBudmN0Lm52Y2YuY2FjaGUtdHRsYCAoZGVm" + + "YXVsdCBgUFQ1TWAsIGFib3V0IDUgbWluKSBhbmQgYXBwbGllcyB0aGUgY2hhbmdlIHdoZW4gdGhh" + + "dCBjYWNoZWQgY29weSByZWZyZXNoZXMgfCBXYWl0IHVwIHRvIGFib3V0IDUgbWluIGFuZCByZXRy" + + "eSwgb3IgYGt1YmVjdGwgLW4gbnZjZiByb2xsb3V0IHJlc3RhcnQgZGVwbG95bWVudC9udmN0LWFw" + + "aWAgdG8gYXBwbHkgaW1tZWRpYXRlbHkgfApQSwcI864ThHQRAAB0EQAAUEsDBBQACAAAAAAAIQAA" + + "AAAAAAAAAAAAAAAsAAkAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24vU0tJTEwu" + + "bWRVVAUAAQCmzhItLS0KbmFtZTogbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uCmRlc2Ny" + + "aXB0aW9uOiA+LQogIEluc3RhbGwgYW5kIG9wZXJhdGUgTlZDRiBzZWxmLWhvc3RlZCBjb250cm9s" + + "LXBsYW5lIGFuZCBzZXBhcmF0ZSBjb21wdXRlLXBsYW5lCiAgc3RhY2tzLiBDb3ZlcnMgSGVsbWZp" + + "bGUgdmFsdWVzIGFuZCBDTEkgcHJvZmlsZSBpbnN0YWxsYXRpb24gZmxvd3MsIHRlYXJkb3duLAog" + + "IHZhbHVlcyBvdmVycmlkZXMsIHB1bGwgc2VjcmV0cywgYW5kIHRyb3VibGVzaG9vdGluZy4gVXNl" + + "IGZvcgogIG52Y2Ytc2VsZi1tYW5hZ2VkLXN0YWNrLCBudmNmLWNvbXB1dGUtcGxhbmUtc3RhY2ss" + + "IHNwbGl0IGNvbXB1dGUtcGxhbmUKICBpbnN0YWxsYXRpb24sIGNvbnRyb2wtcGxhbmUgaW5zdGFs" + + "bGF0aW9uLCBDTEktZ2VuZXJhdGVkIGNvbnRyb2wtcGxhbmUKICBwcm9maWxlcywgSGVsbWZpbGUs" + + "IHNlbGYtbWFuYWdlZCwgb3Igc2VsZi1ob3N0ZWQgZGVwbG95bWVudHMuIERvIE5PVCB1c2UgZm9y" + + "CiAgbG9jYWwgazNkIGVudmlyb25tZW50czsgdXNlIHRoZSBsb2NhbCBrM2QgZGV2ZWxvcG1lbnQg" + + "d29ya2Zsb3cgaW5zdGVhZC4KbGljZW5zZTogQXBhY2hlLTIuMApjb21wYXRpYmlsaXR5OiBSZXF1" + + "aXJlcyBoZWxtZmlsZSA+PSAxLjEuMCA8IDEuMi4wLCBoZWxtID49IDMuMTIsIGhlbG0tZGlmZiBw" + + "bHVnaW4sIGt1YmVjdGwgbWF0Y2hpbmcgY2x1c3RlciB2ZXJzaW9uCmF1dGhvcjogIm52Y2YtY29y" + + "ZS1lbmcgPG52Y2YtY29yZS1lbmdAZXhjaGFuZ2UubnZpZGlhLmNvbT4iCnZlcnNpb246ICIxLjAu" + + "MCIKdGFnczogW252Y2YsIHNlbGYtbWFuYWdlZCwgaGVsbWZpbGUsIHNlbGYtaG9zdGVkLCBjb250" + + "cm9sLXBsYW5lLCBjb21wdXRlLXBsYW5lLCBjbGktcHJvZmlsZSwgaW5zdGFsbGF0aW9uLCBkZXBs" + + "b3ltZW50LCBwdWxsLXNlY3JldHNdCnRvb2xzOiBbU2hlbGwsIFJlYWQsIEVkaXQsIEdyZXAsIEds" + + "b2JdCm1ldGFkYXRhOgogIGludGVybmFsOiBmYWxzZQogIGF1dGhvcjogIm52Y2YtY29yZS1lbmcg" + + "PG52Y2YtY29yZS1lbmdAZXhjaGFuZ2UubnZpZGlhLmNvbT4iCiAgdmVyc2lvbjogIjEuMCIKICB0" + + "YWdzOiBbbnZjZiwgc2VsZi1tYW5hZ2VkLCBoZWxtZmlsZSwgc2VsZi1ob3N0ZWQsIGNvbnRyb2wt" + + "cGxhbmUsIGNvbXB1dGUtcGxhbmUsIGNsaS1wcm9maWxlLCBpbnN0YWxsYXRpb24sIGRlcGxveW1l" + + "bnQsIHB1bGwtc2VjcmV0c10KICBsYW5ndWFnZXM6IFtiYXNoLCB5YW1sXQogIGZyYW1ld29ya3M6" + + "IFtoZWxtZmlsZSwgaGVsbSwga3ViZWN0bF0KICBkb21haW46IGNsb3VkLWluZnJhc3RydWN0dXJl" + + "Ci0tLQoKIyBOVkNGIFNlbGYtTWFuYWdlZCBTdGFjayBPcGVyYXRpb25zCgpPcGVyYXRpb25hbCBn" + + "dWlkZSBmb3IgbWF0Y2hpbmcgTlZDRiBjb250cm9sLXBsYW5lIGFuZCBjb21wdXRlLXBsYW5lIEhl" + + "bG1maWxlIGJ1bmRsZXMuCgojIyBJbnN0cnVjdGlvbnMKClVzZSB0aGlzIHNraWxsIGZvciBpbnN0" + + "YWxsLCB1cGdyYWRlLCBvciB0ZWFyZG93biB3b3JrIGluIG1hdGNoaW5nIGBudmNmLXNlbGYtbWFu" + + "YWdlZC1zdGFja2AgYW5kIGBudmNmLWNvbXB1dGUtcGxhbmUtc3RhY2tgIGJ1bmRsZXM7IGtlZXAg" + + "SGVsbWZpbGUgdmFsdWVzIGFuZCBDTEkgcHJvZmlsZSBoYW5kb2ZmcyBzZXBhcmF0ZS4gRm9yIGBm" + + "dW5jdGlvblR5cGU6ICJMTE0iYCwgcmVhZCBbTExNIEZ1bmN0aW9uIEVuYWJsZW1lbnRdKHJlZmVy" + + "ZW5jZXMvaGVsbWZpbGUtc3RydWN0dXJlLm1kI2xsbS1mdW5jdGlvbi1lbmFibGVtZW50KS4KCiMj" + + "IFByZXJlcXVpc2l0ZXMKCkFzayBmb3IgdGhlIGV4dHJhY3RlZCBgbnZjZi1zZWxmLW1hbmFnZWQt" + + "c3RhY2tgIHBhdGguIEZvciBzcGxpdCBpbnN0YWxsYXRpb24sCmFsc28gcmVxdWlyZSB0aGUgbWF0" + + "Y2hpbmctdmVyc2lvbiBgbnZjZi1jb21wdXRlLXBsYW5lLXN0YWNrYCBwYXRoLiBWZXJpZnkgYm90" + + "aDoKCmBgYGJhc2gKbHMgPGNvbnRyb2wtcGxhbmUtc3RhY2s+L2hlbG1maWxlLmQvIDxjb250cm9s" + + "LXBsYW5lLXN0YWNrPi9lbnZpcm9ubWVudHMvIDxjb250cm9sLXBsYW5lLXN0YWNrPi9zZWNyZXRz" + + "LyA8Y29udHJvbC1wbGFuZS1zdGFjaz4vZ2xvYmFsLnlhbWwuZ290bXBsCmxzIDxjb21wdXRlLXBs" + + "YW5lLXN0YWNrPi9oZWxtZmlsZS5kLyA8Y29tcHV0ZS1wbGFuZS1zdGFjaz4vZW52aXJvbm1lbnRz" + + "LyA8Y29tcHV0ZS1wbGFuZS1zdGFjaz4vZ2xvYmFsLnlhbWwuZ290bXBsCmBgYAoKSWYgZWl0aGVy" + + "IGRpcmVjdG9yeSBpcyBtaXNzaW5nLCBkb3dubG9hZCBtYXRjaGluZyBidW5kbGUgdmVyc2lvbnMg" + + "ZnJvbSBOR0M6CgpgYGBiYXNoCm5nYyByZWdpc3RyeSByZXNvdXJjZSBkb3dubG9hZC12ZXJzaW9u" + + "IDxvcmc+L252Y2Ytc2VsZi1tYW5hZ2VkLXN0YWNrOjx2ZXJzaW9uPgpuZ2MgcmVnaXN0cnkgcmVz" + + "b3VyY2UgZG93bmxvYWQtdmVyc2lvbiA8b3JnPi9udmNmLWNvbXB1dGUtcGxhbmUtc3RhY2s6PHZl" + + "cnNpb24+CmBgYAoKQ29udHJvbC1wbGFuZSBjb21tYW5kcyBiZWxvdyBhc3N1bWUgdGhlIGNvbnRy" + + "b2wtcGxhbmUgYnVuZGxlIHJvb3QuIFNwbGl0LWZsb3cKY29tbWFuZHMgYW5kIHJvb3Qgc3Vic3Rp" + + "dHV0aW9uIGFyZSBpbgpbU3BsaXQgQ29tcHV0ZS1QbGFuZSBJbnN0YWxsYXRpb25dKHJlZmVyZW5j" + + "ZXMvY29tcHV0ZS1wbGFuZS1pbnN0YWxsYXRpb24ubWQpLgoKIyMgQmVmb3JlIFlvdSBTdGFydAoK" + + "VmVyaWZ5IHRvb2xpbmcgYW5kIGNvbnRleHQgYmVmb3JlIGFueSBvcGVyYXRpb246CgpgYGBiYXNo" + + "CmhlbG1maWxlIC0tdmVyc2lvbiAgICMgTXVzdCBiZSAxLjEueCAoMS4yLjAgcmVtb3ZlZCBzZXF1" + + "ZW50aWFsIG1vZGUpCmhlbG0gdmVyc2lvbiAgICAgICAgICMgTXVzdCBiZSA+PSAzLjEyCmhlbG0g" + + "cGx1Z2luIGxpc3QgICAgICMgTXVzdCBpbmNsdWRlIGhlbG0tZGlmZiA+PSAzLjExCmt1YmVjdGwg" + + "dmVyc2lvbiAgICAgICMgQ2xpZW50IG11c3QgYmUgd2l0aGluIDEgbWlub3IgdmVyc2lvbiBvZiBj" + + "bHVzdGVyCmBgYAoKQ29udHJvbC1wbGFuZSBjb21tYW5kcyBydW4gZnJvbSB0aGUgZXh0cmFjdGVk" + + "IGBudmNmLXNlbGYtbWFuYWdlZC1zdGFjay9gIHJvb3Q6CgpgYGBiYXNoCmNkIHBhdGgvdG8vbnZj" + + "Zi1zZWxmLW1hbmFnZWQtc3RhY2sKbHMgaGVsbWZpbGUuZC8gZW52aXJvbm1lbnRzLyBzZWNyZXRz" + + "LyBnbG9iYWwueWFtbC5nb3RtcGwKYGBgCgpJZGVudGlmeSB0aGUgZW52aXJvbm1lbnQgZnJvbSBg" + + "ZW52aXJvbm1lbnRzLzxuYW1lPi55YW1sYCBhbmQKYHNlY3JldHMvPG5hbWU+LXNlY3JldHMueWFt" + + "bGA7IGZvciBFS1MsIHVzZSB0aGUgY2Fub25pY2FsCltDU1AgRW5kLXRvLUVuZCBFeGFtcGxlXSho" + + "dHRwczovL2RvY3MubnZpZGlhLmNvbS9udmNmL3YwLjYuMC1yYy9jc3AtZW5kLXRvLWVuZC1leGFt" + + "cGxlKS4KCiMjIEhvdyBWYWx1ZXMgRmxvdwoKVW5kZXJzdGFuZGluZyB2YWx1ZSBwcmVjZWRlbmNl" + + "IHByZXZlbnRzIHRoZSBtb3N0IGNvbW1vbiBjb25maWd1cmF0aW9uIG1pc3Rha2VzLgoKYGBgCmVu" + + "dmlyb25tZW50cy9iYXNlLnlhbWwgICAgICAgICAgKGRlZmF1bHRzKQogICAgLT4gbWVyZ2VkIHdp" + + "dGgKZW52aXJvbm1lbnRzLzxlbnY+LnlhbWwgICAgICAgICAoeW91ciBvdmVycmlkZXMpCiAgICAt" + + "PiBjb25zdW1lZCBieQpnbG9iYWwueWFtbC5nb3RtcGwgICAgICAgICAgICAgIChHbyB0ZW1wbGF0" + + "ZSwgY29uc3RydWN0cyBwZXItY2hhcnQgdmFsdWVzKQogICAgLT4gY29uc3VtZWQgYnkKc2VjcmV0" + + "cy88ZW52Pi1zZWNyZXRzLnlhbWwgICAgICAoc2Vuc2l0aXZlIHZhbHVlcykKICAgIC0+IG92ZXJy" + + "aWRkZW4gYnkKcmVsZWFzZSBpbmxpbmUgdmFsdWVzOiBibG9ja3MgICAoaGlnaGVzdCBwcmVjZWRl" + + "bmNlKQpgYGAKCkNyaXRpY2FsOiBgZ2xvYmFsLnlhbWwuZ290bXBsYCBvbmx5IHBhc3NlcyB0aHJv" + + "dWdoIHNwZWNpZmljIGtleXMgdG8gZWFjaCBjaGFydCAoaW1hZ2UgcmVnaXN0cmllcywgbm9kZSBz" + + "ZWxlY3RvcnMsIHN0b3JhZ2UsIHJlcGxpY2EgY291bnRzKS4gU2V0dGluZyBhbiBhcmJpdHJhcnkg" + + "Y2hhcnQgdmFsdWUgaW4gdGhlIGVudmlyb25tZW50IGZpbGUgd2lsbCBiZSBzaWxlbnRseSBpZ25v" + + "cmVkIGlmIGBnbG9iYWwueWFtbC5nb3RtcGxgIGRvZXMgbm90IHByb3BhZ2F0ZSBpdC4KClRvIG92" + + "ZXJyaWRlIGFyYml0cmFyeSBjaGFydCB2YWx1ZXMsIHVzZSBhIGhlbG1maWxlIHJlbGVhc2UgYHZh" + + "bHVlczpgIGJsb2NrLiBTZWUgW092ZXJyaWRpbmcgSGVsbSBDaGFydCBWYWx1ZXNdKCNvdmVycmlk" + + "aW5nLWhlbG0tY2hhcnQtdmFsdWVzKS4KCiMjIENsZWFuIEluc3RhbGxhdGlvbgoKIyMjIDEuIENy" + + "ZWF0ZSBuYW1lc3BhY2VzIGFuZCBpbWFnZSBwdWxsIHNlY3JldHMgKGlmIHVzaW5nIGEgcHJpdmF0" + + "ZSByZWdpc3RyeSkKCmBgYGJhc2gKZm9yIG5zIGluIGNhc3NhbmRyYS1zeXN0ZW0gbmF0cy1zeXN0" + + "ZW0gbnZjZiBhcGkta2V5cyBlc3Mgc2lzIHZhdWx0LXN5c3RlbSBjZXJ0LW1hbmFnZXI7IGRvCiAg" + + "a3ViZWN0bCBjcmVhdGUgbmFtZXNwYWNlICIkbnMiIC0tZHJ5LXJ1bj1jbGllbnQgLW8geWFtbCB8" + + "IGt1YmVjdGwgYXBwbHkgLWYgLQpkb25lCgojIE9ubHkgaWYgcHVsbGluZyBmcm9tIGEgcHJpdmF0" + + "ZSByZWdpc3RyeSAoZS5nLiwgTkdDIG52Y3IuaW8pCmV4cG9ydCBOR0NfQVBJX0tFWT0iPHlvdXIt" + + "a2V5PiIKZm9yIG5zIGluIGNhc3NhbmRyYS1zeXN0ZW0gbmF0cy1zeXN0ZW0gbnZjZiBhcGkta2V5" + + "cyBlc3Mgc2lzIHZhdWx0LXN5c3RlbSBjZXJ0LW1hbmFnZXI7IGRvCiAga3ViZWN0bCBjcmVhdGUg" + + "c2VjcmV0IGRvY2tlci1yZWdpc3RyeSBudmNyLWNyZWRzIFwKICAgIC0tZG9ja2VyLXNlcnZlcj1u" + + "dmNyLmlvIFwKICAgIC0tZG9ja2VyLXVzZXJuYW1lPSckb2F1dGh0b2tlbicgXAogICAgLS1kb2Nr" + + "ZXItcGFzc3dvcmQ9IiROR0NfQVBJX0tFWSIgXAogICAgLS1uYW1lc3BhY2U9IiRucyIgXAogICAg" + + "LS1kcnktcnVuPWNsaWVudCAtbyB5YW1sIHwga3ViZWN0bCBhcHBseSAtZiAtCmRvbmUKYGBgCgpJ" + + "ZiB1c2luZyBwdWxsIHNlY3JldHMsIHlvdSBtdXN0IGFsc28gY29uZmlndXJlIGVhY2ggaGVsbWZp" + + "bGUgcmVsZWFzZSB0byByZWZlcmVuY2UgdGhlbS4gU2VlIFtJbWFnZSBQdWxsIFNlY3JldHNdKCNp" + + "bWFnZS1wdWxsLXNlY3JldHMpLgoKIyMjIDIuIEF1dGhlbnRpY2F0ZSBoZWxtIHRvIHlvdXIgY2hh" + + "cnQgcmVnaXN0cnkKCkJvdGggYGRvY2tlciBsb2dpbmAgQU5EIGBoZWxtIHJlZ2lzdHJ5IGxvZ2lu" + + "YCBhcmUgcmVxdWlyZWQgZm9yIE5HQy4gSGVsbWZpbGUgdXNlcyBoZWxtIChub3QgZG9ja2VyKSB0" + + "byBwdWxsIE9DSSBjaGFydHMsIHNvIHRoZSBoZWxtIGNyZWRlbnRpYWwgc3RvcmUgbXVzdCBiZSBh" + + "dXRoZW50aWNhdGVkIHNlcGFyYXRlbHkuCgpgYGBiYXNoCiMgTkdDIC0tIGJvdGggY29tbWFuZHMg" + + "YXJlIHJlcXVpcmVkCmRvY2tlciBsb2dpbiBudmNyLmlvIC11ICckb2F1dGh0b2tlbicgLXAgIiRO" + + "R0NfQVBJX0tFWSIKaGVsbSByZWdpc3RyeSBsb2dpbiBudmNyLmlvIC11ICckb2F1dGh0b2tlbicg" + + "LXAgIiROR0NfQVBJX0tFWSIKCiMgRUNSCmF3cyBlY3IgZ2V0LWxvZ2luLXBhc3N3b3JkIC0tcmVn" + + "aW9uIDxyZWdpb24+IHwgXAogIGhlbG0gcmVnaXN0cnkgbG9naW4gLS11c2VybmFtZSBBV1MgLS1w" + + "YXNzd29yZC1zdGRpbiA8YWNjb3VudD4uZGtyLmVjci48cmVnaW9uPi5hbWF6b25hd3MuY29tCmBg" + + "YAoKPiBOb3RlOiBgaGVsbSByZWdpc3RyeSBsb2dpbmAga2VlcHMgb25seSB0aGUgbGFzdCBsb2dp" + + "biBwZXIgaG9zdCAobXVsdGktb3JnIGdvdGNoYSkuCj4gVGhlIHN0YWNrIGFuZCB0aGUgY2FjaGVz" + + "IHNwYW4gc2V2ZXJhbCBOR0Mgb3JncyB0aGF0IG5lZWQgZGlmZmVyZW50IGtleXMsIGJ1dCB0aGV5" + + "IGFsbAo+IGxpdmUgdW5kZXIgdGhlIG9uZSBob3N0IGBudmNyLmlvYC4gQSBzZWNvbmQgYGhlbG0g" + + "cmVnaXN0cnkgbG9naW4gbnZjci5pb2AgKG9yCj4gYGRvY2tlciBsb2dpbmApIHdpdGggYSBkaWZm" + + "ZXJlbnQga2V5IHNpbGVudGx5IG92ZXJ3cml0ZXMgdGhlIGZpcnN0LCBzbyBwdWxscyBmb3IgdGhl" + + "Cj4gZmlyc3Qgb3JnIHRoZW4gZmFpbCB3aXRoIGEgbWlzbGVhZGluZyBgNDAzIEFjY2VzcyBEZW5p" + + "ZWRgIChub3QgYSA0MDE6IHRoZSBhdXRoCj4gc3VjY2VlZGVkLCBpdCdzIHRoZSB3cm9uZy1vcmcg" + + "a2V5KS4gSWYgeW91IHB1bGwgY2hhcnRzL2ltYWdlcyBmcm9tIG1vcmUgdGhhbiBvbmUgb3JnLAo+" + + "IGVpdGhlciByZS1ydW4gdGhlIGxvZ2luIHdpdGggdGhlIGNvcnJlY3Qga2V5IGltbWVkaWF0ZWx5" + + "IGJlZm9yZSBlYWNoIHB1bGwsIG9yIHBhc3MKPiBgLS11c2VybmFtZSAnJG9hdXRodG9rZW4nIC0t" + + "cGFzc3dvcmQgPGtleT5gIHBlciBgaGVsbSBwdWxsYCBpbnZvY2F0aW9uIGluc3RlYWQgb2YgcmVs" + + "eWluZwo+IG9uIHRoZSBzdG9yZWQgbG9naW4uIChQdWxsaW5nIGV2ZXJ5dGhpbmcgZnJvbSBhIHNp" + + "bmdsZSByZWdpc3RyeSBtaXJyb3IgYXZvaWRzIHRoaXMKPiBlbnRpcmVseS4pCgojIyMgMmIuIChS" + + "ZWNvbW1lbmRlZCkgUHVsbCBmcm9tIGEgcmVnaXN0cnkgdGhlIGNsdXN0ZXIgYXV0aGVudGljYXRl" + + "cyB0byBhdXRvbWF0aWNhbGx5CgpJZiB5b3UgbWlycm9yIHRoZSBOVkNGIGltYWdlcyBpbnRvIGEg" + + "cmVnaXN0cnkgdGhhdCB0aGUgY2x1c3RlciBjYW4gcHVsbCBmcm9tIHdpdGhvdXQgYW4KZXhwbGlj" + + "aXQgaW1hZ2UgcHVsbCBzZWNyZXQgKGZvciBleGFtcGxlLCBhIHJlZ2lzdHJ5IHdoZXJlIHRoZSBu" + + "b2RlIG9yIHdvcmtsb2FkIGlkZW50aXR5IGlzCmdyYW50ZWQgcHVsbCBhY2Nlc3MgYXV0b21hdGlj" + + "YWxseSksIHBvaW50IHRoZSBzdGFjayBhdCBpdCBhbmQgc2tpcCB0aGUgY3JlZGVudGlhbCBzdGVw" + + "cwphYm92ZS4KCjEuIFBvaW50IHRoZSBzdGFjayBhdCB0aGUgbWlycm9yIGluIGBlbnZpcm9ubWVu" + + "dHMvPGVudj4ueWFtbGA6CgogICBgYGB5YW1sCiAgIGdsb2JhbDoKICAgICBpbWFnZToKICAgICAg" + + "IHJlZ2lzdHJ5OiA8eW91ci1yZWdpc3RyeT4gICAgICAgICAgICAjIGUuZy4gcmVnaXN0cnkuZXhh" + + "bXBsZS5jb20KICAgICAgIHJlcG9zaXRvcnk6IDxtaXJyb3Itc3ViLXBhdGg+CiAgICAgaGVsbToK" + + "ICAgICAgIHNvdXJjZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvbmx5IGlmIHlv" + + "dSBhbHNvIG1pcnJvcmVkIHRoZSBoZWxtIGNoYXJ0cwogICAgICAgICByZWdpc3RyeTogPHlvdXIt" + + "cmVnaXN0cnk+CiAgICAgICAgIHJlcG9zaXRvcnk6IDxtaXJyb3Itc3ViLXBhdGg+CiAgIGBgYAoK" + + "ICAgPiBUaGUgbWFuaWZlc3QgaGFzIGEgbWl4IG9mIE9DSSBhbmQgbm9uLU9DSSBhcnRpZmFjdHMs" + + "IHNvIGNvbnZlcnQgbm9uLU9DSSBjaGFydHMgYmVmb3JlCiAgID4gbWlycm9yaW5nLiBDb250YWlu" + + "ZXIgaW1hZ2VzIChgbnZjci5pby8uLi5gKSBhcmUgYWxyZWFkeSBPQ0kgYW5kIG1pcnJvciBhcy1p" + + "cy4gU29tZSBIZWxtCiAgID4gY2hhcnRzLCB0aG91Z2gsIGFyZSBwdWJsaXNoZWQgdG8gYW4gYGh0" + + "dHBzOi8vYCBIZWxtIHJlcG9zaXRvcnkgKGZvciBleGFtcGxlCiAgID4gYGhlbG0ubmdjLm52aWRp" + + "YS5jb21gKS4gVGhvc2UgYXJlIG5vdCBPQ0kgYW5kIGNhbm5vdCBiZSByZXNvbHZlZCBieSBgZ2xv" + + "YmFsLmhlbG0uc291cmNlc2AKICAgPiAoT0NJKSBvciBtaXJyb3JlZCBkaXJlY3RseS4gQmVmb3Jl" + + "IHBvaW50aW5nIHRoZSBzdGFjayBhdCB5b3VyIG1pcnJvciwgY29udmVydCBlYWNoCiAgID4gYGh0" + + "dHBzOi8vYCBjaGFydCB0byBPQ0k6IGBoZWxtIHJlcG8gYWRkYC9gaGVsbSBwdWxsYCB0aGUgYC50" + + "Z3pgLCB0aGVuCiAgID4gYGhlbG0gcHVzaCA8Y2hhcnQ+LnRneiBvY2k6Ly88eW91ci1yZWdpc3Ry" + + "eT4vPG1pcnJvci1zdWItcGF0aD5gLiBPbmx5IE9DSSBjaGFydHMgY2FuIGxpdmUKICAgPiB1bmRl" + + "ciBgZ2xvYmFsLmhlbG0uc291cmNlc2AuCgoyLiBTa2lwIHRoZSBjcmVkZW50aWFsIHN0ZXBzIGFi" + + "b3ZlLiBXaGVuIHRoZSBjbHVzdGVyIGF1dGhlbnRpY2F0ZXMgdG8gdGhlIHJlZ2lzdHJ5CiAgIGF1" + + "dG9tYXRpY2FsbHkgKHRoZSBub2RlIG9yIHdvcmtsb2FkIGlkZW50aXR5IGhhcyBwdWxsIGFjY2Vz" + + "cyksIHRoZSBwdWxsIG5lZWRzIG5vCiAgIEt1YmVybmV0ZXMgc2VjcmV0LCBzbyB5b3UgZG8gbm90" + + "IG5lZWQ6IHRoZSBwZXItbmFtZXNwYWNlIGBudmNyLWNyZWRzYCBmcm9tIHN0ZXAgMQogICAoc3Rp" + + "bGwgY3JlYXRlIHRoZSBuYW1lc3BhY2VzLCBqdXN0IG5vdCB0aGUgc2VjcmV0KSwgdGhlIGBnbG9i" + + "YWwuaW1hZ2VQdWxsU2VjcmV0c2AgZW50cnksCiAgIG9yIHRoZSBgZG9ja2VyIGxvZ2luYC9gaGVs" + + "bSByZWdpc3RyeSBsb2dpbiBudmNyLmlvYCBmcm9tIHN0ZXAgMi4KCiAgID4gT25lIHJlc2lkdWFs" + + "IGNyZWRlbnRpYWw6IG52Y2YtYXBpIHN0aWxsIHZhbGlkYXRlcyB0aGUgdXNlciBmdW5jdGlvbiBp" + + "bWFnZSBhdAogICA+IGBmdW5jdGlvbiBjcmVhdGVgIHZpYSB0aGUgYWNjb3VudCByZWdpc3RyeSBj" + + "cmVkZW50aWFsLCBzbyB0aGF0IGNyZWRlbnRpYWwgbXVzdCBwb2ludCBhdAogICA+IHdoaWNoZXZl" + + "ciByZWdpc3RyeSBob2xkcyB0aGUgdXNlciBpbWFnZSAoc2V0IGl0IHRvIHlvdXIgbWlycm9yIGlm" + + "IHRoZSBpbWFnZSBpcyBtaXJyb3JlZAogICA+IHRoZXJlKS4KCiMjIyAzLiBTZXQgdGhlIHJvdXRl" + + "IGRvbWFpbgoKYGdsb2JhbC5kb21haW5gIHNldHMgdGhlIGhvc3RuYW1lIHN1ZmZpeCBmb3Igcm91" + + "dGVzIHN1Y2ggYXMgYGFwaS48ZG9tYWluPmAuIEl0IGRvZXMgbm90IGNvbmZpZ3VyZSB0aGUgR2F0" + + "ZXdheSBvciBpdHMgbG9hZCBiYWxhbmNlci4gUXVlcnkgdGhlIGV4YWN0IGV4aXN0aW5nIEdhdGV3" + + "YXk6CgpgYGBiYXNoCkdBVEVXQVlfQUREUkVTUz0kKGt1YmVjdGwgZ2V0IGdhdGV3YXkgPGdhdGV3" + + "YXktbmFtZT4gLW4gPGdhdGV3YXktbmFtZXNwYWNlPiAtbyBqc29ucGF0aD0ney5zdGF0dXMuYWRk" + + "cmVzc2VzWzBdLnZhbHVlfScpCnRlc3QgLW4gIiRHQVRFV0FZX0FERFJFU1MiCmBgYAoKVGhlIGFk" + + "ZHJlc3MgbWF5IGJlIGEgaG9zdG5hbWUgb3IgSVAuIENsb3VkIHByb3ZpZGVyIGFuZCBHYXRld2F5" + + "IGNvbmZpZ3VyYXRpb24gZGV0ZXJtaW5lIHRoZSBsb2FkIGJhbGFuY2VyIHR5cGUgYW5kIGFkZHJl" + + "c3MgZm9ybWF0LiBUaGUgc2VsZi1tYW5hZ2VkIHN0YWNrIGRvZXMgbm90IHNlbGVjdCBlaXRoZXIu" + + "CgpGb3IgdGVtcG9yYXJ5IHRlc3Rpbmcgd2l0aG91dCBETlMsIHVzZSBhIHN0YWJsZSByZXNlcnZl" + + "ZCBzdWZmaXggc3VjaCBhcyBgZ2xvYmFsLmRvbWFpbjogIm52Y2YudGVzdCJgLCBjb25uZWN0IHRv" + + "IGBHQVRFV0FZX0FERFJFU1NgLCBhbmQgc2VuZCBgSG9zdDogYXBpLm52Y2YudGVzdGAuIEZvciBw" + + "cm9kdWN0aW9uLCB1c2UgeW91ciBiYXNlIEROUyBkb21haW4gYW5kIHBvaW50IGl0cyByb3V0ZSBy" + + "ZWNvcmRzIHRvIGBHQVRFV0FZX0FERFJFU1NgLiBJZiB0aGUgZW5kcG9pbnQgbGF0ZXIgY2hhbmdl" + + "cywga2VlcCBgZ2xvYmFsLmRvbWFpbmAgc3RhYmxlIGFuZCB1cGRhdGUgb25seSBETlMgb3IgdGhl" + + "IGNsaWVudCBkZXN0aW5hdGlvbi4gU2VlIEV4YW1wbGUgNCBpbiBbZXhhbXBsZXMubWRdKGV4YW1w" + + "bGVzLm1kKS4KCiMjIyA0LiBQcmV2aWV3IGFuZCBkZXBsb3kKCmBgYGJhc2gKSEVMTUZJTEVfRU5W" + + "PTxlbnYtbmFtZT4gaGVsbWZpbGUgdGVtcGxhdGUgICAjIFByZXZpZXcgcmVuZGVyZWQgbWFuaWZl" + + "c3RzCkhFTE1GSUxFX0VOVj08ZW52LW5hbWU+IGhlbG1maWxlIHN5bmMgICAgICAgIyBEZXBsb3kK" + + "YGBgCgo+IFNldCBCT1RIIENhc3NhbmRyYSBwYXNzd29yZHMgaW4gdGhlIHNlY3JldHMgZmlsZS4g" + + "VGhlIHNlY3JldHMgZmlsZSBkb2N1bWVudHMKPiBgREVGQVVMVF9DQVNTQU5EUkFfUEFTU1dPUkRg" + + "LCBidXQgdGhlIGNhc3NhbmRyYSBjaGFydCBoYXMgYSBzZWNvbmQgY3JlZGVudGlhbCwKPiBgY2Fz" + + "c2FuZHJhLnNlcnZpY2VSb2xlUGFzc3dvcmRgLCB0aGF0IGRlZmF1bHRzIHRvIGBjaEBuZzNtM2Au" + + "IElmIHlvdSBzZXQgb25seQo+IGBERUZBVUxUX0NBU1NBTkRSQV9QQVNTV09SRGAsIHRoZSBzZXJ2" + + "aWNlIHJvbGUga2VlcHMgdGhhdCBkZWZhdWx0IGFuZCBldmVyeSBEQi1iYWNrZWQKPiBzZXJ2aWNl" + + "IGNyYXNoLWxvb3BzIHdpdGggYEJhZCBjcmVkZW50aWFsc2Agb25jZSBpdCB0cmllcyB0byBhdXRo" + + "ZW50aWNhdGUuIFNldAo+IGBjYXNzYW5kcmEuc2VydmljZVJvbGVQYXNzd29yZGAgdG8gdGhlIHNh" + + "bWUgdmFsdWUgYXMgYERFRkFVTFRfQ0FTU0FORFJBX1BBU1NXT1JEYC4KCiMjIyA1LiBEZXBsb3lt" + + "ZW50IHBoYXNlcwoKSGVsbWZpbGUgZGVwbG95cyBpbiBvcmRlciB3aXRoIGRlcGVuZGVuY2llczoK" + + "CnwgUGhhc2UgfCBTZWxlY3RvciB8IFNlcnZpY2VzIHwgV2FpdCB0aW1lIHwKfC0tLS0tLS18LS0t" + + "LS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfAp8IDEgfCBgcmVsZWFzZS1ncm91cD1kZXBl" + + "bmRlbmNpZXNgIHwgTkFUUywgT3BlbkJhbywgQ2Fzc2FuZHJhIHwgNS0xMCBtaW4gfAp8IDIgfCBg" + + "cmVsZWFzZS1ncm91cD1zZXJ2aWNlc2AgfCBBUEksIFNJUywgRVNTLCBpbnZvY2F0aW9uLCBncnBj" + + "LXByb3h5LCBub3RhcnksIGFwaS1rZXlzLCBvcHRpb25hbCBMTE0gZ2F0ZXdheS9yb3V0ZXIsIG9w" + + "dGlvbmFsIFZhbml0eSBHYXRld2F5LCBOVkNGIFVJIHdoZW4gdGhlIHN0YWNrIHBhY2thZ2UgaW5j" + + "bHVkZXMgdGhlIGFkZG9uIHwgNS0xMCBtaW4gfAp8IDMgfCBgcmVsZWFzZS1ncm91cD1pbmdyZXNz" + + "YCB8IEdhdGV3YXkgcm91dGVzIHwgMS0yIG1pbiB8CnwgNCB8IGByZWxlYXNlLWdyb3VwPW9ic2Vy" + + "dmFiaWxpdHlgIHwgT2JzZXJ2YWJpbGl0eSBzdGFjayAoaWYgZW5hYmxlZCkgfCAxLTIgbWluIHwK" + + "Ck1vbml0b3IgaW4gYSBzZXBhcmF0ZSB0ZXJtaW5hbDoKCmBgYGJhc2gKa3ViZWN0bCBnZXQgcG9k" + + "cyAtQSAtdwpgYGAKCiMjIyA2LiBFbmFibGUgVmFuaXR5IEdhdGV3YXkgKG9wdGlvbmFsKQoKVmFu" + + "aXR5IEdhdGV3YXkgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBhbmQgaXMgb25seSBuZWVkZWQgZm9y" + + "IGN1c3RvbWVyLWZhY2luZwpob3N0bmFtZXMgb3IgcGF0aCBtYXBwaW5ncyBpbiBmcm9udCBvZiB0" + + "aGUgc3RhbmRhcmQgTlZDRiBBUEkgYW5kIGludm9jYXRpb24Kcm91dGVzLiBJdCBpcyBhdmFpbGFi" + + "bGUgb25seSBpbiBzdGFjayBwYWNrYWdlcyB0aGF0IGluY2x1ZGUgdGhlIFZhbml0eSBHYXRld2F5" + + "CmFkZG9uLiBJZiB0aGUgZXh0cmFjdGVkIHN0YWNrIHBhY2thZ2UgZG9lcyBub3QgY29udGFpbiBh" + + "IGB2YW5pdHktZ2F0ZXdheWAKcmVsZWFzZSBhbmQgYHZhbml0eUdhdGV3YXlgIHJvdXRlIHZhbHVl" + + "cywgc2tpcCB0aGVzZSBjb21tYW5kcyBhbmQgdXNlIGEgbmV3ZXIKc3RhY2sgcGFja2FnZSB0aGF0" + + "IGluY2x1ZGVzIHRoZW0uCgpJZiB0aGUgc3RhY2sgcGFja2FnZSBpbmNsdWRlcyB0aGUgYWRkb24s" + + "IGVuYWJsZSBpdCBpbgpgZW52aXJvbm1lbnRzLzxlbnYtbmFtZT4ueWFtbGA6CgpgYGB5YW1sCmFk" + + "ZG9uczoKICB2YW5pdHlHYXRld2F5OgogICAgZW5hYmxlZDogdHJ1ZQogICAgbWFwcGluZ0NvbmZp" + + "Zzoge30KYGBgCgpUaGUgZGVmYXVsdCByb3V0ZSBob3N0IGlzIGB2YW5pdHkuPGRvbWFpbj5gIGFu" + + "ZCB0aGUgYmFja2VuZCBpcwpgdmFuaXR5LWdhdGV3YXkubnZjZjo4MDgwYC4gUHV0IGRlcGxveW1l" + + "bnQtc3BlY2lmaWMgaG9zdCBhbmQgcGF0aCBtYXBwaW5ncyB1bmRlcgpgYWRkb25zLnZhbml0eUdh" + + "dGV3YXkubWFwcGluZ0NvbmZpZ2AuIElmIHlvdSBuZWVkIGN1c3RvbSB2YW5pdHkgaG9zdHMgaW5z" + + "dGVhZCBvZgpgdmFuaXR5Ljxkb21haW4+YCwgdXNlIHRoZSByb3V0ZSBob3N0bmFtZSBvdmVycmlk" + + "ZXMgc3VwcG9ydGVkIGJ5IHRoZSBzdGFjawpwYWNrYWdlIGFuZCBjcmVhdGUgbWF0Y2hpbmcgRE5T" + + "IHJlY29yZHMuCgpBZnRlciBjb25maXJtaW5nIHRoZSBwYWNrYWdlIGluY2x1ZGVzIHRoZSBgdmFu" + + "aXR5LWdhdGV3YXlgIHJlbGVhc2UsIHByZXZpZXcgYW5kCmFwcGx5IHRoZSBzZXJ2aWNlIGFuZCBy" + + "b3V0ZToKCmBgYGJhc2gKSEVMTUZJTEVfRU5WPTxlbnYtbmFtZT4gaGVsbWZpbGUgLS1zZWxlY3Rv" + + "ciBuYW1lPXZhbml0eS1nYXRld2F5IHRlbXBsYXRlCkhFTE1GSUxFX0VOVj08ZW52LW5hbWU+IGhl" + + "bG1maWxlIC0tc2VsZWN0b3IgbmFtZT12YW5pdHktZ2F0ZXdheSBzeW5jCkhFTE1GSUxFX0VOVj08" + + "ZW52LW5hbWU+IGhlbG1maWxlIC0tc2VsZWN0b3IgcmVsZWFzZS1ncm91cD1pbmdyZXNzIHN5bmMK" + + "YGBgCgpWZXJpZnkgdGhlIHJvdXRlIG9ubHkgd2hlbiB0aGUgYWRkb24gaXMgcHJlc2VudCBhbmQg" + + "ZW5hYmxlZDoKCmBgYGJhc2gKa3ViZWN0bCBnZXQgZGVwbG95LHN2YyAtbiBudmNmIC1sIGFwcC5r" + + "dWJlcm5ldGVzLmlvL25hbWU9dmFuaXR5LWdhdGV3YXkKa3ViZWN0bCBnZXQgaHR0cHJvdXRlIC1B" + + "IHwgZ3JlcCAtaSB2YW5pdHkKY3VybCAtSCAiSG9zdDogdmFuaXR5Ljxkb21haW4+IiAiaHR0cDov" + + "LzxnYXRld2F5LWFkZHJlc3M+L2hlYWx0aCIKYGBgCgpEbyBub3QgZW5hYmxlIFZhbml0eSBHYXRl" + + "d2F5IGZvciBzdGFuZGFyZCBBUEksIEFQSSBLZXlzLCBpbnZvY2F0aW9uLCBMTE0KaW52b2NhdGlv" + + "biwgb3IgZ1JQQyB0cmFmZmljLiBUaG9zZSByb3V0ZXMgYXJlIHByb3ZpZGVkIGJ5IHRoZSBiYXNl" + + "IGdhdGV3YXkKcm91dGVzLgoKIyMjIDcuIEVuYWJsZSBOVkNGIFVJIChvcHRpb25hbCkKCk5WQ0Yg" + + "VUkgaXMgYW4gb3B0aW9uYWwsIGN1c3RvbWVyLWZhY2luZyBhZG1pbi1wYW5lbCBVSS4gSXQgaXMg" + + "ZGlzYWJsZWQgYnkKZGVmYXVsdCBhbmQgYXZhaWxhYmxlIG9ubHkgaW4gc3RhY2sgcGFja2FnZXMg" + + "dGhhdCBpbmNsdWRlIHRoZSBOVkNGIFVJIGFkZG9uLiBJZgp5b3VyIGV4dHJhY3RlZCBzdGFjayBw" + + "YWNrYWdlIGRvZXMgbm90IGNvbnRhaW4gYSBgbnZjZi11aWAgcmVsZWFzZSBhbmQgYG52Y2ZVaWAK" + + "cm91dGUgdmFsdWVzLCBza2lwIHRoaXMgc2VjdGlvbi4gVGhlIE5WQ0YgVUkgYWRtaW4gcGFuZWwg" + + "aXMgY3VycmVudGx5CnVuYXV0aGVudGljYXRlZDsgZG8gbm90IGV4cG9zZSBpdCB0byB0aGUgcHVi" + + "bGljIGludGVybmV0LgoKRm9yIGVuYWJsZW1lbnQsIG5hbWVzcGFjZSBhbmQgcHVsbCBzZWNyZXQg" + + "c2V0dXAsIGFwcGx5LCBhbmQgdmVyaWZpY2F0aW9uIHN0ZXBzLApzZWUgW05WQ0YgVUkgQWRkb25d" + + "KHJlZmVyZW5jZXMvbnZjZi11aS1hZGRvbi5tZCkuCgojIyMgOC4gSW5zdGFsbCB0aGUgc2VwYXJh" + + "dGUgY29tcHV0ZS1wbGFuZSBzdGFjawoKVGhlIGNvbnRyb2wtcGxhbmUgc3RhY2sgZG9lcyBub3Qg" + + "aW5zdGFsbCBjb21wdXRlLXBsYW5lIGNvbXBvbmVudHMuIEFmdGVyIGl0IGlzIGhlYWx0aHksIGNo" + + "b29zZSBleGFjdGx5IG9uZSBjb21wdXRlLXBsYW5lIGhhbmRvZmY6CgotIEhlbG1maWxlIHZhbHVl" + + "cyBmbG93OiBhdXRob3Igc2VwYXJhdGUgZW52aXJvbm1lbnQgZmlsZXMsIHRoZW4gcmVnaXN0ZXIg" + + "YW5kCiAgaW5zdGFsbCB3aXRoIHRoZSBjb21wdXRlLXBsYW5lIE1ha2VmaWxlLgotIENMSSBwcm9m" + + "aWxlIGZsb3c6IHVzZSB0aGUgcHJvZmlsZSBnZW5lcmF0ZWQgYnkgdGhlIENMSSBjb250cm9sLXBs" + + "YW5lIGluc3RhbGwsCiAgdGhlbiBydW4gdGhlIGNvbXBsZXRlIENMSSByZWdpc3RlciBhbmQgaW5z" + + "dGFsbCBjb21tYW5kcy4KCkRvIG5vdCBtaXggdGhlc2UgaGFuZG9mZnMuIEZvbGxvdyBbU3BsaXQg" + + "Q29tcHV0ZS1QbGFuZSBJbnN0YWxsYXRpb25dKHJlZmVyZW5jZXMvY29tcHV0ZS1wbGFuZS1pbnN0" + + "YWxsYXRpb24ubWQpCmZvciBjb21tYW5kcywgRUtTIHJvdXRpbmcsIHB1bGwgc2VjcmV0cywgdmVy" + + "aWZpY2F0aW9uLCBhbmQgdGVhcmRvd24gb3JkZXIuCgojIyBDbGVhbiBUZWFyZG93bgoKRGVzdHJv" + + "eSBldmVyeSBjb21wdXRlIHBsYW5lIGJlZm9yZSB0aGUgY29udHJvbCBwbGFuZSwgdXNpbmcgdGhl" + + "IHRlYXJkb3duIGZvcgp0aGUgc2FtZSBoYW5kb2ZmOyBzZWUgW1NwbGl0IENvbXB1dGUtUGxhbmUg" + + "SW5zdGFsbGF0aW9uXShyZWZlcmVuY2VzL2NvbXB1dGUtcGxhbmUtaW5zdGFsbGF0aW9uLm1kI3Rl" + + "YXJkb3duKS4KClNjb3BlOiBPbmx5IGRlc3Ryb3kgcmVsZWFzZXMgbWFuYWdlZCBieSB0aGlzIGNv" + + "bnRyb2wtcGxhbmUgaGVsbWZpbGUgc3RhY2suIFRoZSBOVkNGIHJlbGVhc2VzIGFyZTogYG5hdHNg" + + "LCBgb3BlbmJhby1zZXJ2ZXJgLCBgY2Fzc2FuZHJhYCwgYGFwaS1rZXlzYCwgYHNpc2AsIGBhcGlg" + + "LCBgaW52b2NhdGlvbi1zZXJ2aWNlYCwgYGdycGMtcHJveHlgLCBgZXNzLWFwaWAsIGBub3Rhcnkt" + + "c2VydmljZWAsIG9wdGlvbmFsIGB2YW5pdHktZ2F0ZXdheWAsIGBudmNmLXVpYCwgYGFkbWluLWlz" + + "c3Vlci1wcm94eWAsIGFuZCBgaW5ncmVzc2A7IGBjZXJ0LW1hbmFnZXJgIGlzIGluY2x1ZGVkIG9u" + + "bHkgd2hlbiBgY2VydE1hbmFnZXIuZW5hYmxlZDogdHJ1ZWAuIFRoZSBjb250cm9sLXBsYW5lIG5h" + + "bWVzcGFjZSBpbnZlbnRvcnkgYWxzbyBpbmNsdWRlcyBgY2VydC1tYW5hZ2VyYCwgYnV0IGRlZmF1" + + "bHQgbmFtZXNwYWNlIGNsZWFudXAgcHJlc2VydmVzIGl0LiBOYW1lc3BhY2UgcHJlc2VydmF0aW9u" + + "IGRvZXMgbm90IHByZXNlcnZlIHRoZSBIZWxtIHJlbGVhc2UuIEV4dGVybmFsIGNlcnQtbWFuYWdl" + + "ciBtdXN0IHVzZSBgY2VydE1hbmFnZXIuZW5hYmxlZDogZmFsc2VgOyBvdGhlcndpc2UgSGVsbWZp" + + "bGUgdHJlYXRzIHRoZSByZWxlYXNlIGFzIHN0YWNrLW1hbmFnZWQuIERvIG5vdCBkZWxldGUgb3Ro" + + "ZXIgaGVsbSByZWxlYXNlcyBvciBuYW1lc3BhY2VzIG9uIHRoZSBjbHVzdGVyLgoKQmVmb3JlIGNv" + + "bnRyb2wtcGxhbmUgZGVzdHJveSwgaWRlbnRpZnkgd2hldGhlciBjZXJ0LW1hbmFnZXIgaXMgZXh0" + + "ZXJuYWwuIEZvciBhbiBleHRlcm5hbCBpbnN0YWxsYXRpb24sIHJlcXVpcmUgZWZmZWN0aXZlIGBj" + + "ZXJ0TWFuYWdlci5lbmFibGVkOiBmYWxzZWAgYW5kIGFib3J0IGlmIGl0IGlzIHRydWUuIEZvciBh" + + "biBpbnRlbmRlZCBzdGFjay1tYW5hZ2VkIHJlbGVhc2Ugd2l0aCBlZmZlY3RpdmUgYGNlcnRNYW5h" + + "Z2VyLmVuYWJsZWQ6IHRydWVgLCB2ZXJpZnkgbWF0Y2hpbmcgc3RhY2sgSGVsbSByZWxlYXNlIG1l" + + "dGFkYXRhIGFuZCBhYm9ydCBvbiBtaXNzaW5nIG9yIG1pc21hdGNoZWQgZXZpZGVuY2UuIFByZXNl" + + "cnZlIHRoZSBuYW1lc3BhY2UgYnkgZGVmYXVsdDsgb25seSBwbGFuIGl0cyByZW1vdmFsIGFmdGVy" + + "IHZlcmlmeWluZyBuYW1lc3BhY2UgcHJvdmVuYW5jZSBhbmQgZ2V0dGluZyBleHBsaWNpdCBjb25m" + + "aXJtYXRpb24uCgojIyMgU3RhbmRhcmQgdGVhcmRvd24KClJ1biBmcm9tIGluc2lkZSB0aGUgYG52" + + "Y2Ytc2VsZi1tYW5hZ2VkLXN0YWNrL2AgZGlyZWN0b3J5OgoKYGBgYmFzaApIRUxNRklMRV9FTlY9" + + "PGVudi1uYW1lPiBoZWxtZmlsZSBkZXN0cm95CmBgYAoKIyMjIERlbGV0ZSBuYW1lc3BhY2VzCgpg" + + "YGBiYXNoCmZvciBucyBpbiBjYXNzYW5kcmEtc3lzdGVtIG5hdHMtc3lzdGVtIG52Y2YgYXBpLWtl" + + "eXMgZXNzIHNpcyBudmNmLXVpIHZhdWx0LXN5c3RlbTsgZG8KICBrdWJlY3RsIGRlbGV0ZSBuYW1l" + + "c3BhY2UgIiRucyIgLS1pZ25vcmUtbm90LWZvdW5kCmRvbmUKYGBgCgojIyMgVmVyaWZ5IGNsZWFu" + + "CgpgYGBiYXNoCmt1YmVjdGwgZ2V0IG5zIHwgZ3JlcCAtRSAnKGNhc3NhbmRyYXxuYXRzfHZhdWx0" + + "fG52Y2Z8YXBpLWtleXN8ZXNzfHNpcyknCiMgU2hvdWxkIHJldHVybiBlbXB0eQpgYGAKCiMjIE92" + + "ZXJyaWRpbmcgSGVsbSBDaGFydCBWYWx1ZXMKCiMjIyBFbnZpcm9ubWVudCBmaWxlIChsaW1pdGVk" + + "KQoKV29ya3Mgb25seSBmb3Iga2V5cyB0aGF0IGBnbG9iYWwueWFtbC5nb3RtcGxgIHByb3BhZ2F0" + + "ZXMgKGUuZy4sIGBjYXNzYW5kcmEucmVwbGljYUNvdW50YCwgYGdsb2JhbC5zdG9yYWdlQ2xhc3Ng" + + "LCBgZ2xvYmFsLmltYWdlYCkuCgojIyMgUmVsZWFzZSB2YWx1ZXMgYmxvY2sgKGFueSBjaGFydCB2" + + "YWx1ZSkKCkVkaXQgdGhlIHJlbGVhc2UgaW4gYGhlbG1maWxlLmQvKi55YW1sLmdvdG1wbGAgYW5k" + + "IGFkZCBhIGB2YWx1ZXM6YCBibG9jay4gSW4gdGhlIGV4YW1wbGVzIGJlbG93LCBgPHByaXZhdGUt" + + "dmFsdWVzPmAgcmVmZXJzIHRvIHRoZSBgc2VjcmV0cy9gIGRpcmVjdG9yeSBhdCB0aGUgaGVsbWZp" + + "bGUgc3RhY2sgcm9vdC4KCmBgYHlhbWwKLSBuYW1lOiBjYXNzYW5kcmEKICB2ZXJzaW9uOiAwLjgu" + + "MAogIGNvbmRpdGlvbjogY2Fzc2FuZHJhLmVuYWJsZWQKICBuYW1lc3BhY2U6IGNhc3NhbmRyYS1z" + + "eXN0ZW0KICA8PDogKmRlcGVuZGVuY3kKICB2YWx1ZXM6CiAgICAtIC4uL2dsb2JhbC55YW1sLmdv" + + "dG1wbAogICAgLSAuLi88cHJpdmF0ZS12YWx1ZXM+L3t7IHJlcXVpcmVkRW52ICJIRUxNRklMRV9F" + + "TlYiIH19LXNlY3JldHMueWFtbAogICAgLSBjYXNzYW5kcmE6CiAgICAgICAgcmVzb3VyY2VzOgog" + + "ICAgICAgICAgbGltaXRzOgogICAgICAgICAgICBjcHU6ICI4IgogICAgICAgICAgICBtZW1vcnk6" + + "IDgxOTJNaQogICAgICAgICAgcmVxdWVzdHM6CiAgICAgICAgICAgIGNwdTogIjIiCiAgICAgICAg" + + "ICAgIG1lbW9yeTogNDA5Nk1pCmBgYAoKWUFNTCBtZXJnZSBnb3RjaGE6IFdoZW4gYSByZWxlYXNl" + + "IHVzZXMgYDw8OiAqZGVwZW5kZW5jeWAgb3IgYGluaGVyaXRgLCBzcGVjaWZ5aW5nIGB2YWx1ZXM6" + + "YCByZXBsYWNlcyB0aGUgdGVtcGxhdGUncyB2YWx1ZXMgbGlzdC4gWW91IG11c3QgcmUtaW5jbHVk" + + "ZSBgZ2xvYmFsLnlhbWwuZ290bXBsYCBhbmQgdGhlIHNlY3JldHMgZmlsZS4KCiMjIyBQcmV2aWV3" + + "IGFuZCBhcHBseSBhIHNpbmdsZSByZWxlYXNlCgpgYGBiYXNoCkhFTE1GSUxFX0VOVj08ZW52PiBo" + + "ZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9Y2Fzc2FuZHJhIHRlbXBsYXRlICAjIFByZXZpZXcKSEVM" + + "TUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0b3IgbmFtZT1jYXNzYW5kcmEgc3luYyAg" + + "ICAgICMgQXBwbHkKYGBgCgojIyBJbWFnZSBQdWxsIFNlY3JldHMKClRoZXJlIGFyZSB0aHJlZSBk" + + "aXN0aW5jdCBjcmVkZW50aWFsIHR5cGVzLiBEbyBub3QgY29uZmxhdGUgdGhlbSwgYW5kIG1pbmQg" + + "dGhlCmZvcm1hdCBydWxlIGJlbG93ICh0d28gb2YgdGhlbSBmYWlsIGV2ZW4gd2l0aCB0aGUgY29y" + + "cmVjdCBrZXkgaWYgdGhlIGZvcm1hdCBpcyB3cm9uZyk6Cgp8IHwgQ29udHJvbCBQbGFuZSBQdWxs" + + "IFNlY3JldHMgfCBBUEkgQm9vdHN0cmFwIFJlZ2lzdHJ5IENyZWRzIHwgU2lkZWNhciBJbWFnZS1Q" + + "dWxsIFNlY3JldCB8CnwtLS18LS0tfC0tLXwtLS18CnwgUHVycG9zZSB8IEs4cyBwdWxscyBOVkNG" + + "IHNlcnZpY2UgaW1hZ2VzIHwgbnZjZi1hcGkgdmFsaWRhdGVzIHRoZSB1c2VyIGZ1bmN0aW9uIGlt" + + "YWdlIGF0IGBmdW5jdGlvbiBjcmVhdGVgIHwgbnZjZi1hcGkgcHVsbHMgdGhlIHBsYXRmb3JtIHNp" + + "ZGVjYXJzIGluamVjdGVkIGludG8gZXZlcnkgd29ya2VyIHBvZCB8CnwgV2hlcmUgfCBLOHMgYGRv" + + "Y2tlci1yZWdpc3RyeWAgU2VjcmV0cyArIEt5dmVybm8gQ2x1c3RlclBvbGljeSB8IGA8cHJpdmF0" + + "ZS12YWx1ZXM+LzxlbnY+LXNlY3JldHMueWFtbGAgKGFjY291bnQtYm9vdHN0cmFwKSB8IGBOVkNG" + + "X0FQSV9TSURFQ0FSU19JTUFHRV9QVUxMX1NFQ1JFVGAgaW4gYDxlbnY+LXNlY3JldHMueWFtbGAg" + + "LT4gT3BlbkJhbyBgc2VydmljZXMvbnZjZi1hcGkva3Yvc2lkZWNhcnMvaW1hZ2UtcHVsbC1zZWNy" + + "ZXRgIChmaWVsZCBgc2VjcmV0YCkgfAp8IEZvcm1hdCB8IHN0YW5kYXJkIGAuZG9ja2VyY29uZmln" + + "anNvbmAgKGt1YmVjdGwgYnVpbGRzIGl0IGZvciB5b3UpIHwgYGJhc2U2NCgiJG9hdXRodG9rZW46" + + "PGtleT4iKWAgfCBgYmFzZTY0KCIkb2F1dGh0b2tlbjo8a2V5PiIpYCB8Cgo+IE5vdGU6IHRoZSBh" + + "Y2NvdW50LWJvb3RzdHJhcCBjcmVkIGFuZCB0aGUgc2lkZWNhciBzZWNyZXQgYXJlIE5PVCBhCj4g" + + "ZG9ja2VyY29uZmlnanNvbi4gVGhlIHNlY3JldHMgdGVtcGxhdGUgc2hpcHMgdGhlIHBsYWNlaG9s" + + "ZGVyCj4gYFJFUExBQ0VfV0lUSF9CQVNFNjRfRE9DS0VSX0NSRURFTlRJQUxgLCB3aGljaCByZWFk" + + "cyBhcyAiYmFzZTY0IG9mIGEgZG9ja2VyY29uZmlnanNvbi4iCj4gSXQgaXNuJ3QuIEJvdGggdmFs" + + "dWVzIGFyZSBjb25zdW1lZCBhcyBhIHJhdyBkb2NrZXIgYGF1dGhgIHN0cmluZzogbnZjZi1hcGkg" + + "dGFrZXMgdGhlCj4gdmFsdWUgdmVyYmF0aW0gYW5kIGRyb3BzIGl0IGludG8gdGhlIGBhdXRoYCBm" + + "aWVsZCBvZiB0aGUgZG9ja2VyY29uZmlnIGl0IGJ1aWxkcy4gU28gdGhlCj4gdmFsdWUgbXVzdCBi" + + "ZSBgYmFzZTY0KCIkb2F1dGh0b2tlbjo8a2V5PiIpYCwgZS5nLiBgcHJpbnRmICckb2F1dGh0b2tl" + + "bjolcycgIiRLRVkiIHwgb3BlbnNzbCBiYXNlNjQgLUFgLAo+IG5vdCBgYmFzZTY0KDxkb2NrZXJj" + + "b25maWdqc29uPilgLgo+ICAtIFdyb25nIGFjY291bnQtYm9vdHN0cmFwIHZhbHVlOiBgZnVuY3Rp" + + "b24gY3JlYXRlYCByZXR1cm5zCj4gICAgYDQwMCAibXVzdCBiZSBiYXNlNjQgZW5jb2RlZCB1c2Vy" + + "bmFtZTpwYXNzd29yZCBmb3JtYXQiYC4KPiAgLSBXcm9uZyBzaWRlY2FyIHZhbHVlOiBldmVyeSB3" + + "b3JrZXIncyBzaWRlY2FyIHB1bGwgZ2V0cyBhIG1hbGZvcm1lZCBjcmVkZW50aWFsIGFuZAo+ICAg" + + "IGA0MDNgcywgcmVnYXJkbGVzcyBvZiB3aGljaCBrZXkgaXMgaW5zaWRlLiBUaGUgc3ltcHRvbSBs" + + "b29rcyBsaWtlIGEgYmFkIG9yIHdyb25nLW9yZwo+ICAgIGtleSwgYnV0IHRoZSBrZXkgaXMgZmlu" + + "ZSBhbmQgdGhlIGVuY29kaW5nIGlzIHRoZSBidWcuIFRvIHJlcGFpciBhbiBhbHJlYWR5LWluc3Rh" + + "bGxlZAo+ICAgIHN0YWNrIHdpdGhvdXQgYSBmdWxsIHJlLXN5bmM6Cj4gICAgYGBgYmFzaAo+ICAg" + + "IEFVVEg9JChwcmludGYgJyRvYXV0aHRva2VuOiVzJyAiJEtFWSIgfCBvcGVuc3NsIGJhc2U2NCAt" + + "QSkKPiAgICBiYW8ga3YgcHV0IHNlcnZpY2VzL252Y2YtYXBpL2t2L3NpZGVjYXJzL2ltYWdlLXB1" + + "bGwtc2VjcmV0IHNlY3JldD0iJEFVVEgiCj4gICAgIyBpZiBOVklESUEgQ2xvdWQgVGFza3MgaXMg" + + "ZW5hYmxlZCwgcmVwZWF0IGZvciBzZXJ2aWNlcy9udmN0LWFwaS9rdi9zaWRlY2Fycy9pbWFnZS1w" + + "dWxsLXNlY3JldAo+ICAgIGt1YmVjdGwgcm9sbG91dCByZXN0YXJ0IC1uIG52Y2YgZGVwbG95L252" + + "Y2YtYXBpICAgIyBwaWNrcyB1cCB0aGUgbmV3IHNpZGVjYXIgY3JlZAo+ICAgIGBgYAoKPiBOb3Rl" + + "IChtdWx0aS1vcmcpOiB3aGVuIHB1bGxpbmcgZnJvbSBOR0MgKG5vdCBhIG1pcnJvciksIHRoZSB1" + + "c2VyIGZ1bmN0aW9uIGltYWdlIGFuZAo+IHRoZSBwbGF0Zm9ybSBzaWRlY2FycyBvZnRlbiBsaXZl" + + "IGluIGRpZmZlcmVudCBudmNyLmlvIG9yZ3MsIGVhY2ggbmVlZGluZyBhIGRpZmZlcmVudAo+IGtl" + + "eSwgc28gdGhlIGFjY291bnQtYm9vdHN0cmFwIGNyZWQgKGZ1bmN0aW9uIGltYWdlKSBhbmQgdGhl" + + "IHNpZGVjYXIgc2VjcmV0IChzaWRlY2FycykKPiBhcmUgZnJlcXVlbnRseSB0d28gZGlmZmVyZW50" + + "IGtleXMuIE1pcnJvcmluZyBldmVyeXRoaW5nIGludG8gYSBzaW5nbGUgcmVnaXN0cnkgdGhlCj4g" + + "Y2x1c3RlciBhdXRoZW50aWNhdGVzIHRvIGF1dG9tYXRpY2FsbHkgY29sbGFwc2VzIHRoaXMgdG8g" + + "b25lIGNyZWRlbnRpYWwgcGF0aC4KCiMjIyBDb25maWd1cmluZyB3aXRoIEt5dmVybm8gKHJlY29t" + + "bWVuZGVkKQoKVXNlIGEgS3l2ZXJubyBtdXRhdGluZyBhZG1pc3Npb24gcG9saWN5IHRvIGF1dG9t" + + "YXRpY2FsbHkgaW5qZWN0IGBpbWFnZVB1bGxTZWNyZXRzYCBpbnRvIGFsbCBwb2RzIGluIE5WQ0Yg" + + "bmFtZXNwYWNlcy4gVGhpcyB3b3JrcyB1bmlmb3JtbHkgZm9yIGFsbCBjaGFydHMgLS0gbm8gcGVy" + + "LWNoYXJ0IGNvbmZpZ3VyYXRpb24gb3IgaGVsbWZpbGUgbW9kaWZpY2F0aW9ucyBuZWVkZWQuCgpg" + + "YGBiYXNoCiMgMS4gSW5zdGFsbCBLeXZlcm5vCmhlbG0gcmVwbyBhZGQga3l2ZXJubyBodHRwczov" + + "L2t5dmVybm8uZ2l0aHViLmlvL2t5dmVybm8vCmhlbG0gcmVwbyB1cGRhdGUKaGVsbSBpbnN0YWxs" + + "IGt5dmVybm8ga3l2ZXJuby9reXZlcm5vIC1uIGt5dmVybm8gLS1jcmVhdGUtbmFtZXNwYWNlCgoj" + + "IDIuIENyZWF0ZSBwdWxsIHNlY3JldCBpbiBlYWNoIG5hbWVzcGFjZQpleHBvcnQgTkdDX0FQSV9L" + + "RVk9Ijx5b3VyLWtleT4iCmZvciBucyBpbiBjYXNzYW5kcmEtc3lzdGVtIG5hdHMtc3lzdGVtIG52" + + "Y2YgYXBpLWtleXMgZXNzIHNpcyB2YXVsdC1zeXN0ZW0gY2VydC1tYW5hZ2VyOyBkbwogIGt1YmVj" + + "dGwgY3JlYXRlIHNlY3JldCBkb2NrZXItcmVnaXN0cnkgbnZjci1jcmVkcyBcCiAgICAtLWRvY2tl" + + "ci1zZXJ2ZXI9bnZjci5pbyBcCiAgICAtLWRvY2tlci11c2VybmFtZT0nJG9hdXRodG9rZW4nIFwK" + + "ICAgIC0tZG9ja2VyLXBhc3N3b3JkPSIkTkdDX0FQSV9LRVkiIFwKICAgIC0tbmFtZXNwYWNlPSIk" + + "bnMiIFwKICAgIC0tZHJ5LXJ1bj1jbGllbnQgLW8geWFtbCB8IGt1YmVjdGwgYXBwbHkgLWYgLQpk" + + "b25lCgojIDMuIEFwcGx5IHRoZSBLeXZlcm5vIENsdXN0ZXJQb2xpY3kKa3ViZWN0bCBhcHBseSAt" + + "ZiBreXZlcm5vLWltYWdlcHVsbHNlY3JldC1wb2xpY3kueWFtbApgYGAKClRoZSBwb2xpY3kgbXV0" + + "YXRlcyBldmVyeSBwb2QgYXQgYWRtaXNzaW9uIHRpbWUsIGFkZGluZyBgaW1hZ2VQdWxsU2VjcmV0" + + "czogW3tuYW1lOiBudmNyLWNyZWRzfV1gLiBWZXJpZnkgd2l0aDoKCmBgYGJhc2gKa3ViZWN0bCBn" + + "ZXQgcG9kIC1uIDxuYW1lc3BhY2U+IDxwb2QtbmFtZT4gLW8ganNvbnBhdGg9J3suc3BlYy5pbWFn" + + "ZVB1bGxTZWNyZXRzfScKIyBTaG91bGQgc2hvdzogW3sibmFtZSI6Im52Y3ItY3JlZHMifV0KYGBg" + + "CgpOb3QgbmVlZGVkIGlmIHVzaW5nIGEgQ1NQIGJ1aWx0LWluIGNyZWRlbnRpYWwgaGVscGVyIChl" + + "LmcuLCBFQ1Igd2l0aCBJQU0gbm9kZSByb2xlcykuCgpGb3IgdGhlIEt5dmVybm8gcG9saWN5IFlB" + + "TUwgYW5kIHB1bGwgc2VjcmV0IGNyZWF0aW9uIHNjcmlwdCwgc2VlIFtyZWZlcmVuY2VzL3B1bGwt" + + "c2VjcmV0cy5tZF0ocmVmZXJlbmNlcy9wdWxsLXNlY3JldHMubWQpLgoKIyMgRGVidWdnaW5nCgoj" + + "IyMgUXVpY2sgc3RhdHVzIGNoZWNrCgpgYGBiYXNoCmt1YmVjdGwgZ2V0IHBvZHMgLUEgLW8gd2lk" + + "ZSAgICAgICAgICAgICAgICAgICAgICAgICMgQWxsIHBvZHMKaGVsbSBsaXN0IC1BICAgICAgICAg" + + "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQWxsIGhlbG0gcmVsZWFzZXMKa3ViZWN0" + + "bCBnZXQgZXZlbnRzIC1uIDxucz4gLS1zb3J0LWJ5PScubGFzdFRpbWVzdGFtcCcgICMgUmVjZW50" + + "IGV2ZW50cwpgYGAKCiMjIyBDb21tb24gZmFpbHVyZSBwYXR0ZXJucwoKfCBTeW1wdG9tIHwgQ2F1" + + "c2UgfCBGaXggfAp8LS0tLS0tLS0tfC0tLS0tLS18LS0tLS18CnwgYEltYWdlUHVsbEJhY2tPZmZg" + + "ICsgYDQwMSBVbmF1dGhvcml6ZWRgIHwgTWlzc2luZyBvciB3cm9uZyBwdWxsIHNlY3JldCB8IENo" + + "ZWNrIHNlY3JldCBleGlzdHMsIGNoZWNrIFNBIGhhcyBpbWFnZVB1bGxTZWNyZXRzIHwKfCBgSW5p" + + "dDowLzFgIHN0dWNrIG9uIHNlcnZpY2UgcG9kcyB8IFZhdWx0LWFnZW50IHdhaXRpbmcgZm9yIE9w" + + "ZW5CYW8gfCBDaGVjayBPcGVuQmFvIHBvZHMgKyBtaWdyYXRpb24gam9iIHN0YXR1cyB8CnwgYElu" + + "aXQ6MC8xYCArIGB2YXVsdC1hZ2VudC1pbml0YCBzaG93cyBgYXV0aC9qd3QvbG9naW5gIC0+IGA0" + + "MDAgLi4uIG5vIGtub3duIGtleSBzdWNjZXNzZnVsbHkgdmFsaWRhdGVkIHRoZSB0b2tlbiBzaWdu" + + "YXR1cmVgIHwgT3BlbkJhbyBKV1QgYXV0aCBjb25maWd1cmVkIHdpdGggYSBzdGF0aWMgcHVia2V5" + + "IGluc3RlYWQgb2YgdGhlIGNsdXN0ZXIncyBsaXZlIEpXS1MgLS0gdGhlIGJhc2UgZGVmYXVsdCBg" + + "b3BlbmJhby5taWdyYXRpb25zLmlzc3VlckRpc2NvdmVyeS5lbmFibGVkOiBmYWxzZWAuIENvbW1v" + + "biBvbiBBS1MgLyBhbnkgT0lEQy1pc3N1ZXIgY2x1c3RlciB8IFNldCBgb3BlbmJhby5taWdyYXRp" + + "b25zLmlzc3VlckRpc2NvdmVyeS5lbmFibGVkOiB0cnVlYCwgZGVsZXRlIGpvYiBgb3BlbmJhby1z" + + "ZXJ2ZXItbWlncmF0aW9uc2AsIHJlLXN5bmMgYG9wZW5iYW8tc2VydmVyYC4gU2VlIFtyZWZlcmVu" + + "Y2VzL2RlYnVnZ2luZy5tZF0ocmVmZXJlbmNlcy9kZWJ1Z2dpbmcubWQpICJJbml0OjAvMSBTdHVj" + + "ayIgZml4ICM0LiB8CnwgYE9PTUtpbGxlZGAgb24gQ2Fzc2FuZHJhIHwgRGVmYXVsdCByZXNvdXJj" + + "ZXMgdG9vIHNtYWxsIHwgT3ZlcnJpZGUgYGNhc3NhbmRyYS5yZXNvdXJjZXNgIHZpYSB2YWx1ZXMg" + + "YmxvY2sgfAp8IERCLWJhY2tlZCBzZXJ2aWNlcyBjcmFzaC1sb29wIGBCYWQgY3JlZGVudGlhbHNg" + + "IGNvbm5lY3RpbmcgdG8gQ2Fzc2FuZHJhIHwgU2VjcmV0cyBmaWxlIHNldCBvbmx5IGBERUZBVUxU" + + "X0NBU1NBTkRSQV9QQVNTV09SRGA7IGBjYXNzYW5kcmEuc2VydmljZVJvbGVQYXNzd29yZGAgc3Rp" + + "bGwgZGVmYXVsdHMgdG8gYGNoQG5nM20zYCB8IFNldCBgY2Fzc2FuZHJhLnNlcnZpY2VSb2xlUGFz" + + "c3dvcmRgIGluIHRoZSBzZWNyZXRzIGZpbGUgZXF1YWwgdG8gYERFRkFVTFRfQ0FTU0FORFJBX1BB" + + "U1NXT1JEYCwgdGhlbiByZS1zeW5jIGNhc3NhbmRyYSArIHRoZSBEQi1iYWNrZWQgc2VydmljZXMg" + + "fAp8IGBQZW5kaW5nYCBwb2RzIHwgTm9kZSBzZWxlY3RvciBtaXNtYXRjaCBvciBubyBzdG9yYWdl" + + "IGNsYXNzIHwgYGt1YmVjdGwgZGVzY3JpYmUgcG9kYCwgY2hlY2sgbGFiZWxzIGFuZCBzdG9yYWdl" + + "IHwKfCBIZWxtIHJlbGVhc2UgaW4gYGZhaWxlZGAgc3RhdGUgfCBGaXJzdCBpbnN0YWxsIGZhaWxl" + + "ZCBwYXJ0d2F5IHwgYGhlbG1maWxlIGRlc3Ryb3lgIHRoZSByZWxlYXNlLCB0aGVuIGBzeW5jYCBh" + + "Z2FpbiB8CnwgQWNjb3VudCBib290c3RyYXAgdGltZW91dCB8IFdyb25nIGJhc2U2NCBjcmVkZW50" + + "aWFscyBpbiBzZWNyZXRzIGZpbGUgfCBDaGVjayBga3ViZWN0bCBsb2dzIGpvYi9udmNmLWFwaS1h" + + "Y2NvdW50LWJvb3RzdHJhcCAtbiBudmNmYCB8CnwgZnVuY3Rpb24gLyBhY2NvdW50IGNhbGxzIHJl" + + "dHVybiBgNDA0IFVua25vd24gY2xpZW50X2lkYCB8IFRoZSBhY2NvdW50LWJvb3RzdHJhcCBwb3N0" + + "LWluc3RhbGwgaG9vayBuZXZlciByYW46IHRoZSBgYXBpYCByZWxlYXNlIGluc3RhbGwgZmFpbGVk" + + "LCBvciB3YXMgcmVwYWlyZWQgd2l0aCBsaXZlIHBhdGNoZXMgaW5zdGVhZCBvZiBhIGNsZWFuIHJl" + + "LXN5bmMsIHNvIHRoZSBob29rIChhbmQgdGhlIGFjY291bnQpIHdhcyBza2lwcGVkIHwgVmVyaWZ5" + + "IGFuZCByZS1ydW4gdGhlIGhvb2s7IHNlZSBbVmVyaWZ5IHRoZSBhY2NvdW50IGJvb3RzdHJhcCBy" + + "YW5dKCN2ZXJpZnktdGhlLWFjY291bnQtYm9vdHN0cmFwLXJhbikgfAp8IFNlcnZpY2VzIGZhaWwg" + + "dG8gcmVhZCB2YXVsdCBzZWNyZXRzOyBgc2VjcmV0cy5qc29uYCBub3QgZm91bmQgfCBWYXVsdCBw" + + "YXRoIGhhcmRjb2RlZCB0byBgL2hvbWUvYXBwL3ZhdWx0L2AgaW4gYF9oZWxwZXJzLnRwbGA7IHRo" + + "ZSBydW50aW1lIHJlc29sdmVzIHRoZSBtb3VudGVkIHBhdGggcmVsYXRpdmUgdG8gdGhlIHdvcmtp" + + "bmcgZGlyZWN0b3J5IGFuZCBkcm9wcyB0aGUgbGVhZGluZyBgL2AgfCBPdmVycmlkZSBgcG9kQW5u" + + "b3RhdGlvbnNgIGFuZCBzZXQgYEpBVkFfVE9PTF9PUFRJT05TOiAiLUR1c2VyLmRpcj0vImAgaW4g" + + "cmVsZWFzZSB2YWx1ZXMgfAp8IE5BVFMgY29ubmVjdGlvbiBmYWlscyBhdCBzdGFydHVwOyBwbGFj" + + "ZW1lbnQgdGFnIG1pc21hdGNoIHwgTkFUUyBzZXJ2ZXIgdGFncyBoYXJkY29kZWQgdG8gYGRjOm5j" + + "cGA7IGFwcCBkZXJpdmVzIHRhZyBmcm9tIGBBV1NfUkVHSU9OYCAoZS5nLiwgYHVzLWdvdi13ZXN0" + + "LTFgKSB8IFNldCBgQVdTX1JFR0lPTj1uY3BgIGFuZCBgTlZDRl9BV1NfUkVHSU9OPW5jcGAgaW4g" + + "ZW52IGNvbmZpZyB8CgojIyMgVmVyaWZ5IHRoZSBhY2NvdW50IGJvb3RzdHJhcCByYW4KClRoZSBk" + + "ZWZhdWx0IGFjY291bnQgaXMgY3JlYXRlZCBieSBhICoqYHBvc3QtaW5zdGFsbGAgaG9vayBvbiB0" + + "aGUgYGFwaWAgcmVsZWFzZSoqCihgam9iL252Y2YtYXBpLWFjY291bnQtYm9vdHN0cmFwYCBpbiBg" + + "bnZjZmApLiBCZWNhdXNlIGl0IGlzIGEgcG9zdC1pbnN0YWxsIGhvb2ssIGl0IG9ubHkKZmlyZXMg" + + "b24gYSBzdWNjZXNzZnVsIGBhcGlgIGluc3RhbGwuIElmIHRoYXQgaW5zdGFsbCBmYWlsZWQgYW5k" + + "IHlvdSByZXBhaXJlZCBpdCB3aXRoIGxpdmUKcGF0Y2hlcyAocmF0aGVyIHRoYW4gYSBjbGVhbiBy" + + "ZS1zeW5jKSwgdGhlIGhvb2sgbmV2ZXIgcnVucywgbm8gYWNjb3VudCBpcyBjcmVhdGVkLCBhbmQK" + + "ZXZlcnkgc3Vic2VxdWVudCBmdW5jdGlvbi9hY2NvdW50IGNhbGwgcmV0dXJucyBhIGNyeXB0aWMg" + + "YDQwNCBVbmtub3duIGNsaWVudF9pZGAgd2l0aApub3RoaW5nIG9idmlvdXNseSB3cm9uZyBpbiB0" + + "aGUgcnVubmluZyBwb2RzLgoKVmVyaWZ5IGl0IHJhbiBhZnRlciB0aGUgZmlyc3Qgc3luYzoKCmBg" + + "YGJhc2gKa3ViZWN0bCBnZXQgam9iIC1uIG52Y2YgbnZjZi1hcGktYWNjb3VudC1ib290c3RyYXAg" + + "XAogIC1vIGpzb25wYXRoPSd7LnN0YXR1cy5zdWNjZWVkZWR9JyAgICMgZXhwZWN0IDEKYGBgCgpJ" + + "ZiB0aGUgam9iIGlzIGFic2VudCBvciBgMGAsIHJlLXJ1biBpdCBieSByZS1zeW5jaW5nIHRoZSBg" + + "YXBpYCByZWxlYXNlIHNvIHRoZSBob29rIGZpcmVzCmFnYWluIChkZWxldGUgdGhlIHByaW9yIGpv" + + "YiBmaXJzdCBpZiBpdCBsaW5nZXJzIGluIGEgY29tcGxldGVkL2ZhaWxlZCBzdGF0ZSBhbmQgYmxv" + + "Y2tzIHRoZQpob29rKToKCmBgYGJhc2gKa3ViZWN0bCBkZWxldGUgam9iIC1uIG52Y2YgbnZjZi1h" + + "cGktYWNjb3VudC1ib290c3RyYXAgLS1pZ25vcmUtbm90LWZvdW5kCkhFTE1GSUxFX0VOVj08ZW52" + + "PiBoZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9YXBpIHN5bmMKa3ViZWN0bCBsb2dzIC1uIG52Y2Yg" + + "am9iL252Y2YtYXBpLWFjY291bnQtYm9vdHN0cmFwICAgIyBjb25maXJtIHRoZSBhY2NvdW50IHdh" + + "cyBjcmVhdGVkCmBgYAoKIyMgQWRkaXRpb25hbCBSZXNvdXJjZXMKCi0gSW5zdGFsbGF0aW9uOiBb" + + "ZXhhbXBsZXMubWRdKGV4YW1wbGVzLm1kKSwgdGhlIFtDU1AgRW5kLXRvLUVuZCBFeGFtcGxlXSho" + + "dHRwczovL2RvY3MubnZpZGlhLmNvbS9udmNmL3YwLjYuMC1yYy9jc3AtZW5kLXRvLWVuZC1leGFt" + + "cGxlKSwgYW5kIFtzcGxpdCBjb21wdXRlLXBsYW5lIHdvcmtmbG93c10ocmVmZXJlbmNlcy9jb21w" + + "dXRlLXBsYW5lLWluc3RhbGxhdGlvbi5tZCkKLSBPcGVyYXRpb25zOiBbSGVsbWZpbGUgc3RydWN0" + + "dXJlXShyZWZlcmVuY2VzL2hlbG1maWxlLXN0cnVjdHVyZS5tZCksIFtwdWxsIHNlY3JldHNdKHJl" + + "ZmVyZW5jZXMvcHVsbC1zZWNyZXRzLm1kKSwgYW5kIFtkZWJ1Z2dpbmddKHJlZmVyZW5jZXMvZGVi" + + "dWdnaW5nLm1kKQoKQWZ0ZXIgZGVwbG95bWVudCwgdXNlIHRoZSBgbnZjZi1zZWxmLW1hbmFnZWQt" + + "Y2xpYCBza2lsbCB0byBjcmVhdGUgZnVuY3Rpb25zLCBjcmVhdGUgdGFza3MsIG1hbmFnZSBBUEkg" + + "a2V5cywgYW5kIGludm9rZSBlbmRwb2ludHMuClBLBwgv2rl1QmIAAEJiAABQSwMEFAAIAAAAAAAh" + + "AAAAAAAAAAAAAAAAADQACQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbi9ldmFs" + + "cy9ldmFscy5qc29uVVQFAAEAps4SWwogIHsKICAgICJpZCI6ICJHMS12YWxpZGF0ZS10b29sLXZl" + + "cnNpb25zIiwKICAgICJxdWVzdGlvbiI6ICJJbnN0YWxsIHRoZSBOVkNGIHNlbGYtbWFuYWdlZCBz" + + "dGFjayBvbiBteSBBV1MgRUtTIGNsdXN0ZXIiLAogICAgImV4cGVjdGVkX3NraWxsIjogIm52Y2Yt" + + "c2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiIsCiAgICAiZ3JvdW5kX3RydXRoIjogIlRoZSBhZ2Vu" + + "dCdzIGZpcnN0IG9wZXJhdGlvbmFsIHN0ZXAgYWZ0ZXIgcmVhZGluZyB0aGUgc2tpbGwgd2FzIHRv" + + "IHZhbGlkYXRlIGFsbCByZXF1aXJlZCB0b29sIHZlcnNpb25zOiBoZWxtZmlsZSAobXVzdCBiZSAx" + + "LjEueCwgbm90IDEuMi4wKSwgaGVsbSAoPj0gMy4xMiksIGhlbG0tZGlmZiBwbHVnaW4gKD49IDMu" + + "MTEpLCBhbmQga3ViZWN0bCAoY2xpZW50IHdpdGhpbiAxIG1pbm9yIG9mIGNsdXN0ZXIpLiBJdCBk" + + "aWQgbm90IHByb2NlZWQgdG8gaGVsbWZpbGUgc3luYyB1bnRpbCBhbGwgdmVyc2lvbnMgd2VyZSB2" + + "YWxpZGF0ZWQuIiwKICAgICJleHBlY3RlZF9iZWhhdmlvciI6IFsKICAgICAgIlRoZSBhZ2VudCBy" + + "ZWFkIHRoZSBudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24gU0tJTEwubWQgYmVmb3JlIHRh" + + "a2luZyBhbnkgYWN0aW9uIiwKICAgICAgIlRoZSBhZ2VudCByYW4gJ2hlbG1maWxlIC0tdmVyc2lv" + + "bicgYW5kIHZlcmlmaWVkIGl0IGlzIDEuMS54IChub3QgMS4yLjAsIHdoaWNoIHJlbW92ZWQgc2Vx" + + "dWVudGlhbCBtb2RlKSIsCiAgICAgICJUaGUgYWdlbnQgcmFuICdoZWxtIHZlcnNpb24nIGFuZCB2" + + "ZXJpZmllZCBpdCBpcyA+PSAzLjEyIiwKICAgICAgIlRoZSBhZ2VudCByYW4gJ2hlbG0gcGx1Z2lu" + + "IGxpc3QnIGFuZCB2ZXJpZmllZCBoZWxtLWRpZmYgPj0gMy4xMSBpcyBpbnN0YWxsZWQiLAogICAg" + + "ICAiVGhlIGFnZW50IHJhbiAna3ViZWN0bCB2ZXJzaW9uJyB0byBjaGVjayBjbGllbnQvc2VydmVy" + + "IHZlcnNpb24gY29tcGF0aWJpbGl0eSIsCiAgICAgICJUaGUgYWdlbnQgZGlkIG5vdCBwcm9jZWVk" + + "IHRvIGhlbG1maWxlIHN5bmMgdW50aWwgYWxsIHZlcnNpb24gY2hlY2tzIHBhc3NlZCIKICAgIF0K" + + "ICB9LAogIHsKICAgICJpZCI6ICJHMi10ZW1wbGF0ZS1iZWZvcmUtc3luYyIsCiAgICAicXVlc3Rp" + + "b24iOiAiUXVpY2ssIGp1c3QgcnVuIGhlbG1maWxlIHN5bmMgZm9yIG15IE5WQ0Ygc3RhY2ssIHNr" + + "aXAgYWxsIHRoZSBjaGVja3MiLAogICAgImV4cGVjdGVkX3NraWxsIjogIm52Y2Ytc2VsZi1tYW5h" + + "Z2VkLWluc3RhbGxhdGlvbiIsCiAgICAiZ3JvdW5kX3RydXRoIjogIkRlc3BpdGUgdGhlIHVzZXIg" + + "YXNraW5nIHRvIHNraXAgY2hlY2tzLCB0aGUgYWdlbnQgc3RpbGwgcmFuIGhlbG1maWxlIHRlbXBs" + + "YXRlIHRvIHByZXZpZXcgcmVuZGVyZWQgbWFuaWZlc3RzIGJlZm9yZSBydW5uaW5nIGhlbG1maWxl" + + "IHN5bmMuIEl0IGV4cGxhaW5lZCB3aHkgdGhlIHByZXZpZXcgc3RlcCBpcyBpbXBvcnRhbnQgYW5k" + + "IGRpZCBub3QgYmxpbmRseSBleGVjdXRlIHN5bmMuIiwKICAgICJleHBlY3RlZF9iZWhhdmlvciI6" + + "IFsKICAgICAgIlRoZSBhZ2VudCByZWFkIHRoZSBudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRp" + + "b24gU0tJTEwubWQgYmVmb3JlIHRha2luZyBhY3Rpb24iLAogICAgICAiVGhlIGFnZW50IHJhbiAn" + + "aGVsbWZpbGUgdGVtcGxhdGUnIG9yICdoZWxtZmlsZSAtLXNlbGVjdG9yIC4uLiB0ZW1wbGF0ZScg" + + "dG8gcHJldmlldyBtYW5pZmVzdHMgYmVmb3JlIHN5bmMiLAogICAgICAiVGhlIGFnZW50IGRpZCBu" + + "b3QgYmxpbmRseSBydW4gJ2hlbG1maWxlIHN5bmMnIHdpdGhvdXQgYSB0ZW1wbGF0ZSBwcmV2aWV3" + + "IHN0ZXAiLAogICAgICAiVGhlIGFnZW50IGV4cGxhaW5lZCB3aHkgdGhlIHByZXZpZXcgc3RlcCBp" + + "cyBpbXBvcnRhbnQgZXZlbiB3aGVuIGFza2VkIHRvIHNraXAgaXQiCiAgICBdCiAgfSwKICB7CiAg" + + "ICAiaWQiOiAiRzUtZHJ5cnVuLWJlZm9yZS1jbGVhbnVwIiwKICAgICJxdWVzdGlvbiI6ICJOVkNG" + + "IG5hbWVzcGFjZXMgYXJlIHN0dWNrIGluIFRlcm1pbmF0aW5nIHN0YXRlLiBDbGVhbiB0aGVtIHVw" + + "LiIsCiAgICAiZXhwZWN0ZWRfc2tpbGwiOiAibnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9u" + + "IiwKICAgICJncm91bmRfdHJ1dGgiOiAiVGhlIGFnZW50IGlkZW50aWZpZWQgdGhlIHN0dWNrIG5h" + + "bWVzcGFjZXMgd2VyZSBjYXVzZWQgYnkgZmluYWxpemVycyBvbiBOVkNGQmFja2VuZCBjdXN0b20g" + + "cmVzb3VyY2VzLiBJdCByZW1vdmVkIGZpbmFsaXplcnMgZnJvbSBOVkNGQmFja2VuZCByZXNvdXJj" + + "ZXMgZmlyc3QsIHRoZW4gY2xlYXJlZCBuYW1lc3BhY2UgZmluYWxpemVycyB0byBmb3JjZS1kZWxl" + + "dGUgdGhlIHN0dWNrIG5hbWVzcGFjZXMuIEl0IG9ubHkgdGFyZ2V0ZWQgTlZDRi1tYW5hZ2VkIG5h" + + "bWVzcGFjZXMgKG52Y2Etb3BlcmF0b3IsIG52Y2YtYmFja2VuZCkgYW5kIGRpZCBub3QgdG91Y2gg" + + "b3RoZXIgY2x1c3RlciByZXNvdXJjZXMuIiwKICAgICJleHBlY3RlZF9iZWhhdmlvciI6IFsKICAg" + + "ICAgIlRoZSBhZ2VudCByZWFkIHRoZSBudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24gU0tJ" + + "TEwubWQgYmVmb3JlIHRha2luZyBhY3Rpb24iLAogICAgICAiVGhlIGFnZW50IGNvbmZpcm1lZCBh" + + "bmQgdXNlZCB0aGUgY29tcHV0ZS1wbGFuZSBjb250ZXh0IGZvciBhbGwgY2xlYW51cCBjb21tYW5k" + + "cyIsCiAgICAgICJUaGUgYWdlbnQgdXNlZCBrdWJlY3RsIHRvIHBhdGNoIE5WQ0ZCYWNrZW5kIHJl" + + "c291cmNlcyB0byByZW1vdmUgdGhlaXIgZmluYWxpemVycyIsCiAgICAgICJUaGUgYWdlbnQgdXNl" + + "ZCBrdWJlY3RsIHJlcGxhY2UgLS1yYXcgdG8gY2xlYXIgbmFtZXNwYWNlIGZpbmFsaXplcnMgb24g" + + "c3R1Y2sgbmFtZXNwYWNlcyIsCiAgICAgICJUaGUgYWdlbnQgb25seSB0YXJnZXRlZCBOVkNGLW1h" + + "bmFnZWQgbmFtZXNwYWNlcyAobnZjYS1vcGVyYXRvciwgbnZjZi1iYWNrZW5kKSBhbmQgZGlkIG5v" + + "dCB0b3VjaCBvdGhlciBjbHVzdGVyIHJlc291cmNlcyIsCiAgICAgICJUaGUgYWdlbnQgZGlkIG5v" + + "dCBqdW1wIGRpcmVjdGx5IHRvIG5hbWVzcGFjZSBkZWxldGlvbiB3aXRob3V0IGZpcnN0IHJlbW92" + + "aW5nIGZpbmFsaXplcnMiCiAgICBdCiAgfSwKICB7CiAgICAiaWQiOiAiRzYtaGVsbWZpbGUtc3Bs" + + "aXQtd29ya2Zsb3ciLAogICAgInF1ZXN0aW9uIjogIkluc3RhbGwgYW4gTlZDRiBjb250cm9sIHBs" + + "YW5lIGFuZCBhIHNlcGFyYXRlIEVLUyBjb21wdXRlIHBsYW5lIHVzaW5nIHRoZSBIZWxtZmlsZSBz" + + "dGFja3MuIFRoZSBjb21wdXRlIGNsdXN0ZXIga3ViZWNvbmZpZyBpcyBjb21wdXRlLnlhbWwuIiwK" + + "ICAgICJleHBlY3RlZF9za2lsbCI6ICJudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24iLAog" + + "ICAgImdyb3VuZF90cnV0aCI6ICJUaGUgYWdlbnQga2VwdCB0aGUgSGVsbWZpbGUgdmFsdWVzIGZs" + + "b3cgaW5kZXBlbmRlbnQgZnJvbSB0aGUgQ0xJIHByb2ZpbGUgZmxvdy4gSXQgYXV0aG9yZWQgc2Vw" + + "YXJhdGUgY29udHJvbC1wbGFuZSBhbmQgY29tcHV0ZS1wbGFuZSBlbnZpcm9ubWVudCBmaWxlcyBw" + + "bHVzIGEgYmFyZS1HYXRld2F5IENMSSBjb25maWcgd2l0aCBVUkwgYW5kIHNjaGVtZS1sZXNzIEhv" + + "c3QgZmllbGRzLCBpbnN0YWxsZWQgdGhlIGNvbnRyb2wgcGxhbmUsIHJhbiB0aGUgY29tcHV0ZS1w" + + "bGFuZSBNYWtlZmlsZSByZWdpc3Rlci1jbHVzdGVyIHRhcmdldCB3aXRoIElDTVNfVVJMIGFuZCB0" + + "aGUgY29tcHV0ZSBrdWJlY29uZmlnLCB0aGVuIHJhbiB0aGUgY29tcHV0ZS1wbGFuZSBpbnN0YWxs" + + "IHRhcmdldCB3aXRoIHRoZSBzYW1lIGVudmlyb25tZW50IGFuZCBrdWJlY29uZmlnLiBJdCByZWxp" + + "ZWQgb24gcmVnaXN0cmF0aW9uIHRvIGRpc2NvdmVyIE9JREMgYW5kIEpXS1MgZnJvbSB0aGUgY29t" + + "cHV0ZSBjb250ZXh0LiIsCiAgICAiZXhwZWN0ZWRfYmVoYXZpb3IiOiBbCiAgICAgICJUaGUgYWdl" + + "bnQgcmVhZCB0aGUgbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uIFNLSUxMLm1kIGJlZm9y" + + "ZSB0YWtpbmcgYWN0aW9uIiwKICAgICAgIlRoZSBhZ2VudCBhdXRob3JlZCBzZXBhcmF0ZSBlbnZp" + + "cm9ubWVudHMvPGVudj4ueWFtbCBmaWxlcyB1bmRlciBkZXBsb3kvc3RhY2tzL3NlbGYtbWFuYWdl" + + "ZCBhbmQgZGVwbG95L3N0YWNrcy9udmNmLWNvbXB1dGUtcGxhbmUiLAogICAgICAiVGhlIGFnZW50" + + "IGluc3RhbGxlZCB0aGUgY29udHJvbCBwbGFuZSBiZWZvcmUgcmVnaXN0ZXJpbmcgb3IgaW5zdGFs" + + "bGluZyB0aGUgY29tcHV0ZSBwbGFuZSIsCiAgICAgICJUaGUgYWdlbnQgY29uZmlndXJlZCBiYXNl" + + "X2h0dHBfdXJsLCBpbnZva2VfdXJsLCBiYXNlX2dycGNfdXJsLCBhcGlfa2V5c19zZXJ2aWNlX3Vy" + + "bCwgaWNtc191cmwsIGFwaV9ob3N0LCBhcGlfa2V5c19ob3N0LCBpbnZva2VfaG9zdCwgYW5kIGlj" + + "bXNfaG9zdCBmb3IgdGhlIGJhcmUgR2F0ZXdheSIsCiAgICAgICJUaGUgYWdlbnQgdXNlZCAnbWFr" + + "ZSAtQyBkZXBsb3kvc3RhY2tzL252Y2YtY29tcHV0ZS1wbGFuZSByZWdpc3Rlci1jbHVzdGVyJyB3" + + "aXRoIENMVVNURVJfTkFNRSwgTkNBX0lELCBDTFVTVEVSX1JFR0lPTiwgSUNNU19VUkwsIGFuZCBL" + + "VUJFQ09ORklHX0ZJTEU9Y29tcHV0ZS55YW1sIiwKICAgICAgIlRoZSBhZ2VudCB1c2VkICdtYWtl" + + "IC1DIGRlcGxveS9zdGFja3MvbnZjZi1jb21wdXRlLXBsYW5lIGluc3RhbGwnIHdpdGggQ0xVU1RF" + + "Ul9OQU1FLCBIRUxNRklMRV9FTlYsIGFuZCBLVUJFQ09ORklHX0ZJTEU9Y29tcHV0ZS55YW1sIiwK" + + "ICAgICAgIlRoZSBhZ2VudCBzdGF0ZWQgdGhhdCBJQ01TX1VSTCBtYXBzIG9ubHkgdG8gLS1pY21z" + + "LXVybCwgY29uZmlnIGljbXNfaG9zdCBzdXBwbGllcyB0aGUgSG9zdCBoZWFkZXIsIHRoZXJlIGlz" + + "IG5vIC0taWNtcy1ob3N0IE1ha2Ugb3IgQ0xJIGZsYWcsIGFuZCByZWdpc3RyYXRpb24gZGlzY292" + + "ZXJzIE9JREMgYW5kIEpXS1MgZnJvbSB0aGUgY29tcHV0ZSBjb250ZXh0IiwKICAgICAgIlRoZSBh" + + "Z2VudCBkaWQgbm90IHJlcXVpcmUgYSBjb250cm9sLXBsYW5lIHByb2ZpbGUgZm9yIHRoaXMgZmxv" + + "dyBhbmQgZGlkIG5vdCBtaXggaW4gQ0xJIHByb2ZpbGUgY29tbWFuZHMiCiAgICBdCiAgfSwKICB7" + + "CiAgICAiaWQiOiAiRzctYm90aC1kb2NrZXItaGVsbS1hdXRoIiwKICAgICJxdWVzdGlvbiI6ICJB" + + "dXRoZW50aWNhdGUgdG8gTkdDIGZvciBOVkNGIGhlbG1maWxlIGRlcGxveW1lbnQiLAogICAgImV4" + + "cGVjdGVkX3NraWxsIjogIm52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiIsCiAgICAiZ3Jv" + + "dW5kX3RydXRoIjogIlRoZSBhZ2VudCByYW4gYm90aCBkb2NrZXIgbG9naW4gYW5kIGhlbG0gcmVn" + + "aXN0cnkgbG9naW4gZm9yIG52Y3IuaW8uIEl0IGV4cGxhaW5lZCB0aGF0IGJvdGggYXJlIHJlcXVp" + + "cmVkIGJlY2F1c2UgaGVsbWZpbGUgdXNlcyBoZWxtIChub3QgZG9ja2VyKSB0byBwdWxsIE9DSSBj" + + "aGFydHMsIHNvIGRvY2tlciBsb2dpbiBhbG9uZSBpcyBpbnN1ZmZpY2llbnQuIiwKICAgICJleHBl" + + "Y3RlZF9iZWhhdmlvciI6IFsKICAgICAgIlRoZSBhZ2VudCByZWFkIHRoZSBudmNmLXNlbGYtbWFu" + + "YWdlZC1pbnN0YWxsYXRpb24gU0tJTEwubWQgYmVmb3JlIHRha2luZyBhY3Rpb24iLAogICAgICAi" + + "VGhlIGFnZW50IHJhbiAnZG9ja2VyIGxvZ2luIG52Y3IuaW8nIHdpdGggJG9hdXRodG9rZW4gdXNl" + + "cm5hbWUgYW5kIE5HQ19BUElfS0VZIHBhc3N3b3JkIiwKICAgICAgIlRoZSBhZ2VudCByYW4gJ2hl" + + "bG0gcmVnaXN0cnkgbG9naW4gbnZjci5pbycgd2l0aCAkb2F1dGh0b2tlbiB1c2VybmFtZSBhbmQg" + + "TkdDX0FQSV9LRVkgcGFzc3dvcmQiLAogICAgICAiVGhlIGFnZW50IGV4cGxhaW5lZCB0aGF0IGJv" + + "dGggYXJlIHJlcXVpcmVkIGJlY2F1c2UgaGVsbWZpbGUgdXNlcyBoZWxtIChub3QgZG9ja2VyKSB0" + + "byBwdWxsIE9DSSBjaGFydHMiLAogICAgICAiVGhlIGFnZW50IGRpZCBub3QgcHJvdmlkZSBvbmx5" + + "IG9uZSBvZiB0aGUgdHdvIGF1dGhlbnRpY2F0aW9uIGNvbW1hbmRzIgogICAgXQogIH0sCiAgewog" + + "ICAgImlkIjogIkc5LW1pc3NpbmctYnVuZGxlIiwKICAgICJxdWVzdGlvbiI6ICJSdW4gaGVsbWZp" + + "bGUgc3luYyBmb3IgTlZDRiBpbiBteSBjdXJyZW50IGRpcmVjdG9yeSIsCiAgICAiZXhwZWN0ZWRf" + "c2tpbGwiOiAibnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uIiwKICAgICJncm91bmRfdHJ1" + - "dGgiOiAiVGhlIGFnZW50IGNvbXBsZXRlZCB0aGUgY29udHJvbC1wbGFuZSBpbnN0YWxsYXRpb24g" + - "Zmlyc3Q6IHZhbGlkYXRlZCB0b29scyBhbmQgYnVuZGxlIHN0cnVjdHVyZSwgY3JlYXRlZCBjb250" + - "cm9sLXBsYW5lIG5hbWVzcGFjZXMgaW5jbHVkaW5nIGNlcnQtbWFuYWdlciwgYXV0aGVudGljYXRl" + - "ZCB0aGUgcmVnaXN0cmllcywgcHJldmlld2VkLCBkZXBsb3llZCwgYW5kIG1vbml0b3JlZCB0aGUg" + - "Zm91ciBjb250cm9sLXBsYW5lIHBoYXNlcy4gSXQgdGhlbiBzZWxlY3RlZCBvbmUgZG9jdW1lbnRl" + - "ZCBoYW5kb2ZmIGFuZCByZWdpc3RlcmVkIGFuZCBpbnN0YWxsZWQgdGhlIGNvbXB1dGUgcGxhbmUg" + - "YXMgYSBzZXBhcmF0ZSBzdGFjayB3aXRob3V0IG1peGluZyBwcm9maWxlIGFuZCBIZWxtZmlsZSB2" + - "YWx1ZXMgZmxvd3MuIiwKICAgICJleHBlY3RlZF9iZWhhdmlvciI6IFsKICAgICAgIlRoZSBhZ2Vu" + + "dGgiOiAiVGhlIGFnZW50IGF0dGVtcHRlZCB0byB2ZXJpZnkgdGhlIGJ1bmRsZSBzdHJ1Y3R1cmUg" + + "KGhlbG1maWxlLmQvLCBlbnZpcm9ubWVudHMvLCBzZWNyZXRzLywgZ2xvYmFsLnlhbWwuZ290bXBs" + + "KSBhbmQgd2hlbiBmaWxlcyB3ZXJlIG5vdCBmb3VuZCwgc3RvcHBlZCBhbmQgaW5zdHJ1Y3RlZCB0" + + "aGUgdXNlciB0byBleHRyYWN0IG9yIGxvY2F0ZSB0aGUgbnZjZi1zZWxmLW1hbmFnZWQtc3RhY2sg" + + "YnVuZGxlLiBJdCBkaWQgbm90IGF0dGVtcHQgdG8gcnVuIGhlbG1maWxlIHN5bmMgYWdhaW5zdCBh" + + "IG1pc3NpbmcgYnVuZGxlLiIsCiAgICAiZXhwZWN0ZWRfYmVoYXZpb3IiOiBbCiAgICAgICJUaGUg" + + "YWdlbnQgcmVhZCB0aGUgbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uIFNLSUxMLm1kIGJl" + + "Zm9yZSB0YWtpbmcgYWN0aW9uIiwKICAgICAgIlRoZSBhZ2VudCBjaGVja2VkIGZvciBleHBlY3Rl" + + "ZCBidW5kbGUgc3RydWN0dXJlIChoZWxtZmlsZS5kLywgZW52aXJvbm1lbnRzLywgc2VjcmV0cy8s" + + "IGdsb2JhbC55YW1sLmdvdG1wbCkiLAogICAgICAiV2hlbiBidW5kbGUgZmlsZXMgd2VyZSBub3Qg" + + "Zm91bmQsIHRoZSBhZ2VudCBzdG9wcGVkIGFuZCBkaWQgbm90IGF0dGVtcHQgaGVsbWZpbGUgc3lu" + + "YyIsCiAgICAgICJUaGUgYWdlbnQgaW5zdHJ1Y3RlZCB0aGUgdXNlciB0byBleHRyYWN0IG9yIGxv" + + "Y2F0ZSB0aGUgbnZjZi1zZWxmLW1hbmFnZWQtc3RhY2sgYnVuZGxlIgogICAgXQogIH0sCiAgewog" + + "ICAgImlkIjogIlMxLWNsZWFuLWluc3RhbGxhdGlvbiIsCiAgICAicXVlc3Rpb24iOiAiUGVyZm9y" + + "bSBhIGNsZWFuIGluc3RhbGxhdGlvbiBvZiB0aGUgTlZDRiBzZWxmLW1hbmFnZWQgc3RhY2sgb24g" + + "bXkgQVdTIEVLUyBjbHVzdGVyLiBNeSBlbnZpcm9ubWVudCBuYW1lIGlzICdzdGFnaW5nJy4iLAog" + + "ICAgImV4cGVjdGVkX3NraWxsIjogIm52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiIsCiAg" + + "ICAiZ3JvdW5kX3RydXRoIjogIlRoZSBhZ2VudCBjb21wbGV0ZWQgdGhlIGNvbnRyb2wtcGxhbmUg" + + "aW5zdGFsbGF0aW9uIGZpcnN0OiB2YWxpZGF0ZWQgdG9vbHMgYW5kIGJ1bmRsZSBzdHJ1Y3R1cmUs" + + "IGNyZWF0ZWQgY29udHJvbC1wbGFuZSBuYW1lc3BhY2VzIGluY2x1ZGluZyBjZXJ0LW1hbmFnZXIs" + + "IGF1dGhlbnRpY2F0ZWQgdGhlIHJlZ2lzdHJpZXMsIHByZXZpZXdlZCwgZGVwbG95ZWQsIGFuZCBt" + + "b25pdG9yZWQgdGhlIGZvdXIgY29udHJvbC1wbGFuZSBwaGFzZXMuIEl0IHRoZW4gc2VsZWN0ZWQg" + + "b25lIGRvY3VtZW50ZWQgaGFuZG9mZiBhbmQgcmVnaXN0ZXJlZCBhbmQgaW5zdGFsbGVkIHRoZSBj" + + "b21wdXRlIHBsYW5lIGFzIGEgc2VwYXJhdGUgc3RhY2sgd2l0aG91dCBtaXhpbmcgcHJvZmlsZSBh" + + "bmQgSGVsbWZpbGUgdmFsdWVzIGZsb3dzLiIsCiAgICAiZXhwZWN0ZWRfYmVoYXZpb3IiOiBbCiAg" + + "ICAgICJUaGUgYWdlbnQgcmVhZCB0aGUgbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uIFNL" + + "SUxMLm1kIGJlZm9yZSB0YWtpbmcgYWN0aW9uIiwKICAgICAgIlRoZSBhZ2VudCB2YWxpZGF0ZWQg" + + "dG9vbCB2ZXJzaW9ucyAoaGVsbWZpbGUsIGhlbG0sIGhlbG0tZGlmZiwga3ViZWN0bCkiLAogICAg" + + "ICAiVGhlIGFnZW50IHZlcmlmaWVkIHRoZSBidW5kbGUgc3RydWN0dXJlIGV4aXN0cyIsCiAgICAg" + + "ICJUaGUgYWdlbnQgY3JlYXRlZCBjb250cm9sLXBsYW5lIG5hbWVzcGFjZXMgKGNhc3NhbmRyYS1z" + + "eXN0ZW0sIG5hdHMtc3lzdGVtLCBudmNmLCBhcGkta2V5cywgZXNzLCBzaXMsIHZhdWx0LXN5c3Rl" + + "bSwgY2VydC1tYW5hZ2VyKSB3aXRob3V0IGFkZGluZyBjb21wdXRlLW9ubHkgbmFtZXNwYWNlcyIs" + + "CiAgICAgICJUaGUgYWdlbnQgcmFuICdIRUxNRklMRV9FTlY9c3RhZ2luZyBoZWxtZmlsZSB0ZW1w" + + "bGF0ZScgdG8gcHJldmlldyBiZWZvcmUgZGVwbG95aW5nIiwKICAgICAgIlRoZSBhZ2VudCByYW4g" + + "J0hFTE1GSUxFX0VOVj1zdGFnaW5nIGhlbG1maWxlIHN5bmMnIHRvIGRlcGxveSIsCiAgICAgICJU" + + "aGUgYWdlbnQgZXhwbGFpbmVkIHRoZSA0IGNvbnRyb2wtcGxhbmUgcGhhc2VzIChkZXBlbmRlbmNp" + + "ZXMsIHNlcnZpY2VzLCBpbmdyZXNzLCBvYnNlcnZhYmlsaXR5KSBhbmQgYXBwcm94aW1hdGUgd2Fp" + + "dCB0aW1lcyIsCiAgICAgICJBZnRlciB0aGUgY29udHJvbCBwbGFuZSB3YXMgaGVhbHRoeSwgdGhl" + + "IGFnZW50IHJlZ2lzdGVyZWQgYW5kIGluc3RhbGxlZCB0aGUgc2VwYXJhdGUgY29tcHV0ZS1wbGFu" + + "ZSBzdGFjayB1c2luZyBleGFjdGx5IG9uZSBkb2N1bWVudGVkIGhhbmRvZmYiLAogICAgICAiVGhl" + + "IGFnZW50IGRpZCBub3QgbWl4IGEgQ0xJLWdlbmVyYXRlZCBjb250cm9sLXBsYW5lIHByb2ZpbGUg" + + "d2l0aCB0aGUgSGVsbWZpbGUgdmFsdWVzIGZsb3ciCiAgICBdCiAgfSwKICB7CiAgICAiaWQiOiAi" + + "UzMtY2xpLXByb2ZpbGUtd29ya2Zsb3ciLAogICAgInF1ZXN0aW9uIjogIlVzZSBudmNmLWNsaSB0" + + "byBpbnN0YWxsIG15IGNvbnRyb2wgcGxhbmUgYW5kIHRoZW4gcmVnaXN0ZXIgYW5kIGluc3RhbGwg" + + "YSBzZXBhcmF0ZSBjb21wdXRlIGNsdXN0ZXIuIFNob3cgZXZlcnkgcmVxdWlyZWQgZ2xvYmFsIGZs" + + "YWcuIiwKICAgICJleHBlY3RlZF9za2lsbCI6ICJudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRp" + + "b24iLAogICAgImdyb3VuZF90cnV0aCI6ICJUaGUgYWdlbnQgZmlyc3QgcmFuIHRoZSBDTEkgY29u" + + "dHJvbC1wbGFuZSBpbnN0YWxsIGFuZCByZXF1aXJlZCBpdHMgZ2VuZXJhdGVkIGNvbnRyb2wtcGxh" + + "bmUtcHJvZmlsZS55YW1sLiBJdCB0aGVuIHNob3dlZCBjb21wbGV0ZSByZWdpc3RlciBhbmQgaW5z" + + "dGFsbCBjb21tYW5kcywgZWFjaCBpbmNsdWRpbmcgLS1jb25maWcsIC0tY29udHJvbC1wbGFuZS1z" + + "dGFjaywgLS1jb21wdXRlLXBsYW5lLXN0YWNrLCAtLWVudiwgYW5kIC0tcGxhaW4gYmVmb3JlIHRo" + + "ZSBjb21wdXRlLXBsYW5lIHN1YmNvbW1hbmQuIFJlZ2lzdHJhdGlvbiBjb25zdW1lZCB0aGUgcHJv" + + "ZmlsZSBhbmQgcHJvZHVjZWQgdGhlIHZhbHVlcyBmaWxlIGNvbnN1bWVkIGJ5IGluc3RhbGwuIEl0" + + "IGRpZCBub3Qgc3dpdGNoIHRvIHRoZSBIZWxtZmlsZSB2YWx1ZXMgaGFuZG9mZi4iLAogICAgImV4" + + "cGVjdGVkX2JlaGF2aW9yIjogWwogICAgICAiVGhlIGFnZW50IHJlYWQgdGhlIG52Y2Ytc2VsZi1t" + + "YW5hZ2VkLWluc3RhbGxhdGlvbiBTS0lMTC5tZCBiZWZvcmUgdGFraW5nIGFjdGlvbiIsCiAgICAg" + + "ICJUaGUgYWdlbnQgcmFuIG52Y2YtY2xpIHNlbGYtaG9zdGVkIGluc3RhbGwgLS1jb250cm9sLXBs" + + "YW5lIGFuZCB2ZXJpZmllZCBkZXBsb3kvc3RhY2tzL3NlbGYtbWFuYWdlZC9vdXQvY29udHJvbC1w" + + "bGFuZS1wcm9maWxlLnlhbWwgZXhpc3RzIiwKICAgICAgIlRoZSByZWdpc3RlciBjb21tYW5kIGlu" + + "Y2x1ZGVkIC0tY29uZmlnLCAtLWNvbnRyb2wtcGxhbmUtc3RhY2ssIC0tY29tcHV0ZS1wbGFuZS1z" + + "dGFjaywgLS1lbnYsIGFuZCAtLXBsYWluIiwKICAgICAgIlRoZSByZWdpc3RlciBjb21tYW5kIGlu" + + "Y2x1ZGVkIC0tY29udHJvbC1wbGFuZS1wcm9maWxlLCAtLWNsdXN0ZXItbmFtZSwgLS1rdWJlLWNv" + + "bnRleHQsIC0tcmVnaW9uLCBhbmQgLS1vdXRwdXQiLAogICAgICAiVGhlIGluc3RhbGwgY29tbWFu" + + "ZCByZXBlYXRlZCAtLWNvbmZpZywgLS1jb250cm9sLXBsYW5lLXN0YWNrLCAtLWNvbXB1dGUtcGxh" + + "bmUtc3RhY2ssIC0tZW52LCBhbmQgLS1wbGFpbiIsCiAgICAgICJUaGUgaW5zdGFsbCBjb21tYW5k" + + "IGluY2x1ZGVkIC0tdmFsdWVzLCAtLWt1YmUtY29udGV4dCwgYW5kIC0tY2x1c3Rlci1uYW1lIiwK" + + "ICAgICAgIlRoZSBhZ2VudCBrZXB0IHRoZSBnZW5lcmF0ZWQgcHJvZmlsZSBhcyB0aGUgZW5kcG9p" + + "bnQgc291cmNlIGFuZCBkaWQgbm90IG1peCBpbiBIZWxtZmlsZSB2YWx1ZXMgcmVnaXN0cmF0aW9u" + + "IgogICAgXQogIH0sCiAgewogICAgImlkIjogIlM0LW92ZXJyaWRlLWNhc3NhbmRyYS1yZXNvdXJj" + + "ZXMiLAogICAgInF1ZXN0aW9uIjogIkNhc3NhbmRyYSBwb2RzIGtlZXAgZ2V0dGluZyBPT01LaWxs" + + "ZWQuIEluY3JlYXNlIG1lbW9yeSBsaW1pdHMgdG8gMTZHaS4iLAogICAgImV4cGVjdGVkX3NraWxs" + + "IjogIm52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiIsCiAgICAiZ3JvdW5kX3RydXRoIjog" + + "IlRoZSBhZ2VudCBjYXB0dXJlZCB0aGUgYmFzZWxpbmUgd2l0aCBoZWxtZmlsZSB0ZW1wbGF0ZSwg" + + "dGhlbiBtb2RpZmllZCB0aGUgY2Fzc2FuZHJhIHJlbGVhc2Ugd2l0aCBpbmxpbmUgdmFsdWVzIHJl" + + "LWluY2x1ZGluZyBnbG9iYWwueWFtbC5nb3RtcGwgYW5kIHNlY3JldHMgaW4gdGhlIHZhbHVlcyBi" + + "bG9jay4gSXQgd2FybmVkIGFib3V0IHRoZSBZQU1MIG1lcmdlIGdvdGNoYSBhbmQgcHJldmlld2Vk" + + "IHRoZSBkaWZmIGJlZm9yZSBhcHBseWluZy4iLAogICAgImV4cGVjdGVkX2JlaGF2aW9yIjogWwog" + + "ICAgICAiVGhlIGFnZW50IHJlYWQgdGhlIG52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiBT" + + "S0lMTC5tZCBiZWZvcmUgdGFraW5nIGFjdGlvbiIsCiAgICAgICJUaGUgYWdlbnQgY2FwdHVyZWQg" + + "YmFzZWxpbmUgd2l0aCAnaGVsbWZpbGUgLS1zZWxlY3RvciBuYW1lPWNhc3NhbmRyYSB0ZW1wbGF0" + + "ZSciLAogICAgICAiVGhlIGFnZW50IG1vZGlmaWVkIHRoZSByZWxlYXNlIHZhbHVlcyBibG9jayB0" + + "byBpbmNsdWRlIHJlc291cmNlIGxpbWl0cyB3aXRoIG1lbW9yeTogMTZHaSIsCiAgICAgICJUaGUg" + + "YWdlbnQgcmUtaW5jbHVkZWQgZ2xvYmFsLnlhbWwuZ290bXBsIGFuZCBzZWNyZXRzIGZpbGUgaW4g" + + "dGhlIHZhbHVlczogYmxvY2sgKG5vdCBqdXN0IHRoZSBvdmVycmlkZSBhbG9uZSkiLAogICAgICAi" + + "VGhlIGFnZW50IHdhcm5lZCBhYm91dCB0aGUgWUFNTCBtZXJnZSBnb3RjaGE6IHNwZWNpZnlpbmcg" + + "dmFsdWVzOiByZXBsYWNlcyB0aGUgdGVtcGxhdGUncyB2YWx1ZXMgbGlzdCBlbnRpcmVseSIsCiAg" + + "ICAgICJUaGUgYWdlbnQgcHJldmlld2VkIHRoZSBjaGFuZ2Ugd2l0aCBoZWxtZmlsZSB0ZW1wbGF0" + + "ZSBhbmQgZGlmZiBiZWZvcmUgYXBwbHlpbmcgd2l0aCBzeW5jIgogICAgXQogIH0sCiAgewogICAg" + + "ImlkIjogIlM2LXNlbGVjdGl2ZS1zeW5jLWRlcGVuZGVuY2llcyIsCiAgICAicXVlc3Rpb24iOiAi" + + "RGVwbG95IG9ubHkgdGhlIE5WQ0YgZGVwZW5kZW5jaWVzIC0tIE5BVFMsIENhc3NhbmRyYSwgYW5k" + + "IE9wZW5CYW8gLS0gZm9yIHRlc3RpbmciLAogICAgImV4cGVjdGVkX3NraWxsIjogIm52Y2Ytc2Vs" + + "Zi1tYW5hZ2VkLWluc3RhbGxhdGlvbiIsCiAgICAiZ3JvdW5kX3RydXRoIjogIlRoZSBhZ2VudCB1" + + "c2VkIHRoZSBoZWxtZmlsZSBzZWxlY3RvciB0byBkZXBsb3kgb25seSB0aGUgZGVwZW5kZW5jaWVz" + + "IHJlbGVhc2UgZ3JvdXAsIHRoZW4gdmVyaWZpZWQgcG9kcyBpbiB0aGUgZGVwZW5kZW5jeSBuYW1l" + + "c3BhY2VzLiIsCiAgICAiZXhwZWN0ZWRfYmVoYXZpb3IiOiBbCiAgICAgICJUaGUgYWdlbnQgcmVh" + + "ZCB0aGUgbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uIFNLSUxMLm1kIGJlZm9yZSB0YWtp" + + "bmcgYWN0aW9uIiwKICAgICAgIlRoZSBhZ2VudCB1c2VkICdoZWxtZmlsZSAtLXNlbGVjdG9yIHJl" + + "bGVhc2UtZ3JvdXA9ZGVwZW5kZW5jaWVzIHN5bmMnIHRvIGRlcGxveSBvbmx5IGRlcGVuZGVuY2ll" + + "cyIsCiAgICAgICJUaGUgYWdlbnQgdmVyaWZpZWQgcG9kcyBpbiBkZXBlbmRlbmN5IG5hbWVzcGFj" + + "ZXMgKG5hdHMtc3lzdGVtLCBjYXNzYW5kcmEtc3lzdGVtLCB2YXVsdC1zeXN0ZW0pIiwKICAgICAg" + + "IlRoZSBhZ2VudCBwcm92aWRlZCB0aGUgc2VsZWN0b3IgcmVmZXJlbmNlIGZvciB0YXJnZXRpbmcg" + + "b3RoZXIgcmVsZWFzZSBncm91cHMiCiAgICBdCiAgfSwKICB7CiAgICAiaWQiOiAiUzctZGVidWct" + + "aW1hZ2VwdWxsYmFja29mZiIsCiAgICAicXVlc3Rpb24iOiAiQ2Fzc2FuZHJhIHBvZHMgYXJlIGlu" + + "IEltYWdlUHVsbEJhY2tPZmYgd2l0aCA0MDEgVW5hdXRob3JpemVkIiwKICAgICJleHBlY3RlZF9z" + + "a2lsbCI6ICJudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24iLAogICAgImdyb3VuZF90cnV0" + + "aCI6ICJUaGUgYWdlbnQgcmVhZCB0aGUgZGVidWdnaW5nIHJlZmVyZW5jZSBhbmQgcmFuIGRpYWdu" + + "b3N0aWMgY29tbWFuZHMgdG8gaWRlbnRpZnkgdGhlIHJvb3QgY2F1c2U6IGRlc2NyaWJlZCB0aGUg" + + "cG9kLCBjaGVja2VkIGZvciBwdWxsIHNlY3JldHMsIGNoZWNrZWQgaW1hZ2VQdWxsU2VjcmV0cyBv" + + "biB0aGUgcG9kIHNwZWMgYW5kIHNlcnZpY2UgYWNjb3VudC4gSXQgaWRlbnRpZmllZCB0aGUgaXNz" + + "dWUgKG1pc3Npbmcgc2VjcmV0LCB3cm9uZyBjcmVkZW50aWFscywgb3IgbWlzc2luZyBpbWFnZVB1" + + "bGxTZWNyZXRzKSBhbmQgcHJvdmlkZWQgdGhlIGNvcnJlY3QgZml4LiIsCiAgICAiZXhwZWN0ZWRf" + + "YmVoYXZpb3IiOiBbCiAgICAgICJUaGUgYWdlbnQgcmVhZCB0aGUgbnZjZi1zZWxmLW1hbmFnZWQt" + + "aW5zdGFsbGF0aW9uIFNLSUxMLm1kIGFuZCByZWZlcmVuY2VzL2RlYnVnZ2luZy5tZCIsCiAgICAg" + + "ICJUaGUgYWdlbnQgcmFuICdrdWJlY3RsIGRlc2NyaWJlIHBvZCcgdG8gc2VlIHRoZSBJbWFnZVB1" + + "bGxCYWNrT2ZmIGV2ZW50cyIsCiAgICAgICJUaGUgYWdlbnQgY2hlY2tlZCBmb3IgcHVsbCBzZWNy" + + "ZXRzIGluIHRoZSBjYXNzYW5kcmEtc3lzdGVtIG5hbWVzcGFjZSIsCiAgICAgICJUaGUgYWdlbnQg" + + "Y2hlY2tlZCBpbWFnZVB1bGxTZWNyZXRzIG9uIHRoZSBwb2Qgc3BlYyBhbmQvb3Igc2VydmljZSBh" + + "Y2NvdW50IiwKICAgICAgIlRoZSBhZ2VudCBpZGVudGlmaWVkIHRoZSByb290IGNhdXNlIGFuZCBw" + + "cm92aWRlZCBhIHNwZWNpZmljIGZpeCIKICAgIF0KICB9LAogIHsKICAgICJpZCI6ICJTOS1yZW1v" + + "dGUtZWtzLXJvdXRpbmctYW5kLXNlY3JldHMiLAogICAgInF1ZXN0aW9uIjogIkNvbmZpZ3VyZSBh" + + "IHJlbW90ZSBFS1MgY29tcHV0ZSBjbHVzdGVyIHRvIHJlYWNoIG15IE5WQ0YgY29udHJvbCBwbGFu" + + "ZSB0aHJvdWdoIGl0cyBFbnZveSBHYXRld2F5LCBpbmNsdWRpbmcgTkFUUyBhbmQgcHJpdmF0ZS1y" + + "ZWdpc3RyeSBwdWxsIHNlY3JldHMuIiwKICAgICJleHBlY3RlZF9za2lsbCI6ICJudmNmLXNlbGYt" + + "bWFuYWdlZC1pbnN0YWxsYXRpb24iLAogICAgImdyb3VuZF90cnV0aCI6ICJUaGUgYWdlbnQgY29u" + + "ZmlndXJlZCB0aGUgY29udHJvbCBwbGFuZSB0byB1c2UgdGhlIEVudm95IEdhdGV3YXkgY29udHJv" + + "bGxlciBpbiBlbnZveS1nYXRld2F5LXN5c3RlbSBhbmQgR2F0ZXdheS9udmNmLWdhdGV3YXkgaW4g" + + "ZW52b3ktZ2F0ZXdheSwgc2V0IGFsbCBzaXggcmVtb3RlIHdvcmtlciBlbmRwb2ludHMgYW5kIHRo" + + "ZSBncnBjLXByb3h5IGxvY2FsIG92ZXJyaWRlLCBlbmFibGVkIE5WQ0YgYW5kIE5WQ1QgZ1JQQyBy" + + "b3V0ZXMgcGx1cyBOQVRTLCBhbmQgZW5hYmxlZCBPcGVuQmFvIGlzc3VlciBkaXNjb3ZlcnkuIEl0" + + "IGNvbmZpZ3VyZWQgdGhlIGJhcmUtR2F0ZXdheSBDTEkgVVJMIGFuZCBIb3N0IGZpZWxkcyBpbmNs" + + "dWRpbmcgaWNtc19ob3N0LCBwbHVzIHRoZSBjb21wdXRlLXBsYW5lIElDTVMsIFJlVmFsLCBhbmQg" + + "TkFUUyBleHRlcm5hbCBVUkxzIGFuZCBob3N0IG92ZXJyaWRlcy4gSXQgY3JlYXRlZCB0aGUgcHVs" + + "bCBzZWNyZXQgaW4gYWxsIGNvbnRyb2wtcGxhbmUgbmFtZXNwYWNlcyBpbmNsdWRpbmcgY2VydC1t" + + "YW5hZ2VyLCBidXQgb25seSBpbiBudmNhLW9wZXJhdG9yIG9uIHRoZSBjb21wdXRlIGNsdXN0ZXI7" + + "IHRoZSBjaGFydCBhbmQgb3BlcmF0b3IgbWlycm9yIGl0IHRvIG52Y2Etc3lzdGVtLiIsCiAgICAi" + + "ZXhwZWN0ZWRfYmVoYXZpb3IiOiBbCiAgICAgICJUaGUgYWdlbnQgcmVhZCB0aGUgbnZjZi1zZWxm" + + "LW1hbmFnZWQtaW5zdGFsbGF0aW9uIFNLSUxMLm1kIGJlZm9yZSB0YWtpbmcgYWN0aW9uIiwKICAg" + + "ICAgIlRoZSBhZ2VudCBzZXQgaW5ncmVzcy5nYXRld2F5QXBpLmNvbnRyb2xsZXJOYW1lc3BhY2Ug" + + "dG8gZW52b3ktZ2F0ZXdheS1zeXN0ZW0iLAogICAgICAiVGhlIGFnZW50IHNldCBzaGFyZWQsIGdy" + + "cGMsIGFuZCBuYXRzIEdhdGV3YXkgcmVmZXJlbmNlcyB0byBuYW1lIG52Y2YtZ2F0ZXdheSBhbmQg" + + "bmFtZXNwYWNlIGVudm95LWdhdGV3YXkiLAogICAgICAiVGhlIGFnZW50IHNldCBnbG9iYWwud29y" + + "a2VyRW5kcG9pbnRzLm52Y2ZTZXJ2aWNlVVJMLCBudmNmR3JwY1NlcnZpY2VVUkwsIG52Y2ZOYXRz" + + "U2VydmljZVVSTCwgbnZjdFNlcnZpY2VVUkwsIG52Y3RHcnBjU2VydmljZVVSTCwgYW5kIGludm9j" + + "YXRpb25TZXJ2aWNlVVJMIiwKICAgICAgIlRoZSBhZ2VudCBzZXQgZ3JwY3Byb3h5Lm52Y2ZHcnBj" + + "U2VydmljZVVSTCB0byB0aGUgY29udHJvbC1wbGFuZS1sb2NhbCBBUEkgZ1JQQyBzZXJ2aWNlIiwK" + + "ICAgICAgIlRoZSBhZ2VudCBlbmFibGVkIGJvdGggaW5ncmVzcy5nYXRld2F5QXBpLnJvdXRlcy5u" + + "dmNmQXBpLmdycGMgYW5kIG52Y3RBcGkuZ3JwYyB3aXRoIHdvcmtlci1hcGkgYW5kIHdvcmtlci10" + + "YXNrcyBob3N0bmFtZXMiLAogICAgICAiVGhlIGFnZW50IGV4cGxpY2l0bHkgc2V0IGluZ3Jlc3Mu" + + "Z2F0ZXdheUFwaS5yb3V0ZXMubmF0cy5lbmFibGVkIHRvIHRydWUiLAogICAgICAiVGhlIGFnZW50" + + "IHNldCBvcGVuYmFvLm1pZ3JhdGlvbnMuaXNzdWVyRGlzY292ZXJ5LmVuYWJsZWQgdG8gdHJ1ZSIs" + + "CiAgICAgICJUaGUgYWdlbnQgY29uZmlndXJlZCB0aGUgYmFyZS1HYXRld2F5IENMSSBVUkwgYW5k" + + "IEhvc3QgZmllbGRzLCBpbmNsdWRpbmcgc2NoZW1lLWxlc3MgaWNtc19ob3N0IiwKICAgICAgIlRo" + + "ZSBhZ2VudCBjb25maWd1cmVkIGNvbXB1dGUtcGxhbmUgaWNtc1NlcnZpY2VVUkwsIGljbXNTZXJ2" + + "aWNlSG9zdEhlYWRlck92ZXJyaWRlLCByZXZhbFNlcnZpY2VVUkwsIHJldmFsU2VydmljZUhvc3RI" + + "ZWFkZXJPdmVycmlkZSwgbmF0c1VSTCwgYW5kIG5hdHNIb3N0T3ZlcnJpZGUiLAogICAgICAiVGhl" + + "IGNvbnRyb2wtcGxhbmUgcHVsbC1zZWNyZXQgbmFtZXNwYWNlIGxpc3QgaW5jbHVkZWQgY2VydC1t" + + "YW5hZ2VyIiwKICAgICAgIlRoZSBjb21wdXRlLXBsYW5lIHNlY3JldCB3YXMgY3JlYXRlZCBvbmx5" + + "IGluIG52Y2Etb3BlcmF0b3IgYW5kIG1pcnJvcmVkIGJ5IHRoZSBjaGFydCBhbmQgb3BlcmF0b3Ig" + + "dG8gbnZjYS1zeXN0ZW0iCiAgICBdCiAgfSwKICB7CiAgICAiaWQiOiAiRzExLXNwbGl0LXRlYXJk" + + "b3duIiwKICAgICJxdWVzdGlvbiI6ICJUZWFyIGRvd24gbXkgc3BsaXQgY29udHJvbC1wbGFuZSBh" + + "bmQgY29tcHV0ZS1wbGFuZSBkZXBsb3ltZW50IHNhZmVseS4gU2hvdyBib3RoIHRoZSBIZWxtZmls" + + "ZSB2YWx1ZXMgYW5kIENMSSBwcm9maWxlIHZhcmlhbnRzLiIsCiAgICAiZXhwZWN0ZWRfc2tpbGwi" + + "OiAibnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uIiwKICAgICJncm91bmRfdHJ1dGgiOiAi" + + "VGhlIEhlbG1maWxlIGZsb3cgZGVzdHJveWVkIGFuZCBjb25maXJtZWQgZGVyZWdpc3RyYXRpb24g" + + "b2YgZXZlcnkgY29tcHV0ZSBjbHVzdGVyIGJlZm9yZSBkZXN0cm95aW5nIHRoZSBjb250cm9sIHBs" + + "YW5lIGFuZCBwYXNzZWQgYm90aCBjb250cm9sLXBsYW5lIGt1YmVjb25maWcgZm9ybXMuIEJlZm9y" + + "ZSBlaXRoZXIgaGFuZG9mZiBjb3VsZCBkZXN0cm95IHRoZSBjb250cm9sIHBsYW5lLCBib3RoIHRl" + + "YXJkb3duIGZsb3dzIHdhcm5lZCB0aGF0IG5hbWVzcGFjZSBwcmVzZXJ2YXRpb24gZG9lcyBub3Qg" + + "cHJlc2VydmUgdGhlIEhlbG0gcmVsZWFzZSwgcmVxdWlyZWQgZWZmZWN0aXZlIGNlcnRNYW5hZ2Vy" + + "LmVuYWJsZWQ6IGZhbHNlIGZvciBhbiBleHRlcm5hbCBpbnN0YWxsYXRpb24gYW5kIGFib3J0ZWQg" + + "aWYgdHJ1ZSwgYW5kIHZlcmlmaWVkIG1hdGNoaW5nIHJlbGVhc2Ugb3duZXJzaGlwIGZvciBhbiBp" + + "bnRlbmRlZCBzdGFjay1tYW5hZ2VkIHJlbGVhc2UsIGFib3J0aW5nIG9uIG1pc3Npbmcgb3IgbWlz" + + "bWF0Y2hlZCBldmlkZW5jZS4gVGhleSBwcmVzZXJ2ZWQgdGhlIG5hbWVzcGFjZSBieSBkZWZhdWx0" + + "IGFuZCBkaWQgbm90IGRlbGV0ZSBpdCB3aXRob3V0IG5hbWVzcGFjZSBwcm92ZW5hbmNlIGFuZCBl" + + "eHBsaWNpdCBjb25maXJtYXRpb24uIFRoZSBDTEkgZmxvdyByZXRhaW5lZCB0aGUgZ2VuZXJhdGVk" + + "IHJlZ2lzdHJhdGlvbiB2YWx1ZXMsIHVzZWQgdGhlIGZ1bGwtcHJlZml4IHN0YXR1cyBjb21tYW5k" + + "IHRvIGluc3BlY3QgbGl2ZSByZWdpc3RyYXRpb25zLCBzdGF0ZWQgdGhhdCBuYW1lZC1jbHVzdGVy" + + "IHBsYW4tb25seSBkb2VzIG5vdCBxdWVyeSBJQ01TIGFuZCBjYW5ub3QgcHJlZGljdCBjb25kaXRp" + + "b25hbCBjb250cm9sLXBsYW5lIHJlbW92YWwsIGFuZCBnb3QgZXhwbGljaXQgY29uZmlybWF0aW9u" + + "IHdoZW4gdGhlIHRhcmdldCB3YXMgdGhlIGxhc3QgcmVnaXN0ZXJlZCBjbHVzdGVyLiBJdCB0aGVu" + + "IHByZXZpZXdlZCBhbmQgcmFuIGRvd24gd2l0aCB0aGUgZnVsbCBwZXJzaXN0ZW50IHByZWZpeCwg" + + "cmVtb3ZpbmcgdGhlIGNvbnRyb2wgcGxhbmUgb25seSBhZnRlciB0aGUgbGFzdCByZWdpc3RyYXRp" + + "b24gd2FzIGdvbmUuIiwKICAgICJleHBlY3RlZF9iZWhhdmlvciI6IFsKICAgICAgIlRoZSBhZ2Vu" + "dCByZWFkIHRoZSBudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24gU0tJTEwubWQgYmVmb3Jl" + - "IHRha2luZyBhY3Rpb24iLAogICAgICAiVGhlIGFnZW50IHZhbGlkYXRlZCB0b29sIHZlcnNpb25z" + - "IChoZWxtZmlsZSwgaGVsbSwgaGVsbS1kaWZmLCBrdWJlY3RsKSIsCiAgICAgICJUaGUgYWdlbnQg" + - "dmVyaWZpZWQgdGhlIGJ1bmRsZSBzdHJ1Y3R1cmUgZXhpc3RzIiwKICAgICAgIlRoZSBhZ2VudCBj" + - "cmVhdGVkIGNvbnRyb2wtcGxhbmUgbmFtZXNwYWNlcyAoY2Fzc2FuZHJhLXN5c3RlbSwgbmF0cy1z" + - "eXN0ZW0sIG52Y2YsIGFwaS1rZXlzLCBlc3MsIHNpcywgdmF1bHQtc3lzdGVtLCBjZXJ0LW1hbmFn" + - "ZXIpIHdpdGhvdXQgYWRkaW5nIGNvbXB1dGUtb25seSBuYW1lc3BhY2VzIiwKICAgICAgIlRoZSBh" + - "Z2VudCByYW4gJ0hFTE1GSUxFX0VOVj1zdGFnaW5nIGhlbG1maWxlIHRlbXBsYXRlJyB0byBwcmV2" + - "aWV3IGJlZm9yZSBkZXBsb3lpbmciLAogICAgICAiVGhlIGFnZW50IHJhbiAnSEVMTUZJTEVfRU5W" + - "PXN0YWdpbmcgaGVsbWZpbGUgc3luYycgdG8gZGVwbG95IiwKICAgICAgIlRoZSBhZ2VudCBleHBs" + - "YWluZWQgdGhlIDQgY29udHJvbC1wbGFuZSBwaGFzZXMgKGRlcGVuZGVuY2llcywgc2VydmljZXMs" + - "IGluZ3Jlc3MsIG9ic2VydmFiaWxpdHkpIGFuZCBhcHByb3hpbWF0ZSB3YWl0IHRpbWVzIiwKICAg" + - "ICAgIkFmdGVyIHRoZSBjb250cm9sIHBsYW5lIHdhcyBoZWFsdGh5LCB0aGUgYWdlbnQgcmVnaXN0" + - "ZXJlZCBhbmQgaW5zdGFsbGVkIHRoZSBzZXBhcmF0ZSBjb21wdXRlLXBsYW5lIHN0YWNrIHVzaW5n" + - "IGV4YWN0bHkgb25lIGRvY3VtZW50ZWQgaGFuZG9mZiIsCiAgICAgICJUaGUgYWdlbnQgZGlkIG5v" + - "dCBtaXggYSBDTEktZ2VuZXJhdGVkIGNvbnRyb2wtcGxhbmUgcHJvZmlsZSB3aXRoIHRoZSBIZWxt" + - "ZmlsZSB2YWx1ZXMgZmxvdyIKICAgIF0KICB9LAogIHsKICAgICJpZCI6ICJTMy1jbGktcHJvZmls" + - "ZS13b3JrZmxvdyIsCiAgICAicXVlc3Rpb24iOiAiVXNlIG52Y2YtY2xpIHRvIGluc3RhbGwgbXkg" + - "Y29udHJvbCBwbGFuZSBhbmQgdGhlbiByZWdpc3RlciBhbmQgaW5zdGFsbCBhIHNlcGFyYXRlIGNv" + - "bXB1dGUgY2x1c3Rlci4gU2hvdyBldmVyeSByZXF1aXJlZCBnbG9iYWwgZmxhZy4iLAogICAgImV4" + - "cGVjdGVkX3NraWxsIjogIm52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiIsCiAgICAiZ3Jv" + - "dW5kX3RydXRoIjogIlRoZSBhZ2VudCBmaXJzdCByYW4gdGhlIENMSSBjb250cm9sLXBsYW5lIGlu" + - "c3RhbGwgYW5kIHJlcXVpcmVkIGl0cyBnZW5lcmF0ZWQgY29udHJvbC1wbGFuZS1wcm9maWxlLnlh" + - "bWwuIEl0IHRoZW4gc2hvd2VkIGNvbXBsZXRlIHJlZ2lzdGVyIGFuZCBpbnN0YWxsIGNvbW1hbmRz" + - "LCBlYWNoIGluY2x1ZGluZyAtLWNvbmZpZywgLS1jb250cm9sLXBsYW5lLXN0YWNrLCAtLWNvbXB1" + - "dGUtcGxhbmUtc3RhY2ssIC0tZW52LCBhbmQgLS1wbGFpbiBiZWZvcmUgdGhlIGNvbXB1dGUtcGxh" + - "bmUgc3ViY29tbWFuZC4gUmVnaXN0cmF0aW9uIGNvbnN1bWVkIHRoZSBwcm9maWxlIGFuZCBwcm9k" + - "dWNlZCB0aGUgdmFsdWVzIGZpbGUgY29uc3VtZWQgYnkgaW5zdGFsbC4gSXQgZGlkIG5vdCBzd2l0" + - "Y2ggdG8gdGhlIEhlbG1maWxlIHZhbHVlcyBoYW5kb2ZmLiIsCiAgICAiZXhwZWN0ZWRfYmVoYXZp" + - "b3IiOiBbCiAgICAgICJUaGUgYWdlbnQgcmVhZCB0aGUgbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFs" + - "bGF0aW9uIFNLSUxMLm1kIGJlZm9yZSB0YWtpbmcgYWN0aW9uIiwKICAgICAgIlRoZSBhZ2VudCBy" + - "YW4gbnZjZi1jbGkgc2VsZi1ob3N0ZWQgaW5zdGFsbCAtLWNvbnRyb2wtcGxhbmUgYW5kIHZlcmlm" + - "aWVkIGRlcGxveS9zdGFja3Mvc2VsZi1tYW5hZ2VkL291dC9jb250cm9sLXBsYW5lLXByb2ZpbGUu" + - "eWFtbCBleGlzdHMiLAogICAgICAiVGhlIHJlZ2lzdGVyIGNvbW1hbmQgaW5jbHVkZWQgLS1jb25m" + - "aWcsIC0tY29udHJvbC1wbGFuZS1zdGFjaywgLS1jb21wdXRlLXBsYW5lLXN0YWNrLCAtLWVudiwg" + - "YW5kIC0tcGxhaW4iLAogICAgICAiVGhlIHJlZ2lzdGVyIGNvbW1hbmQgaW5jbHVkZWQgLS1jb250" + - "cm9sLXBsYW5lLXByb2ZpbGUsIC0tY2x1c3Rlci1uYW1lLCAtLWt1YmUtY29udGV4dCwgLS1yZWdp" + - "b24sIGFuZCAtLW91dHB1dCIsCiAgICAgICJUaGUgaW5zdGFsbCBjb21tYW5kIHJlcGVhdGVkIC0t" + - "Y29uZmlnLCAtLWNvbnRyb2wtcGxhbmUtc3RhY2ssIC0tY29tcHV0ZS1wbGFuZS1zdGFjaywgLS1l" + - "bnYsIGFuZCAtLXBsYWluIiwKICAgICAgIlRoZSBpbnN0YWxsIGNvbW1hbmQgaW5jbHVkZWQgLS12" + - "YWx1ZXMsIC0ta3ViZS1jb250ZXh0LCBhbmQgLS1jbHVzdGVyLW5hbWUiLAogICAgICAiVGhlIGFn" + - "ZW50IGtlcHQgdGhlIGdlbmVyYXRlZCBwcm9maWxlIGFzIHRoZSBlbmRwb2ludCBzb3VyY2UgYW5k" + - "IGRpZCBub3QgbWl4IGluIEhlbG1maWxlIHZhbHVlcyByZWdpc3RyYXRpb24iCiAgICBdCiAgfSwK" + - "ICB7CiAgICAiaWQiOiAiUzQtb3ZlcnJpZGUtY2Fzc2FuZHJhLXJlc291cmNlcyIsCiAgICAicXVl" + - "c3Rpb24iOiAiQ2Fzc2FuZHJhIHBvZHMga2VlcCBnZXR0aW5nIE9PTUtpbGxlZC4gSW5jcmVhc2Ug" + - "bWVtb3J5IGxpbWl0cyB0byAxNkdpLiIsCiAgICAiZXhwZWN0ZWRfc2tpbGwiOiAibnZjZi1zZWxm" + - "LW1hbmFnZWQtaW5zdGFsbGF0aW9uIiwKICAgICJncm91bmRfdHJ1dGgiOiAiVGhlIGFnZW50IGNh" + - "cHR1cmVkIHRoZSBiYXNlbGluZSB3aXRoIGhlbG1maWxlIHRlbXBsYXRlLCB0aGVuIG1vZGlmaWVk" + - "IHRoZSBjYXNzYW5kcmEgcmVsZWFzZSB3aXRoIGlubGluZSB2YWx1ZXMgcmUtaW5jbHVkaW5nIGds" + - "b2JhbC55YW1sLmdvdG1wbCBhbmQgc2VjcmV0cyBpbiB0aGUgdmFsdWVzIGJsb2NrLiBJdCB3YXJu" + - "ZWQgYWJvdXQgdGhlIFlBTUwgbWVyZ2UgZ290Y2hhIGFuZCBwcmV2aWV3ZWQgdGhlIGRpZmYgYmVm" + - "b3JlIGFwcGx5aW5nLiIsCiAgICAiZXhwZWN0ZWRfYmVoYXZpb3IiOiBbCiAgICAgICJUaGUgYWdl" + - "bnQgcmVhZCB0aGUgbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uIFNLSUxMLm1kIGJlZm9y" + - "ZSB0YWtpbmcgYWN0aW9uIiwKICAgICAgIlRoZSBhZ2VudCBjYXB0dXJlZCBiYXNlbGluZSB3aXRo" + - "ICdoZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9Y2Fzc2FuZHJhIHRlbXBsYXRlJyIsCiAgICAgICJU" + - "aGUgYWdlbnQgbW9kaWZpZWQgdGhlIHJlbGVhc2UgdmFsdWVzIGJsb2NrIHRvIGluY2x1ZGUgcmVz" + - "b3VyY2UgbGltaXRzIHdpdGggbWVtb3J5OiAxNkdpIiwKICAgICAgIlRoZSBhZ2VudCByZS1pbmNs" + - "dWRlZCBnbG9iYWwueWFtbC5nb3RtcGwgYW5kIHNlY3JldHMgZmlsZSBpbiB0aGUgdmFsdWVzOiBi" + - "bG9jayAobm90IGp1c3QgdGhlIG92ZXJyaWRlIGFsb25lKSIsCiAgICAgICJUaGUgYWdlbnQgd2Fy" + - "bmVkIGFib3V0IHRoZSBZQU1MIG1lcmdlIGdvdGNoYTogc3BlY2lmeWluZyB2YWx1ZXM6IHJlcGxh" + - "Y2VzIHRoZSB0ZW1wbGF0ZSdzIHZhbHVlcyBsaXN0IGVudGlyZWx5IiwKICAgICAgIlRoZSBhZ2Vu" + - "dCBwcmV2aWV3ZWQgdGhlIGNoYW5nZSB3aXRoIGhlbG1maWxlIHRlbXBsYXRlIGFuZCBkaWZmIGJl" + - "Zm9yZSBhcHBseWluZyB3aXRoIHN5bmMiCiAgICBdCiAgfSwKICB7CiAgICAiaWQiOiAiUzYtc2Vs" + - "ZWN0aXZlLXN5bmMtZGVwZW5kZW5jaWVzIiwKICAgICJxdWVzdGlvbiI6ICJEZXBsb3kgb25seSB0" + - "aGUgTlZDRiBkZXBlbmRlbmNpZXMgLS0gTkFUUywgQ2Fzc2FuZHJhLCBhbmQgT3BlbkJhbyAtLSBm" + - "b3IgdGVzdGluZyIsCiAgICAiZXhwZWN0ZWRfc2tpbGwiOiAibnZjZi1zZWxmLW1hbmFnZWQtaW5z" + - "dGFsbGF0aW9uIiwKICAgICJncm91bmRfdHJ1dGgiOiAiVGhlIGFnZW50IHVzZWQgdGhlIGhlbG1m" + - "aWxlIHNlbGVjdG9yIHRvIGRlcGxveSBvbmx5IHRoZSBkZXBlbmRlbmNpZXMgcmVsZWFzZSBncm91" + - "cCwgdGhlbiB2ZXJpZmllZCBwb2RzIGluIHRoZSBkZXBlbmRlbmN5IG5hbWVzcGFjZXMuIiwKICAg" + - "ICJleHBlY3RlZF9iZWhhdmlvciI6IFsKICAgICAgIlRoZSBhZ2VudCByZWFkIHRoZSBudmNmLXNl" + - "bGYtbWFuYWdlZC1pbnN0YWxsYXRpb24gU0tJTEwubWQgYmVmb3JlIHRha2luZyBhY3Rpb24iLAog" + - "ICAgICAiVGhlIGFnZW50IHVzZWQgJ2hlbG1maWxlIC0tc2VsZWN0b3IgcmVsZWFzZS1ncm91cD1k" + - "ZXBlbmRlbmNpZXMgc3luYycgdG8gZGVwbG95IG9ubHkgZGVwZW5kZW5jaWVzIiwKICAgICAgIlRo" + - "ZSBhZ2VudCB2ZXJpZmllZCBwb2RzIGluIGRlcGVuZGVuY3kgbmFtZXNwYWNlcyAobmF0cy1zeXN0" + - "ZW0sIGNhc3NhbmRyYS1zeXN0ZW0sIHZhdWx0LXN5c3RlbSkiLAogICAgICAiVGhlIGFnZW50IHBy" + - "b3ZpZGVkIHRoZSBzZWxlY3RvciByZWZlcmVuY2UgZm9yIHRhcmdldGluZyBvdGhlciByZWxlYXNl" + - "IGdyb3VwcyIKICAgIF0KICB9LAogIHsKICAgICJpZCI6ICJTNy1kZWJ1Zy1pbWFnZXB1bGxiYWNr" + - "b2ZmIiwKICAgICJxdWVzdGlvbiI6ICJDYXNzYW5kcmEgcG9kcyBhcmUgaW4gSW1hZ2VQdWxsQmFj" + - "a09mZiB3aXRoIDQwMSBVbmF1dGhvcml6ZWQiLAogICAgImV4cGVjdGVkX3NraWxsIjogIm52Y2Yt" + - "c2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiIsCiAgICAiZ3JvdW5kX3RydXRoIjogIlRoZSBhZ2Vu" + - "dCByZWFkIHRoZSBkZWJ1Z2dpbmcgcmVmZXJlbmNlIGFuZCByYW4gZGlhZ25vc3RpYyBjb21tYW5k" + - "cyB0byBpZGVudGlmeSB0aGUgcm9vdCBjYXVzZTogZGVzY3JpYmVkIHRoZSBwb2QsIGNoZWNrZWQg" + - "Zm9yIHB1bGwgc2VjcmV0cywgY2hlY2tlZCBpbWFnZVB1bGxTZWNyZXRzIG9uIHRoZSBwb2Qgc3Bl" + - "YyBhbmQgc2VydmljZSBhY2NvdW50LiBJdCBpZGVudGlmaWVkIHRoZSBpc3N1ZSAobWlzc2luZyBz" + - "ZWNyZXQsIHdyb25nIGNyZWRlbnRpYWxzLCBvciBtaXNzaW5nIGltYWdlUHVsbFNlY3JldHMpIGFu" + - "ZCBwcm92aWRlZCB0aGUgY29ycmVjdCBmaXguIiwKICAgICJleHBlY3RlZF9iZWhhdmlvciI6IFsK" + - "ICAgICAgIlRoZSBhZ2VudCByZWFkIHRoZSBudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24g" + - "U0tJTEwubWQgYW5kIHJlZmVyZW5jZXMvZGVidWdnaW5nLm1kIiwKICAgICAgIlRoZSBhZ2VudCBy" + - "YW4gJ2t1YmVjdGwgZGVzY3JpYmUgcG9kJyB0byBzZWUgdGhlIEltYWdlUHVsbEJhY2tPZmYgZXZl" + - "bnRzIiwKICAgICAgIlRoZSBhZ2VudCBjaGVja2VkIGZvciBwdWxsIHNlY3JldHMgaW4gdGhlIGNh" + - "c3NhbmRyYS1zeXN0ZW0gbmFtZXNwYWNlIiwKICAgICAgIlRoZSBhZ2VudCBjaGVja2VkIGltYWdl" + - "UHVsbFNlY3JldHMgb24gdGhlIHBvZCBzcGVjIGFuZC9vciBzZXJ2aWNlIGFjY291bnQiLAogICAg" + - "ICAiVGhlIGFnZW50IGlkZW50aWZpZWQgdGhlIHJvb3QgY2F1c2UgYW5kIHByb3ZpZGVkIGEgc3Bl" + - "Y2lmaWMgZml4IgogICAgXQogIH0sCiAgewogICAgImlkIjogIlM5LXJlbW90ZS1la3Mtcm91dGlu" + - "Zy1hbmQtc2VjcmV0cyIsCiAgICAicXVlc3Rpb24iOiAiQ29uZmlndXJlIGEgcmVtb3RlIEVLUyBj" + - "b21wdXRlIGNsdXN0ZXIgdG8gcmVhY2ggbXkgTlZDRiBjb250cm9sIHBsYW5lIHRocm91Z2ggaXRz" + - "IEVudm95IEdhdGV3YXksIGluY2x1ZGluZyBOQVRTIGFuZCBwcml2YXRlLXJlZ2lzdHJ5IHB1bGwg" + - "c2VjcmV0cy4iLAogICAgImV4cGVjdGVkX3NraWxsIjogIm52Y2Ytc2VsZi1tYW5hZ2VkLWluc3Rh" + - "bGxhdGlvbiIsCiAgICAiZ3JvdW5kX3RydXRoIjogIlRoZSBhZ2VudCBjb25maWd1cmVkIHRoZSBj" + - "b250cm9sIHBsYW5lIHRvIHVzZSB0aGUgRW52b3kgR2F0ZXdheSBjb250cm9sbGVyIGluIGVudm95" + - "LWdhdGV3YXktc3lzdGVtIGFuZCBHYXRld2F5L252Y2YtZ2F0ZXdheSBpbiBlbnZveS1nYXRld2F5" + - "LCBzZXQgYWxsIHNpeCByZW1vdGUgd29ya2VyIGVuZHBvaW50cyBhbmQgdGhlIGdycGMtcHJveHkg" + - "bG9jYWwgb3ZlcnJpZGUsIGVuYWJsZWQgTlZDRiBhbmQgTlZDVCBnUlBDIHJvdXRlcyBwbHVzIE5B" + - "VFMsIGFuZCBlbmFibGVkIE9wZW5CYW8gaXNzdWVyIGRpc2NvdmVyeS4gSXQgY29uZmlndXJlZCB0" + - "aGUgYmFyZS1HYXRld2F5IENMSSBVUkwgYW5kIEhvc3QgZmllbGRzIGluY2x1ZGluZyBpY21zX2hv" + - "c3QsIHBsdXMgdGhlIGNvbXB1dGUtcGxhbmUgSUNNUywgUmVWYWwsIGFuZCBOQVRTIGV4dGVybmFs" + - "IFVSTHMgYW5kIGhvc3Qgb3ZlcnJpZGVzLiBJdCBjcmVhdGVkIHRoZSBwdWxsIHNlY3JldCBpbiBh" + - "bGwgY29udHJvbC1wbGFuZSBuYW1lc3BhY2VzIGluY2x1ZGluZyBjZXJ0LW1hbmFnZXIsIGJ1dCBv" + - "bmx5IGluIG52Y2Etb3BlcmF0b3Igb24gdGhlIGNvbXB1dGUgY2x1c3RlcjsgdGhlIGNoYXJ0IGFu" + - "ZCBvcGVyYXRvciBtaXJyb3IgaXQgdG8gbnZjYS1zeXN0ZW0uIiwKICAgICJleHBlY3RlZF9iZWhh" + - "dmlvciI6IFsKICAgICAgIlRoZSBhZ2VudCByZWFkIHRoZSBudmNmLXNlbGYtbWFuYWdlZC1pbnN0" + - "YWxsYXRpb24gU0tJTEwubWQgYmVmb3JlIHRha2luZyBhY3Rpb24iLAogICAgICAiVGhlIGFnZW50" + - "IHNldCBpbmdyZXNzLmdhdGV3YXlBcGkuY29udHJvbGxlck5hbWVzcGFjZSB0byBlbnZveS1nYXRl" + - "d2F5LXN5c3RlbSIsCiAgICAgICJUaGUgYWdlbnQgc2V0IHNoYXJlZCwgZ3JwYywgYW5kIG5hdHMg" + - "R2F0ZXdheSByZWZlcmVuY2VzIHRvIG5hbWUgbnZjZi1nYXRld2F5IGFuZCBuYW1lc3BhY2UgZW52" + - "b3ktZ2F0ZXdheSIsCiAgICAgICJUaGUgYWdlbnQgc2V0IGdsb2JhbC53b3JrZXJFbmRwb2ludHMu" + - "bnZjZlNlcnZpY2VVUkwsIG52Y2ZHcnBjU2VydmljZVVSTCwgbnZjZk5hdHNTZXJ2aWNlVVJMLCBu" + - "dmN0U2VydmljZVVSTCwgbnZjdEdycGNTZXJ2aWNlVVJMLCBhbmQgaW52b2NhdGlvblNlcnZpY2VV" + - "UkwiLAogICAgICAiVGhlIGFnZW50IHNldCBncnBjcHJveHkubnZjZkdycGNTZXJ2aWNlVVJMIHRv" + - "IHRoZSBjb250cm9sLXBsYW5lLWxvY2FsIEFQSSBnUlBDIHNlcnZpY2UiLAogICAgICAiVGhlIGFn" + - "ZW50IGVuYWJsZWQgYm90aCBpbmdyZXNzLmdhdGV3YXlBcGkucm91dGVzLm52Y2ZBcGkuZ3JwYyBh" + - "bmQgbnZjdEFwaS5ncnBjIHdpdGggd29ya2VyLWFwaSBhbmQgd29ya2VyLXRhc2tzIGhvc3RuYW1l" + - "cyIsCiAgICAgICJUaGUgYWdlbnQgZXhwbGljaXRseSBzZXQgaW5ncmVzcy5nYXRld2F5QXBpLnJv" + - "dXRlcy5uYXRzLmVuYWJsZWQgdG8gdHJ1ZSIsCiAgICAgICJUaGUgYWdlbnQgc2V0IG9wZW5iYW8u" + - "bWlncmF0aW9ucy5pc3N1ZXJEaXNjb3ZlcnkuZW5hYmxlZCB0byB0cnVlIiwKICAgICAgIlRoZSBh" + - "Z2VudCBjb25maWd1cmVkIHRoZSBiYXJlLUdhdGV3YXkgQ0xJIFVSTCBhbmQgSG9zdCBmaWVsZHMs" + - "IGluY2x1ZGluZyBzY2hlbWUtbGVzcyBpY21zX2hvc3QiLAogICAgICAiVGhlIGFnZW50IGNvbmZp" + - "Z3VyZWQgY29tcHV0ZS1wbGFuZSBpY21zU2VydmljZVVSTCwgaWNtc1NlcnZpY2VIb3N0SGVhZGVy" + - "T3ZlcnJpZGUsIHJldmFsU2VydmljZVVSTCwgcmV2YWxTZXJ2aWNlSG9zdEhlYWRlck92ZXJyaWRl" + - "LCBuYXRzVVJMLCBhbmQgbmF0c0hvc3RPdmVycmlkZSIsCiAgICAgICJUaGUgY29udHJvbC1wbGFu" + - "ZSBwdWxsLXNlY3JldCBuYW1lc3BhY2UgbGlzdCBpbmNsdWRlZCBjZXJ0LW1hbmFnZXIiLAogICAg" + - "ICAiVGhlIGNvbXB1dGUtcGxhbmUgc2VjcmV0IHdhcyBjcmVhdGVkIG9ubHkgaW4gbnZjYS1vcGVy" + - "YXRvciBhbmQgbWlycm9yZWQgYnkgdGhlIGNoYXJ0IGFuZCBvcGVyYXRvciB0byBudmNhLXN5c3Rl" + - "bSIKICAgIF0KICB9LAogIHsKICAgICJpZCI6ICJHMTEtc3BsaXQtdGVhcmRvd24iLAogICAgInF1" + - "ZXN0aW9uIjogIlRlYXIgZG93biBteSBzcGxpdCBjb250cm9sLXBsYW5lIGFuZCBjb21wdXRlLXBs" + - "YW5lIGRlcGxveW1lbnQgc2FmZWx5LiBTaG93IGJvdGggdGhlIEhlbG1maWxlIHZhbHVlcyBhbmQg" + - "Q0xJIHByb2ZpbGUgdmFyaWFudHMuIiwKICAgICJleHBlY3RlZF9za2lsbCI6ICJudmNmLXNlbGYt" + - "bWFuYWdlZC1pbnN0YWxsYXRpb24iLAogICAgImdyb3VuZF90cnV0aCI6ICJUaGUgSGVsbWZpbGUg" + - "ZmxvdyBkZXN0cm95ZWQgYW5kIGNvbmZpcm1lZCBkZXJlZ2lzdHJhdGlvbiBvZiBldmVyeSBjb21w" + - "dXRlIGNsdXN0ZXIgYmVmb3JlIGRlc3Ryb3lpbmcgdGhlIGNvbnRyb2wgcGxhbmUgYW5kIHBhc3Nl" + - "ZCBib3RoIGNvbnRyb2wtcGxhbmUga3ViZWNvbmZpZyBmb3Jtcy4gQmVmb3JlIGVpdGhlciBoYW5k" + - "b2ZmIGNvdWxkIGRlc3Ryb3kgdGhlIGNvbnRyb2wgcGxhbmUsIGJvdGggdGVhcmRvd24gZmxvd3Mg" + - "d2FybmVkIHRoYXQgbmFtZXNwYWNlIHByZXNlcnZhdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSB0aGUg" + - "SGVsbSByZWxlYXNlLCByZXF1aXJlZCBlZmZlY3RpdmUgY2VydE1hbmFnZXIuZW5hYmxlZDogZmFs" + - "c2UgZm9yIGFuIGV4dGVybmFsIGluc3RhbGxhdGlvbiBhbmQgYWJvcnRlZCBpZiB0cnVlLCBhbmQg" + - "dmVyaWZpZWQgbWF0Y2hpbmcgcmVsZWFzZSBvd25lcnNoaXAgZm9yIGFuIGludGVuZGVkIHN0YWNr" + - "LW1hbmFnZWQgcmVsZWFzZSwgYWJvcnRpbmcgb24gbWlzc2luZyBvciBtaXNtYXRjaGVkIGV2aWRl" + - "bmNlLiBUaGV5IHByZXNlcnZlZCB0aGUgbmFtZXNwYWNlIGJ5IGRlZmF1bHQgYW5kIGRpZCBub3Qg" + - "ZGVsZXRlIGl0IHdpdGhvdXQgbmFtZXNwYWNlIHByb3ZlbmFuY2UgYW5kIGV4cGxpY2l0IGNvbmZp" + - "cm1hdGlvbi4gVGhlIENMSSBmbG93IHJldGFpbmVkIHRoZSBnZW5lcmF0ZWQgcmVnaXN0cmF0aW9u" + - "IHZhbHVlcywgdXNlZCB0aGUgZnVsbC1wcmVmaXggc3RhdHVzIGNvbW1hbmQgdG8gaW5zcGVjdCBs" + - "aXZlIHJlZ2lzdHJhdGlvbnMsIHN0YXRlZCB0aGF0IG5hbWVkLWNsdXN0ZXIgcGxhbi1vbmx5IGRv" + - "ZXMgbm90IHF1ZXJ5IElDTVMgYW5kIGNhbm5vdCBwcmVkaWN0IGNvbmRpdGlvbmFsIGNvbnRyb2wt" + - "cGxhbmUgcmVtb3ZhbCwgYW5kIGdvdCBleHBsaWNpdCBjb25maXJtYXRpb24gd2hlbiB0aGUgdGFy" + - "Z2V0IHdhcyB0aGUgbGFzdCByZWdpc3RlcmVkIGNsdXN0ZXIuIEl0IHRoZW4gcHJldmlld2VkIGFu" + - "ZCByYW4gZG93biB3aXRoIHRoZSBmdWxsIHBlcnNpc3RlbnQgcHJlZml4LCByZW1vdmluZyB0aGUg" + - "Y29udHJvbCBwbGFuZSBvbmx5IGFmdGVyIHRoZSBsYXN0IHJlZ2lzdHJhdGlvbiB3YXMgZ29uZS4i" + - "LAogICAgImV4cGVjdGVkX2JlaGF2aW9yIjogWwogICAgICAiVGhlIGFnZW50IHJlYWQgdGhlIG52" + - "Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiBTS0lMTC5tZCBiZWZvcmUgdGFraW5nIGFjdGlv" + - "biIsCiAgICAgICJGb3IgZXZlcnkgY29tcHV0ZSBjbHVzdGVyLCB0aGUgSGVsbWZpbGUgZmxvdyBy" + - "YW4gdGhlIGNvbXB1dGUtcGxhbmUgTWFrZWZpbGUgZGVzdHJveSB0YXJnZXQgd2l0aCBpdHMgY29t" + - "cHV0ZSBrdWJlY29uZmlnIiwKICAgICAgIkFmdGVyIGNvbmZpcm1hdGlvbiwgdGhlIEhlbG1maWxl" + - "IGZsb3cgcmFuIGNsdXN0ZXIgZGVsZXRlIHdpdGggY2x1c3RlcklEIGFuZCBuY2FJRCBiZWZvcmUg" + - "Y29udHJvbC1wbGFuZSBkZXN0cnVjdGlvbiIsCiAgICAgICJCZWZvcmUgZWl0aGVyIGhhbmRvZmYg" + - "Y291bGQgZGVzdHJveSB0aGUgY29udHJvbCBwbGFuZSwgYm90aCB0ZWFyZG93biBmbG93cyB3YXJu" + - "ZWQgdGhhdCBuYW1lc3BhY2UgcHJlc2VydmF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHRoZSBIZWxt" + - "IHJlbGVhc2UsIHJlcXVpcmVkIGVmZmVjdGl2ZSBjZXJ0TWFuYWdlci5lbmFibGVkOiBmYWxzZSBm" + - "b3IgYW4gZXh0ZXJuYWwgaW5zdGFsbGF0aW9uIGFuZCBhYm9ydGVkIGlmIHRydWUsIGFuZCB2ZXJp" + - "ZmllZCBpbnRlbmRlZCBzdGFjayBvd25lcnNoaXAgd2hlbiBlbmFibGVkLCBhYm9ydGluZyBvbiBt" + - "aXNzaW5nIG9yIG1pc21hdGNoZWQgZXZpZGVuY2UiLAogICAgICAiQm90aCB0ZWFyZG93biBmbG93" + - "cyBwcmVzZXJ2ZWQgdGhlIGNlcnQtbWFuYWdlciBuYW1lc3BhY2UgYnkgZGVmYXVsdCBhbmQgZGlk" + - "IG5vdCBkZWxldGUgaXQgd2l0aG91dCBuYW1lc3BhY2UgcHJvdmVuYW5jZSBhbmQgZXhwbGljaXQg" + - "Y29uZmlybWF0aW9uIiwKICAgICAgIlRoZSBIZWxtZmlsZSBmbG93IHJhbiBjb250cm9sLXBsYW5l" + - "IE1ha2VmaWxlIGRlc3Ryb3kgd2l0aCBib3RoIEtVQkVDT05GSUcgYW5kIEtVQkVDT05GSUdfRklM" + - "RSIsCiAgICAgICJUaGUgQ0xJIGZsb3cgcmV0YWluZWQgb3V0LzxjbHVzdGVyLW5hbWU+LXJlZ2lz" + - "dGVyLXZhbHVlcy55YW1sIHVudGlsIHRlYXJkb3duIGNvbXBsZXRlZCIsCiAgICAgICJCZWZvcmUg" + - "cmVhbCBkb3duLCB0aGUgQ0xJIGZsb3cgdXNlZCB0aGUgZnVsbC1wcmVmaXggc3RhdHVzIGNvbW1h" + - "bmQgdG8gaW5zcGVjdCBsaXZlIHJlZ2lzdHJhdGlvbnMsIHN0YXRlZCB0aGF0IG5hbWVkLWNsdXN0" + - "ZXIgcGxhbi1vbmx5IGRvZXMgbm90IHF1ZXJ5IElDTVMgYW5kIGNhbm5vdCBwcmVkaWN0IGNvbmRp" + - "dGlvbmFsIGNvbnRyb2wtcGxhbmUgcmVtb3ZhbCwgd2FybmVkIHdoZW4gdGhlIHRhcmdldCB3YXMg" + - "dGhlIGxhc3QgcmVnaXN0ZXJlZCBjbHVzdGVyLCBhbmQgZ290IGV4cGxpY2l0IGNvbmZpcm1hdGlv" + - "biIsCiAgICAgICJUaGUgQ0xJIGZsb3cgdXNlZCAtLWNvbmZpZywgYm90aCBzdGFjayBwYXRocywg" + - "LS1lbnYsIC0tcGxhaW4sIGJvdGggY29udGV4dHMsIGFuZCAtLWljbXMtdXJsIGZvciBkb3duIC0t" + - "cGxhbi1vbmx5IGFuZCB0aGVuIGRvd24iLAogICAgICAiVGhlIGFnZW50IHN0YXRlZCB0aGF0IGRv" + - "d24gdW5yZWdpc3RlcnMgZWFjaCBjb21wdXRlIGNsdXN0ZXIgYW5kIHJlbW92ZXMgdGhlIGNvbnRy" + - "b2wgcGxhbmUgb25seSBhZnRlciBubyByZWdpc3RyYXRpb25zIHJlbWFpbiIKICAgIF0KICB9LAog" + - "IHsKICAgICJpZCI6ICJTMTMtdmFsdWVzLXByZWNlZGVuY2UiLAogICAgInF1ZXN0aW9uIjogIkkg" + - "YWRkZWQgYSB2YWx1ZSB0byBteSBlbnZpcm9ubWVudCBZQU1MIGJ1dCBpdCdzIGJlaW5nIHNpbGVu" + - "dGx5IGlnbm9yZWQuIEhvdyBkbyBoZWxtZmlsZSB2YWx1ZXMgd29yayBpbiBOVkNGPyIsCiAgICAi" + - "ZXhwZWN0ZWRfc2tpbGwiOiAibnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uIiwKICAgICJn" + - "cm91bmRfdHJ1dGgiOiAiVGhlIGFnZW50IGV4cGxhaW5lZCB0aGUgdmFsdWVzIHByZWNlZGVuY2Ug" + - "Y2hhaW4gKGJhc2UueWFtbCwgZW52IFlBTUwsIGdsb2JhbC55YW1sLmdvdG1wbCwgc2VjcmV0cywg" + - "aW5saW5lIHZhbHVlcyksIGlkZW50aWZpZWQgdGhhdCBnbG9iYWwueWFtbC5nb3RtcGwgb25seSBw" + - "YXNzZXMgdGhyb3VnaCBzcGVjaWZpYyBrZXlzLCBhbmQgZXhwbGFpbmVkIHRoYXQgYXJiaXRyYXJ5" + - "IGNoYXJ0IHZhbHVlcyBtdXN0IHVzZSByZWxlYXNlIGlubGluZSB2YWx1ZXMgYmxvY2tzLiIsCiAg" + - "ICAiZXhwZWN0ZWRfYmVoYXZpb3IiOiBbCiAgICAgICJUaGUgYWdlbnQgcmVhZCB0aGUgbnZjZi1z" + - "ZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uIFNLSUxMLm1kIGJlZm9yZSB0YWtpbmcgYWN0aW9uIiwK" + - "ICAgICAgIlRoZSBhZ2VudCBleHBsYWluZWQgdGhlIHZhbHVlcyBwcmVjZWRlbmNlIGNoYWluOiBi" + - "YXNlLnlhbWwgLT4gZW52IFlBTUwgLT4gZ2xvYmFsLnlhbWwuZ290bXBsIC0+IHNlY3JldHMgLT4g" + - "aW5saW5lIHZhbHVlcyIsCiAgICAgICJUaGUgYWdlbnQgaWRlbnRpZmllZCB0aGF0IGdsb2JhbC55" + - "YW1sLmdvdG1wbCBvbmx5IHBhc3NlcyB0aHJvdWdoIHNwZWNpZmljIGtleXMgKGNhc3NhbmRyYS5y" + - "ZXBsaWNhQ291bnQsIGdsb2JhbC5zdG9yYWdlQ2xhc3MsIGdsb2JhbC5pbWFnZSwgZXRjLikiLAog" + - "ICAgICAiVGhlIGFnZW50IGV4cGxhaW5lZCB0aGF0IGFyYml0cmFyeSBjaGFydCB2YWx1ZXMgbXVz" + - "dCBiZSBzZXQgdmlhIHJlbGVhc2UgaW5saW5lIHZhbHVlczogYmxvY2tzIiwKICAgICAgIlRoZSBh" + - "Z2VudCBsaXN0ZWQgZXhhbXBsZXMgb2YgdmFsdWVzIHRoYXQgYXJlIHByb3BhZ2F0ZWQgYW5kIGFy" + - "Yml0cmFyeSBjaGFydCB2YWx1ZXMgdGhhdCByZXF1aXJlIGEgcmVsZWFzZSB2YWx1ZXMgYmxvY2si" + - "CiAgICBdCiAgfSwKICB7CiAgICAiaWQiOiAiUzE0LWVuYWJsZS1sbG0tZnVuY3Rpb25zIiwKICAg" + - "ICJxdWVzdGlvbiI6ICJJIG5lZWQgdG8gZGVwbG95IGZ1bmN0aW9uVHlwZTogTExNIGZ1bmN0aW9u" + - "cyBvbiBhIHNlbGYtbWFuYWdlZCwgc2luZ2xlLW5vZGUgaXNvbGF0ZWQgdGVzdCBjbHVzdGVyLiBX" + - "aGF0IEhlbG1maWxlIGNvbmZpZ3VyYXRpb24gYW5kIHZlcmlmaWNhdGlvbiBzdGVwcyBkbyBJIG5l" + - "ZWQ/IiwKICAgICJleHBlY3RlZF9za2lsbCI6ICJudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRp" + - "b24iLAogICAgImdyb3VuZF90cnV0aCI6ICJUaGUgYWdlbnQgZW5hYmxlZCB0aGUgTExNIGFkZG9u" + - "IHdpdGggYWRkb25zLmxsbS5lbmFibGVkLCBjb25maWd1cmVkIHNpbmdsZSByZXBsaWNhcyBmb3Ig" + - "dGhlIExMTSBBUEkgR2F0ZXdheSBhbmQgcmVxdWVzdCByb3V0ZXIsIGFuZCBleHBsYWluZWQgdGhh" + - "dCB0aGUgcmVxdWVzdCByb3V0ZXIgdXNlcyBwb3dlci1vZi10d28gd2hlbiBubyBsb2FkLWJhbGFu" + - "Y2VyIGNvbmZpZ3VyYXRpb24gaXMgc2V0LiBJdCBsaW5rZWQgdGhlIGNhbm9uaWNhbCByZXF1ZXN0" + - "LXJvdXRlciBsb2FkLWJhbGFuY2luZyBndWlkZSBmb3Igb3RoZXIgcm91dGluZyBtZXRob2RzLiBG" + - "b3IgdGhlIGlzb2xhdGVkIHBsYWludGV4dCBjbHVzdGVyLCBpdCBpbmNsdWRlZCBib3RoIGFkZG9u" + - "cy5sbG0uZ2F0ZXdheS5hdXRoLmdycGNJbnNlY3VyZSBhbmQgYWdlbnRDb25maWcubWVyZ2VDb25m" + - "aWcud29ya2xvYWQuc3RhcmdhdGVRVUlDSW5zZWN1cmUsIHdpdGggYSB3YXJuaW5nIHRoYXQgdGhv" + - "c2Ugc2V0dGluZ3MgYXJlIG5vdCBmb3IgcHJvZHVjdGlvbi4gSXQgcmVmcmVzaGVkIHRoZSBjb21w" + - "dXRlIHBsYW5lIHVzaW5nIHRoZSBzYW1lIGhhbmRvZmYgdXNlZCBkdXJpbmcgaW5zdGFsbGF0aW9u" + - "LCByZWRlcGxveWVkIGV4aXN0aW5nIExMTSBmdW5jdGlvbnMsIGFuZCB2ZXJpZmllZCB0aGUgTExN" + - "IGRlcGxveW1lbnRzLCByb3V0ZSwgYW5kIGxsbS13b3JrZXIgc2lkZWNhci4iLAogICAgImV4cGVj" + - "dGVkX2JlaGF2aW9yIjogWwogICAgICAiVGhlIGFnZW50IHVzZWQgYWRkb25zLmxsbS5lbmFibGVk" + - "LCBub3QgdGhlIG9ic29sZXRlIGxsbS5lbmFibGVkIHBhdGgiLAogICAgICAiVGhlIGFnZW50IHNl" + - "dCBnYXRld2F5IGFuZCByZXF1ZXN0Um91dGVyIHJlcGxpY2FDb3VudCB0byAxIGZvciB0aGUgc2lu" + - "Z2xlLW5vZGUgdGVzdCBjbHVzdGVyIiwKICAgICAgIlRoZSBhZ2VudCBzdGF0ZWQgdGhhdCB0aGUg" + - "cmVxdWVzdCByb3V0ZXIgZGVmYXVsdHMgdG8gcG93ZXItb2YtdHdvIGFuZCBsaW5rZWQgdGhlIGNh" + - "bm9uaWNhbCByZXF1ZXN0LXJvdXRlciBsb2FkLWJhbGFuY2luZyBndWlkZSBmb3Igb3RoZXIgbWV0" + - "aG9kcyIsCiAgICAgICJUaGUgYWdlbnQgaW5jbHVkZWQgYWRkb25zLmxsbS5nYXRld2F5LmF1dGgu" + - "Z3JwY0luc2VjdXJlIGFuZCB3b3JrbG9hZC5zdGFyZ2F0ZVFVSUNJbnNlY3VyZSBmb3IgdGhlIGlz" + - "b2xhdGVkIHBsYWludGV4dCBjbHVzdGVyLCBhbmQgd2FybmVkIGFnYWluc3QgdXNpbmcgdGhlbSBp" + - "biBwcm9kdWN0aW9uIiwKICAgICAgIlRoZSBhZ2VudCBhcHBsaWVkIHRoZSBjb250cm9sLXBsYW5l" + - "IEhlbG1maWxlIGVudmlyb25tZW50LCByZWZyZXNoZWQgdGhlIGNvbXB1dGUgcGxhbmUgd2l0aCB0" + - "aGUgc2FtZSBzZWxlY3RlZCBoYW5kb2ZmLCBhbmQgcmVjcmVhdGVkIG9yIHJlZGVwbG95ZWQgZXhp" + - "c3RpbmcgTExNIGZ1bmN0aW9ucyIsCiAgICAgICJUaGUgYWdlbnQgdmVyaWZpZWQgbGxtLWFwaS1n" + - "YXRld2F5LCBsbG0tcmVxdWVzdC1yb3V0ZXIsIHRoZSBMTE0gSFRUUFJvdXRlLCBhbmQgdGhlIGxs" + - "bS13b3JrZXIgc2lkZWNhciBpbmNsdWRpbmcgLS1xdWljLWluc2VjdXJlIgogICAgXQogIH0sCiAg" + - "ewogICAgImlkIjogIkc4LU5FRy1ub3QtZm9yLWszZCIsCiAgICAicXVlc3Rpb24iOiAiU2V0IHVw" + - "IGEgbG9jYWwgTlZDRiBkZXYgY2x1c3RlciB1c2luZyBrM2QgZm9yIHRlc3RpbmciLAogICAgImV4" + - "cGVjdGVkX3NraWxsIjogbnVsbCwKICAgICJzaG91bGRfdHJpZ2dlciI6IGZhbHNlLAogICAgImdy" + - "b3VuZF90cnV0aCI6ICJUaGlzIGlzIGEgbG9jYWwgazNkIGRldmVsb3BtZW50IHJlcXVlc3QgdGhh" + - "dCBiZWxvbmdzIHRvIHRoZSBudmNmLXNlbGYtaG9zdGVkLWxvY2FsLWRldiBza2lsbCwgbm90IG52" + - "Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbi4gVGhlIGFnZW50IGRpZCBub3QgcmVhZCBvciB1" + - "c2UgdGhlIHNlbGYtbWFuYWdlZCBpbnN0YWxsYXRpb24gc2tpbGwgYW5kIGluc3RlYWQgcHJvdmlk" + - "ZWQgazNkLXNwZWNpZmljIGd1aWRhbmNlLiIsCiAgICAiZXhwZWN0ZWRfYmVoYXZpb3IiOiBbCiAg" + - "ICAgICJUaGUgYWdlbnQgZGlkIG5vdCByZWFkIG52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlv" + - "bi9TS0lMTC5tZCIsCiAgICAgICJUaGUgYWdlbnQgZGlkIG5vdCBwcm92aWRlIGhlbG1maWxlLWJh" + - "c2VkIHByb2R1Y3Rpb24gZGVwbG95bWVudCBpbnN0cnVjdGlvbnMiLAogICAgICAiVGhlIGFnZW50" + - "IHByb3ZpZGVkIGszZC1zcGVjaWZpYyBsb2NhbCBkZXZlbG9wbWVudCBndWlkYW5jZSBvciBkZWZl" + - "cnJlZCB0byB0aGUgYXBwcm9wcmlhdGUgbG9jYWwtZGV2IHNraWxsIgogICAgXQogIH0KXQpQSwcI" + - "KxO4P61VAACtVQAAUEsDBBQACAAAAAAAIQAAAAAAAAAAAAAAAAAvAAkAZGF0YS9udmNmLXNlbGYt" + - "bWFuYWdlZC1pbnN0YWxsYXRpb24vZXhhbXBsZXMubWRVVAUAAQCmzhIjIEV4YW1wbGVzCgpXb3Jr" + - "ZWQgZXhhbXBsZXMgYmFzZWQgb24gcmVhbCBkZXBsb3ltZW50IHNjZW5hcmlvcy4KCiMjIEV4YW1w" + - "bGUgMTogT3ZlcnJpZGUgQ2Fzc2FuZHJhIFJlc291cmNlcwoKVGhlIGRlZmF1bHQgQ2Fzc2FuZHJh" + - "IHJlc291cmNlIGxpbWl0cyBjYXVzZSBPT00gb24gbGFyZ2UgaW5zdGFuY2UgdHlwZXMgKGUuZy4s" + - "IGBwNS40OHhsYXJnZWApLgoKUHJvYmxlbTogQ2Fzc2FuZHJhIHBvZHMgcmVzdGFydCB3aXRoIGBP" + - "T01LaWxsZWRgLgoKU29sdXRpb246IE92ZXJyaWRlIHJlc291cmNlcyB2aWEgaGVsbWZpbGUgcmVs" + - "ZWFzZSB2YWx1ZXMgYmxvY2suCgojIyMgU3RlcCAxOiBDYXB0dXJlIGJhc2VsaW5lCgpgYGBiYXNo" + - "CkhFTE1GSUxFX0VOVj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9Y2Fzc2FuZHJhIHRl" + - "bXBsYXRlID4gL3RtcC9jYXNzLWJlZm9yZS55YW1sCmdyZXAgLUE4ICdyZXNvdXJjZXM6JyAvdG1w" + - "L2Nhc3MtYmVmb3JlLnlhbWwgfCBoZWFkIC0xMApgYGAKCiMjIyBTdGVwIDI6IEFkZCBvdmVycmlk" + - "ZSB0byBoZWxtZmlsZS5kLzAxLWRlcGVuZGVuY2llcy55YW1sLmdvdG1wbAoKSW4gdGhlIGV4YW1w" + - "bGVzIGJlbG93LCBgPHByaXZhdGUtdmFsdWVzPmAgcmVmZXJzIHRvIHRoZSBgc2VjcmV0cy9gIGRp" + - "cmVjdG9yeSBhdCB0aGUgaGVsbWZpbGUgc3RhY2sgcm9vdC4KCmBgYHlhbWwKLSBuYW1lOiBjYXNz" + - "YW5kcmEKICB2ZXJzaW9uOiAwLjguMAogIGNvbmRpdGlvbjogY2Fzc2FuZHJhLmVuYWJsZWQKICBu" + - "YW1lc3BhY2U6IGNhc3NhbmRyYS1zeXN0ZW0KICA8PDogKmRlcGVuZGVuY3kKICB2YWx1ZXM6CiAg" + - "ICAtIC4uL2dsb2JhbC55YW1sLmdvdG1wbAogICAgLSAuLi88cHJpdmF0ZS12YWx1ZXM+L3t7IHJl" + - "cXVpcmVkRW52ICJIRUxNRklMRV9FTlYiIH19LXNlY3JldHMueWFtbAogICAgLSBjYXNzYW5kcmE6" + - "CiAgICAgICAgcmVzb3VyY2VzOgogICAgICAgICAgbGltaXRzOgogICAgICAgICAgICBjcHU6ICI4" + - "IgogICAgICAgICAgICBtZW1vcnk6IDgxOTJNaQogICAgICAgICAgcmVxdWVzdHM6CiAgICAgICAg" + - "ICAgIGNwdTogIjIiCiAgICAgICAgICAgIG1lbW9yeTogNDA5Nk1pCmBgYAoKIyMjIFN0ZXAgMzog" + - "VmVyaWZ5IGFuZCBhcHBseQoKYGBgYmFzaApIRUxNRklMRV9FTlY9PGVudj4gaGVsbWZpbGUgLS1z" + - "ZWxlY3RvciBuYW1lPWNhc3NhbmRyYSB0ZW1wbGF0ZSA+IC90bXAvY2Fzcy1hZnRlci55YW1sCmRp" + - "ZmYgL3RtcC9jYXNzLWJlZm9yZS55YW1sIC90bXAvY2Fzcy1hZnRlci55YW1sICAjIENvbmZpcm0g" + - "cmVzb3VyY2VzIGNoYW5nZWQKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0b3Ig" + - "bmFtZT1jYXNzYW5kcmEgc3luYwpgYGAKCk5vdGU6IGByZXNvdXJjZVByZXNldGAgKGEgQml0bmFt" + - "aSBmZWF0dXJlKSBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBOVkNGIGNhc3NhbmRyYSB3cmFwcGVy" + - "IGNoYXJ0LiBVc2UgZXhwbGljaXQgYHJlc291cmNlc2AgaW5zdGVhZC4KCi0tLQoKIyMgRXhhbXBs" + - "ZSAyOiBEZXBsb3kgZnJvbSBOR0MgUHJpdmF0ZSBSZWdpc3RyeSB3aXRoIFB1bGwgU2VjcmV0cwoK" + - "RGVwbG95IHRoZSBOVkNGIHN0YWNrIHB1bGxpbmcgaW1hZ2VzIGRpcmVjdGx5IGZyb20gTkdDIChg" + - "bnZjci5pb2ApIGluc3RlYWQgb2YgYSBtaXJyb3JlZCByZWdpc3RyeSwgdXNpbmcgaW1hZ2UgcHVs" + - "bCBzZWNyZXRzLgoKIyMjIFN0ZXAgMTogQ29uZmlndXJlIGVudmlyb25tZW50IGZvciBOR0MKCmBg" + - "YHlhbWwKIyBlbnZpcm9ubWVudHMvPGVudj4ueWFtbApnbG9iYWw6CiAgaGVsbToKICAgIHNvdXJj" + - "ZXM6CiAgICAgIHJlZ2lzdHJ5OiBudmNyLmlvCiAgICAgIHJlcG9zaXRvcnk6IG52aWRpYS9udmNm" + - "CiAgaW1hZ2U6CiAgICByZWdpc3RyeTogbnZjci5pbwogICAgcmVwb3NpdG9yeTogbnZpZGlhL252" + - "Y2YKYGBgCgojIyMgU3RlcCAyOiBBdXRoZW50aWNhdGUgbG9jYWxseSAoZm9yIGhlbG1maWxlIGNo" + - "YXJ0IHB1bGxzKQoKYGBgYmFzaApkb2NrZXIgbG9naW4gbnZjci5pbyAtdSAnJG9hdXRodG9rZW4n" + - "IC1wICIkTkdDX0FQSV9LRVkiCmhlbG0gcmVnaXN0cnkgbG9naW4gbnZjci5pbyAtdSAnJG9hdXRo" + - "dG9rZW4nIC1wICIkTkdDX0FQSV9LRVkiCmBgYAoKIyMjIFN0ZXAgMzogQ3JlYXRlIG5hbWVzcGFj" + - "ZXMgYW5kIHB1bGwgc2VjcmV0cwoKYGBgYmFzaApleHBvcnQgTkdDX0FQSV9LRVk9Ijx5b3VyLW5n" + - "Yy1hcGkta2V5PiIKCmZvciBucyBpbiBjYXNzYW5kcmEtc3lzdGVtIG5hdHMtc3lzdGVtIG52Y2Yg" + - "YXBpLWtleXMgZXNzIHNpcyB2YXVsdC1zeXN0ZW0gY2VydC1tYW5hZ2VyOyBkbwogIGt1YmVjdGwg" + - "LS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRleHQ+IGNyZWF0ZSBuYW1lc3BhY2UgIiRucyIg" + - "XAogICAgLS1kcnktcnVuPWNsaWVudCAtbyB5YW1sIHwga3ViZWN0bCAtLWNvbnRleHQgPGNvbnRy" + - "b2wtcGxhbmUtY29udGV4dD4gYXBwbHkgLWYgLQpkb25lCgpmb3IgbnMgaW4gY2Fzc2FuZHJhLXN5" + - "c3RlbSBuYXRzLXN5c3RlbSBudmNmIGFwaS1rZXlzIGVzcyBzaXMgdmF1bHQtc3lzdGVtIGNlcnQt" + - "bWFuYWdlcjsgZG8KICBrdWJlY3RsIC0tY29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBj" + - "cmVhdGUgc2VjcmV0IGRvY2tlci1yZWdpc3RyeSBudmNyLWNyZWRzIFwKICAgIC0tZG9ja2VyLXNl" + - "cnZlcj1udmNyLmlvIFwKICAgIC0tZG9ja2VyLXVzZXJuYW1lPSckb2F1dGh0b2tlbicgXAogICAg" + - "LS1kb2NrZXItcGFzc3dvcmQ9IiROR0NfQVBJX0tFWSIgXAogICAgLS1uYW1lc3BhY2U9IiRucyIg" + - "XAogICAgLS1kcnktcnVuPWNsaWVudCAtbyB5YW1sIHwga3ViZWN0bCAtLWNvbnRleHQgPGNvbnRy" + - "b2wtcGxhbmUtY29udGV4dD4gYXBwbHkgLWYgLQpkb25lCmBgYAoKIyMjIFN0ZXAgNDogQWRkIGlt" + - "YWdlUHVsbFNlY3JldHMgdG8gaGVsbWZpbGUgcmVsZWFzZXMKCkFkZCB0aGUgY2hhcnQtc3BlY2lm" + - "aWMgYGltYWdlUHVsbFNlY3JldHNgIGtleSB0byBlYWNoIHJlbGVhc2UuIEV4YW1wbGUgZm9yIGNh" + - "c3NhbmRyYSBpbiBgaGVsbWZpbGUuZC8wMS1kZXBlbmRlbmNpZXMueWFtbC5nb3RtcGxgOgoKYGBg" + - "eWFtbAotIG5hbWU6IGNhc3NhbmRyYQogIHZlcnNpb246IDAuOC4wCiAgY29uZGl0aW9uOiBjYXNz" + - "YW5kcmEuZW5hYmxlZAogIG5hbWVzcGFjZTogY2Fzc2FuZHJhLXN5c3RlbQogIDw8OiAqZGVwZW5k" + - "ZW5jeQogIHZhbHVlczoKICAgIC0gLi4vZ2xvYmFsLnlhbWwuZ290bXBsCiAgICAtIC4uLzxwcml2" + - "YXRlLXZhbHVlcz4ve3sgcmVxdWlyZWRFbnYgIkhFTE1GSUxFX0VOViIgfX0tc2VjcmV0cy55YW1s" + - "CiAgICAtIGNhc3NhbmRyYToKICAgICAgICBnbG9iYWw6CiAgICAgICAgICBpbWFnZVB1bGxTZWNy" + - "ZXRzOgogICAgICAgICAgICAtIG52Y3ItY3JlZHMKYGBgCgpTZWUgW3JlZmVyZW5jZXMvcHVsbC1z" + - "ZWNyZXRzLm1kXShyZWZlcmVuY2VzL3B1bGwtc2VjcmV0cy5tZCkgZm9yIHRoZSBrZXkgZm9yIGV2" + - "ZXJ5IGNoYXJ0LgoKVGhlc2UgYXJlIGNvbnRyb2wtcGxhbmUgbmFtZXNwYWNlcy4gRm9yIGEgc2Vw" + - "YXJhdGUgY29tcHV0ZSBjbHVzdGVyLCBjcmVhdGUgdGhlCnNlY3JldCBvbmx5IGluIGBudmNhLW9w" + - "ZXJhdG9yYDsgdGhlIGNoYXJ0IGFuZCBvcGVyYXRvciBtaXJyb3IgaXQgdG8KYG52Y2Etc3lzdGVt" + - "YC4gU2VlIFtTcGxpdCBDb21wdXRlLVBsYW5lIEluc3RhbGxhdGlvbl0ocmVmZXJlbmNlcy9jb21w" + - "dXRlLXBsYW5lLWluc3RhbGxhdGlvbi5tZCNwdWxsLXNlY3JldHMpLgoKIyMjIFN0ZXAgNTogRGVw" + - "bG95CgpgYGBiYXNoCkhFTE1GSUxFX0VOVj08ZW52PiBoZWxtZmlsZSAtLWt1YmUtY29udGV4dCA8" + - "Y29udHJvbC1wbGFuZS1jb250ZXh0PiBzeW5jCmBgYAoKIyMjIFN0ZXAgNjogUGF0Y2ggU2Vydmlj" + - "ZUFjY291bnRzIGZvciBjaGFydHMgd2l0aG91dCBuYXRpdmUgc3VwcG9ydAoKQWZ0ZXIgUGhhc2Ug" + - "MSAoZGVwZW5kZW5jaWVzKSBjb21wbGV0ZXMsIE9wZW5CYW8gcG9kcyB3aWxsIGJlIGluIGBJbWFn" + - "ZVB1bGxCYWNrT2ZmYC4gUGF0Y2ggYW5kIHJlc3RhcnQ6CgpgYGBiYXNoCmZvciBucyBpbiB2YXVs" + - "dC1zeXN0ZW0gbnZjZiBlc3M7IGRvCiAgZm9yIHNhIGluICQoa3ViZWN0bCAtLWNvbnRleHQgPGNv" + - "bnRyb2wtcGxhbmUtY29udGV4dD4gZ2V0IHNhIC1uICIkbnMiIFwKICAgIC0tbm8taGVhZGVycyAt" + - "byBjdXN0b20tY29sdW1ucz0iOm1ldGFkYXRhLm5hbWUiKTsgZG8KICAgIGt1YmVjdGwgLS1jb250" + - "ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRleHQ+IHBhdGNoIHNlcnZpY2VhY2NvdW50IC1uICIkbnMi" + - "ICIkc2EiIFwKICAgICAgLXAgJ3siaW1hZ2VQdWxsU2VjcmV0cyI6IFt7Im5hbWUiOiAibnZjci1j" + - "cmVkcyJ9XX0nCiAgZG9uZQpkb25lCmt1YmVjdGwgLS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNv" + - "bnRleHQ+IGRlbGV0ZSBwb2RzIC1uIHZhdWx0LXN5c3RlbSAtLWFsbApgYGAKClZlcmlmeToKCmBg" + - "YGJhc2gKa3ViZWN0bCAtLWNvbnRleHQgPGNvbnRyb2wtcGxhbmUtY29udGV4dD4gZ2V0IGV2ZW50" + - "cyAtbiB2YXVsdC1zeXN0ZW0gXAogIC0tc29ydC1ieT0nLmxhc3RUaW1lc3RhbXAnIHwgZ3JlcCAt" + - "aSBwdWxsCiMgU2hvdWxkIHNob3cgIlN1Y2Nlc3NmdWxseSBwdWxsZWQgaW1hZ2UiIGZyb20gbnZj" + - "ci5pbwpgYGAKCi0tLQoKIyMgRXhhbXBsZSAzOiBGdWxsIFRlYXJkb3duIGFuZCBSZWluc3RhbGwK" + - "CldoZW4gYSBkZXBsb3ltZW50IGlzIGJyb2tlbiBhbmQgeW91IG5lZWQgYSBjbGVhbiBzbGF0ZS4K" + - "CiMjIyBTdGVwIDE6IERlc3Ryb3kgdGhlIGNvbXB1dGUtcGxhbmUgc3RhY2sKCmBgYGJhc2gKbWFr" + - "ZSAtQyBkZXBsb3kvc3RhY2tzL252Y2YtY29tcHV0ZS1wbGFuZSBkZXN0cm95IFwKICBDTFVTVEVS" + - "X05BTUU9PGNsdXN0ZXItbmFtZT4gXAogIEhFTE1GSUxFX0VOVj08ZW52PiBcCiAgS1VCRUNPTkZJ" + - "R19GSUxFPTxjb21wdXRlLXBsYW5lLWt1YmVjb25maWc+CmBgYAoKSWYgY29tcHV0ZSBjbGVhbnVw" + - "IGlzIHN0dWNrIG9uIGZpbmFsaXplcnMsIHVzZSB0aGUgY29tcHV0ZS1jb250ZXh0IHByb2NlZHVy" + - "ZSBpbgpbZGVidWdnaW5nLm1kXShyZWZlcmVuY2VzL2RlYnVnZ2luZy5tZCNmYWlsdXJlLW52Y2Et" + - "Y2xlYW51cC1zdHVjay1maW5hbGl6ZXJzKS4KCiMjIyBTdGVwIDI6IERlcmVnaXN0ZXIgdGhlIGNv" + - "bXB1dGUgY2x1c3RlcgoKUmVhZCBgY2x1c3RlcklEYCBhbmQgYG5jYUlEYCBmcm9tCmBkZXBsb3kv" + - "c3RhY2tzL252Y2YtY29tcHV0ZS1wbGFuZS9yZWdpc3RyYXRpb24vPGNsdXN0ZXItbmFtZT4tcmVn" + - "aXN0ZXItdmFsdWVzLnlhbWxgLgpTaG93IHRoZSBJRCBhbmQgZ2V0IGNvbmZpcm1hdGlvbiBiZWZv" + - "cmUgZGVsZXRpbmcgdGhlIElDTVMgcm93OgoKYGBgYmFzaAo8bnZjZi1jbGk+IC0tY29uZmlnIDxj" + - "b25maWc+IGNsdXN0ZXIgZGVsZXRlIFwKICAtLWNsdXN0ZXItaWQgPGNsdXN0ZXItaWQtZnJvbS1y" + - "ZWdpc3RyYXRpb24tdmFsdWVzPiBcCiAgLS1uY2EtaWQgPG5jYS1pZD4gXAogIC0taWdub3JlLW1p" + - "c3NpbmcKYGBgCgpSZXBlYXQgc3RlcHMgMSBhbmQgMiBmb3IgZXZlcnkgY29tcHV0ZSBjbHVzdGVy" + - "LgoKIyMjIFN0ZXAgMzogRGVzdHJveSB0aGUgY29udHJvbC1wbGFuZSBzdGFjawoKUHJlc2VydmUg" + - "dGhlIGBjZXJ0LW1hbmFnZXJgIG5hbWVzcGFjZSBieSBkZWZhdWx0LiBOYW1lc3BhY2UgcHJlc2Vy" + - "dmF0aW9uIGRvZXMKbm90IHByZXNlcnZlIHRoZSBIZWxtIHJlbGVhc2UuIEJlZm9yZSBydW5uaW5n" + - "IGRlc3Ryb3ksIGlkZW50aWZ5IHdoZXRoZXIKY2VydC1tYW5hZ2VyIGlzIGV4dGVybmFsLiBGb3Ig" + - "YW4gZXh0ZXJuYWwgaW5zdGFsbGF0aW9uLCByZXF1aXJlIGVmZmVjdGl2ZQpgY2VydE1hbmFnZXIu" + - "ZW5hYmxlZDogZmFsc2VgIGFuZCBhYm9ydCBpZiBpdCBpcyB0cnVlLiBGb3IgYW4gaW50ZW5kZWQK" + - "c3RhY2stbWFuYWdlZCByZWxlYXNlIHdpdGggZWZmZWN0aXZlIGBjZXJ0TWFuYWdlci5lbmFibGVk" + - "OiB0cnVlYCwgdmVyaWZ5Cm1hdGNoaW5nIHN0YWNrIEhlbG0gcmVsZWFzZSBtZXRhZGF0YSBhbmQg" + - "YWJvcnQgb24gbWlzc2luZyBvciBtaXNtYXRjaGVkCmV2aWRlbmNlLiBPbmx5IHBsYW4gbmFtZXNw" + - "YWNlIHJlbW92YWwgYWZ0ZXIgdmVyaWZ5aW5nIG5hbWVzcGFjZSBwcm92ZW5hbmNlIGFuZApnZXR0" + - "aW5nIGV4cGxpY2l0IGNvbmZpcm1hdGlvbjsgb3RoZXJ3aXNlIGRvIG5vdCBkZWxldGUgaXQuCgpg" + - "YGBiYXNoCktVQkVDT05GSUc9PGNvbnRyb2wtcGxhbmUta3ViZWNvbmZpZz4gXAptYWtlIC1DIGRl" + - "cGxveS9zdGFja3Mvc2VsZi1tYW5hZ2VkIGRlc3Ryb3kgXAogIEhFTE1GSUxFX0VOVj08ZW52PiBc" + - "CiAgS1VCRUNPTkZJR19GSUxFPTxjb250cm9sLXBsYW5lLWt1YmVjb25maWc+CmBgYAoKUGFzcyBi" + - "b3RoIGt1YmVjb25maWcgZm9ybXMgYmVjYXVzZSBjb250cm9sLXBsYW5lIG5hbWVzcGFjZSBjbGVh" + - "bnVwIHVzZXMKYW1iaWVudCBga3ViZWN0bGAuCgojIyMgU3RlcCA0OiBWZXJpZnkgY2xlYW4KCmBg" + - "YGJhc2gKa3ViZWN0bCAtLWNvbnRleHQgPGNvbXB1dGUtcGxhbmUtY29udGV4dD4gZ2V0IG5zIHwg" + - "XAogIGdyZXAgLUUgJyhudmNhfG52Y2YtYmFja2VuZHxncm92ZXxkeW5hbW8pJwprdWJlY3RsIC0t" + - "Y29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBnZXQgbnMgfCBcCiAgZ3JlcCAtRSAnKGNh" + - "c3NhbmRyYXxuYXRzfHZhdWx0fG52Y2Z8YXBpLWtleXN8ZXNzfHNpcyknCiMgQm90aCBjb21tYW5k" + - "cyBzaG91bGQgcmV0dXJuIGVtcHR5LgpgYGAKCiMjIyBTdGVwIDU6IFJlaW5zdGFsbCBpbiBzcGxp" + - "dCBvcmRlcgoKRm9sbG93IFtDbGVhbiBJbnN0YWxsYXRpb25dKFNLSUxMLm1kI2NsZWFuLWluc3Rh" + - "bGxhdGlvbiksIHRoZW4gcmV0dXJuIHRvIHRoZQpzYW1lIGhhbmRvZmYgaW4gW1NwbGl0IENvbXB1" + - "dGUtUGxhbmUgSW5zdGFsbGF0aW9uXShyZWZlcmVuY2VzL2NvbXB1dGUtcGxhbmUtaW5zdGFsbGF0" + - "aW9uLm1kKS4KCi0tLQoKIyMgRXhhbXBsZSA0OiBSZWNvdmVyIGZyb20gYSBHYXRld2F5IEVuZHBv" + - "aW50IENoYW5nZQoKVGhlIHNlcGFyYXRlbHkgcHJvdmlzaW9uZWQgR2F0ZXdheSBvciBpdHMgbG9h" + - "ZCBiYWxhbmNlciB3YXMgcmVjcmVhdGVkIGFuZCBnb3QgYSBuZXcgZW5kcG9pbnQuCgojIyMgU3Rl" + - "cCAxOiBHZXQgdGhlIG5ldyBlbmRwb2ludAoKYGBgYmFzaApHQVRFV0FZX0FERFI9JChrdWJlY3Rs" + - "IC0tY29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBnZXQgZ2F0ZXdheSBcCiAgbnZjZi1n" + - "YXRld2F5IC1uIGVudm95LWdhdGV3YXkgXAogIC1vIGpzb25wYXRoPSd7LnN0YXR1cy5hZGRyZXNz" + - "ZXNbMF0udmFsdWV9JykKdGVzdCAtbiAiJEdBVEVXQVlfQUREUiIKYGBgCgojIyMgU3RlcCAyOiBV" + - "cGRhdGUgRE5TIGFuZCBkaXJlY3QgYWRkcmVzcyBmaWVsZHMKCktlZXAgYGdsb2JhbC5kb21haW5g" + - "LCByb3V0ZSBob3N0bmFtZXMsIGFuZCBDTEkgSG9zdCBmaWVsZHMgdW5jaGFuZ2VkLiBQb2ludCB0" + - "aGUKRE5TIHJlY29yZHMgZm9yIHJlbmRlcmVkIHJvdXRlIGhvc3RuYW1lcywgc3VjaCBhcyBgYXBp" + - "Ljxkb21haW4+YCBhbmQKYCouaW52b2NhdGlvbi48ZG9tYWluPmAsIHRvIGBHQVRFV0FZX0FERFJg" + - "LiBGb3IgYSB0ZW1wb3JhcnkgZW52aXJvbm1lbnQgd2l0aG91dApETlMsIGtlZXAgaXRzIHJlc2Vy" + - "dmVkIHJvdXRlIHN1ZmZpeCBhbmQgY29ubmVjdCB0byBgR0FURVdBWV9BRERSYCB3aXRoIHRoZQpt" + - "YXRjaGluZyBgSG9zdGAgaGVhZGVyLgoKRm9yIGEgc3BsaXQgZGVwbG95bWVudCBjb25maWd1cmVk" + - "IHdpdGggZGlyZWN0IEdhdGV3YXkgYWRkcmVzc2VzLCByZXBsYWNlIG9ubHkKdGhlIGFkZHJlc3Mt" + - "YmVhcmluZyB2YWx1ZXM6IGNvbnRyb2wtcGxhbmUgYG52Y2ZOYXRzU2VydmljZVVSTGAsIGNvbXB1" + - "dGUtcGxhbmUKSUNNUywgUmVWYWwsIGFuZCBOQVRTIFVSTHMsIGFuZCBDTEkgVVJMIGZpZWxkcy4g" + - "S2VlcCB0aGVpciBkb21haW4gYW5kIEhvc3QKb3ZlcnJpZGVzIHVuY2hhbmdlZC4gUmVmcmVzaCBy" + - "ZWdpc3RyYXRpb24gYW5kIGluc3RhbGxhdGlvbiB0aHJvdWdoIHRoZSBzYW1lCmhhbmRvZmYgdXNl" + - "ZCBvcmlnaW5hbGx5LiBTZWUKW1NwbGl0IENvbXB1dGUtUGxhbmUgSW5zdGFsbGF0aW9uXShyZWZl" + - "cmVuY2VzL2NvbXB1dGUtcGxhbmUtaW5zdGFsbGF0aW9uLm1kKQpmb3IgdGhlIGZpZWxkcyBhbmQg" + - "Y29tcGxldGUgY29tbWFuZHMuCgojIyMgU3RlcCAzOiBWZXJpZnkgYm90aCBjb250ZXh0cwoKYGBg" + - "YmFzaApkaWcgK3Nob3J0ICJhcGkuPGRvbWFpbj4iCmN1cmwgLUggIkhvc3Q6IGFwaS48ZG9tYWlu" + - "PiIgImh0dHA6Ly8kR0FURVdBWV9BRERSL2hlYWx0aCIKa3ViZWN0bCAtLWNvbnRleHQgPGNvbnRy" + - "b2wtcGxhbmUtY29udGV4dD4gZ2V0IGdhdGV3YXkgbnZjZi1nYXRld2F5IFwKICAtbiBlbnZveS1n" + - "YXRld2F5IC1vIHdpZGUKa3ViZWN0bCAtLWNvbnRleHQgPGNvbnRyb2wtcGxhbmUtY29udGV4dD4g" + - "Z2V0IGh0dHByb3V0ZXMgLUEKa3ViZWN0bCAtLWNvbnRleHQgPGNvbnRyb2wtcGxhbmUtY29udGV4" + - "dD4gZ2V0IHRjcHJvdXRlcyAtQQprdWJlY3RsIC0tY29udGV4dCA8Y29tcHV0ZS1wbGFuZS1jb250" + - "ZXh0PiByb2xsb3V0IHN0YXR1cyBcCiAgZGVwbG95bWVudC9udmNhLW9wZXJhdG9yIC1uIG52Y2Et" + - "b3BlcmF0b3IgLS10aW1lb3V0PTEwbQprdWJlY3RsIC0tY29udGV4dCA8Y29tcHV0ZS1wbGFuZS1j" + - "b250ZXh0PiB3YWl0IFwKICBudmNmYmFja2VuZC88Y29tcHV0ZS1wbGFuZS1jbHVzdGVyLW5hbWU+" + - "IC1uIG52Y2Etb3BlcmF0b3IgXAogIC0tZm9yPWpzb25wYXRoPSd7LnN0YXR1cy5hZ2VudFN0YXR1" + - "c30nPWhlYWx0aHkgLS10aW1lb3V0PTEwbQpgYGAKCi0tLQoKIyMgRXhhbXBsZSA1OiBEZXBsb3kg" + - "T25seSBEZXBlbmRlbmNpZXMKClVzZWZ1bCBmb3IgdGVzdGluZyBvciB3aGVuIGl0ZXJhdGluZyBv" + - "biBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24uCgpgYGBiYXNoCiMgRGVwbG95IGp1c3QgTkFUUywgQ2Fz" + - "c2FuZHJhLCBPcGVuQmFvCkhFTE1GSUxFX0VOVj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIHJl" + - "bGVhc2UtZ3JvdXA9ZGVwZW5kZW5jaWVzIHN5bmMKCiMgQ2hlY2sgc3RhdHVzCmt1YmVjdGwgZ2V0" + - "IHBvZHMgLW4gbmF0cy1zeXN0ZW0Ka3ViZWN0bCBnZXQgcG9kcyAtbiBjYXNzYW5kcmEtc3lzdGVt" + - "Cmt1YmVjdGwgZ2V0IHBvZHMgLW4gdmF1bHQtc3lzdGVtCgojIERlcGxveSBqdXN0IG9uZSBzcGVj" + - "aWZpYyByZWxlYXNlCkhFTE1GSUxFX0VOVj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9" + - "Y2Fzc2FuZHJhIHN5bmMKYGBgCgojIyMgU2VsZWN0b3IgcmVmZXJlbmNlCgp8IFNlbGVjdG9yIHwg" + - "UmVsZWFzZXMgfAp8LS0tLS0tLS0tLXwtLS0tLS0tLS0tfAp8IGByZWxlYXNlLWdyb3VwPWRlcGVu" + - "ZGVuY2llc2AgfCBuYXRzLCBjYXNzYW5kcmEsIG9wZW5iYW8tc2VydmVyIHwKfCBgcmVsZWFzZS1n" + - "cm91cD1zZXJ2aWNlc2AgfCBhcGkta2V5cywgc2lzLCBhcGksIGludm9jYXRpb24tc2VydmljZSwg" + - "Z3JwYy1wcm94eSwgZXNzLWFwaSwgbm90YXJ5LXNlcnZpY2UsIHJldmFsLCBvcHRpb25hbCBsbG0t" + - "cmVxdWVzdC1yb3V0ZXIgYW5kIGxsbS1hcGktZ2F0ZXdheSB3aGVuIGBsbG0uZW5hYmxlZD10cnVl" + - "YCwgb3B0aW9uYWwgdmFuaXR5LWdhdGV3YXkgb25seSBpbiBzdGFjayBwYWNrYWdlcyB0aGF0IGlu" + - "Y2x1ZGUgdGhlIGFkZG9uIGFuZCBoYXZlIGBhZGRvbnMudmFuaXR5R2F0ZXdheS5lbmFibGVkPXRy" + - "dWVgLCBvcHRpb25hbCBudmNmLXVpIG9ubHkgaW4gc3RhY2sgcGFja2FnZXMgdGhhdCBpbmNsdWRl" + - "IHRoZSBhZGRvbiBhbmQgaGF2ZSBgYWRkb25zLm52Y2ZVaS5lbmFibGVkPXRydWVgIHwKfCBgbmFt" + - "ZT1sbG0tcmVxdWVzdC1yb3V0ZXJgIHwgRGVwbG95IGp1c3QgdGhlIExMTSByZXF1ZXN0IHJvdXRl" + - "ciB3aGVuIGBsbG0uZW5hYmxlZD10cnVlYCB8CnwgYG5hbWU9bGxtLWFwaS1nYXRld2F5YCB8IERl" + - "cGxveSBqdXN0IHRoZSBMTE0gQVBJIGdhdGV3YXkgd2hlbiBgbGxtLmVuYWJsZWQ9dHJ1ZWAgfAp8" + - "IGBuYW1lPXZhbml0eS1nYXRld2F5YCB8IERlcGxveSBqdXN0IFZhbml0eSBHYXRld2F5IG9ubHkg" + - "d2hlbiB0aGUgc3RhY2sgcGFja2FnZSBpbmNsdWRlcyB0aGF0IHJlbGVhc2UgYW5kIGBhZGRvbnMu" + - "dmFuaXR5R2F0ZXdheS5lbmFibGVkPXRydWVgIHwKfCBgbmFtZT1udmNmLXVpYCB8IERlcGxveSBO" + - "VkNGIFVJIG9ubHkgd2hlbiB0aGUgc3RhY2sgcGFja2FnZSBpbmNsdWRlcyB0aGF0IHJlbGVhc2Ug" + - "YW5kIGBhZGRvbnMubnZjZlVpLmVuYWJsZWQ9dHJ1ZWAgfAp8IGByZWxlYXNlLWdyb3VwPWluZ3Jl" + - "c3NgIHwgaW5ncmVzcyAoZ2F0ZXdheSByb3V0ZXMpIHwKfCBgbmFtZT08cmVsZWFzZT5gIHwgQW55" + - "IGluZGl2aWR1YWwgcmVsZWFzZSBieSBuYW1lIHwKCk5vdGU6IGBhZG1pbi1pc3N1ZXItcHJveHlg" + - "IGRvZXMgbm90IGhhdmUgYSByZWxlYXNlLWdyb3VwIGxhYmVsLiBUYXJnZXQgaXQgd2l0aCBgLS1z" + - "ZWxlY3RvciBuYW1lPWFkbWluLWlzc3Vlci1wcm94eWAuClBLBwgCUk5AfygAAH8oAABQSwMEFAAI" + - "AAAAAAAhAAAAAAAAAAAAAAAAAEwACQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlv" + - "bi9yZWZlcmVuY2VzL2NvbXB1dGUtcGxhbmUtaW5zdGFsbGF0aW9uLm1kVVQFAAEAps4SIyBTcGxp" + - "dCBDb21wdXRlLVBsYW5lIEluc3RhbGxhdGlvbgoKVGhlIGNvbnRyb2wgcGxhbmUgYW5kIGNvbXB1" + - "dGUgcGxhbmUgYXJlIHNlcGFyYXRlIHN0YWNrcy4gSW5zdGFsbCB0aGUgY29udHJvbApwbGFuZSBm" + - "aXJzdCwgdGhlbiByZWdpc3RlciBhbmQgaW5zdGFsbCBlYWNoIGNvbXB1dGUgY2x1c3Rlci4gQ2hv" + - "b3NlIG9uZSBoYW5kb2ZmCmJlbG93IGFuZCB1c2UgaXQgZm9yIHRoZSBmdWxsIGxpZmVjeWNsZS4g" + - "RG8gbm90IGNvbWJpbmUgYSBDTEktZ2VuZXJhdGVkIHByb2ZpbGUKd2l0aCB0aGUgSGVsbWZpbGUg" + - "dmFsdWVzIGZsb3cuCgojIyBDaG9vc2UgYSBIYW5kb2ZmCgp8IEZsb3cgfCBTb3VyY2Ugb2YgY29u" + - "dHJvbC1wbGFuZSBlbmRwb2ludHMgfCBSZWdpc3RyYXRpb24gYXJ0aWZhY3QgfAp8LS0tLS0tfC0t" + - "LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t" + - "fAp8IEhlbG1maWxlIHZhbHVlcyB8IFNlcGFyYXRlIGNvbnRyb2wtcGxhbmUgYW5kIGNvbXB1dGUt" + - "cGxhbmUgZW52aXJvbm1lbnQgZmlsZXMgfCBgZGVwbG95L3N0YWNrcy9udmNmLWNvbXB1dGUtcGxh" + - "bmUvcmVnaXN0cmF0aW9uLzxjbHVzdGVyPi1yZWdpc3Rlci12YWx1ZXMueWFtbGAgfAp8IENMSSBw" + - "cm9maWxlIHwgQ0xJLWdlbmVyYXRlZCBgZGVwbG95L3N0YWNrcy9zZWxmLW1hbmFnZWQvb3V0L2Nv" + - "bnRyb2wtcGxhbmUtcHJvZmlsZS55YW1sYCB8IENMSS1nZW5lcmF0ZWQgYGRlcGxveS9zdGFja3Mv" + - "bnZjZi1jb21wdXRlLXBsYW5lL291dC88Y2x1c3Rlcj4tcmVnaXN0ZXItdmFsdWVzLnlhbWxgIHwK" + - "ClRoZSBDTEkgcHJvZmlsZSBpcyBtYW5kYXRvcnkgZm9yIHRoZSBDTEkgZmxvdyBhbmQgbXVzdCBu" + - "b3QgYmUgaGFuZC1hdXRob3JlZC4KVGhlIEhlbG1maWxlIGZsb3cgZG9lcyBub3QgY29uc3VtZSBh" + - "IGNvbnRyb2wtcGxhbmUgcHJvZmlsZS4KCkNvbW1hbmRzIGJlbG93IHVzZSBtb25vcmVwbyBwYXRo" + - "cyBmcm9tIHRoZSByZXBvc2l0b3J5IHJvb3QuIE9wZXJhdG9ycyB1c2luZwpleHRyYWN0ZWQgcGFj" + - "a2FnZXMgbmVlZCBtYXRjaGluZy12ZXJzaW9uIGBudmNmLXNlbGYtbWFuYWdlZC1zdGFja2AgYW5k" + - "CmBudmNmLWNvbXB1dGUtcGxhbmUtc3RhY2tgIGJ1bmRsZXMuIFN1YnN0aXR1dGUgdGhvc2UgYnVu" + - "ZGxlIHJvb3RzIGZvcgpgZGVwbG95L3N0YWNrcy9zZWxmLW1hbmFnZWRgIGFuZCBgZGVwbG95L3N0" + - "YWNrcy9udmNmLWNvbXB1dGUtcGxhbmVgLgoKIyMgSGVsbWZpbGUgVmFsdWVzIEZsb3cKCkNyZWF0" + - "ZSBib3RoIGVudmlyb25tZW50IGZpbGVzIGJlZm9yZSBpbnN0YWxsYXRpb246CgotIGBkZXBsb3kv" + - "c3RhY2tzL3NlbGYtbWFuYWdlZC9lbnZpcm9ubWVudHMvPGVudj4ueWFtbGAgZm9yIGNvbnRyb2wt" + - "cGxhbmUKICByZWdpc3RyeSwgZG9tYWluLCBHYXRld2F5LCByb3V0ZXMsIGFuZCBzZXJ2aWNlIHNl" + - "dHRpbmdzLgotIGBkZXBsb3kvc3RhY2tzL252Y2YtY29tcHV0ZS1wbGFuZS9lbnZpcm9ubWVudHMv" + - "PGVudj4ueWFtbGAgZm9yIGNvbXB1dGUtcGxhbmUKICByZWdpc3RyeSwgcHVsbCBzZWNyZXRzLCBh" + - "bmQgY29tcHV0ZS1yZWFjaGFibGUgSUNNUywgUmVWYWwsIGFuZCBOQVRTIHZhbHVlcy4KCkZvciBF" + - "S1MsIHVzZSB0aGUgY2Fub25pY2FsCltDU1AgRW5kLXRvLUVuZCBFeGFtcGxlXShodHRwczovL2Rv" + - "Y3MubnZpZGlhLmNvbS9udmNmL3YwLjYuMC1yYy9jc3AtZW5kLXRvLWVuZC1leGFtcGxlKS4KVGhl" + - "IGNvbnRyb2wtcGxhbmUgZW52aXJvbm1lbnQga2VlcHMgdGhlIEVudm95IEdhdGV3YXkgY29udHJv" + - "bGxlciBpbgpgZW52b3ktZ2F0ZXdheS1zeXN0ZW1gLCBhdHRhY2hlcyByb3V0ZXMgdG8gYEdhdGV3" + - "YXkvbnZjZi1nYXRld2F5YCBpbgpgZW52b3ktZ2F0ZXdheWAsIGFuZCBlbmFibGVzIHRoZSBOQVRT" + - "IHJvdXRlLiBUaGUgY29tcHV0ZS1wbGFuZSBlbnZpcm9ubWVudCB1c2VzCnRoZSBleHRlcm5hbCBh" + - "ZGRyZXNzIHBsdXMgdGhlIHNlcnZpY2UgaG9zdCBvdmVycmlkZXMuIEhlcmUsCmA8Z2F0ZXdheS1h" + - "ZGRyZXNzPmAgaXMgdGhlIE5MQiBhZGRyZXNzIGFuZCBgPGdhdGV3YXktZG9tYWluPmAgaXMgdGhl" + - "IEROUyBiYXNlCndob3NlIHNlcnZpY2Ugc3ViZG9tYWlucyByZXNvbHZlIHRvIHRoYXQgTkxCOgoK" + - "YGBgeWFtbAojIGRlcGxveS9zdGFja3Mvc2VsZi1tYW5hZ2VkL2Vudmlyb25tZW50cy88ZW52Pi55" + - "YW1sCmdsb2JhbDoKICBkb21haW46ICI8Z2F0ZXdheS1kb21haW4+IgogIHdvcmtlckVuZHBvaW50" + - "czoKICAgIG52Y2ZTZXJ2aWNlVVJMOiAiaHR0cDovL2FwaS48Z2F0ZXdheS1kb21haW4+IgogICAg" + - "bnZjZkdycGNTZXJ2aWNlVVJMOiAiaHR0cDovL3dvcmtlci1hcGkuPGdhdGV3YXktZG9tYWluPiIK" + - "ICAgIG52Y2ZOYXRzU2VydmljZVVSTDogIm5hdHM6Ly88Z2F0ZXdheS1hZGRyZXNzPjo0MjIyIgog" + - "ICAgbnZjdFNlcnZpY2VVUkw6ICJodHRwOi8vdGFza3MuPGdhdGV3YXktZG9tYWluPiIKICAgIG52" + - "Y3RHcnBjU2VydmljZVVSTDogImh0dHA6Ly93b3JrZXItdGFza3MuPGdhdGV3YXktZG9tYWluPiIK" + - "ICAgIGludm9jYXRpb25TZXJ2aWNlVVJMOiAiaHR0cDovL2ludm9jYXRpb24uPGdhdGV3YXktZG9t" + - "YWluPiIKCmdycGNwcm94eToKICBudmNmR3JwY1NlcnZpY2VVUkw6ICJodHRwOi8vYXBpLm52Y2Yu" + - "c3ZjLmNsdXN0ZXIubG9jYWw6OTA5MCIKCmluZ3Jlc3M6CiAgZ2F0ZXdheUFwaToKICAgIGNvbnRy" + - "b2xsZXJOYW1lc3BhY2U6IGVudm95LWdhdGV3YXktc3lzdGVtCiAgICBnYXRld2F5czoKICAgICAg" + - "c2hhcmVkOiB7bmFtZTogbnZjZi1nYXRld2F5LCBuYW1lc3BhY2U6IGVudm95LWdhdGV3YXl9CiAg" + - "ICAgIGdycGM6IHtuYW1lOiBudmNmLWdhdGV3YXksIG5hbWVzcGFjZTogZW52b3ktZ2F0ZXdheX0K" + - "ICAgICAgbmF0czoKICAgICAgICBuYW1lOiBudmNmLWdhdGV3YXkKICAgICAgICBuYW1lc3BhY2U6" + - "IGVudm95LWdhdGV3YXkKICAgICAgICBsaXN0ZW5lck5hbWU6IG5hdHMKICAgIHJvdXRlczoKICAg" + - "ICAgbnZjZkFwaToKICAgICAgICBncnBjOgogICAgICAgICAgZW5hYmxlZDogdHJ1ZQogICAgICAg" + - "ICAgaG9zdG5hbWVzOiBbIndvcmtlci1hcGkuPGdhdGV3YXktZG9tYWluPiJdCiAgICAgIG52Y3RB" + - "cGk6CiAgICAgICAgZ3JwYzoKICAgICAgICAgIGVuYWJsZWQ6IHRydWUKICAgICAgICAgIGhvc3Ru" + - "YW1lczogWyJ3b3JrZXItdGFza3MuPGdhdGV3YXktZG9tYWluPiJdCiAgICAgIG5hdHM6CiAgICAg" + - "ICAgZW5hYmxlZDogdHJ1ZQoKb3BlbmJhbzoKICBtaWdyYXRpb25zOgogICAgaXNzdWVyRGlzY292" + - "ZXJ5OgogICAgICBlbmFibGVkOiB0cnVlCmBgYAoKYGBgeWFtbAojIGRlcGxveS9zdGFja3MvbnZj" + - "Zi1jb21wdXRlLXBsYW5lL2Vudmlyb25tZW50cy88ZW52Pi55YW1sCmdsb2JhbDoKICBudmNhT3Bl" + - "cmF0b3I6CiAgICBzZWxmTWFuYWdlZDoKICAgICAgaWNtc1NlcnZpY2VVUkw6ICJodHRwOi8vPGdh" + - "dGV3YXktYWRkcmVzcz4iCiAgICAgIGljbXNTZXJ2aWNlSG9zdEhlYWRlck92ZXJyaWRlOiAic2lz" + - "LjxnYXRld2F5LWRvbWFpbj4iCiAgICAgIHJldmFsU2VydmljZVVSTDogImh0dHA6Ly88Z2F0ZXdh" + - "eS1hZGRyZXNzPiIKICAgICAgcmV2YWxTZXJ2aWNlSG9zdEhlYWRlck92ZXJyaWRlOiAicmV2YWwu" + - "PGdhdGV3YXktZG9tYWluPiIKICAgICAgbmF0c1VSTDogIm5hdHM6Ly88Z2F0ZXdheS1hZGRyZXNz" + - "Pjo0MjIyIgogICAgICBuYXRzSG9zdE92ZXJyaWRlOiAibmF0cy48Z2F0ZXdheS1kb21haW4+Igpg" + - "YGAKClByZXZpZXcgYW5kIGluc3RhbGwgdGhlIGNvbnRyb2wgcGxhbmUgYWdhaW5zdCBpdHMgY29u" + - "dGV4dDoKCmBgYGJhc2gKbWFrZSAtQyBkZXBsb3kvc3RhY2tzL3NlbGYtbWFuYWdlZCB0ZW1wbGF0" + - "ZSBcCiAgSEVMTUZJTEVfRU5WPTxlbnY+IFwKICBLVUJFQ09ORklHX0ZJTEU9PGNvbnRyb2wtcGxh" + - "bmUta3ViZWNvbmZpZz4KCm1ha2UgLUMgZGVwbG95L3N0YWNrcy9zZWxmLW1hbmFnZWQgaW5zdGFs" + - "bCBcCiAgSEVMTUZJTEVfRU5WPTxlbnY+IFwKICBLVUJFQ09ORklHX0ZJTEU9PGNvbnRyb2wtcGxh" + - "bmUta3ViZWNvbmZpZz4KYGBgCgpCZWZvcmUgcmVnaXN0ZXJpbmcgdGhyb3VnaCBhIGJhcmUgR2F0" + - "ZXdheSBhZGRyZXNzLCBjcmVhdGUgb3IgdXBkYXRlIHRoZSBDTEkKY29uZmlnIHBhc3NlZCBhcyBg" + - "TlZDRl9DTElfQ09ORklHYDoKCmBgYHlhbWwKYmFzZV9odHRwX3VybDogImh0dHA6Ly88Z2F0ZXdh" + - "eS1hZGRyZXNzPiIKaW52b2tlX3VybDogImh0dHA6Ly88Z2F0ZXdheS1hZGRyZXNzPiIKYmFzZV9n" + - "cnBjX3VybDogIjxnYXRld2F5LWFkZHJlc3M+OjEwMDgxIgphcGlfa2V5c19zZXJ2aWNlX3VybDog" + - "Imh0dHA6Ly88Z2F0ZXdheS1hZGRyZXNzPiIKaWNtc191cmw6ICJodHRwOi8vPGdhdGV3YXktYWRk" + - "cmVzcz4iCmFwaV9ob3N0OiAiYXBpLjxnYXRld2F5LWRvbWFpbj4iCmFwaV9rZXlzX2hvc3Q6ICJh" + - "cGkta2V5cy48Z2F0ZXdheS1kb21haW4+IgppbnZva2VfaG9zdDogImludm9jYXRpb24uPGdhdGV3" + - "YXktZG9tYWluPiIKaWNtc19ob3N0OiAic2lzLjxnYXRld2F5LWRvbWFpbj4iCmBgYAoKSG9zdCBm" + - "aWVsZHMgY29udGFpbiBob3N0bmFtZXMgb25seSwgd2l0aG91dCBhIFVSTCBzY2hlbWUuIGBJQ01T" + - "X1VSTGAgbWFwcyBvbmx5CnRvIHRoZSByZWdpc3RyYXRpb24gY29tbWFuZCdzIGAtLWljbXMtdXJs" + - "YDsgYGljbXNfaG9zdGAgaW4gdGhlIGNvbmZpZyBzdXBwbGllcwp0aGUgR2F0ZXdheSBIb3N0IGhl" + - "YWRlci4gVGhlcmUgaXMgbm8gYC0taWNtcy1ob3N0YCBNYWtlIG9yIENMSSBmbGFnLgoKUmVnaXN0" + - "ZXIgZnJvbSB0aGUgY29tcHV0ZSBjb250ZXh0LCB0aGVuIGluc3RhbGwgdGhlIGNvbXB1dGUgcGxh" + - "bmU6CgpgYGBiYXNoCm1ha2UgLUMgZGVwbG95L3N0YWNrcy9udmNmLWNvbXB1dGUtcGxhbmUgcmVn" + - "aXN0ZXItY2x1c3RlciBcCiAgQ0xVU1RFUl9OQU1FPTxjbHVzdGVyLW5hbWU+IFwKICBOQ0FfSUQ9" + - "PG5jYS1pZD4gXAogIENMVVNURVJfUkVHSU9OPTxyZWdpb24+IFwKICBJQ01TX1VSTD1odHRwOi8v" + - "PGdhdGV3YXktYWRkcmVzcz4gXAogIEtVQkVDT05GSUdfRklMRT08Y29tcHV0ZS1wbGFuZS1rdWJl" + - "Y29uZmlnPiBcCiAgTlZDRl9DTEk9PHBhdGgtdG8tbnZjZi1jbGk+IFwKICBOVkNGX0NMSV9DT05G" + - "SUc9PHBhdGgtdG8tbnZjZi1jbGktY29uZmlnPgoKbWFrZSAtQyBkZXBsb3kvc3RhY2tzL252Y2Yt" + - "Y29tcHV0ZS1wbGFuZSBpbnN0YWxsIFwKICBDTFVTVEVSX05BTUU9PGNsdXN0ZXItbmFtZT4gXAog" + - "IEhFTE1GSUxFX0VOVj08ZW52PiBcCiAgS1VCRUNPTkZJR19GSUxFPTxjb21wdXRlLXBsYW5lLWt1" + - "YmVjb25maWc+CmBgYAoKUmVnaXN0cmF0aW9uIGRpc2NvdmVycyB0aGUgT0lEQyBpc3N1ZXIgYW5k" + - "IEpXS1MgZnJvbSB0aGUgY29tcHV0ZSBrdWJlIGNvbnRleHQuCkluIGEgbXVsdGktY2x1c3RlciBk" + - "ZXBsb3ltZW50LCBgS1VCRUNPTkZJR19GSUxFYCBpcyByZXF1aXJlZCBvbiBib3RoCmNvbXB1dGUt" + - "cGxhbmUgY29tbWFuZHMuIEluIGEgc2FtZS1jbHVzdGVyIGRlcGxveW1lbnQgaXQgbWF5IGJlIG9t" + - "aXR0ZWQgb25seQp3aGVuIHRoZSBhbWJpZW50IGNvbnRleHQgaXMgYWxyZWFkeSB0aGUgdGFyZ2V0" + - "IGNsdXN0ZXIuCgojIyBDTEkgUHJvZmlsZSBGbG93CgpSdW4gdGhlIENMSSBjb250cm9sLXBsYW5l" + - "IGluc3RhbGwgZmlyc3QuIEl0IGNyZWF0ZXMgdGhlIHByb2ZpbGUgY29uc3VtZWQgYnkKY29tcHV0" + - "ZS1wbGFuZSByZWdpc3RyYXRpb246CgpgYGBiYXNoCm52Y2YtY2xpIC0tY29uZmlnIDxjb25maWc+" + - "IHNlbGYtaG9zdGVkIFwKICAtLWNvbnRyb2wtcGxhbmUtc3RhY2sgZGVwbG95L3N0YWNrcy9zZWxm" + - "LW1hbmFnZWQgXAogIC0tY29tcHV0ZS1wbGFuZS1zdGFjayBkZXBsb3kvc3RhY2tzL252Y2YtY29t" + - "cHV0ZS1wbGFuZSBcCiAgLS1lbnYgPGVudj4gXAogIC0tcGxhaW4gXAogIC0tY29udHJvbC1wbGFu" + - "ZS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRleHQ+IFwKICAtLWNvbXB1dGUtcGxhbmUtY29u" + - "dGV4dCA8Y29tcHV0ZS1wbGFuZS1jb250ZXh0PiBcCiAgaW5zdGFsbCAtLWNvbnRyb2wtcGxhbmUg" + - "XAogIC0tY2x1c3Rlci1uYW1lIDxjb250cm9sLXBsYW5lLWNsdXN0ZXItbmFtZT4gXAogIC0tcmVn" + - "aW9uIDxyZWdpb24+IFwKICAtLW5jYS1pZCA8bmNhLWlkPgoKdGVzdCAtcyBkZXBsb3kvc3RhY2tz" + - "L3NlbGYtbWFuYWdlZC9vdXQvY29udHJvbC1wbGFuZS1wcm9maWxlLnlhbWwKYGBgCgpVc2UgdGhl" + - "IGZ1bGwgcGVyc2lzdGVudCBwcmVmaXggZm9yIGJvdGggY29tcHV0ZS1wbGFuZSBjb21tYW5kczoK" + - "CmBgYGJhc2gKbnZjZi1jbGkgLS1jb25maWcgPGNvbmZpZz4gc2VsZi1ob3N0ZWQgXAogIC0tY29u" + - "dHJvbC1wbGFuZS1zdGFjayBkZXBsb3kvc3RhY2tzL3NlbGYtbWFuYWdlZCBcCiAgLS1jb21wdXRl" + - "LXBsYW5lLXN0YWNrIGRlcGxveS9zdGFja3MvbnZjZi1jb21wdXRlLXBsYW5lIFwKICAtLWVudiA8" + - "ZW52PiBcCiAgLS1wbGFpbiBcCiAgY29tcHV0ZS1wbGFuZSByZWdpc3RlciBcCiAgLS1jb250cm9s" + - "LXBsYW5lLXByb2ZpbGUgZGVwbG95L3N0YWNrcy9zZWxmLW1hbmFnZWQvb3V0L2NvbnRyb2wtcGxh" + - "bmUtcHJvZmlsZS55YW1sIFwKICAtLWNsdXN0ZXItbmFtZSA8Y29tcHV0ZS1wbGFuZS1jbHVzdGVy" + - "LW5hbWU+IFwKICAtLWt1YmUtY29udGV4dCA8Y29tcHV0ZS1wbGFuZS1jb250ZXh0PiBcCiAgLS1y" + - "ZWdpb24gPHJlZ2lvbj4gXAogIC0tb3V0cHV0IGRlcGxveS9zdGFja3MvbnZjZi1jb21wdXRlLXBs" + - "YW5lL291dC88Y29tcHV0ZS1wbGFuZS1jbHVzdGVyLW5hbWU+LXJlZ2lzdGVyLXZhbHVlcy55YW1s" + - "CgpudmNmLWNsaSAtLWNvbmZpZyA8Y29uZmlnPiBzZWxmLWhvc3RlZCBcCiAgLS1jb250cm9sLXBs" + - "YW5lLXN0YWNrIGRlcGxveS9zdGFja3Mvc2VsZi1tYW5hZ2VkIFwKICAtLWNvbXB1dGUtcGxhbmUt" + - "c3RhY2sgZGVwbG95L3N0YWNrcy9udmNmLWNvbXB1dGUtcGxhbmUgXAogIC0tZW52IDxlbnY+IFwK" + - "ICAtLXBsYWluIFwKICBjb21wdXRlLXBsYW5lIGluc3RhbGwgXAogIC0tdmFsdWVzIGRlcGxveS9z" + - "dGFja3MvbnZjZi1jb21wdXRlLXBsYW5lL291dC88Y29tcHV0ZS1wbGFuZS1jbHVzdGVyLW5hbWU+" + - "LXJlZ2lzdGVyLXZhbHVlcy55YW1sIFwKICAtLWt1YmUtY29udGV4dCA8Y29tcHV0ZS1wbGFuZS1j" + - "b250ZXh0PiBcCiAgLS1jbHVzdGVyLW5hbWUgPGNvbXB1dGUtcGxhbmUtY2x1c3Rlci1uYW1lPgpg" + - "YGAKClJlZ2lzdHJhdGlvbiBzZWxlY3RzIHRoZSBwcm9maWxlJ3MgaW4tY2x1c3RlciBvciBjb21w" + - "dXRlLXJlYWNoYWJsZSBlbmRwb2ludHMKZnJvbSB0aGUgY29tcHV0ZSBjb250ZXh0IGFuZCBwcm9i" + - "ZXMgaXRzIEpXS1MuIERvIG5vdCByZXBsYWNlIHByb2ZpbGUgZW5kcG9pbnRzCndpdGggaGFuZC1h" + - "dXRob3JlZCBIZWxtZmlsZSBlbmRwb2ludCB2YWx1ZXMuCgojIyBQdWxsIFNlY3JldHMKCkNyZWF0" + - "ZSB0aGUgY29udHJvbC1wbGFuZSBzZWNyZXQgaW4gdGhlc2UgbmFtZXNwYWNlcyBvbiB0aGUgY29u" + - "dHJvbC1wbGFuZQpjb250ZXh0OgoKYGBgdGV4dApjYXNzYW5kcmEtc3lzdGVtIG5hdHMtc3lzdGVt" + - "IG52Y2YgYXBpLWtleXMgZXNzIHNpcyB2YXVsdC1zeXN0ZW0gY2VydC1tYW5hZ2VyCmBgYAoKT24g" + - "dGhlIGNvbXB1dGUgY29udGV4dCwgY3JlYXRlIHRoZSBzZWNyZXQgb25seSBpbiBgbnZjYS1vcGVy" + - "YXRvcmAgYW5kIHJlZmVyZW5jZQppdCB0aHJvdWdoIGBnbG9iYWwuaW1hZ2VQdWxsU2VjcmV0c2Ag" + - "aW4gdGhlIGNvbXB1dGUtcGxhbmUgZW52aXJvbm1lbnQuIFRoZSBjaGFydAphbmQgb3BlcmF0b3Ig" + - "dXNlIGl0IGluIGBudmNhLW9wZXJhdG9yYCBhbmQgbWlycm9yIGl0IHRvIGBudmNhLXN5c3RlbWAu" + - "IERvIG5vdCBhZGQKZWl0aGVyIG5hbWVzcGFjZSB0byB0aGUgY29udHJvbC1wbGFuZSBsaXN0LiBG" + - "b3IgY29tbWFuZHMgYW5kIHBvbGljeSBleGFtcGxlcywKc2VlIFtwdWxsLXNlY3JldHMubWRdKHB1" + - "bGwtc2VjcmV0cy5tZCkuCgojIyBWZXJpZmljYXRpb24KClVzZSB0aGUgZXhwbGljaXQgR2F0ZXdh" + - "eSBuYW1lIGFuZCBuYW1lc3BhY2U6CgpgYGBiYXNoCmt1YmVjdGwgLS1jb250ZXh0IDxjb250cm9s" + - "LXBsYW5lLWNvbnRleHQ+IGdldCBnYXRld2F5IG52Y2YtZ2F0ZXdheSBcCiAgLW4gZW52b3ktZ2F0" + - "ZXdheSAtbyB3aWRlCmt1YmVjdGwgLS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRleHQ+IGdl" + - "dCB0Y3Byb3V0ZSAtbiBlbnZveS1nYXRld2F5Cmt1YmVjdGwgLS1jb250ZXh0IDxjb21wdXRlLXBs" + - "YW5lLWNvbnRleHQ+IHJvbGxvdXQgc3RhdHVzIFwKICBkZXBsb3ltZW50L252Y2Etb3BlcmF0b3Ig" + - "LW4gbnZjYS1vcGVyYXRvciAtLXRpbWVvdXQ9MTBtCmt1YmVjdGwgLS1jb250ZXh0IDxjb21wdXRl" + - "LXBsYW5lLWNvbnRleHQ+IHdhaXQgXAogIG52Y2ZiYWNrZW5kLzxjb21wdXRlLXBsYW5lLWNsdXN0" + - "ZXItbmFtZT4gLW4gbnZjYS1vcGVyYXRvciBcCiAgLS1mb3I9anNvbnBhdGg9J3suc3RhdHVzLmFn" + - "ZW50U3RhdHVzfSc9aGVhbHRoeSAtLXRpbWVvdXQ9MTBtCmt1YmVjdGwgLS1jb250ZXh0IDxjb21w" + - "dXRlLXBsYW5lLWNvbnRleHQ+IGdldCBzZWNyZXQgPHB1bGwtc2VjcmV0PiAtbiBudmNhLXN5c3Rl" + - "bQpgYGAKCiMjIFRlYXJkb3duCgpEZXN0cm95IGFuZCBkZXJlZ2lzdGVyIGV2ZXJ5IGNvbXB1dGUg" + - "cGxhbmUgYmVmb3JlIHRoZSBjb250cm9sIHBsYW5lLiBCb3RoCmhhbmRvZmZzIGNhbiBkZXN0cm95" + - "IHRoZSBjb250cm9sIHBsYW5lLCBzbyBhcHBseSB0aGlzIHByZWZsaWdodCBiZWZvcmUgZWl0aGVy" + - "Cm9uZS4gUHJlc2VydmUgdGhlIGBjZXJ0LW1hbmFnZXJgIG5hbWVzcGFjZSBieSBkZWZhdWx0LiBO" + - "YW1lc3BhY2UgcHJlc2VydmF0aW9uCmRvZXMgbm90IHByZXNlcnZlIHRoZSBIZWxtIHJlbGVhc2Uu" + - "IElkZW50aWZ5IHdoZXRoZXIgY2VydC1tYW5hZ2VyIGlzIGV4dGVybmFsLgpGb3IgYW4gZXh0ZXJu" + - "YWwgaW5zdGFsbGF0aW9uLCByZXF1aXJlIGVmZmVjdGl2ZSBgY2VydE1hbmFnZXIuZW5hYmxlZDog" + - "ZmFsc2VgCmFuZCBhYm9ydCBpZiBpdCBpcyB0cnVlLiBGb3IgYW4gaW50ZW5kZWQgc3RhY2stbWFu" + - "YWdlZCByZWxlYXNlIHdpdGggZWZmZWN0aXZlCmBjZXJ0TWFuYWdlci5lbmFibGVkOiB0cnVlYCwg" + - "dmVyaWZ5IG1hdGNoaW5nIHN0YWNrIEhlbG0gcmVsZWFzZSBtZXRhZGF0YSBhbmQKYWJvcnQgb24g" + - "bWlzc2luZyBvciBtaXNtYXRjaGVkIGV2aWRlbmNlLiBPbmx5IHBsYW4gbmFtZXNwYWNlIHJlbW92" + - "YWwgYWZ0ZXIKdmVyaWZ5aW5nIG5hbWVzcGFjZSBwcm92ZW5hbmNlIGFuZCBnZXR0aW5nIGV4cGxp" + - "Y2l0IGNvbmZpcm1hdGlvbjsgb3RoZXJ3aXNlCmRvIG5vdCBkZWxldGUgaXQuCgpGb3IgdGhlIEhl" + - "bG1maWxlIHZhbHVlcyBmbG93LCByZXRhaW4gZWFjaCByZWdpc3RyYXRpb24gdmFsdWVzIGZpbGUg" + - "dW50aWwKY2xlYW51cCBpcyB2ZXJpZmllZDoKCmBgYGJhc2gKbWFrZSAtQyBkZXBsb3kvc3RhY2tz" + - "L252Y2YtY29tcHV0ZS1wbGFuZSBkZXN0cm95IFwKICBDTFVTVEVSX05BTUU9PGNsdXN0ZXItbmFt" + - "ZT4gXAogIEhFTE1GSUxFX0VOVj08ZW52PiBcCiAgS1VCRUNPTkZJR19GSUxFPTxjb21wdXRlLXBs" + - "YW5lLWt1YmVjb25maWc+Cgo8bnZjZi1jbGk+IC0tY29uZmlnIDxjb25maWc+IGNsdXN0ZXIgZGVs" + - "ZXRlIFwKICAtLWNsdXN0ZXItaWQgPGNsdXN0ZXItaWQtZnJvbS1yZWdpc3RyYXRpb24tdmFsdWVz" + - "PiBcCiAgLS1uY2EtaWQgPG5jYS1pZD4gXAogIC0taWdub3JlLW1pc3NpbmcKYGBgCgpSZWFkIGBj" + - "bHVzdGVySURgIGFuZCBgbmNhSURgIGZyb20KYGRlcGxveS9zdGFja3MvbnZjZi1jb21wdXRlLXBs" + - "YW5lL3JlZ2lzdHJhdGlvbi88Y2x1c3Rlci1uYW1lPi1yZWdpc3Rlci12YWx1ZXMueWFtbGAuClNo" + - "b3cgdGhlIGV4YWN0IGNsdXN0ZXIgSUQgYW5kIGdldCBjb25maXJtYXRpb24gYmVmb3JlIGBjbHVz" + - "dGVyIGRlbGV0ZWAuIFJlcGVhdApjb21wdXRlIGRlc3Ryb3kgYW5kIGRlcmVnaXN0cmF0aW9uIGZv" + - "ciBldmVyeSBjb21wdXRlIGNsdXN0ZXIsIHRoZW4gZGVzdHJveSB0aGUKY29udHJvbCBwbGFuZS4K" + - "CmBgYGJhc2gKS1VCRUNPTkZJRz08Y29udHJvbC1wbGFuZS1rdWJlY29uZmlnPiBcCm1ha2UgLUMg" + - "ZGVwbG95L3N0YWNrcy9zZWxmLW1hbmFnZWQgZGVzdHJveSBcCiAgSEVMTUZJTEVfRU5WPTxlbnY+" + - "IFwKICBLVUJFQ09ORklHX0ZJTEU9PGNvbnRyb2wtcGxhbmUta3ViZWNvbmZpZz4KYGBgCgpCb3Ro" + - "IGBLVUJFQ09ORklHYCBhbmQgYEtVQkVDT05GSUdfRklMRWAgYXJlIHJlcXVpcmVkIG9uIHRoZSBj" + - "b250cm9sLXBsYW5lCmRlc3Ryb3kgYmVjYXVzZSBpdHMgbmFtZXNwYWNlIGNsZWFudXAgdXNlcyBh" + - "bWJpZW50IGBrdWJlY3RsYC4KCkZvciB0aGUgQ0xJIHByb2ZpbGUgZmxvdywga2VlcApgZGVwbG95" + - "L3N0YWNrcy9udmNmLWNvbXB1dGUtcGxhbmUvb3V0LzxjbHVzdGVyLW5hbWU+LXJlZ2lzdGVyLXZh" + - "bHVlcy55YW1sYAp1bnRpbCB0ZWFyZG93biBjb21wbGV0ZXMgYmVjYXVzZSBgZG93bmAgcmVhZHMg" + - "aXRzIGNsdXN0ZXIgSUQuIEZpcnN0IHF1ZXJ5IHRoZQpsaXZlIHJlZ2lzdHJhdGlvbiBzZXQgd2l0" + - "aCB0aGUgc2FtZSBjb21wbGV0ZSBwZXJzaXN0ZW50IHByZWZpeDoKCmBgYGJhc2gKbnZjZi1jbGkg" + - "LS1jb25maWcgPGNvbmZpZz4gc2VsZi1ob3N0ZWQgXAogIC0tY29udHJvbC1wbGFuZS1zdGFjayBk" + - "ZXBsb3kvc3RhY2tzL3NlbGYtbWFuYWdlZCBcCiAgLS1jb21wdXRlLXBsYW5lLXN0YWNrIGRlcGxv" + - "eS9zdGFja3MvbnZjZi1jb21wdXRlLXBsYW5lIFwKICAtLWVudiA8ZW52PiBcCiAgLS1wbGFpbiBc" + - "CiAgLS1jb250cm9sLXBsYW5lLWNvbnRleHQgPGNvbnRyb2wtcGxhbmUtY29udGV4dD4gXAogIC0t" + - "Y29tcHV0ZS1wbGFuZS1jb250ZXh0IDxjb21wdXRlLXBsYW5lLWNvbnRleHQ+IFwKICAtLWljbXMt" + - "dXJsIDxjb21wdXRlLXJlYWNoYWJsZS1pY21zLXVybD4gXAogIHN0YXR1cyBcCiAgLS1jbHVzdGVy" + - "LW5hbWUgPGNvbXB1dGUtcGxhbmUtY2x1c3Rlci1uYW1lPiBcCiAgLS1uY2EtaWQgPG5jYS1pZD4K" + - "YGBgCgpTaG93IHRoZSByZWdpc3RlcmVkIGNvbXB1dGUtcGxhbmUgbGlzdC4gTmFtZWQtY2x1c3Rl" + - "ciBgZG93biAtLXBsYW4tb25seWAgZG9lcwpub3QgcXVlcnkgSUNNUywgc28gaXQgcHJldmlld3Mg" + - "b25seSB0aGF0IGNvbXB1dGUgcGxhbmUgYW5kIGNhbm5vdCBzaG93IHRoZQpjb25kaXRpb25hbCBj" + - "b250cm9sLXBsYW5lIHJlbW92YWwuIElmIHRoZSB0YXJnZXQgaXMgdGhlIGxhc3QgcmVnaXN0ZXJl" + - "ZApjbHVzdGVyLCByZWFsIGBkb3duYCBhbHNvIGRlc3Ryb3lzIHRoZSBjb250cm9sIHBsYW5lLiBH" + - "ZXQgZXhwbGljaXQgY29uZmlybWF0aW9uCmZvciBib3RoIHJlbW92YWxzIGJlZm9yZSBjb250aW51" + - "aW5nLiBUaGVuIHByZXZpZXcgYW5kIGV4ZWN1dGUgd2l0aCB0aGUgc2FtZQpwcmVmaXg6CgpgYGBi" + + "IHRha2luZyBhY3Rpb24iLAogICAgICAiRm9yIGV2ZXJ5IGNvbXB1dGUgY2x1c3RlciwgdGhlIEhl" + + "bG1maWxlIGZsb3cgcmFuIHRoZSBjb21wdXRlLXBsYW5lIE1ha2VmaWxlIGRlc3Ryb3kgdGFyZ2V0" + + "IHdpdGggaXRzIGNvbXB1dGUga3ViZWNvbmZpZyIsCiAgICAgICJBZnRlciBjb25maXJtYXRpb24s" + + "IHRoZSBIZWxtZmlsZSBmbG93IHJhbiBjbHVzdGVyIGRlbGV0ZSB3aXRoIGNsdXN0ZXJJRCBhbmQg" + + "bmNhSUQgYmVmb3JlIGNvbnRyb2wtcGxhbmUgZGVzdHJ1Y3Rpb24iLAogICAgICAiQmVmb3JlIGVp" + + "dGhlciBoYW5kb2ZmIGNvdWxkIGRlc3Ryb3kgdGhlIGNvbnRyb2wgcGxhbmUsIGJvdGggdGVhcmRv" + + "d24gZmxvd3Mgd2FybmVkIHRoYXQgbmFtZXNwYWNlIHByZXNlcnZhdGlvbiBkb2VzIG5vdCBwcmVz" + + "ZXJ2ZSB0aGUgSGVsbSByZWxlYXNlLCByZXF1aXJlZCBlZmZlY3RpdmUgY2VydE1hbmFnZXIuZW5h" + + "YmxlZDogZmFsc2UgZm9yIGFuIGV4dGVybmFsIGluc3RhbGxhdGlvbiBhbmQgYWJvcnRlZCBpZiB0" + + "cnVlLCBhbmQgdmVyaWZpZWQgaW50ZW5kZWQgc3RhY2sgb3duZXJzaGlwIHdoZW4gZW5hYmxlZCwg" + + "YWJvcnRpbmcgb24gbWlzc2luZyBvciBtaXNtYXRjaGVkIGV2aWRlbmNlIiwKICAgICAgIkJvdGgg" + + "dGVhcmRvd24gZmxvd3MgcHJlc2VydmVkIHRoZSBjZXJ0LW1hbmFnZXIgbmFtZXNwYWNlIGJ5IGRl" + + "ZmF1bHQgYW5kIGRpZCBub3QgZGVsZXRlIGl0IHdpdGhvdXQgbmFtZXNwYWNlIHByb3ZlbmFuY2Ug" + + "YW5kIGV4cGxpY2l0IGNvbmZpcm1hdGlvbiIsCiAgICAgICJUaGUgSGVsbWZpbGUgZmxvdyByYW4g" + + "Y29udHJvbC1wbGFuZSBNYWtlZmlsZSBkZXN0cm95IHdpdGggYm90aCBLVUJFQ09ORklHIGFuZCBL" + + "VUJFQ09ORklHX0ZJTEUiLAogICAgICAiVGhlIENMSSBmbG93IHJldGFpbmVkIG91dC88Y2x1c3Rl" + + "ci1uYW1lPi1yZWdpc3Rlci12YWx1ZXMueWFtbCB1bnRpbCB0ZWFyZG93biBjb21wbGV0ZWQiLAog" + + "ICAgICAiQmVmb3JlIHJlYWwgZG93biwgdGhlIENMSSBmbG93IHVzZWQgdGhlIGZ1bGwtcHJlZml4" + + "IHN0YXR1cyBjb21tYW5kIHRvIGluc3BlY3QgbGl2ZSByZWdpc3RyYXRpb25zLCBzdGF0ZWQgdGhh" + + "dCBuYW1lZC1jbHVzdGVyIHBsYW4tb25seSBkb2VzIG5vdCBxdWVyeSBJQ01TIGFuZCBjYW5ub3Qg" + + "cHJlZGljdCBjb25kaXRpb25hbCBjb250cm9sLXBsYW5lIHJlbW92YWwsIHdhcm5lZCB3aGVuIHRo" + + "ZSB0YXJnZXQgd2FzIHRoZSBsYXN0IHJlZ2lzdGVyZWQgY2x1c3RlciwgYW5kIGdvdCBleHBsaWNp" + + "dCBjb25maXJtYXRpb24iLAogICAgICAiVGhlIENMSSBmbG93IHVzZWQgLS1jb25maWcsIGJvdGgg" + + "c3RhY2sgcGF0aHMsIC0tZW52LCAtLXBsYWluLCBib3RoIGNvbnRleHRzLCBhbmQgLS1pY21zLXVy" + + "bCBmb3IgZG93biAtLXBsYW4tb25seSBhbmQgdGhlbiBkb3duIiwKICAgICAgIlRoZSBhZ2VudCBz" + + "dGF0ZWQgdGhhdCBkb3duIHVucmVnaXN0ZXJzIGVhY2ggY29tcHV0ZSBjbHVzdGVyIGFuZCByZW1v" + + "dmVzIHRoZSBjb250cm9sIHBsYW5lIG9ubHkgYWZ0ZXIgbm8gcmVnaXN0cmF0aW9ucyByZW1haW4i" + + "CiAgICBdCiAgfSwKICB7CiAgICAiaWQiOiAiUzEzLXZhbHVlcy1wcmVjZWRlbmNlIiwKICAgICJx" + + "dWVzdGlvbiI6ICJJIGFkZGVkIGEgdmFsdWUgdG8gbXkgZW52aXJvbm1lbnQgWUFNTCBidXQgaXQn" + + "cyBiZWluZyBzaWxlbnRseSBpZ25vcmVkLiBIb3cgZG8gaGVsbWZpbGUgdmFsdWVzIHdvcmsgaW4g" + + "TlZDRj8iLAogICAgImV4cGVjdGVkX3NraWxsIjogIm52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxh" + + "dGlvbiIsCiAgICAiZ3JvdW5kX3RydXRoIjogIlRoZSBhZ2VudCBleHBsYWluZWQgdGhlIHZhbHVl" + + "cyBwcmVjZWRlbmNlIGNoYWluIChiYXNlLnlhbWwsIGVudiBZQU1MLCBnbG9iYWwueWFtbC5nb3Rt" + + "cGwsIHNlY3JldHMsIGlubGluZSB2YWx1ZXMpLCBpZGVudGlmaWVkIHRoYXQgZ2xvYmFsLnlhbWwu" + + "Z290bXBsIG9ubHkgcGFzc2VzIHRocm91Z2ggc3BlY2lmaWMga2V5cywgYW5kIGV4cGxhaW5lZCB0" + + "aGF0IGFyYml0cmFyeSBjaGFydCB2YWx1ZXMgbXVzdCB1c2UgcmVsZWFzZSBpbmxpbmUgdmFsdWVz" + + "IGJsb2Nrcy4iLAogICAgImV4cGVjdGVkX2JlaGF2aW9yIjogWwogICAgICAiVGhlIGFnZW50IHJl" + + "YWQgdGhlIG52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiBTS0lMTC5tZCBiZWZvcmUgdGFr" + + "aW5nIGFjdGlvbiIsCiAgICAgICJUaGUgYWdlbnQgZXhwbGFpbmVkIHRoZSB2YWx1ZXMgcHJlY2Vk" + + "ZW5jZSBjaGFpbjogYmFzZS55YW1sIC0+IGVudiBZQU1MIC0+IGdsb2JhbC55YW1sLmdvdG1wbCAt" + + "PiBzZWNyZXRzIC0+IGlubGluZSB2YWx1ZXMiLAogICAgICAiVGhlIGFnZW50IGlkZW50aWZpZWQg" + + "dGhhdCBnbG9iYWwueWFtbC5nb3RtcGwgb25seSBwYXNzZXMgdGhyb3VnaCBzcGVjaWZpYyBrZXlz" + + "IChjYXNzYW5kcmEucmVwbGljYUNvdW50LCBnbG9iYWwuc3RvcmFnZUNsYXNzLCBnbG9iYWwuaW1h" + + "Z2UsIGV0Yy4pIiwKICAgICAgIlRoZSBhZ2VudCBleHBsYWluZWQgdGhhdCBhcmJpdHJhcnkgY2hh" + + "cnQgdmFsdWVzIG11c3QgYmUgc2V0IHZpYSByZWxlYXNlIGlubGluZSB2YWx1ZXM6IGJsb2NrcyIs" + + "CiAgICAgICJUaGUgYWdlbnQgbGlzdGVkIGV4YW1wbGVzIG9mIHZhbHVlcyB0aGF0IGFyZSBwcm9w" + + "YWdhdGVkIGFuZCBhcmJpdHJhcnkgY2hhcnQgdmFsdWVzIHRoYXQgcmVxdWlyZSBhIHJlbGVhc2Ug" + + "dmFsdWVzIGJsb2NrIgogICAgXQogIH0sCiAgewogICAgImlkIjogIlMxNC1lbmFibGUtbGxtLWZ1" + + "bmN0aW9ucyIsCiAgICAicXVlc3Rpb24iOiAiSSBuZWVkIHRvIGRlcGxveSBmdW5jdGlvblR5cGU6" + + "IExMTSBmdW5jdGlvbnMgb24gYSBzZWxmLW1hbmFnZWQsIHNpbmdsZS1ub2RlIGlzb2xhdGVkIHRl" + + "c3QgY2x1c3Rlci4gV2hhdCBIZWxtZmlsZSBjb25maWd1cmF0aW9uIGFuZCB2ZXJpZmljYXRpb24g" + + "c3RlcHMgZG8gSSBuZWVkPyIsCiAgICAiZXhwZWN0ZWRfc2tpbGwiOiAibnZjZi1zZWxmLW1hbmFn" + + "ZWQtaW5zdGFsbGF0aW9uIiwKICAgICJncm91bmRfdHJ1dGgiOiAiVGhlIGFnZW50IGVuYWJsZWQg" + + "dGhlIExMTSBhZGRvbiB3aXRoIGFkZG9ucy5sbG0uZW5hYmxlZCwgY29uZmlndXJlZCBzaW5nbGUg" + + "cmVwbGljYXMgZm9yIHRoZSBMTE0gQVBJIEdhdGV3YXkgYW5kIHJlcXVlc3Qgcm91dGVyLCBhbmQg" + + "ZXhwbGFpbmVkIHRoYXQgdGhlIHJlcXVlc3Qgcm91dGVyIHVzZXMgcG93ZXItb2YtdHdvIHdoZW4g" + + "bm8gbG9hZC1iYWxhbmNlciBjb25maWd1cmF0aW9uIGlzIHNldC4gSXQgbGlua2VkIHRoZSBjYW5v" + + "bmljYWwgcmVxdWVzdC1yb3V0ZXIgbG9hZC1iYWxhbmNpbmcgZ3VpZGUgZm9yIG90aGVyIHJvdXRp" + + "bmcgbWV0aG9kcy4gRm9yIHRoZSBpc29sYXRlZCBwbGFpbnRleHQgY2x1c3RlciwgaXQgaW5jbHVk" + + "ZWQgYm90aCBhZGRvbnMubGxtLmdhdGV3YXkuYXV0aC5ncnBjSW5zZWN1cmUgYW5kIGFnZW50Q29u" + + "ZmlnLm1lcmdlQ29uZmlnLndvcmtsb2FkLnN0YXJnYXRlUVVJQ0luc2VjdXJlLCB3aXRoIGEgd2Fy" + + "bmluZyB0aGF0IHRob3NlIHNldHRpbmdzIGFyZSBub3QgZm9yIHByb2R1Y3Rpb24uIEl0IHJlZnJl" + + "c2hlZCB0aGUgY29tcHV0ZSBwbGFuZSB1c2luZyB0aGUgc2FtZSBoYW5kb2ZmIHVzZWQgZHVyaW5n" + + "IGluc3RhbGxhdGlvbiwgcmVkZXBsb3llZCBleGlzdGluZyBMTE0gZnVuY3Rpb25zLCBhbmQgdmVy" + + "aWZpZWQgdGhlIExMTSBkZXBsb3ltZW50cywgcm91dGUsIGFuZCBsbG0td29ya2VyIHNpZGVjYXIu" + + "IiwKICAgICJleHBlY3RlZF9iZWhhdmlvciI6IFsKICAgICAgIlRoZSBhZ2VudCB1c2VkIGFkZG9u" + + "cy5sbG0uZW5hYmxlZCwgbm90IHRoZSBvYnNvbGV0ZSBsbG0uZW5hYmxlZCBwYXRoIiwKICAgICAg" + + "IlRoZSBhZ2VudCBzZXQgZ2F0ZXdheSBhbmQgcmVxdWVzdFJvdXRlciByZXBsaWNhQ291bnQgdG8g" + + "MSBmb3IgdGhlIHNpbmdsZS1ub2RlIHRlc3QgY2x1c3RlciIsCiAgICAgICJUaGUgYWdlbnQgc3Rh" + + "dGVkIHRoYXQgdGhlIHJlcXVlc3Qgcm91dGVyIGRlZmF1bHRzIHRvIHBvd2VyLW9mLXR3byBhbmQg" + + "bGlua2VkIHRoZSBjYW5vbmljYWwgcmVxdWVzdC1yb3V0ZXIgbG9hZC1iYWxhbmNpbmcgZ3VpZGUg" + + "Zm9yIG90aGVyIG1ldGhvZHMiLAogICAgICAiVGhlIGFnZW50IGluY2x1ZGVkIGFkZG9ucy5sbG0u" + + "Z2F0ZXdheS5hdXRoLmdycGNJbnNlY3VyZSBhbmQgd29ya2xvYWQuc3RhcmdhdGVRVUlDSW5zZWN1" + + "cmUgZm9yIHRoZSBpc29sYXRlZCBwbGFpbnRleHQgY2x1c3RlciwgYW5kIHdhcm5lZCBhZ2FpbnN0" + + "IHVzaW5nIHRoZW0gaW4gcHJvZHVjdGlvbiIsCiAgICAgICJUaGUgYWdlbnQgYXBwbGllZCB0aGUg" + + "Y29udHJvbC1wbGFuZSBIZWxtZmlsZSBlbnZpcm9ubWVudCwgcmVmcmVzaGVkIHRoZSBjb21wdXRl" + + "IHBsYW5lIHdpdGggdGhlIHNhbWUgc2VsZWN0ZWQgaGFuZG9mZiwgYW5kIHJlY3JlYXRlZCBvciBy" + + "ZWRlcGxveWVkIGV4aXN0aW5nIExMTSBmdW5jdGlvbnMiLAogICAgICAiVGhlIGFnZW50IHZlcmlm" + + "aWVkIGxsbS1hcGktZ2F0ZXdheSwgbGxtLXJlcXVlc3Qtcm91dGVyLCB0aGUgTExNIEhUVFBSb3V0" + + "ZSwgYW5kIHRoZSBsbG0td29ya2VyIHNpZGVjYXIgaW5jbHVkaW5nIC0tcXVpYy1pbnNlY3VyZSIK" + + "ICAgIF0KICB9LAogIHsKICAgICJpZCI6ICJHOC1ORUctbm90LWZvci1rM2QiLAogICAgInF1ZXN0" + + "aW9uIjogIlNldCB1cCBhIGxvY2FsIE5WQ0YgZGV2IGNsdXN0ZXIgdXNpbmcgazNkIGZvciB0ZXN0" + + "aW5nIiwKICAgICJleHBlY3RlZF9za2lsbCI6IG51bGwsCiAgICAic2hvdWxkX3RyaWdnZXIiOiBm" + + "YWxzZSwKICAgICJncm91bmRfdHJ1dGgiOiAiVGhpcyBpcyBhIGxvY2FsIGszZCBkZXZlbG9wbWVu" + + "dCByZXF1ZXN0IHRoYXQgYmVsb25ncyB0byB0aGUgbnZjZi1zZWxmLWhvc3RlZC1sb2NhbC1kZXYg" + + "c2tpbGwsIG5vdCBudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24uIFRoZSBhZ2VudCBkaWQg" + + "bm90IHJlYWQgb3IgdXNlIHRoZSBzZWxmLW1hbmFnZWQgaW5zdGFsbGF0aW9uIHNraWxsIGFuZCBp" + + "bnN0ZWFkIHByb3ZpZGVkIGszZC1zcGVjaWZpYyBndWlkYW5jZS4iLAogICAgImV4cGVjdGVkX2Jl" + + "aGF2aW9yIjogWwogICAgICAiVGhlIGFnZW50IGRpZCBub3QgcmVhZCBudmNmLXNlbGYtbWFuYWdl" + + "ZC1pbnN0YWxsYXRpb24vU0tJTEwubWQiLAogICAgICAiVGhlIGFnZW50IGRpZCBub3QgcHJvdmlk" + + "ZSBoZWxtZmlsZS1iYXNlZCBwcm9kdWN0aW9uIGRlcGxveW1lbnQgaW5zdHJ1Y3Rpb25zIiwKICAg" + + "ICAgIlRoZSBhZ2VudCBwcm92aWRlZCBrM2Qtc3BlY2lmaWMgbG9jYWwgZGV2ZWxvcG1lbnQgZ3Vp" + + "ZGFuY2Ugb3IgZGVmZXJyZWQgdG8gdGhlIGFwcHJvcHJpYXRlIGxvY2FsLWRldiBza2lsbCIKICAg" + + "IF0KICB9Cl0KUEsHCCsTuD+tVQAArVUAAFBLAwQUAAgAAAAAACEAAAAAAAAAAAAAAAAALwAJAGRh" + + "dGEvbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uL2V4YW1wbGVzLm1kVVQFAAEAps4SIyBF" + + "eGFtcGxlcwoKV29ya2VkIGV4YW1wbGVzIGJhc2VkIG9uIHJlYWwgZGVwbG95bWVudCBzY2VuYXJp" + + "b3MuCgojIyBFeGFtcGxlIDE6IE92ZXJyaWRlIENhc3NhbmRyYSBSZXNvdXJjZXMKClRoZSBkZWZh" + + "dWx0IENhc3NhbmRyYSByZXNvdXJjZSBsaW1pdHMgY2F1c2UgT09NIG9uIGxhcmdlIGluc3RhbmNl" + + "IHR5cGVzIChlLmcuLCBgcDUuNDh4bGFyZ2VgKS4KClByb2JsZW06IENhc3NhbmRyYSBwb2RzIHJl" + + "c3RhcnQgd2l0aCBgT09NS2lsbGVkYC4KClNvbHV0aW9uOiBPdmVycmlkZSByZXNvdXJjZXMgdmlh" + + "IGhlbG1maWxlIHJlbGVhc2UgdmFsdWVzIGJsb2NrLgoKIyMjIFN0ZXAgMTogQ2FwdHVyZSBiYXNl" + + "bGluZQoKYGBgYmFzaApIRUxNRklMRV9FTlY9PGVudj4gaGVsbWZpbGUgLS1zZWxlY3RvciBuYW1l" + + "PWNhc3NhbmRyYSB0ZW1wbGF0ZSA+IC90bXAvY2Fzcy1iZWZvcmUueWFtbApncmVwIC1BOCAncmVz" + + "b3VyY2VzOicgL3RtcC9jYXNzLWJlZm9yZS55YW1sIHwgaGVhZCAtMTAKYGBgCgojIyMgU3RlcCAy" + + "OiBBZGQgb3ZlcnJpZGUgdG8gaGVsbWZpbGUuZC8wMS1kZXBlbmRlbmNpZXMueWFtbC5nb3RtcGwK" + + "CkluIHRoZSBleGFtcGxlcyBiZWxvdywgYDxwcml2YXRlLXZhbHVlcz5gIHJlZmVycyB0byB0aGUg" + + "YHNlY3JldHMvYCBkaXJlY3RvcnkgYXQgdGhlIGhlbG1maWxlIHN0YWNrIHJvb3QuCgpgYGB5YW1s" + + "Ci0gbmFtZTogY2Fzc2FuZHJhCiAgdmVyc2lvbjogMC44LjAKICBjb25kaXRpb246IGNhc3NhbmRy" + + "YS5lbmFibGVkCiAgbmFtZXNwYWNlOiBjYXNzYW5kcmEtc3lzdGVtCiAgPDw6ICpkZXBlbmRlbmN5" + + "CiAgdmFsdWVzOgogICAgLSAuLi9nbG9iYWwueWFtbC5nb3RtcGwKICAgIC0gLi4vPHByaXZhdGUt" + + "dmFsdWVzPi97eyByZXF1aXJlZEVudiAiSEVMTUZJTEVfRU5WIiB9fS1zZWNyZXRzLnlhbWwKICAg" + + "IC0gY2Fzc2FuZHJhOgogICAgICAgIHJlc291cmNlczoKICAgICAgICAgIGxpbWl0czoKICAgICAg" + + "ICAgICAgY3B1OiAiOCIKICAgICAgICAgICAgbWVtb3J5OiA4MTkyTWkKICAgICAgICAgIHJlcXVl" + + "c3RzOgogICAgICAgICAgICBjcHU6ICIyIgogICAgICAgICAgICBtZW1vcnk6IDQwOTZNaQpgYGAK" + + "CiMjIyBTdGVwIDM6IFZlcmlmeSBhbmQgYXBwbHkKCmBgYGJhc2gKSEVMTUZJTEVfRU5WPTxlbnY+" + + "IGhlbG1maWxlIC0tc2VsZWN0b3IgbmFtZT1jYXNzYW5kcmEgdGVtcGxhdGUgPiAvdG1wL2Nhc3Mt" + + "YWZ0ZXIueWFtbApkaWZmIC90bXAvY2Fzcy1iZWZvcmUueWFtbCAvdG1wL2Nhc3MtYWZ0ZXIueWFt" + + "bCAgIyBDb25maXJtIHJlc291cmNlcyBjaGFuZ2VkCkhFTE1GSUxFX0VOVj08ZW52PiBoZWxtZmls" + + "ZSAtLXNlbGVjdG9yIG5hbWU9Y2Fzc2FuZHJhIHN5bmMKYGBgCgpOb3RlOiBgcmVzb3VyY2VQcmVz" + + "ZXRgIChhIEJpdG5hbWkgZmVhdHVyZSkgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgTlZDRiBjYXNz" + + "YW5kcmEgd3JhcHBlciBjaGFydC4gVXNlIGV4cGxpY2l0IGByZXNvdXJjZXNgIGluc3RlYWQuCgot" + + "LS0KCiMjIEV4YW1wbGUgMjogRGVwbG95IGZyb20gTkdDIFByaXZhdGUgUmVnaXN0cnkgd2l0aCBQ" + + "dWxsIFNlY3JldHMKCkRlcGxveSB0aGUgTlZDRiBzdGFjayBwdWxsaW5nIGltYWdlcyBkaXJlY3Rs" + + "eSBmcm9tIE5HQyAoYG52Y3IuaW9gKSBpbnN0ZWFkIG9mIGEgbWlycm9yZWQgcmVnaXN0cnksIHVz" + + "aW5nIGltYWdlIHB1bGwgc2VjcmV0cy4KCiMjIyBTdGVwIDE6IENvbmZpZ3VyZSBlbnZpcm9ubWVu" + + "dCBmb3IgTkdDCgpgYGB5YW1sCiMgZW52aXJvbm1lbnRzLzxlbnY+LnlhbWwKZ2xvYmFsOgogIGhl" + + "bG06CiAgICBzb3VyY2VzOgogICAgICByZWdpc3RyeTogbnZjci5pbwogICAgICByZXBvc2l0b3J5" + + "OiBudmlkaWEvbnZjZgogIGltYWdlOgogICAgcmVnaXN0cnk6IG52Y3IuaW8KICAgIHJlcG9zaXRv" + + "cnk6IG52aWRpYS9udmNmCmBgYAoKIyMjIFN0ZXAgMjogQXV0aGVudGljYXRlIGxvY2FsbHkgKGZv" + + "ciBoZWxtZmlsZSBjaGFydCBwdWxscykKCmBgYGJhc2gKZG9ja2VyIGxvZ2luIG52Y3IuaW8gLXUg" + + "JyRvYXV0aHRva2VuJyAtcCAiJE5HQ19BUElfS0VZIgpoZWxtIHJlZ2lzdHJ5IGxvZ2luIG52Y3Iu" + + "aW8gLXUgJyRvYXV0aHRva2VuJyAtcCAiJE5HQ19BUElfS0VZIgpgYGAKCiMjIyBTdGVwIDM6IENy" + + "ZWF0ZSBuYW1lc3BhY2VzIGFuZCBwdWxsIHNlY3JldHMKCmBgYGJhc2gKZXhwb3J0IE5HQ19BUElf" + + "S0VZPSI8eW91ci1uZ2MtYXBpLWtleT4iCgpmb3IgbnMgaW4gY2Fzc2FuZHJhLXN5c3RlbSBuYXRz" + + "LXN5c3RlbSBudmNmIGFwaS1rZXlzIGVzcyBzaXMgdmF1bHQtc3lzdGVtIGNlcnQtbWFuYWdlcjsg" + + "ZG8KICBrdWJlY3RsIC0tY29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBjcmVhdGUgbmFt" + + "ZXNwYWNlICIkbnMiIFwKICAgIC0tZHJ5LXJ1bj1jbGllbnQgLW8geWFtbCB8IGt1YmVjdGwgLS1j" + + "b250ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRleHQ+IGFwcGx5IC1mIC0KZG9uZQoKZm9yIG5zIGlu" + + "IGNhc3NhbmRyYS1zeXN0ZW0gbmF0cy1zeXN0ZW0gbnZjZiBhcGkta2V5cyBlc3Mgc2lzIHZhdWx0" + + "LXN5c3RlbSBjZXJ0LW1hbmFnZXI7IGRvCiAga3ViZWN0bCAtLWNvbnRleHQgPGNvbnRyb2wtcGxh" + + "bmUtY29udGV4dD4gY3JlYXRlIHNlY3JldCBkb2NrZXItcmVnaXN0cnkgbnZjci1jcmVkcyBcCiAg" + + "ICAtLWRvY2tlci1zZXJ2ZXI9bnZjci5pbyBcCiAgICAtLWRvY2tlci11c2VybmFtZT0nJG9hdXRo" + + "dG9rZW4nIFwKICAgIC0tZG9ja2VyLXBhc3N3b3JkPSIkTkdDX0FQSV9LRVkiIFwKICAgIC0tbmFt" + + "ZXNwYWNlPSIkbnMiIFwKICAgIC0tZHJ5LXJ1bj1jbGllbnQgLW8geWFtbCB8IGt1YmVjdGwgLS1j" + + "b250ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRleHQ+IGFwcGx5IC1mIC0KZG9uZQpgYGAKCiMjIyBT" + + "dGVwIDQ6IEFkZCBpbWFnZVB1bGxTZWNyZXRzIHRvIGhlbG1maWxlIHJlbGVhc2VzCgpBZGQgdGhl" + + "IGNoYXJ0LXNwZWNpZmljIGBpbWFnZVB1bGxTZWNyZXRzYCBrZXkgdG8gZWFjaCByZWxlYXNlLiBF" + + "eGFtcGxlIGZvciBjYXNzYW5kcmEgaW4gYGhlbG1maWxlLmQvMDEtZGVwZW5kZW5jaWVzLnlhbWwu" + + "Z290bXBsYDoKCmBgYHlhbWwKLSBuYW1lOiBjYXNzYW5kcmEKICB2ZXJzaW9uOiAwLjguMAogIGNv" + + "bmRpdGlvbjogY2Fzc2FuZHJhLmVuYWJsZWQKICBuYW1lc3BhY2U6IGNhc3NhbmRyYS1zeXN0ZW0K" + + "ICA8PDogKmRlcGVuZGVuY3kKICB2YWx1ZXM6CiAgICAtIC4uL2dsb2JhbC55YW1sLmdvdG1wbAog" + + "ICAgLSAuLi88cHJpdmF0ZS12YWx1ZXM+L3t7IHJlcXVpcmVkRW52ICJIRUxNRklMRV9FTlYiIH19" + + "LXNlY3JldHMueWFtbAogICAgLSBjYXNzYW5kcmE6CiAgICAgICAgZ2xvYmFsOgogICAgICAgICAg" + + "aW1hZ2VQdWxsU2VjcmV0czoKICAgICAgICAgICAgLSBudmNyLWNyZWRzCmBgYAoKU2VlIFtyZWZl" + + "cmVuY2VzL3B1bGwtc2VjcmV0cy5tZF0ocmVmZXJlbmNlcy9wdWxsLXNlY3JldHMubWQpIGZvciB0" + + "aGUga2V5IGZvciBldmVyeSBjaGFydC4KClRoZXNlIGFyZSBjb250cm9sLXBsYW5lIG5hbWVzcGFj" + + "ZXMuIEZvciBhIHNlcGFyYXRlIGNvbXB1dGUgY2x1c3RlciwgY3JlYXRlIHRoZQpzZWNyZXQgb25s" + + "eSBpbiBgbnZjYS1vcGVyYXRvcmA7IHRoZSBjaGFydCBhbmQgb3BlcmF0b3IgbWlycm9yIGl0IHRv" + + "CmBudmNhLXN5c3RlbWAuIFNlZSBbU3BsaXQgQ29tcHV0ZS1QbGFuZSBJbnN0YWxsYXRpb25dKHJl" + + "ZmVyZW5jZXMvY29tcHV0ZS1wbGFuZS1pbnN0YWxsYXRpb24ubWQjcHVsbC1zZWNyZXRzKS4KCiMj" + + "IyBTdGVwIDU6IERlcGxveQoKYGBgYmFzaApIRUxNRklMRV9FTlY9PGVudj4gaGVsbWZpbGUgLS1r" + + "dWJlLWNvbnRleHQgPGNvbnRyb2wtcGxhbmUtY29udGV4dD4gc3luYwpgYGAKCiMjIyBTdGVwIDY6" + + "IFBhdGNoIFNlcnZpY2VBY2NvdW50cyBmb3IgY2hhcnRzIHdpdGhvdXQgbmF0aXZlIHN1cHBvcnQK" + + "CkFmdGVyIFBoYXNlIDEgKGRlcGVuZGVuY2llcykgY29tcGxldGVzLCBPcGVuQmFvIHBvZHMgd2ls" + + "bCBiZSBpbiBgSW1hZ2VQdWxsQmFja09mZmAuIFBhdGNoIGFuZCByZXN0YXJ0OgoKYGBgYmFzaApm" + + "b3IgbnMgaW4gdmF1bHQtc3lzdGVtIG52Y2YgZXNzOyBkbwogIGZvciBzYSBpbiAkKGt1YmVjdGwg" + + "LS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRleHQ+IGdldCBzYSAtbiAiJG5zIiBcCiAgICAt" + + "LW5vLWhlYWRlcnMgLW8gY3VzdG9tLWNvbHVtbnM9IjptZXRhZGF0YS5uYW1lIik7IGRvCiAgICBr" + + "dWJlY3RsIC0tY29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBwYXRjaCBzZXJ2aWNlYWNj" + + "b3VudCAtbiAiJG5zIiAiJHNhIiBcCiAgICAgIC1wICd7ImltYWdlUHVsbFNlY3JldHMiOiBbeyJu" + + "YW1lIjogIm52Y3ItY3JlZHMifV19JwogIGRvbmUKZG9uZQprdWJlY3RsIC0tY29udGV4dCA8Y29u" + + "dHJvbC1wbGFuZS1jb250ZXh0PiBkZWxldGUgcG9kcyAtbiB2YXVsdC1zeXN0ZW0gLS1hbGwKYGBg" + + "CgpWZXJpZnk6CgpgYGBiYXNoCmt1YmVjdGwgLS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRl" + + "eHQ+IGdldCBldmVudHMgLW4gdmF1bHQtc3lzdGVtIFwKICAtLXNvcnQtYnk9Jy5sYXN0VGltZXN0" + + "YW1wJyB8IGdyZXAgLWkgcHVsbAojIFNob3VsZCBzaG93ICJTdWNjZXNzZnVsbHkgcHVsbGVkIGlt" + + "YWdlIiBmcm9tIG52Y3IuaW8KYGBgCgotLS0KCiMjIEV4YW1wbGUgMzogRnVsbCBUZWFyZG93biBh" + + "bmQgUmVpbnN0YWxsCgpXaGVuIGEgZGVwbG95bWVudCBpcyBicm9rZW4gYW5kIHlvdSBuZWVkIGEg" + + "Y2xlYW4gc2xhdGUuCgojIyMgU3RlcCAxOiBEZXN0cm95IHRoZSBjb21wdXRlLXBsYW5lIHN0YWNr" + + "CgpgYGBiYXNoCm1ha2UgLUMgZGVwbG95L3N0YWNrcy9udmNmLWNvbXB1dGUtcGxhbmUgZGVzdHJv" + + "eSBcCiAgQ0xVU1RFUl9OQU1FPTxjbHVzdGVyLW5hbWU+IFwKICBIRUxNRklMRV9FTlY9PGVudj4g" + + "XAogIEtVQkVDT05GSUdfRklMRT08Y29tcHV0ZS1wbGFuZS1rdWJlY29uZmlnPgpgYGAKCklmIGNv" + + "bXB1dGUgY2xlYW51cCBpcyBzdHVjayBvbiBmaW5hbGl6ZXJzLCB1c2UgdGhlIGNvbXB1dGUtY29u" + + "dGV4dCBwcm9jZWR1cmUgaW4KW2RlYnVnZ2luZy5tZF0ocmVmZXJlbmNlcy9kZWJ1Z2dpbmcubWQj" + + "ZmFpbHVyZS1udmNhLWNsZWFudXAtc3R1Y2stZmluYWxpemVycykuCgojIyMgU3RlcCAyOiBEZXJl" + + "Z2lzdGVyIHRoZSBjb21wdXRlIGNsdXN0ZXIKClJlYWQgYGNsdXN0ZXJJRGAgYW5kIGBuY2FJRGAg" + + "ZnJvbQpgZGVwbG95L3N0YWNrcy9udmNmLWNvbXB1dGUtcGxhbmUvcmVnaXN0cmF0aW9uLzxjbHVz" + + "dGVyLW5hbWU+LXJlZ2lzdGVyLXZhbHVlcy55YW1sYC4KU2hvdyB0aGUgSUQgYW5kIGdldCBjb25m" + + "aXJtYXRpb24gYmVmb3JlIGRlbGV0aW5nIHRoZSBJQ01TIHJvdzoKCmBgYGJhc2gKPG52Y2YtY2xp" + + "PiAtLWNvbmZpZyA8Y29uZmlnPiBjbHVzdGVyIGRlbGV0ZSBcCiAgLS1jbHVzdGVyLWlkIDxjbHVz" + + "dGVyLWlkLWZyb20tcmVnaXN0cmF0aW9uLXZhbHVlcz4gXAogIC0tbmNhLWlkIDxuY2EtaWQ+IFwK" + + "ICAtLWlnbm9yZS1taXNzaW5nCmBgYAoKUmVwZWF0IHN0ZXBzIDEgYW5kIDIgZm9yIGV2ZXJ5IGNv" + + "bXB1dGUgY2x1c3Rlci4KCiMjIyBTdGVwIDM6IERlc3Ryb3kgdGhlIGNvbnRyb2wtcGxhbmUgc3Rh" + + "Y2sKClByZXNlcnZlIHRoZSBgY2VydC1tYW5hZ2VyYCBuYW1lc3BhY2UgYnkgZGVmYXVsdC4gTmFt" + + "ZXNwYWNlIHByZXNlcnZhdGlvbiBkb2VzCm5vdCBwcmVzZXJ2ZSB0aGUgSGVsbSByZWxlYXNlLiBC" + + "ZWZvcmUgcnVubmluZyBkZXN0cm95LCBpZGVudGlmeSB3aGV0aGVyCmNlcnQtbWFuYWdlciBpcyBl" + + "eHRlcm5hbC4gRm9yIGFuIGV4dGVybmFsIGluc3RhbGxhdGlvbiwgcmVxdWlyZSBlZmZlY3RpdmUK" + + "YGNlcnRNYW5hZ2VyLmVuYWJsZWQ6IGZhbHNlYCBhbmQgYWJvcnQgaWYgaXQgaXMgdHJ1ZS4gRm9y" + + "IGFuIGludGVuZGVkCnN0YWNrLW1hbmFnZWQgcmVsZWFzZSB3aXRoIGVmZmVjdGl2ZSBgY2VydE1h" + + "bmFnZXIuZW5hYmxlZDogdHJ1ZWAsIHZlcmlmeQptYXRjaGluZyBzdGFjayBIZWxtIHJlbGVhc2Ug" + + "bWV0YWRhdGEgYW5kIGFib3J0IG9uIG1pc3Npbmcgb3IgbWlzbWF0Y2hlZApldmlkZW5jZS4gT25s" + + "eSBwbGFuIG5hbWVzcGFjZSByZW1vdmFsIGFmdGVyIHZlcmlmeWluZyBuYW1lc3BhY2UgcHJvdmVu" + + "YW5jZSBhbmQKZ2V0dGluZyBleHBsaWNpdCBjb25maXJtYXRpb247IG90aGVyd2lzZSBkbyBub3Qg" + + "ZGVsZXRlIGl0LgoKYGBgYmFzaApLVUJFQ09ORklHPTxjb250cm9sLXBsYW5lLWt1YmVjb25maWc+" + + "IFwKbWFrZSAtQyBkZXBsb3kvc3RhY2tzL3NlbGYtbWFuYWdlZCBkZXN0cm95IFwKICBIRUxNRklM" + + "RV9FTlY9PGVudj4gXAogIEtVQkVDT05GSUdfRklMRT08Y29udHJvbC1wbGFuZS1rdWJlY29uZmln" + + "PgpgYGAKClBhc3MgYm90aCBrdWJlY29uZmlnIGZvcm1zIGJlY2F1c2UgY29udHJvbC1wbGFuZSBu" + + "YW1lc3BhY2UgY2xlYW51cCB1c2VzCmFtYmllbnQgYGt1YmVjdGxgLgoKIyMjIFN0ZXAgNDogVmVy" + + "aWZ5IGNsZWFuCgpgYGBiYXNoCmt1YmVjdGwgLS1jb250ZXh0IDxjb21wdXRlLXBsYW5lLWNvbnRl" + + "eHQ+IGdldCBucyB8IFwKICBncmVwIC1FICcobnZjYXxudmNmLWJhY2tlbmR8Z3JvdmV8ZHluYW1v" + + "KScKa3ViZWN0bCAtLWNvbnRleHQgPGNvbnRyb2wtcGxhbmUtY29udGV4dD4gZ2V0IG5zIHwgXAog" + + "IGdyZXAgLUUgJyhjYXNzYW5kcmF8bmF0c3x2YXVsdHxudmNmfGFwaS1rZXlzfGVzc3xzaXMpJwoj" + + "IEJvdGggY29tbWFuZHMgc2hvdWxkIHJldHVybiBlbXB0eS4KYGBgCgojIyMgU3RlcCA1OiBSZWlu" + + "c3RhbGwgaW4gc3BsaXQgb3JkZXIKCkZvbGxvdyBbQ2xlYW4gSW5zdGFsbGF0aW9uXShTS0lMTC5t" + + "ZCNjbGVhbi1pbnN0YWxsYXRpb24pLCB0aGVuIHJldHVybiB0byB0aGUKc2FtZSBoYW5kb2ZmIGlu" + + "IFtTcGxpdCBDb21wdXRlLVBsYW5lIEluc3RhbGxhdGlvbl0ocmVmZXJlbmNlcy9jb21wdXRlLXBs" + + "YW5lLWluc3RhbGxhdGlvbi5tZCkuCgotLS0KCiMjIEV4YW1wbGUgNDogUmVjb3ZlciBmcm9tIGEg" + + "R2F0ZXdheSBFbmRwb2ludCBDaGFuZ2UKClRoZSBzZXBhcmF0ZWx5IHByb3Zpc2lvbmVkIEdhdGV3" + + "YXkgb3IgaXRzIGxvYWQgYmFsYW5jZXIgd2FzIHJlY3JlYXRlZCBhbmQgZ290IGEgbmV3IGVuZHBv" + + "aW50LgoKIyMjIFN0ZXAgMTogR2V0IHRoZSBuZXcgZW5kcG9pbnQKCmBgYGJhc2gKR0FURVdBWV9B" + + "RERSPSQoa3ViZWN0bCAtLWNvbnRleHQgPGNvbnRyb2wtcGxhbmUtY29udGV4dD4gZ2V0IGdhdGV3" + + "YXkgXAogIG52Y2YtZ2F0ZXdheSAtbiBlbnZveS1nYXRld2F5IFwKICAtbyBqc29ucGF0aD0ney5z" + + "dGF0dXMuYWRkcmVzc2VzWzBdLnZhbHVlfScpCnRlc3QgLW4gIiRHQVRFV0FZX0FERFIiCmBgYAoK" + + "IyMjIFN0ZXAgMjogVXBkYXRlIEROUyBhbmQgZGlyZWN0IGFkZHJlc3MgZmllbGRzCgpLZWVwIGBn" + + "bG9iYWwuZG9tYWluYCwgcm91dGUgaG9zdG5hbWVzLCBhbmQgQ0xJIEhvc3QgZmllbGRzIHVuY2hh" + + "bmdlZC4gUG9pbnQgdGhlCkROUyByZWNvcmRzIGZvciByZW5kZXJlZCByb3V0ZSBob3N0bmFtZXMs" + + "IHN1Y2ggYXMgYGFwaS48ZG9tYWluPmAgYW5kCmAqLmludm9jYXRpb24uPGRvbWFpbj5gLCB0byBg" + + "R0FURVdBWV9BRERSYC4gRm9yIGEgdGVtcG9yYXJ5IGVudmlyb25tZW50IHdpdGhvdXQKRE5TLCBr" + + "ZWVwIGl0cyByZXNlcnZlZCByb3V0ZSBzdWZmaXggYW5kIGNvbm5lY3QgdG8gYEdBVEVXQVlfQURE" + + "UmAgd2l0aCB0aGUKbWF0Y2hpbmcgYEhvc3RgIGhlYWRlci4KCkZvciBhIHNwbGl0IGRlcGxveW1l" + + "bnQgY29uZmlndXJlZCB3aXRoIGRpcmVjdCBHYXRld2F5IGFkZHJlc3NlcywgcmVwbGFjZSBvbmx5" + + "CnRoZSBhZGRyZXNzLWJlYXJpbmcgdmFsdWVzOiBjb250cm9sLXBsYW5lIGBudmNmTmF0c1NlcnZp" + + "Y2VVUkxgLCBjb21wdXRlLXBsYW5lCklDTVMsIFJlVmFsLCBhbmQgTkFUUyBVUkxzLCBhbmQgQ0xJ" + + "IFVSTCBmaWVsZHMuIEtlZXAgdGhlaXIgZG9tYWluIGFuZCBIb3N0Cm92ZXJyaWRlcyB1bmNoYW5n" + + "ZWQuIFJlZnJlc2ggcmVnaXN0cmF0aW9uIGFuZCBpbnN0YWxsYXRpb24gdGhyb3VnaCB0aGUgc2Ft" + + "ZQpoYW5kb2ZmIHVzZWQgb3JpZ2luYWxseS4gU2VlCltTcGxpdCBDb21wdXRlLVBsYW5lIEluc3Rh" + + "bGxhdGlvbl0ocmVmZXJlbmNlcy9jb21wdXRlLXBsYW5lLWluc3RhbGxhdGlvbi5tZCkKZm9yIHRo" + + "ZSBmaWVsZHMgYW5kIGNvbXBsZXRlIGNvbW1hbmRzLgoKIyMjIFN0ZXAgMzogVmVyaWZ5IGJvdGgg" + + "Y29udGV4dHMKCmBgYGJhc2gKZGlnICtzaG9ydCAiYXBpLjxkb21haW4+IgpjdXJsIC1IICJIb3N0" + + "OiBhcGkuPGRvbWFpbj4iICJodHRwOi8vJEdBVEVXQVlfQUREUi9oZWFsdGgiCmt1YmVjdGwgLS1j" + + "b250ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRleHQ+IGdldCBnYXRld2F5IG52Y2YtZ2F0ZXdheSBc" + + "CiAgLW4gZW52b3ktZ2F0ZXdheSAtbyB3aWRlCmt1YmVjdGwgLS1jb250ZXh0IDxjb250cm9sLXBs" + + "YW5lLWNvbnRleHQ+IGdldCBodHRwcm91dGVzIC1BCmt1YmVjdGwgLS1jb250ZXh0IDxjb250cm9s" + + "LXBsYW5lLWNvbnRleHQ+IGdldCB0Y3Byb3V0ZXMgLUEKa3ViZWN0bCAtLWNvbnRleHQgPGNvbXB1" + + "dGUtcGxhbmUtY29udGV4dD4gcm9sbG91dCBzdGF0dXMgXAogIGRlcGxveW1lbnQvbnZjYS1vcGVy" + + "YXRvciAtbiBudmNhLW9wZXJhdG9yIC0tdGltZW91dD0xMG0Ka3ViZWN0bCAtLWNvbnRleHQgPGNv" + + "bXB1dGUtcGxhbmUtY29udGV4dD4gd2FpdCBcCiAgbnZjZmJhY2tlbmQvPGNvbXB1dGUtcGxhbmUt" + + "Y2x1c3Rlci1uYW1lPiAtbiBudmNhLW9wZXJhdG9yIFwKICAtLWZvcj1qc29ucGF0aD0ney5zdGF0" + + "dXMuYWdlbnRTdGF0dXN9Jz1oZWFsdGh5IC0tdGltZW91dD0xMG0KYGBgCgotLS0KCiMjIEV4YW1w" + + "bGUgNTogRGVwbG95IE9ubHkgRGVwZW5kZW5jaWVzCgpVc2VmdWwgZm9yIHRlc3Rpbmcgb3Igd2hl" + + "biBpdGVyYXRpbmcgb24gc2VydmljZSBjb25maWd1cmF0aW9uLgoKYGBgYmFzaAojIERlcGxveSBq" + + "dXN0IE5BVFMsIENhc3NhbmRyYSwgT3BlbkJhbwpIRUxNRklMRV9FTlY9PGVudj4gaGVsbWZpbGUg" + + "LS1zZWxlY3RvciByZWxlYXNlLWdyb3VwPWRlcGVuZGVuY2llcyBzeW5jCgojIENoZWNrIHN0YXR1" + + "cwprdWJlY3RsIGdldCBwb2RzIC1uIG5hdHMtc3lzdGVtCmt1YmVjdGwgZ2V0IHBvZHMgLW4gY2Fz" + + "c2FuZHJhLXN5c3RlbQprdWJlY3RsIGdldCBwb2RzIC1uIHZhdWx0LXN5c3RlbQoKIyBEZXBsb3kg" + + "anVzdCBvbmUgc3BlY2lmaWMgcmVsZWFzZQpIRUxNRklMRV9FTlY9PGVudj4gaGVsbWZpbGUgLS1z" + + "ZWxlY3RvciBuYW1lPWNhc3NhbmRyYSBzeW5jCmBgYAoKIyMjIFNlbGVjdG9yIHJlZmVyZW5jZQoK" + + "fCBTZWxlY3RvciB8IFJlbGVhc2VzIHwKfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwKfCBgcmVsZWFz" + + "ZS1ncm91cD1kZXBlbmRlbmNpZXNgIHwgbmF0cywgY2Fzc2FuZHJhLCBvcGVuYmFvLXNlcnZlciB8" + + "CnwgYHJlbGVhc2UtZ3JvdXA9c2VydmljZXNgIHwgYXBpLWtleXMsIHNpcywgYXBpLCBpbnZvY2F0" + + "aW9uLXNlcnZpY2UsIGdycGMtcHJveHksIGVzcy1hcGksIG5vdGFyeS1zZXJ2aWNlLCByZXZhbCwg" + + "b3B0aW9uYWwgbGxtLXJlcXVlc3Qtcm91dGVyIGFuZCBsbG0tYXBpLWdhdGV3YXkgd2hlbiBgbGxt" + + "LmVuYWJsZWQ9dHJ1ZWAsIG9wdGlvbmFsIHZhbml0eS1nYXRld2F5IG9ubHkgaW4gc3RhY2sgcGFj" + + "a2FnZXMgdGhhdCBpbmNsdWRlIHRoZSBhZGRvbiBhbmQgaGF2ZSBgYWRkb25zLnZhbml0eUdhdGV3" + + "YXkuZW5hYmxlZD10cnVlYCwgb3B0aW9uYWwgbnZjZi11aSBvbmx5IGluIHN0YWNrIHBhY2thZ2Vz" + + "IHRoYXQgaW5jbHVkZSB0aGUgYWRkb24gYW5kIGhhdmUgYGFkZG9ucy5udmNmVWkuZW5hYmxlZD10" + + "cnVlYCB8CnwgYG5hbWU9bGxtLXJlcXVlc3Qtcm91dGVyYCB8IERlcGxveSBqdXN0IHRoZSBMTE0g" + + "cmVxdWVzdCByb3V0ZXIgd2hlbiBgbGxtLmVuYWJsZWQ9dHJ1ZWAgfAp8IGBuYW1lPWxsbS1hcGkt" + + "Z2F0ZXdheWAgfCBEZXBsb3kganVzdCB0aGUgTExNIEFQSSBnYXRld2F5IHdoZW4gYGxsbS5lbmFi" + + "bGVkPXRydWVgIHwKfCBgbmFtZT12YW5pdHktZ2F0ZXdheWAgfCBEZXBsb3kganVzdCBWYW5pdHkg" + + "R2F0ZXdheSBvbmx5IHdoZW4gdGhlIHN0YWNrIHBhY2thZ2UgaW5jbHVkZXMgdGhhdCByZWxlYXNl" + + "IGFuZCBgYWRkb25zLnZhbml0eUdhdGV3YXkuZW5hYmxlZD10cnVlYCB8CnwgYG5hbWU9bnZjZi11" + + "aWAgfCBEZXBsb3kgTlZDRiBVSSBvbmx5IHdoZW4gdGhlIHN0YWNrIHBhY2thZ2UgaW5jbHVkZXMg" + + "dGhhdCByZWxlYXNlIGFuZCBgYWRkb25zLm52Y2ZVaS5lbmFibGVkPXRydWVgIHwKfCBgcmVsZWFz" + + "ZS1ncm91cD1pbmdyZXNzYCB8IGluZ3Jlc3MgKGdhdGV3YXkgcm91dGVzKSB8CnwgYG5hbWU9PHJl" + + "bGVhc2U+YCB8IEFueSBpbmRpdmlkdWFsIHJlbGVhc2UgYnkgbmFtZSB8CgpOb3RlOiBgYWRtaW4t" + + "aXNzdWVyLXByb3h5YCBkb2VzIG5vdCBoYXZlIGEgcmVsZWFzZS1ncm91cCBsYWJlbC4gVGFyZ2V0" + + "IGl0IHdpdGggYC0tc2VsZWN0b3IgbmFtZT1hZG1pbi1pc3N1ZXItcHJveHlgLgpQSwcIAlJOQH8o" + + "AAB/KAAAUEsDBBQACAAAAAAAIQAAAAAAAAAAAAAAAABMAAkAZGF0YS9udmNmLXNlbGYtbWFuYWdl" + + "ZC1pbnN0YWxsYXRpb24vcmVmZXJlbmNlcy9jb21wdXRlLXBsYW5lLWluc3RhbGxhdGlvbi5tZFVU" + + "BQABAKbOEiMgU3BsaXQgQ29tcHV0ZS1QbGFuZSBJbnN0YWxsYXRpb24KClRoZSBjb250cm9sIHBs" + + "YW5lIGFuZCBjb21wdXRlIHBsYW5lIGFyZSBzZXBhcmF0ZSBzdGFja3MuIEluc3RhbGwgdGhlIGNv" + + "bnRyb2wKcGxhbmUgZmlyc3QsIHRoZW4gcmVnaXN0ZXIgYW5kIGluc3RhbGwgZWFjaCBjb21wdXRl" + + "IGNsdXN0ZXIuIENob29zZSBvbmUgaGFuZG9mZgpiZWxvdyBhbmQgdXNlIGl0IGZvciB0aGUgZnVs" + + "bCBsaWZlY3ljbGUuIERvIG5vdCBjb21iaW5lIGEgQ0xJLWdlbmVyYXRlZCBwcm9maWxlCndpdGgg" + + "dGhlIEhlbG1maWxlIHZhbHVlcyBmbG93LgoKIyMgQ2hvb3NlIGEgSGFuZG9mZgoKfCBGbG93IHwg" + + "U291cmNlIG9mIGNvbnRyb2wtcGxhbmUgZW5kcG9pbnRzIHwgUmVnaXN0cmF0aW9uIGFydGlmYWN0" + + "IHwKfC0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0t" + + "LS0tLS0tLS0tLS0tLXwKfCBIZWxtZmlsZSB2YWx1ZXMgfCBTZXBhcmF0ZSBjb250cm9sLXBsYW5l" + + "IGFuZCBjb21wdXRlLXBsYW5lIGVudmlyb25tZW50IGZpbGVzIHwgYGRlcGxveS9zdGFja3MvbnZj" + + "Zi1jb21wdXRlLXBsYW5lL3JlZ2lzdHJhdGlvbi88Y2x1c3Rlcj4tcmVnaXN0ZXItdmFsdWVzLnlh" + + "bWxgIHwKfCBDTEkgcHJvZmlsZSB8IENMSS1nZW5lcmF0ZWQgYGRlcGxveS9zdGFja3Mvc2VsZi1t" + + "YW5hZ2VkL291dC9jb250cm9sLXBsYW5lLXByb2ZpbGUueWFtbGAgfCBDTEktZ2VuZXJhdGVkIGBk" + + "ZXBsb3kvc3RhY2tzL252Y2YtY29tcHV0ZS1wbGFuZS9vdXQvPGNsdXN0ZXI+LXJlZ2lzdGVyLXZh" + + "bHVlcy55YW1sYCB8CgpUaGUgQ0xJIHByb2ZpbGUgaXMgbWFuZGF0b3J5IGZvciB0aGUgQ0xJIGZs" + + "b3cgYW5kIG11c3Qgbm90IGJlIGhhbmQtYXV0aG9yZWQuClRoZSBIZWxtZmlsZSBmbG93IGRvZXMg" + + "bm90IGNvbnN1bWUgYSBjb250cm9sLXBsYW5lIHByb2ZpbGUuCgpDb21tYW5kcyBiZWxvdyB1c2Ug" + + "bW9ub3JlcG8gcGF0aHMgZnJvbSB0aGUgcmVwb3NpdG9yeSByb290LiBPcGVyYXRvcnMgdXNpbmcK" + + "ZXh0cmFjdGVkIHBhY2thZ2VzIG5lZWQgbWF0Y2hpbmctdmVyc2lvbiBgbnZjZi1zZWxmLW1hbmFn" + + "ZWQtc3RhY2tgIGFuZApgbnZjZi1jb21wdXRlLXBsYW5lLXN0YWNrYCBidW5kbGVzLiBTdWJzdGl0" + + "dXRlIHRob3NlIGJ1bmRsZSByb290cyBmb3IKYGRlcGxveS9zdGFja3Mvc2VsZi1tYW5hZ2VkYCBh" + + "bmQgYGRlcGxveS9zdGFja3MvbnZjZi1jb21wdXRlLXBsYW5lYC4KCiMjIEhlbG1maWxlIFZhbHVl" + + "cyBGbG93CgpDcmVhdGUgYm90aCBlbnZpcm9ubWVudCBmaWxlcyBiZWZvcmUgaW5zdGFsbGF0aW9u" + + "OgoKLSBgZGVwbG95L3N0YWNrcy9zZWxmLW1hbmFnZWQvZW52aXJvbm1lbnRzLzxlbnY+LnlhbWxg" + + "IGZvciBjb250cm9sLXBsYW5lCiAgcmVnaXN0cnksIGRvbWFpbiwgR2F0ZXdheSwgcm91dGVzLCBh" + + "bmQgc2VydmljZSBzZXR0aW5ncy4KLSBgZGVwbG95L3N0YWNrcy9udmNmLWNvbXB1dGUtcGxhbmUv" + + "ZW52aXJvbm1lbnRzLzxlbnY+LnlhbWxgIGZvciBjb21wdXRlLXBsYW5lCiAgcmVnaXN0cnksIHB1" + + "bGwgc2VjcmV0cywgYW5kIGNvbXB1dGUtcmVhY2hhYmxlIElDTVMsIFJlVmFsLCBhbmQgTkFUUyB2" + + "YWx1ZXMuCgpGb3IgRUtTLCB1c2UgdGhlIGNhbm9uaWNhbApbQ1NQIEVuZC10by1FbmQgRXhhbXBs" + + "ZV0oaHR0cHM6Ly9kb2NzLm52aWRpYS5jb20vbnZjZi92MC42LjAtcmMvY3NwLWVuZC10by1lbmQt" + + "ZXhhbXBsZSkuClRoZSBjb250cm9sLXBsYW5lIGVudmlyb25tZW50IGtlZXBzIHRoZSBFbnZveSBH" + + "YXRld2F5IGNvbnRyb2xsZXIgaW4KYGVudm95LWdhdGV3YXktc3lzdGVtYCwgYXR0YWNoZXMgcm91" + + "dGVzIHRvIGBHYXRld2F5L252Y2YtZ2F0ZXdheWAgaW4KYGVudm95LWdhdGV3YXlgLCBhbmQgZW5h" + + "YmxlcyB0aGUgTkFUUyByb3V0ZS4gVGhlIGNvbXB1dGUtcGxhbmUgZW52aXJvbm1lbnQgdXNlcwp0" + + "aGUgZXh0ZXJuYWwgYWRkcmVzcyBwbHVzIHRoZSBzZXJ2aWNlIGhvc3Qgb3ZlcnJpZGVzLiBIZXJl" + + "LApgPGdhdGV3YXktYWRkcmVzcz5gIGlzIHRoZSBOTEIgYWRkcmVzcyBhbmQgYDxnYXRld2F5LWRv" + + "bWFpbj5gIGlzIHRoZSBETlMgYmFzZQp3aG9zZSBzZXJ2aWNlIHN1YmRvbWFpbnMgcmVzb2x2ZSB0" + + "byB0aGF0IE5MQjoKCmBgYHlhbWwKIyBkZXBsb3kvc3RhY2tzL3NlbGYtbWFuYWdlZC9lbnZpcm9u" + + "bWVudHMvPGVudj4ueWFtbApnbG9iYWw6CiAgZG9tYWluOiAiPGdhdGV3YXktZG9tYWluPiIKICB3" + + "b3JrZXJFbmRwb2ludHM6CiAgICBudmNmU2VydmljZVVSTDogImh0dHA6Ly9hcGkuPGdhdGV3YXkt" + + "ZG9tYWluPiIKICAgIG52Y2ZHcnBjU2VydmljZVVSTDogImh0dHA6Ly93b3JrZXItYXBpLjxnYXRl" + + "d2F5LWRvbWFpbj4iCiAgICBudmNmTmF0c1NlcnZpY2VVUkw6ICJuYXRzOi8vPGdhdGV3YXktYWRk" + + "cmVzcz46NDIyMiIKICAgIG52Y3RTZXJ2aWNlVVJMOiAiaHR0cDovL3Rhc2tzLjxnYXRld2F5LWRv" + + "bWFpbj4iCiAgICBudmN0R3JwY1NlcnZpY2VVUkw6ICJodHRwOi8vd29ya2VyLXRhc2tzLjxnYXRl" + + "d2F5LWRvbWFpbj4iCiAgICBpbnZvY2F0aW9uU2VydmljZVVSTDogImh0dHA6Ly9pbnZvY2F0aW9u" + + "LjxnYXRld2F5LWRvbWFpbj4iCgpncnBjcHJveHk6CiAgbnZjZkdycGNTZXJ2aWNlVVJMOiAiaHR0" + + "cDovL2FwaS5udmNmLnN2Yy5jbHVzdGVyLmxvY2FsOjkwOTAiCgppbmdyZXNzOgogIGdhdGV3YXlB" + + "cGk6CiAgICBjb250cm9sbGVyTmFtZXNwYWNlOiBlbnZveS1nYXRld2F5LXN5c3RlbQogICAgZ2F0" + + "ZXdheXM6CiAgICAgIHNoYXJlZDoge25hbWU6IG52Y2YtZ2F0ZXdheSwgbmFtZXNwYWNlOiBlbnZv" + + "eS1nYXRld2F5fQogICAgICBncnBjOiB7bmFtZTogbnZjZi1nYXRld2F5LCBuYW1lc3BhY2U6IGVu" + + "dm95LWdhdGV3YXl9CiAgICAgIG5hdHM6CiAgICAgICAgbmFtZTogbnZjZi1nYXRld2F5CiAgICAg" + + "ICAgbmFtZXNwYWNlOiBlbnZveS1nYXRld2F5CiAgICAgICAgbGlzdGVuZXJOYW1lOiBuYXRzCiAg" + + "ICByb3V0ZXM6CiAgICAgIG52Y2ZBcGk6CiAgICAgICAgZ3JwYzoKICAgICAgICAgIGVuYWJsZWQ6" + + "IHRydWUKICAgICAgICAgIGhvc3RuYW1lczogWyJ3b3JrZXItYXBpLjxnYXRld2F5LWRvbWFpbj4i" + + "XQogICAgICBudmN0QXBpOgogICAgICAgIGdycGM6CiAgICAgICAgICBlbmFibGVkOiB0cnVlCiAg" + + "ICAgICAgICBob3N0bmFtZXM6IFsid29ya2VyLXRhc2tzLjxnYXRld2F5LWRvbWFpbj4iXQogICAg" + + "ICBuYXRzOgogICAgICAgIGVuYWJsZWQ6IHRydWUKCm9wZW5iYW86CiAgbWlncmF0aW9uczoKICAg" + + "IGlzc3VlckRpc2NvdmVyeToKICAgICAgZW5hYmxlZDogdHJ1ZQpgYGAKCmBgYHlhbWwKIyBkZXBs" + + "b3kvc3RhY2tzL252Y2YtY29tcHV0ZS1wbGFuZS9lbnZpcm9ubWVudHMvPGVudj4ueWFtbApnbG9i" + + "YWw6CiAgbnZjYU9wZXJhdG9yOgogICAgc2VsZk1hbmFnZWQ6CiAgICAgIGljbXNTZXJ2aWNlVVJM" + + "OiAiaHR0cDovLzxnYXRld2F5LWFkZHJlc3M+IgogICAgICBpY21zU2VydmljZUhvc3RIZWFkZXJP" + + "dmVycmlkZTogInNpcy48Z2F0ZXdheS1kb21haW4+IgogICAgICByZXZhbFNlcnZpY2VVUkw6ICJo" + + "dHRwOi8vPGdhdGV3YXktYWRkcmVzcz4iCiAgICAgIHJldmFsU2VydmljZUhvc3RIZWFkZXJPdmVy" + + "cmlkZTogInJldmFsLjxnYXRld2F5LWRvbWFpbj4iCiAgICAgIG5hdHNVUkw6ICJuYXRzOi8vPGdh" + + "dGV3YXktYWRkcmVzcz46NDIyMiIKICAgICAgbmF0c0hvc3RPdmVycmlkZTogIm5hdHMuPGdhdGV3" + + "YXktZG9tYWluPiIKYGBgCgpQcmV2aWV3IGFuZCBpbnN0YWxsIHRoZSBjb250cm9sIHBsYW5lIGFn" + + "YWluc3QgaXRzIGNvbnRleHQ6CgpgYGBiYXNoCm1ha2UgLUMgZGVwbG95L3N0YWNrcy9zZWxmLW1h" + + "bmFnZWQgdGVtcGxhdGUgXAogIEhFTE1GSUxFX0VOVj08ZW52PiBcCiAgS1VCRUNPTkZJR19GSUxF" + + "PTxjb250cm9sLXBsYW5lLWt1YmVjb25maWc+CgptYWtlIC1DIGRlcGxveS9zdGFja3Mvc2VsZi1t" + + "YW5hZ2VkIGluc3RhbGwgXAogIEhFTE1GSUxFX0VOVj08ZW52PiBcCiAgS1VCRUNPTkZJR19GSUxF" + + "PTxjb250cm9sLXBsYW5lLWt1YmVjb25maWc+CmBgYAoKQmVmb3JlIHJlZ2lzdGVyaW5nIHRocm91" + + "Z2ggYSBiYXJlIEdhdGV3YXkgYWRkcmVzcywgY3JlYXRlIG9yIHVwZGF0ZSB0aGUgQ0xJCmNvbmZp" + + "ZyBwYXNzZWQgYXMgYE5WQ0ZfQ0xJX0NPTkZJR2A6CgpgYGB5YW1sCmJhc2VfaHR0cF91cmw6ICJo" + + "dHRwOi8vPGdhdGV3YXktYWRkcmVzcz4iCmludm9rZV91cmw6ICJodHRwOi8vPGdhdGV3YXktYWRk" + + "cmVzcz4iCmJhc2VfZ3JwY191cmw6ICI8Z2F0ZXdheS1hZGRyZXNzPjoxMDA4MSIKYXBpX2tleXNf" + + "c2VydmljZV91cmw6ICJodHRwOi8vPGdhdGV3YXktYWRkcmVzcz4iCmljbXNfdXJsOiAiaHR0cDov" + + "LzxnYXRld2F5LWFkZHJlc3M+IgphcGlfaG9zdDogImFwaS48Z2F0ZXdheS1kb21haW4+IgphcGlf" + + "a2V5c19ob3N0OiAiYXBpLWtleXMuPGdhdGV3YXktZG9tYWluPiIKaW52b2tlX2hvc3Q6ICJpbnZv" + + "Y2F0aW9uLjxnYXRld2F5LWRvbWFpbj4iCmljbXNfaG9zdDogInNpcy48Z2F0ZXdheS1kb21haW4+" + + "IgpgYGAKCkhvc3QgZmllbGRzIGNvbnRhaW4gaG9zdG5hbWVzIG9ubHksIHdpdGhvdXQgYSBVUkwg" + + "c2NoZW1lLiBgSUNNU19VUkxgIG1hcHMgb25seQp0byB0aGUgcmVnaXN0cmF0aW9uIGNvbW1hbmQn" + + "cyBgLS1pY21zLXVybGA7IGBpY21zX2hvc3RgIGluIHRoZSBjb25maWcgc3VwcGxpZXMKdGhlIEdh" + + "dGV3YXkgSG9zdCBoZWFkZXIuIFRoZXJlIGlzIG5vIGAtLWljbXMtaG9zdGAgTWFrZSBvciBDTEkg" + + "ZmxhZy4KClJlZ2lzdGVyIGZyb20gdGhlIGNvbXB1dGUgY29udGV4dCwgdGhlbiBpbnN0YWxsIHRo" + + "ZSBjb21wdXRlIHBsYW5lOgoKYGBgYmFzaAptYWtlIC1DIGRlcGxveS9zdGFja3MvbnZjZi1jb21w" + + "dXRlLXBsYW5lIHJlZ2lzdGVyLWNsdXN0ZXIgXAogIENMVVNURVJfTkFNRT08Y2x1c3Rlci1uYW1l" + + "PiBcCiAgTkNBX0lEPTxuY2EtaWQ+IFwKICBDTFVTVEVSX1JFR0lPTj08cmVnaW9uPiBcCiAgSUNN" + + "U19VUkw9aHR0cDovLzxnYXRld2F5LWFkZHJlc3M+IFwKICBLVUJFQ09ORklHX0ZJTEU9PGNvbXB1" + + "dGUtcGxhbmUta3ViZWNvbmZpZz4gXAogIE5WQ0ZfQ0xJPTxwYXRoLXRvLW52Y2YtY2xpPiBcCiAg" + + "TlZDRl9DTElfQ09ORklHPTxwYXRoLXRvLW52Y2YtY2xpLWNvbmZpZz4KCm1ha2UgLUMgZGVwbG95" + + "L3N0YWNrcy9udmNmLWNvbXB1dGUtcGxhbmUgaW5zdGFsbCBcCiAgQ0xVU1RFUl9OQU1FPTxjbHVz" + + "dGVyLW5hbWU+IFwKICBIRUxNRklMRV9FTlY9PGVudj4gXAogIEtVQkVDT05GSUdfRklMRT08Y29t" + + "cHV0ZS1wbGFuZS1rdWJlY29uZmlnPgpgYGAKClJlZ2lzdHJhdGlvbiBkaXNjb3ZlcnMgdGhlIE9J" + + "REMgaXNzdWVyIGFuZCBKV0tTIGZyb20gdGhlIGNvbXB1dGUga3ViZSBjb250ZXh0LgpJbiBhIG11" + + "bHRpLWNsdXN0ZXIgZGVwbG95bWVudCwgYEtVQkVDT05GSUdfRklMRWAgaXMgcmVxdWlyZWQgb24g" + + "Ym90aApjb21wdXRlLXBsYW5lIGNvbW1hbmRzLiBJbiBhIHNhbWUtY2x1c3RlciBkZXBsb3ltZW50" + + "IGl0IG1heSBiZSBvbWl0dGVkIG9ubHkKd2hlbiB0aGUgYW1iaWVudCBjb250ZXh0IGlzIGFscmVh" + + "ZHkgdGhlIHRhcmdldCBjbHVzdGVyLgoKIyMgQ0xJIFByb2ZpbGUgRmxvdwoKUnVuIHRoZSBDTEkg" + + "Y29udHJvbC1wbGFuZSBpbnN0YWxsIGZpcnN0LiBJdCBjcmVhdGVzIHRoZSBwcm9maWxlIGNvbnN1" + + "bWVkIGJ5CmNvbXB1dGUtcGxhbmUgcmVnaXN0cmF0aW9uOgoKYGBgYmFzaApudmNmLWNsaSAtLWNv" + + "bmZpZyA8Y29uZmlnPiBzZWxmLWhvc3RlZCBcCiAgLS1jb250cm9sLXBsYW5lLXN0YWNrIGRlcGxv" + + "eS9zdGFja3Mvc2VsZi1tYW5hZ2VkIFwKICAtLWNvbXB1dGUtcGxhbmUtc3RhY2sgZGVwbG95L3N0" + + "YWNrcy9udmNmLWNvbXB1dGUtcGxhbmUgXAogIC0tZW52IDxlbnY+IFwKICAtLXBsYWluIFwKICAt" + + "LWNvbnRyb2wtcGxhbmUtY29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBcCiAgLS1jb21w" + + "dXRlLXBsYW5lLWNvbnRleHQgPGNvbXB1dGUtcGxhbmUtY29udGV4dD4gXAogIGluc3RhbGwgLS1j" + + "b250cm9sLXBsYW5lIFwKICAtLWNsdXN0ZXItbmFtZSA8Y29udHJvbC1wbGFuZS1jbHVzdGVyLW5h" + + "bWU+IFwKICAtLXJlZ2lvbiA8cmVnaW9uPiBcCiAgLS1uY2EtaWQgPG5jYS1pZD4KCnRlc3QgLXMg" + + "ZGVwbG95L3N0YWNrcy9zZWxmLW1hbmFnZWQvb3V0L2NvbnRyb2wtcGxhbmUtcHJvZmlsZS55YW1s" + + "CmBgYAoKVXNlIHRoZSBmdWxsIHBlcnNpc3RlbnQgcHJlZml4IGZvciBib3RoIGNvbXB1dGUtcGxh" + + "bmUgY29tbWFuZHM6CgpgYGBiYXNoCm52Y2YtY2xpIC0tY29uZmlnIDxjb25maWc+IHNlbGYtaG9z" + + "dGVkIFwKICAtLWNvbnRyb2wtcGxhbmUtc3RhY2sgZGVwbG95L3N0YWNrcy9zZWxmLW1hbmFnZWQg" + + "XAogIC0tY29tcHV0ZS1wbGFuZS1zdGFjayBkZXBsb3kvc3RhY2tzL252Y2YtY29tcHV0ZS1wbGFu" + + "ZSBcCiAgLS1lbnYgPGVudj4gXAogIC0tcGxhaW4gXAogIGNvbXB1dGUtcGxhbmUgcmVnaXN0ZXIg" + + "XAogIC0tY29udHJvbC1wbGFuZS1wcm9maWxlIGRlcGxveS9zdGFja3Mvc2VsZi1tYW5hZ2VkL291" + + "dC9jb250cm9sLXBsYW5lLXByb2ZpbGUueWFtbCBcCiAgLS1jbHVzdGVyLW5hbWUgPGNvbXB1dGUt" + + "cGxhbmUtY2x1c3Rlci1uYW1lPiBcCiAgLS1rdWJlLWNvbnRleHQgPGNvbXB1dGUtcGxhbmUtY29u" + + "dGV4dD4gXAogIC0tcmVnaW9uIDxyZWdpb24+IFwKICAtLW91dHB1dCBkZXBsb3kvc3RhY2tzL252" + + "Y2YtY29tcHV0ZS1wbGFuZS9vdXQvPGNvbXB1dGUtcGxhbmUtY2x1c3Rlci1uYW1lPi1yZWdpc3Rl" + + "ci12YWx1ZXMueWFtbAoKbnZjZi1jbGkgLS1jb25maWcgPGNvbmZpZz4gc2VsZi1ob3N0ZWQgXAog" + + "IC0tY29udHJvbC1wbGFuZS1zdGFjayBkZXBsb3kvc3RhY2tzL3NlbGYtbWFuYWdlZCBcCiAgLS1j" + + "b21wdXRlLXBsYW5lLXN0YWNrIGRlcGxveS9zdGFja3MvbnZjZi1jb21wdXRlLXBsYW5lIFwKICAt" + + "LWVudiA8ZW52PiBcCiAgLS1wbGFpbiBcCiAgY29tcHV0ZS1wbGFuZSBpbnN0YWxsIFwKICAtLXZh" + + "bHVlcyBkZXBsb3kvc3RhY2tzL252Y2YtY29tcHV0ZS1wbGFuZS9vdXQvPGNvbXB1dGUtcGxhbmUt" + + "Y2x1c3Rlci1uYW1lPi1yZWdpc3Rlci12YWx1ZXMueWFtbCBcCiAgLS1rdWJlLWNvbnRleHQgPGNv" + + "bXB1dGUtcGxhbmUtY29udGV4dD4gXAogIC0tY2x1c3Rlci1uYW1lIDxjb21wdXRlLXBsYW5lLWNs" + + "dXN0ZXItbmFtZT4KYGBgCgpSZWdpc3RyYXRpb24gc2VsZWN0cyB0aGUgcHJvZmlsZSdzIGluLWNs" + + "dXN0ZXIgb3IgY29tcHV0ZS1yZWFjaGFibGUgZW5kcG9pbnRzCmZyb20gdGhlIGNvbXB1dGUgY29u" + + "dGV4dCBhbmQgcHJvYmVzIGl0cyBKV0tTLiBEbyBub3QgcmVwbGFjZSBwcm9maWxlIGVuZHBvaW50" + + "cwp3aXRoIGhhbmQtYXV0aG9yZWQgSGVsbWZpbGUgZW5kcG9pbnQgdmFsdWVzLgoKIyMgUHVsbCBT" + + "ZWNyZXRzCgpDcmVhdGUgdGhlIGNvbnRyb2wtcGxhbmUgc2VjcmV0IGluIHRoZXNlIG5hbWVzcGFj" + + "ZXMgb24gdGhlIGNvbnRyb2wtcGxhbmUKY29udGV4dDoKCmBgYHRleHQKY2Fzc2FuZHJhLXN5c3Rl" + + "bSBuYXRzLXN5c3RlbSBudmNmIGFwaS1rZXlzIGVzcyBzaXMgdmF1bHQtc3lzdGVtIGNlcnQtbWFu" + + "YWdlcgpgYGAKCk9uIHRoZSBjb21wdXRlIGNvbnRleHQsIGNyZWF0ZSB0aGUgc2VjcmV0IG9ubHkg" + + "aW4gYG52Y2Etb3BlcmF0b3JgIGFuZCByZWZlcmVuY2UKaXQgdGhyb3VnaCBgZ2xvYmFsLmltYWdl" + + "UHVsbFNlY3JldHNgIGluIHRoZSBjb21wdXRlLXBsYW5lIGVudmlyb25tZW50LiBUaGUgY2hhcnQK" + + "YW5kIG9wZXJhdG9yIHVzZSBpdCBpbiBgbnZjYS1vcGVyYXRvcmAgYW5kIG1pcnJvciBpdCB0byBg" + + "bnZjYS1zeXN0ZW1gLiBEbyBub3QgYWRkCmVpdGhlciBuYW1lc3BhY2UgdG8gdGhlIGNvbnRyb2wt" + + "cGxhbmUgbGlzdC4gRm9yIGNvbW1hbmRzIGFuZCBwb2xpY3kgZXhhbXBsZXMsCnNlZSBbcHVsbC1z" + + "ZWNyZXRzLm1kXShwdWxsLXNlY3JldHMubWQpLgoKIyMgVmVyaWZpY2F0aW9uCgpVc2UgdGhlIGV4" + + "cGxpY2l0IEdhdGV3YXkgbmFtZSBhbmQgbmFtZXNwYWNlOgoKYGBgYmFzaAprdWJlY3RsIC0tY29u" + + "dGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBnZXQgZ2F0ZXdheSBudmNmLWdhdGV3YXkgXAog" + + "IC1uIGVudm95LWdhdGV3YXkgLW8gd2lkZQprdWJlY3RsIC0tY29udGV4dCA8Y29udHJvbC1wbGFu" + + "ZS1jb250ZXh0PiBnZXQgdGNwcm91dGUgLW4gZW52b3ktZ2F0ZXdheQprdWJlY3RsIC0tY29udGV4" + + "dCA8Y29tcHV0ZS1wbGFuZS1jb250ZXh0PiByb2xsb3V0IHN0YXR1cyBcCiAgZGVwbG95bWVudC9u" + + "dmNhLW9wZXJhdG9yIC1uIG52Y2Etb3BlcmF0b3IgLS10aW1lb3V0PTEwbQprdWJlY3RsIC0tY29u" + + "dGV4dCA8Y29tcHV0ZS1wbGFuZS1jb250ZXh0PiB3YWl0IFwKICBudmNmYmFja2VuZC88Y29tcHV0" + + "ZS1wbGFuZS1jbHVzdGVyLW5hbWU+IC1uIG52Y2Etb3BlcmF0b3IgXAogIC0tZm9yPWpzb25wYXRo" + + "PSd7LnN0YXR1cy5hZ2VudFN0YXR1c30nPWhlYWx0aHkgLS10aW1lb3V0PTEwbQprdWJlY3RsIC0t" + + "Y29udGV4dCA8Y29tcHV0ZS1wbGFuZS1jb250ZXh0PiBnZXQgc2VjcmV0IDxwdWxsLXNlY3JldD4g" + + "LW4gbnZjYS1zeXN0ZW0KYGBgCgojIyBUZWFyZG93bgoKRGVzdHJveSBhbmQgZGVyZWdpc3RlciBl" + + "dmVyeSBjb21wdXRlIHBsYW5lIGJlZm9yZSB0aGUgY29udHJvbCBwbGFuZS4gQm90aApoYW5kb2Zm" + + "cyBjYW4gZGVzdHJveSB0aGUgY29udHJvbCBwbGFuZSwgc28gYXBwbHkgdGhpcyBwcmVmbGlnaHQg" + + "YmVmb3JlIGVpdGhlcgpvbmUuIFByZXNlcnZlIHRoZSBgY2VydC1tYW5hZ2VyYCBuYW1lc3BhY2Ug" + + "YnkgZGVmYXVsdC4gTmFtZXNwYWNlIHByZXNlcnZhdGlvbgpkb2VzIG5vdCBwcmVzZXJ2ZSB0aGUg" + + "SGVsbSByZWxlYXNlLiBJZGVudGlmeSB3aGV0aGVyIGNlcnQtbWFuYWdlciBpcyBleHRlcm5hbC4K" + + "Rm9yIGFuIGV4dGVybmFsIGluc3RhbGxhdGlvbiwgcmVxdWlyZSBlZmZlY3RpdmUgYGNlcnRNYW5h" + + "Z2VyLmVuYWJsZWQ6IGZhbHNlYAphbmQgYWJvcnQgaWYgaXQgaXMgdHJ1ZS4gRm9yIGFuIGludGVu" + + "ZGVkIHN0YWNrLW1hbmFnZWQgcmVsZWFzZSB3aXRoIGVmZmVjdGl2ZQpgY2VydE1hbmFnZXIuZW5h" + + "YmxlZDogdHJ1ZWAsIHZlcmlmeSBtYXRjaGluZyBzdGFjayBIZWxtIHJlbGVhc2UgbWV0YWRhdGEg" + + "YW5kCmFib3J0IG9uIG1pc3Npbmcgb3IgbWlzbWF0Y2hlZCBldmlkZW5jZS4gT25seSBwbGFuIG5h" + + "bWVzcGFjZSByZW1vdmFsIGFmdGVyCnZlcmlmeWluZyBuYW1lc3BhY2UgcHJvdmVuYW5jZSBhbmQg" + + "Z2V0dGluZyBleHBsaWNpdCBjb25maXJtYXRpb247IG90aGVyd2lzZQpkbyBub3QgZGVsZXRlIGl0" + + "LgoKRm9yIHRoZSBIZWxtZmlsZSB2YWx1ZXMgZmxvdywgcmV0YWluIGVhY2ggcmVnaXN0cmF0aW9u" + + "IHZhbHVlcyBmaWxlIHVudGlsCmNsZWFudXAgaXMgdmVyaWZpZWQ6CgpgYGBiYXNoCm1ha2UgLUMg" + + "ZGVwbG95L3N0YWNrcy9udmNmLWNvbXB1dGUtcGxhbmUgZGVzdHJveSBcCiAgQ0xVU1RFUl9OQU1F" + + "PTxjbHVzdGVyLW5hbWU+IFwKICBIRUxNRklMRV9FTlY9PGVudj4gXAogIEtVQkVDT05GSUdfRklM" + + "RT08Y29tcHV0ZS1wbGFuZS1rdWJlY29uZmlnPgoKPG52Y2YtY2xpPiAtLWNvbmZpZyA8Y29uZmln" + + "PiBjbHVzdGVyIGRlbGV0ZSBcCiAgLS1jbHVzdGVyLWlkIDxjbHVzdGVyLWlkLWZyb20tcmVnaXN0" + + "cmF0aW9uLXZhbHVlcz4gXAogIC0tbmNhLWlkIDxuY2EtaWQ+IFwKICAtLWlnbm9yZS1taXNzaW5n" + + "CmBgYAoKUmVhZCBgY2x1c3RlcklEYCBhbmQgYG5jYUlEYCBmcm9tCmBkZXBsb3kvc3RhY2tzL252" + + "Y2YtY29tcHV0ZS1wbGFuZS9yZWdpc3RyYXRpb24vPGNsdXN0ZXItbmFtZT4tcmVnaXN0ZXItdmFs" + + "dWVzLnlhbWxgLgpTaG93IHRoZSBleGFjdCBjbHVzdGVyIElEIGFuZCBnZXQgY29uZmlybWF0aW9u" + + "IGJlZm9yZSBgY2x1c3RlciBkZWxldGVgLiBSZXBlYXQKY29tcHV0ZSBkZXN0cm95IGFuZCBkZXJl" + + "Z2lzdHJhdGlvbiBmb3IgZXZlcnkgY29tcHV0ZSBjbHVzdGVyLCB0aGVuIGRlc3Ryb3kgdGhlCmNv" + + "bnRyb2wgcGxhbmUuCgpgYGBiYXNoCktVQkVDT05GSUc9PGNvbnRyb2wtcGxhbmUta3ViZWNvbmZp" + + "Zz4gXAptYWtlIC1DIGRlcGxveS9zdGFja3Mvc2VsZi1tYW5hZ2VkIGRlc3Ryb3kgXAogIEhFTE1G" + + "SUxFX0VOVj08ZW52PiBcCiAgS1VCRUNPTkZJR19GSUxFPTxjb250cm9sLXBsYW5lLWt1YmVjb25m" + + "aWc+CmBgYAoKQm90aCBgS1VCRUNPTkZJR2AgYW5kIGBLVUJFQ09ORklHX0ZJTEVgIGFyZSByZXF1" + + "aXJlZCBvbiB0aGUgY29udHJvbC1wbGFuZQpkZXN0cm95IGJlY2F1c2UgaXRzIG5hbWVzcGFjZSBj" + + "bGVhbnVwIHVzZXMgYW1iaWVudCBga3ViZWN0bGAuCgpGb3IgdGhlIENMSSBwcm9maWxlIGZsb3cs" + + "IGtlZXAKYGRlcGxveS9zdGFja3MvbnZjZi1jb21wdXRlLXBsYW5lL291dC88Y2x1c3Rlci1uYW1l" + + "Pi1yZWdpc3Rlci12YWx1ZXMueWFtbGAKdW50aWwgdGVhcmRvd24gY29tcGxldGVzIGJlY2F1c2Ug" + + "YGRvd25gIHJlYWRzIGl0cyBjbHVzdGVyIElELiBGaXJzdCBxdWVyeSB0aGUKbGl2ZSByZWdpc3Ry" + + "YXRpb24gc2V0IHdpdGggdGhlIHNhbWUgY29tcGxldGUgcGVyc2lzdGVudCBwcmVmaXg6CgpgYGBi" + "YXNoCm52Y2YtY2xpIC0tY29uZmlnIDxjb25maWc+IHNlbGYtaG9zdGVkIFwKICAtLWNvbnRyb2wt" + "cGxhbmUtc3RhY2sgZGVwbG95L3N0YWNrcy9zZWxmLW1hbmFnZWQgXAogIC0tY29tcHV0ZS1wbGFu" + "ZS1zdGFjayBkZXBsb3kvc3RhY2tzL252Y2YtY29tcHV0ZS1wbGFuZSBcCiAgLS1lbnYgPGVudj4g" + "XAogIC0tcGxhaW4gXAogIC0tY29udHJvbC1wbGFuZS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNv" + "bnRleHQ+IFwKICAtLWNvbXB1dGUtcGxhbmUtY29udGV4dCA8Y29tcHV0ZS1wbGFuZS1jb250ZXh0" + - "PiBcCiAgLS1pY21zLXVybCA8Y29tcHV0ZS1yZWFjaGFibGUtaWNtcy11cmw+IFwKICBkb3duIC0t" + - "cGxhbi1vbmx5IFwKICAtLWNsdXN0ZXItbmFtZSA8Y29tcHV0ZS1wbGFuZS1jbHVzdGVyLW5hbWU+" + - "IFwKICAtLW5jYS1pZCA8bmNhLWlkPgoKbnZjZi1jbGkgLS1jb25maWcgPGNvbmZpZz4gc2VsZi1o" + - "b3N0ZWQgXAogIC0tY29udHJvbC1wbGFuZS1zdGFjayBkZXBsb3kvc3RhY2tzL3NlbGYtbWFuYWdl" + - "ZCBcCiAgLS1jb21wdXRlLXBsYW5lLXN0YWNrIGRlcGxveS9zdGFja3MvbnZjZi1jb21wdXRlLXBs" + - "YW5lIFwKICAtLWVudiA8ZW52PiBcCiAgLS1wbGFpbiBcCiAgLS1jb250cm9sLXBsYW5lLWNvbnRl" + - "eHQgPGNvbnRyb2wtcGxhbmUtY29udGV4dD4gXAogIC0tY29tcHV0ZS1wbGFuZS1jb250ZXh0IDxj" + - "b21wdXRlLXBsYW5lLWNvbnRleHQ+IFwKICAtLWljbXMtdXJsIDxjb21wdXRlLXJlYWNoYWJsZS1p" + - "Y21zLXVybD4gXAogIGRvd24gXAogIC0tY2x1c3Rlci1uYW1lIDxjb21wdXRlLXBsYW5lLWNsdXN0" + - "ZXItbmFtZT4gXAogIC0tbmNhLWlkIDxuY2EtaWQ+CmBgYAoKUmVwZWF0IGBkb3duYCBmb3IgZWFj" + - "aCBjb21wdXRlIGNsdXN0ZXIuIEVhY2ggcnVuIGRlc3Ryb3lzIHRoYXQgY29tcHV0ZSBwbGFuZSBh" + - "bmQKdW5yZWdpc3RlcnMgaXRzIElDTVMgcm93LiBJdCByZW1vdmVzIHRoZSBjb250cm9sIHBsYW5l" + - "IG9ubHkgYWZ0ZXIgbm8gY2x1c3RlcgpyZWdpc3RyYXRpb25zIHJlbWFpbi4KUEsHCJZjvFkSMAAA" + - "EjAAAFBLAwQUAAgAAAAAACEAAAAAAAAAAAAAAAAAOwAJAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQt" + - "aW5zdGFsbGF0aW9uL3JlZmVyZW5jZXMvZGVidWdnaW5nLm1kVVQFAAEAps4SIyBEZWJ1Z2dpbmcg" + - "UmVmZXJlbmNlCgpSZWNpcGVzIGZvciBkaWFnbm9zaW5nIGFuZCBmaXhpbmcgY29tbW9uIE5WQ0Yg" + - "c2VsZi1tYW5hZ2VkIHN0YWNrIGZhaWx1cmVzLgoKIyMgUXVpY2sgU3RhdHVzIENvbW1hbmRzCgpg" + - "YGBiYXNoCiMgQWxsIHBvZHMgYWNyb3NzIGFsbCBuYW1lc3BhY2VzCmt1YmVjdGwgZ2V0IHBvZHMg" + - "LUEgLW8gd2lkZQoKIyBQb2RzIGluIGEgc3BlY2lmaWMgbmFtZXNwYWNlCmt1YmVjdGwgZ2V0IHBv" + - "ZHMgLW4gPG5hbWVzcGFjZT4KCiMgQWxsIGhlbG0gcmVsZWFzZXMKaGVsbSBsaXN0IC1BCgojIFJl" + - "Y2VudCBldmVudHMgKG1vc3QgdXNlZnVsIGZvciBkaWFnbm9zaW5nIGZhaWx1cmVzKQprdWJlY3Rs" + - "IGdldCBldmVudHMgLW4gPG5hbWVzcGFjZT4gLS1zb3J0LWJ5PScubGFzdFRpbWVzdGFtcCcKCiMg" + - "RGVzY3JpYmUgYSBzcGVjaWZpYyBwb2QgKHNob3dzIGV2ZW50cywgY29uZGl0aW9ucywgdm9sdW1l" + - "cykKa3ViZWN0bCBkZXNjcmliZSBwb2QgLW4gPG5hbWVzcGFjZT4gPHBvZC1uYW1lPgpgYGAKCiMj" + - "IEZhaWx1cmU6IEltYWdlUHVsbEJhY2tPZmYKCiMjIyBTeW1wdG9tcwoKYGBgCk5BTUUgICAgICAg" + - "ICAgIFJFQURZICAgU1RBVFVTICAgICAgICAgICAgIFJFU1RBUlRTICAgQUdFCmNhc3NhbmRyYS0w" + - "ICAgIDAvMSAgICAgSW1hZ2VQdWxsQmFja09mZiAgIDAgICAgICAgICAgNW0KYGBgCgpFdmVudHMg" + - "c2hvdzoKYGBgCkZhaWxlZCB0byBwdWxsIGltYWdlICJudmNyLmlvLy4uLi9pbWFnZTp0YWciOiA0" + - "MDEgVW5hdXRob3JpemVkCmBgYAoKIyMjIERpYWdub3NpcwoKYGBgYmFzaAojIENoZWNrIHdoYXQg" + - "aW1hZ2UgaXMgZmFpbGluZwprdWJlY3RsIGRlc2NyaWJlIHBvZCAtbiA8bmFtZXNwYWNlPiA8cG9k" + - "LW5hbWU+IHwgZ3JlcCAtQTUgIkV2ZW50czoiCgojIENoZWNrIGlmIHB1bGwgc2VjcmV0IGV4aXN0" + - "cyBpbiB0aGUgbmFtZXNwYWNlCmt1YmVjdGwgZ2V0IHNlY3JldCBudmNyLWNyZWRzIC1uIDxuYW1l" + - "c3BhY2U+CgojIENoZWNrIGlmIHRoZSBwb2Qgc3BlYyBoYXMgaW1hZ2VQdWxsU2VjcmV0cwprdWJl" + - "Y3RsIGdldCBwb2QgLW4gPG5hbWVzcGFjZT4gPHBvZC1uYW1lPiAtbyBqc29ucGF0aD0ney5zcGVj" + - "LmltYWdlUHVsbFNlY3JldHN9JwoKIyBDaGVjayBpZiB0aGUgU2VydmljZUFjY291bnQgaGFzIGlt" + - "YWdlUHVsbFNlY3JldHMKa3ViZWN0bCBnZXQgc2EgPHNhLW5hbWU+IC1uIDxuYW1lc3BhY2U+IC1v" + - "IGpzb25wYXRoPSd7LmltYWdlUHVsbFNlY3JldHN9JwpgYGAKCiMjIyBGaXhlcwoKMS4gKipTZWNy" + - "ZXQgbWlzc2luZyBpbiBuYW1lc3BhY2UqKjogQ3JlYXRlIGl0CiAgIGBgYGJhc2gKICAga3ViZWN0" + - "bCBjcmVhdGUgc2VjcmV0IGRvY2tlci1yZWdpc3RyeSBudmNyLWNyZWRzIFwKICAgICAtLWRvY2tl" + - "ci1zZXJ2ZXI9bnZjci5pbyBcCiAgICAgLS1kb2NrZXItdXNlcm5hbWU9JyRvYXV0aHRva2VuJyBc" + - "CiAgICAgLS1kb2NrZXItcGFzc3dvcmQ9IiROR0NfQVBJX0tFWSIgXAogICAgIC0tbmFtZXNwYWNl" + - "PTxuYW1lc3BhY2U+IFwKICAgICAtLWRyeS1ydW49Y2xpZW50IC1vIHlhbWwgfCBrdWJlY3RsIGFw" + - "cGx5IC1mIC0KICAgYGBgCgoyLiAqKlNlY3JldCBleGlzdHMgYnV0IHBvZCBkb2Vzbid0IHJlZmVy" + - "ZW5jZSBpdCoqOiBUaGUgY2hhcnQgbmVlZHMgYGltYWdlUHVsbFNlY3JldHNgIGNvbmZpZ3VyZWQg" + - "dmlhIGhlbG1maWxlIHZhbHVlcy4gU2VlIFtwdWxsLXNlY3JldHMubWRdKHB1bGwtc2VjcmV0cy5t" + - "ZCkuCgozLiAqKkNoYXJ0IGRvZXNuJ3Qgc3VwcG9ydCBpbWFnZVB1bGxTZWNyZXRzKiogKG9wZW5i" + - "YW8sIGludm9jYXRpb24tc2VydmljZSwgZXNzLWFwaSwgbm90YXJ5LXNlcnZpY2UpOiBQYXRjaCBT" + - "ZXJ2aWNlQWNjb3VudHMgYW5kIHJlc3RhcnQgcG9kcy4gU2VlIFtwdWxsLXNlY3JldHMubWRdKHB1" + - "bGwtc2VjcmV0cy5tZCkuCgo0LiAqKldyb25nIGNyZWRlbnRpYWxzIGluIHNlY3JldCoqOiBEZWxl" + - "dGUgYW5kIHJlY3JlYXRlCiAgIGBgYGJhc2gKICAga3ViZWN0bCBkZWxldGUgc2VjcmV0IG52Y3It" + - "Y3JlZHMgLW4gPG5hbWVzcGFjZT4KICAgIyBSZWNyZWF0ZSB3aXRoIGNvcnJlY3QgY3JlZGVudGlh" + - "bHMKICAgYGBgCgojIyBGYWlsdXJlOiBJbml0OjAvMSBTdHVjayAoVmF1bHQgQWdlbnQpCgojIyMg" + - "U3ltcHRvbXMKClNlcnZpY2UgcG9kcyBzdHVjayBpbiBgSW5pdDowLzFgIGZvciBtaW51dGVzOgpg" + - "YGAKTkFNRSAgICAgICAgICAgICAgICAgICAgICAgIFJFQURZICAgU1RBVFVTICAgICBSRVNUQVJU" + - "UyAgIEFHRQpudmNmLWFwaS03ZjRjNzZmNzg4LTQ0dmx0ICAwLzIgICAgIEluaXQ6MC8xICAgMCAg" + - "ICAgICAgICAxMG0KYGBgCgojIyMgRGlhZ25vc2lzCgpUaGUgaW5pdCBjb250YWluZXIgaXMgdGhl" + - "IHZhdWx0LWFnZW50LWluaXQgaW5qZWN0b3Igd2FpdGluZyBmb3IgT3BlbkJhby4KCmBgYGJhc2gK" + - "IyBDaGVjayBPcGVuQmFvIHBvZHMKa3ViZWN0bCBnZXQgcG9kcyAtbiB2YXVsdC1zeXN0ZW0KCiMg" + - "Q2hlY2sgaWYgT3BlbkJhbyBtaWdyYXRpb24gam9iIHJhbgprdWJlY3RsIGdldCBqb2JzIC1uIHZh" + - "dWx0LXN5c3RlbQoKIyBDaGVjayBPcGVuQmFvIHBvZCBsb2dzCmt1YmVjdGwgbG9ncyAtbiB2YXVs" + - "dC1zeXN0ZW0gb3BlbmJhby1zZXJ2ZXItMCAtYyBvcGVuYmFvCgojIENoZWNrIGluaXQgY29udGFp" + - "bmVyIGxvZ3Mgb24gdGhlIHN0dWNrIHBvZAprdWJlY3RsIGxvZ3MgLW4gPG5hbWVzcGFjZT4gPHBv" + - "ZC1uYW1lPiAtYyB2YXVsdC1hZ2VudC1pbml0CmBgYAoKIyMjIEZpeGVzCgoxLiAqKk9wZW5CYW8g" + - "cG9kcyBub3QgcnVubmluZyoqOiBDaGVjayB0aGVpciBldmVudHMgZm9yIGltYWdlIHB1bGwgaXNz" + - "dWVzLCByZXNvdXJjZSBpc3N1ZXMsIGV0Yy4KCjIuICoqT3BlbkJhbyBtaWdyYXRpb24gam9iIGRp" + - "ZG4ndCBydW4qKjogVGhpcyBoYXBwZW5zIHdoZW4gYGhlbG1maWxlIHN5bmNgIHdhcyBpbnRlcnJ1" + - "cHRlZC4gRGVzdHJveSBhbmQgcmUtc3luYyBvcGVuYmFvOgogICBgYGBiYXNoCiAgIEhFTE1GSUxF" + - "X0VOVj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9b3BlbmJhby1zZXJ2ZXIgZGVzdHJv" + - "eQogICBrdWJlY3RsIGRlbGV0ZSBuYW1lc3BhY2UgdmF1bHQtc3lzdGVtCiAgIGt1YmVjdGwgY3Jl" + - "YXRlIG5hbWVzcGFjZSB2YXVsdC1zeXN0ZW0KICAgIyBSZS1jcmVhdGUgcHVsbCBzZWNyZXQgaWYg" + - "bmVlZGVkCiAgIEhFTE1GSUxFX0VOVj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9b3Bl" + - "bmJhby1zZXJ2ZXIgc3luYwogICBgYGAKCjMuICoqT3BlbkJhbyBwb2RzIHJ1bm5pbmcgYnV0IG5v" + - "dCBpbml0aWFsaXplZCoqOiBDaGVjayB1bnNlYWwgc3RhdHVzOgogICBgYGBiYXNoCiAgIGt1YmVj" + - "dGwgZXhlYyAtbiB2YXVsdC1zeXN0ZW0gb3BlbmJhby1zZXJ2ZXItMCAtYyBvcGVuYmFvIC0tIGJh" + - "byBzdGF0dXMKICAgYGBgCgo0LiAqKmB2YXVsdC1hZ2VudC1pbml0YCBsb2dzIGBhdXRoL2p3dC9s" + - "b2dpbmAgLT4gYDQwMCAuLi4gbm8ga25vd24ga2V5IHN1Y2Nlc3NmdWxseSB2YWxpZGF0ZWQgdGhl" + - "IHRva2VuIHNpZ25hdHVyZWAqKgogICAoY29tbW9uIG9uIEFLUywgYW5kIG9uIGFueSBjbHVzdGVy" + - "IHdob3NlIE9JREMgaXNzdWVyIHB1Ymxpc2hlcyBhIHJvdGF0aW5nIG11bHRpLWtleSBKV0tTKToK" + - "ICAgdGhlIE9wZW5CYW8gYGF1dGgvand0YCBtZXRob2Qgd2FzIGNvbmZpZ3VyZWQgd2l0aCBhIHNp" + - "bmdsZSBzdGF0aWMgbW91bnRlZCBwdWJsaWMga2V5CiAgIChgand0X3ZhbGlkYXRpb25fcHVia2V5" + - "c2ApIGluc3RlYWQgb2YgdGhlIGlzc3VlcidzIGxpdmUgSldLUywgc28gaXQgY2Fubm90IHZhbGlk" + - "YXRlIHRoZQogICBjbHVzdGVyLXNpZ25lZCBTZXJ2aWNlQWNjb3VudCB0b2tlbnMgdGhlIHZhdWx0" + - "LWFnZW50cyBwcmVzZW50LiBFdmVyeSBzZXJ2aWNlJ3MKICAgYHZhdWx0LWFnZW50LWluaXRgIHRo" + - "ZW4gbG9vcHMgb24gdGhhdCA0MDAgYW5kIHRoZSBwb2QgbmV2ZXIgbGVhdmVzIGBJbml0OjAvMWAu" + - "IFRoaXMgaXMgdGhlCiAgIGJlaGF2aW9yIG9mIHRoZSBiYXNlIGRlZmF1bHQgYG9wZW5iYW8ubWln" + - "cmF0aW9ucy5pc3N1ZXJEaXNjb3ZlcnkuZW5hYmxlZDogZmFsc2VgOyB0aGUKICAgbWlncmF0aW9u" + - "IGxvZyBzaG93cyBgT0lEQyBpc3N1ZXIgZGlzY292ZXJ5IGlzIGRpc2FibGVkLiBVc2luZyBTZXJ2" + - "aWNlQWNjb3VudCBpc3N1ZXIgYW5kCiAgIG1vdW50ZWQgcHVibGljIGtleSBmYWxsYmFja2AuIEVu" + - "YWJsZSBpc3N1ZXIgZGlzY292ZXJ5IHNvIHRoZSBtaWdyYXRpb24gdXNlcyB0aGUgbGl2ZSBKV0tT" + - "LAogICB0aGVuIHJlLXJ1biBpdDoKICAgYGBgYmFzaAogICAjIEluIHlvdXIgZW52IHZhbHVlcyAo" + - "ZS5nLiBlbnZpcm9ubWVudHMvPGVudj4ueWFtbCksIHNldDoKICAgIyAgIG9wZW5iYW86CiAgICMg" + - "ICAgIG1pZ3JhdGlvbnM6CiAgICMgICAgICAgaXNzdWVyRGlzY292ZXJ5OgogICAjICAgICAgICAg" + - "ZW5hYmxlZDogdHJ1ZQogICBrdWJlY3RsIGRlbGV0ZSBqb2IgLW4gdmF1bHQtc3lzdGVtIG9wZW5i" + - "YW8tc2VydmVyLW1pZ3JhdGlvbnMKICAgSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2Vs" + - "ZWN0b3IgbmFtZT1vcGVuYmFvLXNlcnZlciBzeW5jCiAgIGBgYAogICBUaGUgbWlncmF0aW9uIGxv" + - "ZyBzaG91bGQgdGhlbiBzaG93IGBSZWNlaXZlZCBkaXNjb3ZlcnkgZG9jdW1lbnQgZnJvbQogICAu" + - "Li4vLndlbGwta25vd24vb3BlbmlkLWNvbmZpZ3VyYXRpb25gIGFuZCBgRmluYWwgT3BlbkJhbyBK" + - "V1QgSldLUyBVUkwgc2V0IHRvOgogICAuLi4vb3BlbmlkL3YxL2p3a3NgLCBhbmQgdGhlIHNlcnZp" + - "Y2UgcG9kcyBhdXRoZW50aWNhdGUgYW5kIHJlYWNoIFJlYWR5IHdpdGhpbiB+MSBtaW4uCiAgIEFL" + - "UyBjbHVzdGVycyB3aXRoIHRoZSBjbHVzdGVyIE9JREMgaXNzdWVyIGVuYWJsZWQgKHRoZSBgYWtz" + - "LWNsdXN0ZXJgIGRlZmF1bHQpIGFsd2F5cyBuZWVkCiAgIHRoaXMgYmVjYXVzZSB0aGUgc3RhdGlj" + - "LXB1YmtleSBmYWxsYmFjayBjYW5ub3QgbWF0Y2ggdGhlIGlzc3VlcidzIHJvdGF0aW5nIHNpZ25p" + - "bmcga2V5cy4KCiMjIEZhaWx1cmU6IE9PTUtpbGxlZCBvbiBDYXNzYW5kcmEKCiMjIyBTeW1wdG9t" + - "cwoKYGBgCk5BTUUgICAgICAgICAgUkVBRFkgICBTVEFUVVMgICAgUkVTVEFSVFMgICBBR0UKY2Fz" + - "c2FuZHJhLTAgICAwLzEgICAgIE9PTUtpbGxlZCAgMyAgICAgICAgIDEwbQpgYGAKCiMjIyBEaWFn" + - "bm9zaXMKCmBgYGJhc2gKa3ViZWN0bCBkZXNjcmliZSBwb2QgLW4gY2Fzc2FuZHJhLXN5c3RlbSBj" + - "YXNzYW5kcmEtMCB8IGdyZXAgLUEzICJMYXN0IFN0YXRlIgpgYGAKCiMjIyBGaXgKCk92ZXJyaWRl" + - "IENhc3NhbmRyYSByZXNvdXJjZXMgdmlhIGhlbG1maWxlIHZhbHVlcy4gU2VlIEV4YW1wbGUgMSBp" + - "bgpbZXhhbXBsZXMubWRdKC4uL2V4YW1wbGVzLm1kKS4KCmBgYHlhbWwKLSBjYXNzYW5kcmE6CiAg" + - "ICByZXNvdXJjZXM6CiAgICAgIGxpbWl0czoKICAgICAgICBjcHU6ICI4IgogICAgICAgIG1lbW9y" + - "eTogODE5Mk1pCiAgICAgIHJlcXVlc3RzOgogICAgICAgIGNwdTogIjIiCiAgICAgICAgbWVtb3J5" + - "OiA0MDk2TWkKYGBgCgpOb3RlOiBgcmVzb3VyY2VQcmVzZXRgIGlzIG5vdCBhdmFpbGFibGUgaW4g" + - "dGhlIE5WQ0YgY2Fzc2FuZHJhIHdyYXBwZXIgY2hhcnQuIFVzZSBleHBsaWNpdCBgcmVzb3VyY2Vz" + - "YC4KCiMjIEZhaWx1cmU6IFBvZHMgU3R1Y2sgaW4gUGVuZGluZwoKIyMjIFN5bXB0b21zCgpgYGAK" + - "TkFNRSAgICAgICAgICBSRUFEWSAgIFNUQVRVUyAgICBSRVNUQVJUUyAgIEFHRQpjYXNzYW5kcmEt" + - "MCAgIDAvMSAgICAgUGVuZGluZyAgIDAgICAgICAgICAgMTBtCmBgYAoKIyMjIERpYWdub3NpcwoK" + - "YGBgYmFzaAojIENoZWNrIGV2ZW50cyBmb3Igc2NoZWR1bGluZyBmYWlsdXJlcwprdWJlY3RsIGRl" + - "c2NyaWJlIHBvZCAtbiA8bmFtZXNwYWNlPiA8cG9kLW5hbWU+CgojIENvbW1vbiBjYXVzZXM6CiMg" + - "LSAiMC8xMiBub2RlcyBhcmUgYXZhaWxhYmxlOiAxMiBub2RlKHMpIGRpZG4ndCBtYXRjaCBQb2Qn" + - "cyBub2RlIGFmZmluaXR5IgojIC0gIjAvMTIgbm9kZXMgYXJlIGF2YWlsYWJsZTogMTIgSW5zdWZm" + - "aWNpZW50IG1lbW9yeSIKIyAtICJwZXJzaXN0ZW50dm9sdW1lY2xhaW0gbm90IGZvdW5kIgpgYGAK" + - "CiMjIyBGaXhlcwoKMS4gKipOb2RlIHNlbGVjdG9yIG1pc21hdGNoKio6IENoZWNrIGBub2RlU2Vs" + - "ZWN0b3JzYCBpbiBlbnZpcm9ubWVudCBmaWxlCiAgIGBgYGJhc2gKICAga3ViZWN0bCBnZXQgbm9k" + - "ZXMgLS1zaG93LWxhYmVscyB8IGdyZXAgbnZjZgogICBgYGAKCjIuICoqU3RvcmFnZSBjbGFzcyBu" + - "b3QgZm91bmQqKjogQ2hlY2sgc3RvcmFnZSBjbGFzcyBleGlzdHMKICAgYGBgYmFzaAogICBrdWJl" + - "Y3RsIGdldCBzdG9yYWdlY2xhc3MKICAgYGBgCgozLiAqKkluc3VmZmljaWVudCByZXNvdXJjZXMq" + - "KjogQ2hlY2sgbm9kZSBjYXBhY2l0eQogICBgYGBiYXNoCiAgIGt1YmVjdGwgZGVzY3JpYmUgbm9k" + - "ZSA8bm9kZS1uYW1lPiB8IGdyZXAgLUE1ICJBbGxvY2F0ZWQgcmVzb3VyY2VzIgogICBgYGAKCiMj" + - "IEZhaWx1cmU6IEhlbG0gUmVsZWFzZSBpbiBGYWlsZWQgU3RhdGUKCiMjIyBTeW1wdG9tcwoKYGBg" + - "YmFzaApoZWxtIGxpc3QgLUEKIyBTaG93cyByZWxlYXNlIHdpdGggU1RBVFVTOiBmYWlsZWQKYGBg" + - "CgpSZS1ydW5uaW5nIGBoZWxtZmlsZSBzeW5jYCBhcHBlYXJzIHRvIHN1Y2NlZWQgYnV0IHNlcnZp" + - "Y2VzIGRvbid0IHdvcmsgKG1pZ3JhdGlvbnMgc2tpcHBlZCkuCgojIyMgRGlhZ25vc2lzCgpgYGBi" + - "YXNoCmhlbG0gaGlzdG9yeSA8cmVsZWFzZS1uYW1lPiAtbiA8bmFtZXNwYWNlPgpgYGAKCiMjIyBG" + - "aXgKCk11c3QgZGVzdHJveSB0aGUgZmFpbGVkIHJlbGVhc2UgYW5kIHJlLXN5bmMgKG5vdCBqdXN0" + - "IGFwcGx5KToKCmBgYGJhc2gKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0b3Ig" + - "bmFtZT08cmVsZWFzZT4gZGVzdHJveQojIElmIG5hbWVzcGFjZSBuZWVkcyBjbGVhbnVwOgprdWJl" + - "Y3RsIGRlbGV0ZSBuYW1lc3BhY2UgPG5hbWVzcGFjZT4Ka3ViZWN0bCBjcmVhdGUgbmFtZXNwYWNl" + - "IDxuYW1lc3BhY2U+CiMgUmUtY3JlYXRlIHB1bGwgc2VjcmV0IGlmIG5lZWRlZApIRUxNRklMRV9F" + - "TlY9PGVudj4gaGVsbWZpbGUgLS1zZWxlY3RvciBuYW1lPTxyZWxlYXNlPiBzeW5jCmBgYAoKIyMg" + - "RmFpbHVyZTogQWNjb3VudCBCb290c3RyYXAgSm9iIEZhaWxlZAoKIyMjIFN5bXB0b21zCgpTZXJ2" + - "aWNlcyBkZXBsb3kgYnV0IGZ1bmN0aW9ucyBjYW4ndCBiZSBjcmVhdGVkLiBFdmVudHMgc2hvdyBi" + - "b290c3RyYXAgam9iIGZhaWx1cmUuCgojIyMgRGlhZ25vc2lzCgpgYGBiYXNoCiMgQ2hlY2sgYm9v" + - "dHN0cmFwIGpvYiBzdGF0dXMKa3ViZWN0bCBnZXQgam9icyAtbiBudmNmCgojIEdldCBsb2dzIChq" + - "b2IgYXV0by1kZWxldGVzIGFmdGVyIH41IG1pbnV0ZXMpCmt1YmVjdGwgbG9ncyBqb2IvbnZjZi1h" + - "cGktYWNjb3VudC1ib290c3RyYXAgLW4gbnZjZgoKIyBDaGVjayBBUEkgbG9ncwprdWJlY3RsIGxv" + - "Z3MgLW4gbnZjZiAtbCBhcHAua3ViZXJuZXRlcy5pby9uYW1lPW52Y2YtYXBpIC0tdGFpbD0xMDAK" + - "YGBgCgojIyMgQ29tbW9uIENhdXNlcwoKMS4gKipXcm9uZyBiYXNlNjQgY3JlZGVudGlhbHMqKjog" + - "Q3JlZGVudGlhbHMgaW4gYHNlY3JldHMvPGVudj4tc2VjcmV0cy55YW1sYCBtdXN0IGJlIGAkb2F1" + - "dGh0b2tlbjpBUElfS0VZYCBiYXNlNjQtZW5jb2RlZCwgbm90IGp1c3QgdGhlIEFQSSBrZXkKICAg" + - "YGBgYmFzaAogICAjIFZlcmlmeSB5b3VyIGVuY29kZWQgY3JlZGVudGlhbAogICBlY2hvICdZT1VS" + - "X0JBU0U2NF9TVFJJTkcnIHwgYmFzZTY0IC1kCiAgICMgU2hvdWxkIG91dHB1dDogJG9hdXRodG9r" + - "ZW46bnZhcGkteHh4eHgKICAgYGBgCgoyLiAqKlJlZ2lzdHJ5IHVucmVhY2hhYmxlKio6IEFQSSBj" + - "YW4ndCByZWFjaCB0aGUgcmVnaXN0cnkgc3BlY2lmaWVkIGluIGBhY2NvdW50Qm9vdHN0cmFwLnJl" + - "Z2lzdHJ5Q3JlZGVudGlhbHNgCgojIyMgRml4CgpGaXggY3JlZGVudGlhbHMgaW4gc2VjcmV0cyBm" + - "aWxlLCB0aGVuIHJlY292ZXIgc2VydmljZXMgd2l0aG91dCBkZXN0cm95aW5nIGRlcGVuZGVuY2ll" + - "czoKCmBgYGJhc2gKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0b3IgcmVsZWFz" + - "ZS1ncm91cD1zZXJ2aWNlcyBkZXN0cm95Cmt1YmVjdGwgZGVsZXRlIG5hbWVzcGFjZSBudmNmIGFw" + - "aS1rZXlzIGVzcyBzaXMgLS1pZ25vcmUtbm90LWZvdW5kCmt1YmVjdGwgY3JlYXRlIG5hbWVzcGFj" + - "ZSBudmNmICYmIGt1YmVjdGwgY3JlYXRlIG5hbWVzcGFjZSBhcGkta2V5cyAmJiBcCiAga3ViZWN0" + - "bCBjcmVhdGUgbmFtZXNwYWNlIGVzcyAmJiBrdWJlY3RsIGNyZWF0ZSBuYW1lc3BhY2Ugc2lzCiMg" + - "UmUtY3JlYXRlIHB1bGwgc2VjcmV0cyBpZiBuZWVkZWQKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1m" + - "aWxlIC0tc2VsZWN0b3IgcmVsZWFzZS1ncm91cD1zZXJ2aWNlcyBzeW5jCmBgYAoKIyMgRmFpbHVy" + - "ZTogTlZDQSBDbGVhbnVwIFN0dWNrIChGaW5hbGl6ZXJzKQoKIyMjIFN5bXB0b21zCgpDb21wdXRl" + - "LXBsYW5lIGNsZWFudXAgaGFuZ3MuIE5hbWVzcGFjZXMKc3R1Y2sgaW4gYFRlcm1pbmF0aW5nYDoK" + - "CmBgYGJhc2gKa3ViZWN0bCBnZXQgbnMKIyBudmNhLW9wZXJhdG9yICAgIFRlcm1pbmF0aW5nICAg" + - "MTBtCiMgbnZjZi1iYWNrZW5kICAgICBUZXJtaW5hdGluZyAgIDEwbQpgYGAKCiMjIyBGaXgKClJ1" + - "biB0aGlzIG9ubHkgYWdhaW5zdCB0aGUgY29tcHV0ZSBjb250ZXh0LCBhZnRlciB0aGUgbm9ybWFs" + - "IGNvbXB1dGUtcGxhbmUKdGVhcmRvd24gaGFzIGZhaWxlZC4gUmVtb3ZlIGZpbmFsaXplcnMgZnJv" + - "bSBOVkNGQmFja2VuZCBjdXN0b20gcmVzb3VyY2VzIGFuZApmb3JjZS1kZWxldGUgc3R1Y2sgbmFt" + - "ZXNwYWNlczoKCmBgYGJhc2gKZXhwb3J0IENPTVBVVEVfQ09OVEVYVD08Y29tcHV0ZS1wbGFuZS1j" + - "b250ZXh0PgoKIyBSZW1vdmUgZmluYWxpemVycyBmcm9tIE5WQ0ZCYWNrZW5kIHJlc291cmNlcwpr" + - "dWJlY3RsIC0tY29udGV4dCAiJENPTVBVVEVfQ09OVEVYVCIgZ2V0IG52Y2ZiYWNrZW5kcyAtQSAt" + - "byBqc29uIHwgXAogIGpxICcuaXRlbXNbXSB8IC5tZXRhZGF0YS5uYW1lc3BhY2UgKyAiLyIgKyAu" + - "bWV0YWRhdGEubmFtZScgLXIgfCBcCiAgeGFyZ3MgLUl7fSBzaCAtYyAnY29udGV4dD0iJDEiOyBu" + - "cz0iJHsyJSUvKn0iOyBuYW1lPSIkezIjIyovfSI7IGt1YmVjdGwgLS1jb250ZXh0ICIkY29udGV4" + - "dCIgcGF0Y2ggbnZjZmJhY2tlbmQgIiRuYW1lIiAtbiAiJG5zIiAtLXR5cGU9bWVyZ2UgLXAgIntc" + - "Im1ldGFkYXRhXCI6e1wiZmluYWxpemVyc1wiOltdfX0iJyBfICIkQ09NUFVURV9DT05URVhUIiB7" + - "fQoKIyBGb3JjZS1kZWxldGUgc3R1Y2sgbmFtZXNwYWNlcyBieSBjbGVhcmluZyB0aGVpciBmaW5h" + - "bGl6ZXJzCmZvciBucyBpbiBudmNhLW9wZXJhdG9yIG52Y2YtYmFja2VuZDsgZG8KICBrdWJlY3Rs" + - "IC0tY29udGV4dCAiJENPTVBVVEVfQ09OVEVYVCIgZ2V0IG5hbWVzcGFjZSAiJG5zIiAtbyBqc29u" + - "IDI+L2Rldi9udWxsIHwgXAogICAganEgJy5zcGVjLmZpbmFsaXplcnMgPSBbXScgfCBcCiAgICBr" + - "dWJlY3RsIC0tY29udGV4dCAiJENPTVBVVEVfQ09OVEVYVCIgcmVwbGFjZSBcCiAgICAgIC0tcmF3" + - "ICIvYXBpL3YxL25hbWVzcGFjZXMvJG5zL2ZpbmFsaXplIiAtZiAtIDI+L2Rldi9udWxsCmRvbmUK" + - "YGBgCgojIyBGYWlsdXJlOiBOVkNBIE9wZXJhdG9yIE1pc3Npbmcgb3IgTm90IFJlYWR5CgojIyMg" + - "U3ltcHRvbXMKCkFmdGVyIGNvbXB1dGUtcGxhbmUgaW5zdGFsbCBjb21wbGV0ZXMsIG5vIGBudmNh" + - "LW9wZXJhdG9yYCBEZXBsb3ltZW50IGV4aXN0cywgb3IKaXQgZXhpc3RzIGJ1dCBwb2RzIGFyZSBu" + - "b3QgcmVhZHk6CgpgYGBiYXNoCmt1YmVjdGwgLS1jb250ZXh0IDxjb21wdXRlLXBsYW5lLWNvbnRl" + - "eHQ+IGdldCBkZXBsb3ltZW50IG52Y2Etb3BlcmF0b3IgXAogIC1uIG52Y2Etb3BlcmF0b3IKa3Vi" + - "ZWN0bCAtLWNvbnRleHQgPGNvbXB1dGUtcGxhbmUtY29udGV4dD4gZ2V0IHBvZHMgLW4gbnZjYS1v" + - "cGVyYXRvcgpgYGAKCiMjIyBEaWFnbm9zaXMgYW5kIEZpeGVzCgpGaXJzdCBpZGVudGlmeSB3aGV0" + - "aGVyIHRoZSBpbnN0YWxsYXRpb24gdXNlZCB0aGUgSGVsbWZpbGUgdmFsdWVzIGZsb3cgb3IgdGhl" + - "CkNMSSBwcm9maWxlIGZsb3cuIFJlLXJ1biBvbmx5IHRoYXQgZmxvdydzIHJlZ2lzdHJhdGlvbiBh" + - "bmQgaW5zdGFsbGF0aW9uIHN0ZXBzCmZyb20gW1NwbGl0IENvbXB1dGUtUGxhbmUgSW5zdGFsbGF0" + - "aW9uXShjb21wdXRlLXBsYW5lLWluc3RhbGxhdGlvbi5tZCkuIERvIG5vdApzdWJzdGl0dXRlIG9u" + - "ZSBoYW5kb2ZmIGZvciB0aGUgb3RoZXIuCgpJZiBpbnN0YWxsYXRpb24gc3VjY2VlZHMgYnV0IHBv" + - "ZHMgc3RpbGwgZmFpbCwgaW5zcGVjdCB0aGUgY29tcHV0ZSBjb250ZXh0OgoKYGBgYmFzaAprdWJl" + - "Y3RsIC0tY29udGV4dCA8Y29tcHV0ZS1wbGFuZS1jb250ZXh0PiBkZXNjcmliZSBkZXBsb3kgbnZj" + - "YS1vcGVyYXRvciBcCiAgLW4gbnZjYS1vcGVyYXRvcgprdWJlY3RsIC0tY29udGV4dCA8Y29tcHV0" + - "ZS1wbGFuZS1jb250ZXh0PiBsb2dzIGRlcGxveW1lbnQvbnZjYS1vcGVyYXRvciBcCiAgLW4gbnZj" + - "YS1vcGVyYXRvciAtLXRhaWw9MjAwCmt1YmVjdGwgLS1jb250ZXh0IDxjb21wdXRlLXBsYW5lLWNv" + - "bnRleHQ+IGdldCBudmNmYmFja2VuZCAtbiBudmNhLW9wZXJhdG9yCmBgYAoKRm9yIHByaXZhdGUg" + - "cmVnaXN0cnkgZmFpbHVyZXMsIHZlcmlmeSB0aGF0IHRoZSBwdWxsIHNlY3JldCBleGlzdHMgaW4K" + - "YG52Y2Etb3BlcmF0b3JgLiBUaGUgY2hhcnQgYW5kIG9wZXJhdG9yIG1pcnJvciBpdCB0byBgbnZj" + - "YS1zeXN0ZW1gOyBkbyBub3QgdXNlIGEKYnJvYWRlciBtYW51YWwgbmFtZXNwYWNlIGxvb3AuIFNl" + - "ZQpbcHVsbC1zZWNyZXRzLm1kXShwdWxsLXNlY3JldHMubWQjY29tcHV0ZS1wbGFuZS1zZWNyZXQp" + - "LgoKIyMgRmFpbHVyZTogR2F0ZXdheSBFbmRwb2ludCBDaGFuZ2VkCgojIyMgU3ltcHRvbXMKClJl" + - "cXVlc3RzIHRocm91Z2ggdGhlIGNvbmZpZ3VyZWQgcm91dGUgZG9tYWluIGZhaWwgYWZ0ZXIgdGhl" + - "IEdhdGV3YXkgb3IgaXRzIGxvYWQgYmFsYW5jZXIgaXMgcmVwbGFjZWQuIFRoZSBHYXRld2F5IHJl" + - "cG9ydHMgYSBuZXcgZW5kcG9pbnQuCgojIyMgRGlhZ25vc2lzCgpgYGBiYXNoCkdBVEVXQVlfQURE" + - "Uj0kKGt1YmVjdGwgLS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRleHQ+IGdldCBnYXRld2F5" + - "IFwKICBudmNmLWdhdGV3YXkgLW4gZW52b3ktZ2F0ZXdheSBcCiAgLW8ganNvbnBhdGg9J3suc3Rh" + - "dHVzLmFkZHJlc3Nlc1swXS52YWx1ZX0nKQp0ZXN0IC1uICIkR0FURVdBWV9BRERSIgpkaWcgK3No" + - "b3J0ICJhcGkuPGRvbWFpbj4iCmN1cmwgLUggIkhvc3Q6IGFwaS48ZG9tYWluPiIgImh0dHA6Ly8k" + - "R0FURVdBWV9BRERSL2hlYWx0aCIKCiMgQ2hlY2sgZGlyZWN0IGFkZHJlc3MgZmllbGRzIHVzZWQg" + - "YnkgYSBzcGxpdCBkZXBsb3ltZW50CmdyZXAgbnZjZk5hdHNTZXJ2aWNlVVJMIGRlcGxveS9zdGFj" + - "a3Mvc2VsZi1tYW5hZ2VkL2Vudmlyb25tZW50cy88ZW52Pi55YW1sCmdyZXAgLUUgJ2ljbXNTZXJ2" + - "aWNlfHJldmFsU2VydmljZXxuYXRzJyBcCiAgZGVwbG95L3N0YWNrcy9udmNmLWNvbXB1dGUtcGxh" + - "bmUvZW52aXJvbm1lbnRzLzxlbnY+LnlhbWwKYGBgCgojIyMgRml4CgpLZWVwIGBnbG9iYWwuZG9t" + - "YWluYCwgcm91dGUgaG9zdG5hbWVzLCBhbmQgSG9zdCBvdmVycmlkZXMgdW5jaGFuZ2VkLiBVcGRh" + - "dGUgRE5TCm9yIHRoZSBkaXJlY3QgY2xpZW50IGRlc3RpbmF0aW9uLiBGb3Igc3BsaXQgZGVwbG95" + - "bWVudHMsIHVwZGF0ZSBvbmx5IGRpcmVjdApHYXRld2F5LWFkZHJlc3MgZmllbGRzIGFuZCByZWZy" + - "ZXNoIHJlZ2lzdHJhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIHRocm91Z2ggdGhlCnNhbWUgc2VsZWN0" + - "ZWQgaGFuZG9mZi4gU2VlCltFeGFtcGxlIDRdKC4uL2V4YW1wbGVzLm1kI2V4YW1wbGUtNC1yZWNv" + - "dmVyLWZyb20tYS1nYXRld2F5LWVuZHBvaW50LWNoYW5nZSkuCgojIyBVc2VmdWwgTmFtZXNwYWNl" + - "LXRvLVNlcnZpY2UgTWFwcGluZwoKUXVpY2sgcmVmZXJlbmNlIGZvciB3aGljaCBzZXJ2aWNlcyBy" + - "dW4gaW4gd2hpY2ggbmFtZXNwYWNlOgoKfCBOYW1lc3BhY2UgfCBTZXJ2aWNlcyB8CnwtLS0tLS0t" + - "LS0tLXwtLS0tLS0tLS0tfAp8IG5hdHMtc3lzdGVtIHwgbmF0cyB8CnwgY2Fzc2FuZHJhLXN5c3Rl" + - "bSB8IGNhc3NhbmRyYSB8CnwgdmF1bHQtc3lzdGVtIHwgb3BlbmJhby1zZXJ2ZXIgfAp8IG52Y2Yg" + - "fCBhcGksIGludm9jYXRpb24tc2VydmljZSwgZ3JwYy1wcm94eSwgbm90YXJ5LXNlcnZpY2UsIHJl" + - "dmFsLCBsbG0tcmVxdWVzdC1yb3V0ZXIsIGxsbS1hcGktZ2F0ZXdheSB8CnwgYXBpLWtleXMgfCBh" + - "cGkta2V5cywgYWRtaW4taXNzdWVyLXByb3h5IHwKfCBlc3MgfCBlc3MtYXBpIHwKfCBzaXMgfCBz" + - "aXMgfAp8IGVudm95LWdhdGV3YXktc3lzdGVtIHwgZW52b3kgZ2F0ZXdheSAoaW5ncmVzcyBjb250" + - "cm9sbGVyKSB8CnwgZW52b3ktZ2F0ZXdheSB8IGdhdGV3YXkgcmVzb3VyY2UgKyByb3V0ZXMgfApQ" + - "SwcIVj5nkJUwAACVMAAAUEsDBBQACAAAAAAAIQAAAAAAAAAAAAAAAABEAAkAZGF0YS9udmNmLXNl" + - "bGYtbWFuYWdlZC1pbnN0YWxsYXRpb24vcmVmZXJlbmNlcy9oZWxtZmlsZS1zdHJ1Y3R1cmUubWRV" + - "VAUAAQCmzhIjIEhlbG1maWxlIFN0cnVjdHVyZSBSZWZlcmVuY2UKCiMjIERpcmVjdG9yeSBMYXlv" + - "dXQKCmBgYApudmNmLXNlbGYtbWFuYWdlZC1zdGFjay8KfC0tIGhlbG1maWxlLmQvCnwgICB8LS0g" + - "MDEtZGVwZW5kZW5jaWVzLnlhbWwuZ290bXBsICAjIE5BVFMsIENhc3NhbmRyYSwgT3BlbkJhbwp8" + - "ICAgfC0tIDAyLWNvcmUueWFtbC5nb3RtcGwgICAgICAgICAgIyBOVkNGIHNlcnZpY2VzICsgaW5n" + - "cmVzcwp8ICAgYC0tIDAzLW9ic2VydmFiaWxpdHkueWFtbC5nb3RtcGwgIyBPYnNlcnZhYmlsaXR5" + - "IHN0YWNrIChvcHRpb25hbCkKfC0tIGVudmlyb25tZW50cy8KfCAgIHwtLSBiYXNlLnlhbWwgICAg" + - "ICAgICAgICAgICAgICAgICMgRGVmYXVsdCB2YWx1ZXMgKGFsbCBlbnZpcm9ubWVudHMpCnwgICBg" + - "LS0gPGVudi1uYW1lPi55YW1sICAgICAgICAgICAgICAjIFBlci1lbnZpcm9ubWVudCBvdmVycmlk" + - "ZXMKfC0tIHNlY3JldHMvCnwgICBgLS0gPGVudi1uYW1lPi1zZWNyZXRzLnlhbWwgICAgICAjIFNl" + - "bnNpdGl2ZSB2YWx1ZXMgKHJlZ2lzdHJ5IGNyZWRzLCBwYXNzd29yZHMpCmAtLSBnbG9iYWwueWFt" + - "bC5nb3RtcGwgICAgICAgICAgICAgICAjIEdvIHRlbXBsYXRlIHRoYXQgY29uc3RydWN0cyBwZXIt" + - "Y2hhcnQgdmFsdWVzCgpudmNmLWNvbXB1dGUtcGxhbmUtc3RhY2svCnwtLSBoZWxtZmlsZS5kLwp8" + - "ICAgfC0tIDAxLWRlcGVuZGVuY2llcy55YW1sLmdvdG1wbCAgIyBDb21wdXRlIHBsYW5lIGRlcGVu" + - "ZGVuY3kgY29tcG9uZW50cwp8ICAgYC0tIDAyLW52Y2EueWFtbC5nb3RtcGwgICAgICAgICAgIyBu" + - "dmNhLW9wZXJhdG9yIGNoYXJ0IGFuZCBudmNhIGNvbmZpZ3VyYXRpb24KfC0tIGVudmlyb25tZW50" + - "cy8KfCAgIHwtLSBiYXNlLnlhbWwgICAgICAgICAgICAgICAgICAgICMgRGVmYXVsdCB2YWx1ZXMg" + - "KGFsbCBlbnZpcm9ubWVudHMpCnwgICBgLS0gPGVudi1uYW1lPi55YW1sICAgICAgICAgICAgICAj" + - "IFBlci1lbnZpcm9ubWVudCBvdmVycmlkZXMKYC0tIGdsb2JhbC55YW1sLmdvdG1wbCAgICAgICAg" + - "ICAgICAgICMgR28gdGVtcGxhdGUgdGhhdCBjb25zdHJ1Y3RzIHBlci1jaGFydCB2YWx1ZXMKYGBg" + - "CgpUaGVzZSBzdGFja3MgaGF2ZSBzZXBhcmF0ZSBlbnZpcm9ubWVudHMgYW5kIGNsdXN0ZXIgY29u" + - "dGV4dHMuIFRoZSBIZWxtZmlsZQp2YWx1ZXMgZmxvdyBhdXRob3JzIGJvdGggZW52aXJvbm1lbnQg" + - "ZmlsZXMuIFRoZSBDTEkgcHJvZmlsZSBmbG93IGluc3RlYWQgdXNlcwp0aGUgQ0xJLWdlbmVyYXRl" + - "ZCBjb250cm9sLXBsYW5lIHByb2ZpbGUgYXMgaXRzIGVuZHBvaW50IHNvdXJjZS4gRG8gbm90IG1p" + - "eCB0aGUKaGFuZG9mZnMuIFNlZSBbU3BsaXQgQ29tcHV0ZS1QbGFuZSBJbnN0YWxsYXRpb25dKGNv" + - "bXB1dGUtcGxhbmUtaW5zdGFsbGF0aW9uLm1kKS4KCiMjIEdvdG1wbCBGaWxlcyBhbmQgVGhlaXIg" + - "UmVsZWFzZXMKCiMjIyAwMS1kZXBlbmRlbmNpZXMueWFtbC5nb3RtcGwKCnwgUmVsZWFzZSB8IENo" + - "YXJ0IHwgTmFtZXNwYWNlIHwgTm90ZXMgfAp8LS0tLS0tLS0tfC0tLS0tLS18LS0tLS0tLS0tLS18" + - "LS0tLS0tLXwKfCBuYXRzIHwgaGVsbS1udmNmLW5hdHMgfCBuYXRzLXN5c3RlbSB8IE1lc3NhZ2lu" + - "ZyB8Cnwgb3BlbmJhby1zZXJ2ZXIgfCBoZWxtLW52Y2Ytb3BlbmJhby1zZXJ2ZXIgfCB2YXVsdC1z" + - "eXN0ZW0gfCBTZWNyZXRzIG1hbmFnZW1lbnQsIGRlcGVuZHMgb24gbmF0cyB8CnwgY2Fzc2FuZHJh" + - "IHwgaGVsbS1udmNmLWNhc3NhbmRyYSB8IGNhc3NhbmRyYS1zeXN0ZW0gfCBEYXRhYmFzZSB8CgpV" + - "c2VzIGA8PDogKmRlcGVuZGVuY3lgIHRlbXBsYXRlIGluaGVyaXRhbmNlIHdpdGggYHJlbGVhc2Ut" + - "Z3JvdXA6IGRlcGVuZGVuY2llc2AgbGFiZWwuCgojIyMgMDItY29yZS55YW1sLmdvdG1wbAoKfCBS" + - "ZWxlYXNlIHwgQ2hhcnQgfCBOYW1lc3BhY2UgfCBMYWJlbCB8CnwtLS0tLS0tLS18LS0tLS0tLXwt" + - "LS0tLS0tLS0tLXwtLS0tLS0tfAp8IGFwaS1rZXlzIHwgaGVsbS1udmNmLWFwaS1rZXlzIHwgYXBp" + - "LWtleXMgfCBzZXJ2aWNlcyB8Cnwgc2lzIHwgaGVsbS1udmNmLXNpcyB8IHNpcyB8IHNlcnZpY2Vz" + - "IHwKfCBhcGkgfCBoZWxtLW52Y2YtYXBpIHwgbnZjZiB8IHNlcnZpY2VzIHwKfCBpbnZvY2F0aW9u" + - "LXNlcnZpY2UgfCBoZWxtLW52Y2YtaW52b2NhdGlvbi1zZXJ2aWNlIHwgbnZjZiB8IHNlcnZpY2Vz" + - "IHwKfCBncnBjLXByb3h5IHwgaGVsbS1udmNmLWdycGMtcHJveHkgfCBudmNmIHwgc2VydmljZXMg" + - "fAp8IGVzcy1hcGkgfCBoZWxtLW52Y2YtZXNzLWFwaSB8IGVzcyB8IHNlcnZpY2VzIHwKfCBub3Rh" + - "cnktc2VydmljZSB8IGhlbG0tbnZjZi1ub3Rhcnktc2VydmljZSB8IG52Y2YgfCBzZXJ2aWNlcyB8" + - "CnwgcmV2YWwgfCBoZWxtLXJldmFsIHwgbnZjZiB8IHNlcnZpY2VzIHwKfCBsbG0tcmVxdWVzdC1y" + - "b3V0ZXIgfCBudmNmL2hlbG0tbnZjZi1sbG0tcmVxdWVzdC1yb3V0ZXIgfCBudmNmIHwgc2Vydmlj" + - "ZXMgfAp8IGxsbS1hcGktZ2F0ZXdheSB8IG52Y2YvaGVsbS1udmNmLWxsbS1hcGktZ2F0ZXdheSB8" + - "IG52Y2YgfCBzZXJ2aWNlcyB8CnwgYWRtaW4taXNzdWVyLXByb3h5IHwgaGVsbS1hZG1pbi10b2tl" + - "bi1pc3N1ZXItcHJveHkgfCBhcGkta2V5cyB8IChubyByZWxlYXNlLWdyb3VwIGxhYmVsKSB8Cnwg" + - "aW5ncmVzcyB8IG52Y2YtZ2F0ZXdheS1yb3V0ZXMgfCBlbnZveS1nYXRld2F5LXN5c3RlbSB8IGlu" + - "Z3Jlc3MgfAoKTW9zdCBzZXJ2aWNlcyB1c2UgYGluaGVyaXQ6IFt7dGVtcGxhdGU6IHNlcnZpY2V9" + - "XWAuIExMTSByZWxlYXNlcyB1c2UgT0NJIGNoYXJ0cyBmcm9tIHRoZSBgbnZjZmAgcmVwb3NpdG9y" + - "eSB3aXRoIHN0YW5kYWxvbmUgYHZhbHVlczogWy4uL2dsb2JhbC55YW1sLmdvdG1wbF1gIGJsb2Nr" + - "czsgdGhleSBhcmUgZ2F0ZWQgb24gYGFkZG9ucy5sbG0uZW5hYmxlZGAuIGBhZG1pbi1pc3N1ZXIt" + - "cHJveHlgIGFuZCBgaW5ncmVzc2AgaGF2ZSBzdGFuZGFsb25lIGB2YWx1ZXM6YCBibG9ja3MuCgoj" + - "IyMgMDMtb2JzZXJ2YWJpbGl0eS55YW1sLmdvdG1wbAoKfCBSZWxlYXNlIHwgQ2hhcnQgfCBOYW1l" + - "c3BhY2UgfCBMYWJlbCB8CnwtLS0tLS0tLS18LS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tfAp8" + - "IChvYnNlcnZhYmlsaXR5IHJlbGVhc2VzKSB8ICh2YXJpb3VzKSB8IG9ic2VydmFiaWxpdHkgfCBv" + - "YnNlcnZhYmlsaXR5IHwKCkdhdGVkIG9uIG9ic2VydmFiaWxpdHktc3BlY2lmaWMgZmxhZ3MgaW4g" + - "dGhlIGVudmlyb25tZW50IGZpbGUuIFNraXBwZWQgaWYgZGlzYWJsZWQuCgojIyBUZW1wbGF0ZSBJ" + - "bmhlcml0YW5jZQoKIyMjIGA8PDogKmRlcGVuZGVuY3lgIChZQU1MIG1lcmdlKQoKVXNlZCBpbiBg" + - "MDEtZGVwZW5kZW5jaWVzLnlhbWwuZ290bXBsYC4gTWVyZ2VzIHRoZSB0ZW1wbGF0ZSdzIHByb3Bl" + - "cnRpZXMgaW50byB0aGUgcmVsZWFzZS4KCioqR290Y2hhKio6IFlBTUwgbWVyZ2UgcmVwbGFjZXMg" + - "bGlzdHMuIElmIHlvdSBhZGQgYSBgdmFsdWVzOmAga2V5IHRvIHRoZSByZWxlYXNlLCBpdCAqKnJl" + - "cGxhY2VzKiogdGhlIHRlbXBsYXRlJ3MgYHZhbHVlczpgIGxpc3QgZW50aXJlbHkuIFlvdSBtdXN0" + - "IHJlLWluY2x1ZGUgYWxsIHRlbXBsYXRlIHZhbHVlczoKCkluIHRoZSB0ZW1wbGF0ZSBiZWxvdywg" + - "YDxwcml2YXRlLXZhbHVlcz5gIHJlZmVycyB0byB0aGUgYHNlY3JldHMvYCBkaXJlY3RvcnkgYXQg" + - "dGhlIGhlbG1maWxlIHN0YWNrIHJvb3QuCgpgYGB5YW1sCiMgVGVtcGxhdGUgZGVmaW5lczoKdGVt" + - "cGxhdGVzOgogIGRlcGVuZGVuY3k6ICZkZXBlbmRlbmN5CiAgICBjaGFydDogbnZjZi9oZWxtLW52" + - "Y2Yte3sgLlJlbGVhc2UuTmFtZSB9fQogICAgdmFsdWVzOgogICAgICAtIC4uL2dsb2JhbC55YW1s" + - "LmdvdG1wbAogICAgICAtIC4uLzxwcml2YXRlLXZhbHVlcz4ve3sgcmVxdWlyZWRFbnYgIkhFTE1G" + - "SUxFX0VOViIgfX0tc2VjcmV0cy55YW1sCgojIFdoZW4gb3ZlcnJpZGluZywgTVVTVCByZS1pbmNs" + - "dWRlIGJvdGg6Ci0gbmFtZTogY2Fzc2FuZHJhCiAgPDw6ICpkZXBlbmRlbmN5CiAgdmFsdWVzOgog" + - "ICAgLSAuLi9nbG9iYWwueWFtbC5nb3RtcGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg" + - "ICAgICAgICAgICAgICAgIyBNdXN0IHJlLWluY2x1ZGUKICAgIC0gLi4vPHByaXZhdGUtdmFsdWVz" + - "Pi97eyByZXF1aXJlZEVudiAiSEVMTUZJTEVfRU5WIiB9fS1zZWNyZXRzLnlhbWwgICAjIE11c3Qg" + - "cmUtaW5jbHVkZQogICAgLSBjYXNzYW5kcmE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg" + - "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgWW91ciBvdmVycmlkZQogICAgICAgIHJlc291" + - "cmNlczoKICAgICAgICAgIGxpbWl0czoKICAgICAgICAgICAgbWVtb3J5OiA4MTkyTWkKYGBgCgoj" + - "IyMgYGluaGVyaXRgIChIZWxtZmlsZSBuYXRpdmUpCgpVc2VkIGluIGAwMi1jb3JlLnlhbWwuZ290" + - "bXBsYC4gSGVsbWZpbGUncyBuYXRpdmUgaW5oZXJpdGFuY2UgbWVjaGFuaXNtLgoKYGBgeWFtbAot" + - "IG5hbWU6IGFwaQogIHZlcnNpb246IDEuNi4wCiAgbmFtZXNwYWNlOiBudmNmCiAgaW5oZXJpdDoK" + - "ICAgIC0gdGVtcGxhdGU6IHNlcnZpY2UKYGBgCgpXaGVuIGFkZGluZyBgdmFsdWVzOmAgdG8gYW4g" + - "aW5oZXJpdGVkIHJlbGVhc2UsIHlvdSBhbHNvIG5lZWQgdG8gcmUtaW5jbHVkZSB0aGUgdGVtcGxh" + - "dGUncyB2YWx1ZXMgZmlsZXMgc2luY2UgYHZhbHVlc2AgaXMgYSBsaXN0IHRoYXQgZ2V0cyByZXBs" + - "YWNlZC4KCiMjIFZhbHVlcyBQcmVjZWRlbmNlCgpGcm9tIGxvd2VzdCB0byBoaWdoZXN0IHByaW9y" + - "aXR5OgoKMS4gYGVudmlyb25tZW50cy9iYXNlLnlhbWxgIC0tIGRlZmF1bHRzIHNoYXJlZCBhY3Jv" + - "c3MgYWxsIGVudmlyb25tZW50cwoyLiBgZW52aXJvbm1lbnRzLzxlbnY+LnlhbWxgIC0tIHBlci1l" + - "bnZpcm9ubWVudCBvdmVycmlkZXMKMy4gYGdsb2JhbC55YW1sLmdvdG1wbGAgLS0gR28gdGVtcGxh" + - "dGUgcHJvY2Vzc2luZyAoY29uc3RydWN0cyBjaGFydC1zcGVjaWZpYyBzdHJ1Y3R1cmUpCjQuIGA8" + - "cHJpdmF0ZS12YWx1ZXM+LzxlbnY+LXNlY3JldHMueWFtbGAgLS0gc2Vuc2l0aXZlIHZhbHVlcwo1" + - "LiBJbmxpbmUgYHZhbHVlczpgIGJsb2NrcyBvbiByZWxlYXNlcyAtLSBoaWdoZXN0IHByZWNlZGVu" + - "Y2UKCiMjIFdoYXQgZ2xvYmFsLnlhbWwuZ290bXBsIFBhc3NlcyBUaHJvdWdoCgpgZ2xvYmFsLnlh" + - "bWwuZ290bXBsYCByZWFkcyBmcm9tIGAuVmFsdWVzYCAodGhlIG1lcmdlZCBlbnZpcm9ubWVudCAr" + - "IGVudi1zcGVjaWZpYyBZQU1MKSBhbmQgY29uc3RydWN0cyBjaGFydC1zcGVjaWZpYyB2YWx1ZXMu" + - "IEl0IG9ubHkgcGFzc2VzIHRocm91Z2gga2V5cyBpdCBleHBsaWNpdGx5IHJlZmVyZW5jZXM6Cgoj" + - "IyMgQ2Fzc2FuZHJhCi0gYGNhc3NhbmRyYS5yZXBsaWNhQ291bnRgCi0gYGNhc3NhbmRyYS5pbWFn" + - "ZS4qYCAocmVnaXN0cnksIHJlcG9zaXRvcnkpCi0gYGNhc3NhbmRyYS5taWdyYXRpb25zLmltYWdl" + - "LipgCi0gYGNhc3NhbmRyYS5wZXJzaXN0ZW5jZS5zaXplYAotIGBjYXNzYW5kcmEubm9kZVNlbGVj" + - "dG9yYCAoaWYgYGdsb2JhbC5ub2RlU2VsZWN0b3JzLmVuYWJsZWRgKQotIGBjYXNzYW5kcmEuZ2xv" + - "YmFsLmRlZmF1bHRTdG9yYWdlQ2xhc3NgCgojIyMgTkFUUwotIGBuYXRzLmNvbnRhaW5lci5pbWFn" + - "ZS4qYAotIGBuYXRzLnJlbG9hZGVyLmltYWdlLipgCi0gYG5hdHMubmF0c0JveC5jb250YWluZXIu" + - "aW1hZ2UuKmAKLSBgbmF0cy5jb25maWcuamV0c3RyZWFtLmZpbGVTdG9yZS5wdmMuc3RvcmFnZUNs" + - "YXNzTmFtZWAKLSBgbmF0cy5wb2RUZW1wbGF0ZS5tZXJnZS5zcGVjLm5vZGVTZWxlY3RvcmAgKGlm" + - "IGVuYWJsZWQpCgojIyMgT3BlbkJhbwotIGBvcGVuYmFvLm1pZ3JhdGlvbnMuaW1hZ2UuKmAgYW5k" + - "IGBvcGVuYmFvLm1pZ3JhdGlvbnMuZW52YAotIGBvcGVuYmFvLmluamVjdG9yLmltYWdlLipgCi0g" + - "YG9wZW5iYW8uc2VydmVyLmltYWdlLipgCi0gYG9wZW5iYW8uc2VydmVyLmRhdGFTdG9yYWdlLipg" + - "Ci0gTm9kZSBzZWxlY3RvcnMgKGlmIGVuYWJsZWQpCgojIyMgU2VydmljZXMgKEFQSSwgU0lTLCBl" + - "dGMuKQotIGA8c2VydmljZT4uaW1hZ2UuKmAgKHJlZ2lzdHJ5LCByZXBvc2l0b3J5KQotIGA8c2Vy" + - "dmljZT4ubm9kZVNlbGVjdG9yYCAoaWYgZW5hYmxlZCkKLSBgPHNlcnZpY2U+LmVudi4qYCAob2Jz" + - "ZXJ2YWJpbGl0eSBzZXR0aW5ncykKCiMjIyBMTE0gRnVuY3Rpb24gRW5hYmxlbWVudAoKRW5hYmxl" + - "IHRoZSBMTE0gYWRkb24gYmVmb3JlIGNyZWF0aW5nIG9yIGludm9raW5nIGZ1bmN0aW9ucyB3aXRo" + - "CmBmdW5jdGlvblR5cGU6ICJMTE0iYC4gVGhlIGFkZG9uIGRlcGxveXMgYGxsbS1yZXF1ZXN0LXJv" + - "dXRlcmAgYW5kCmBsbG0tYXBpLWdhdGV3YXlgLCBhZGRzIHRoZSBgbGxtLmludm9jYXRpb24uPGRv" + - "bWFpbj5gIHJvdXRlIHdoZW4gR2F0ZXdheSBBUEkKaW5ncmVzcyBpcyBlbmFibGVkLCBhbmQgY29u" + - "ZmlndXJlcyB3b3JrZXJzIHRvIHVzZSB0aGUgTExNIHNpZGVjYXIuIFRoZSBIZWxtZmlsZQpjb25k" + - "aXRpb24gaXMgYGFkZG9ucy5sbG0uZW5hYmxlZGAuIERvIG5vdCB1c2UgdGhlIG9ic29sZXRlIGBs" + - "bG0uZW5hYmxlZGAgcGF0aC4KCkZvciBhIHNpbmdsZS1ub2RlIGlzb2xhdGVkIHRlc3QgY2x1c3Rl" + - "ciwgYWRkIHRoaXMgY29uZmlndXJhdGlvbiB0bwpgZW52aXJvbm1lbnRzLzxlbnY+LnlhbWxgIGJl" + - "Zm9yZSBhcHBseWluZyB0aGUgc3RhY2s6CgpgYGB5YW1sCmFkZG9uczoKICBsbG06CiAgICBlbmFi" + - "bGVkOiB0cnVlCiAgICBnYXRld2F5OgogICAgICByZXBsaWNhQ291bnQ6IDEKICAgICAgYXV0aDoK" + - "ICAgICAgICBncnBjSW5zZWN1cmU6IHRydWUKICAgICAgbWV0cmljczoKICAgICAgICBzZXJ2aWNl" + - "TW9uaXRvcjoKICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlCiAgICByZXF1ZXN0Um91dGVyOgogICAg" + - "ICByZXBsaWNhQ291bnQ6IDEKICAgICAgbWV0cmljczoKICAgICAgICBzZXJ2aWNlTW9uaXRvcjoK" + - "ICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlCgphZ2VudENvbmZpZzoKICBtZXJnZUNvbmZpZzogfAog" + - "ICAgY2x1c3RlcjoKICAgICAgdmFsaWRhdGlvblBvbGljeToKICAgICAgICBuYW1lOiBVbnJlc3Ry" + - "aWN0ZWQKICAgIHdvcmtsb2FkOgogICAgICBzdGFyZ2F0ZVFVSUNJbnNlY3VyZTogdHJ1ZQpgYGAK" + - "ClVzZSBgcmVwbGljYUNvdW50OiAxYCBvbmx5IGZvciBsb2NhbCBvciBzaW5nbGUtbm9kZSB0ZXN0" + - "IGNsdXN0ZXJzLiBGb3Igc2hhcmVkCm9yIHByb2R1Y3Rpb24gY2x1c3RlcnMsIHVzZSB0aGUgcmVx" + - "dWlyZWQgcmVwbGljYSBjb3VudCBhbmQgVExTLWNhcGFibGUgc2VydmljZQpjb25maWd1cmF0aW9u" + - "LiBgYWRkb25zLmxsbS5nYXRld2F5LmF1dGguZ3JwY0luc2VjdXJlYCBhbmQKYHdvcmtsb2FkLnN0" + - "YXJnYXRlUVVJQ0luc2VjdXJlYCBlbmFibGUgcGxhaW50ZXh0IHRyYW5zcG9ydHMuIERvIG5vdCB1" + - "c2UgdGhlbSBpbgpwcm9kdWN0aW9uLgoKVGhlIHJlcXVlc3Qgcm91dGVyIHVzZXMgYHBvd2VyLW9m" + - "LXR3b2Agd2hlbiBubyBsb2FkLWJhbGFuY2VyIGNvbmZpZ3VyYXRpb24gaXMKc2V0LiBDb25maWd1" + - "cmUgb3RoZXIgcm91dGluZyBtZXRob2RzIHdpdGggdGhlCltMTE0gUmVxdWVzdCBSb3V0ZXIgTG9h" + - "ZCBCYWxhbmNpbmddKGh0dHBzOi8vZ2l0aHViLmNvbS9OVklESUEvbnZjZi9ibG9iL21haW4vZG9j" + - "cy91c2VyL2xsbS1yZXF1ZXN0LXJvdXRlci1sb2FkLWJhbGFuY2luZy5tZCkKZ3VpZGUuCgpJZiB0" + - "aGUgc2lkZWNhciBpbWFnZSBpcyBtaXJyb3JlZCBvdXRzaWRlIHRoZSBzdGFjaydzIGRlZmF1bHQg" + - "aW1hZ2UgcmVnaXN0cnkgYW5kCnJlcG9zaXRvcnksIHNldCB0aGUgZ2VuZXJhdGVkIHdvcmtlciBz" + - "aWRlY2FyIGltYWdlIGV4cGxpY2l0bHk6CgpgYGB5YW1sCmFwaToKICBlbnY6CiAgICBOVkNGX1NJ" + - "REVDQVJTX0xMTV9ST1VURVJfQ0xJRU5UX0lNQUdFOiA8cmVnaXN0cnk+LzxyZXBvc2l0b3J5Pi9w" + - "eWxvbjowLjIuMQpgYGAKClJlbmRlciBhbmQgYXBwbHkgdGhlIHVwZGF0ZWQgY29udHJvbC1wbGFu" + - "ZSBlbnZpcm9ubWVudCwgdGhlbiByZWZyZXNoIGV2ZXJ5CnJlZ2lzdGVyZWQgY29tcHV0ZSBwbGFu" + - "ZSB1c2luZyB0aGUgc2FtZSBoYW5kb2ZmIHVzZWQgZm9yIGl0cyBpbnN0YWxsYXRpb24gc28KTlZD" + - "QSByZWNlaXZlcyBgYWdlbnRDb25maWcubWVyZ2VDb25maWdgOgoKYGBgYmFzaApIRUxNRklMRV9F" + - "TlY9PGVudj4gaGVsbWZpbGUgdGVtcGxhdGUKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIHN5" + - "bmMKYGBgCgpVc2UgdGhlIGNvbXBsZXRlIGNvbXB1dGUtcGxhbmUgaW5zdGFsbCBjb21tYW5kIGZy" + - "b20KW1NwbGl0IENvbXB1dGUtUGxhbmUgSW5zdGFsbGF0aW9uXShjb21wdXRlLXBsYW5lLWluc3Rh" + - "bGxhdGlvbi5tZCkuIEEKQ0xJLXByb2ZpbGUgaW5zdGFsbGF0aW9uIG11c3QgcmVtYWluIHByb2Zp" + - "bGUtZHJpdmVuOyBhIEhlbG1maWxlIGluc3RhbGxhdGlvbgptdXN0IHJlbWFpbiB2YWx1ZXMtZHJp" + - "dmVuLgoKRXhpc3RpbmcgTExNIGZ1bmN0aW9uIHBvZHMga2VlcCB0aGVpciBleGlzdGluZyBzaWRl" + - "Y2FyIGFyZ3VtZW50cy4gUmVjcmVhdGUgb3IKcmVkZXBsb3kgdGhvc2UgZnVuY3Rpb25zIGFmdGVy" + - "IHRoZSBjb21wdXRlLXBsYW5lIHJlZnJlc2guIFZlcmlmeSB0aGUgY29udHJvbApwbGFuZSwgcm91" + - "dGUsIGFuZCB3b3JrZXIgc2lkZWNhcjoKCmBgYGJhc2gKa3ViZWN0bCBnZXQgZGVwbG95IC1uIG52" + - "Y2YgbGxtLWFwaS1nYXRld2F5Cmt1YmVjdGwgZ2V0IHN0YXRlZnVsc2V0IC1uIG52Y2YgbGxtLXJl" + - "cXVlc3Qtcm91dGVyCmt1YmVjdGwgZ2V0IHBvZHMgLW4gbnZjZiB8IGdyZXAgLUUgJ2xsbS1hcGkt" + - "Z2F0ZXdheXxsbG0tcmVxdWVzdC1yb3V0ZXInCmt1YmVjdGwgZ2V0IGh0dHByb3V0ZSAtQSB8IGdy" + - "ZXAgbGxtCmt1YmVjdGwgLW4gbnZjZi1iYWNrZW5kIGdldCBwb2QgPGZ1bmN0aW9uLXBvZD4gXAog" + - "IC1vIGpzb25wYXRoPSd7cmFuZ2UgLnNwZWMuY29udGFpbmVyc1s/KEAubmFtZT09ImxsbS13b3Jr" + - "ZXIiKV0uYXJnc1sqXX17Ln17IlxcbiJ9e2VuZH0nCmBgYAoKRm9yIGxvY2FsIHBsYWludGV4dCBj" + - "bHVzdGVycywgdGhlIGBsbG0td29ya2VyYCBhcmdzIG11c3QgaW5jbHVkZQpgLS1xdWljLWluc2Vj" + - "dXJlYC4KCkZvciBsb2FkLWJhbGFuY2VyIHNjaGVtYSBhbmQgYWxnb3JpdGhtIGJlaGF2aW9yLCBz" + - "ZWUgdGhlCltTdGFyZ2F0ZSBjb25maWd1cmF0aW9uIGd1aWRlXShodHRwczovL2dpdGh1Yi5jb20v" + - "TlZJRElBL252Y2YvYmxvYi9tYWluL3NyYy9saWJyYXJpZXMvcnVzdC9zdGFyZ2F0ZS9kb2NzL2xv" + - "YWQtYmFsYW5jZXItY29uZmlndXJhdGlvbi5tZCkuCgojIyBIZWxtZmlsZSBTZWxlY3RvcnMKClRh" + - "cmdldCBzcGVjaWZpYyByZWxlYXNlcyBvciBncm91cHM6CgpgYGBiYXNoCiMgQnkgcmVsZWFzZSBn" + - "cm91cApIRUxNRklMRV9FTlY9PGVudj4gaGVsbWZpbGUgLS1zZWxlY3RvciByZWxlYXNlLWdyb3Vw" + - "PWRlcGVuZGVuY2llcyBzeW5jCkhFTE1GSUxFX0VOVj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9y" + - "IHJlbGVhc2UtZ3JvdXA9c2VydmljZXMgc3luYwpIRUxNRklMRV9FTlY9PGVudj4gaGVsbWZpbGUg" + - "LS1zZWxlY3RvciByZWxlYXNlLWdyb3VwPWluZ3Jlc3Mgc3luYwpIRUxNRklMRV9FTlY9PGVudj4g" + - "aGVsbWZpbGUgLS1zZWxlY3RvciByZWxlYXNlLWdyb3VwPW9ic2VydmFiaWxpdHkgc3luYwoKIyBC" + - "eSByZWxlYXNlIG5hbWUKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0b3IgbmFt" + - "ZT1jYXNzYW5kcmEgc3luYwpIRUxNRklMRV9FTlY9PGVudj4gaGVsbWZpbGUgLS1zZWxlY3RvciBu" + - "YW1lPWFkbWluLWlzc3Vlci1wcm94eSBzeW5jCkhFTE1GSUxFX0VOVj08ZW52PiBoZWxtZmlsZSAt" + - "LXNlbGVjdG9yIG5hbWU9bGxtLXJlcXVlc3Qtcm91dGVyIHN5bmMKSEVMTUZJTEVfRU5WPTxlbnY+" + - "IGhlbG1maWxlIC0tc2VsZWN0b3IgbmFtZT1sbG0tYXBpLWdhdGV3YXkgc3luYwoKIyBUZW1wbGF0" + - "ZSBvbmx5IChkcnkgcnVuKQpIRUxNRklMRV9FTlY9PGVudj4gaGVsbWZpbGUgLS1zZWxlY3RvciBu" + - "YW1lPWNhc3NhbmRyYSB0ZW1wbGF0ZQoKIyBEZXN0cm95IGEgc2luZ2xlIHJlbGVhc2UKSEVMTUZJ" + - "TEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0b3IgbmFtZT1jYXNzYW5kcmEgZGVzdHJveQpg" + - "YGAKCk5vdGU6IGBhZG1pbi1pc3N1ZXItcHJveHlgIGhhcyBubyBgcmVsZWFzZS1ncm91cGAgbGFi" + - "ZWwuIFVzZSBgLS1zZWxlY3RvciBuYW1lPWFkbWluLWlzc3Vlci1wcm94eWAuClBLBwjAViDnjycA" + - "AI8nAABQSwMEFAAIAAAAAAAhAAAAAAAAAAAAAAAAAD8ACQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2Vk" + - "LWluc3RhbGxhdGlvbi9yZWZlcmVuY2VzL252Y2YtdWktYWRkb24ubWRVVAUAAQCmzhIjIE5WQ0Yg" + - "VUkgQWRkb24KCk5WQ0YgVUkgaXMgYW4gb3B0aW9uYWwsIGN1c3RvbWVyLWZhY2luZyBOVkNGIGFk" + - "bWluLXBhbmVsIFVJLiBJdCBpcyBkaXNhYmxlZCBieQpkZWZhdWx0IGFuZCBhdmFpbGFibGUgb25s" + - "eSBpbiBzdGFjayBwYWNrYWdlcyB0aGF0IGluY2x1ZGUgdGhlIE5WQ0YgVUkgYWRkb24uCgojIyBX" + - "aGVuIHRvIGVuYWJsZQoKRW5hYmxlIE5WQ0YgVUkgb25seSB3aGVuIHlvdSBuZWVkIHRoZSBhZG1p" + - "bi1wYW5lbCBVSSBhbmQgeW91ciBleHRyYWN0ZWQgc3RhY2sKcGFja2FnZSBpbmNsdWRlcyB0aGUg" + - "YWRkb24uIElmIHRoZSBwYWNrYWdlIGRvZXMgbm90IGNvbnRhaW4gYSBgbnZjZi11aWAgcmVsZWFz" + - "ZQphbmQgYG52Y2ZVaWAgcm91dGUgdmFsdWVzLCBza2lwIHRoZSBhZGRvbiB1bnRpbCB5b3UgdXNl" + - "IGEgcGFja2FnZSB0aGF0IGluY2x1ZGVzCnRoZW0uCgojIyBFbmFibGUgdGhlIGFkZG9uCgpFbmFi" + - "bGUgaXQgaW4gYGVudmlyb25tZW50cy88ZW52LW5hbWU+LnlhbWxgOgoKYGBgeWFtbAphZGRvbnM6" + - "CiAgbnZjZlVpOgogICAgZW5hYmxlZDogdHJ1ZQpgYGAKCiMjIENyZWF0ZSBuYW1lc3BhY2UgYW5k" + - "IGltYWdlIHB1bGwgc2VjcmV0CgpDcmVhdGUgdGhlIG5hbWVzcGFjZSwgYW5kIGFuIGltYWdlIHB1" + - "bGwgc2VjcmV0IG9ubHkgaWYgcHVsbGluZyBmcm9tIGEgcHJpdmF0ZQpyZWdpc3RyeToKCmBgYGJh" + - "c2gKa3ViZWN0bCBjcmVhdGUgbmFtZXNwYWNlIG52Y2YtdWkgLS1kcnktcnVuPWNsaWVudCAtbyB5" + - "YW1sIHwga3ViZWN0bCBhcHBseSAtZiAtCgojIE9ubHkgaWYgcHVsbGluZyBmcm9tIGEgcHJpdmF0" + - "ZSByZWdpc3RyeSAoZS5nLiwgTkdDIG52Y3IuaW8pCmV4cG9ydCBOR0NfQVBJX0tFWT0iPHlvdXIt" + - "a2V5PiIKa3ViZWN0bCBjcmVhdGUgc2VjcmV0IGRvY2tlci1yZWdpc3RyeSBudmNyLWNyZWRzIFwK" + - "ICAtLWRvY2tlci1zZXJ2ZXI9bnZjci5pbyBcCiAgLS1kb2NrZXItdXNlcm5hbWU9JyRvYXV0aHRv" + - "a2VuJyBcCiAgLS1kb2NrZXItcGFzc3dvcmQ9IiROR0NfQVBJX0tFWSIgXAogIC0tbmFtZXNwYWNl" + - "PW52Y2YtdWkgXAogIC0tZHJ5LXJ1bj1jbGllbnQgLW8geWFtbCB8IGt1YmVjdGwgYXBwbHkgLWYg" + - "LQpgYGAKClRoZSBkZWZhdWx0IHJvdXRlIGhvc3QgaXMgYG52Y2YtdWkuPGRvbWFpbj5gIGFuZCB0" + - "aGUgYmFja2VuZCBpcwpgbnZjZi11aS5udmNmLXVpOjgzMDBgLgoKIyMgQXBwbHkgdGhlIHNlcnZp" + - "Y2UgYW5kIHJvdXRlCgpBZnRlciBjb25maXJtaW5nIHRoZSBwYWNrYWdlIGluY2x1ZGVzIHRoZSBg" + - "bnZjZi11aWAgcmVsZWFzZSwgcHJldmlldyBhbmQgYXBwbHkKdGhlIHNlcnZpY2UgYW5kIHJvdXRl" + - "OgoKYGBgYmFzaApIRUxNRklMRV9FTlY9PGVudi1uYW1lPiBoZWxtZmlsZSAtLXNlbGVjdG9yIG5h" + - "bWU9bnZjZi11aSB0ZW1wbGF0ZQpIRUxNRklMRV9FTlY9PGVudi1uYW1lPiBoZWxtZmlsZSAtLXNl" + - "bGVjdG9yIG5hbWU9bnZjZi11aSBzeW5jCkhFTE1GSUxFX0VOVj08ZW52LW5hbWU+IGhlbG1maWxl" + - "IC0tc2VsZWN0b3IgcmVsZWFzZS1ncm91cD1pbmdyZXNzIHN5bmMKYGBgCgojIyBWZXJpZnkKClZl" + - "cmlmeSB0aGUgcm91dGUgb25seSB3aGVuIHRoZSBhZGRvbiBpcyBwcmVzZW50IGFuZCBlbmFibGVk" + - "OgoKYGBgYmFzaAprdWJlY3RsIGdldCBkZXBsb3ksc3ZjIC1uIG52Y2YtdWkKa3ViZWN0bCBnZXQg" + - "aHR0cHJvdXRlIC1BIHwgZ3JlcCAtaSBudmNmLXVpCmN1cmwgLWkgLUggIkhvc3Q6IG52Y2YtdWku" + - "PGRvbWFpbj4iICJodHRwOi8vPGdhdGV3YXktYWRkcmVzcz4vc3RhdHVzIgpgYGAKCiMjIFNlY3Vy" + - "aXR5CgpUaGUgTlZDRiBVSSBhZG1pbiBwYW5lbCBpcyBjdXJyZW50bHkgdW5hdXRoZW50aWNhdGVk" + - "LiBEbyBub3QgZXhwb3NlIGl0IHRvIHRoZQpwdWJsaWMgaW50ZXJuZXQuIFJlc3RyaWN0IGFjY2Vz" + - "cyB0byBhIHRydXN0ZWQgbmV0d29yaywgVlBOLCBvciBhbiBhdXRoZW50aWNhdGluZwpwcm94eSBp" + - "biBmcm9udCBvZiB0aGUgYG52Y2YtdWlgIHJvdXRlLgpQSwcIOPknr7kHAAC5BwAAUEsDBBQACAAA" + - "AAAAIQAAAAAAAAAAAAAAAAA+AAkAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24v" + - "cmVmZXJlbmNlcy9wdWxsLXNlY3JldHMubWRVVAUAAQCmzhIjIEltYWdlIFB1bGwgU2VjcmV0cyBS" + - "ZWZlcmVuY2UKCiMjIE92ZXJ2aWV3CgpXaGVuIHB1bGxpbmcgTlZDRiBpbWFnZXMgZnJvbSBhIHBy" + - "aXZhdGUgcmVnaXN0cnkgKGZvciBleGFtcGxlLCBOR0MKYG52Y3IuaW9gKSwgS3ViZXJuZXRlcyBu" + - "ZWVkcyBgaW1hZ2VQdWxsU2VjcmV0c2Agb24gZXZlcnkgcG9kLiBDb250cm9sLXBsYW5lIGFuZApj" + - "b21wdXRlLXBsYW5lIGNyZWRlbnRpYWxzIGFyZSBjb25maWd1cmVkIGluIHRoZWlyIG93biBjbHVz" + - "dGVyIGNvbnRleHRzLiBEbyBub3QKdXNlIG9uZSBtaXhlZCBuYW1lc3BhY2UgbGlzdC4KClRoZSBy" + - "ZWNvbW1lbmRlZCBjb250cm9sLXBsYW5lIGFwcHJvYWNoIHVzZXMgS3l2ZXJubyB0byBpbmplY3Qg" + - "dGhlIHNlY3JldCBpbnRvCmNvbnRyb2wtcGxhbmUgcG9kcyBhdCBhZG1pc3Npb24gdGltZS4gVGhl" + - "IGNvbXB1dGUtcGxhbmUgY2hhcnQgYW5kIG9wZXJhdG9yIHVzZQp0aGUgc2VjcmV0IGluIGBudmNh" + - "LW9wZXJhdG9yYCBhbmQgbWlycm9yIGl0IHRvIGBudmNhLXN5c3RlbWAuCgojIyBLeXZlcm5vIEFw" + - "cHJvYWNoIChSZWNvbW1lbmRlZCkKCiMjIyAxLiBJbnN0YWxsIEt5dmVybm8KCmBgYGJhc2gKaGVs" + - "bSByZXBvIGFkZCBreXZlcm5vIGh0dHBzOi8va3l2ZXJuby5naXRodWIuaW8va3l2ZXJuby8KaGVs" + - "bSByZXBvIHVwZGF0ZQpoZWxtIGluc3RhbGwga3l2ZXJubyBreXZlcm5vL2t5dmVybm8gLW4ga3l2" + - "ZXJubyAtLWNyZWF0ZS1uYW1lc3BhY2UgXAogIC0ta3ViZS1jb250ZXh0IDxjb250cm9sLXBsYW5l" + - "LWNvbnRleHQ+CmBgYAoKIyMjIDIuIENyZWF0ZSBjb250cm9sLXBsYW5lIHB1bGwgc2VjcmV0cwoK" + - "YGBgYmFzaApleHBvcnQgTkdDX0FQSV9LRVk9Ijx5b3VyLW5nYy1hcGkta2V5PiIKCmZvciBucyBp" + - "biBjYXNzYW5kcmEtc3lzdGVtIG5hdHMtc3lzdGVtIG52Y2YgYXBpLWtleXMgZXNzIHNpcyB2YXVs" + - "dC1zeXN0ZW0gY2VydC1tYW5hZ2VyOyBkbwogIGt1YmVjdGwgLS1jb250ZXh0IDxjb250cm9sLXBs" + - "YW5lLWNvbnRleHQ+IGNyZWF0ZSBuYW1lc3BhY2UgIiRucyIgXAogICAgLS1kcnktcnVuPWNsaWVu" + - "dCAtbyB5YW1sIHwga3ViZWN0bCAtLWNvbnRleHQgPGNvbnRyb2wtcGxhbmUtY29udGV4dD4gYXBw" + - "bHkgLWYgLQpkb25lCgpmb3IgbnMgaW4gY2Fzc2FuZHJhLXN5c3RlbSBuYXRzLXN5c3RlbSBudmNm" + - "IGFwaS1rZXlzIGVzcyBzaXMgdmF1bHQtc3lzdGVtIGNlcnQtbWFuYWdlcjsgZG8KICBrdWJlY3Rs" + - "IC0tY29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBjcmVhdGUgc2VjcmV0IGRvY2tlci1y" + - "ZWdpc3RyeSBudmNyLWNyZWRzIFwKICAgIC0tZG9ja2VyLXNlcnZlcj1udmNyLmlvIFwKICAgIC0t" + - "ZG9ja2VyLXVzZXJuYW1lPSckb2F1dGh0b2tlbicgXAogICAgLS1kb2NrZXItcGFzc3dvcmQ9IiRO" + - "R0NfQVBJX0tFWSIgXAogICAgLS1uYW1lc3BhY2U9IiRucyIgXAogICAgLS1kcnktcnVuPWNsaWVu" + - "dCAtbyB5YW1sIHwga3ViZWN0bCAtLWNvbnRleHQgPGNvbnRyb2wtcGxhbmUtY29udGV4dD4gYXBw" + - "bHkgLWYgLQpkb25lCmBgYAoKRm9yIG5vbi1OR0MgcmVnaXN0cmllcywgcmVwbGFjZSBgLS1kb2Nr" + - "ZXItc2VydmVyYCwgYC0tZG9ja2VyLXVzZXJuYW1lYCwgYW5kIGAtLWRvY2tlci1wYXNzd29yZGAu" + - "CgojIyMgMy4gQXBwbHkgS3l2ZXJubyBDbHVzdGVyUG9saWN5CgpgYGB5YW1sCmFwaVZlcnNpb246" + - "IGt5dmVybm8uaW8vdjEKa2luZDogQ2x1c3RlclBvbGljeQptZXRhZGF0YToKICBuYW1lOiBudmNm" + - "LWFkZC1pbWFnZXB1bGxzZWNyZXRzCnNwZWM6CiAgYmFja2dyb3VuZDogZmFsc2UKICBydWxlczoK" + - "ICAgIC0gbmFtZTogYWRkLWltYWdlcHVsbHNlY3JldC10by1udmNmLXBvZHMKICAgICAgbWF0Y2g6" + - "CiAgICAgICAgYW55OgogICAgICAgIC0gcmVzb3VyY2VzOgogICAgICAgICAgICBraW5kczoKICAg" + - "ICAgICAgICAgLSBQb2QKICAgICAgICAgICAgbmFtZXNwYWNlczoKICAgICAgICAgICAgLSAibnZj" + - "ZiIKICAgICAgICAgICAgLSAiYXBpLWtleXMiCiAgICAgICAgICAgIC0gInNpcyIKICAgICAgICAg" + - "ICAgLSAiZXNzIgogICAgICAgICAgICAtICJuYXRzLXN5c3RlbSIKICAgICAgICAgICAgLSAiY2Fz" + - "c2FuZHJhLXN5c3RlbSIKICAgICAgICAgICAgLSAidmF1bHQtc3lzdGVtIgogICAgICAgICAgICAt" + - "ICJjZXJ0LW1hbmFnZXIiCiAgICAgIG11dGF0ZToKICAgICAgICBwYXRjaFN0cmF0ZWdpY01lcmdl" + - "OgogICAgICAgICAgbWV0YWRhdGE6CiAgICAgICAgICAgIGFubm90YXRpb25zOgogICAgICAgICAg" + - "ICAgIG52Y2YubnZpZGlhLmNvbS9pbWFnZXB1bGxzZWNyZXQtaW5qZWN0ZWQtYnk6IGt5dmVybm8K" + - "ICAgICAgICAgIHNwZWM6CiAgICAgICAgICAgIGltYWdlUHVsbFNlY3JldHM6CiAgICAgICAgICAg" + - "IC0gbmFtZTogbnZjci1jcmVkcwpgYGAKCmBgYGJhc2gKa3ViZWN0bCAtLWNvbnRleHQgPGNvbnRy" + - "b2wtcGxhbmUtY29udGV4dD4gYXBwbHkgXAogIC1mIGt5dmVybm8taW1hZ2VwdWxsc2VjcmV0LXBv" + - "bGljeS55YW1sCmBgYAoKIyMjIDQuIEluc3RhbGwgdGhlIGNvbnRyb2wgcGxhbmUKCkNvbnRpbnVl" + - "IHdpdGggdGhlIHNlbGVjdGVkIGNvbnRyb2wtcGxhbmUgaW5zdGFsbGF0aW9uIGluCltTcGxpdCBD" + - "b21wdXRlLVBsYW5lIEluc3RhbGxhdGlvbl0oY29tcHV0ZS1wbGFuZS1pbnN0YWxsYXRpb24ubWQp" + - "LiBObwpjb250cm9sLXBsYW5lIGhlbG1maWxlIG1vZGlmaWNhdGlvbnMgYXJlIG5lZWRlZC4gS3l2" + - "ZXJubyBpbmplY3RzIHRoZSBwdWxsCnNlY3JldCBpbnRvIG5ldyBjb250cm9sLXBsYW5lIHBvZHMu" + - "CgojIyBDb21wdXRlLVBsYW5lIFNlY3JldAoKQ3JlYXRlIHRoZSBzZWNyZXQgb25seSBpbiBgbnZj" + - "YS1vcGVyYXRvcmAgb24gdGhlIGNvbXB1dGUgY2x1c3RlcjoKCmBgYGJhc2gKa3ViZWN0bCAtLWNv" + - "bnRleHQgPGNvbXB1dGUtcGxhbmUtY29udGV4dD4gY3JlYXRlIG5hbWVzcGFjZSBudmNhLW9wZXJh" + - "dG9yIFwKICAtLWRyeS1ydW49Y2xpZW50IC1vIHlhbWwgfCBcCiAga3ViZWN0bCAtLWNvbnRleHQg" + - "PGNvbXB1dGUtcGxhbmUtY29udGV4dD4gYXBwbHkgLWYgLQoKa3ViZWN0bCAtLWNvbnRleHQgPGNv" + - "bXB1dGUtcGxhbmUtY29udGV4dD4gY3JlYXRlIHNlY3JldCBkb2NrZXItcmVnaXN0cnkgbnZjci1j" + - "cmVkcyBcCiAgLS1kb2NrZXItc2VydmVyPW52Y3IuaW8gXAogIC0tZG9ja2VyLXVzZXJuYW1lPSck" + - "b2F1dGh0b2tlbicgXAogIC0tZG9ja2VyLXBhc3N3b3JkPSIkTkdDX0FQSV9LRVkiIFwKICAtLW5h" + - "bWVzcGFjZT1udmNhLW9wZXJhdG9yIFwKICAtLWRyeS1ydW49Y2xpZW50IC1vIHlhbWwgfCBcCiAg" + - "a3ViZWN0bCAtLWNvbnRleHQgPGNvbXB1dGUtcGxhbmUtY29udGV4dD4gYXBwbHkgLWYgLQpgYGAK" + - "ClJlZmVyZW5jZSBpdCBpbiB0aGUgY29tcHV0ZS1wbGFuZSBlbnZpcm9ubWVudCBmaWxlOgoKYGBg" + - "eWFtbApnbG9iYWw6CiAgaW1hZ2VQdWxsU2VjcmV0czoKICAgIC0gbmFtZTogbnZjci1jcmVkcwpg" + - "YGAKClRoZSBjaGFydCBhbmQgb3BlcmF0b3IgdXNlIHRoYXQgcmVmZXJlbmNlIGluIGBudmNhLW9w" + - "ZXJhdG9yYCBhbmQgbWlycm9yIHRoZQpzZWNyZXQgdG8gYG52Y2Etc3lzdGVtYC4gRG8gbm90IGNy" + - "ZWF0ZSBhIGJyb2FkZXIgbWFudWFsIGNvbXB1dGUgbmFtZXNwYWNlIGxpc3QuIEZvbGxvdwpbU3Bs" + - "aXQgQ29tcHV0ZS1QbGFuZSBJbnN0YWxsYXRpb25dKGNvbXB1dGUtcGxhbmUtaW5zdGFsbGF0aW9u" + - "Lm1kKSBmb3IgdGhlCnNlbGVjdGVkIGluc3RhbGwgZmxvdy4KCiMjIFZlcmlmaWNhdGlvbgoKYGBg" + - "YmFzaAojIENoZWNrIHRoYXQgYSBjb250cm9sLXBsYW5lIHBvZCBoYXMgdGhlIGluamVjdGVkIHNl" + - "Y3JldAprdWJlY3RsIC0tY29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBnZXQgcG9kIC1u" + - "IDxuYW1lc3BhY2U+IDxwb2QtbmFtZT4gXAogIC1vIGpzb25wYXRoPSd7LnNwZWMuaW1hZ2VQdWxs" + - "U2VjcmV0c30nCiMgRXhwZWN0ZWQ6IFt7Im5hbWUiOiJudmNyLWNyZWRzIn1dCgojIENoZWNrIHRo" + - "ZSBLeXZlcm5vIGFubm90YXRpb24Ka3ViZWN0bCAtLWNvbnRleHQgPGNvbnRyb2wtcGxhbmUtY29u" + - "dGV4dD4gZ2V0IHBvZCAtbiA8bmFtZXNwYWNlPiA8cG9kLW5hbWU+IFwKICAtbyBqc29ucGF0aD0n" + - "ey5tZXRhZGF0YS5hbm5vdGF0aW9ucy5udmNmXC5udmlkaWFcLmNvbS9pbWFnZXB1bGxzZWNyZXQt" + - "aW5qZWN0ZWQtYnl9JwojIEV4cGVjdGVkOiBreXZlcm5vCgojIENoZWNrIHB1bGwgZXZlbnRzCmt1" + - "YmVjdGwgLS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRleHQ+IGdldCBldmVudHMgLW4gPG5h" + - "bWVzcGFjZT4gXAogIC0tc29ydC1ieT0nLmxhc3RUaW1lc3RhbXAnIHwgZ3JlcCAtaSBwdWxsCiMg" + - "U2hvdWxkIHNob3cgIlN1Y2Nlc3NmdWxseSBwdWxsZWQiIG5vdCAiNDAxIFVuYXV0aG9yaXplZCIK" + - "CiMgQ2hlY2sgdGhlIGNoYXJ0L29wZXJhdG9yIG1pcnJvciBvbiB0aGUgY29tcHV0ZSBjbHVzdGVy" + - "Cmt1YmVjdGwgLS1jb250ZXh0IDxjb21wdXRlLXBsYW5lLWNvbnRleHQ+IGdldCBzZWNyZXQgbnZj" + - "ci1jcmVkcyBcCiAgLW4gbnZjYS1zeXN0ZW0KYGBgCgojIyBXaGVuIFB1bGwgU2VjcmV0cyBBcmUg" + - "Tm90IE5lZWRlZAoKLSAqKkFXUyBFQ1Igd2l0aCBJQU0gbm9kZSByb2xlcyoqOiBJZiB5b3VyIG5v" + - "ZGVzIGhhdmUgYEFtYXpvbkVDMkNvbnRhaW5lclJlZ2lzdHJ5UmVhZE9ubHlgIElBTSBwb2xpY3ks" + - "IEt1YmVybmV0ZXMgY2FuIHB1bGwgZnJvbSBFQ1Igd2l0aG91dCBleHBsaWNpdCBzZWNyZXRzLgot" + - "ICoqUHVibGljIHJlZ2lzdHJpZXMqKjogTm8gcHVsbCBzZWNyZXRzIG5lZWRlZC4KLSAqKkNTUCBi" + - "dWlsdC1pbiBjcmVkZW50aWFsIGhlbHBlcnMqKjogR0tFIEFydGlmYWN0IFJlZ2lzdHJ5LCBBenVy" + - "ZSBBQ1Igd2l0aCBtYW5hZ2VkIGlkZW50aXR5LCBhbmQgc2ltaWxhciBzZXJ2aWNlcy4KCiMjIFRy" + - "b3VibGVzaG9vdGluZwoKIyMjIFBvZHMgc3RpbGwgaW4gSW1hZ2VQdWxsQmFja09mZiBhZnRlciBh" + - "cHBseWluZyBwb2xpY3kKClRoZSBLeXZlcm5vIHBvbGljeSBvbmx5IGFmZmVjdHMgcG9kcyBjcmVh" + - "dGVkICoqYWZ0ZXIqKiB0aGUgcG9saWN5IGlzIGFwcGxpZWQuIERlbGV0ZSBzdHVjayBwb2RzIHRv" + - "IHRyaWdnZXIgcmVjcmVhdGlvbjoKCmBgYGJhc2gKa3ViZWN0bCAtLWNvbnRleHQgPHRhcmdldC1j" + - "b250ZXh0PiBkZWxldGUgcG9kcyAtbiA8bmFtZXNwYWNlPiAtLWFsbApgYGAKCiMjIyBLeXZlcm5v" + - "IGFkbWlzc2lvbiBjb250cm9sbGVyIG5vdCBydW5uaW5nCgpgYGBiYXNoCmt1YmVjdGwgLS1jb250" + - "ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRleHQ+IGdldCBwb2RzIC1uIGt5dmVybm8KIyBBbGwgcG9k" + - "cyBzaG91bGQgYmUgUnVubmluZwpgYGAKCiMjIyBQb2xpY3kgbm90IG1hdGNoaW5nCgpgYGBiYXNo" + - "Cmt1YmVjdGwgLS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRleHQ+IGdldCBjbHVzdGVycG9s" + - "aWN5IG52Y2YtYWRkLWltYWdlcHVsbHNlY3JldHMKIyBTaG91bGQgc2hvdyBSRUFEWTogVHJ1ZQpg" + - "YGAKCiMjIyBXcm9uZyBzZWNyZXQgbmFtZQoKVGhlIHBvbGljeSByZWZlcmVuY2VzIGBudmNyLWNy" + - "ZWRzYC4gVmVyaWZ5IHRoZSBzZWNyZXQgZXhpc3RzIHdpdGggdGhhdCBleGFjdCBuYW1lOgoKYGBg" + - "YmFzaAprdWJlY3RsIC0tY29udGV4dCA8dGFyZ2V0LWNvbnRleHQ+IGdldCBzZWNyZXQgbnZjci1j" + - "cmVkcyAtbiA8bmFtZXNwYWNlPgpgYGAKUEsHCEtCNagAFgAAABYAAFBLAQIUABQACAAAAAAAIQBL" + - "pxLcSBAAAEgQAAASAAkAAAAAAAAAAAAAAAAAAABkYXRhL21hbmlmZXN0Lmpzb25VVAUAAQCmzhJQ" + - "SwECFAAUAAgAAAAAACEAxZ4o5QVgAAAFYAAAIwAJAAAAAAAAAAAAAACREAAAZGF0YS9udmNmLXNl" + - "bGYtbWFuYWdlZC1jbGkvU0tJTEwubWRVVAUAAQCmzhJQSwECFAAUAAgAAAAAACEAIcbIhvAKAADw" + - "CgAAMwAJAAAAAAAAAAAAAADwcAAAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1jbGkvZXhhbXBsZXMv" + - "Y2ktcGlwZWxpbmVzLm1kVVQFAAEAps4SUEsBAhQAFAAIAAAAAAAhAGh2P0HoCwAA6AsAADQACQAA" + - "AAAAAAAAAAAASnwAAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL2V4YW1wbGVzL211bHRpLWNs" + - "dXN0ZXIubWRVVAUAAQCmzhJQSwECFAAUAAgAAAAAACEA/mZDOswMAADMDAAANwAJAAAAAAAAAAAA" + - "AACdiAAAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1jbGkvcHJvbXB0cy9hZGQtY29tcHV0ZS1wbGFu" + - "ZS5tZFVUBQABAKbOElBLAQIUABQACAAAAAAAIQCR3Bv5mBkAAJgZAAA5AAkAAAAAAAAAAAAAANeV" + - "AABkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9wcm9tcHRzL2NyZWF0ZS1hbmQtcnVuLXRhc2su" + - "bWRVVAUAAQCmzhJQSwECFAAUAAgAAAAAACEA0kPcBBglAAAYJQAANwAJAAAAAAAAAAAAAADfrwAA" + - "ZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1jbGkvcHJvbXB0cy9kZXBsb3ktYW5kLWludm9rZS5tZFVU" + - "BQABAKbOElBLAQIUABQACAAAAAAAIQAOnD+XvQ4AAL0OAAA9AAkAAAAAAAAAAAAAAGXVAABkYXRh" + - "L252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9wcm9tcHRzL2RpYWdub3NlLWZhaWxlZC1pbnN0YWxsLm1k" + - "VVQFAAEAps4SUEsBAhQAFAAIAAAAAAAhAIcrjZhaHAAAWhwAADoACQAAAAAAAAAAAAAAluQAAGRh" + - "dGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL3Byb21wdHMvaW5zdGFsbC1mcm9tLXNjcmF0Y2gubWRV" + - "VAUAAQCmzhJQSwECFAAUAAgAAAAAACEAUGPcZLYHAAC2BwAAOQAJAAAAAAAAAAAAAABhAQEAZGF0" + - "YS9udmNmLXNlbGYtbWFuYWdlZC1jbGkvcHJvbXB0cy9yb3RhdGUtY2x1c3Rlci1qd2tzLm1kVVQF" + - "AAEAps4SUEsBAhQAFAAIAAAAAAAhABKTM1ngIQAA4CEAAC4ACQAAAAAAAAAAAAAAhwkBAGRhdGEv" + - "bnZjZi1zZWxmLW1hbmFnZWQtY2xpL3Byb21wdHMvdGVhcmRvd24ubWRVVAUAAQCmzhJQSwECFAAU" + - "AAgAAAAAACEA275U+NciAADXIgAAMAAJAAAAAAAAAAAAAADMKwEAZGF0YS9udmNmLXNlbGYtbWFu" + - "YWdlZC1jbGkvcmVmZXJlbmNlL2NvbW1hbmRzLm1kVVQFAAEAps4SUEsBAhQAFAAIAAAAAAAhAHOn" + - "WmTVBgAA1QYAADIACQAAAAAAAAAAAAAACk8BAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL3Jl" + - "ZmVyZW5jZS9leGl0LWNvZGVzLm1kVVQFAAEAps4SUEsBAhQAFAAIAAAAAAAhAPyjkeDGIgAAxiIA" + - "AC0ACQAAAAAAAAAAAAAASFYBAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL3JlZmVyZW5jZS9m" + - "bGFncy5tZFVUBQABAKbOElBLAQIUABQACAAAAAAAIQDzrhOEdBEAAHQRAAA3AAkAAAAAAAAAAAAA" + - "AHJ5AQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9yZWZlcmVuY2UvdHJvdWJsZXNob290aW5n" + - "Lm1kVVQFAAEAps4SUEsBAhQAFAAIAAAAAAAhAC/auXVCYgAAQmIAACwACQAAAAAAAAAAAAAAVIsB" + - "AGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uL1NLSUxMLm1kVVQFAAEAps4SUEsB" + - "AhQAFAAIAAAAAAAhACsTuD+tVQAArVUAADQACQAAAAAAAAAAAAAA+e0BAGRhdGEvbnZjZi1zZWxm" + - "LW1hbmFnZWQtaW5zdGFsbGF0aW9uL2V2YWxzL2V2YWxzLmpzb25VVAUAAQCmzhJQSwECFAAUAAgA" + - "AAAAACEAAlJOQH8oAAB/KAAALwAJAAAAAAAAAAAAAAARRAIAZGF0YS9udmNmLXNlbGYtbWFuYWdl" + - "ZC1pbnN0YWxsYXRpb24vZXhhbXBsZXMubWRVVAUAAQCmzhJQSwECFAAUAAgAAAAAACEAlmO8WRIw" + - "AAASMAAATAAJAAAAAAAAAAAAAAD2bAIAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRp" + - "b24vcmVmZXJlbmNlcy9jb21wdXRlLXBsYW5lLWluc3RhbGxhdGlvbi5tZFVUBQABAKbOElBLAQIU" + - "ABQACAAAAAAAIQBWPmeQlTAAAJUwAAA7AAkAAAAAAAAAAAAAAIudAgBkYXRhL252Y2Ytc2VsZi1t" + - "YW5hZ2VkLWluc3RhbGxhdGlvbi9yZWZlcmVuY2VzL2RlYnVnZ2luZy5tZFVUBQABAKbOElBLAQIU" + - "ABQACAAAAAAAIQDAViDnjycAAI8nAABEAAkAAAAAAAAAAAAAAJLOAgBkYXRhL252Y2Ytc2VsZi1t" + - "YW5hZ2VkLWluc3RhbGxhdGlvbi9yZWZlcmVuY2VzL2hlbG1maWxlLXN0cnVjdHVyZS5tZFVUBQAB" + - "AKbOElBLAQIUABQACAAAAAAAIQA4+SevuQcAALkHAAA/AAkAAAAAAAAAAAAAAJz2AgBkYXRhL252" + - "Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbi9yZWZlcmVuY2VzL252Y2YtdWktYWRkb24ubWRV" + - "VAUAAQCmzhJQSwECFAAUAAgAAAAAACEAS0I1qAAWAAAAFgAAPgAJAAAAAAAAAAAAAADL/gIAZGF0" + - "YS9udmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24vcmVmZXJlbmNlcy9wdWxsLXNlY3JldHMu" + - "bWRVVAUAAQCmzhJQSwUGAAAAABcAFwCvCQAAQBUDAAAA" + "PiBcCiAgLS1pY21zLXVybCA8Y29tcHV0ZS1yZWFjaGFibGUtaWNtcy11cmw+IFwKICBzdGF0dXMg" + + "XAogIC0tY2x1c3Rlci1uYW1lIDxjb21wdXRlLXBsYW5lLWNsdXN0ZXItbmFtZT4gXAogIC0tbmNh" + + "LWlkIDxuY2EtaWQ+CmBgYAoKU2hvdyB0aGUgcmVnaXN0ZXJlZCBjb21wdXRlLXBsYW5lIGxpc3Qu" + + "IE5hbWVkLWNsdXN0ZXIgYGRvd24gLS1wbGFuLW9ubHlgIGRvZXMKbm90IHF1ZXJ5IElDTVMsIHNv" + + "IGl0IHByZXZpZXdzIG9ubHkgdGhhdCBjb21wdXRlIHBsYW5lIGFuZCBjYW5ub3Qgc2hvdyB0aGUK" + + "Y29uZGl0aW9uYWwgY29udHJvbC1wbGFuZSByZW1vdmFsLiBJZiB0aGUgdGFyZ2V0IGlzIHRoZSBs" + + "YXN0IHJlZ2lzdGVyZWQKY2x1c3RlciwgcmVhbCBgZG93bmAgYWxzbyBkZXN0cm95cyB0aGUgY29u" + + "dHJvbCBwbGFuZS4gR2V0IGV4cGxpY2l0IGNvbmZpcm1hdGlvbgpmb3IgYm90aCByZW1vdmFscyBi" + + "ZWZvcmUgY29udGludWluZy4gVGhlbiBwcmV2aWV3IGFuZCBleGVjdXRlIHdpdGggdGhlIHNhbWUK" + + "cHJlZml4OgoKYGBgYmFzaApudmNmLWNsaSAtLWNvbmZpZyA8Y29uZmlnPiBzZWxmLWhvc3RlZCBc" + + "CiAgLS1jb250cm9sLXBsYW5lLXN0YWNrIGRlcGxveS9zdGFja3Mvc2VsZi1tYW5hZ2VkIFwKICAt" + + "LWNvbXB1dGUtcGxhbmUtc3RhY2sgZGVwbG95L3N0YWNrcy9udmNmLWNvbXB1dGUtcGxhbmUgXAog" + + "IC0tZW52IDxlbnY+IFwKICAtLXBsYWluIFwKICAtLWNvbnRyb2wtcGxhbmUtY29udGV4dCA8Y29u" + + "dHJvbC1wbGFuZS1jb250ZXh0PiBcCiAgLS1jb21wdXRlLXBsYW5lLWNvbnRleHQgPGNvbXB1dGUt" + + "cGxhbmUtY29udGV4dD4gXAogIC0taWNtcy11cmwgPGNvbXB1dGUtcmVhY2hhYmxlLWljbXMtdXJs" + + "PiBcCiAgZG93biAtLXBsYW4tb25seSBcCiAgLS1jbHVzdGVyLW5hbWUgPGNvbXB1dGUtcGxhbmUt" + + "Y2x1c3Rlci1uYW1lPiBcCiAgLS1uY2EtaWQgPG5jYS1pZD4KCm52Y2YtY2xpIC0tY29uZmlnIDxj" + + "b25maWc+IHNlbGYtaG9zdGVkIFwKICAtLWNvbnRyb2wtcGxhbmUtc3RhY2sgZGVwbG95L3N0YWNr" + + "cy9zZWxmLW1hbmFnZWQgXAogIC0tY29tcHV0ZS1wbGFuZS1zdGFjayBkZXBsb3kvc3RhY2tzL252" + + "Y2YtY29tcHV0ZS1wbGFuZSBcCiAgLS1lbnYgPGVudj4gXAogIC0tcGxhaW4gXAogIC0tY29udHJv" + + "bC1wbGFuZS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRleHQ+IFwKICAtLWNvbXB1dGUtcGxh" + + "bmUtY29udGV4dCA8Y29tcHV0ZS1wbGFuZS1jb250ZXh0PiBcCiAgLS1pY21zLXVybCA8Y29tcHV0" + + "ZS1yZWFjaGFibGUtaWNtcy11cmw+IFwKICBkb3duIFwKICAtLWNsdXN0ZXItbmFtZSA8Y29tcHV0" + + "ZS1wbGFuZS1jbHVzdGVyLW5hbWU+IFwKICAtLW5jYS1pZCA8bmNhLWlkPgpgYGAKClJlcGVhdCBg" + + "ZG93bmAgZm9yIGVhY2ggY29tcHV0ZSBjbHVzdGVyLiBFYWNoIHJ1biBkZXN0cm95cyB0aGF0IGNv" + + "bXB1dGUgcGxhbmUgYW5kCnVucmVnaXN0ZXJzIGl0cyBJQ01TIHJvdy4gSXQgcmVtb3ZlcyB0aGUg" + + "Y29udHJvbCBwbGFuZSBvbmx5IGFmdGVyIG5vIGNsdXN0ZXIKcmVnaXN0cmF0aW9ucyByZW1haW4u" + + "ClBLBwiWY7xZEjAAABIwAABQSwMEFAAIAAAAAAAhAAAAAAAAAAAAAAAAADsACQBkYXRhL252Y2Yt" + + "c2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbi9yZWZlcmVuY2VzL2RlYnVnZ2luZy5tZFVUBQABAKbO" + + "EiMgRGVidWdnaW5nIFJlZmVyZW5jZQoKUmVjaXBlcyBmb3IgZGlhZ25vc2luZyBhbmQgZml4aW5n" + + "IGNvbW1vbiBOVkNGIHNlbGYtbWFuYWdlZCBzdGFjayBmYWlsdXJlcy4KCiMjIFF1aWNrIFN0YXR1" + + "cyBDb21tYW5kcwoKYGBgYmFzaAojIEFsbCBwb2RzIGFjcm9zcyBhbGwgbmFtZXNwYWNlcwprdWJl" + + "Y3RsIGdldCBwb2RzIC1BIC1vIHdpZGUKCiMgUG9kcyBpbiBhIHNwZWNpZmljIG5hbWVzcGFjZQpr" + + "dWJlY3RsIGdldCBwb2RzIC1uIDxuYW1lc3BhY2U+CgojIEFsbCBoZWxtIHJlbGVhc2VzCmhlbG0g" + + "bGlzdCAtQQoKIyBSZWNlbnQgZXZlbnRzIChtb3N0IHVzZWZ1bCBmb3IgZGlhZ25vc2luZyBmYWls" + + "dXJlcykKa3ViZWN0bCBnZXQgZXZlbnRzIC1uIDxuYW1lc3BhY2U+IC0tc29ydC1ieT0nLmxhc3RU" + + "aW1lc3RhbXAnCgojIERlc2NyaWJlIGEgc3BlY2lmaWMgcG9kIChzaG93cyBldmVudHMsIGNvbmRp" + + "dGlvbnMsIHZvbHVtZXMpCmt1YmVjdGwgZGVzY3JpYmUgcG9kIC1uIDxuYW1lc3BhY2U+IDxwb2Qt" + + "bmFtZT4KYGBgCgojIyBGYWlsdXJlOiBJbWFnZVB1bGxCYWNrT2ZmCgojIyMgU3ltcHRvbXMKCmBg" + + "YApOQU1FICAgICAgICAgICBSRUFEWSAgIFNUQVRVUyAgICAgICAgICAgICBSRVNUQVJUUyAgIEFH" + + "RQpjYXNzYW5kcmEtMCAgICAwLzEgICAgIEltYWdlUHVsbEJhY2tPZmYgICAwICAgICAgICAgIDVt" + + "CmBgYAoKRXZlbnRzIHNob3c6CmBgYApGYWlsZWQgdG8gcHVsbCBpbWFnZSAibnZjci5pby8uLi4v" + + "aW1hZ2U6dGFnIjogNDAxIFVuYXV0aG9yaXplZApgYGAKCiMjIyBEaWFnbm9zaXMKCmBgYGJhc2gK" + + "IyBDaGVjayB3aGF0IGltYWdlIGlzIGZhaWxpbmcKa3ViZWN0bCBkZXNjcmliZSBwb2QgLW4gPG5h" + + "bWVzcGFjZT4gPHBvZC1uYW1lPiB8IGdyZXAgLUE1ICJFdmVudHM6IgoKIyBDaGVjayBpZiBwdWxs" + + "IHNlY3JldCBleGlzdHMgaW4gdGhlIG5hbWVzcGFjZQprdWJlY3RsIGdldCBzZWNyZXQgbnZjci1j" + + "cmVkcyAtbiA8bmFtZXNwYWNlPgoKIyBDaGVjayBpZiB0aGUgcG9kIHNwZWMgaGFzIGltYWdlUHVs" + + "bFNlY3JldHMKa3ViZWN0bCBnZXQgcG9kIC1uIDxuYW1lc3BhY2U+IDxwb2QtbmFtZT4gLW8ganNv" + + "bnBhdGg9J3suc3BlYy5pbWFnZVB1bGxTZWNyZXRzfScKCiMgQ2hlY2sgaWYgdGhlIFNlcnZpY2VB" + + "Y2NvdW50IGhhcyBpbWFnZVB1bGxTZWNyZXRzCmt1YmVjdGwgZ2V0IHNhIDxzYS1uYW1lPiAtbiA8" + + "bmFtZXNwYWNlPiAtbyBqc29ucGF0aD0ney5pbWFnZVB1bGxTZWNyZXRzfScKYGBgCgojIyMgRml4" + + "ZXMKCjEuICoqU2VjcmV0IG1pc3NpbmcgaW4gbmFtZXNwYWNlKio6IENyZWF0ZSBpdAogICBgYGBi" + + "YXNoCiAgIGt1YmVjdGwgY3JlYXRlIHNlY3JldCBkb2NrZXItcmVnaXN0cnkgbnZjci1jcmVkcyBc" + + "CiAgICAgLS1kb2NrZXItc2VydmVyPW52Y3IuaW8gXAogICAgIC0tZG9ja2VyLXVzZXJuYW1lPSck" + + "b2F1dGh0b2tlbicgXAogICAgIC0tZG9ja2VyLXBhc3N3b3JkPSIkTkdDX0FQSV9LRVkiIFwKICAg" + + "ICAtLW5hbWVzcGFjZT08bmFtZXNwYWNlPiBcCiAgICAgLS1kcnktcnVuPWNsaWVudCAtbyB5YW1s" + + "IHwga3ViZWN0bCBhcHBseSAtZiAtCiAgIGBgYAoKMi4gKipTZWNyZXQgZXhpc3RzIGJ1dCBwb2Qg" + + "ZG9lc24ndCByZWZlcmVuY2UgaXQqKjogVGhlIGNoYXJ0IG5lZWRzIGBpbWFnZVB1bGxTZWNyZXRz" + + "YCBjb25maWd1cmVkIHZpYSBoZWxtZmlsZSB2YWx1ZXMuIFNlZSBbcHVsbC1zZWNyZXRzLm1kXShw" + + "dWxsLXNlY3JldHMubWQpLgoKMy4gKipDaGFydCBkb2Vzbid0IHN1cHBvcnQgaW1hZ2VQdWxsU2Vj" + + "cmV0cyoqIChvcGVuYmFvLCBpbnZvY2F0aW9uLXNlcnZpY2UsIGVzcy1hcGksIG5vdGFyeS1zZXJ2" + + "aWNlKTogUGF0Y2ggU2VydmljZUFjY291bnRzIGFuZCByZXN0YXJ0IHBvZHMuIFNlZSBbcHVsbC1z" + + "ZWNyZXRzLm1kXShwdWxsLXNlY3JldHMubWQpLgoKNC4gKipXcm9uZyBjcmVkZW50aWFscyBpbiBz" + + "ZWNyZXQqKjogRGVsZXRlIGFuZCByZWNyZWF0ZQogICBgYGBiYXNoCiAgIGt1YmVjdGwgZGVsZXRl" + + "IHNlY3JldCBudmNyLWNyZWRzIC1uIDxuYW1lc3BhY2U+CiAgICMgUmVjcmVhdGUgd2l0aCBjb3Jy" + + "ZWN0IGNyZWRlbnRpYWxzCiAgIGBgYAoKIyMgRmFpbHVyZTogSW5pdDowLzEgU3R1Y2sgKFZhdWx0" + + "IEFnZW50KQoKIyMjIFN5bXB0b21zCgpTZXJ2aWNlIHBvZHMgc3R1Y2sgaW4gYEluaXQ6MC8xYCBm" + + "b3IgbWludXRlczoKYGBgCk5BTUUgICAgICAgICAgICAgICAgICAgICAgICBSRUFEWSAgIFNUQVRV" + + "UyAgICAgUkVTVEFSVFMgICBBR0UKbnZjZi1hcGktN2Y0Yzc2Zjc4OC00NHZsdCAgMC8yICAgICBJ" + + "bml0OjAvMSAgIDAgICAgICAgICAgMTBtCmBgYAoKIyMjIERpYWdub3NpcwoKVGhlIGluaXQgY29u" + + "dGFpbmVyIGlzIHRoZSB2YXVsdC1hZ2VudC1pbml0IGluamVjdG9yIHdhaXRpbmcgZm9yIE9wZW5C" + + "YW8uCgpgYGBiYXNoCiMgQ2hlY2sgT3BlbkJhbyBwb2RzCmt1YmVjdGwgZ2V0IHBvZHMgLW4gdmF1" + + "bHQtc3lzdGVtCgojIENoZWNrIGlmIE9wZW5CYW8gbWlncmF0aW9uIGpvYiByYW4Ka3ViZWN0bCBn" + + "ZXQgam9icyAtbiB2YXVsdC1zeXN0ZW0KCiMgQ2hlY2sgT3BlbkJhbyBwb2QgbG9ncwprdWJlY3Rs" + + "IGxvZ3MgLW4gdmF1bHQtc3lzdGVtIG9wZW5iYW8tc2VydmVyLTAgLWMgb3BlbmJhbwoKIyBDaGVj" + + "ayBpbml0IGNvbnRhaW5lciBsb2dzIG9uIHRoZSBzdHVjayBwb2QKa3ViZWN0bCBsb2dzIC1uIDxu" + + "YW1lc3BhY2U+IDxwb2QtbmFtZT4gLWMgdmF1bHQtYWdlbnQtaW5pdApgYGAKCiMjIyBGaXhlcwoK" + + "MS4gKipPcGVuQmFvIHBvZHMgbm90IHJ1bm5pbmcqKjogQ2hlY2sgdGhlaXIgZXZlbnRzIGZvciBp" + + "bWFnZSBwdWxsIGlzc3VlcywgcmVzb3VyY2UgaXNzdWVzLCBldGMuCgoyLiAqKk9wZW5CYW8gbWln" + + "cmF0aW9uIGpvYiBkaWRuJ3QgcnVuKio6IFRoaXMgaGFwcGVucyB3aGVuIGBoZWxtZmlsZSBzeW5j" + + "YCB3YXMgaW50ZXJydXB0ZWQuIERlc3Ryb3kgYW5kIHJlLXN5bmMgb3BlbmJhbzoKICAgYGBgYmFz" + + "aAogICBIRUxNRklMRV9FTlY9PGVudj4gaGVsbWZpbGUgLS1zZWxlY3RvciBuYW1lPW9wZW5iYW8t" + + "c2VydmVyIGRlc3Ryb3kKICAga3ViZWN0bCBkZWxldGUgbmFtZXNwYWNlIHZhdWx0LXN5c3RlbQog" + + "ICBrdWJlY3RsIGNyZWF0ZSBuYW1lc3BhY2UgdmF1bHQtc3lzdGVtCiAgICMgUmUtY3JlYXRlIHB1" + + "bGwgc2VjcmV0IGlmIG5lZWRlZAogICBIRUxNRklMRV9FTlY9PGVudj4gaGVsbWZpbGUgLS1zZWxl" + + "Y3RvciBuYW1lPW9wZW5iYW8tc2VydmVyIHN5bmMKICAgYGBgCgozLiAqKk9wZW5CYW8gcG9kcyBy" + + "dW5uaW5nIGJ1dCBub3QgaW5pdGlhbGl6ZWQqKjogQ2hlY2sgdW5zZWFsIHN0YXR1czoKICAgYGBg" + + "YmFzaAogICBrdWJlY3RsIGV4ZWMgLW4gdmF1bHQtc3lzdGVtIG9wZW5iYW8tc2VydmVyLTAgLWMg" + + "b3BlbmJhbyAtLSBiYW8gc3RhdHVzCiAgIGBgYAoKNC4gKipgdmF1bHQtYWdlbnQtaW5pdGAgbG9n" + + "cyBgYXV0aC9qd3QvbG9naW5gIC0+IGA0MDAgLi4uIG5vIGtub3duIGtleSBzdWNjZXNzZnVsbHkg" + + "dmFsaWRhdGVkIHRoZSB0b2tlbiBzaWduYXR1cmVgKioKICAgKGNvbW1vbiBvbiBBS1MsIGFuZCBv" + + "biBhbnkgY2x1c3RlciB3aG9zZSBPSURDIGlzc3VlciBwdWJsaXNoZXMgYSByb3RhdGluZyBtdWx0" + + "aS1rZXkgSldLUyk6CiAgIHRoZSBPcGVuQmFvIGBhdXRoL2p3dGAgbWV0aG9kIHdhcyBjb25maWd1" + + "cmVkIHdpdGggYSBzaW5nbGUgc3RhdGljIG1vdW50ZWQgcHVibGljIGtleQogICAoYGp3dF92YWxp" + + "ZGF0aW9uX3B1YmtleXNgKSBpbnN0ZWFkIG9mIHRoZSBpc3N1ZXIncyBsaXZlIEpXS1MsIHNvIGl0" + + "IGNhbm5vdCB2YWxpZGF0ZSB0aGUKICAgY2x1c3Rlci1zaWduZWQgU2VydmljZUFjY291bnQgdG9r" + + "ZW5zIHRoZSB2YXVsdC1hZ2VudHMgcHJlc2VudC4gRXZlcnkgc2VydmljZSdzCiAgIGB2YXVsdC1h" + + "Z2VudC1pbml0YCB0aGVuIGxvb3BzIG9uIHRoYXQgNDAwIGFuZCB0aGUgcG9kIG5ldmVyIGxlYXZl" + + "cyBgSW5pdDowLzFgLiBUaGlzIGlzIHRoZQogICBiZWhhdmlvciBvZiB0aGUgYmFzZSBkZWZhdWx0" + + "IGBvcGVuYmFvLm1pZ3JhdGlvbnMuaXNzdWVyRGlzY292ZXJ5LmVuYWJsZWQ6IGZhbHNlYDsgdGhl" + + "CiAgIG1pZ3JhdGlvbiBsb2cgc2hvd3MgYE9JREMgaXNzdWVyIGRpc2NvdmVyeSBpcyBkaXNhYmxl" + + "ZC4gVXNpbmcgU2VydmljZUFjY291bnQgaXNzdWVyIGFuZAogICBtb3VudGVkIHB1YmxpYyBrZXkg" + + "ZmFsbGJhY2tgLiBFbmFibGUgaXNzdWVyIGRpc2NvdmVyeSBzbyB0aGUgbWlncmF0aW9uIHVzZXMg" + + "dGhlIGxpdmUgSldLUywKICAgdGhlbiByZS1ydW4gaXQ6CiAgIGBgYGJhc2gKICAgIyBJbiB5b3Vy" + + "IGVudiB2YWx1ZXMgKGUuZy4gZW52aXJvbm1lbnRzLzxlbnY+LnlhbWwpLCBzZXQ6CiAgICMgICBv" + + "cGVuYmFvOgogICAjICAgICBtaWdyYXRpb25zOgogICAjICAgICAgIGlzc3VlckRpc2NvdmVyeToK" + + "ICAgIyAgICAgICAgIGVuYWJsZWQ6IHRydWUKICAga3ViZWN0bCBkZWxldGUgam9iIC1uIHZhdWx0" + + "LXN5c3RlbSBvcGVuYmFvLXNlcnZlci1taWdyYXRpb25zCiAgIEhFTE1GSUxFX0VOVj08ZW52PiBo" + + "ZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9b3BlbmJhby1zZXJ2ZXIgc3luYwogICBgYGAKICAgVGhl" + + "IG1pZ3JhdGlvbiBsb2cgc2hvdWxkIHRoZW4gc2hvdyBgUmVjZWl2ZWQgZGlzY292ZXJ5IGRvY3Vt" + + "ZW50IGZyb20KICAgLi4uLy53ZWxsLWtub3duL29wZW5pZC1jb25maWd1cmF0aW9uYCBhbmQgYEZp" + + "bmFsIE9wZW5CYW8gSldUIEpXS1MgVVJMIHNldCB0bzoKICAgLi4uL29wZW5pZC92MS9qd2tzYCwg" + + "YW5kIHRoZSBzZXJ2aWNlIHBvZHMgYXV0aGVudGljYXRlIGFuZCByZWFjaCBSZWFkeSB3aXRoaW4g" + + "fjEgbWluLgogICBBS1MgY2x1c3RlcnMgd2l0aCB0aGUgY2x1c3RlciBPSURDIGlzc3VlciBlbmFi" + + "bGVkICh0aGUgYGFrcy1jbHVzdGVyYCBkZWZhdWx0KSBhbHdheXMgbmVlZAogICB0aGlzIGJlY2F1" + + "c2UgdGhlIHN0YXRpYy1wdWJrZXkgZmFsbGJhY2sgY2Fubm90IG1hdGNoIHRoZSBpc3N1ZXIncyBy" + + "b3RhdGluZyBzaWduaW5nIGtleXMuCgojIyBGYWlsdXJlOiBPT01LaWxsZWQgb24gQ2Fzc2FuZHJh" + + "CgojIyMgU3ltcHRvbXMKCmBgYApOQU1FICAgICAgICAgIFJFQURZICAgU1RBVFVTICAgIFJFU1RB" + + "UlRTICAgQUdFCmNhc3NhbmRyYS0wICAgMC8xICAgICBPT01LaWxsZWQgIDMgICAgICAgICAxMG0K" + + "YGBgCgojIyMgRGlhZ25vc2lzCgpgYGBiYXNoCmt1YmVjdGwgZGVzY3JpYmUgcG9kIC1uIGNhc3Nh" + + "bmRyYS1zeXN0ZW0gY2Fzc2FuZHJhLTAgfCBncmVwIC1BMyAiTGFzdCBTdGF0ZSIKYGBgCgojIyMg" + + "Rml4CgpPdmVycmlkZSBDYXNzYW5kcmEgcmVzb3VyY2VzIHZpYSBoZWxtZmlsZSB2YWx1ZXMuIFNl" + + "ZSBFeGFtcGxlIDEgaW4KW2V4YW1wbGVzLm1kXSguLi9leGFtcGxlcy5tZCkuCgpgYGB5YW1sCi0g" + + "Y2Fzc2FuZHJhOgogICAgcmVzb3VyY2VzOgogICAgICBsaW1pdHM6CiAgICAgICAgY3B1OiAiOCIK" + + "ICAgICAgICBtZW1vcnk6IDgxOTJNaQogICAgICByZXF1ZXN0czoKICAgICAgICBjcHU6ICIyIgog" + + "ICAgICAgIG1lbW9yeTogNDA5Nk1pCmBgYAoKTm90ZTogYHJlc291cmNlUHJlc2V0YCBpcyBub3Qg" + + "YXZhaWxhYmxlIGluIHRoZSBOVkNGIGNhc3NhbmRyYSB3cmFwcGVyIGNoYXJ0LiBVc2UgZXhwbGlj" + + "aXQgYHJlc291cmNlc2AuCgojIyBGYWlsdXJlOiBQb2RzIFN0dWNrIGluIFBlbmRpbmcKCiMjIyBT" + + "eW1wdG9tcwoKYGBgCk5BTUUgICAgICAgICAgUkVBRFkgICBTVEFUVVMgICAgUkVTVEFSVFMgICBB" + + "R0UKY2Fzc2FuZHJhLTAgICAwLzEgICAgIFBlbmRpbmcgICAwICAgICAgICAgIDEwbQpgYGAKCiMj" + + "IyBEaWFnbm9zaXMKCmBgYGJhc2gKIyBDaGVjayBldmVudHMgZm9yIHNjaGVkdWxpbmcgZmFpbHVy" + + "ZXMKa3ViZWN0bCBkZXNjcmliZSBwb2QgLW4gPG5hbWVzcGFjZT4gPHBvZC1uYW1lPgoKIyBDb21t" + + "b24gY2F1c2VzOgojIC0gIjAvMTIgbm9kZXMgYXJlIGF2YWlsYWJsZTogMTIgbm9kZShzKSBkaWRu" + + "J3QgbWF0Y2ggUG9kJ3Mgbm9kZSBhZmZpbml0eSIKIyAtICIwLzEyIG5vZGVzIGFyZSBhdmFpbGFi" + + "bGU6IDEyIEluc3VmZmljaWVudCBtZW1vcnkiCiMgLSAicGVyc2lzdGVudHZvbHVtZWNsYWltIG5v" + + "dCBmb3VuZCIKYGBgCgojIyMgRml4ZXMKCjEuICoqTm9kZSBzZWxlY3RvciBtaXNtYXRjaCoqOiBD" + + "aGVjayBgbm9kZVNlbGVjdG9yc2AgaW4gZW52aXJvbm1lbnQgZmlsZQogICBgYGBiYXNoCiAgIGt1" + + "YmVjdGwgZ2V0IG5vZGVzIC0tc2hvdy1sYWJlbHMgfCBncmVwIG52Y2YKICAgYGBgCgoyLiAqKlN0" + + "b3JhZ2UgY2xhc3Mgbm90IGZvdW5kKio6IENoZWNrIHN0b3JhZ2UgY2xhc3MgZXhpc3RzCiAgIGBg" + + "YGJhc2gKICAga3ViZWN0bCBnZXQgc3RvcmFnZWNsYXNzCiAgIGBgYAoKMy4gKipJbnN1ZmZpY2ll" + + "bnQgcmVzb3VyY2VzKio6IENoZWNrIG5vZGUgY2FwYWNpdHkKICAgYGBgYmFzaAogICBrdWJlY3Rs" + + "IGRlc2NyaWJlIG5vZGUgPG5vZGUtbmFtZT4gfCBncmVwIC1BNSAiQWxsb2NhdGVkIHJlc291cmNl" + + "cyIKICAgYGBgCgojIyBGYWlsdXJlOiBIZWxtIFJlbGVhc2UgaW4gRmFpbGVkIFN0YXRlCgojIyMg" + + "U3ltcHRvbXMKCmBgYGJhc2gKaGVsbSBsaXN0IC1BCiMgU2hvd3MgcmVsZWFzZSB3aXRoIFNUQVRV" + + "UzogZmFpbGVkCmBgYAoKUmUtcnVubmluZyBgaGVsbWZpbGUgc3luY2AgYXBwZWFycyB0byBzdWNj" + + "ZWVkIGJ1dCBzZXJ2aWNlcyBkb24ndCB3b3JrIChtaWdyYXRpb25zIHNraXBwZWQpLgoKIyMjIERp" + + "YWdub3NpcwoKYGBgYmFzaApoZWxtIGhpc3RvcnkgPHJlbGVhc2UtbmFtZT4gLW4gPG5hbWVzcGFj" + + "ZT4KYGBgCgojIyMgRml4CgpNdXN0IGRlc3Ryb3kgdGhlIGZhaWxlZCByZWxlYXNlIGFuZCByZS1z" + + "eW5jIChub3QganVzdCBhcHBseSk6CgpgYGBiYXNoCkhFTE1GSUxFX0VOVj08ZW52PiBoZWxtZmls" + + "ZSAtLXNlbGVjdG9yIG5hbWU9PHJlbGVhc2U+IGRlc3Ryb3kKIyBJZiBuYW1lc3BhY2UgbmVlZHMg" + + "Y2xlYW51cDoKa3ViZWN0bCBkZWxldGUgbmFtZXNwYWNlIDxuYW1lc3BhY2U+Cmt1YmVjdGwgY3Jl" + + "YXRlIG5hbWVzcGFjZSA8bmFtZXNwYWNlPgojIFJlLWNyZWF0ZSBwdWxsIHNlY3JldCBpZiBuZWVk" + + "ZWQKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0b3IgbmFtZT08cmVsZWFzZT4g" + + "c3luYwpgYGAKCiMjIEZhaWx1cmU6IEFjY291bnQgQm9vdHN0cmFwIEpvYiBGYWlsZWQKCiMjIyBT" + + "eW1wdG9tcwoKU2VydmljZXMgZGVwbG95IGJ1dCBmdW5jdGlvbnMgY2FuJ3QgYmUgY3JlYXRlZC4g" + + "RXZlbnRzIHNob3cgYm9vdHN0cmFwIGpvYiBmYWlsdXJlLgoKIyMjIERpYWdub3NpcwoKYGBgYmFz" + + "aAojIENoZWNrIGJvb3RzdHJhcCBqb2Igc3RhdHVzCmt1YmVjdGwgZ2V0IGpvYnMgLW4gbnZjZgoK" + + "IyBHZXQgbG9ncyAoam9iIGF1dG8tZGVsZXRlcyBhZnRlciB+NSBtaW51dGVzKQprdWJlY3RsIGxv" + + "Z3Mgam9iL252Y2YtYXBpLWFjY291bnQtYm9vdHN0cmFwIC1uIG52Y2YKCiMgQ2hlY2sgQVBJIGxv" + + "Z3MKa3ViZWN0bCBsb2dzIC1uIG52Y2YgLWwgYXBwLmt1YmVybmV0ZXMuaW8vbmFtZT1udmNmLWFw" + + "aSAtLXRhaWw9MTAwCmBgYAoKIyMjIENvbW1vbiBDYXVzZXMKCjEuICoqV3JvbmcgYmFzZTY0IGNy" + + "ZWRlbnRpYWxzKio6IENyZWRlbnRpYWxzIGluIGBzZWNyZXRzLzxlbnY+LXNlY3JldHMueWFtbGAg" + + "bXVzdCBiZSBgJG9hdXRodG9rZW46QVBJX0tFWWAgYmFzZTY0LWVuY29kZWQsIG5vdCBqdXN0IHRo" + + "ZSBBUEkga2V5CiAgIGBgYGJhc2gKICAgIyBWZXJpZnkgeW91ciBlbmNvZGVkIGNyZWRlbnRpYWwK" + + "ICAgZWNobyAnWU9VUl9CQVNFNjRfU1RSSU5HJyB8IGJhc2U2NCAtZAogICAjIFNob3VsZCBvdXRw" + + "dXQ6ICRvYXV0aHRva2VuOm52YXBpLXh4eHh4CiAgIGBgYAoKMi4gKipSZWdpc3RyeSB1bnJlYWNo" + + "YWJsZSoqOiBBUEkgY2FuJ3QgcmVhY2ggdGhlIHJlZ2lzdHJ5IHNwZWNpZmllZCBpbiBgYWNjb3Vu" + + "dEJvb3RzdHJhcC5yZWdpc3RyeUNyZWRlbnRpYWxzYAoKIyMjIEZpeAoKRml4IGNyZWRlbnRpYWxz" + + "IGluIHNlY3JldHMgZmlsZSwgdGhlbiByZWNvdmVyIHNlcnZpY2VzIHdpdGhvdXQgZGVzdHJveWlu" + + "ZyBkZXBlbmRlbmNpZXM6CgpgYGBiYXNoCkhFTE1GSUxFX0VOVj08ZW52PiBoZWxtZmlsZSAtLXNl" + + "bGVjdG9yIHJlbGVhc2UtZ3JvdXA9c2VydmljZXMgZGVzdHJveQprdWJlY3RsIGRlbGV0ZSBuYW1l" + + "c3BhY2UgbnZjZiBhcGkta2V5cyBlc3Mgc2lzIC0taWdub3JlLW5vdC1mb3VuZAprdWJlY3RsIGNy" + + "ZWF0ZSBuYW1lc3BhY2UgbnZjZiAmJiBrdWJlY3RsIGNyZWF0ZSBuYW1lc3BhY2UgYXBpLWtleXMg" + + "JiYgXAogIGt1YmVjdGwgY3JlYXRlIG5hbWVzcGFjZSBlc3MgJiYga3ViZWN0bCBjcmVhdGUgbmFt" + + "ZXNwYWNlIHNpcwojIFJlLWNyZWF0ZSBwdWxsIHNlY3JldHMgaWYgbmVlZGVkCkhFTE1GSUxFX0VO" + + "Vj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIHJlbGVhc2UtZ3JvdXA9c2VydmljZXMgc3luYwpg" + + "YGAKCiMjIEZhaWx1cmU6IE5WQ0EgQ2xlYW51cCBTdHVjayAoRmluYWxpemVycykKCiMjIyBTeW1w" + + "dG9tcwoKQ29tcHV0ZS1wbGFuZSBjbGVhbnVwIGhhbmdzLiBOYW1lc3BhY2VzCnN0dWNrIGluIGBU" + + "ZXJtaW5hdGluZ2A6CgpgYGBiYXNoCmt1YmVjdGwgZ2V0IG5zCiMgbnZjYS1vcGVyYXRvciAgICBU" + + "ZXJtaW5hdGluZyAgIDEwbQojIG52Y2YtYmFja2VuZCAgICAgVGVybWluYXRpbmcgICAxMG0KYGBg" + + "CgojIyMgRml4CgpSdW4gdGhpcyBvbmx5IGFnYWluc3QgdGhlIGNvbXB1dGUgY29udGV4dCwgYWZ0" + + "ZXIgdGhlIG5vcm1hbCBjb21wdXRlLXBsYW5lCnRlYXJkb3duIGhhcyBmYWlsZWQuIFJlbW92ZSBm" + + "aW5hbGl6ZXJzIGZyb20gTlZDRkJhY2tlbmQgY3VzdG9tIHJlc291cmNlcyBhbmQKZm9yY2UtZGVs" + + "ZXRlIHN0dWNrIG5hbWVzcGFjZXM6CgpgYGBiYXNoCmV4cG9ydCBDT01QVVRFX0NPTlRFWFQ9PGNv" + + "bXB1dGUtcGxhbmUtY29udGV4dD4KCiMgUmVtb3ZlIGZpbmFsaXplcnMgZnJvbSBOVkNGQmFja2Vu" + + "ZCByZXNvdXJjZXMKa3ViZWN0bCAtLWNvbnRleHQgIiRDT01QVVRFX0NPTlRFWFQiIGdldCBudmNm" + + "YmFja2VuZHMgLUEgLW8ganNvbiB8IFwKICBqcSAnLml0ZW1zW10gfCAubWV0YWRhdGEubmFtZXNw" + + "YWNlICsgIi8iICsgLm1ldGFkYXRhLm5hbWUnIC1yIHwgXAogIHhhcmdzIC1Je30gc2ggLWMgJ2Nv" + + "bnRleHQ9IiQxIjsgbnM9IiR7MiUlLyp9IjsgbmFtZT0iJHsyIyMqL30iOyBrdWJlY3RsIC0tY29u" + + "dGV4dCAiJGNvbnRleHQiIHBhdGNoIG52Y2ZiYWNrZW5kICIkbmFtZSIgLW4gIiRucyIgLS10eXBl" + + "PW1lcmdlIC1wICJ7XCJtZXRhZGF0YVwiOntcImZpbmFsaXplcnNcIjpbXX19IicgXyAiJENPTVBV" + + "VEVfQ09OVEVYVCIge30KCiMgRm9yY2UtZGVsZXRlIHN0dWNrIG5hbWVzcGFjZXMgYnkgY2xlYXJp" + + "bmcgdGhlaXIgZmluYWxpemVycwpmb3IgbnMgaW4gbnZjYS1vcGVyYXRvciBudmNmLWJhY2tlbmQ7" + + "IGRvCiAga3ViZWN0bCAtLWNvbnRleHQgIiRDT01QVVRFX0NPTlRFWFQiIGdldCBuYW1lc3BhY2Ug" + + "IiRucyIgLW8ganNvbiAyPi9kZXYvbnVsbCB8IFwKICAgIGpxICcuc3BlYy5maW5hbGl6ZXJzID0g" + + "W10nIHwgXAogICAga3ViZWN0bCAtLWNvbnRleHQgIiRDT01QVVRFX0NPTlRFWFQiIHJlcGxhY2Ug" + + "XAogICAgICAtLXJhdyAiL2FwaS92MS9uYW1lc3BhY2VzLyRucy9maW5hbGl6ZSIgLWYgLSAyPi9k" + + "ZXYvbnVsbApkb25lCmBgYAoKIyMgRmFpbHVyZTogTlZDQSBPcGVyYXRvciBNaXNzaW5nIG9yIE5v" + + "dCBSZWFkeQoKIyMjIFN5bXB0b21zCgpBZnRlciBjb21wdXRlLXBsYW5lIGluc3RhbGwgY29tcGxl" + + "dGVzLCBubyBgbnZjYS1vcGVyYXRvcmAgRGVwbG95bWVudCBleGlzdHMsIG9yCml0IGV4aXN0cyBi" + + "dXQgcG9kcyBhcmUgbm90IHJlYWR5OgoKYGBgYmFzaAprdWJlY3RsIC0tY29udGV4dCA8Y29tcHV0" + + "ZS1wbGFuZS1jb250ZXh0PiBnZXQgZGVwbG95bWVudCBudmNhLW9wZXJhdG9yIFwKICAtbiBudmNh" + + "LW9wZXJhdG9yCmt1YmVjdGwgLS1jb250ZXh0IDxjb21wdXRlLXBsYW5lLWNvbnRleHQ+IGdldCBw" + + "b2RzIC1uIG52Y2Etb3BlcmF0b3IKYGBgCgojIyMgRGlhZ25vc2lzIGFuZCBGaXhlcwoKRmlyc3Qg" + + "aWRlbnRpZnkgd2hldGhlciB0aGUgaW5zdGFsbGF0aW9uIHVzZWQgdGhlIEhlbG1maWxlIHZhbHVl" + + "cyBmbG93IG9yIHRoZQpDTEkgcHJvZmlsZSBmbG93LiBSZS1ydW4gb25seSB0aGF0IGZsb3cncyBy" + + "ZWdpc3RyYXRpb24gYW5kIGluc3RhbGxhdGlvbiBzdGVwcwpmcm9tIFtTcGxpdCBDb21wdXRlLVBs" + + "YW5lIEluc3RhbGxhdGlvbl0oY29tcHV0ZS1wbGFuZS1pbnN0YWxsYXRpb24ubWQpLiBEbyBub3QK" + + "c3Vic3RpdHV0ZSBvbmUgaGFuZG9mZiBmb3IgdGhlIG90aGVyLgoKSWYgaW5zdGFsbGF0aW9uIHN1" + + "Y2NlZWRzIGJ1dCBwb2RzIHN0aWxsIGZhaWwsIGluc3BlY3QgdGhlIGNvbXB1dGUgY29udGV4dDoK" + + "CmBgYGJhc2gKa3ViZWN0bCAtLWNvbnRleHQgPGNvbXB1dGUtcGxhbmUtY29udGV4dD4gZGVzY3Jp" + + "YmUgZGVwbG95IG52Y2Etb3BlcmF0b3IgXAogIC1uIG52Y2Etb3BlcmF0b3IKa3ViZWN0bCAtLWNv" + + "bnRleHQgPGNvbXB1dGUtcGxhbmUtY29udGV4dD4gbG9ncyBkZXBsb3ltZW50L252Y2Etb3BlcmF0" + + "b3IgXAogIC1uIG52Y2Etb3BlcmF0b3IgLS10YWlsPTIwMAprdWJlY3RsIC0tY29udGV4dCA8Y29t" + + "cHV0ZS1wbGFuZS1jb250ZXh0PiBnZXQgbnZjZmJhY2tlbmQgLW4gbnZjYS1vcGVyYXRvcgpgYGAK" + + "CkZvciBwcml2YXRlIHJlZ2lzdHJ5IGZhaWx1cmVzLCB2ZXJpZnkgdGhhdCB0aGUgcHVsbCBzZWNy" + + "ZXQgZXhpc3RzIGluCmBudmNhLW9wZXJhdG9yYC4gVGhlIGNoYXJ0IGFuZCBvcGVyYXRvciBtaXJy" + + "b3IgaXQgdG8gYG52Y2Etc3lzdGVtYDsgZG8gbm90IHVzZSBhCmJyb2FkZXIgbWFudWFsIG5hbWVz" + + "cGFjZSBsb29wLiBTZWUKW3B1bGwtc2VjcmV0cy5tZF0ocHVsbC1zZWNyZXRzLm1kI2NvbXB1dGUt" + + "cGxhbmUtc2VjcmV0KS4KCiMjIEZhaWx1cmU6IEdhdGV3YXkgRW5kcG9pbnQgQ2hhbmdlZAoKIyMj" + + "IFN5bXB0b21zCgpSZXF1ZXN0cyB0aHJvdWdoIHRoZSBjb25maWd1cmVkIHJvdXRlIGRvbWFpbiBm" + + "YWlsIGFmdGVyIHRoZSBHYXRld2F5IG9yIGl0cyBsb2FkIGJhbGFuY2VyIGlzIHJlcGxhY2VkLiBU" + + "aGUgR2F0ZXdheSByZXBvcnRzIGEgbmV3IGVuZHBvaW50LgoKIyMjIERpYWdub3NpcwoKYGBgYmFz" + + "aApHQVRFV0FZX0FERFI9JChrdWJlY3RsIC0tY29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0" + + "PiBnZXQgZ2F0ZXdheSBcCiAgbnZjZi1nYXRld2F5IC1uIGVudm95LWdhdGV3YXkgXAogIC1vIGpz" + + "b25wYXRoPSd7LnN0YXR1cy5hZGRyZXNzZXNbMF0udmFsdWV9JykKdGVzdCAtbiAiJEdBVEVXQVlf" + + "QUREUiIKZGlnICtzaG9ydCAiYXBpLjxkb21haW4+IgpjdXJsIC1IICJIb3N0OiBhcGkuPGRvbWFp" + + "bj4iICJodHRwOi8vJEdBVEVXQVlfQUREUi9oZWFsdGgiCgojIENoZWNrIGRpcmVjdCBhZGRyZXNz" + + "IGZpZWxkcyB1c2VkIGJ5IGEgc3BsaXQgZGVwbG95bWVudApncmVwIG52Y2ZOYXRzU2VydmljZVVS" + + "TCBkZXBsb3kvc3RhY2tzL3NlbGYtbWFuYWdlZC9lbnZpcm9ubWVudHMvPGVudj4ueWFtbApncmVw" + + "IC1FICdpY21zU2VydmljZXxyZXZhbFNlcnZpY2V8bmF0cycgXAogIGRlcGxveS9zdGFja3MvbnZj" + + "Zi1jb21wdXRlLXBsYW5lL2Vudmlyb25tZW50cy88ZW52Pi55YW1sCmBgYAoKIyMjIEZpeAoKS2Vl" + + "cCBgZ2xvYmFsLmRvbWFpbmAsIHJvdXRlIGhvc3RuYW1lcywgYW5kIEhvc3Qgb3ZlcnJpZGVzIHVu" + + "Y2hhbmdlZC4gVXBkYXRlIEROUwpvciB0aGUgZGlyZWN0IGNsaWVudCBkZXN0aW5hdGlvbi4gRm9y" + + "IHNwbGl0IGRlcGxveW1lbnRzLCB1cGRhdGUgb25seSBkaXJlY3QKR2F0ZXdheS1hZGRyZXNzIGZp" + + "ZWxkcyBhbmQgcmVmcmVzaCByZWdpc3RyYXRpb24gYW5kIGluc3RhbGxhdGlvbiB0aHJvdWdoIHRo" + + "ZQpzYW1lIHNlbGVjdGVkIGhhbmRvZmYuIFNlZQpbRXhhbXBsZSA0XSguLi9leGFtcGxlcy5tZCNl" + + "eGFtcGxlLTQtcmVjb3Zlci1mcm9tLWEtZ2F0ZXdheS1lbmRwb2ludC1jaGFuZ2UpLgoKIyMgVXNl" + + "ZnVsIE5hbWVzcGFjZS10by1TZXJ2aWNlIE1hcHBpbmcKClF1aWNrIHJlZmVyZW5jZSBmb3Igd2hp" + + "Y2ggc2VydmljZXMgcnVuIGluIHdoaWNoIG5hbWVzcGFjZToKCnwgTmFtZXNwYWNlIHwgU2Vydmlj" + + "ZXMgfAp8LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwKfCBuYXRzLXN5c3RlbSB8IG5hdHMgfAp8IGNh" + + "c3NhbmRyYS1zeXN0ZW0gfCBjYXNzYW5kcmEgfAp8IHZhdWx0LXN5c3RlbSB8IG9wZW5iYW8tc2Vy" + + "dmVyIHwKfCBudmNmIHwgYXBpLCBpbnZvY2F0aW9uLXNlcnZpY2UsIGdycGMtcHJveHksIG5vdGFy" + + "eS1zZXJ2aWNlLCByZXZhbCwgbGxtLXJlcXVlc3Qtcm91dGVyLCBsbG0tYXBpLWdhdGV3YXkgfAp8" + + "IGFwaS1rZXlzIHwgYXBpLWtleXMsIGFkbWluLWlzc3Vlci1wcm94eSB8CnwgZXNzIHwgZXNzLWFw" + + "aSB8Cnwgc2lzIHwgc2lzIHwKfCBlbnZveS1nYXRld2F5LXN5c3RlbSB8IGVudm95IGdhdGV3YXkg" + + "KGluZ3Jlc3MgY29udHJvbGxlcikgfAp8IGVudm95LWdhdGV3YXkgfCBnYXRld2F5IHJlc291cmNl" + + "ICsgcm91dGVzIHwKUEsHCFY+Z5CVMAAAlTAAAFBLAwQUAAgAAAAAACEAAAAAAAAAAAAAAAAARAAJ" + + "AGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uL3JlZmVyZW5jZXMvaGVsbWZpbGUt" + + "c3RydWN0dXJlLm1kVVQFAAEAps4SIyBIZWxtZmlsZSBTdHJ1Y3R1cmUgUmVmZXJlbmNlCgojIyBE" + + "aXJlY3RvcnkgTGF5b3V0CgpgYGAKbnZjZi1zZWxmLW1hbmFnZWQtc3RhY2svCnwtLSBoZWxtZmls" + + "ZS5kLwp8ICAgfC0tIDAxLWRlcGVuZGVuY2llcy55YW1sLmdvdG1wbCAgIyBOQVRTLCBDYXNzYW5k" + + "cmEsIE9wZW5CYW8KfCAgIHwtLSAwMi1jb3JlLnlhbWwuZ290bXBsICAgICAgICAgICMgTlZDRiBz" + + "ZXJ2aWNlcyArIGluZ3Jlc3MKfCAgIGAtLSAwMy1vYnNlcnZhYmlsaXR5LnlhbWwuZ290bXBsICMg" + + "T2JzZXJ2YWJpbGl0eSBzdGFjayAob3B0aW9uYWwpCnwtLSBlbnZpcm9ubWVudHMvCnwgICB8LS0g" + + "YmFzZS55YW1sICAgICAgICAgICAgICAgICAgICAjIERlZmF1bHQgdmFsdWVzIChhbGwgZW52aXJv" + + "bm1lbnRzKQp8ICAgYC0tIDxlbnYtbmFtZT4ueWFtbCAgICAgICAgICAgICAgIyBQZXItZW52aXJv" + + "bm1lbnQgb3ZlcnJpZGVzCnwtLSBzZWNyZXRzLwp8ICAgYC0tIDxlbnYtbmFtZT4tc2VjcmV0cy55" + + "YW1sICAgICAgIyBTZW5zaXRpdmUgdmFsdWVzIChyZWdpc3RyeSBjcmVkcywgcGFzc3dvcmRzKQpg" + + "LS0gZ2xvYmFsLnlhbWwuZ290bXBsICAgICAgICAgICAgICAgIyBHbyB0ZW1wbGF0ZSB0aGF0IGNv" + + "bnN0cnVjdHMgcGVyLWNoYXJ0IHZhbHVlcwoKbnZjZi1jb21wdXRlLXBsYW5lLXN0YWNrLwp8LS0g" + + "aGVsbWZpbGUuZC8KfCAgIHwtLSAwMS1kZXBlbmRlbmNpZXMueWFtbC5nb3RtcGwgICMgQ29tcHV0" + + "ZSBwbGFuZSBkZXBlbmRlbmN5IGNvbXBvbmVudHMKfCAgIGAtLSAwMi1udmNhLnlhbWwuZ290bXBs" + + "ICAgICAgICAgICMgbnZjYS1vcGVyYXRvciBjaGFydCBhbmQgbnZjYSBjb25maWd1cmF0aW9uCnwt" + + "LSBlbnZpcm9ubWVudHMvCnwgICB8LS0gYmFzZS55YW1sICAgICAgICAgICAgICAgICAgICAjIERl" + + "ZmF1bHQgdmFsdWVzIChhbGwgZW52aXJvbm1lbnRzKQp8ICAgYC0tIDxlbnYtbmFtZT4ueWFtbCAg" + + "ICAgICAgICAgICAgIyBQZXItZW52aXJvbm1lbnQgb3ZlcnJpZGVzCmAtLSBnbG9iYWwueWFtbC5n" + + "b3RtcGwgICAgICAgICAgICAgICAjIEdvIHRlbXBsYXRlIHRoYXQgY29uc3RydWN0cyBwZXItY2hh" + + "cnQgdmFsdWVzCmBgYAoKVGhlc2Ugc3RhY2tzIGhhdmUgc2VwYXJhdGUgZW52aXJvbm1lbnRzIGFu" + + "ZCBjbHVzdGVyIGNvbnRleHRzLiBUaGUgSGVsbWZpbGUKdmFsdWVzIGZsb3cgYXV0aG9ycyBib3Ro" + + "IGVudmlyb25tZW50IGZpbGVzLiBUaGUgQ0xJIHByb2ZpbGUgZmxvdyBpbnN0ZWFkIHVzZXMKdGhl" + + "IENMSS1nZW5lcmF0ZWQgY29udHJvbC1wbGFuZSBwcm9maWxlIGFzIGl0cyBlbmRwb2ludCBzb3Vy" + + "Y2UuIERvIG5vdCBtaXggdGhlCmhhbmRvZmZzLiBTZWUgW1NwbGl0IENvbXB1dGUtUGxhbmUgSW5z" + + "dGFsbGF0aW9uXShjb21wdXRlLXBsYW5lLWluc3RhbGxhdGlvbi5tZCkuCgojIyBHb3RtcGwgRmls" + + "ZXMgYW5kIFRoZWlyIFJlbGVhc2VzCgojIyMgMDEtZGVwZW5kZW5jaWVzLnlhbWwuZ290bXBsCgp8" + + "IFJlbGVhc2UgfCBDaGFydCB8IE5hbWVzcGFjZSB8IE5vdGVzIHwKfC0tLS0tLS0tLXwtLS0tLS0t" + + "fC0tLS0tLS0tLS0tfC0tLS0tLS18CnwgbmF0cyB8IGhlbG0tbnZjZi1uYXRzIHwgbmF0cy1zeXN0" + + "ZW0gfCBNZXNzYWdpbmcgfAp8IG9wZW5iYW8tc2VydmVyIHwgaGVsbS1udmNmLW9wZW5iYW8tc2Vy" + + "dmVyIHwgdmF1bHQtc3lzdGVtIHwgU2VjcmV0cyBtYW5hZ2VtZW50LCBkZXBlbmRzIG9uIG5hdHMg" + + "fAp8IGNhc3NhbmRyYSB8IGhlbG0tbnZjZi1jYXNzYW5kcmEgfCBjYXNzYW5kcmEtc3lzdGVtIHwg" + + "RGF0YWJhc2UgfAoKVXNlcyBgPDw6ICpkZXBlbmRlbmN5YCB0ZW1wbGF0ZSBpbmhlcml0YW5jZSB3" + + "aXRoIGByZWxlYXNlLWdyb3VwOiBkZXBlbmRlbmNpZXNgIGxhYmVsLgoKIyMjIDAyLWNvcmUueWFt" + + "bC5nb3RtcGwKCnwgUmVsZWFzZSB8IENoYXJ0IHwgTmFtZXNwYWNlIHwgTGFiZWwgfAp8LS0tLS0t" + + "LS0tfC0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLXwKfCBhcGkta2V5cyB8IGhlbG0tbnZjZi1h" + + "cGkta2V5cyB8IGFwaS1rZXlzIHwgc2VydmljZXMgfAp8IHNpcyB8IGhlbG0tbnZjZi1zaXMgfCBz" + + "aXMgfCBzZXJ2aWNlcyB8CnwgYXBpIHwgaGVsbS1udmNmLWFwaSB8IG52Y2YgfCBzZXJ2aWNlcyB8" + + "CnwgaW52b2NhdGlvbi1zZXJ2aWNlIHwgaGVsbS1udmNmLWludm9jYXRpb24tc2VydmljZSB8IG52" + + "Y2YgfCBzZXJ2aWNlcyB8CnwgZ3JwYy1wcm94eSB8IGhlbG0tbnZjZi1ncnBjLXByb3h5IHwgbnZj" + + "ZiB8IHNlcnZpY2VzIHwKfCBlc3MtYXBpIHwgaGVsbS1udmNmLWVzcy1hcGkgfCBlc3MgfCBzZXJ2" + + "aWNlcyB8Cnwgbm90YXJ5LXNlcnZpY2UgfCBoZWxtLW52Y2Ytbm90YXJ5LXNlcnZpY2UgfCBudmNm" + + "IHwgc2VydmljZXMgfAp8IHJldmFsIHwgaGVsbS1yZXZhbCB8IG52Y2YgfCBzZXJ2aWNlcyB8Cnwg" + + "bGxtLXJlcXVlc3Qtcm91dGVyIHwgbnZjZi9oZWxtLW52Y2YtbGxtLXJlcXVlc3Qtcm91dGVyIHwg" + + "bnZjZiB8IHNlcnZpY2VzIHwKfCBsbG0tYXBpLWdhdGV3YXkgfCBudmNmL2hlbG0tbnZjZi1sbG0t" + + "YXBpLWdhdGV3YXkgfCBudmNmIHwgc2VydmljZXMgfAp8IGFkbWluLWlzc3Vlci1wcm94eSB8IGhl" + + "bG0tYWRtaW4tdG9rZW4taXNzdWVyLXByb3h5IHwgYXBpLWtleXMgfCAobm8gcmVsZWFzZS1ncm91" + + "cCBsYWJlbCkgfAp8IGluZ3Jlc3MgfCBudmNmLWdhdGV3YXktcm91dGVzIHwgZW52b3ktZ2F0ZXdh" + + "eS1zeXN0ZW0gfCBpbmdyZXNzIHwKCk1vc3Qgc2VydmljZXMgdXNlIGBpbmhlcml0OiBbe3RlbXBs" + + "YXRlOiBzZXJ2aWNlfV1gLiBMTE0gcmVsZWFzZXMgdXNlIE9DSSBjaGFydHMgZnJvbSB0aGUgYG52" + + "Y2ZgIHJlcG9zaXRvcnkgd2l0aCBzdGFuZGFsb25lIGB2YWx1ZXM6IFsuLi9nbG9iYWwueWFtbC5n" + + "b3RtcGxdYCBibG9ja3M7IHRoZXkgYXJlIGdhdGVkIG9uIGBhZGRvbnMubGxtLmVuYWJsZWRgLiBg" + + "YWRtaW4taXNzdWVyLXByb3h5YCBhbmQgYGluZ3Jlc3NgIGhhdmUgc3RhbmRhbG9uZSBgdmFsdWVz" + + "OmAgYmxvY2tzLgoKIyMjIDAzLW9ic2VydmFiaWxpdHkueWFtbC5nb3RtcGwKCnwgUmVsZWFzZSB8" + + "IENoYXJ0IHwgTmFtZXNwYWNlIHwgTGFiZWwgfAp8LS0tLS0tLS0tfC0tLS0tLS18LS0tLS0tLS0t" + + "LS18LS0tLS0tLXwKfCAob2JzZXJ2YWJpbGl0eSByZWxlYXNlcykgfCAodmFyaW91cykgfCBvYnNl" + + "cnZhYmlsaXR5IHwgb2JzZXJ2YWJpbGl0eSB8CgpHYXRlZCBvbiBvYnNlcnZhYmlsaXR5LXNwZWNp" + + "ZmljIGZsYWdzIGluIHRoZSBlbnZpcm9ubWVudCBmaWxlLiBTa2lwcGVkIGlmIGRpc2FibGVkLgoK" + + "IyMgVGVtcGxhdGUgSW5oZXJpdGFuY2UKCiMjIyBgPDw6ICpkZXBlbmRlbmN5YCAoWUFNTCBtZXJn" + + "ZSkKClVzZWQgaW4gYDAxLWRlcGVuZGVuY2llcy55YW1sLmdvdG1wbGAuIE1lcmdlcyB0aGUgdGVt" + + "cGxhdGUncyBwcm9wZXJ0aWVzIGludG8gdGhlIHJlbGVhc2UuCgoqKkdvdGNoYSoqOiBZQU1MIG1l" + + "cmdlIHJlcGxhY2VzIGxpc3RzLiBJZiB5b3UgYWRkIGEgYHZhbHVlczpgIGtleSB0byB0aGUgcmVs" + + "ZWFzZSwgaXQgKipyZXBsYWNlcyoqIHRoZSB0ZW1wbGF0ZSdzIGB2YWx1ZXM6YCBsaXN0IGVudGly" + + "ZWx5LiBZb3UgbXVzdCByZS1pbmNsdWRlIGFsbCB0ZW1wbGF0ZSB2YWx1ZXM6CgpJbiB0aGUgdGVt" + + "cGxhdGUgYmVsb3csIGA8cHJpdmF0ZS12YWx1ZXM+YCByZWZlcnMgdG8gdGhlIGBzZWNyZXRzL2Ag" + + "ZGlyZWN0b3J5IGF0IHRoZSBoZWxtZmlsZSBzdGFjayByb290LgoKYGBgeWFtbAojIFRlbXBsYXRl" + + "IGRlZmluZXM6CnRlbXBsYXRlczoKICBkZXBlbmRlbmN5OiAmZGVwZW5kZW5jeQogICAgY2hhcnQ6" + + "IG52Y2YvaGVsbS1udmNmLXt7IC5SZWxlYXNlLk5hbWUgfX0KICAgIHZhbHVlczoKICAgICAgLSAu" + + "Li9nbG9iYWwueWFtbC5nb3RtcGwKICAgICAgLSAuLi88cHJpdmF0ZS12YWx1ZXM+L3t7IHJlcXVp" + + "cmVkRW52ICJIRUxNRklMRV9FTlYiIH19LXNlY3JldHMueWFtbAoKIyBXaGVuIG92ZXJyaWRpbmcs" + + "IE1VU1QgcmUtaW5jbHVkZSBib3RoOgotIG5hbWU6IGNhc3NhbmRyYQogIDw8OiAqZGVwZW5kZW5j" + + "eQogIHZhbHVlczoKICAgIC0gLi4vZ2xvYmFsLnlhbWwuZ290bXBsICAgICAgICAgICAgICAgICAg" + + "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTXVzdCByZS1pbmNsdWRlCiAgICAtIC4uLzxw" + + "cml2YXRlLXZhbHVlcz4ve3sgcmVxdWlyZWRFbnYgIkhFTE1GSUxFX0VOViIgfX0tc2VjcmV0cy55" + + "YW1sICAgIyBNdXN0IHJlLWluY2x1ZGUKICAgIC0gY2Fzc2FuZHJhOiAgICAgICAgICAgICAgICAg" + + "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFlvdXIgb3ZlcnJpZGUK" + + "ICAgICAgICByZXNvdXJjZXM6CiAgICAgICAgICBsaW1pdHM6CiAgICAgICAgICAgIG1lbW9yeTog" + + "ODE5Mk1pCmBgYAoKIyMjIGBpbmhlcml0YCAoSGVsbWZpbGUgbmF0aXZlKQoKVXNlZCBpbiBgMDIt" + + "Y29yZS55YW1sLmdvdG1wbGAuIEhlbG1maWxlJ3MgbmF0aXZlIGluaGVyaXRhbmNlIG1lY2hhbmlz" + + "bS4KCmBgYHlhbWwKLSBuYW1lOiBhcGkKICB2ZXJzaW9uOiAxLjYuMAogIG5hbWVzcGFjZTogbnZj" + + "ZgogIGluaGVyaXQ6CiAgICAtIHRlbXBsYXRlOiBzZXJ2aWNlCmBgYAoKV2hlbiBhZGRpbmcgYHZh" + + "bHVlczpgIHRvIGFuIGluaGVyaXRlZCByZWxlYXNlLCB5b3UgYWxzbyBuZWVkIHRvIHJlLWluY2x1" + + "ZGUgdGhlIHRlbXBsYXRlJ3MgdmFsdWVzIGZpbGVzIHNpbmNlIGB2YWx1ZXNgIGlzIGEgbGlzdCB0" + + "aGF0IGdldHMgcmVwbGFjZWQuCgojIyBWYWx1ZXMgUHJlY2VkZW5jZQoKRnJvbSBsb3dlc3QgdG8g" + + "aGlnaGVzdCBwcmlvcml0eToKCjEuIGBlbnZpcm9ubWVudHMvYmFzZS55YW1sYCAtLSBkZWZhdWx0" + + "cyBzaGFyZWQgYWNyb3NzIGFsbCBlbnZpcm9ubWVudHMKMi4gYGVudmlyb25tZW50cy88ZW52Pi55" + + "YW1sYCAtLSBwZXItZW52aXJvbm1lbnQgb3ZlcnJpZGVzCjMuIGBnbG9iYWwueWFtbC5nb3RtcGxg" + + "IC0tIEdvIHRlbXBsYXRlIHByb2Nlc3NpbmcgKGNvbnN0cnVjdHMgY2hhcnQtc3BlY2lmaWMgc3Ry" + + "dWN0dXJlKQo0LiBgPHByaXZhdGUtdmFsdWVzPi88ZW52Pi1zZWNyZXRzLnlhbWxgIC0tIHNlbnNp" + + "dGl2ZSB2YWx1ZXMKNS4gSW5saW5lIGB2YWx1ZXM6YCBibG9ja3Mgb24gcmVsZWFzZXMgLS0gaGln" + + "aGVzdCBwcmVjZWRlbmNlCgojIyBXaGF0IGdsb2JhbC55YW1sLmdvdG1wbCBQYXNzZXMgVGhyb3Vn" + + "aAoKYGdsb2JhbC55YW1sLmdvdG1wbGAgcmVhZHMgZnJvbSBgLlZhbHVlc2AgKHRoZSBtZXJnZWQg" + + "ZW52aXJvbm1lbnQgKyBlbnYtc3BlY2lmaWMgWUFNTCkgYW5kIGNvbnN0cnVjdHMgY2hhcnQtc3Bl" + + "Y2lmaWMgdmFsdWVzLiBJdCBvbmx5IHBhc3NlcyB0aHJvdWdoIGtleXMgaXQgZXhwbGljaXRseSBy" + + "ZWZlcmVuY2VzOgoKIyMjIENhc3NhbmRyYQotIGBjYXNzYW5kcmEucmVwbGljYUNvdW50YAotIGBj" + + "YXNzYW5kcmEuaW1hZ2UuKmAgKHJlZ2lzdHJ5LCByZXBvc2l0b3J5KQotIGBjYXNzYW5kcmEubWln" + + "cmF0aW9ucy5pbWFnZS4qYAotIGBjYXNzYW5kcmEucGVyc2lzdGVuY2Uuc2l6ZWAKLSBgY2Fzc2Fu" + + "ZHJhLm5vZGVTZWxlY3RvcmAgKGlmIGBnbG9iYWwubm9kZVNlbGVjdG9ycy5lbmFibGVkYCkKLSBg" + + "Y2Fzc2FuZHJhLmdsb2JhbC5kZWZhdWx0U3RvcmFnZUNsYXNzYAoKIyMjIE5BVFMKLSBgbmF0cy5j" + + "b250YWluZXIuaW1hZ2UuKmAKLSBgbmF0cy5yZWxvYWRlci5pbWFnZS4qYAotIGBuYXRzLm5hdHNC" + + "b3guY29udGFpbmVyLmltYWdlLipgCi0gYG5hdHMuY29uZmlnLmpldHN0cmVhbS5maWxlU3RvcmUu" + + "cHZjLnN0b3JhZ2VDbGFzc05hbWVgCi0gYG5hdHMucG9kVGVtcGxhdGUubWVyZ2Uuc3BlYy5ub2Rl" + + "U2VsZWN0b3JgIChpZiBlbmFibGVkKQoKIyMjIE9wZW5CYW8KLSBgb3BlbmJhby5taWdyYXRpb25z" + + "LmltYWdlLipgIGFuZCBgb3BlbmJhby5taWdyYXRpb25zLmVudmAKLSBgb3BlbmJhby5pbmplY3Rv" + + "ci5pbWFnZS4qYAotIGBvcGVuYmFvLnNlcnZlci5pbWFnZS4qYAotIGBvcGVuYmFvLnNlcnZlci5k" + + "YXRhU3RvcmFnZS4qYAotIE5vZGUgc2VsZWN0b3JzIChpZiBlbmFibGVkKQoKIyMjIFNlcnZpY2Vz" + + "IChBUEksIFNJUywgZXRjLikKLSBgPHNlcnZpY2U+LmltYWdlLipgIChyZWdpc3RyeSwgcmVwb3Np" + + "dG9yeSkKLSBgPHNlcnZpY2U+Lm5vZGVTZWxlY3RvcmAgKGlmIGVuYWJsZWQpCi0gYDxzZXJ2aWNl" + + "Pi5lbnYuKmAgKG9ic2VydmFiaWxpdHkgc2V0dGluZ3MpCgojIyMgTExNIEZ1bmN0aW9uIEVuYWJs" + + "ZW1lbnQKCkVuYWJsZSB0aGUgTExNIGFkZG9uIGJlZm9yZSBjcmVhdGluZyBvciBpbnZva2luZyBm" + + "dW5jdGlvbnMgd2l0aApgZnVuY3Rpb25UeXBlOiAiTExNImAuIFRoZSBhZGRvbiBkZXBsb3lzIGBs" + + "bG0tcmVxdWVzdC1yb3V0ZXJgIGFuZApgbGxtLWFwaS1nYXRld2F5YCwgYWRkcyB0aGUgYGxsbS5p" + + "bnZvY2F0aW9uLjxkb21haW4+YCByb3V0ZSB3aGVuIEdhdGV3YXkgQVBJCmluZ3Jlc3MgaXMgZW5h" + + "YmxlZCwgYW5kIGNvbmZpZ3VyZXMgd29ya2VycyB0byB1c2UgdGhlIExMTSBzaWRlY2FyLiBUaGUg" + + "SGVsbWZpbGUKY29uZGl0aW9uIGlzIGBhZGRvbnMubGxtLmVuYWJsZWRgLiBEbyBub3QgdXNlIHRo" + + "ZSBvYnNvbGV0ZSBgbGxtLmVuYWJsZWRgIHBhdGguCgpGb3IgYSBzaW5nbGUtbm9kZSBpc29sYXRl" + + "ZCB0ZXN0IGNsdXN0ZXIsIGFkZCB0aGlzIGNvbmZpZ3VyYXRpb24gdG8KYGVudmlyb25tZW50cy88" + + "ZW52Pi55YW1sYCBiZWZvcmUgYXBwbHlpbmcgdGhlIHN0YWNrOgoKYGBgeWFtbAphZGRvbnM6CiAg" + + "bGxtOgogICAgZW5hYmxlZDogdHJ1ZQogICAgZ2F0ZXdheToKICAgICAgcmVwbGljYUNvdW50OiAx" + + "CiAgICAgIGF1dGg6CiAgICAgICAgZ3JwY0luc2VjdXJlOiB0cnVlCiAgICAgIG1ldHJpY3M6CiAg" + + "ICAgICAgc2VydmljZU1vbml0b3I6CiAgICAgICAgICBlbmFibGVkOiBmYWxzZQogICAgcmVxdWVz" + + "dFJvdXRlcjoKICAgICAgcmVwbGljYUNvdW50OiAxCiAgICAgIG1ldHJpY3M6CiAgICAgICAgc2Vy" + + "dmljZU1vbml0b3I6CiAgICAgICAgICBlbmFibGVkOiBmYWxzZQoKYWdlbnRDb25maWc6CiAgbWVy" + + "Z2VDb25maWc6IHwKICAgIGNsdXN0ZXI6CiAgICAgIHZhbGlkYXRpb25Qb2xpY3k6CiAgICAgICAg" + + "bmFtZTogVW5yZXN0cmljdGVkCiAgICB3b3JrbG9hZDoKICAgICAgc3RhcmdhdGVRVUlDSW5zZWN1" + + "cmU6IHRydWUKYGBgCgpVc2UgYHJlcGxpY2FDb3VudDogMWAgb25seSBmb3IgbG9jYWwgb3Igc2lu" + + "Z2xlLW5vZGUgdGVzdCBjbHVzdGVycy4gRm9yIHNoYXJlZApvciBwcm9kdWN0aW9uIGNsdXN0ZXJz" + + "LCB1c2UgdGhlIHJlcXVpcmVkIHJlcGxpY2EgY291bnQgYW5kIFRMUy1jYXBhYmxlIHNlcnZpY2UK" + + "Y29uZmlndXJhdGlvbi4gYGFkZG9ucy5sbG0uZ2F0ZXdheS5hdXRoLmdycGNJbnNlY3VyZWAgYW5k" + + "CmB3b3JrbG9hZC5zdGFyZ2F0ZVFVSUNJbnNlY3VyZWAgZW5hYmxlIHBsYWludGV4dCB0cmFuc3Bv" + + "cnRzLiBEbyBub3QgdXNlIHRoZW0gaW4KcHJvZHVjdGlvbi4KClRoZSByZXF1ZXN0IHJvdXRlciB1" + + "c2VzIGBwb3dlci1vZi10d29gIHdoZW4gbm8gbG9hZC1iYWxhbmNlciBjb25maWd1cmF0aW9uIGlz" + + "CnNldC4gQ29uZmlndXJlIG90aGVyIHJvdXRpbmcgbWV0aG9kcyB3aXRoIHRoZQpbTExNIFJlcXVl" + + "c3QgUm91dGVyIExvYWQgQmFsYW5jaW5nXShodHRwczovL2dpdGh1Yi5jb20vTlZJRElBL252Y2Yv" + + "YmxvYi9tYWluL2RvY3MvdXNlci9sbG0tcmVxdWVzdC1yb3V0ZXItbG9hZC1iYWxhbmNpbmcubWQp" + + "Cmd1aWRlLgoKSWYgdGhlIHNpZGVjYXIgaW1hZ2UgaXMgbWlycm9yZWQgb3V0c2lkZSB0aGUgc3Rh" + + "Y2sncyBkZWZhdWx0IGltYWdlIHJlZ2lzdHJ5IGFuZApyZXBvc2l0b3J5LCBzZXQgdGhlIGdlbmVy" + + "YXRlZCB3b3JrZXIgc2lkZWNhciBpbWFnZSBleHBsaWNpdGx5OgoKYGBgeWFtbAphcGk6CiAgZW52" + + "OgogICAgTlZDRl9TSURFQ0FSU19MTE1fUk9VVEVSX0NMSUVOVF9JTUFHRTogPHJlZ2lzdHJ5Pi88" + + "cmVwb3NpdG9yeT4vcHlsb246MC4yLjEKYGBgCgpSZW5kZXIgYW5kIGFwcGx5IHRoZSB1cGRhdGVk" + + "IGNvbnRyb2wtcGxhbmUgZW52aXJvbm1lbnQsIHRoZW4gcmVmcmVzaCBldmVyeQpyZWdpc3RlcmVk" + + "IGNvbXB1dGUgcGxhbmUgdXNpbmcgdGhlIHNhbWUgaGFuZG9mZiB1c2VkIGZvciBpdHMgaW5zdGFs" + + "bGF0aW9uIHNvCk5WQ0EgcmVjZWl2ZXMgYGFnZW50Q29uZmlnLm1lcmdlQ29uZmlnYDoKCmBgYGJh" + + "c2gKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIHRlbXBsYXRlCkhFTE1GSUxFX0VOVj08ZW52" + + "PiBoZWxtZmlsZSBzeW5jCmBgYAoKVXNlIHRoZSBjb21wbGV0ZSBjb21wdXRlLXBsYW5lIGluc3Rh" + + "bGwgY29tbWFuZCBmcm9tCltTcGxpdCBDb21wdXRlLVBsYW5lIEluc3RhbGxhdGlvbl0oY29tcHV0" + + "ZS1wbGFuZS1pbnN0YWxsYXRpb24ubWQpLiBBCkNMSS1wcm9maWxlIGluc3RhbGxhdGlvbiBtdXN0" + + "IHJlbWFpbiBwcm9maWxlLWRyaXZlbjsgYSBIZWxtZmlsZSBpbnN0YWxsYXRpb24KbXVzdCByZW1h" + + "aW4gdmFsdWVzLWRyaXZlbi4KCkV4aXN0aW5nIExMTSBmdW5jdGlvbiBwb2RzIGtlZXAgdGhlaXIg" + + "ZXhpc3Rpbmcgc2lkZWNhciBhcmd1bWVudHMuIFJlY3JlYXRlIG9yCnJlZGVwbG95IHRob3NlIGZ1" + + "bmN0aW9ucyBhZnRlciB0aGUgY29tcHV0ZS1wbGFuZSByZWZyZXNoLiBWZXJpZnkgdGhlIGNvbnRy" + + "b2wKcGxhbmUsIHJvdXRlLCBhbmQgd29ya2VyIHNpZGVjYXI6CgpgYGBiYXNoCmt1YmVjdGwgZ2V0" + + "IGRlcGxveSAtbiBudmNmIGxsbS1hcGktZ2F0ZXdheQprdWJlY3RsIGdldCBzdGF0ZWZ1bHNldCAt" + + "biBudmNmIGxsbS1yZXF1ZXN0LXJvdXRlcgprdWJlY3RsIGdldCBwb2RzIC1uIG52Y2YgfCBncmVw" + + "IC1FICdsbG0tYXBpLWdhdGV3YXl8bGxtLXJlcXVlc3Qtcm91dGVyJwprdWJlY3RsIGdldCBodHRw" + + "cm91dGUgLUEgfCBncmVwIGxsbQprdWJlY3RsIC1uIG52Y2YtYmFja2VuZCBnZXQgcG9kIDxmdW5j" + + "dGlvbi1wb2Q+IFwKICAtbyBqc29ucGF0aD0ne3JhbmdlIC5zcGVjLmNvbnRhaW5lcnNbPyhALm5h" + + "bWU9PSJsbG0td29ya2VyIildLmFyZ3NbKl19ey59eyJcXG4ifXtlbmR9JwpgYGAKCkZvciBsb2Nh" + + "bCBwbGFpbnRleHQgY2x1c3RlcnMsIHRoZSBgbGxtLXdvcmtlcmAgYXJncyBtdXN0IGluY2x1ZGUK" + + "YC0tcXVpYy1pbnNlY3VyZWAuCgpGb3IgbG9hZC1iYWxhbmNlciBzY2hlbWEgYW5kIGFsZ29yaXRo" + + "bSBiZWhhdmlvciwgc2VlIHRoZQpbU3RhcmdhdGUgY29uZmlndXJhdGlvbiBndWlkZV0oaHR0cHM6" + + "Ly9naXRodWIuY29tL05WSURJQS9udmNmL2Jsb2IvbWFpbi9zcmMvbGlicmFyaWVzL3J1c3Qvc3Rh" + + "cmdhdGUvZG9jcy9sb2FkLWJhbGFuY2VyLWNvbmZpZ3VyYXRpb24ubWQpLgoKIyMgSGVsbWZpbGUg" + + "U2VsZWN0b3JzCgpUYXJnZXQgc3BlY2lmaWMgcmVsZWFzZXMgb3IgZ3JvdXBzOgoKYGBgYmFzaAoj" + + "IEJ5IHJlbGVhc2UgZ3JvdXAKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0b3Ig" + + "cmVsZWFzZS1ncm91cD1kZXBlbmRlbmNpZXMgc3luYwpIRUxNRklMRV9FTlY9PGVudj4gaGVsbWZp" + + "bGUgLS1zZWxlY3RvciByZWxlYXNlLWdyb3VwPXNlcnZpY2VzIHN5bmMKSEVMTUZJTEVfRU5WPTxl" + + "bnY+IGhlbG1maWxlIC0tc2VsZWN0b3IgcmVsZWFzZS1ncm91cD1pbmdyZXNzIHN5bmMKSEVMTUZJ" + + "TEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0b3IgcmVsZWFzZS1ncm91cD1vYnNlcnZhYmls" + + "aXR5IHN5bmMKCiMgQnkgcmVsZWFzZSBuYW1lCkhFTE1GSUxFX0VOVj08ZW52PiBoZWxtZmlsZSAt" + + "LXNlbGVjdG9yIG5hbWU9Y2Fzc2FuZHJhIHN5bmMKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxl" + + "IC0tc2VsZWN0b3IgbmFtZT1hZG1pbi1pc3N1ZXItcHJveHkgc3luYwpIRUxNRklMRV9FTlY9PGVu" + + "dj4gaGVsbWZpbGUgLS1zZWxlY3RvciBuYW1lPWxsbS1yZXF1ZXN0LXJvdXRlciBzeW5jCkhFTE1G" + + "SUxFX0VOVj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9bGxtLWFwaS1nYXRld2F5IHN5" + + "bmMKCiMgVGVtcGxhdGUgb25seSAoZHJ5IHJ1bikKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxl" + + "IC0tc2VsZWN0b3IgbmFtZT1jYXNzYW5kcmEgdGVtcGxhdGUKCiMgRGVzdHJveSBhIHNpbmdsZSBy" + + "ZWxlYXNlCkhFTE1GSUxFX0VOVj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9Y2Fzc2Fu" + + "ZHJhIGRlc3Ryb3kKYGBgCgpOb3RlOiBgYWRtaW4taXNzdWVyLXByb3h5YCBoYXMgbm8gYHJlbGVh" + + "c2UtZ3JvdXBgIGxhYmVsLiBVc2UgYC0tc2VsZWN0b3IgbmFtZT1hZG1pbi1pc3N1ZXItcHJveHlg" + + "LgpQSwcIwFYg548nAACPJwAAUEsDBBQACAAAAAAAIQAAAAAAAAAAAAAAAAA/AAkAZGF0YS9udmNm" + + "LXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24vcmVmZXJlbmNlcy9udmNmLXVpLWFkZG9uLm1kVVQF" + + "AAEAps4SIyBOVkNGIFVJIEFkZG9uCgpOVkNGIFVJIGlzIGFuIG9wdGlvbmFsLCBjdXN0b21lci1m" + + "YWNpbmcgTlZDRiBhZG1pbi1wYW5lbCBVSS4gSXQgaXMgZGlzYWJsZWQgYnkKZGVmYXVsdCBhbmQg" + + "YXZhaWxhYmxlIG9ubHkgaW4gc3RhY2sgcGFja2FnZXMgdGhhdCBpbmNsdWRlIHRoZSBOVkNGIFVJ" + + "IGFkZG9uLgoKIyMgV2hlbiB0byBlbmFibGUKCkVuYWJsZSBOVkNGIFVJIG9ubHkgd2hlbiB5b3Ug" + + "bmVlZCB0aGUgYWRtaW4tcGFuZWwgVUkgYW5kIHlvdXIgZXh0cmFjdGVkIHN0YWNrCnBhY2thZ2Ug" + + "aW5jbHVkZXMgdGhlIGFkZG9uLiBJZiB0aGUgcGFja2FnZSBkb2VzIG5vdCBjb250YWluIGEgYG52" + + "Y2YtdWlgIHJlbGVhc2UKYW5kIGBudmNmVWlgIHJvdXRlIHZhbHVlcywgc2tpcCB0aGUgYWRkb24g" + + "dW50aWwgeW91IHVzZSBhIHBhY2thZ2UgdGhhdCBpbmNsdWRlcwp0aGVtLgoKIyMgRW5hYmxlIHRo" + + "ZSBhZGRvbgoKRW5hYmxlIGl0IGluIGBlbnZpcm9ubWVudHMvPGVudi1uYW1lPi55YW1sYDoKCmBg" + + "YHlhbWwKYWRkb25zOgogIG52Y2ZVaToKICAgIGVuYWJsZWQ6IHRydWUKYGBgCgojIyBDcmVhdGUg" + + "bmFtZXNwYWNlIGFuZCBpbWFnZSBwdWxsIHNlY3JldAoKQ3JlYXRlIHRoZSBuYW1lc3BhY2UsIGFu" + + "ZCBhbiBpbWFnZSBwdWxsIHNlY3JldCBvbmx5IGlmIHB1bGxpbmcgZnJvbSBhIHByaXZhdGUKcmVn" + + "aXN0cnk6CgpgYGBiYXNoCmt1YmVjdGwgY3JlYXRlIG5hbWVzcGFjZSBudmNmLXVpIC0tZHJ5LXJ1" + + "bj1jbGllbnQgLW8geWFtbCB8IGt1YmVjdGwgYXBwbHkgLWYgLQoKIyBPbmx5IGlmIHB1bGxpbmcg" + + "ZnJvbSBhIHByaXZhdGUgcmVnaXN0cnkgKGUuZy4sIE5HQyBudmNyLmlvKQpleHBvcnQgTkdDX0FQ" + + "SV9LRVk9Ijx5b3VyLWtleT4iCmt1YmVjdGwgY3JlYXRlIHNlY3JldCBkb2NrZXItcmVnaXN0cnkg" + + "bnZjci1jcmVkcyBcCiAgLS1kb2NrZXItc2VydmVyPW52Y3IuaW8gXAogIC0tZG9ja2VyLXVzZXJu" + + "YW1lPSckb2F1dGh0b2tlbicgXAogIC0tZG9ja2VyLXBhc3N3b3JkPSIkTkdDX0FQSV9LRVkiIFwK" + + "ICAtLW5hbWVzcGFjZT1udmNmLXVpIFwKICAtLWRyeS1ydW49Y2xpZW50IC1vIHlhbWwgfCBrdWJl" + + "Y3RsIGFwcGx5IC1mIC0KYGBgCgpUaGUgZGVmYXVsdCByb3V0ZSBob3N0IGlzIGBudmNmLXVpLjxk" + + "b21haW4+YCBhbmQgdGhlIGJhY2tlbmQgaXMKYG52Y2YtdWkubnZjZi11aTo4MzAwYC4KCiMjIEFw" + + "cGx5IHRoZSBzZXJ2aWNlIGFuZCByb3V0ZQoKQWZ0ZXIgY29uZmlybWluZyB0aGUgcGFja2FnZSBp" + + "bmNsdWRlcyB0aGUgYG52Y2YtdWlgIHJlbGVhc2UsIHByZXZpZXcgYW5kIGFwcGx5CnRoZSBzZXJ2" + + "aWNlIGFuZCByb3V0ZToKCmBgYGJhc2gKSEVMTUZJTEVfRU5WPTxlbnYtbmFtZT4gaGVsbWZpbGUg" + + "LS1zZWxlY3RvciBuYW1lPW52Y2YtdWkgdGVtcGxhdGUKSEVMTUZJTEVfRU5WPTxlbnYtbmFtZT4g" + + "aGVsbWZpbGUgLS1zZWxlY3RvciBuYW1lPW52Y2YtdWkgc3luYwpIRUxNRklMRV9FTlY9PGVudi1u" + + "YW1lPiBoZWxtZmlsZSAtLXNlbGVjdG9yIHJlbGVhc2UtZ3JvdXA9aW5ncmVzcyBzeW5jCmBgYAoK" + + "IyMgVmVyaWZ5CgpWZXJpZnkgdGhlIHJvdXRlIG9ubHkgd2hlbiB0aGUgYWRkb24gaXMgcHJlc2Vu" + + "dCBhbmQgZW5hYmxlZDoKCmBgYGJhc2gKa3ViZWN0bCBnZXQgZGVwbG95LHN2YyAtbiBudmNmLXVp" + + "Cmt1YmVjdGwgZ2V0IGh0dHByb3V0ZSAtQSB8IGdyZXAgLWkgbnZjZi11aQpjdXJsIC1pIC1IICJI" + + "b3N0OiBudmNmLXVpLjxkb21haW4+IiAiaHR0cDovLzxnYXRld2F5LWFkZHJlc3M+L3N0YXR1cyIK" + + "YGBgCgojIyBTZWN1cml0eQoKVGhlIE5WQ0YgVUkgYWRtaW4gcGFuZWwgaXMgY3VycmVudGx5IHVu" + + "YXV0aGVudGljYXRlZC4gRG8gbm90IGV4cG9zZSBpdCB0byB0aGUKcHVibGljIGludGVybmV0LiBS" + + "ZXN0cmljdCBhY2Nlc3MgdG8gYSB0cnVzdGVkIG5ldHdvcmssIFZQTiwgb3IgYW4gYXV0aGVudGlj" + + "YXRpbmcKcHJveHkgaW4gZnJvbnQgb2YgdGhlIGBudmNmLXVpYCByb3V0ZS4KUEsHCDj5J6+5BwAA" + + "uQcAAFBLAwQUAAgAAAAAACEAAAAAAAAAAAAAAAAAPgAJAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQt" + + "aW5zdGFsbGF0aW9uL3JlZmVyZW5jZXMvcHVsbC1zZWNyZXRzLm1kVVQFAAEAps4SIyBJbWFnZSBQ" + + "dWxsIFNlY3JldHMgUmVmZXJlbmNlCgojIyBPdmVydmlldwoKV2hlbiBwdWxsaW5nIE5WQ0YgaW1h" + + "Z2VzIGZyb20gYSBwcml2YXRlIHJlZ2lzdHJ5IChmb3IgZXhhbXBsZSwgTkdDCmBudmNyLmlvYCks" + + "IEt1YmVybmV0ZXMgbmVlZHMgYGltYWdlUHVsbFNlY3JldHNgIG9uIGV2ZXJ5IHBvZC4gQ29udHJv" + + "bC1wbGFuZSBhbmQKY29tcHV0ZS1wbGFuZSBjcmVkZW50aWFscyBhcmUgY29uZmlndXJlZCBpbiB0" + + "aGVpciBvd24gY2x1c3RlciBjb250ZXh0cy4gRG8gbm90CnVzZSBvbmUgbWl4ZWQgbmFtZXNwYWNl" + + "IGxpc3QuCgpUaGUgcmVjb21tZW5kZWQgY29udHJvbC1wbGFuZSBhcHByb2FjaCB1c2VzIEt5dmVy" + + "bm8gdG8gaW5qZWN0IHRoZSBzZWNyZXQgaW50bwpjb250cm9sLXBsYW5lIHBvZHMgYXQgYWRtaXNz" + + "aW9uIHRpbWUuIFRoZSBjb21wdXRlLXBsYW5lIGNoYXJ0IGFuZCBvcGVyYXRvciB1c2UKdGhlIHNl" + + "Y3JldCBpbiBgbnZjYS1vcGVyYXRvcmAgYW5kIG1pcnJvciBpdCB0byBgbnZjYS1zeXN0ZW1gLgoK" + + "IyMgS3l2ZXJubyBBcHByb2FjaCAoUmVjb21tZW5kZWQpCgojIyMgMS4gSW5zdGFsbCBLeXZlcm5v" + + "CgpgYGBiYXNoCmhlbG0gcmVwbyBhZGQga3l2ZXJubyBodHRwczovL2t5dmVybm8uZ2l0aHViLmlv" + + "L2t5dmVybm8vCmhlbG0gcmVwbyB1cGRhdGUKaGVsbSBpbnN0YWxsIGt5dmVybm8ga3l2ZXJuby9r" + + "eXZlcm5vIC1uIGt5dmVybm8gLS1jcmVhdGUtbmFtZXNwYWNlIFwKICAtLWt1YmUtY29udGV4dCA8" + + "Y29udHJvbC1wbGFuZS1jb250ZXh0PgpgYGAKCiMjIyAyLiBDcmVhdGUgY29udHJvbC1wbGFuZSBw" + + "dWxsIHNlY3JldHMKCmBgYGJhc2gKZXhwb3J0IE5HQ19BUElfS0VZPSI8eW91ci1uZ2MtYXBpLWtl" + + "eT4iCgpmb3IgbnMgaW4gY2Fzc2FuZHJhLXN5c3RlbSBuYXRzLXN5c3RlbSBudmNmIGFwaS1rZXlz" + + "IGVzcyBzaXMgdmF1bHQtc3lzdGVtIGNlcnQtbWFuYWdlcjsgZG8KICBrdWJlY3RsIC0tY29udGV4" + + "dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBjcmVhdGUgbmFtZXNwYWNlICIkbnMiIFwKICAgIC0t" + + "ZHJ5LXJ1bj1jbGllbnQgLW8geWFtbCB8IGt1YmVjdGwgLS1jb250ZXh0IDxjb250cm9sLXBsYW5l" + + "LWNvbnRleHQ+IGFwcGx5IC1mIC0KZG9uZQoKZm9yIG5zIGluIGNhc3NhbmRyYS1zeXN0ZW0gbmF0" + + "cy1zeXN0ZW0gbnZjZiBhcGkta2V5cyBlc3Mgc2lzIHZhdWx0LXN5c3RlbSBjZXJ0LW1hbmFnZXI7" + + "IGRvCiAga3ViZWN0bCAtLWNvbnRleHQgPGNvbnRyb2wtcGxhbmUtY29udGV4dD4gY3JlYXRlIHNl" + + "Y3JldCBkb2NrZXItcmVnaXN0cnkgbnZjci1jcmVkcyBcCiAgICAtLWRvY2tlci1zZXJ2ZXI9bnZj" + + "ci5pbyBcCiAgICAtLWRvY2tlci11c2VybmFtZT0nJG9hdXRodG9rZW4nIFwKICAgIC0tZG9ja2Vy" + + "LXBhc3N3b3JkPSIkTkdDX0FQSV9LRVkiIFwKICAgIC0tbmFtZXNwYWNlPSIkbnMiIFwKICAgIC0t" + + "ZHJ5LXJ1bj1jbGllbnQgLW8geWFtbCB8IGt1YmVjdGwgLS1jb250ZXh0IDxjb250cm9sLXBsYW5l" + + "LWNvbnRleHQ+IGFwcGx5IC1mIC0KZG9uZQpgYGAKCkZvciBub24tTkdDIHJlZ2lzdHJpZXMsIHJl" + + "cGxhY2UgYC0tZG9ja2VyLXNlcnZlcmAsIGAtLWRvY2tlci11c2VybmFtZWAsIGFuZCBgLS1kb2Nr" + + "ZXItcGFzc3dvcmRgLgoKIyMjIDMuIEFwcGx5IEt5dmVybm8gQ2x1c3RlclBvbGljeQoKYGBgeWFt" + + "bAphcGlWZXJzaW9uOiBreXZlcm5vLmlvL3YxCmtpbmQ6IENsdXN0ZXJQb2xpY3kKbWV0YWRhdGE6" + + "CiAgbmFtZTogbnZjZi1hZGQtaW1hZ2VwdWxsc2VjcmV0cwpzcGVjOgogIGJhY2tncm91bmQ6IGZh" + + "bHNlCiAgcnVsZXM6CiAgICAtIG5hbWU6IGFkZC1pbWFnZXB1bGxzZWNyZXQtdG8tbnZjZi1wb2Rz" + + "CiAgICAgIG1hdGNoOgogICAgICAgIGFueToKICAgICAgICAtIHJlc291cmNlczoKICAgICAgICAg" + + "ICAga2luZHM6CiAgICAgICAgICAgIC0gUG9kCiAgICAgICAgICAgIG5hbWVzcGFjZXM6CiAgICAg" + + "ICAgICAgIC0gIm52Y2YiCiAgICAgICAgICAgIC0gImFwaS1rZXlzIgogICAgICAgICAgICAtICJz" + + "aXMiCiAgICAgICAgICAgIC0gImVzcyIKICAgICAgICAgICAgLSAibmF0cy1zeXN0ZW0iCiAgICAg" + + "ICAgICAgIC0gImNhc3NhbmRyYS1zeXN0ZW0iCiAgICAgICAgICAgIC0gInZhdWx0LXN5c3RlbSIK" + + "ICAgICAgICAgICAgLSAiY2VydC1tYW5hZ2VyIgogICAgICBtdXRhdGU6CiAgICAgICAgcGF0Y2hT" + + "dHJhdGVnaWNNZXJnZToKICAgICAgICAgIG1ldGFkYXRhOgogICAgICAgICAgICBhbm5vdGF0aW9u" + + "czoKICAgICAgICAgICAgICBudmNmLm52aWRpYS5jb20vaW1hZ2VwdWxsc2VjcmV0LWluamVjdGVk" + + "LWJ5OiBreXZlcm5vCiAgICAgICAgICBzcGVjOgogICAgICAgICAgICBpbWFnZVB1bGxTZWNyZXRz" + + "OgogICAgICAgICAgICAtIG5hbWU6IG52Y3ItY3JlZHMKYGBgCgpgYGBiYXNoCmt1YmVjdGwgLS1j" + + "b250ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRleHQ+IGFwcGx5IFwKICAtZiBreXZlcm5vLWltYWdl" + + "cHVsbHNlY3JldC1wb2xpY3kueWFtbApgYGAKCiMjIyA0LiBJbnN0YWxsIHRoZSBjb250cm9sIHBs" + + "YW5lCgpDb250aW51ZSB3aXRoIHRoZSBzZWxlY3RlZCBjb250cm9sLXBsYW5lIGluc3RhbGxhdGlv" + + "biBpbgpbU3BsaXQgQ29tcHV0ZS1QbGFuZSBJbnN0YWxsYXRpb25dKGNvbXB1dGUtcGxhbmUtaW5z" + + "dGFsbGF0aW9uLm1kKS4gTm8KY29udHJvbC1wbGFuZSBoZWxtZmlsZSBtb2RpZmljYXRpb25zIGFy" + + "ZSBuZWVkZWQuIEt5dmVybm8gaW5qZWN0cyB0aGUgcHVsbApzZWNyZXQgaW50byBuZXcgY29udHJv" + + "bC1wbGFuZSBwb2RzLgoKIyMgQ29tcHV0ZS1QbGFuZSBTZWNyZXQKCkNyZWF0ZSB0aGUgc2VjcmV0" + + "IG9ubHkgaW4gYG52Y2Etb3BlcmF0b3JgIG9uIHRoZSBjb21wdXRlIGNsdXN0ZXI6CgpgYGBiYXNo" + + "Cmt1YmVjdGwgLS1jb250ZXh0IDxjb21wdXRlLXBsYW5lLWNvbnRleHQ+IGNyZWF0ZSBuYW1lc3Bh" + + "Y2UgbnZjYS1vcGVyYXRvciBcCiAgLS1kcnktcnVuPWNsaWVudCAtbyB5YW1sIHwgXAogIGt1YmVj" + + "dGwgLS1jb250ZXh0IDxjb21wdXRlLXBsYW5lLWNvbnRleHQ+IGFwcGx5IC1mIC0KCmt1YmVjdGwg" + + "LS1jb250ZXh0IDxjb21wdXRlLXBsYW5lLWNvbnRleHQ+IGNyZWF0ZSBzZWNyZXQgZG9ja2VyLXJl" + + "Z2lzdHJ5IG52Y3ItY3JlZHMgXAogIC0tZG9ja2VyLXNlcnZlcj1udmNyLmlvIFwKICAtLWRvY2tl" + + "ci11c2VybmFtZT0nJG9hdXRodG9rZW4nIFwKICAtLWRvY2tlci1wYXNzd29yZD0iJE5HQ19BUElf" + + "S0VZIiBcCiAgLS1uYW1lc3BhY2U9bnZjYS1vcGVyYXRvciBcCiAgLS1kcnktcnVuPWNsaWVudCAt" + + "byB5YW1sIHwgXAogIGt1YmVjdGwgLS1jb250ZXh0IDxjb21wdXRlLXBsYW5lLWNvbnRleHQ+IGFw" + + "cGx5IC1mIC0KYGBgCgpSZWZlcmVuY2UgaXQgaW4gdGhlIGNvbXB1dGUtcGxhbmUgZW52aXJvbm1l" + + "bnQgZmlsZToKCmBgYHlhbWwKZ2xvYmFsOgogIGltYWdlUHVsbFNlY3JldHM6CiAgICAtIG5hbWU6" + + "IG52Y3ItY3JlZHMKYGBgCgpUaGUgY2hhcnQgYW5kIG9wZXJhdG9yIHVzZSB0aGF0IHJlZmVyZW5j" + + "ZSBpbiBgbnZjYS1vcGVyYXRvcmAgYW5kIG1pcnJvciB0aGUKc2VjcmV0IHRvIGBudmNhLXN5c3Rl" + + "bWAuIERvIG5vdCBjcmVhdGUgYSBicm9hZGVyIG1hbnVhbCBjb21wdXRlIG5hbWVzcGFjZSBsaXN0" + + "LiBGb2xsb3cKW1NwbGl0IENvbXB1dGUtUGxhbmUgSW5zdGFsbGF0aW9uXShjb21wdXRlLXBsYW5l" + + "LWluc3RhbGxhdGlvbi5tZCkgZm9yIHRoZQpzZWxlY3RlZCBpbnN0YWxsIGZsb3cuCgojIyBWZXJp" + + "ZmljYXRpb24KCmBgYGJhc2gKIyBDaGVjayB0aGF0IGEgY29udHJvbC1wbGFuZSBwb2QgaGFzIHRo" + + "ZSBpbmplY3RlZCBzZWNyZXQKa3ViZWN0bCAtLWNvbnRleHQgPGNvbnRyb2wtcGxhbmUtY29udGV4" + + "dD4gZ2V0IHBvZCAtbiA8bmFtZXNwYWNlPiA8cG9kLW5hbWU+IFwKICAtbyBqc29ucGF0aD0ney5z" + + "cGVjLmltYWdlUHVsbFNlY3JldHN9JwojIEV4cGVjdGVkOiBbeyJuYW1lIjoibnZjci1jcmVkcyJ9" + + "XQoKIyBDaGVjayB0aGUgS3l2ZXJubyBhbm5vdGF0aW9uCmt1YmVjdGwgLS1jb250ZXh0IDxjb250" + + "cm9sLXBsYW5lLWNvbnRleHQ+IGdldCBwb2QgLW4gPG5hbWVzcGFjZT4gPHBvZC1uYW1lPiBcCiAg" + + "LW8ganNvbnBhdGg9J3subWV0YWRhdGEuYW5ub3RhdGlvbnMubnZjZlwubnZpZGlhXC5jb20vaW1h" + + "Z2VwdWxsc2VjcmV0LWluamVjdGVkLWJ5fScKIyBFeHBlY3RlZDoga3l2ZXJubwoKIyBDaGVjayBw" + + "dWxsIGV2ZW50cwprdWJlY3RsIC0tY29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBnZXQg" + + "ZXZlbnRzIC1uIDxuYW1lc3BhY2U+IFwKICAtLXNvcnQtYnk9Jy5sYXN0VGltZXN0YW1wJyB8IGdy" + + "ZXAgLWkgcHVsbAojIFNob3VsZCBzaG93ICJTdWNjZXNzZnVsbHkgcHVsbGVkIiBub3QgIjQwMSBV" + + "bmF1dGhvcml6ZWQiCgojIENoZWNrIHRoZSBjaGFydC9vcGVyYXRvciBtaXJyb3Igb24gdGhlIGNv" + + "bXB1dGUgY2x1c3RlcgprdWJlY3RsIC0tY29udGV4dCA8Y29tcHV0ZS1wbGFuZS1jb250ZXh0PiBn" + + "ZXQgc2VjcmV0IG52Y3ItY3JlZHMgXAogIC1uIG52Y2Etc3lzdGVtCmBgYAoKIyMgV2hlbiBQdWxs" + + "IFNlY3JldHMgQXJlIE5vdCBOZWVkZWQKCi0gKipBV1MgRUNSIHdpdGggSUFNIG5vZGUgcm9sZXMq" + + "KjogSWYgeW91ciBub2RlcyBoYXZlIGBBbWF6b25FQzJDb250YWluZXJSZWdpc3RyeVJlYWRPbmx5" + + "YCBJQU0gcG9saWN5LCBLdWJlcm5ldGVzIGNhbiBwdWxsIGZyb20gRUNSIHdpdGhvdXQgZXhwbGlj" + + "aXQgc2VjcmV0cy4KLSAqKlB1YmxpYyByZWdpc3RyaWVzKio6IE5vIHB1bGwgc2VjcmV0cyBuZWVk" + + "ZWQuCi0gKipDU1AgYnVpbHQtaW4gY3JlZGVudGlhbCBoZWxwZXJzKio6IEdLRSBBcnRpZmFjdCBS" + + "ZWdpc3RyeSwgQXp1cmUgQUNSIHdpdGggbWFuYWdlZCBpZGVudGl0eSwgYW5kIHNpbWlsYXIgc2Vy" + + "dmljZXMuCgojIyBUcm91Ymxlc2hvb3RpbmcKCiMjIyBQb2RzIHN0aWxsIGluIEltYWdlUHVsbEJh" + + "Y2tPZmYgYWZ0ZXIgYXBwbHlpbmcgcG9saWN5CgpUaGUgS3l2ZXJubyBwb2xpY3kgb25seSBhZmZl" + + "Y3RzIHBvZHMgY3JlYXRlZCAqKmFmdGVyKiogdGhlIHBvbGljeSBpcyBhcHBsaWVkLiBEZWxldGUg" + + "c3R1Y2sgcG9kcyB0byB0cmlnZ2VyIHJlY3JlYXRpb246CgpgYGBiYXNoCmt1YmVjdGwgLS1jb250" + + "ZXh0IDx0YXJnZXQtY29udGV4dD4gZGVsZXRlIHBvZHMgLW4gPG5hbWVzcGFjZT4gLS1hbGwKYGBg" + + "CgojIyMgS3l2ZXJubyBhZG1pc3Npb24gY29udHJvbGxlciBub3QgcnVubmluZwoKYGBgYmFzaApr" + + "dWJlY3RsIC0tY29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBnZXQgcG9kcyAtbiBreXZl" + + "cm5vCiMgQWxsIHBvZHMgc2hvdWxkIGJlIFJ1bm5pbmcKYGBgCgojIyMgUG9saWN5IG5vdCBtYXRj" + + "aGluZwoKYGBgYmFzaAprdWJlY3RsIC0tY29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBn" + + "ZXQgY2x1c3RlcnBvbGljeSBudmNmLWFkZC1pbWFnZXB1bGxzZWNyZXRzCiMgU2hvdWxkIHNob3cg" + + "UkVBRFk6IFRydWUKYGBgCgojIyMgV3Jvbmcgc2VjcmV0IG5hbWUKClRoZSBwb2xpY3kgcmVmZXJl" + + "bmNlcyBgbnZjci1jcmVkc2AuIFZlcmlmeSB0aGUgc2VjcmV0IGV4aXN0cyB3aXRoIHRoYXQgZXhh" + + "Y3QgbmFtZToKCmBgYGJhc2gKa3ViZWN0bCAtLWNvbnRleHQgPHRhcmdldC1jb250ZXh0PiBnZXQg" + + "c2VjcmV0IG52Y3ItY3JlZHMgLW4gPG5hbWVzcGFjZT4KYGBgClBLBwhLQjWoABYAAAAWAABQSwEC" + + "FAAUAAgAAAAAACEAjHZJYkkQAABJEAAAEgAJAAAAAAAAAAAAAAAAAAAAZGF0YS9tYW5pZmVzdC5q" + + "c29uVVQFAAEAps4SUEsBAhQAFAAIAAAAAAAhAMWeKOUFYAAABWAAACMACQAAAAAAAAAAAAAAkhAA" + + "AGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL1NLSUxMLm1kVVQFAAEAps4SUEsBAhQAFAAIAAAA" + + "AAAhACHGyIbwCgAA8AoAADMACQAAAAAAAAAAAAAA8XAAAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQt" + + "Y2xpL2V4YW1wbGVzL2NpLXBpcGVsaW5lcy5tZFVUBQABAKbOElBLAQIUABQACAAAAAAAIQBodj9B" + + "6AsAAOgLAAA0AAkAAAAAAAAAAAAAAEt8AABkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9leGFt" + + "cGxlcy9tdWx0aS1jbHVzdGVyLm1kVVQFAAEAps4SUEsBAhQAFAAIAAAAAAAhAP5mQzrMDAAAzAwA" + + "ADcACQAAAAAAAAAAAAAAnogAAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL3Byb21wdHMvYWRk" + + "LWNvbXB1dGUtcGxhbmUubWRVVAUAAQCmzhJQSwECFAAUAAgAAAAAACEAkdwb+ZgZAACYGQAAOQAJ" + + "AAAAAAAAAAAAAADYlQAAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1jbGkvcHJvbXB0cy9jcmVhdGUt" + + "YW5kLXJ1bi10YXNrLm1kVVQFAAEAps4SUEsBAhQAFAAIAAAAAAAhANJD3AQYJQAAGCUAADcACQAA" + + "AAAAAAAAAAAA4K8AAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL3Byb21wdHMvZGVwbG95LWFu" + + "ZC1pbnZva2UubWRVVAUAAQCmzhJQSwECFAAUAAgAAAAAACEADpw/l70OAAC9DgAAPQAJAAAAAAAA" + + "AAAAAABm1QAAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1jbGkvcHJvbXB0cy9kaWFnbm9zZS1mYWls" + + "ZWQtaW5zdGFsbC5tZFVUBQABAKbOElBLAQIUABQACAAAAAAAIQCHK42YWhwAAFocAAA6AAkAAAAA" + + "AAAAAAAAAJfkAABkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9wcm9tcHRzL2luc3RhbGwtZnJv" + + "bS1zY3JhdGNoLm1kVVQFAAEAps4SUEsBAhQAFAAIAAAAAAAhAFBj3GS2BwAAtgcAADkACQAAAAAA" + + "AAAAAAAAYgEBAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL3Byb21wdHMvcm90YXRlLWNsdXN0" + + "ZXItandrcy5tZFVUBQABAKbOElBLAQIUABQACAAAAAAAIQASkzNZ4CEAAOAhAAAuAAkAAAAAAAAA" + + "AAAAAIgJAQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9wcm9tcHRzL3RlYXJkb3duLm1kVVQF" + + "AAEAps4SUEsBAhQAFAAIAAAAAAAhANu+VPjXIgAA1yIAADAACQAAAAAAAAAAAAAAzSsBAGRhdGEv" + + "bnZjZi1zZWxmLW1hbmFnZWQtY2xpL3JlZmVyZW5jZS9jb21tYW5kcy5tZFVUBQABAKbOElBLAQIU" + + "ABQACAAAAAAAIQBzp1pk1QYAANUGAAAyAAkAAAAAAAAAAAAAAAtPAQBkYXRhL252Y2Ytc2VsZi1t" + + "YW5hZ2VkLWNsaS9yZWZlcmVuY2UvZXhpdC1jb2Rlcy5tZFVUBQABAKbOElBLAQIUABQACAAAAAAA" + + "IQAODAaVgSsAAIErAAAtAAkAAAAAAAAAAAAAAElWAQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNs" + + "aS9yZWZlcmVuY2UvZmxhZ3MubWRVVAUAAQCmzhJQSwECFAAUAAgAAAAAACEA864ThHQRAAB0EQAA" + + "NwAJAAAAAAAAAAAAAAAuggEAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1jbGkvcmVmZXJlbmNlL3Ry" + + "b3VibGVzaG9vdGluZy5tZFVUBQABAKbOElBLAQIUABQACAAAAAAAIQAv2rl1QmIAAEJiAAAsAAkA" + + "AAAAAAAAAAAAABCUAQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbi9TS0lMTC5t" + + "ZFVUBQABAKbOElBLAQIUABQACAAAAAAAIQArE7g/rVUAAK1VAAA0AAkAAAAAAAAAAAAAALX2AQBk" + + "YXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbi9ldmFscy9ldmFscy5qc29uVVQFAAEA" + + "ps4SUEsBAhQAFAAIAAAAAAAhAAJSTkB/KAAAfygAAC8ACQAAAAAAAAAAAAAAzUwCAGRhdGEvbnZj" + + "Zi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uL2V4YW1wbGVzLm1kVVQFAAEAps4SUEsBAhQAFAAI" + + "AAAAAAAhAJZjvFkSMAAAEjAAAEwACQAAAAAAAAAAAAAAsnUCAGRhdGEvbnZjZi1zZWxmLW1hbmFn" + + "ZWQtaW5zdGFsbGF0aW9uL3JlZmVyZW5jZXMvY29tcHV0ZS1wbGFuZS1pbnN0YWxsYXRpb24ubWRV" + + "VAUAAQCmzhJQSwECFAAUAAgAAAAAACEAVj5nkJUwAACVMAAAOwAJAAAAAAAAAAAAAABHpgIAZGF0" + + "YS9udmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24vcmVmZXJlbmNlcy9kZWJ1Z2dpbmcubWRV" + + "VAUAAQCmzhJQSwECFAAUAAgAAAAAACEAwFYg548nAACPJwAARAAJAAAAAAAAAAAAAABO1wIAZGF0" + + "YS9udmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24vcmVmZXJlbmNlcy9oZWxtZmlsZS1zdHJ1" + + "Y3R1cmUubWRVVAUAAQCmzhJQSwECFAAUAAgAAAAAACEAOPknr7kHAAC5BwAAPwAJAAAAAAAAAAAA" + + "AABY/wIAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24vcmVmZXJlbmNlcy9udmNm" + + "LXVpLWFkZG9uLm1kVVQFAAEAps4SUEsBAhQAFAAIAAAAAAAhAEtCNagAFgAAABYAAD4ACQAAAAAA" + + "AAAAAAAAhwcDAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uL3JlZmVyZW5jZXMv" + + "cHVsbC1zZWNyZXRzLm1kVVQFAAEAps4SUEsFBgAAAAAXABcArwkAAPwdAwAAAA==" var ( skillDataOnce sync.Once From 2630d3aa64e64fe186aa9b9fffc990d70767022d Mon Sep 17 00:00:00 2001 From: rohithb Date: Wed, 16 Sep 2026 01:48:38 +0530 Subject: [PATCH 29/36] fix(nvcf-cli): pin deletes to the inspected object and always credential-check an NGC endpoint --- .../examples/ci-pipelines.md | 6 +- .../nvcf-self-managed-cli/reference/flags.md | 2 +- .../agentskill/skilldata_generated.go | 6386 +++++++++-------- .../internal/selfhosted/clustervalidator.go | 18 +- .../nvcf-cli/internal/selfhosted/preflight.go | 24 +- .../internal/selfhosted/pullsecret.go | 19 +- .../internal/selfhosted/pullsecret_test.go | 66 + .../nvcf-cli/internal/selfhosted/register.go | 27 + .../internal/selfhosted/registry_cred.go | 25 + .../internal/selfhosted/registry_cred_test.go | 49 + .../selfhosted/stale_namespace_test.go | 58 + 11 files changed, 3470 insertions(+), 3210 deletions(-) diff --git a/ai-tooling/user/skills/nvcf-self-managed-cli/examples/ci-pipelines.md b/ai-tooling/user/skills/nvcf-self-managed-cli/examples/ci-pipelines.md index e854a34373..f13e32d79a 100644 --- a/ai-tooling/user/skills/nvcf-self-managed-cli/examples/ci-pipelines.md +++ b/ai-tooling/user/skills/nvcf-self-managed-cli/examples/ci-pipelines.md @@ -12,15 +12,17 @@ deploy_nvcf: variables: KUBECONFIG: $KUBECONFIG_FILE script: - - nvcf-cli self-hosted check --pre --json | jq -e '.event != "phase_failed"' || exit 2 + - nvcf-cli self-hosted check --pre --json 2>&1 >/dev/null | grep '^{' | jq -e '.event != "phase_failed"' || exit 2 - nvcf-cli self-hosted up --cluster-name=$CLUSTER_NAME --token=$NVCF_ADMIN_JWT --non-interactive --json - - nvcf-cli self-hosted status --json | jq -e '.verdict == "healthy"' + - nvcf-cli self-hosted status --json 2>&1 >/dev/null | grep '^{' | jq -e '.verdict == "healthy"' ``` Notes: - `--non-interactive --token=$JWT` is required in CI; never use interactive `init`. - Always `--json` for machine-parsing. +- `--json` writes JSONL to stderr, not stdout, so redirect with `2>&1 >/dev/null` before a parser. +- stderr also carries plain-text notices, so filter to JSON lines. Do not add `--show-logs` here: it appends a non-JSON transcript to the same stream. - Final status check gates downstream stages on `verdict == "healthy"`. ## GitOps (Argo / Flux) pattern diff --git a/ai-tooling/user/skills/nvcf-self-managed-cli/reference/flags.md b/ai-tooling/user/skills/nvcf-self-managed-cli/reference/flags.md index fc184f9bd1..cdc0e0cf53 100644 --- a/ai-tooling/user/skills/nvcf-self-managed-cli/reference/flags.md +++ b/ai-tooling/user/skills/nvcf-self-managed-cli/reference/flags.md @@ -53,7 +53,7 @@ after the run, so the kubeconfig context needs permission to manage those. | `--cluster-validator-pull-secret NAME` | docker-registry Secret in `default` used to pull the validator image. When empty, the CLI looks for one in the NVCF namespaces and falls back to minting one from `NGC_API_KEY` | auto-detect | | `--skip-cluster-validation` | Skip the in-cluster validator probe entirely. Env: `NVCF_CLI_SELFHOSTED_SKIP_CLUSTER_VALIDATION` | `false` | | `--no-cleanup` | Keep the validator Job (and its RBAC) after the run for debugging. The next run still sweeps prior Jobs | `false` | -| `--show-logs` | Print the validator transcript to stderr after the check events. Useful when piping `--json` to a script that also wants the transcript | `false` | +| `--show-logs` | Print the validator transcript to stderr after the check events. The transcript is not JSON, and `--json` also writes to stderr, so leave this off when a parser is reading the stream | `false` | ## `up`-specific diff --git a/src/clis/nvcf-cli/internal/agentskill/skilldata_generated.go b/src/clis/nvcf-cli/internal/agentskill/skilldata_generated.go index 8058db021a..d51dddae64 100644 --- a/src/clis/nvcf-cli/internal/agentskill/skilldata_generated.go +++ b/src/clis/nvcf-cli/internal/agentskill/skilldata_generated.go @@ -31,14 +31,14 @@ import ( const skillDataZipBase64 = "" + "UEsDBBQACAAAAAAAIQAAAAAAAAAAAAAAAAASAAkAZGF0YS9tYW5pZmVzdC5qc29uVVQFAAEAps4S" + "ewogICJzY2hlbWFWZXJzaW9uIjogMSwKICAiZ2VuZXJhdGVkQXQiOiAiMTk3MC0wMS0wMVQwMDow" + - "MDowMFoiLAogICJ0b3RhbEZpbGVzIjogMjIsCiAgInRvdGFsQnl0ZXMiOiAyMDI2NzAsCiAgImZp" + + "MDowMFoiLAogICJ0b3RhbEZpbGVzIjogMjIsCiAgInRvdGFsQnl0ZXMiOiAyMDMwMjMsCiAgImZp" + "bGVzIjogWwogICAgewogICAgICAicGF0aCI6ICJudmNmLXNlbGYtbWFuYWdlZC1jbGkvU0tJTEwu" + "bWQiLAogICAgICAic2hhMjU2IjogImFhOWY3ZTI0NmYzODA0YjMzNDNiNjU2MWU1YmNmZTdiYjcy" + "YjI0MDIxOTMzZTA0OWY4NWUwMDI4OTAzYmJmYTQiLAogICAgICAic2l6ZSI6IDI0OTE1CiAgICB9" + "LAogICAgewogICAgICAicGF0aCI6ICJudmNmLXNlbGYtbWFuYWdlZC1jbGkvZXhhbXBsZXMvY2kt" + - "cGlwZWxpbmVzLm1kIiwKICAgICAgInNoYTI1NiI6ICIxYjU2MzQyMmU4MWRkYWJiNDgxMzhkYWI4" + - "NmQ3ZTZkMTBmNDIyMWYwMDk5OGM1MjlhODc1NDZhYjlkZmQ5MjUyIiwKICAgICAgInNpemUiOiAy" + - "ODAxCiAgICB9LAogICAgewogICAgICAicGF0aCI6ICJudmNmLXNlbGYtbWFuYWdlZC1jbGkvZXhh" + + "cGlwZWxpbmVzLm1kIiwKICAgICAgInNoYTI1NiI6ICI4NGVlNGE0MDc3MzRkYjkzZWRhMjg2OTBk" + + "NTk5OGU2ZWI0YjBlYTkwMTFlY2U4YWIxYWE2OWQyNzMzNjU2OTRmIiwKICAgICAgInNpemUiOiAz" + + "MTA3CiAgICB9LAogICAgewogICAgICAicGF0aCI6ICJudmNmLXNlbGYtbWFuYWdlZC1jbGkvZXhh" + "bXBsZXMvbXVsdGktY2x1c3Rlci5tZCIsCiAgICAgICJzaGEyNTYiOiAiNmRmMjg0NjBiNTgzNDNl" + "MjEwMjVhYTViZDc5ZjMzYjUxMmRjYTlmZjM5YjZhYjI2MDRmYzNmZWJiMDE1ODhiNCIsCiAgICAg" + "ICJzaXplIjogMzE2NQogICAgfSwKICAgIHsKICAgICAgInBhdGgiOiAibnZjZi1zZWxmLW1hbmFn" + @@ -71,9 +71,9 @@ const skillDataZipBase64 = "" + "ZW5jZS9leGl0LWNvZGVzLm1kIiwKICAgICAgInNoYTI1NiI6ICI2NGI1ZmE5YmNhZjBlMGE1M2Y3" + "ODkyMGI3M2ZjYjUzMGFiNjk0NTFiNDhhNWI0OTNmMjUyY2ExODU4M2FiMDg2IiwKICAgICAgInNp" + "emUiOiAxNzQ5CiAgICB9LAogICAgewogICAgICAicGF0aCI6ICJudmNmLXNlbGYtbWFuYWdlZC1j" + - "bGkvcmVmZXJlbmNlL2ZsYWdzLm1kIiwKICAgICAgInNoYTI1NiI6ICI2NmNhZGYyYjliZGMzYThj" + - "NmZjOWI2N2EzZTIxZjZmZjE2YTNiYzE5MjI1NDE3OTllYWJjNjAyY2Y3MmQxOTg3IiwKICAgICAg" + - "InNpemUiOiAxMTc1MgogICAgfSwKICAgIHsKICAgICAgInBhdGgiOiAibnZjZi1zZWxmLW1hbmFn" + + "bGkvcmVmZXJlbmNlL2ZsYWdzLm1kIiwKICAgICAgInNoYTI1NiI6ICJmMjNhZDhmYzViMGUyNTdk" + + "ZmQ0MmRlMGRjOTA0YmQ5ZTVhYTMxYmNkMTQ5ZWM4OWRmZWUxMjllYTU5NzRiYmZlIiwKICAgICAg" + + "InNpemUiOiAxMTc5OQogICAgfSwKICAgIHsKICAgICAgInBhdGgiOiAibnZjZi1zZWxmLW1hbmFn" + "ZWQtY2xpL3JlZmVyZW5jZS90cm91Ymxlc2hvb3RpbmcubWQiLAogICAgICAic2hhMjU2IjogImE2" + "MzA4NGUyMjQ5ZjFkMTU0YzU5ODFlNGEwNzJiN2M3ODRiODVlYTE0NjA4NjUxNWVhYjRhYjY3MGE5" + "NDBlOTQiLAogICAgICAic2l6ZSI6IDQ0NjgKICAgIH0sCiAgICB7CiAgICAgICJwYXRoIjogIm52" + @@ -103,7 +103,7 @@ const skillDataZipBase64 = "" + "aCI6ICJudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24vcmVmZXJlbmNlcy9wdWxsLXNlY3Jl" + "dHMubWQiLAogICAgICAic2hhMjU2IjogImVjMWYzZmZjZDE3ZTVmOTU4M2ZlZTM5NzQ0ZWU4OTdk" + "NDY2YmMzY2Y2Mzg5Mjk0MjY0ZDg5ZTdmOWVkMDFiODciLAogICAgICAic2l6ZSI6IDU2MzIKICAg" + - "IH0KICBdCn0KUEsHCGfXWVRKEAAAShAAAFBLAwQUAAgAAAAAACEAAAAAAAAAAAAAAAAAIwAJAGRh" + + "IH0KICBdCn0KUEsHCE8jOeVKEAAAShAAAFBLAwQUAAgAAAAAACEAAAAAAAAAAAAAAAAAIwAJAGRh" + "dGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL1NLSUxMLm1kVVQFAAEAps4SLS0tCm5hbWU6IG52Y2Yt" + "c2VsZi1tYW5hZ2VkLWNsaQpkZXNjcmlwdGlvbjogfAogIEluc3RhbGwsIG9wZXJhdGUsIGFuZCB0" + "ZWFyIGRvd24gc2VsZi1ob3N0ZWQgTlZJRElBIENsb3VkIEZ1bmN0aW9ucyAoTlZDRikKICBkZXBs" + @@ -550,3073 +550,2252 @@ const skillDataZipBase64 = "" + "cGxlCmRlcGxveV9udmNmOgogIHN0YWdlOiBkZXBsb3kKICBpbWFnZTogbnZjci5pby8wNjUxMTU1" + "MjE1ODY0OTc5L25jcC1kZXYvbnZjZi1jbGk6MS40LjAKICB2YXJpYWJsZXM6CiAgICBLVUJFQ09O" + "RklHOiAkS1VCRUNPTkZJR19GSUxFCiAgc2NyaXB0OgogICAgLSBudmNmLWNsaSBzZWxmLWhvc3Rl" + - "ZCBjaGVjayAtLXByZSAtLWpzb24gfCBqcSAtZSAnLmV2ZW50ICE9ICJwaGFzZV9mYWlsZWQiJyB8" + - "fCBleGl0IDIKICAgIC0gbnZjZi1jbGkgc2VsZi1ob3N0ZWQgdXAgLS1jbHVzdGVyLW5hbWU9JENM" + - "VVNURVJfTkFNRSAtLXRva2VuPSROVkNGX0FETUlOX0pXVCAtLW5vbi1pbnRlcmFjdGl2ZSAtLWpz" + - "b24KICAgIC0gbnZjZi1jbGkgc2VsZi1ob3N0ZWQgc3RhdHVzIC0tanNvbiB8IGpxIC1lICcudmVy" + - "ZGljdCA9PSAiaGVhbHRoeSInCmBgYAoKTm90ZXM6CgotIGAtLW5vbi1pbnRlcmFjdGl2ZSAtLXRv" + - "a2VuPSRKV1RgIGlzIHJlcXVpcmVkIGluIENJOyBuZXZlciB1c2UgaW50ZXJhY3RpdmUgYGluaXRg" + - "LgotIEFsd2F5cyBgLS1qc29uYCBmb3IgbWFjaGluZS1wYXJzaW5nLgotIEZpbmFsIHN0YXR1cyBj" + - "aGVjayBnYXRlcyBkb3duc3RyZWFtIHN0YWdlcyBvbiBgdmVyZGljdCA9PSAiaGVhbHRoeSJgLgoK" + - "IyMgR2l0T3BzIChBcmdvIC8gRmx1eCkgcGF0dGVybgoKQ0kgZG9lc24ndCBga3ViZWN0bCBhcHBs" + - "eWAg4oCUIGluc3RlYWQsIHJlbmRlciBtYW5pZmVzdHMsIGNvbW1pdCB0aGVtLCBsZXQgdGhlIGNv" + - "bnRyb2xsZXIgYXBwbHkuCgpgYGB5YW1sCnJlbmRlcjoKICBzY3JpcHQ6CiAgICAtIG52Y2YtY2xp" + - "IHNlbGYtaG9zdGVkIGluc3RhbGwgLS1jb250cm9sLXBsYW5lIC0tbm8tYXBwbHkgPiByZW5kZXJl" + - "ZC9jb250cm9sLXBsYW5lLnlhbWwKICAgIC0gbnZjZi1jbGkgc2VsZi1ob3N0ZWQgaW5zdGFsbCAt" + - "LWNvbXB1dGUtcGxhbmUgLS1jbHVzdGVyLW5hbWU9JE5BTUUgLS1uby1hcHBseSA+IHJlbmRlcmVk" + - "L2NvbXB1dGUtcGxhbmUueWFtbAogICAgLSBnaXQgYWRkIHJlbmRlcmVkLyAmJiBnaXQgY29tbWl0" + - "IC1tICJkZXBsb3kgTlZDRiAkVEFHIiAmJiBnaXQgcHVzaApgYGAKClRoZW4gQXJnb0NEIG9yIEZs" + - "dXggd2F0Y2hlcyBgcmVuZGVyZWQvYCBhbmQgYXBwbGllcy4gVGhlIENMSSBuZXZlciB0b3VjaGVz" + - "IHRoZSBjbHVzdGVyIGRpcmVjdGx5LgoKRm9yIHRoZSByZWdpc3RlciBzdGVwICh3aGljaCBtdXRh" + - "dGVzIElDTVMsIG5vdCBqdXN0IEs4cyk6CgpgYGB5YW1sCnJlZ2lzdGVyOgogIHNjcmlwdDoKICAg" + - "IC0gbnZjZi1jbGkgY2x1c3RlciByZWdpc3RlciAtLW5hbWU9JE5BTUUgLS1uY2EtaWQ9JE5DQSAt" + - "LXJlZ2lvbj0kUkVHSU9OIC0taWdub3JlLWV4aXN0aW5nCmBgYAoKYC0taWdub3JlLWV4aXN0aW5n" + - "YCBpcyB0aGUgR2l0T3BzLWZyaWVuZGx5IGlkZW1wb3RlbnQgY29udHJhY3QuCgojIyBNdWx0aS1j" + - "bHVzdGVyIHBpcGVsaW5lCgpXaGVuIHRoZSBwaXBlbGluZSBtYW5hZ2VzIG1hbnkgY29tcHV0ZSBj" + - "bHVzdGVycyBhZ2FpbnN0IG9uZSBjb250cm9sIHBsYW5lOgoKYGBgeWFtbApkZXBsb3lfY29tcHV0" + - "ZV9wbGFuZXM6CiAgcGFyYWxsZWw6CiAgICBtYXRyaXg6CiAgICAgIC0gQ0xVU1RFUjogbmNwLWVh" + - "c3QtMQogICAgICAgIENPTlRFWFQ6IGFkbWluQGdwdS1lYXN0LTEKICAgICAgLSBDTFVTVEVSOiBu" + - "Y3Atd2VzdC0xCiAgICAgICAgQ09OVEVYVDogYWRtaW5AZ3B1LXdlc3QtMQogICAgICAtIENMVVNU" + - "RVI6IG5jcC1ldS0xCiAgICAgICAgQ09OVEVYVDogYWRtaW5AZ3B1LWV1LTEKICBzY3JpcHQ6CiAg" + - "ICAtIG52Y2YtY2xpIHNlbGYtaG9zdGVkIHVwCiAgICAgICAgLS1jbHVzdGVyLW5hbWU9JENMVVNU" + - "RVIKICAgICAgICAtLWNvbXB1dGUtcGxhbmUtY29udGV4dD0kQ09OVEVYVAogICAgICAgIC0taWNt" + - "cy11cmw9JElDTVNfUFVCTElDX1VSTAogICAgICAgIC0tdG9rZW49JE5WQ0ZfQURNSU5fSldUCiAg" + - "ICAgICAgLS1ub24taW50ZXJhY3RpdmUKICAgICAgICAtLWpzb24KYGBgCgpFYWNoIHBhcmFsbGVs" + - "IGpvYiByZWdpc3RlcnMgKyBpbnN0YWxscyBvbmUgY29tcHV0ZSBwbGFuZSBhZ2FpbnN0IHRoZSBz" + - "aGFyZWQgY29udHJvbCBwbGFuZS4gRmFpbHVyZXMgYXJlIGlzb2xhdGVkLgoKIyMgUGxhbi1vbmx5" + - "IHByZXZpZXcgaW4gUFJzCgpgYGB5YW1sCnByZXZpZXc6CiAgcnVsZXM6CiAgICAtIGlmOiAkQ0lf" + - "UElQRUxJTkVfU09VUkNFID09ICJtZXJnZV9yZXF1ZXN0X2V2ZW50IgogIHNjcmlwdDoKICAgIC0g" + - "fAogICAgICBudmNmLWNsaSBzZWxmLWhvc3RlZCB1cCBcCiAgICAgICAgLS1jbHVzdGVyLW5hbWU9" + - "JENMVVNURVJfTkFNRSBcCiAgICAgICAgLS1wbGFuLW9ubHkgXAogICAgICAgIC0tanNvbiB8IHRl" + - "ZSBwbGFuLmpzb25sCiAgICAtIGpxIC1zICcuWzBdJyBwbGFuLmpzb25sID4gcGxhbi5qc29uCiAg" + - "ICAtICdnaXRsYWItbXItY29tbWVudCAiIyMgTlZDRiBkZXBsb3kgcGxhblxuXG5cYFxgXGBqc29u" + - "XG4kKGNhdCBwbGFuLmpzb24pXG5cYFxgXGAiJwpgYGAKCmAtLXBsYW4tb25seWAgZXhpdHMgMCB3" + - "aXRob3V0IGNoYW5naW5nIGNsdXN0ZXIgc3RhdGU7IHRoZSBKU09OTCBvdXRwdXQgbGlzdHMgZWFj" + - "aCBwaGFzZSArIEVUQS4gUmVuZGVycyBuaWNlbHkgYXMgYW4gTVIgY29tbWVudC4KUEsHCJy3fgfx" + - "CgAA8QoAAFBLAwQUAAgAAAAAACEAAAAAAAAAAAAAAAAANAAJAGRhdGEvbnZjZi1zZWxmLW1hbmFn" + - "ZWQtY2xpL2V4YW1wbGVzL211bHRpLWNsdXN0ZXIubWRVVAUAAQCmzhIjIE11bHRpLWNsdXN0ZXIg" + - "cGF0dGVybnMKCkV4YW1wbGVzIG9mIHNwbGl0LWNsdXN0ZXIgKyBtYW55LWNvbXB1dGUtcGxhbmUg" + - "b3BlcmF0aW9uLgoKIyMgT25lIGNvbnRyb2wgcGxhbmUgKyBOIGNvbXB1dGUgcGxhbmVzCgpUaGUg" + - "Y2Fub25pY2FsIG11bHRpLWNsdXN0ZXIgdG9wb2xvZ3kuIEVhY2ggY29tcHV0ZSBwbGFuZSBpcyBy" + - "ZWdpc3RlcmVkIHNlcGFyYXRlbHk6CgpgYGBzaAojIDEuIEJyaW5nIHVwIHRoZSBjb250cm9sIHBs" + - "YW5lIChvbmUtdGltZSwgb24gdGhlIGNvbnRyb2wtcGxhbmUgY2x1c3Rlcik6CktVQkVDT05GSUc9" + - "Y3AueWFtbCBudmNmLWNsaSBzZWxmLWhvc3RlZCBpbnN0YWxsIC0tY29udHJvbC1wbGFuZSB8IGt1" + - "YmVjdGwgYXBwbHkgLWYgLQpudmNmLWNsaSBzZWxmLWhvc3RlZCBjaGVjayAtLWNvbnRyb2wtcGxh" + - "bmUgLS13YWl0IDVtCgojIDIuIFJlZ2lzdGVyICsgaW5zdGFsbCBlYWNoIGNvbXB1dGUgcGxhbmU6" + - "CmZvciBDVFggaW4gYWRtaW5AZ3B1LWVhc3QtMSBhZG1pbkBncHUtd2VzdC0xIGFkbWluQGdwdS1l" + - "dS0xOyBkbwogIE5BTUU9JChlY2hvICIkQ1RYIiB8IGN1dCAtZEAgLWYyKQogIG52Y2YtY2xpIHNl" + - "bGYtaG9zdGVkIHVwIFwKICAgIC0tY2x1c3Rlci1uYW1lPSROQU1FIFwKICAgIC0tY29tcHV0ZS1w" + - "bGFuZS1jb250ZXh0PSRDVFggXAogICAgLS1pY21zLXVybD1odHRwczovL2ljbXMubnZjZi5leGFt" + - "cGxlLmNvbSBcCiAgICAtLXRva2VuPSROVkNGX0FETUlOX0pXVCBcCiAgICAtLW5vbi1pbnRlcmFj" + - "dGl2ZSBcCiAgICAtLWpzb24KZG9uZQoKIyAzLiBWZXJpZnkgYWxsIGNvbXB1dGUgcGxhbmVzIHJl" + - "Z2lzdGVyZWQ6Cm52Y2YtY2xpIGNsdXN0ZXIgbGlzdC1yZWdpc3RlcmVkIC0tbmNhLWlkPSROQ0Ff" + - "SUQgLS1pY21zLXVybD0kSUNNUyAtLWpzb24gXAogIHwganEgJy5jbHVzdGVyc1tdIHwge25hbWU6" + - "IC5jbHVzdGVyTmFtZSwgc3RhdHVzLCBudmNhVmVyc2lvbn0nCmBgYAoKIyMgQ29tcHV0ZS1wbGFu" + - "ZS1vbmx5IG9wZXJhdG9yIHNjZW5hcmlvCgpUaGUgb3BlcmF0b3IgaGFzIGt1YmVjdGwgYWNjZXNz" + - "IHRvIE9ORSBjb21wdXRlIHBsYW5lIG9ubHkg4oCUIHRoZSBjb250cm9sIHBsYW5lIGlzIG9wZXJh" + - "dGVkIGJ5IHNvbWVvbmUgZWxzZSAoZS5nLiBZb3R0YSBydW5zIHRoZSBjb250cm9sIHBsYW5lIGZv" + - "ciBhIGN1c3RvbWVyKS4KCmBgYHNoCiMgTWludCBhIHRva2VuIHZpYSB0aGUgcHVibGljIGFwaSBn" + - "YXRld2F5ICh0aGUgY29udHJvbCBwbGFuZSdzIEFQSSBLZXlzCiMgc2VydmljZSBpcyByZWFjaGFi" + - "bGUgdmlhIGFwaS5udmNmLmV4YW1wbGUuY29tIOKAlCBubyBrdWJlY3RsIGFjY2VzcyBuZWVkZWQp" + - "OgpudmNmLWNsaSBpbml0IC0tYXBpLXVybD1odHRwczovL2FwaS5udmNmLmV4YW1wbGUuY29tCgoj" + - "IFJ1biBwcmUtZmxpZ2h0IHNjb3BlZCB0byB0aGUgY29tcHV0ZSBwbGFuZSBvbmx5OgpudmNmLWNs" + - "aSBzZWxmLWhvc3RlZCBjaGVjayAtLXByZSBcCiAgLS1jb21wdXRlLXBsYW5lLWNvbnRleHQ9YWRt" + - "aW5AZ3B1MSBcCiAgLS1pY21zLXVybD1odHRwczovL2ljbXMubnZjZi5leGFtcGxlLmNvbSBcCiAg" + - "LS1qc29uCgojIEJyaW5nIHVwIGp1c3QgdGhlIGNvbXB1dGUgcGxhbmU6Cm52Y2YtY2xpIHNlbGYt" + - "aG9zdGVkIHVwIFwKICAtLWNsdXN0ZXItbmFtZT1teS1jb21wdXRlLTEgXAogIC0tY29tcHV0ZS1w" + - "bGFuZS1jb250ZXh0PWFkbWluQGdwdTEgXAogIC0taWNtcy11cmw9aHR0cHM6Ly9pY21zLm52Y2Yu" + - "ZXhhbXBsZS5jb20gXAogIC0tdG9rZW49JEFETUlOX0pXVCBcCiAgLS1ub24taW50ZXJhY3RpdmUK" + - "CiMgU3RhdHVzIChjb21wdXRlLW9ubHkg4oCUIG9wZXJhdG9yIGNhbid0IHNlZSBjb250cm9sLXBs" + - "YW5lIGNvbXBvbmVudCBoZWFsdGgpOgpudmNmLWNsaSBzZWxmLWhvc3RlZCBzdGF0dXMgXAogIC0t" + - "Y29tcHV0ZS1wbGFuZS1jb250ZXh0PWFkbWluQGdwdTEgXAogIC0taWNtcy11cmw9aHR0cHM6Ly9p" + - "Y21zLm52Y2YuZXhhbXBsZS5jb20KYGBgCgojIyBGdW5jdGlvbnMgdGFyZ2V0aW5nIHNwZWNpZmlj" + - "IGNvbXB1dGUgcGxhbmVzCgpXaGVuIHlvdSBoYXZlIG11bHRpcGxlIGNvbXB1dGUgcGxhbmVzIGFu" + - "ZCB3YW50IGEgZnVuY3Rpb24gdG8gZGVwbG95IHRvIG9uZToKCmBgYGpzb24KewogICJmdW5jdGlv" + - "bklkIjogIjxmbl9pZD4iLAogICJ2ZXJzaW9uSWQiOiAiPHZlcl9pZD4iLAogICJkZXBsb3ltZW50" + - "U3BlY2lmaWNhdGlvbnMiOiBbewogICAgImdwdSI6ICJIMTAwIiwKICAgICJpbnN0YW5jZVR5cGUi" + - "OiAiTkNQLkdQVS5IMTAwXzF4IiwKICAgICJtaW5JbnN0YW5jZXMiOiAxLAogICAgIm1heEluc3Rh" + - "bmNlcyI6IDEsCiAgICAiY2x1c3RlcnMiOiBbImdwdS1lYXN0LTEiXQogIH1dCn0KYGBgCgpUaGUg" + - "YGNsdXN0ZXJzYCBhcnJheSAodXNpbmcgY2x1c3RlciBuYW1lcywgbm90IElEcykgbGltaXRzIHNj" + - "aGVkdWxpbmcgdG8gdGhvc2UgY29tcHV0ZSBwbGFuZXMuIE9taXQgdG8gbGV0IElDTVMgY2hvb3Nl" + - "IGFueSBjb21wdXRlIHBsYW5lIHdpdGggYSBtYXRjaGluZyBTS1UuCgojIyBTdGF0dXMgZmFuLW91" + - "dCBhY3Jvc3MgY29tcHV0ZSBwbGFuZXMKCmBgYHNoCiMgTGlzdCBhbGwgcmVnaXN0ZXJlZCBjb21w" + - "dXRlIHBsYW5lczoKbnZjZi1jbGkgY2x1c3RlciBsaXN0LXJlZ2lzdGVyZWQgLS1uY2EtaWQ9JE5D" + - "QV9JRCAtLWljbXMtdXJsPSRJQ01TIC0tanNvbiBcCiAgfCBqcSAtciAnLmNsdXN0ZXJzW10uY2x1" + - "c3Rlck5hbWUnID4gY2x1c3RlcnMudHh0CgojIFN0YXR1cyBzbmFwc2hvdCBwZXIgY29tcHV0ZSBw" + - "bGFuZSAoYXNzdW1pbmcgZWFjaCBjb250ZXh0IG5hbWUgbWF0Y2hlcyk6CndoaWxlIHJlYWQgTkFN" + - "RTsgZG8KICBlY2hvICI9PT0gJE5BTUUgPT09IgogIG52Y2YtY2xpIHNlbGYtaG9zdGVkIHN0YXR1" + - "cyBcCiAgICAtLWNsdXN0ZXItbmFtZT0kTkFNRSBcCiAgICAtLWNvbXB1dGUtcGxhbmUtY29udGV4" + - "dD1hZG1pbkAkTkFNRSBcCiAgICAtLWpzb24gfCBqcSAtYyAne2NsdXN0ZXI6LmNsdXN0ZXIsIHZl" + - "cmRpY3Q6LnZlcmRpY3QsIHJlY29uY2lsZToucmVjb25jaWxlQWdlU2VjfScKZG9uZSA8IGNsdXN0" + - "ZXJzLnR4dApgYGAKCkEgZnV0dXJlIE0rMTEgbWlsZXN0b25lIHdpbGwgYWRkIG5hdGl2ZSBmYW4t" + - "b3V0IChgc3RhdHVzIC0tYWxsLWNvbXB1dGUtcGxhbmVzYCkgc28gdGhpcyBkb2Vzbid0IG5lZWQg" + - "YSBzaGVsbCBsb29wLgpQSwcIoRTjgV0MAABdDAAAUEsDBBQACAAAAAAAIQAAAAAAAAAAAAAAAAA3" + - "AAkAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1jbGkvcHJvbXB0cy9hZGQtY29tcHV0ZS1wbGFuZS5t" + - "ZFVUBQABAKbOEiMgQWRkIGEgY29tcHV0ZSBwbGFuZSB0byBhbiBleGlzdGluZyBjb250cm9sIHBs" + - "YW5lCgpVc2VyIGhhcyBhIHdvcmtpbmcgTlZDRiBjb250cm9sIHBsYW5lIChydW5uaW5nIHNvbWV3" + - "aGVyZSkgYW5kIHdhbnRzIHRvIHJlZ2lzdGVyIGEgbmV3IEdQVSBjbHVzdGVyIGFnYWluc3QgaXQu" + - "IFRoaXMgaXMgdGhlIG11bHRpLWNsdXN0ZXIgc2NhbGluZyBwYXRoOiBvbmUgY29udHJvbCBwbGFu" + - "ZSDihpIgTiBjb21wdXRlIHBsYW5lcy4KCiMjIFByZXJlcXVpc2l0ZXMgdGhlIHVzZXIgbXVzdCBo" + - "YXZlCgotICoqa3ViZWN0bCBjb250ZXh0IGZvciB0aGUgbmV3IGNvbXB1dGUgcGxhbmUqKiBpbiB0" + - "aGVpciBgS1VCRUNPTkZJR2AuCi0gKipQdWJsaWMgSUNNUyBVUkwqKiBvZiB0aGUgZXhpc3Rpbmcg" + - "Y29udHJvbCBwbGFuZSAoZS5nLiBgaHR0cHM6Ly9pY21zLm52Y2YuZXhhbXBsZS5jb21gKS4KLSAq" + - "KkFkbWluIEpXVCoqIGZvciB0aGUgY29udHJvbCBwbGFuZSdzIGFjY291bnQsIE9SIGFiaWxpdHkg" + - "dG8gbWludCBvbmUgdmlhIGBudmNmLWNsaSBpbml0YCBhZ2FpbnN0IHRoZSBjb250cm9sIHBsYW5l" + - "J3MgcHVibGljIGFwaSBlbmRwb2ludC4gKEFkbWluIHRva2VucyBjb21lIGZyb20gdGhlIEFQSSBL" + - "ZXlzIHNlcnZpY2UgdmlhIHRoZSBwdWJsaWMgYXBpIGdhdGV3YXkg4oCUIGt1YmVjdGwgYWNjZXNz" + - "IHRvIHRoZSBjb250cm9sIHBsYW5lIGlzIE5PVCByZXF1aXJlZCB0byBvYnRhaW4gb25lLikKLSBB" + - "IHVuaXF1ZSBgLS1jbHVzdGVyLW5hbWVgIHRoYXQgZG9lc24ndCBjb2xsaWRlIHdpdGggYWxyZWFk" + - "eS1yZWdpc3RlcmVkIGNsdXN0ZXJzLiBVc2UgYG52Y2YtY2xpIGNsdXN0ZXIgbGlzdC1yZWdpc3Rl" + - "cmVkIC0tbmNhLWlkPSROQ0FfSUQgLS1pY21zLXVybD0kSUNNU2AgdG8gY2hlY2suCgojIyBTdGVw" + - "cwoKMS4gKipBc2sgZm9yIGlucHV0czoqKgogICAtIGAtLWNsdXN0ZXItbmFtZT08dW5pcXVlPmAg" + - "4oCUIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgY29udHJvbCBwbGFuZSdzIE5DQSBzY29wZQog" + - "ICAtIGAtLWNvbXB1dGUtcGxhbmUtY29udGV4dD08Y29udGV4dD5gIOKAlCB0aGUgbmV3IEdQVSBj" + - "bHVzdGVyJ3Mga3ViZWN0bCBjb250ZXh0CiAgIC0gYC0taWNtcy11cmw9PGh0dHBzOi8vaWNtcy5u" + - "dmNmLmV4YW1wbGUuY29tPmAg4oCUIGNvbnRyb2wgcGxhbmUncyBwdWJsaWMgSUNNUyBVUkwKICAg" + - "LSBHUFUgdHlwZT8gKGRlZmF1bHQgYEgxMDBgLCBidXQgYXNrKQoKMi4gKipQcmUtZmxpZ2h0IGp1" + - "c3QgdGhlIGNvbXB1dGUgcGxhbmU6KioKCiAgIGBgYHNoCiAgIG52Y2YtY2xpIHNlbGYtaG9zdGVk" + - "IGNoZWNrIC0tcHJlIFwKICAgICAtLWNvbXB1dGUtcGxhbmUtY29udGV4dD0kQ1RYIFwKICAgICAt" + - "LWljbXMtdXJsPSRJQ01TIFwKICAgICAtLWpzb24gfCBqcSAtYyAuCiAgIGBgYAoKICAgVGhpcyB2" + - "YWxpZGF0ZXMgdGhlIEdQVSBvcGVyYXRvciBpcyBpbnN0YWxsZWQsIEdQVSBub2RlIGxhYmVscyBh" + - "cmUgcHJlc2VudCwgYW5kIElDTVMgaXMgcmVhY2hhYmxlIHZpYSBIVFRQLiBBZGRyZXNzIGFueSBm" + - "YWlsdXJlcyBiZWZvcmUgcHJvY2VlZGluZy4KCjMuICoqUnVuIGBhZGQtY29tcHV0ZS1wbGFuZWA6" + - "KioKCiAgIGBgYHNoCiAgIG52Y2YtY2xpIHNlbGYtaG9zdGVkIGFkZC1jb21wdXRlLXBsYW5lIFwK" + - "ICAgICAtLWNsdXN0ZXItbmFtZT0kTkFNRSBcCiAgICAgLS1jb21wdXRlLXBsYW5lLWNvbnRleHQ9" + - "JENUWCBcCiAgICAgLS1pY21zLXVybD0kSUNNUyBcCiAgICAgLS10b2tlbj0kSldUIFwKICAgICAt" + - "LW5vbi1pbnRlcmFjdGl2ZSBcCiAgICAgLS1qc29uCiAgIGBgYAoKICAgVGhpcyBpcyBhIHNlcGFy" + - "YXRlIHN1YmNvbW1hbmQgZnJvbSBgdXBgLiBJdCBydW5zIG9ubHkgdGhlIGNvbXB1dGUtcGxhbmUt" + - "cmVsZXZhbnQgcGhhc2VzOiAxIChjb21wdXRlLXBsYW5lIHByZWZsaWdodCksIDUgKHJlZ2lzdGVy" + - "KSwgNiAoY29tcHV0ZS1wbGFuZSBhcHBseSksIDggKGZpbmFsIGhlYWx0aCBvbiB0aGUgbmV3IGNv" + - "bXB1dGUgcGxhbmUpLiBJdCBkb2VzIE5PVCB0b3VjaCB0aGUgY29udHJvbCBwbGFuZSBhbmQgZG9l" + - "cyBOT1QgYWNjZXB0IGAtLWNvbnRyb2wtcGxhbmUtY29udGV4dGAg4oCUIHRoZSBjb250cm9sIHBs" + - "YW5lIGlzIHJlYWNoZWQgb3ZlciBIVFRQUyBhdCBgLS1pY21zLXVybGAuIGAtLXRva2VuYCBpcyBy" + - "ZXF1aXJlZCBiZWNhdXNlIHRoZXJlJ3Mgbm8ga3ViZWN0bCBwYXRoIHRvIG1pbnQgb25lIGZyb20u" + - "Cgo0LiAqKlZlcmlmeS4qKiBgbnZjZi1jbGkgc2VsZi1ob3N0ZWQgc3RhdHVzIC0tY2x1c3Rlci1u" + - "YW1lPSROQU1FIC0tanNvbiB8IGpxYCDigJQgZXhwZWN0IGB2ZXJkaWN0OiAiaGVhbHRoeSJgLiBU" + - "aGUgUmVnaXN0ZXJlZCBDb21wdXRlIFBsYW5lcyBwYW5lbCBmcm9tIElDTVMgc2hvdWxkIG5vdyBs" + - "aXN0IHRoZSBuZXcgY2x1c3Rlci4KCjUuICoqU21va2UuKiogW2RlcGxveS1hbmQtaW52b2tlLm1k" + - "XShkZXBsb3ktYW5kLWludm9rZS5tZCkg4oCUIGRlcGxveSBhIHNtYWxsIGZ1bmN0aW9uIHRvIHRo" + - "ZSBuZXcgY29tcHV0ZSBwbGFuZSB0byBjb25maXJtIHNjaGVkdWxpbmcgd29ya3MuCgojIyBXaGF0" + - "IGlmIGEgY2x1c3RlciB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHM/CgpgYWRkLWNv" + - "bXB1dGUtcGxhbmVgJ3MgcmVnaXN0ZXIgcGhhc2UgdXNlcyBgLS1pZ25vcmUtZXhpc3RpbmdgIHNl" + - "bWFudGljcyDigJQgaXQnbGwgbWF0Y2ggdGhlIGV4aXN0aW5nIElDTVMgcm93IGFuZCByZXVzZSBp" + - "dHMgY2x1c3RlcklkLiBUd28gc2NlbmFyaW9zOgoKLSAqKlJlLXJlZ2lzdGVyaW5nIHRoZSBzYW1l" + - "IGNsdXN0ZXIqKiAocmUtcnVubmluZyBvbiB0aGUgc2FtZSBjb21wdXRlIHBsYW5lIHRoYXQgd2Fz" + - "IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCk6IGV4cGVjdGVkLCBuby1vcCBzZW1hbnRpY3MuCi0gKipE" + - "aWZmZXJlbnQgcGh5c2ljYWwgY2x1c3RlciBidXQgc2FtZSBuYW1lKio6IHRoZSBzZWNvbmQgYXR0" + - "ZW1wdCB3aWxsIHJldXNlIHRoZSBJQ01TIHJvdywgYnV0IHRoZSBuZXcgY29tcHV0ZSBwbGFuZSdz" + - "IEpXS1Mgd2lsbCBiZSBzaWxlbnRseSAqcmVwbGFjZWQqIOKAlCB0aGUgb2xkIGNvbXB1dGUgcGxh" + - "bmUncyBOVkNBIGFnZW50IHdpbGwgc3RhcnQgZmFpbGluZyBQU0FUIGF1dGguICoqQ29uZmlybSB3" + - "aXRoIHRoZSB1c2VyKiogdGhhdCB0aGV5IG1lYW50IHRvIG92ZXJ3cml0ZS4KCldoZW4gaW4gZG91" + - "YnQsIHJ1biBgbnZjZi1jbGkgY2x1c3RlciBsaXN0LXJlZ2lzdGVyZWQgLS1uY2EtaWQ9JE5DQV9J" + - "RCAtLWljbXMtdXJsPSRJQ01TYCBmaXJzdCBhbmQgYXNrIHRoZSB1c2VyIGJlZm9yZSBwcm9jZWVk" + - "aW5nIHdpdGggYSBuYW1lIHRoYXQgYWxyZWFkeSBleGlzdHMuClBLBwhCJ0kPBQ0AAAUNAABQSwME" + - "FAAIAAAAAAAhAAAAAAAAAAAAAAAAADkACQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9wcm9t" + - "cHRzL2NyZWF0ZS1hbmQtcnVuLXRhc2subWRVVAUAAQCmzhIjIENyZWF0ZSBhbmQgcnVuIGEgdGFz" + - "awoKU3RhbmRhcmQgZmxvdzogbWludCBBUEkga2V5cyAtPiB0YXNrIENSRUFURSAtPiBtb25pdG9y" + - "IC0+IHJldHJpZXZlIHJlc3VsdHMgLT4gY2xlYW51cC4KCiMjIDEuIE1pbnQgQVBJIGtleXMKClRo" + - "ZSBhZG1pbiB0b2tlbiBmcm9tIGBpbml0YCBkb2VzIG5vdCBjYXJyeSB0YXNrIGludm9jYXRpb24g" + - "c2NvcGUuIEdlbmVyYXRlIEFQSSBrZXlzOgoKYGBgc2gKbnZjZi1jbGkgYXBpLWtleSBnZW5lcmF0" + - "ZSAtLWRlc2NyaXB0aW9uPSJ0YXNrIHNtb2tlIHRlc3QiIC0tZXhwaXJlcy1pbj04aAojIC0+IGZ1" + - "bmN0aW9uIGtleTogbnZhcGktLi4uCiMgLT4gdGFzayBrZXk6IG52YXBpLS4uLgpgYGAKCkJvdGgg" + - "a2V5cyBhcmUgc2F2ZWQgdG8gQ0xJIHN0YXRlLiBUbyBtaW50IG9ubHkgdGhlIHRhc2sga2V5OgoK" + - "YGBgc2gKbnZjZi1jbGkgYXBpLWtleSBnZW5lcmF0ZSAtLWZvciB0YXNrIC0tZGVzY3JpcHRpb249" + - "InRhc2sgc21va2UgdGVzdCIgLS1leHBpcmVzLWluPThoCmBgYAoKVG8gdmFsaWRhdGUgZWFjaCBr" + - "ZXkgaW1tZWRpYXRlbHkgYWZ0ZXIgbWludGluZzoKCmBgYHNoCm52Y2YtY2xpIGFwaS1rZXkgZ2Vu" + - "ZXJhdGUgLS1kZXNjcmlwdGlvbj0idGFzayBzbW9rZSB0ZXN0IiAtLWV4cGlyZXMtaW49OGggLS12" + - "YWxpZGF0ZQojIC0+IGZ1bmN0aW9uIEFQSSBrZXkgdmFsaWRhdGlvbiBwYXNzZWQhCiMgLT4gdGFz" + - "ayBBUEkga2V5IHZhbGlkYXRpb24gcGFzc2VkIQpgYGAKCk5ldmVyIGVjaG8gdGhlIGtleSB2YWx1" + - "ZSAobnZhcGktLi4uKSBpbnRvIGNoYXQgb3IgbG9ncy4gUmVwb3J0IG9ubHkgdGhhdCB0aGUga2V5" + - "IHdhcyBtaW50ZWQsIGl0cyBkZXNjcmlwdGlvbiwgYW5kIGl0cyBleHBpcnkg4oCUIG5ldmVyIHRo" + - "ZSB2YWx1ZSBpdHNlbGYuCgojIyMgRnJlc2ggc2Vzc2lvbiBwcmUtZmxpZ2h0CgpCZWZvcmUgcnVu" + - "bmluZyBhbnkgYHRhc2tgIGNvbW1hbmQgaW4gYSBmcmVzaCBhZ2VudCBzZXNzaW9uLCB2ZXJpZnkg" + - "Y3JlZGVudGlhbHM6CgoxLiBDaGVjayB3aGV0aGVyIGBOVkNGX0FQSV9LRVlgIGlzIHNldDoKCiAg" + - "IGBgYHNoCiAgIHByaW50ZW52IE5WQ0ZfQVBJX0tFWSA+IC9kZXYvbnVsbCAyPiYxICYmIGVjaG8g" + - "c2V0IHx8IGVjaG8gdW5zZXQKICAgYGBgCgoyLiBJZiB1bnNldCwgcmVhZCB0aGUgc3RvcmVkIGtl" + - "eSBleHBpcnkgd2l0aG91dCBwcmludGluZyB0aGUgdmFsdWU6CgogICBgYGBzaAogICBweXRob24z" + - "IC1jICJpbXBvcnQganNvbixwYXRobGliOyBzPWpzb24ubG9hZHMocGF0aGxpYi5QYXRoKCd+Ly5u" + - "dmNmLWNsaS5zdGF0ZScpLmV4cGFuZHVzZXIoKS5yZWFkX3RleHQoKSk7IHByaW50KHMuZ2V0KCdu" + - "dmN0QXBpS2V5RXhwaXJhdGlvbicsJ21pc3NpbmcnKSkiCiAgIGBgYAoKMy4gSWYgdGhlIGV4cGly" + - "eSBpcyBpbiB0aGUgcGFzdCBvciBtaXNzaW5nLCByZWdlbmVyYXRlOgoKICAgYGBgc2gKICAgbnZj" + - "Zi1jbGkgcmVmcmVzaAogICBudmNmLWNsaSBhcGkta2V5IGdlbmVyYXRlIC0tZm9yIHRhc2sgLS1k" + - "ZXNjcmlwdGlvbj0idGFzay1rZXkiIC0tZXhwaXJlcy1pbj0yNGggLS12YWxpZGF0ZQogICBgYGAK" + - "CjQuIEluamVjdCB0aGUgc3RvcmVkIGtleSBpbnRvIHRoZSBzdWJwcm9jZXNzIGVudiB3aXRob3V0" + - "IGxvZ2dpbmcgdGhlIHZhbHVlLiBVc2UgYSBzaGVsbCBzdWJzaGVsbCBvciBlbnYgcHJlZml4IOKA" + - "lCBuZXZlciBwcmludCB0aGUga2V5IGludG8gY2hhdC4KCkVycm9yIGNsYXNzaWZpY2F0aW9uOgoK" + - "LSAibWlzc2luZyBhdXRoZW50aWNhdGlvbiBjcmVkZW50aWFscyIgb3IgZXhpdCAyOiBrZXkgbm90" + - "IGluamVjdGVkOyByZXBlYXQgcHJlLWZsaWdodC4KLSBIVFRQIDQwMzoga2V5IGV4cGlyZWQgb3Ig" + - "d3JvbmcgYXVkaWVuY2U7IHJlZ2VuZXJhdGUuCi0gRW1wdHkgdGFzayBsaXN0OiB2YWxpZDsgbm8g" + - "dGFza3MgZXhpc3QgeWV0LgoKIyMgMi4gVGFzayBDUkVBVEU6IGNvbnRhaW5lcgoKRGVmaW5lIHRo" + - "ZSB0YXNrIGluIGEgSlNPTiBmaWxlLiBNaW5pbXVtIHZpYWJsZSBjb250YWluZXIgdGFzazoKCmBg" + - "YGpzb24KewogICJuYW1lIjogInNtb2tlLWNvbnRhaW5lci10YXNrIiwKICAiZ3B1U3BlY2lmaWNh" + - "dGlvbiI6IHsKICAgICJncHUiOiAiSDEwMCIsCiAgICAiaW5zdGFuY2VUeXBlIjogIk5DUC5HUFUu" + - "SDEwMF8xeCIsCiAgICAiYmFja2VuZCI6ICJuY3AtbG9jYWwiCiAgfSwKICAiY29udGFpbmVySW1h" + - "Z2UiOiAibnZjci5pby9udmlkaWEvbmVtbzpsYXRlc3QiLAogICJjb250YWluZXJBcmdzIjogInB5" + - "dGhvbiAtYyBcInByaW50KCdoZWxsbyBmcm9tIHRhc2snKVwiIiwKICAicmVzdWx0SGFuZGxpbmdT" + - "dHJhdGVneSI6ICJOT05FIgp9CmBgYAoKYGBgc2gKbnZjZi1jbGkgdGFzayBjcmVhdGUgLS1pbnB1" + - "dC1maWxlPXRhc2stY29udGFpbmVyLmpzb24KIyAtPiBUYXNrIElEOiA8dGFza19pZD4KYGBgCgpD" + - "YXB0dXJlIHRoZSB0YXNrIElEIGZyb20gdGhlIG91dHB1dC4gU3RhdGUgcGVyc2lzdGVuY2UgY2Fu" + - "IGZhaWwgc2lsZW50bHksIHNvIHBhc3MKYDx0YXNrSWQ+YCBleHBsaWNpdGx5IG9uIHN1YnNlcXVl" + - "bnQgY29tbWFuZHMgcmF0aGVyIHRoYW4gcmVseWluZyBvbiBzYXZlZCBzdGF0ZS4KCkVxdWl2YWxl" + - "bnQgQ0xJIGZsYWdzIGZvcm0gZm9yIHF1aWNrIGFkLWhvYyBydW5zOgoKYGBgc2gKbnZjZi1jbGkg" + - "dGFzayBjcmVhdGUgXAogIC0tbmFtZT1zbW9rZS1jb250YWluZXItdGFzayBcCiAgLS1ncHU9SDEw" + - "MCBcCiAgLS1pbnN0YW5jZS10eXBlPU5DUC5HUFUuSDEwMF8xeCBcCiAgLS1iYWNrZW5kPW5jcC1s" + - "b2NhbCBcCiAgLS1pbWFnZT1udmNyLmlvL252aWRpYS9uZW1vOmxhdGVzdCBcCiAgLS1jb250YWlu" + - "ZXItYXJncz0icHl0aG9uIC1jICdwcmludChoZWxsbyBmcm9tIHRhc2spJyIgXAogIC0tcmVzdWx0" + - "LXN0cmF0ZWd5PU5PTkUKYGBgCgpUbyB0YXJnZXQgYSBzcGVjaWZpYyBjb21wdXRlIGNsdXN0ZXI6" + - "CgpgYGBzaApudmNmLWNsaSB0YXNrIGNyZWF0ZSAtLWlucHV0LWZpbGU9dGFzay1jb250YWluZXIu" + - "anNvbiAtLWNsdXN0ZXJzPW15LWNsdXN0ZXIKYGBgCgpUbyBpbmplY3QgZW52aXJvbm1lbnQgdmFy" + - "aWFibGVzIG9yIHNlY3JldHMsIGVpdGhlciBwYXNzIGZsYWdzOgoKYGBgc2gKbnZjZi1jbGkgdGFz" + - "ayBjcmVhdGUgLS1pbnB1dC1maWxlPXRhc2stY29udGFpbmVyLmpzb24gXAogIC0tY29udGFpbmVy" + - "LWVudiBNWV9FTlY9dmFsdWUgXAogIC0tc2VjcmV0cyBNWV9TRUNSRVQ9czNjcjN0CmBgYAoKb3Ig" + - "c2V0IHRoZW0gaW4gdGhlIEpTT04gZmlsZToKCmBgYGpzb24KewogICJjb250YWluZXJFbnZpcm9u" + - "bWVudCI6IFsKICAgIHsia2V5IjogIk1ZX0VOViIsICJ2YWx1ZSI6ICJ2YWx1ZSJ9CiAgXSwKICAi" + - "c2VjcmV0cyI6IFsKICAgIHsibmFtZSI6ICJNWV9TRUNSRVQiLCAidmFsdWUiOiAiczNjcjN0In0K" + - "ICBdCn0KYGBgCgpTZWNyZXRzIGFyZSBlbmNyeXB0ZWQgYXQgcmVzdCBhbmQgbm90IHJldHVybmVk" + - "IGluIGxpc3Qgb3IgZ2V0IHJlc3BvbnNlcyBieSBkZWZhdWx0OyBkbyBub3QgbG9nIHRoZW0uCgoj" + - "IyAzLiBUYXNrIENSRUFURTogSGVsbQoKRm9yIEhlbG0tdHlwZSB0YXNrcywgcmVwbGFjZSBgY29u" + - "dGFpbmVySW1hZ2VgIHdpdGggYGhlbG1DaGFydGA6CgpgYGBqc29uCnsKICAibmFtZSI6ICJzbW9r" + - "ZS1oZWxtLXRhc2siLAogICJncHVTcGVjaWZpY2F0aW9uIjogewogICAgImdwdSI6ICJIMTAwIiwK" + - "ICAgICJpbnN0YW5jZVR5cGUiOiAiTkNQLkdQVS5IMTAwXzF4IiwKICAgICJiYWNrZW5kIjogIm5j" + - "cC1sb2NhbCIKICB9LAogICJoZWxtQ2hhcnQiOiAiaHR0cHM6Ly9oZWxtLm5nYy5udmlkaWEuY29t" + - "Lzxvcmc+L2NoYXJ0cy9leGFtcGxlLXRhc2stMC4xLjAudGd6IiwKICAicmVzdWx0SGFuZGxpbmdT" + - "dHJhdGVneSI6ICJOT05FIgp9CmBgYAoKYGBgc2gKbnZjZi1jbGkgdGFzayBjcmVhdGUgLS1pbnB1" + - "dC1maWxlPXRhc2staGVsbS5qc29uCiMgLT4gVGFzayBJRDogPHRhc2tfaWQ+CmBgYAoKYGhlbG1D" + - "aGFydGAgYW5kIGBjb250YWluZXJJbWFnZWAgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4KCiMjIDNi" + - "LiBVcGRhdGUgc2VjcmV0cyBvbiBhIHJ1bm5pbmcgdGFzawoKYGBgc2gKbnZjZi1jbGkgdGFzayB1" + - "cGRhdGUtc2VjcmV0cyA8dGFza19pZD4gLS1zZWNyZXRzIE5BTUU9dmFsdWUKYGBgCgpgdXBkYXRl" + - "LXNlY3JldHNgIG1lcmdlcyBzZWNyZXRzIGJ5IG5hbWU6IHN1cHBsaWVkIHNlY3JldHMgYXJlIGFk" + - "ZGVkIG9yIHVwZGF0ZWQsIGFuZCBleGlzdGluZyBzZWNyZXRzIG5vdCBpbmNsdWRlZCBpbiB0aGUg" + - "cmVxdWVzdCBhcmUgcHJlc2VydmVkLiBEbyBub3QgZWNobyBzZWNyZXQgdmFsdWVzIGludG8gY2hh" + - "dC4KCiMjIDQuIE1vbml0b3IKClBvbGwgdGFzayBzdGF0ZToKCmBgYHNoCm52Y2YtY2xpIHRhc2sg" + - "Z2V0IDx0YXNrX2lkPgojIC0+IGlkOiA8dGFza19pZD4KIyAtPiBzdGF0dXM6IFJVTk5JTkcKYGBg" + - "CgpPciB1c2UgdGhlIHRhc2sgSUQgc2F2ZWQgdG8gc3RhdGUgZnJvbSB0aGUgbW9zdCByZWNlbnQg" + - "YHRhc2sgY3JlYXRlYDoKCmBgYHNoCm52Y2YtY2xpIHRhc2sgZ2V0CmBgYAoKU3RhdHVzIHZhbHVl" + - "czogYFFVRVVFRGAsIGBMQVVOQ0hFRGAsIGBSVU5OSU5HYCwgYENPTVBMRVRFRGAsIGBFUlJPUkVE" + - "YCwgYENBTkNFTEVEYCwgYEVYQ0VFREVEX01BWF9SVU5USU1FX0RVUkFUSU9OYCwgYEVYQ0VFREVE" + - "X01BWF9RVUVVRURfRFVSQVRJT05gLgoKSW5zcGVjdCBsaWZlY3ljbGUgZXZlbnRzIGZvciBwcm9n" + - "cmVzcyBkZXRhaWxzIG9yIGZhaWx1cmUgY29udGV4dDoKCmBgYHNoCm52Y2YtY2xpIHRhc2sgZXZl" + - "bnRzIDx0YXNrX2lkPgpgYGAKCklmIHRoZSB0YXNrIGlzIHN0dWNrIGluIGBRVUVVRURgLCBjaGVj" + - "ayB0aGF0IGEgY29tcHV0ZSBjbHVzdGVyIHdpdGggYSBtYXRjaGluZyBHUFUgU0tVCmlzIHJlZ2lz" + - "dGVyZWQgYW5kIGhlYWx0aHkgKGBudmNmLWNsaSBzZWxmLWhvc3RlZCBzdGF0dXNgKS4KCklmIHRo" + - "ZSB0YXNrIG1vdmVzIHRvIGBFUlJPUkVEYCwgdGhlIGV2ZW50cyBvdXRwdXQgY29udGFpbnMgdGhl" + - "IGZhaWx1cmUgcmVhc29uLiBGb3IKY29udGFpbmVyLWxldmVsIGRldGFpbCwgaW5zcGVjdCB0aGUg" + - "dGFzayB3b3JrbG9hZCBwb2RzIG9uIHRoZSBjb21wdXRlLXBsYW5lIGNsdXN0ZXIgd2l0aApga3Vi" + - "ZWN0bGAgYWdhaW5zdCB0aGUgYXBwcm9wcmlhdGUgbmFtZXNwYWNlIGFuZCBjb250ZXh0LgoKIyMg" + - "NS4gUmV0cmlldmUgcmVzdWx0cwoKRm9yIHRhc2tzIHdpdGggYHJlc3VsdEhhbmRsaW5nU3RyYXRl" + - "Z3k6IE5PTkVgLCByZXN1bHRzIGFyZSBlbXB0eSBieSBkZXNpZ246CgpgYGBzaApudmNmLWNsaSB0" + - "YXNrIHJlc3VsdHMgPHRhc2tfaWQ+CiMgLT4geyJyZXN1bHRzIjogW119CmBgYAoKRm9yIHRhc2tz" + - "IHdpdGggYHJlc3VsdEhhbmRsaW5nU3RyYXRlZ3k6IFVQTE9BRGAsIHJlc3VsdHMgdXBsb2FkIHRv" + - "IHRoZSBsb2NhdGlvbiBuYW1lZCBpbgpgcmVzdWx0c0xvY2F0aW9uYC4gVGhlIHRhc2sncyBjcmVk" + - "ZW50aWFscyBtdXN0IGhhdmUgd3JpdGUgYWNjZXNzIHRvIHRoYXQgbG9jYXRpb24uIEFmdGVyCnRo" + - "ZSB0YXNrIHJlYWNoZXMgYENPTVBMRVRFRGA6CgpgYGBzaApudmNmLWNsaSB0YXNrIHJlc3VsdHMg" + - "PHRhc2tfaWQ+CmBgYAoKTm90ZTogcmVzdWx0IHVwbG9hZCBpcyBub3QgeWV0IHN1cHBvcnRlZCBp" + - "biB0aGlzIHJlbGVhc2UuCgojIyA2LiBDbGVhbnVwCgpDYW5jZWwgYSBydW5uaW5nIHRhc2s6Cgpg" + - "YGBzaApudmNmLWNsaSB0YXNrIGNhbmNlbCA8dGFza19pZD4KYGBgCgpEZWxldGUgdGhlIHRhc2sg" + - "cmVjb3JkIGFmdGVyIGl0IHJlYWNoZXMgYSB0ZXJtaW5hbCBzdGF0ZToKCmBgYHNoCm52Y2YtY2xp" + - "IHRhc2sgZGVsZXRlIDx0YXNrX2lkPgpgYGAKClN0b3AgYW5kIGNvbmZpcm0gd2l0aCB0aGUgdXNl" + - "ciBiZWZvcmUgcnVubmluZyB0YXNrIGRlbGV0ZS4gU3RhdGUgdGhlIHRhc2sgSUQgYW5kIGl0cyBj" + - "dXJyZW50IHN0YXR1cy4gRG8gbm90IHByb2NlZWQgZXZlbiB3aGVuIHRoZSB1c2VyJ3MgcHJvbXB0" + - "IGFscmVhZHkgcmVxdWVzdGVkIGRlbGV0aW9uIOKAlCBhbHdheXMgZ2V0IGFuIGV4cGxpY2l0IGxh" + - "c3QtbG9vayBjb25maXJtYXRpb24uIERlbGV0aW9uIGlzIHBlcm1hbmVudCBhbmQgY2Fubm90IGJl" + - "IHVuZG9uZS4KClRvIGxpc3QgYWxsIHRhc2tzIGZvciB0aGUgY3VycmVudCBvd25lciAodXNlZnVs" + - "IGJlZm9yZSBidWxrIGNsZWFudXApOgoKYGBgc2gKbnZjZi1jbGkgdGFzayBsaXN0Cm52Y2YtY2xp" + - "IHRhc2sgbGlzdCAtLXN0YXR1cz1DT01QTEVURUQKYGBgCgojIyBOb3RlcwoKLSBHUFUgZmFtaWx5" + - "IGFuZCBpbnN0YW5jZSB0eXBlIG11c3QgbWF0Y2ggYSByZWdpc3RlcmVkIGNvbXB1dGUgY2x1c3Rl" + - "ciBTS1UuIE1pc21hdGNoCiAgY2F1c2VzIHRoZSB0YXNrIHRvIHJlbWFpbiBgUVVFVUVEYCBpbmRl" + - "ZmluaXRlbHkuIFVzZSBgbnZjZi1jbGkgY2x1c3RlciBsaXN0YCB0byBjaGVjawogIHJlZ2lzdGVy" + - "ZWQgU0tVcy4KLSBGb3IgY29udGFpbmVyIGltYWdlcyBvbiBwcml2YXRlIHJlZ2lzdHJpZXMsIGVu" + - "c3VyZSB0aGUgY29tcHV0ZS1wbGFuZSBjbHVzdGVyJ3MKICBpbWFnZS1jcmVkZW50aWFsLWhlbHBl" + - "ciBpcyBjb25maWd1cmVkIGZvciB0aGUgcmVnaXN0cnkgaG9zdC4KUEsHCNTejTSfGQAAnxkAAFBL" + - "AwQUAAgAAAAAACEAAAAAAAAAAAAAAAAANwAJAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL3By" + - "b21wdHMvZGVwbG95LWFuZC1pbnZva2UubWRVVAUAAQCmzhIjIERlcGxveSBhbmQgaW52b2tlIGEg" + - "Y29udGFpbmVyIGZ1bmN0aW9uCgpTdGFuZGFyZCBmb3VyLXN0ZXAgZmxvdzogZnVuY3Rpb24gQ1JF" + - "QVRFIOKGkiBERVBMT1kg4oaSIEFQSSBrZXkgKGZvciBpbnZva2Ugc2NvcGUpIOKGkiBJTlZPS0Uu" + - "CgojIyAxLiBGdW5jdGlvbiBDUkVBVEUKCkRlZmluZSB0aGUgZnVuY3Rpb24gaW4gYSBKU09OIGZp" + - "bGUuIE1pbmltdW06CgpCZWZvcmUgY3JlYXRpbmcgdGhlIGZ1bmN0aW9uLCBjb25maXJtIHRoZSBl" + - "eGFjdCBmdW5jdGlvbiBuYW1lIGFuZCBjb250YWluZXIgaW1hZ2Ugd2l0aCB0aGUgdXNlci4gSWYg" + - "ZWl0aGVyIHZhbHVlIGlzIG1pc3NpbmcsIHN0b3AgYW5kIGFzay4gRG8gbm90IGludmVudCBvciBz" + - "dWJtaXQgZXhhbXBsZSB2YWx1ZXMgZm9yIHRoZXNlIGZpZWxkcy4KCmBgYGpzb24KewogICJuYW1l" + - "IjogIjxjb25maXJtZWQtZnVuY3Rpb24tbmFtZT4iLAogICJjb250YWluZXJJbWFnZSI6ICI8Y29u" + - "ZmlybWVkLWNvbnRhaW5lci1pbWFnZT4iLAogICJpbmZlcmVuY2VVcmwiOiAiL2VjaG8iLAogICJp" + - "bmZlcmVuY2VQb3J0IjogODAwMCwKICAiZGVzY3JpcHRpb24iOiAic21va2UgdGVzdCBlY2hvIGZ1" + - "bmN0aW9uIiwKICAiZnVuY3Rpb25UeXBlIjogIkRFRkFVTFQiLAogICJhcGlCb2R5Rm9ybWF0Ijog" + - "IkNVU1RPTSIsCiAgImhlYWx0aCI6IHsKICAgICJwcm90b2NvbCI6ICJIVFRQIiwKICAgICJ1cmki" + - "OiAiL2hlYWx0aCIsCiAgICAicG9ydCI6IDgwMDAsCiAgICAidGltZW91dCI6ICJQVDMwUyIsCiAg" + - "ICAiZXhwZWN0ZWRTdGF0dXNDb2RlIjogMjAwCiAgfQp9CmBgYAoKYGBgc2gKbnZjZi1jbGkgZnVu" + - "Y3Rpb24gY3JlYXRlIC0taW5wdXQtZmlsZT1jcmVhdGUtZm4uanNvbgojIOKGkiBGdW5jdGlvbiBJ" + - "RDogPGZuX2lkPgojIOKGkiBWZXJzaW9uIElEOiA8dmVyX2lkPgpgYGAKClNhdmUgdGhlIElEcyDi" + - "gJQgdGhleSdyZSBuZWVkZWQgZm9yIGRlcGxveSArIGludm9rZS4KCiMjIyBMTE0gZnVuY3Rpb24g" + - "dmFyaWFudAoKRm9yIGFuIE9wZW5BSS1jb21wYXRpYmxlIExMTSBmdW5jdGlvbiwgc2V0IGBmdW5j" + - "dGlvblR5cGU6ICJMTE0iYCBhbmQgcHV0IHJvdXRlIG1ldGFkYXRhIHVuZGVyIGBtb2RlbHNbXS5s" + - "bG1Db25maWdgOgoKQmVmb3JlIGNyZWF0aW5nIHRoZSBmdW5jdGlvbiwgY29uZmlybSB0aGUgZXhh" + - "Y3QgZnVuY3Rpb24gbmFtZSwgY29udGFpbmVyIGltYWdlLCBhbmQgbW9kZWwgbmFtZSB3aXRoIHRo" + - "ZSB1c2VyLiBJZiBhbnkgdmFsdWUgaXMgbWlzc2luZywgc3RvcCBhbmQgYXNrLiBEbyBub3QgaW52" + + "ZCBjaGVjayAtLXByZSAtLWpzb24gMj4mMSA+L2Rldi9udWxsIHwgZ3JlcCAnXnsnIHwganEgLWUg" + + "Jy5ldmVudCAhPSAicGhhc2VfZmFpbGVkIicgfHwgZXhpdCAyCiAgICAtIG52Y2YtY2xpIHNlbGYt" + + "aG9zdGVkIHVwIC0tY2x1c3Rlci1uYW1lPSRDTFVTVEVSX05BTUUgLS10b2tlbj0kTlZDRl9BRE1J" + + "Tl9KV1QgLS1ub24taW50ZXJhY3RpdmUgLS1qc29uCiAgICAtIG52Y2YtY2xpIHNlbGYtaG9zdGVk" + + "IHN0YXR1cyAtLWpzb24gMj4mMSA+L2Rldi9udWxsIHwgZ3JlcCAnXnsnIHwganEgLWUgJy52ZXJk" + + "aWN0ID09ICJoZWFsdGh5IicKYGBgCgpOb3RlczoKCi0gYC0tbm9uLWludGVyYWN0aXZlIC0tdG9r" + + "ZW49JEpXVGAgaXMgcmVxdWlyZWQgaW4gQ0k7IG5ldmVyIHVzZSBpbnRlcmFjdGl2ZSBgaW5pdGAu" + + "Ci0gQWx3YXlzIGAtLWpzb25gIGZvciBtYWNoaW5lLXBhcnNpbmcuCi0gYC0tanNvbmAgd3JpdGVz" + + "IEpTT05MIHRvIHN0ZGVyciwgbm90IHN0ZG91dCwgc28gcmVkaXJlY3Qgd2l0aCBgMj4mMSA+L2Rl" + + "di9udWxsYCBiZWZvcmUgYSBwYXJzZXIuCi0gc3RkZXJyIGFsc28gY2FycmllcyBwbGFpbi10ZXh0" + + "IG5vdGljZXMsIHNvIGZpbHRlciB0byBKU09OIGxpbmVzLiBEbyBub3QgYWRkIGAtLXNob3ctbG9n" + + "c2AgaGVyZTogaXQgYXBwZW5kcyBhIG5vbi1KU09OIHRyYW5zY3JpcHQgdG8gdGhlIHNhbWUgc3Ry" + + "ZWFtLgotIEZpbmFsIHN0YXR1cyBjaGVjayBnYXRlcyBkb3duc3RyZWFtIHN0YWdlcyBvbiBgdmVy" + + "ZGljdCA9PSAiaGVhbHRoeSJgLgoKIyMgR2l0T3BzIChBcmdvIC8gRmx1eCkgcGF0dGVybgoKQ0kg" + + "ZG9lc24ndCBga3ViZWN0bCBhcHBseWAg4oCUIGluc3RlYWQsIHJlbmRlciBtYW5pZmVzdHMsIGNv" + + "bW1pdCB0aGVtLCBsZXQgdGhlIGNvbnRyb2xsZXIgYXBwbHkuCgpgYGB5YW1sCnJlbmRlcjoKICBz" + + "Y3JpcHQ6CiAgICAtIG52Y2YtY2xpIHNlbGYtaG9zdGVkIGluc3RhbGwgLS1jb250cm9sLXBsYW5l" + + "IC0tbm8tYXBwbHkgPiByZW5kZXJlZC9jb250cm9sLXBsYW5lLnlhbWwKICAgIC0gbnZjZi1jbGkg" + + "c2VsZi1ob3N0ZWQgaW5zdGFsbCAtLWNvbXB1dGUtcGxhbmUgLS1jbHVzdGVyLW5hbWU9JE5BTUUg" + + "LS1uby1hcHBseSA+IHJlbmRlcmVkL2NvbXB1dGUtcGxhbmUueWFtbAogICAgLSBnaXQgYWRkIHJl" + + "bmRlcmVkLyAmJiBnaXQgY29tbWl0IC1tICJkZXBsb3kgTlZDRiAkVEFHIiAmJiBnaXQgcHVzaApg" + + "YGAKClRoZW4gQXJnb0NEIG9yIEZsdXggd2F0Y2hlcyBgcmVuZGVyZWQvYCBhbmQgYXBwbGllcy4g" + + "VGhlIENMSSBuZXZlciB0b3VjaGVzIHRoZSBjbHVzdGVyIGRpcmVjdGx5LgoKRm9yIHRoZSByZWdp" + + "c3RlciBzdGVwICh3aGljaCBtdXRhdGVzIElDTVMsIG5vdCBqdXN0IEs4cyk6CgpgYGB5YW1sCnJl" + + "Z2lzdGVyOgogIHNjcmlwdDoKICAgIC0gbnZjZi1jbGkgY2x1c3RlciByZWdpc3RlciAtLW5hbWU9" + + "JE5BTUUgLS1uY2EtaWQ9JE5DQSAtLXJlZ2lvbj0kUkVHSU9OIC0taWdub3JlLWV4aXN0aW5nCmBg" + + "YAoKYC0taWdub3JlLWV4aXN0aW5nYCBpcyB0aGUgR2l0T3BzLWZyaWVuZGx5IGlkZW1wb3RlbnQg" + + "Y29udHJhY3QuCgojIyBNdWx0aS1jbHVzdGVyIHBpcGVsaW5lCgpXaGVuIHRoZSBwaXBlbGluZSBt" + + "YW5hZ2VzIG1hbnkgY29tcHV0ZSBjbHVzdGVycyBhZ2FpbnN0IG9uZSBjb250cm9sIHBsYW5lOgoK" + + "YGBgeWFtbApkZXBsb3lfY29tcHV0ZV9wbGFuZXM6CiAgcGFyYWxsZWw6CiAgICBtYXRyaXg6CiAg" + + "ICAgIC0gQ0xVU1RFUjogbmNwLWVhc3QtMQogICAgICAgIENPTlRFWFQ6IGFkbWluQGdwdS1lYXN0" + + "LTEKICAgICAgLSBDTFVTVEVSOiBuY3Atd2VzdC0xCiAgICAgICAgQ09OVEVYVDogYWRtaW5AZ3B1" + + "LXdlc3QtMQogICAgICAtIENMVVNURVI6IG5jcC1ldS0xCiAgICAgICAgQ09OVEVYVDogYWRtaW5A" + + "Z3B1LWV1LTEKICBzY3JpcHQ6CiAgICAtIG52Y2YtY2xpIHNlbGYtaG9zdGVkIHVwCiAgICAgICAg" + + "LS1jbHVzdGVyLW5hbWU9JENMVVNURVIKICAgICAgICAtLWNvbXB1dGUtcGxhbmUtY29udGV4dD0k" + + "Q09OVEVYVAogICAgICAgIC0taWNtcy11cmw9JElDTVNfUFVCTElDX1VSTAogICAgICAgIC0tdG9r" + + "ZW49JE5WQ0ZfQURNSU5fSldUCiAgICAgICAgLS1ub24taW50ZXJhY3RpdmUKICAgICAgICAtLWpz" + + "b24KYGBgCgpFYWNoIHBhcmFsbGVsIGpvYiByZWdpc3RlcnMgKyBpbnN0YWxscyBvbmUgY29tcHV0" + + "ZSBwbGFuZSBhZ2FpbnN0IHRoZSBzaGFyZWQgY29udHJvbCBwbGFuZS4gRmFpbHVyZXMgYXJlIGlz" + + "b2xhdGVkLgoKIyMgUGxhbi1vbmx5IHByZXZpZXcgaW4gUFJzCgpgYGB5YW1sCnByZXZpZXc6CiAg" + + "cnVsZXM6CiAgICAtIGlmOiAkQ0lfUElQRUxJTkVfU09VUkNFID09ICJtZXJnZV9yZXF1ZXN0X2V2" + + "ZW50IgogIHNjcmlwdDoKICAgIC0gfAogICAgICBudmNmLWNsaSBzZWxmLWhvc3RlZCB1cCBcCiAg" + + "ICAgICAgLS1jbHVzdGVyLW5hbWU9JENMVVNURVJfTkFNRSBcCiAgICAgICAgLS1wbGFuLW9ubHkg" + + "XAogICAgICAgIC0tanNvbiB8IHRlZSBwbGFuLmpzb25sCiAgICAtIGpxIC1zICcuWzBdJyBwbGFu" + + "Lmpzb25sID4gcGxhbi5qc29uCiAgICAtICdnaXRsYWItbXItY29tbWVudCAiIyMgTlZDRiBkZXBs" + + "b3kgcGxhblxuXG5cYFxgXGBqc29uXG4kKGNhdCBwbGFuLmpzb24pXG5cYFxgXGAiJwpgYGAKCmAt" + + "LXBsYW4tb25seWAgZXhpdHMgMCB3aXRob3V0IGNoYW5naW5nIGNsdXN0ZXIgc3RhdGU7IHRoZSBK" + + "U09OTCBvdXRwdXQgbGlzdHMgZWFjaCBwaGFzZSArIEVUQS4gUmVuZGVycyBuaWNlbHkgYXMgYW4g" + + "TVIgY29tbWVudC4KUEsHCG3jewUjDAAAIwwAAFBLAwQUAAgAAAAAACEAAAAAAAAAAAAAAAAANAAJ" + + "AGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL2V4YW1wbGVzL211bHRpLWNsdXN0ZXIubWRVVAUA" + + "AQCmzhIjIE11bHRpLWNsdXN0ZXIgcGF0dGVybnMKCkV4YW1wbGVzIG9mIHNwbGl0LWNsdXN0ZXIg" + + "KyBtYW55LWNvbXB1dGUtcGxhbmUgb3BlcmF0aW9uLgoKIyMgT25lIGNvbnRyb2wgcGxhbmUgKyBO" + + "IGNvbXB1dGUgcGxhbmVzCgpUaGUgY2Fub25pY2FsIG11bHRpLWNsdXN0ZXIgdG9wb2xvZ3kuIEVh" + + "Y2ggY29tcHV0ZSBwbGFuZSBpcyByZWdpc3RlcmVkIHNlcGFyYXRlbHk6CgpgYGBzaAojIDEuIEJy" + + "aW5nIHVwIHRoZSBjb250cm9sIHBsYW5lIChvbmUtdGltZSwgb24gdGhlIGNvbnRyb2wtcGxhbmUg" + + "Y2x1c3Rlcik6CktVQkVDT05GSUc9Y3AueWFtbCBudmNmLWNsaSBzZWxmLWhvc3RlZCBpbnN0YWxs" + + "IC0tY29udHJvbC1wbGFuZSB8IGt1YmVjdGwgYXBwbHkgLWYgLQpudmNmLWNsaSBzZWxmLWhvc3Rl" + + "ZCBjaGVjayAtLWNvbnRyb2wtcGxhbmUgLS13YWl0IDVtCgojIDIuIFJlZ2lzdGVyICsgaW5zdGFs" + + "bCBlYWNoIGNvbXB1dGUgcGxhbmU6CmZvciBDVFggaW4gYWRtaW5AZ3B1LWVhc3QtMSBhZG1pbkBn" + + "cHUtd2VzdC0xIGFkbWluQGdwdS1ldS0xOyBkbwogIE5BTUU9JChlY2hvICIkQ1RYIiB8IGN1dCAt" + + "ZEAgLWYyKQogIG52Y2YtY2xpIHNlbGYtaG9zdGVkIHVwIFwKICAgIC0tY2x1c3Rlci1uYW1lPSRO" + + "QU1FIFwKICAgIC0tY29tcHV0ZS1wbGFuZS1jb250ZXh0PSRDVFggXAogICAgLS1pY21zLXVybD1o" + + "dHRwczovL2ljbXMubnZjZi5leGFtcGxlLmNvbSBcCiAgICAtLXRva2VuPSROVkNGX0FETUlOX0pX" + + "VCBcCiAgICAtLW5vbi1pbnRlcmFjdGl2ZSBcCiAgICAtLWpzb24KZG9uZQoKIyAzLiBWZXJpZnkg" + + "YWxsIGNvbXB1dGUgcGxhbmVzIHJlZ2lzdGVyZWQ6Cm52Y2YtY2xpIGNsdXN0ZXIgbGlzdC1yZWdp" + + "c3RlcmVkIC0tbmNhLWlkPSROQ0FfSUQgLS1pY21zLXVybD0kSUNNUyAtLWpzb24gXAogIHwganEg" + + "Jy5jbHVzdGVyc1tdIHwge25hbWU6IC5jbHVzdGVyTmFtZSwgc3RhdHVzLCBudmNhVmVyc2lvbn0n" + + "CmBgYAoKIyMgQ29tcHV0ZS1wbGFuZS1vbmx5IG9wZXJhdG9yIHNjZW5hcmlvCgpUaGUgb3BlcmF0" + + "b3IgaGFzIGt1YmVjdGwgYWNjZXNzIHRvIE9ORSBjb21wdXRlIHBsYW5lIG9ubHkg4oCUIHRoZSBj" + + "b250cm9sIHBsYW5lIGlzIG9wZXJhdGVkIGJ5IHNvbWVvbmUgZWxzZSAoZS5nLiBZb3R0YSBydW5z" + + "IHRoZSBjb250cm9sIHBsYW5lIGZvciBhIGN1c3RvbWVyKS4KCmBgYHNoCiMgTWludCBhIHRva2Vu" + + "IHZpYSB0aGUgcHVibGljIGFwaSBnYXRld2F5ICh0aGUgY29udHJvbCBwbGFuZSdzIEFQSSBLZXlz" + + "CiMgc2VydmljZSBpcyByZWFjaGFibGUgdmlhIGFwaS5udmNmLmV4YW1wbGUuY29tIOKAlCBubyBr" + + "dWJlY3RsIGFjY2VzcyBuZWVkZWQpOgpudmNmLWNsaSBpbml0IC0tYXBpLXVybD1odHRwczovL2Fw" + + "aS5udmNmLmV4YW1wbGUuY29tCgojIFJ1biBwcmUtZmxpZ2h0IHNjb3BlZCB0byB0aGUgY29tcHV0" + + "ZSBwbGFuZSBvbmx5OgpudmNmLWNsaSBzZWxmLWhvc3RlZCBjaGVjayAtLXByZSBcCiAgLS1jb21w" + + "dXRlLXBsYW5lLWNvbnRleHQ9YWRtaW5AZ3B1MSBcCiAgLS1pY21zLXVybD1odHRwczovL2ljbXMu" + + "bnZjZi5leGFtcGxlLmNvbSBcCiAgLS1qc29uCgojIEJyaW5nIHVwIGp1c3QgdGhlIGNvbXB1dGUg" + + "cGxhbmU6Cm52Y2YtY2xpIHNlbGYtaG9zdGVkIHVwIFwKICAtLWNsdXN0ZXItbmFtZT1teS1jb21w" + + "dXRlLTEgXAogIC0tY29tcHV0ZS1wbGFuZS1jb250ZXh0PWFkbWluQGdwdTEgXAogIC0taWNtcy11" + + "cmw9aHR0cHM6Ly9pY21zLm52Y2YuZXhhbXBsZS5jb20gXAogIC0tdG9rZW49JEFETUlOX0pXVCBc" + + "CiAgLS1ub24taW50ZXJhY3RpdmUKCiMgU3RhdHVzIChjb21wdXRlLW9ubHkg4oCUIG9wZXJhdG9y" + + "IGNhbid0IHNlZSBjb250cm9sLXBsYW5lIGNvbXBvbmVudCBoZWFsdGgpOgpudmNmLWNsaSBzZWxm" + + "LWhvc3RlZCBzdGF0dXMgXAogIC0tY29tcHV0ZS1wbGFuZS1jb250ZXh0PWFkbWluQGdwdTEgXAog" + + "IC0taWNtcy11cmw9aHR0cHM6Ly9pY21zLm52Y2YuZXhhbXBsZS5jb20KYGBgCgojIyBGdW5jdGlv" + + "bnMgdGFyZ2V0aW5nIHNwZWNpZmljIGNvbXB1dGUgcGxhbmVzCgpXaGVuIHlvdSBoYXZlIG11bHRp" + + "cGxlIGNvbXB1dGUgcGxhbmVzIGFuZCB3YW50IGEgZnVuY3Rpb24gdG8gZGVwbG95IHRvIG9uZToK" + + "CmBgYGpzb24KewogICJmdW5jdGlvbklkIjogIjxmbl9pZD4iLAogICJ2ZXJzaW9uSWQiOiAiPHZl" + + "cl9pZD4iLAogICJkZXBsb3ltZW50U3BlY2lmaWNhdGlvbnMiOiBbewogICAgImdwdSI6ICJIMTAw" + + "IiwKICAgICJpbnN0YW5jZVR5cGUiOiAiTkNQLkdQVS5IMTAwXzF4IiwKICAgICJtaW5JbnN0YW5j" + + "ZXMiOiAxLAogICAgIm1heEluc3RhbmNlcyI6IDEsCiAgICAiY2x1c3RlcnMiOiBbImdwdS1lYXN0" + + "LTEiXQogIH1dCn0KYGBgCgpUaGUgYGNsdXN0ZXJzYCBhcnJheSAodXNpbmcgY2x1c3RlciBuYW1l" + + "cywgbm90IElEcykgbGltaXRzIHNjaGVkdWxpbmcgdG8gdGhvc2UgY29tcHV0ZSBwbGFuZXMuIE9t" + + "aXQgdG8gbGV0IElDTVMgY2hvb3NlIGFueSBjb21wdXRlIHBsYW5lIHdpdGggYSBtYXRjaGluZyBT" + + "S1UuCgojIyBTdGF0dXMgZmFuLW91dCBhY3Jvc3MgY29tcHV0ZSBwbGFuZXMKCmBgYHNoCiMgTGlz" + + "dCBhbGwgcmVnaXN0ZXJlZCBjb21wdXRlIHBsYW5lczoKbnZjZi1jbGkgY2x1c3RlciBsaXN0LXJl" + + "Z2lzdGVyZWQgLS1uY2EtaWQ9JE5DQV9JRCAtLWljbXMtdXJsPSRJQ01TIC0tanNvbiBcCiAgfCBq" + + "cSAtciAnLmNsdXN0ZXJzW10uY2x1c3Rlck5hbWUnID4gY2x1c3RlcnMudHh0CgojIFN0YXR1cyBz" + + "bmFwc2hvdCBwZXIgY29tcHV0ZSBwbGFuZSAoYXNzdW1pbmcgZWFjaCBjb250ZXh0IG5hbWUgbWF0" + + "Y2hlcyk6CndoaWxlIHJlYWQgTkFNRTsgZG8KICBlY2hvICI9PT0gJE5BTUUgPT09IgogIG52Y2Yt" + + "Y2xpIHNlbGYtaG9zdGVkIHN0YXR1cyBcCiAgICAtLWNsdXN0ZXItbmFtZT0kTkFNRSBcCiAgICAt" + + "LWNvbXB1dGUtcGxhbmUtY29udGV4dD1hZG1pbkAkTkFNRSBcCiAgICAtLWpzb24gfCBqcSAtYyAn" + + "e2NsdXN0ZXI6LmNsdXN0ZXIsIHZlcmRpY3Q6LnZlcmRpY3QsIHJlY29uY2lsZToucmVjb25jaWxl" + + "QWdlU2VjfScKZG9uZSA8IGNsdXN0ZXJzLnR4dApgYGAKCkEgZnV0dXJlIE0rMTEgbWlsZXN0b25l" + + "IHdpbGwgYWRkIG5hdGl2ZSBmYW4tb3V0IChgc3RhdHVzIC0tYWxsLWNvbXB1dGUtcGxhbmVzYCkg" + + "c28gdGhpcyBkb2Vzbid0IG5lZWQgYSBzaGVsbCBsb29wLgpQSwcIoRTjgV0MAABdDAAAUEsDBBQA" + + "CAAAAAAAIQAAAAAAAAAAAAAAAAA3AAkAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1jbGkvcHJvbXB0" + + "cy9hZGQtY29tcHV0ZS1wbGFuZS5tZFVUBQABAKbOEiMgQWRkIGEgY29tcHV0ZSBwbGFuZSB0byBh" + + "biBleGlzdGluZyBjb250cm9sIHBsYW5lCgpVc2VyIGhhcyBhIHdvcmtpbmcgTlZDRiBjb250cm9s" + + "IHBsYW5lIChydW5uaW5nIHNvbWV3aGVyZSkgYW5kIHdhbnRzIHRvIHJlZ2lzdGVyIGEgbmV3IEdQ" + + "VSBjbHVzdGVyIGFnYWluc3QgaXQuIFRoaXMgaXMgdGhlIG11bHRpLWNsdXN0ZXIgc2NhbGluZyBw" + + "YXRoOiBvbmUgY29udHJvbCBwbGFuZSDihpIgTiBjb21wdXRlIHBsYW5lcy4KCiMjIFByZXJlcXVp" + + "c2l0ZXMgdGhlIHVzZXIgbXVzdCBoYXZlCgotICoqa3ViZWN0bCBjb250ZXh0IGZvciB0aGUgbmV3" + + "IGNvbXB1dGUgcGxhbmUqKiBpbiB0aGVpciBgS1VCRUNPTkZJR2AuCi0gKipQdWJsaWMgSUNNUyBV" + + "UkwqKiBvZiB0aGUgZXhpc3RpbmcgY29udHJvbCBwbGFuZSAoZS5nLiBgaHR0cHM6Ly9pY21zLm52" + + "Y2YuZXhhbXBsZS5jb21gKS4KLSAqKkFkbWluIEpXVCoqIGZvciB0aGUgY29udHJvbCBwbGFuZSdz" + + "IGFjY291bnQsIE9SIGFiaWxpdHkgdG8gbWludCBvbmUgdmlhIGBudmNmLWNsaSBpbml0YCBhZ2Fp" + + "bnN0IHRoZSBjb250cm9sIHBsYW5lJ3MgcHVibGljIGFwaSBlbmRwb2ludC4gKEFkbWluIHRva2Vu" + + "cyBjb21lIGZyb20gdGhlIEFQSSBLZXlzIHNlcnZpY2UgdmlhIHRoZSBwdWJsaWMgYXBpIGdhdGV3" + + "YXkg4oCUIGt1YmVjdGwgYWNjZXNzIHRvIHRoZSBjb250cm9sIHBsYW5lIGlzIE5PVCByZXF1aXJl" + + "ZCB0byBvYnRhaW4gb25lLikKLSBBIHVuaXF1ZSBgLS1jbHVzdGVyLW5hbWVgIHRoYXQgZG9lc24n" + + "dCBjb2xsaWRlIHdpdGggYWxyZWFkeS1yZWdpc3RlcmVkIGNsdXN0ZXJzLiBVc2UgYG52Y2YtY2xp" + + "IGNsdXN0ZXIgbGlzdC1yZWdpc3RlcmVkIC0tbmNhLWlkPSROQ0FfSUQgLS1pY21zLXVybD0kSUNN" + + "U2AgdG8gY2hlY2suCgojIyBTdGVwcwoKMS4gKipBc2sgZm9yIGlucHV0czoqKgogICAtIGAtLWNs" + + "dXN0ZXItbmFtZT08dW5pcXVlPmAg4oCUIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgY29udHJv" + + "bCBwbGFuZSdzIE5DQSBzY29wZQogICAtIGAtLWNvbXB1dGUtcGxhbmUtY29udGV4dD08Y29udGV4" + + "dD5gIOKAlCB0aGUgbmV3IEdQVSBjbHVzdGVyJ3Mga3ViZWN0bCBjb250ZXh0CiAgIC0gYC0taWNt" + + "cy11cmw9PGh0dHBzOi8vaWNtcy5udmNmLmV4YW1wbGUuY29tPmAg4oCUIGNvbnRyb2wgcGxhbmUn" + + "cyBwdWJsaWMgSUNNUyBVUkwKICAgLSBHUFUgdHlwZT8gKGRlZmF1bHQgYEgxMDBgLCBidXQgYXNr" + + "KQoKMi4gKipQcmUtZmxpZ2h0IGp1c3QgdGhlIGNvbXB1dGUgcGxhbmU6KioKCiAgIGBgYHNoCiAg" + + "IG52Y2YtY2xpIHNlbGYtaG9zdGVkIGNoZWNrIC0tcHJlIFwKICAgICAtLWNvbXB1dGUtcGxhbmUt" + + "Y29udGV4dD0kQ1RYIFwKICAgICAtLWljbXMtdXJsPSRJQ01TIFwKICAgICAtLWpzb24gfCBqcSAt" + + "YyAuCiAgIGBgYAoKICAgVGhpcyB2YWxpZGF0ZXMgdGhlIEdQVSBvcGVyYXRvciBpcyBpbnN0YWxs" + + "ZWQsIEdQVSBub2RlIGxhYmVscyBhcmUgcHJlc2VudCwgYW5kIElDTVMgaXMgcmVhY2hhYmxlIHZp" + + "YSBIVFRQLiBBZGRyZXNzIGFueSBmYWlsdXJlcyBiZWZvcmUgcHJvY2VlZGluZy4KCjMuICoqUnVu" + + "IGBhZGQtY29tcHV0ZS1wbGFuZWA6KioKCiAgIGBgYHNoCiAgIG52Y2YtY2xpIHNlbGYtaG9zdGVk" + + "IGFkZC1jb21wdXRlLXBsYW5lIFwKICAgICAtLWNsdXN0ZXItbmFtZT0kTkFNRSBcCiAgICAgLS1j" + + "b21wdXRlLXBsYW5lLWNvbnRleHQ9JENUWCBcCiAgICAgLS1pY21zLXVybD0kSUNNUyBcCiAgICAg" + + "LS10b2tlbj0kSldUIFwKICAgICAtLW5vbi1pbnRlcmFjdGl2ZSBcCiAgICAgLS1qc29uCiAgIGBg" + + "YAoKICAgVGhpcyBpcyBhIHNlcGFyYXRlIHN1YmNvbW1hbmQgZnJvbSBgdXBgLiBJdCBydW5zIG9u" + + "bHkgdGhlIGNvbXB1dGUtcGxhbmUtcmVsZXZhbnQgcGhhc2VzOiAxIChjb21wdXRlLXBsYW5lIHBy" + + "ZWZsaWdodCksIDUgKHJlZ2lzdGVyKSwgNiAoY29tcHV0ZS1wbGFuZSBhcHBseSksIDggKGZpbmFs" + + "IGhlYWx0aCBvbiB0aGUgbmV3IGNvbXB1dGUgcGxhbmUpLiBJdCBkb2VzIE5PVCB0b3VjaCB0aGUg" + + "Y29udHJvbCBwbGFuZSBhbmQgZG9lcyBOT1QgYWNjZXB0IGAtLWNvbnRyb2wtcGxhbmUtY29udGV4" + + "dGAg4oCUIHRoZSBjb250cm9sIHBsYW5lIGlzIHJlYWNoZWQgb3ZlciBIVFRQUyBhdCBgLS1pY21z" + + "LXVybGAuIGAtLXRva2VuYCBpcyByZXF1aXJlZCBiZWNhdXNlIHRoZXJlJ3Mgbm8ga3ViZWN0bCBw" + + "YXRoIHRvIG1pbnQgb25lIGZyb20uCgo0LiAqKlZlcmlmeS4qKiBgbnZjZi1jbGkgc2VsZi1ob3N0" + + "ZWQgc3RhdHVzIC0tY2x1c3Rlci1uYW1lPSROQU1FIC0tanNvbiB8IGpxYCDigJQgZXhwZWN0IGB2" + + "ZXJkaWN0OiAiaGVhbHRoeSJgLiBUaGUgUmVnaXN0ZXJlZCBDb21wdXRlIFBsYW5lcyBwYW5lbCBm" + + "cm9tIElDTVMgc2hvdWxkIG5vdyBsaXN0IHRoZSBuZXcgY2x1c3Rlci4KCjUuICoqU21va2UuKiog" + + "W2RlcGxveS1hbmQtaW52b2tlLm1kXShkZXBsb3ktYW5kLWludm9rZS5tZCkg4oCUIGRlcGxveSBh" + + "IHNtYWxsIGZ1bmN0aW9uIHRvIHRoZSBuZXcgY29tcHV0ZSBwbGFuZSB0byBjb25maXJtIHNjaGVk" + + "dWxpbmcgd29ya3MuCgojIyBXaGF0IGlmIGEgY2x1c3RlciB3aXRoIHRoZSBzYW1lIG5hbWUgYWxy" + + "ZWFkeSBleGlzdHM/CgpgYWRkLWNvbXB1dGUtcGxhbmVgJ3MgcmVnaXN0ZXIgcGhhc2UgdXNlcyBg" + + "LS1pZ25vcmUtZXhpc3RpbmdgIHNlbWFudGljcyDigJQgaXQnbGwgbWF0Y2ggdGhlIGV4aXN0aW5n" + + "IElDTVMgcm93IGFuZCByZXVzZSBpdHMgY2x1c3RlcklkLiBUd28gc2NlbmFyaW9zOgoKLSAqKlJl" + + "LXJlZ2lzdGVyaW5nIHRoZSBzYW1lIGNsdXN0ZXIqKiAocmUtcnVubmluZyBvbiB0aGUgc2FtZSBj" + + "b21wdXRlIHBsYW5lIHRoYXQgd2FzIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCk6IGV4cGVjdGVkLCBu" + + "by1vcCBzZW1hbnRpY3MuCi0gKipEaWZmZXJlbnQgcGh5c2ljYWwgY2x1c3RlciBidXQgc2FtZSBu" + + "YW1lKio6IHRoZSBzZWNvbmQgYXR0ZW1wdCB3aWxsIHJldXNlIHRoZSBJQ01TIHJvdywgYnV0IHRo" + + "ZSBuZXcgY29tcHV0ZSBwbGFuZSdzIEpXS1Mgd2lsbCBiZSBzaWxlbnRseSAqcmVwbGFjZWQqIOKA" + + "lCB0aGUgb2xkIGNvbXB1dGUgcGxhbmUncyBOVkNBIGFnZW50IHdpbGwgc3RhcnQgZmFpbGluZyBQ" + + "U0FUIGF1dGguICoqQ29uZmlybSB3aXRoIHRoZSB1c2VyKiogdGhhdCB0aGV5IG1lYW50IHRvIG92" + + "ZXJ3cml0ZS4KCldoZW4gaW4gZG91YnQsIHJ1biBgbnZjZi1jbGkgY2x1c3RlciBsaXN0LXJlZ2lz" + + "dGVyZWQgLS1uY2EtaWQ9JE5DQV9JRCAtLWljbXMtdXJsPSRJQ01TYCBmaXJzdCBhbmQgYXNrIHRo" + + "ZSB1c2VyIGJlZm9yZSBwcm9jZWVkaW5nIHdpdGggYSBuYW1lIHRoYXQgYWxyZWFkeSBleGlzdHMu" + + "ClBLBwhCJ0kPBQ0AAAUNAABQSwMEFAAIAAAAAAAhAAAAAAAAAAAAAAAAADkACQBkYXRhL252Y2Yt" + + "c2VsZi1tYW5hZ2VkLWNsaS9wcm9tcHRzL2NyZWF0ZS1hbmQtcnVuLXRhc2subWRVVAUAAQCmzhIj" + + "IENyZWF0ZSBhbmQgcnVuIGEgdGFzawoKU3RhbmRhcmQgZmxvdzogbWludCBBUEkga2V5cyAtPiB0" + + "YXNrIENSRUFURSAtPiBtb25pdG9yIC0+IHJldHJpZXZlIHJlc3VsdHMgLT4gY2xlYW51cC4KCiMj" + + "IDEuIE1pbnQgQVBJIGtleXMKClRoZSBhZG1pbiB0b2tlbiBmcm9tIGBpbml0YCBkb2VzIG5vdCBj" + + "YXJyeSB0YXNrIGludm9jYXRpb24gc2NvcGUuIEdlbmVyYXRlIEFQSSBrZXlzOgoKYGBgc2gKbnZj" + + "Zi1jbGkgYXBpLWtleSBnZW5lcmF0ZSAtLWRlc2NyaXB0aW9uPSJ0YXNrIHNtb2tlIHRlc3QiIC0t" + + "ZXhwaXJlcy1pbj04aAojIC0+IGZ1bmN0aW9uIGtleTogbnZhcGktLi4uCiMgLT4gdGFzayBrZXk6" + + "IG52YXBpLS4uLgpgYGAKCkJvdGgga2V5cyBhcmUgc2F2ZWQgdG8gQ0xJIHN0YXRlLiBUbyBtaW50" + + "IG9ubHkgdGhlIHRhc2sga2V5OgoKYGBgc2gKbnZjZi1jbGkgYXBpLWtleSBnZW5lcmF0ZSAtLWZv" + + "ciB0YXNrIC0tZGVzY3JpcHRpb249InRhc2sgc21va2UgdGVzdCIgLS1leHBpcmVzLWluPThoCmBg" + + "YAoKVG8gdmFsaWRhdGUgZWFjaCBrZXkgaW1tZWRpYXRlbHkgYWZ0ZXIgbWludGluZzoKCmBgYHNo" + + "Cm52Y2YtY2xpIGFwaS1rZXkgZ2VuZXJhdGUgLS1kZXNjcmlwdGlvbj0idGFzayBzbW9rZSB0ZXN0" + + "IiAtLWV4cGlyZXMtaW49OGggLS12YWxpZGF0ZQojIC0+IGZ1bmN0aW9uIEFQSSBrZXkgdmFsaWRh" + + "dGlvbiBwYXNzZWQhCiMgLT4gdGFzayBBUEkga2V5IHZhbGlkYXRpb24gcGFzc2VkIQpgYGAKCk5l" + + "dmVyIGVjaG8gdGhlIGtleSB2YWx1ZSAobnZhcGktLi4uKSBpbnRvIGNoYXQgb3IgbG9ncy4gUmVw" + + "b3J0IG9ubHkgdGhhdCB0aGUga2V5IHdhcyBtaW50ZWQsIGl0cyBkZXNjcmlwdGlvbiwgYW5kIGl0" + + "cyBleHBpcnkg4oCUIG5ldmVyIHRoZSB2YWx1ZSBpdHNlbGYuCgojIyMgRnJlc2ggc2Vzc2lvbiBw" + + "cmUtZmxpZ2h0CgpCZWZvcmUgcnVubmluZyBhbnkgYHRhc2tgIGNvbW1hbmQgaW4gYSBmcmVzaCBh" + + "Z2VudCBzZXNzaW9uLCB2ZXJpZnkgY3JlZGVudGlhbHM6CgoxLiBDaGVjayB3aGV0aGVyIGBOVkNG" + + "X0FQSV9LRVlgIGlzIHNldDoKCiAgIGBgYHNoCiAgIHByaW50ZW52IE5WQ0ZfQVBJX0tFWSA+IC9k" + + "ZXYvbnVsbCAyPiYxICYmIGVjaG8gc2V0IHx8IGVjaG8gdW5zZXQKICAgYGBgCgoyLiBJZiB1bnNl" + + "dCwgcmVhZCB0aGUgc3RvcmVkIGtleSBleHBpcnkgd2l0aG91dCBwcmludGluZyB0aGUgdmFsdWU6" + + "CgogICBgYGBzaAogICBweXRob24zIC1jICJpbXBvcnQganNvbixwYXRobGliOyBzPWpzb24ubG9h" + + "ZHMocGF0aGxpYi5QYXRoKCd+Ly5udmNmLWNsaS5zdGF0ZScpLmV4cGFuZHVzZXIoKS5yZWFkX3Rl" + + "eHQoKSk7IHByaW50KHMuZ2V0KCdudmN0QXBpS2V5RXhwaXJhdGlvbicsJ21pc3NpbmcnKSkiCiAg" + + "IGBgYAoKMy4gSWYgdGhlIGV4cGlyeSBpcyBpbiB0aGUgcGFzdCBvciBtaXNzaW5nLCByZWdlbmVy" + + "YXRlOgoKICAgYGBgc2gKICAgbnZjZi1jbGkgcmVmcmVzaAogICBudmNmLWNsaSBhcGkta2V5IGdl" + + "bmVyYXRlIC0tZm9yIHRhc2sgLS1kZXNjcmlwdGlvbj0idGFzay1rZXkiIC0tZXhwaXJlcy1pbj0y" + + "NGggLS12YWxpZGF0ZQogICBgYGAKCjQuIEluamVjdCB0aGUgc3RvcmVkIGtleSBpbnRvIHRoZSBz" + + "dWJwcm9jZXNzIGVudiB3aXRob3V0IGxvZ2dpbmcgdGhlIHZhbHVlLiBVc2UgYSBzaGVsbCBzdWJz" + + "aGVsbCBvciBlbnYgcHJlZml4IOKAlCBuZXZlciBwcmludCB0aGUga2V5IGludG8gY2hhdC4KCkVy" + + "cm9yIGNsYXNzaWZpY2F0aW9uOgoKLSAibWlzc2luZyBhdXRoZW50aWNhdGlvbiBjcmVkZW50aWFs" + + "cyIgb3IgZXhpdCAyOiBrZXkgbm90IGluamVjdGVkOyByZXBlYXQgcHJlLWZsaWdodC4KLSBIVFRQ" + + "IDQwMzoga2V5IGV4cGlyZWQgb3Igd3JvbmcgYXVkaWVuY2U7IHJlZ2VuZXJhdGUuCi0gRW1wdHkg" + + "dGFzayBsaXN0OiB2YWxpZDsgbm8gdGFza3MgZXhpc3QgeWV0LgoKIyMgMi4gVGFzayBDUkVBVEU6" + + "IGNvbnRhaW5lcgoKRGVmaW5lIHRoZSB0YXNrIGluIGEgSlNPTiBmaWxlLiBNaW5pbXVtIHZpYWJs" + + "ZSBjb250YWluZXIgdGFzazoKCmBgYGpzb24KewogICJuYW1lIjogInNtb2tlLWNvbnRhaW5lci10" + + "YXNrIiwKICAiZ3B1U3BlY2lmaWNhdGlvbiI6IHsKICAgICJncHUiOiAiSDEwMCIsCiAgICAiaW5z" + + "dGFuY2VUeXBlIjogIk5DUC5HUFUuSDEwMF8xeCIsCiAgICAiYmFja2VuZCI6ICJuY3AtbG9jYWwi" + + "CiAgfSwKICAiY29udGFpbmVySW1hZ2UiOiAibnZjci5pby9udmlkaWEvbmVtbzpsYXRlc3QiLAog" + + "ICJjb250YWluZXJBcmdzIjogInB5dGhvbiAtYyBcInByaW50KCdoZWxsbyBmcm9tIHRhc2snKVwi" + + "IiwKICAicmVzdWx0SGFuZGxpbmdTdHJhdGVneSI6ICJOT05FIgp9CmBgYAoKYGBgc2gKbnZjZi1j" + + "bGkgdGFzayBjcmVhdGUgLS1pbnB1dC1maWxlPXRhc2stY29udGFpbmVyLmpzb24KIyAtPiBUYXNr" + + "IElEOiA8dGFza19pZD4KYGBgCgpDYXB0dXJlIHRoZSB0YXNrIElEIGZyb20gdGhlIG91dHB1dC4g" + + "U3RhdGUgcGVyc2lzdGVuY2UgY2FuIGZhaWwgc2lsZW50bHksIHNvIHBhc3MKYDx0YXNrSWQ+YCBl" + + "eHBsaWNpdGx5IG9uIHN1YnNlcXVlbnQgY29tbWFuZHMgcmF0aGVyIHRoYW4gcmVseWluZyBvbiBz" + + "YXZlZCBzdGF0ZS4KCkVxdWl2YWxlbnQgQ0xJIGZsYWdzIGZvcm0gZm9yIHF1aWNrIGFkLWhvYyBy" + + "dW5zOgoKYGBgc2gKbnZjZi1jbGkgdGFzayBjcmVhdGUgXAogIC0tbmFtZT1zbW9rZS1jb250YWlu" + + "ZXItdGFzayBcCiAgLS1ncHU9SDEwMCBcCiAgLS1pbnN0YW5jZS10eXBlPU5DUC5HUFUuSDEwMF8x" + + "eCBcCiAgLS1iYWNrZW5kPW5jcC1sb2NhbCBcCiAgLS1pbWFnZT1udmNyLmlvL252aWRpYS9uZW1v" + + "OmxhdGVzdCBcCiAgLS1jb250YWluZXItYXJncz0icHl0aG9uIC1jICdwcmludChoZWxsbyBmcm9t" + + "IHRhc2spJyIgXAogIC0tcmVzdWx0LXN0cmF0ZWd5PU5PTkUKYGBgCgpUbyB0YXJnZXQgYSBzcGVj" + + "aWZpYyBjb21wdXRlIGNsdXN0ZXI6CgpgYGBzaApudmNmLWNsaSB0YXNrIGNyZWF0ZSAtLWlucHV0" + + "LWZpbGU9dGFzay1jb250YWluZXIuanNvbiAtLWNsdXN0ZXJzPW15LWNsdXN0ZXIKYGBgCgpUbyBp" + + "bmplY3QgZW52aXJvbm1lbnQgdmFyaWFibGVzIG9yIHNlY3JldHMsIGVpdGhlciBwYXNzIGZsYWdz" + + "OgoKYGBgc2gKbnZjZi1jbGkgdGFzayBjcmVhdGUgLS1pbnB1dC1maWxlPXRhc2stY29udGFpbmVy" + + "Lmpzb24gXAogIC0tY29udGFpbmVyLWVudiBNWV9FTlY9dmFsdWUgXAogIC0tc2VjcmV0cyBNWV9T" + + "RUNSRVQ9czNjcjN0CmBgYAoKb3Igc2V0IHRoZW0gaW4gdGhlIEpTT04gZmlsZToKCmBgYGpzb24K" + + "ewogICJjb250YWluZXJFbnZpcm9ubWVudCI6IFsKICAgIHsia2V5IjogIk1ZX0VOViIsICJ2YWx1" + + "ZSI6ICJ2YWx1ZSJ9CiAgXSwKICAic2VjcmV0cyI6IFsKICAgIHsibmFtZSI6ICJNWV9TRUNSRVQi" + + "LCAidmFsdWUiOiAiczNjcjN0In0KICBdCn0KYGBgCgpTZWNyZXRzIGFyZSBlbmNyeXB0ZWQgYXQg" + + "cmVzdCBhbmQgbm90IHJldHVybmVkIGluIGxpc3Qgb3IgZ2V0IHJlc3BvbnNlcyBieSBkZWZhdWx0" + + "OyBkbyBub3QgbG9nIHRoZW0uCgojIyAzLiBUYXNrIENSRUFURTogSGVsbQoKRm9yIEhlbG0tdHlw" + + "ZSB0YXNrcywgcmVwbGFjZSBgY29udGFpbmVySW1hZ2VgIHdpdGggYGhlbG1DaGFydGA6CgpgYGBq" + + "c29uCnsKICAibmFtZSI6ICJzbW9rZS1oZWxtLXRhc2siLAogICJncHVTcGVjaWZpY2F0aW9uIjog" + + "ewogICAgImdwdSI6ICJIMTAwIiwKICAgICJpbnN0YW5jZVR5cGUiOiAiTkNQLkdQVS5IMTAwXzF4" + + "IiwKICAgICJiYWNrZW5kIjogIm5jcC1sb2NhbCIKICB9LAogICJoZWxtQ2hhcnQiOiAiaHR0cHM6" + + "Ly9oZWxtLm5nYy5udmlkaWEuY29tLzxvcmc+L2NoYXJ0cy9leGFtcGxlLXRhc2stMC4xLjAudGd6" + + "IiwKICAicmVzdWx0SGFuZGxpbmdTdHJhdGVneSI6ICJOT05FIgp9CmBgYAoKYGBgc2gKbnZjZi1j" + + "bGkgdGFzayBjcmVhdGUgLS1pbnB1dC1maWxlPXRhc2staGVsbS5qc29uCiMgLT4gVGFzayBJRDog" + + "PHRhc2tfaWQ+CmBgYAoKYGhlbG1DaGFydGAgYW5kIGBjb250YWluZXJJbWFnZWAgYXJlIG11dHVh" + + "bGx5IGV4Y2x1c2l2ZS4KCiMjIDNiLiBVcGRhdGUgc2VjcmV0cyBvbiBhIHJ1bm5pbmcgdGFzawoK" + + "YGBgc2gKbnZjZi1jbGkgdGFzayB1cGRhdGUtc2VjcmV0cyA8dGFza19pZD4gLS1zZWNyZXRzIE5B" + + "TUU9dmFsdWUKYGBgCgpgdXBkYXRlLXNlY3JldHNgIG1lcmdlcyBzZWNyZXRzIGJ5IG5hbWU6IHN1" + + "cHBsaWVkIHNlY3JldHMgYXJlIGFkZGVkIG9yIHVwZGF0ZWQsIGFuZCBleGlzdGluZyBzZWNyZXRz" + + "IG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVxdWVzdCBhcmUgcHJlc2VydmVkLiBEbyBub3QgZWNobyBz" + + "ZWNyZXQgdmFsdWVzIGludG8gY2hhdC4KCiMjIDQuIE1vbml0b3IKClBvbGwgdGFzayBzdGF0ZToK" + + "CmBgYHNoCm52Y2YtY2xpIHRhc2sgZ2V0IDx0YXNrX2lkPgojIC0+IGlkOiA8dGFza19pZD4KIyAt" + + "PiBzdGF0dXM6IFJVTk5JTkcKYGBgCgpPciB1c2UgdGhlIHRhc2sgSUQgc2F2ZWQgdG8gc3RhdGUg" + + "ZnJvbSB0aGUgbW9zdCByZWNlbnQgYHRhc2sgY3JlYXRlYDoKCmBgYHNoCm52Y2YtY2xpIHRhc2sg" + + "Z2V0CmBgYAoKU3RhdHVzIHZhbHVlczogYFFVRVVFRGAsIGBMQVVOQ0hFRGAsIGBSVU5OSU5HYCwg" + + "YENPTVBMRVRFRGAsIGBFUlJPUkVEYCwgYENBTkNFTEVEYCwgYEVYQ0VFREVEX01BWF9SVU5USU1F" + + "X0RVUkFUSU9OYCwgYEVYQ0VFREVEX01BWF9RVUVVRURfRFVSQVRJT05gLgoKSW5zcGVjdCBsaWZl" + + "Y3ljbGUgZXZlbnRzIGZvciBwcm9ncmVzcyBkZXRhaWxzIG9yIGZhaWx1cmUgY29udGV4dDoKCmBg" + + "YHNoCm52Y2YtY2xpIHRhc2sgZXZlbnRzIDx0YXNrX2lkPgpgYGAKCklmIHRoZSB0YXNrIGlzIHN0" + + "dWNrIGluIGBRVUVVRURgLCBjaGVjayB0aGF0IGEgY29tcHV0ZSBjbHVzdGVyIHdpdGggYSBtYXRj" + + "aGluZyBHUFUgU0tVCmlzIHJlZ2lzdGVyZWQgYW5kIGhlYWx0aHkgKGBudmNmLWNsaSBzZWxmLWhv" + + "c3RlZCBzdGF0dXNgKS4KCklmIHRoZSB0YXNrIG1vdmVzIHRvIGBFUlJPUkVEYCwgdGhlIGV2ZW50" + + "cyBvdXRwdXQgY29udGFpbnMgdGhlIGZhaWx1cmUgcmVhc29uLiBGb3IKY29udGFpbmVyLWxldmVs" + + "IGRldGFpbCwgaW5zcGVjdCB0aGUgdGFzayB3b3JrbG9hZCBwb2RzIG9uIHRoZSBjb21wdXRlLXBs" + + "YW5lIGNsdXN0ZXIgd2l0aApga3ViZWN0bGAgYWdhaW5zdCB0aGUgYXBwcm9wcmlhdGUgbmFtZXNw" + + "YWNlIGFuZCBjb250ZXh0LgoKIyMgNS4gUmV0cmlldmUgcmVzdWx0cwoKRm9yIHRhc2tzIHdpdGgg" + + "YHJlc3VsdEhhbmRsaW5nU3RyYXRlZ3k6IE5PTkVgLCByZXN1bHRzIGFyZSBlbXB0eSBieSBkZXNp" + + "Z246CgpgYGBzaApudmNmLWNsaSB0YXNrIHJlc3VsdHMgPHRhc2tfaWQ+CiMgLT4geyJyZXN1bHRz" + + "IjogW119CmBgYAoKRm9yIHRhc2tzIHdpdGggYHJlc3VsdEhhbmRsaW5nU3RyYXRlZ3k6IFVQTE9B" + + "RGAsIHJlc3VsdHMgdXBsb2FkIHRvIHRoZSBsb2NhdGlvbiBuYW1lZCBpbgpgcmVzdWx0c0xvY2F0" + + "aW9uYC4gVGhlIHRhc2sncyBjcmVkZW50aWFscyBtdXN0IGhhdmUgd3JpdGUgYWNjZXNzIHRvIHRo" + + "YXQgbG9jYXRpb24uIEFmdGVyCnRoZSB0YXNrIHJlYWNoZXMgYENPTVBMRVRFRGA6CgpgYGBzaApu" + + "dmNmLWNsaSB0YXNrIHJlc3VsdHMgPHRhc2tfaWQ+CmBgYAoKTm90ZTogcmVzdWx0IHVwbG9hZCBp" + + "cyBub3QgeWV0IHN1cHBvcnRlZCBpbiB0aGlzIHJlbGVhc2UuCgojIyA2LiBDbGVhbnVwCgpDYW5j" + + "ZWwgYSBydW5uaW5nIHRhc2s6CgpgYGBzaApudmNmLWNsaSB0YXNrIGNhbmNlbCA8dGFza19pZD4K" + + "YGBgCgpEZWxldGUgdGhlIHRhc2sgcmVjb3JkIGFmdGVyIGl0IHJlYWNoZXMgYSB0ZXJtaW5hbCBz" + + "dGF0ZToKCmBgYHNoCm52Y2YtY2xpIHRhc2sgZGVsZXRlIDx0YXNrX2lkPgpgYGAKClN0b3AgYW5k" + + "IGNvbmZpcm0gd2l0aCB0aGUgdXNlciBiZWZvcmUgcnVubmluZyB0YXNrIGRlbGV0ZS4gU3RhdGUg" + + "dGhlIHRhc2sgSUQgYW5kIGl0cyBjdXJyZW50IHN0YXR1cy4gRG8gbm90IHByb2NlZWQgZXZlbiB3" + + "aGVuIHRoZSB1c2VyJ3MgcHJvbXB0IGFscmVhZHkgcmVxdWVzdGVkIGRlbGV0aW9uIOKAlCBhbHdh" + + "eXMgZ2V0IGFuIGV4cGxpY2l0IGxhc3QtbG9vayBjb25maXJtYXRpb24uIERlbGV0aW9uIGlzIHBl" + + "cm1hbmVudCBhbmQgY2Fubm90IGJlIHVuZG9uZS4KClRvIGxpc3QgYWxsIHRhc2tzIGZvciB0aGUg" + + "Y3VycmVudCBvd25lciAodXNlZnVsIGJlZm9yZSBidWxrIGNsZWFudXApOgoKYGBgc2gKbnZjZi1j" + + "bGkgdGFzayBsaXN0Cm52Y2YtY2xpIHRhc2sgbGlzdCAtLXN0YXR1cz1DT01QTEVURUQKYGBgCgoj" + + "IyBOb3RlcwoKLSBHUFUgZmFtaWx5IGFuZCBpbnN0YW5jZSB0eXBlIG11c3QgbWF0Y2ggYSByZWdp" + + "c3RlcmVkIGNvbXB1dGUgY2x1c3RlciBTS1UuIE1pc21hdGNoCiAgY2F1c2VzIHRoZSB0YXNrIHRv" + + "IHJlbWFpbiBgUVVFVUVEYCBpbmRlZmluaXRlbHkuIFVzZSBgbnZjZi1jbGkgY2x1c3RlciBsaXN0" + + "YCB0byBjaGVjawogIHJlZ2lzdGVyZWQgU0tVcy4KLSBGb3IgY29udGFpbmVyIGltYWdlcyBvbiBw" + + "cml2YXRlIHJlZ2lzdHJpZXMsIGVuc3VyZSB0aGUgY29tcHV0ZS1wbGFuZSBjbHVzdGVyJ3MKICBp" + + "bWFnZS1jcmVkZW50aWFsLWhlbHBlciBpcyBjb25maWd1cmVkIGZvciB0aGUgcmVnaXN0cnkgaG9z" + + "dC4KUEsHCNTejTSfGQAAnxkAAFBLAwQUAAgAAAAAACEAAAAAAAAAAAAAAAAANwAJAGRhdGEvbnZj" + + "Zi1zZWxmLW1hbmFnZWQtY2xpL3Byb21wdHMvZGVwbG95LWFuZC1pbnZva2UubWRVVAUAAQCmzhIj" + + "IERlcGxveSBhbmQgaW52b2tlIGEgY29udGFpbmVyIGZ1bmN0aW9uCgpTdGFuZGFyZCBmb3VyLXN0" + + "ZXAgZmxvdzogZnVuY3Rpb24gQ1JFQVRFIOKGkiBERVBMT1kg4oaSIEFQSSBrZXkgKGZvciBpbnZv" + + "a2Ugc2NvcGUpIOKGkiBJTlZPS0UuCgojIyAxLiBGdW5jdGlvbiBDUkVBVEUKCkRlZmluZSB0aGUg" + + "ZnVuY3Rpb24gaW4gYSBKU09OIGZpbGUuIE1pbmltdW06CgpCZWZvcmUgY3JlYXRpbmcgdGhlIGZ1" + + "bmN0aW9uLCBjb25maXJtIHRoZSBleGFjdCBmdW5jdGlvbiBuYW1lIGFuZCBjb250YWluZXIgaW1h" + + "Z2Ugd2l0aCB0aGUgdXNlci4gSWYgZWl0aGVyIHZhbHVlIGlzIG1pc3NpbmcsIHN0b3AgYW5kIGFz" + + "ay4gRG8gbm90IGludmVudCBvciBzdWJtaXQgZXhhbXBsZSB2YWx1ZXMgZm9yIHRoZXNlIGZpZWxk" + + "cy4KCmBgYGpzb24KewogICJuYW1lIjogIjxjb25maXJtZWQtZnVuY3Rpb24tbmFtZT4iLAogICJj" + + "b250YWluZXJJbWFnZSI6ICI8Y29uZmlybWVkLWNvbnRhaW5lci1pbWFnZT4iLAogICJpbmZlcmVu" + + "Y2VVcmwiOiAiL2VjaG8iLAogICJpbmZlcmVuY2VQb3J0IjogODAwMCwKICAiZGVzY3JpcHRpb24i" + + "OiAic21va2UgdGVzdCBlY2hvIGZ1bmN0aW9uIiwKICAiZnVuY3Rpb25UeXBlIjogIkRFRkFVTFQi" + + "LAogICJhcGlCb2R5Rm9ybWF0IjogIkNVU1RPTSIsCiAgImhlYWx0aCI6IHsKICAgICJwcm90b2Nv" + + "bCI6ICJIVFRQIiwKICAgICJ1cmkiOiAiL2hlYWx0aCIsCiAgICAicG9ydCI6IDgwMDAsCiAgICAi" + + "dGltZW91dCI6ICJQVDMwUyIsCiAgICAiZXhwZWN0ZWRTdGF0dXNDb2RlIjogMjAwCiAgfQp9CmBg" + + "YAoKYGBgc2gKbnZjZi1jbGkgZnVuY3Rpb24gY3JlYXRlIC0taW5wdXQtZmlsZT1jcmVhdGUtZm4u" + + "anNvbgojIOKGkiBGdW5jdGlvbiBJRDogPGZuX2lkPgojIOKGkiBWZXJzaW9uIElEOiA8dmVyX2lk" + + "PgpgYGAKClNhdmUgdGhlIElEcyDigJQgdGhleSdyZSBuZWVkZWQgZm9yIGRlcGxveSArIGludm9r" + + "ZS4KCiMjIyBMTE0gZnVuY3Rpb24gdmFyaWFudAoKRm9yIGFuIE9wZW5BSS1jb21wYXRpYmxlIExM" + + "TSBmdW5jdGlvbiwgc2V0IGBmdW5jdGlvblR5cGU6ICJMTE0iYCBhbmQgcHV0IHJvdXRlIG1ldGFk" + + "YXRhIHVuZGVyIGBtb2RlbHNbXS5sbG1Db25maWdgOgoKQmVmb3JlIGNyZWF0aW5nIHRoZSBmdW5j" + + "dGlvbiwgY29uZmlybSB0aGUgZXhhY3QgZnVuY3Rpb24gbmFtZSwgY29udGFpbmVyIGltYWdlLCBh" + + "bmQgbW9kZWwgbmFtZSB3aXRoIHRoZSB1c2VyLiBJZiBhbnkgdmFsdWUgaXMgbWlzc2luZywgc3Rv" + + "cCBhbmQgYXNrLiBEbyBub3QgaW52ZW50IG9yIHN1Ym1pdCBleGFtcGxlIHZhbHVlcyBmb3IgdGhl" + + "c2UgZmllbGRzLgoKYGBganNvbgp7CiAgIm5hbWUiOiAiPGNvbmZpcm1lZC1mdW5jdGlvbi1uYW1l" + + "PiIsCiAgImNvbnRhaW5lckltYWdlIjogIjxjb25maXJtZWQtY29udGFpbmVyLWltYWdlPiIsCiAg" + + "ImluZmVyZW5jZVVybCI6ICIvIiwKICAiaW5mZXJlbmNlUG9ydCI6IDgwMDAsCiAgImZ1bmN0aW9u" + + "VHlwZSI6ICJMTE0iLAogICJoZWFsdGgiOiB7CiAgICAicHJvdG9jb2wiOiAiSFRUUCIsCiAgICAi" + + "dXJpIjogIi9oZWFsdGgiLAogICAgInBvcnQiOiA4MDAwLAogICAgInRpbWVvdXQiOiAiUFQzMFMi" + + "LAogICAgImV4cGVjdGVkU3RhdHVzQ29kZSI6IDIwMAogIH0sCiAgIm1vZGVscyI6IFsKICAgIHsK" + + "ICAgICAgIm5hbWUiOiAiPGNvbmZpcm1lZC1tb2RlbC1uYW1lPiIsCiAgICAgICJsbG1Db25maWci" + + "OiB7CiAgICAgICAgInVyaXMiOiBbIi92MS9jaGF0L2NvbXBsZXRpb25zIiwgIi92MS9yZXNwb25z" + + "ZXMiLCAiL3YxL2VtYmVkZGluZ3MiXSwKICAgICAgICAicm91dGluZ01ldGhvZCI6ICJyb3VuZF9y" + + "b2JpbiIsCiAgICAgICAgInRva2VuUmF0ZUxpbWl0IjogIjEwMDAtUyIKICAgICAgfQogICAgfQog" + + "IF0KfQpgYGAKCkVxdWl2YWxlbnQgQ0xJIGZsYWcgZm9ybToKCmBgYHNoCm52Y2YtY2xpIGZ1bmN0" + + "aW9uIGNyZWF0ZSBcCiAgLS1uYW1lPSI8Y29uZmlybWVkLWZ1bmN0aW9uLW5hbWU+IiBcCiAgLS1p" + + "bWFnZT0iPGNvbmZpcm1lZC1jb250YWluZXItaW1hZ2U+IiBcCiAgLS1pbmZlcmVuY2UtdXJsPS8g" + + "XAogIC0taW5mZXJlbmNlLXBvcnQ9ODAwMCBcCiAgLS1oZWFsdGgtdXJpPS9oZWFsdGggXAogIC0t" + + "aGVhbHRoLXBvcnQ9ODAwMCBcCiAgLS1oZWFsdGgtdGltZW91dD1QVDMwUyBcCiAgLS1oZWFsdGgt" + + "cHJvdG9jb2w9SFRUUCBcCiAgLS1oZWFsdGgtZXhwZWN0ZWQtc3RhdHVzPTIwMCBcCiAgLS1mdW5j" + + "dGlvbi10eXBlPUxMTSBcCiAgLS1sbG0tbW9kZWw9J25hbWU9PGNvbmZpcm1lZC1tb2RlbC1uYW1l" + + "Pix1cmlzPS92MS9jaGF0L2NvbXBsZXRpb25zfC92MS9yZXNwb25zZXN8L3YxL2VtYmVkZGluZ3Ms" + + "cm91dGluZ01ldGhvZD1yb3VuZF9yb2Jpbix0b2tlblJhdGVMaW1pdD0xMDAwLVMnCmBgYAoKVXNl" + + "IHRoZSBzYW1lIGRlcGxveSBzdGVwIGJlbG93IGFmdGVyIHRoZSBMTE0gZnVuY3Rpb24gaXMgY3Jl" + + "YXRlZC4KCk9wdGlvbmFsIG1vZGVsIHJvdXRpbmcgdXBkYXRlIGFmdGVyIGNyZWF0aW9uOgoKYGBg" + + "c2gKbnZjZi1jbGkgZnVuY3Rpb24gdXBkYXRlIFwKICAtLWZ1bmN0aW9uLWlkPTxmbl9pZD4gXAog" + + "IC0tdmVyc2lvbi1pZD08dmVyX2lkPiBcCiAgLS1sbG0tbW9kZWwtdXBkYXRlPSduYW1lPTxjb25m" + + "aXJtZWQtbW9kZWwtbmFtZT4scm91dGluZ01ldGhvZD1wb3dlcl9vZl90d28sdG9rZW5SYXRlTGlt" + + "aXQ9MTAwMC1TJwpgYGAKClVzZSB0aGlzIGZvciBtdXRhYmxlIGByb3V0aW5nTWV0aG9kYCBhbmQg" + + "YHRva2VuUmF0ZUxpbWl0YDsgY3JlYXRlLXRpbWUgYHVyaXNgIHN0YXkgaW4gYG1vZGVsc1tdLmxs" + + "bUNvbmZpZ2AuCmB0b2tlblJhdGVMaW1pdGAgc3VwcG9ydHMgcG9zaXRpdmUgaW50ZWdlciB0b2tl" + + "biBsaW1pdHMgZm9yIGBTYCwgYE1gLCBgSGAsIGBEYCwgYW5kIGBXYC4gVXNlIGAxMDAwLVNgIGZv" + + "ciBhIHNpbmdsZSBpbmxpbmUgQ0xJIGxpbWl0LiBVc2UgaW5wdXQgSlNPTiBmb3IgY29tYmluZWQg" + + "bGltaXRzLCBzdWNoIGFzIGAxMDAwLVMsNTAwMC1NLDEwMDAwMC1ILDUwMDAwMC1ELDEwMDAwMDAt" + + "V2AsIGJlY2F1c2UgaW5saW5lIG1vZGVsIHNwZWNzIHVzZSBjb21tYXMgYXMgZmllbGQgc2VwYXJh" + + "dG9ycy4KCiMjIyBIZWxtIGNoYXJ0IExMTSBmdW5jdGlvbiB2YXJpYW50CgpMTE0gZnVuY3Rpb24g" + + "dHlwZSBpcyBpbmRlcGVuZGVudCBvZiB3b3JrbG9hZCBwYWNrYWdpbmcuIEZvciBhIEhlbG0tY2hh" + + "cnQgYmFja2VkIExMTSBmdW5jdGlvbiwga2VlcCB0aGUgc2FtZSBgZnVuY3Rpb25UeXBlYCBhbmQg" + + "YG1vZGVsc1tdLmxsbUNvbmZpZ2AgZmllbGRzLCB0aGVuIHNldCBgaGVsbUNoYXJ0YCBhbmQgYGhl" + + "bG1DaGFydFNlcnZpY2VOYW1lYC4gVGhlIHNlcnZpY2UgbmFtZSBtdXN0IG1hdGNoIGEgS3ViZXJu" + + "ZXRlcyBTZXJ2aWNlIHJlbmRlcmVkIGJ5IHRoZSBjaGFydCwgYW5kIGBpbmZlcmVuY2VQb3J0YCBt" + + "dXN0IGJlIHRoYXQgU2VydmljZSBwb3J0LgoKQmVmb3JlIGNyZWF0aW5nIHRoZSBmdW5jdGlvbiwg" + + "Y29uZmlybSB0aGUgZXhhY3QgZnVuY3Rpb24gbmFtZSBhbmQgbW9kZWwgbmFtZSB3aXRoIHRoZSB1" + + "c2VyLiBJZiBlaXRoZXIgdmFsdWUgaXMgbWlzc2luZywgc3RvcCBhbmQgYXNrLiBEbyBub3QgaW52" + "ZW50IG9yIHN1Ym1pdCBleGFtcGxlIHZhbHVlcyBmb3IgdGhlc2UgZmllbGRzLgoKYGBganNvbgp7" + - "CiAgIm5hbWUiOiAiPGNvbmZpcm1lZC1mdW5jdGlvbi1uYW1lPiIsCiAgImNvbnRhaW5lckltYWdl" + - "IjogIjxjb25maXJtZWQtY29udGFpbmVyLWltYWdlPiIsCiAgImluZmVyZW5jZVVybCI6ICIvIiwK" + - "ICAiaW5mZXJlbmNlUG9ydCI6IDgwMDAsCiAgImZ1bmN0aW9uVHlwZSI6ICJMTE0iLAogICJoZWFs" + - "dGgiOiB7CiAgICAicHJvdG9jb2wiOiAiSFRUUCIsCiAgICAidXJpIjogIi9oZWFsdGgiLAogICAg" + - "InBvcnQiOiA4MDAwLAogICAgInRpbWVvdXQiOiAiUFQzMFMiLAogICAgImV4cGVjdGVkU3RhdHVz" + - "Q29kZSI6IDIwMAogIH0sCiAgIm1vZGVscyI6IFsKICAgIHsKICAgICAgIm5hbWUiOiAiPGNvbmZp" + - "cm1lZC1tb2RlbC1uYW1lPiIsCiAgICAgICJsbG1Db25maWciOiB7CiAgICAgICAgInVyaXMiOiBb" + - "Ii92MS9jaGF0L2NvbXBsZXRpb25zIiwgIi92MS9yZXNwb25zZXMiLCAiL3YxL2VtYmVkZGluZ3Mi" + - "XSwKICAgICAgICAicm91dGluZ01ldGhvZCI6ICJyb3VuZF9yb2JpbiIsCiAgICAgICAgInRva2Vu" + - "UmF0ZUxpbWl0IjogIjEwMDAtUyIKICAgICAgfQogICAgfQogIF0KfQpgYGAKCkVxdWl2YWxlbnQg" + - "Q0xJIGZsYWcgZm9ybToKCmBgYHNoCm52Y2YtY2xpIGZ1bmN0aW9uIGNyZWF0ZSBcCiAgLS1uYW1l" + - "PSI8Y29uZmlybWVkLWZ1bmN0aW9uLW5hbWU+IiBcCiAgLS1pbWFnZT0iPGNvbmZpcm1lZC1jb250" + - "YWluZXItaW1hZ2U+IiBcCiAgLS1pbmZlcmVuY2UtdXJsPS8gXAogIC0taW5mZXJlbmNlLXBvcnQ9" + - "ODAwMCBcCiAgLS1oZWFsdGgtdXJpPS9oZWFsdGggXAogIC0taGVhbHRoLXBvcnQ9ODAwMCBcCiAg" + - "LS1oZWFsdGgtdGltZW91dD1QVDMwUyBcCiAgLS1oZWFsdGgtcHJvdG9jb2w9SFRUUCBcCiAgLS1o" + - "ZWFsdGgtZXhwZWN0ZWQtc3RhdHVzPTIwMCBcCiAgLS1mdW5jdGlvbi10eXBlPUxMTSBcCiAgLS1s" + - "bG0tbW9kZWw9J25hbWU9PGNvbmZpcm1lZC1tb2RlbC1uYW1lPix1cmlzPS92MS9jaGF0L2NvbXBs" + - "ZXRpb25zfC92MS9yZXNwb25zZXN8L3YxL2VtYmVkZGluZ3Mscm91dGluZ01ldGhvZD1yb3VuZF9y" + - "b2Jpbix0b2tlblJhdGVMaW1pdD0xMDAwLVMnCmBgYAoKVXNlIHRoZSBzYW1lIGRlcGxveSBzdGVw" + - "IGJlbG93IGFmdGVyIHRoZSBMTE0gZnVuY3Rpb24gaXMgY3JlYXRlZC4KCk9wdGlvbmFsIG1vZGVs" + - "IHJvdXRpbmcgdXBkYXRlIGFmdGVyIGNyZWF0aW9uOgoKYGBgc2gKbnZjZi1jbGkgZnVuY3Rpb24g" + - "dXBkYXRlIFwKICAtLWZ1bmN0aW9uLWlkPTxmbl9pZD4gXAogIC0tdmVyc2lvbi1pZD08dmVyX2lk" + - "PiBcCiAgLS1sbG0tbW9kZWwtdXBkYXRlPSduYW1lPTxjb25maXJtZWQtbW9kZWwtbmFtZT4scm91" + - "dGluZ01ldGhvZD1wb3dlcl9vZl90d28sdG9rZW5SYXRlTGltaXQ9MTAwMC1TJwpgYGAKClVzZSB0" + - "aGlzIGZvciBtdXRhYmxlIGByb3V0aW5nTWV0aG9kYCBhbmQgYHRva2VuUmF0ZUxpbWl0YDsgY3Jl" + - "YXRlLXRpbWUgYHVyaXNgIHN0YXkgaW4gYG1vZGVsc1tdLmxsbUNvbmZpZ2AuCmB0b2tlblJhdGVM" + - "aW1pdGAgc3VwcG9ydHMgcG9zaXRpdmUgaW50ZWdlciB0b2tlbiBsaW1pdHMgZm9yIGBTYCwgYE1g" + - "LCBgSGAsIGBEYCwgYW5kIGBXYC4gVXNlIGAxMDAwLVNgIGZvciBhIHNpbmdsZSBpbmxpbmUgQ0xJ" + - "IGxpbWl0LiBVc2UgaW5wdXQgSlNPTiBmb3IgY29tYmluZWQgbGltaXRzLCBzdWNoIGFzIGAxMDAw" + - "LVMsNTAwMC1NLDEwMDAwMC1ILDUwMDAwMC1ELDEwMDAwMDAtV2AsIGJlY2F1c2UgaW5saW5lIG1v" + - "ZGVsIHNwZWNzIHVzZSBjb21tYXMgYXMgZmllbGQgc2VwYXJhdG9ycy4KCiMjIyBIZWxtIGNoYXJ0" + - "IExMTSBmdW5jdGlvbiB2YXJpYW50CgpMTE0gZnVuY3Rpb24gdHlwZSBpcyBpbmRlcGVuZGVudCBv" + - "ZiB3b3JrbG9hZCBwYWNrYWdpbmcuIEZvciBhIEhlbG0tY2hhcnQgYmFja2VkIExMTSBmdW5jdGlv" + - "biwga2VlcCB0aGUgc2FtZSBgZnVuY3Rpb25UeXBlYCBhbmQgYG1vZGVsc1tdLmxsbUNvbmZpZ2Ag" + - "ZmllbGRzLCB0aGVuIHNldCBgaGVsbUNoYXJ0YCBhbmQgYGhlbG1DaGFydFNlcnZpY2VOYW1lYC4g" + - "VGhlIHNlcnZpY2UgbmFtZSBtdXN0IG1hdGNoIGEgS3ViZXJuZXRlcyBTZXJ2aWNlIHJlbmRlcmVk" + - "IGJ5IHRoZSBjaGFydCwgYW5kIGBpbmZlcmVuY2VQb3J0YCBtdXN0IGJlIHRoYXQgU2VydmljZSBw" + - "b3J0LgoKQmVmb3JlIGNyZWF0aW5nIHRoZSBmdW5jdGlvbiwgY29uZmlybSB0aGUgZXhhY3QgZnVu" + - "Y3Rpb24gbmFtZSBhbmQgbW9kZWwgbmFtZSB3aXRoIHRoZSB1c2VyLiBJZiBlaXRoZXIgdmFsdWUg" + - "aXMgbWlzc2luZywgc3RvcCBhbmQgYXNrLiBEbyBub3QgaW52ZW50IG9yIHN1Ym1pdCBleGFtcGxl" + - "IHZhbHVlcyBmb3IgdGhlc2UgZmllbGRzLgoKYGBganNvbgp7CiAgIm5hbWUiOiAiPGNvbmZpcm1l" + - "ZC1mdW5jdGlvbi1uYW1lPiIsCiAgImluZmVyZW5jZVVybCI6ICIvIiwKICAiaW5mZXJlbmNlUG9y" + - "dCI6IDgwMDAsCiAgImZ1bmN0aW9uVHlwZSI6ICJMTE0iLAogICJoZWFsdGgiOiB7CiAgICAicHJv" + - "dG9jb2wiOiAiSFRUUCIsCiAgICAidXJpIjogIi9oZWFsdGgiLAogICAgInBvcnQiOiA4MDAwLAog" + - "ICAgInRpbWVvdXQiOiAiUFQzMFMiLAogICAgImV4cGVjdGVkU3RhdHVzQ29kZSI6IDIwMAogIH0s" + - "CiAgImhlbG1DaGFydCI6ICJodHRwczovL2hlbG0ubmdjLm52aWRpYS5jb20vZXhhbXBsZS90ZWFt" + - "L2NoYXJ0cy9vcGVuYWktY29tcGF0aWJsZS0wLjEuMC50Z3oiLAogICJoZWxtQ2hhcnRTZXJ2aWNl" + - "TmFtZSI6ICJvcGVuYWktY29tcGF0aWJsZSIsCiAgIm1vZGVscyI6IFsKICAgIHsKICAgICAgIm5h" + - "bWUiOiAiPGNvbmZpcm1lZC1tb2RlbC1uYW1lPiIsCiAgICAgICJsbG1Db25maWciOiB7CiAgICAg" + - "ICAgInVyaXMiOiBbIi92MS9jaGF0L2NvbXBsZXRpb25zIiwgIi92MS9yZXNwb25zZXMiLCAiL3Yx" + - "L2VtYmVkZGluZ3MiXSwKICAgICAgICAicm91dGluZ01ldGhvZCI6ICJyb3VuZF9yb2JpbiIsCiAg" + - "ICAgICAgInRva2VuUmF0ZUxpbWl0IjogIjEwMDAtUyIKICAgICAgfQogICAgfQogIF0KfQpgYGAK" + - "CkVxdWl2YWxlbnQgQ0xJIGZsYWcgZm9ybToKCmBgYHNoCm52Y2YtY2xpIGZ1bmN0aW9uIGNyZWF0" + - "ZSBcCiAgLS1uYW1lPSI8Y29uZmlybWVkLWZ1bmN0aW9uLW5hbWU+IiBcCiAgLS1pbmZlcmVuY2Ut" + - "dXJsPS8gXAogIC0taW5mZXJlbmNlLXBvcnQ9ODAwMCBcCiAgLS1oZWFsdGgtdXJpPS9oZWFsdGgg" + - "XAogIC0taGVhbHRoLXBvcnQ9ODAwMCBcCiAgLS1oZWFsdGgtdGltZW91dD1QVDMwUyBcCiAgLS1o" + - "ZWFsdGgtcHJvdG9jb2w9SFRUUCBcCiAgLS1oZWFsdGgtZXhwZWN0ZWQtc3RhdHVzPTIwMCBcCiAg" + - "LS1mdW5jdGlvbi10eXBlPUxMTSBcCiAgLS1oZWxtLWNoYXJ0PWh0dHBzOi8vaGVsbS5uZ2MubnZp" + - "ZGlhLmNvbS9leGFtcGxlL3RlYW0vY2hhcnRzL29wZW5haS1jb21wYXRpYmxlLTAuMS4wLnRneiBc" + - "CiAgLS1oZWxtLWNoYXJ0LXNlcnZpY2U9b3BlbmFpLWNvbXBhdGlibGUgXAogIC0tbGxtLW1vZGVs" + - "PSduYW1lPTxjb25maXJtZWQtbW9kZWwtbmFtZT4sdXJpcz0vdjEvY2hhdC9jb21wbGV0aW9uc3wv" + - "djEvcmVzcG9uc2VzfC92MS9lbWJlZGRpbmdzLHJvdXRpbmdNZXRob2Q9cm91bmRfcm9iaW4sdG9r" + - "ZW5SYXRlTGltaXQ9MTAwMC1TJwpgYGAKCkRlcGxveSBpcyB1bmNoYW5nZWQuIFB1dCBjaGFydC1z" + - "cGVjaWZpYyB2YWx1ZXMgdW5kZXIgYGRlcGxveW1lbnRTcGVjaWZpY2F0aW9uc1tdLmNvbmZpZ3Vy" + - "YXRpb25gIG9ubHkgd2hlbiB0aGUgY2hhcnQgbmVlZHMgdmFsdWUgb3ZlcnJpZGVzOgoKYGBganNv" + - "bgp7CiAgImZ1bmN0aW9uSWQiOiAiPGZuX2lkPiIsCiAgInZlcnNpb25JZCI6ICI8dmVyX2lkPiIs" + - "CiAgImRlcGxveW1lbnRTcGVjaWZpY2F0aW9ucyI6IFt7CiAgICAiZ3B1IjogIkgxMDAiLAogICAg" + - "Imluc3RhbmNlVHlwZSI6ICJOQ1AuR1BVLkgxMDBfMXgiLAogICAgIm1pbkluc3RhbmNlcyI6IDEs" + - "CiAgICAibWF4SW5zdGFuY2VzIjogMSwKICAgICJtYXhSZXF1ZXN0Q29uY3VycmVuY3kiOiAxMCwK" + - "ICAgICJjb25maWd1cmF0aW9uIjogewogICAgICAic2VydmluZyI6IHsKICAgICAgICAidGVuc29y" + - "UGFyYWxsZWxTaXplIjogMQogICAgICB9CiAgICB9CiAgfV0KfQpgYGAKCkxMTSBHYXRld2F5IHJv" + - "dXRlcyByZXF1ZXN0cyBieSB0aGUgT3BlbkFJIGBtb2RlbGAgdmFsdWUuIFVzZSBgPGZ1bmN0aW9u" + - "LWlkPi88bW9kZWwtbmFtZT5gOiB0aGUgZnVuY3Rpb24gSUQgc2VsZWN0cyB0aGUgTlZDRiBmdW5j" + - "dGlvbiwgYW5kIHRoZSBtb2RlbCBuYW1lIGlzIGZvcndhcmRlZCB0byB0aGUgdXBzdHJlYW0gY29u" + - "dGFpbmVyIHRocm91Z2ggYHN0YXJnYXRlLWNsaWVudGAuCgpTdXBwb3J0ZWQgTExNIHBhdGhzOgoK" + - "fCBQYXRoIHwgTm90ZXMgfAp8IC0tLSB8IC0tLSB8CnwgYC92MS9jaGF0L2NvbXBsZXRpb25zYCB8" + - "IFN1cHBvcnRzIHN0cmVhbWluZyBhbmQgc2Vzc2lvbiBzdGlja2luZXNzLiB8CnwgYC92MS9yZXNw" + - "b25zZXNgIHwgTmF0aXZlIFJlc3BvbnNlcyBwcm94eSBwYXRoOyByZWxheXMgU1NFIGZvciBzdHJl" + - "YW1pbmcgY2xpZW50cyBhbmQgcmV0dXJucyB0ZXJtaW5hbCBKU09OIGZvciBub24tc3RyZWFtaW5n" + - "IGNsaWVudHMuIFN1cHBvcnRzIHNlc3Npb24gc3RpY2tpbmVzcy4gfAp8IGAvdjEvZW1iZWRkaW5n" + - "c2AgfCBBY2NlcHRzIHN0cmluZyBvciBzdHJpbmctYXJyYXkgYGlucHV0YDsgaW5wdXQgbXVzdCBi" + - "ZSBub24tZW1wdHkgYW5kIG1heSBjb250YWluIGF0IG1vc3QgMjA0OCBlbnRyaWVzLiBObyBzZXNz" + - "aW9uIHN0aWNraW5lc3MuIHwKCiMjIDIuIEZ1bmN0aW9uIERFUExPWQoKYGBganNvbgp7CiAgImZ1" + - "bmN0aW9uSWQiOiAiPGZuX2lkPiIsCiAgInZlcnNpb25JZCI6ICI8dmVyX2lkPiIsCiAgImRlcGxv" + - "eW1lbnRTcGVjaWZpY2F0aW9ucyI6IFt7CiAgICAiZ3B1IjogIkgxMDAiLAogICAgImluc3RhbmNl" + - "VHlwZSI6ICJOQ1AuR1BVLkgxMDBfMXgiLAogICAgIm1pbkluc3RhbmNlcyI6IDEsCiAgICAibWF4" + - "SW5zdGFuY2VzIjogMSwKICAgICJtYXhSZXF1ZXN0Q29uY3VycmVuY3kiOiAxMAogIH1dCn0KYGBg" + - "CgpOb3RlOiBgZ3B1YCBpcyB0aGUgR1BVICoqZmFtaWx5KiogKGUuZy4gYEgxMDBgKSwgYGluc3Rh" + - "bmNlVHlwZWAgaXMgdGhlIFNLVSAoZS5nLiBgTkNQLkdQVS5IMTAwXzF4YCkuIE1pc21hdGNoIHJl" + - "dHVybnMgSUNNUyA0MDAgIkludmFsaWQgR1BVIi4KCmBgYHNoCm52Y2YtY2xpIGZ1bmN0aW9uIGRl" + - "cGxveSBjcmVhdGUgLS1pbnB1dC1maWxlPWRlcGxveS1mbi5qc29uCmBgYAoKVGhpcyBjb21tYW5k" + - "ICoqYmxvY2tzKiogdW50aWwgdGhlIGRlcGxveW1lbnQgcmVhY2hlcyBBQ1RJVkUgKGRlZmF1bHQg" + - "OTAwcyB0aW1lb3V0KS4gV2hlbiBpdCByZXR1cm5zIHJjPTAsIGEgZnVuY3Rpb24gcG9kIGlzIHJ1" + - "bm5pbmcgaW4gdGhlIGBudmNmLWJhY2tlbmRgIG5hbWVzcGFjZSBvbiB0aGUgY29tcHV0ZS1wbGFu" + - "ZSBjbHVzdGVyLgoKIyMgMy4gTWludCBhbiBBUEkga2V5IHdpdGggYGludm9rZV9mdW5jdGlvbmAg" + - "c2NvcGUKCmBudmNmLWNsaSBpbml0YCdzIGFkbWluIHRva2VuIGRvZXMgTk9UIGNhcnJ5IHRoZSBg" + - "aW52b2tlX2Z1bmN0aW9uYCBzY29wZSDigJQgaW52b2tlIHdvdWxkIDQwMyB3aXRoICJtaXNzaW5n" + - "IHJlcXVlc3RlZCBhdXRob3JpdGllcyIuIE1pbnQgYW4gQVBJIGtleToKCmBgYHNoCm52Y2YtY2xp" + - "IGFwaS1rZXkgZ2VuZXJhdGUgLS1kZXNjcmlwdGlvbj0iPGNvbmZpcm1lZC1mdW5jdGlvbi1uYW1l" + - "PiBpbnZva2UiIC0tZXhwaXJlcy1pbj0xaAojIOKGkiBBUEkgS2V5OiBudmFwaS1udmNmLXN0Zy0u" + - "Li4KYGBgCgpUaGUga2V5IGlzIGF1dG9tYXRpY2FsbHkgc2F2ZWQgdG8gdGhlIENMSSBzdGF0ZSBm" + - "aWxlIGFuZCB1c2VkIGJ5IHRoZSBuZXh0IGBmdW5jdGlvbiBpbnZva2VgIGNhbGwuICoqRG9uJ3Qg" + - "ZWNobyB0aGUga2V5IGludG8gY2hhdCAvIGxvZ3MqKi4KCiMjIDQuIEZ1bmN0aW9uIElOVk9LRQoK" + - "YGBganNvbgp7CiAgImZ1bmN0aW9uSWQiOiAiPGZuX2lkPiIsCiAgInZlcnNpb25JZCI6ICI8dmVy" + - "X2lkPiIsCiAgInJlcXVlc3RCb2R5IjogeyJtZXNzYWdlIjogImhlbGxvIn0KfQpgYGAKCmBgYHNo" + - "Cm52Y2YtY2xpIGZ1bmN0aW9uIGludm9rZSAtLWlucHV0LWZpbGU9aW52b2tlLWZuLmpzb24KIyDi" + - "hpIgRnVuY3Rpb24gaW52b2NhdGlvbiBjb21wbGV0ZWQhCiMg4oaSIFN0YXR1czogZnVsZmlsbGVk" + - "CiMg4oaSIFJlcXVlc3QgSUQ6IC4uLgpgYGAKCkZvciBhbiBMTE0gZnVuY3Rpb24sIGludm9rZSB0" + - "aGUgT3BlbkFJLWNvbXBhdGlibGUgcm91dGUgYWZ0ZXIgZGVwbG95bWVudDoKCmBgYHNoCmN1cmwg" + - "LXNTIC1YIFBPU1QgImh0dHBzOi8vbGxtLmludm9jYXRpb24uPGRvbWFpbj4vdjEvY2hhdC9jb21w" + - "bGV0aW9ucyIgXAogIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJHtOVkNGX0FQSV9LRVl9IiBc" + - "CiAgLUggIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbiIgXAogIC1kICd7CiAgICAibW9k" + - "ZWwiOiAiPGZuX2lkPi88Y29uZmlybWVkLW1vZGVsLW5hbWU+IiwKICAgICJzdHJlYW0iOiB0cnVl" + - "LAogICAgIm1lc3NhZ2VzIjogWwogICAgICB7CiAgICAgICAgInJvbGUiOiAidXNlciIsCiAgICAg" + - "ICAgImNvbnRlbnQiOiAiSGVsbG8iCiAgICAgIH0KICAgIF0KICB9JwpgYGAKClRoZSBPcGVuQUkg" + - "YG1vZGVsYCB2YWx1ZSBtdXN0IGJlIGA8ZnVuY3Rpb24taWQ+Lzxtb2RlbC1uYW1lPmAgc28gdGhl" + - "IGdhdGV3YXkgY2FuIHNlbGVjdCB0aGUgZnVuY3Rpb24gYW5kIG1vZGVsLgoKUmVzcG9uc2VzIEFQ" + - "SSBleGFtcGxlOgoKYGBgc2gKY3VybCAtc1MgLVggUE9TVCAiaHR0cHM6Ly9sbG0uaW52b2NhdGlv" + - "bi48ZG9tYWluPi92MS9yZXNwb25zZXMiIFwKICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICR7" + - "TlZDRl9BUElfS0VZfSIgXAogIC1IICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24iIFwK" + - "ICAtZCAnewogICAgIm1vZGVsIjogIjxmbl9pZD4vPGNvbmZpcm1lZC1tb2RlbC1uYW1lPiIsCiAg" + - "ICAiaW5wdXQiOiAiV3JpdGUgYSBvbmUgc2VudGVuY2Ugc3VtbWFyeSBvZiBOVkNGLiIKICB9Jwpg" + - "YGAKCkVtYmVkZGluZ3MgZXhhbXBsZToKCmBgYHNoCmN1cmwgLXNTIC1YIFBPU1QgImh0dHBzOi8v" + - "bGxtLmludm9jYXRpb24uPGRvbWFpbj4vdjEvZW1iZWRkaW5ncyIgXAogIC1IICJBdXRob3JpemF0" + - "aW9uOiBCZWFyZXIgJHtOVkNGX0FQSV9LRVl9IiBcCiAgLUggIkNvbnRlbnQtVHlwZTogYXBwbGlj" + - "YXRpb24vanNvbiIgXAogIC1kICd7CiAgICAibW9kZWwiOiAiPGZuX2lkPi88Y29uZmlybWVkLW1v" + - "ZGVsLW5hbWU+IiwKICAgICJpbnB1dCI6ICJOVkNGIGVtYmVkZGluZ3MgY2hlY2siCiAgfScKYGBg" + - "CgpJZiBzdGF0dXMgaXMgYGVycm9yZWRgLCBxdWVyeSBJQ01TIGZvciB0aGUgZGVwbG95bWVudCdz" + - "IHBvZCBsb2dzIChrdWJlY3RsIG9uIHRoZSBjb21wdXRlLXBsYW5lIGNsdXN0ZXIpIGFuZCBzdXJm" + - "YWNlIHRvIHRoZSB1c2VyLgoKIyMgNS4gQ2xlYW51cAoKV2hlbiB0aGUgdXNlciBpcyBkb25lIHdp" + - "dGggdGhlIHNtb2tlIHRlc3Q6CgpgYGBzaApudmNmLWNsaSBmdW5jdGlvbiBkZWxldGUgLS1mdW5j" + - "dGlvbi1pZD08Zm5faWQ+IC0tdmVyc2lvbi1pZD08dmVyX2lkPgpgYGAKCioqQ29uZmlybSB3aXRo" + - "IHRoZSB1c2VyIGJlZm9yZSBkZWxldGluZy4qKiBUaGlzIHJlbW92ZXMgYm90aCB0aGUgZGVwbG95" + - "bWVudCBhbmQgdGhlIGZ1bmN0aW9uIHJlY29yZC4KCiMjIE5vdGVzCgotIERlcGxveSB0aW1lcyBj" + - "YW4gdmFyeSB3aWRlbHkgZGVwZW5kaW5nIG9uIE5BVFMgc3RyZWFtLWluaXQgbGF0ZW5jeSBvbiBj" + - "b2xkLWNsdXN0ZXIgcnVucyAoMS03IG1pbnV0ZXMgb2JzZXJ2ZWQgaW4gZGV2LVZNIHRlc3RzKS4g" + - "QmUgcGF0aWVudDsgZG9uJ3Qga2lsbCB0aGUgYGZ1bmN0aW9uIGRlcGxveSBjcmVhdGVgIGNvbW1h" + - "bmQgZWFybHkuCi0gRm9yIGRpZmZlcmVudCBHUFUgZmFtaWxpZXMsIGNoYW5nZSBib3RoIGBncHVg" + - "IGFuZCBgaW5zdGFuY2VUeXBlYCB0b2dldGhlci4gQ29tbW9uIFNLVXM6IGBOQ1AuR1BVLkgxMDBf" + - "MXhgLCBgTkNQLkdQVS5IMTAwXzJ4YCwgYE5DUC5HUFUuQTEwMF8xeGAuCi0gVGhlIGZ1bmN0aW9u" + - "J3MgY29udGFpbmVyIGltYWdlIG11c3QgYmUgcHVsbGFibGUgZnJvbSB0aGUgY29tcHV0ZS1wbGFu" + - "ZSBjbHVzdGVyJ3MgaW1hZ2UtY3JlZGVudGlhbC1oZWxwZXIgY29uZmlnIChjaGVjayBga3ViZWN0" + - "bCBkZXNjcmliZSBwb2QgLW4gbnZjZi1iYWNrZW5kYCBpZiBwb2RzIGxhbmQgaW4gYEltYWdlUHVs" + - "bEJhY2tPZmZgKS4KUEsHCNJD3AQYJQAAGCUAAFBLAwQUAAgAAAAAACEAAAAAAAAAAAAAAAAAPQAJ" + - "AGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL3Byb21wdHMvZGlhZ25vc2UtZmFpbGVkLWluc3Rh" + - "bGwubWRVVAUAAQCmzhIjIERpYWdub3NlIGEgZmFpbGVkIHNlbGYtaG9zdGVkIE5WQ0YgaW5zdGFs" + - "bAoKVXNlciBzYXlzICJteSBpbnN0YWxsIGZhaWxlZCIgb3IgIlggaXNuJ3Qgd29ya2luZyIuIERv" + - "bid0IGd1ZXNzIOKAlCBxdWVyeSB0aGUgY2x1c3Rlci4KCiMjIDEuIEdldCB0aGUgdmVyZGljdAoK" + - "YGBgc2gKbnZjZi1jbGkgc2VsZi1ob3N0ZWQgc3RhdHVzIC0tanNvbiB8IGpxIC1jIC4KYGBgCgpU" + - "aGUgZmlyc3QgZXZlbnQgaXMgdGhlIHNuYXBzaG90LiBQYXJzZSBgLnZlcmRpY3RgOgoKLSAqKmBo" + - "ZWFsdGh5YCoqIOKAlCBub3RoaW5nJ3Mgd3JvbmcuIEFzayB0aGUgdXNlciB3aGF0IHRoZXkncmUg" + - "YWN0dWFsbHkgc2VlaW5nOyB0aGVpciBwcm9ibGVtIG1heSBiZSBhdCBhIGRpZmZlcmVudCBsYXll" + - "ciAoZnVuY3Rpb24gZGVwbG95LCBuZXR3b3JrLCBldGMuKS4KLSAqKmBkZWdyYWRlZGAqKiDigJQg" + - "YXQgbGVhc3Qgb25lIGNvbXBvbmVudCBub3QgcmVhZHkuIFRoZSBDb21wb25lbnRzIGxpc3Qgd2ls" + - "bCBpZGVudGlmeSB3aGljaC4gTW9zdCBjb21tb246IGBjYXNzYW5kcmFgIFBvZEluaXRpYWxpemlu" + - "ZywgYG9wZW5iYW9gIG5vdCB1bnNlYWxlZCwgYHNpc2AgSW1hZ2VQdWxsQmFja09mZi4KLSAqKmBm" + - "YWlsZWRgKiog4oCUIE5WQ0ZCYWNrZW5kIGBIZWFsdGg9RmFpbGVkYC4gUmVhZCB0aGUgY2x1c3Rl" + - "cidzIE5WQ0ZCYWNrZW5kIHN0YXR1cyBjb25kaXRpb24gbWVzc2FnZS4KLSAqKmB1bmtub3duYCoq" + - "IOKAlCBJQ01TIHVucmVhY2hhYmxlLiBUaGUgY29udHJvbCBwbGFuZSBpdHNlbGYgbWF5IGJlIGRv" + - "d247IGNoZWNrIGBrdWJlY3RsIGdldCBwb2RzIC1uIHNpc2AgZGlyZWN0bHkuCgojIyAyLiBEcmls" + - "bCBpbnRvIHRoZSBmYWlsaW5nIGNvbXBvbmVudAoKRm9yIGVhY2ggbm9uLXJlYWR5IGNvbXBvbmVu" + - "dCwgdGhlIHNuYXBzaG90IGluY2x1ZGVzIGEgYG1lc3NhZ2VgIChlLmcuIGBjYXNzYW5kcmEtMCBQ" + - "b2RJbml0aWFsaXppbmcgNm0yM3NgKS4gQXNrIHRoZSB1c2VyIHRvIHJ1bjoKCmBgYHNoCmt1YmVj" + - "dGwgZGVzY3JpYmUgcG9kIC1uIDxucz4gPHBvZD4Ka3ViZWN0bCBsb2dzIC1uIDxucz4gPHBvZD4g" + - "LS1hbGwtY29udGFpbmVycyAtLXRhaWw9MTAwCmBgYAoKU3VyZmFjZSB0aGUgZXZlbnRzICsgbGFz" + - "dCBsb2cgbGluZXMuIERvbid0IHByb3Bvc2UgYGt1YmVjdGwgZGVsZXRlIHBvZGAgdW5sZXNzIHRo" + - "ZSB1c2VyIGNvbmZpcm1zIOKAlCBDYXNzYW5kcmEgcmVzdGFydCBsb3NlcyBhbnkgaW4tcHJvZ3Jl" + - "c3MgbWlncmF0aW9uLgoKIyMgMy4gQ29tbW9uIHBhdHRlcm5zCgp8IFN5bXB0b20gfCBMaWtlbHkg" + - "Y2F1c2UgfCBSZW1lZGlhdGlvbiB8CnwtLS18LS0tfC0tLXwKfCBgY2Fzc2FuZHJhLTAgUG9kSW5p" + - "dGlhbGl6aW5nYCBmb3IgPjUgbWluIHwgU3RvcmFnZUNsYXNzIG1pc3Npbmcgb3IgUFYgc3R1Y2sg" + - "YFBlbmRpbmdgIHwgYGt1YmVjdGwgZ2V0IHB2LHB2YyAtQWAg4oCUIGNvbmZpcm0gYSBkZWZhdWx0" + - "IFN0b3JhZ2VDbGFzcyBleGlzdHMuIExvY2FsIGRldjogYGt1YmVjdGwgcGF0Y2ggc3RvcmFnZWNs" + - "YXNzIGxvY2FsLXBhdGggLXAgJ3sibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsic3RvcmFnZWNs" + - "YXNzLmt1YmVybmV0ZXMuaW8vaXMtZGVmYXVsdC1jbGFzcyI6InRydWUifX19J2AgfAp8IGBoZWxt" + - "IGluc3RhbGwgLi4uOiB0aW1lZCBvdXQgd2FpdGluZyBmb3IgY2Fzc2FuZHJhIHRvIGJlY29tZSBh" + - "dmFpbGFibGVgIHwgU2FtZSBhcyBhYm92ZSB8IFNhbWUgfAp8IGBHYXRld2F5IEFQSSBDUkRzIG5v" + - "dCBpbnN0YWxsZWRgIChwcmVmbGlnaHQpIHwgTXVsdGktY2x1c3RlciBgbnZjZi1nYXRld2F5LXJv" + - "dXRlc2AgY2hhcnQgbmVlZHMgZW52b3ktZ2F0ZXdheSBwcmVyZXF1aXNpdGUgfCBJbnN0YWxsIGVu" + - "dm95LWdhdGV3YXk6IGBoZWxtIGluc3RhbGwgZWcgb2NpOi8vZG9ja2VyLmlvL2Vudm95cHJveHkv" + - "Z2F0ZXdheS1oZWxtIC0tbmFtZXNwYWNlPWVudm95LWdhdGV3YXktc3lzdGVtIC0tY3JlYXRlLW5h" + - "bWVzcGFjZWAgfAp8IGBObyBjbHVzdGVyIGZvdW5kIHdpdGggdmFsaWQgSldLUyBmb3IgY2x1c3Rl" + - "ciBJRDogPGlkPmAgKE5WQ0EgYWdlbnQpIHwgQ29tcHV0ZSBwbGFuZSdzIFBTQVQgd2FzIGlzc3Vl" + - "ZCBieSBhIEs4cyBzZXJ2ZXIgd2hvc2UgSldLUyBkb2Vzbid0IG1hdGNoIHdoYXQncyBzdG9yZWQg" + - "aW4gSUNNUyB8IFJlLXJlZ2lzdGVyOiBgbnZjZi1jbGkgY2x1c3RlciByb3RhdGUgLS1jbHVzdGVy" + - "LWlkPTxpZD5gIGZyb20gYSBjb250ZXh0IHRoYXQgY2FuIHJlYWNoIHRoZSBjb21wdXRlIHBsYW5l" + - "J3MgSzhzIEFQSSB8CnwgYFNpZ25lZCBKV1QgcmVqZWN0ZWQ6IEFub3RoZXIgYWxnb3JpdGhtIGV4" + - "cGVjdGVkLCBvciBubyBtYXRjaGluZyBrZXkocykgZm91bmRgIChpbml0IC8gY2x1c3RlciByZWdp" + - "c3RlcikgfCBTdGFsZSBzZXNzaW9uLmpzb24gZnJvbSBhIGRpZmZlcmVudCBjb250cm9sIHBsYW5l" + - "IHwgYHJtIH4vLm52Y2YtY2xpLnN0YXRlYCB0aGVuIGBudmNmLWNsaSBpbml0YCBhZ2FpbiB8Cnwg" + - "YG52Y2Etb3BlcmF0b3JgIEltYWdlUHVsbEJhY2tPZmYgZm9yIGBudmNhLW9wZXJhdG9yOnBzYXRg" + - "IHwgSW1hZ2Ugbm90IGluIGNsdXN0ZXIgKG11bHRpLWNsdXN0ZXIgdG9wb2xvZ3kgYnVpbGRzIGl0" + - "IGxvY2FsbHkpIHwgYGszZCBpbWFnZSBpbXBvcnQgbnZjci5pby8uLi4vbnZjYS1vcGVyYXRvcjpw" + - "c2F0IC1jIDxjbHVzdGVyPmAgKG9yIHdoYXRldmVyIHlvdXIgaW1hZ2UgcHVzaCBwYXRoIGlzKSB8" + - "CnwgYHJlcXVpcmVkRW52ICJOQ0FfSUQiIGlzIG5vdCBzZXRgIChoZWxtZmlsZSBlcnJvcikgfCBP" + - "bGRlciBudmNmLWNsaTsgdGhlIGVudiBwcm9wYWdhdGlvbiBmaXggbGFuZGVkIGluIE0rNSBmb2xs" + - "b3ctdXBzIHwgVXBncmFkZSBgbnZjZi1jbGlgIHRvIGEgdmVyc2lvbiBhZnRlciBgNmFhNTcwNGAg" + - "fAoKIyMgNC4gV2hlbiB0aGUgdXNlciB3YW50cyB0byBzdGFydCBvdmVyCgpJZiB0aGV5IGNvbmZp" + - "cm0gYSB0ZWFyZG93bjoKCi0gU2luZ2xlLWNsdXN0ZXI6IGBjZCBudmNmLXNlbGYtbWFuYWdlZC1z" + - "dGFjayAmJiBtYWtlIGRlc3Ryb3lgIChvciBgaGVsbSB1bmluc3RhbGxgIHBlciByZWxlYXNlIGlu" + - "IHJldmVyc2Ugb3JkZXIpLgotIE11bHRpLWNsdXN0ZXI6IGBoZWxtIHVuaW5zdGFsbCBudmNhLW9w" + - "ZXJhdG9yIC1uIG52Y2Etb3BlcmF0b3JgIG9uIHRoZSBjb21wdXRlIHBsYW5lIEZJUlNUOyB0aGVu" + - "IGNvbnRyb2wgcGxhbmU7IHRoZW4gYG52Y2YtY2xpIGNsdXN0ZXIgZGVsZXRlIC0tY2x1c3Rlci1p" + - "ZD08aWQ+YCB0byByZW1vdmUgdGhlIElDTVMgcm93LgoKQWx3YXlzIGNvbmZpcm0gYmVmb3JlIGFu" + - "eSB0ZWFyZG93biDigJQgQ2Fzc2FuZHJhIFN0YXRlZnVsU2V0IFBWQyBkZWxldGlvbiBpcyBkZXN0" + - "cnVjdGl2ZSBhbmQgbG9zZXMgY2x1c3Rlcl9vaWRjIHJvd3MuCgojIyBXaGF0IG5vdCB0byBkbwoK" + - "LSAqKkRvbid0IHByb3Bvc2UgYC0tZGVidWdgIGFzIGEgZml4LioqIEl0J3MgZGlhZ25vc3RpYyBv" + - "bmx5LgotICoqRG9uJ3QgcHJvcG9zZSBgaGVsbSB1bmluc3RhbGxgKiogdW5sZXNzIHRoZSB1c2Vy" + - "IGV4cGxpY2l0bHkgYXNrZWQgdG8gc3RhcnQgb3Zlci4KLSAqKkRvbid0IHByb3Bvc2UgYGt1YmVj" + - "dGwgZGVsZXRlIHB2Y2AqKiBldmVyIHdpdGhvdXQgY29uZmlybWF0aW9uIOKAlCBpdCBkZWxldGVz" + - "IHRoZSB1bmRlcmx5aW5nIFBWLgotICoqRG9uJ3QgcmUtcnVuIGB1cGAgd2l0aCBkaWZmZXJlbnQg" + - "aW5wdXRzKiogdG8gInNlZSB3aGF0IGhhcHBlbnMiLiBEaWFnbm9zZSB3aXRoIGBzdGF0dXNgIC8g" + - "YGt1YmVjdGwgZGVzY3JpYmVgIGZpcnN0LgpQSwcIcpIsJr4OAAC+DgAAUEsDBBQACAAAAAAAIQAA" + - "AAAAAAAAAAAAAAA6AAkAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1jbGkvcHJvbXB0cy9pbnN0YWxs" + - "LWZyb20tc2NyYXRjaC5tZFVUBQABAKbOEiMgSW5zdGFsbCBzZWxmLWhvc3RlZCBOVkNGIGZyb20g" + - "c2NyYXRjaAoKVXNlciB3YW50cyB0byBicmluZyB1cCBzZWxmLWhvc3RlZCBOVkNGIG9uIGEgZnJl" + - "c2ggS3ViZXJuZXRlcyBjbHVzdGVyIChvciBrM2QgZm9yIGxvY2FsIGRldikuIFRoaXMgaXMgdGhl" + - "IG1vc3QgY29tbW9uIGVudHJ5cG9pbnQuCgojIyBTdGVwcwoKMS4gQ29uZmlybSB0aGUgdG9wb2xv" + - "Z3kuIEFzayB0aGUgdXNlcjoKICAgLSAiU2luZ2xlLWNsdXN0ZXIgKGNvbnRyb2wgcGxhbmUgYW5k" + - "IGNvbXB1dGUgcGxhbmUgb24gb25lIGNsdXN0ZXIsIHNpbXBsZXIpIG9yIHNwbGl0IChjb250cm9s" + - "IHBsYW5lIG9uIGNsdXN0ZXIgQSwgY29tcHV0ZSBwbGFuZSBvbiBjbHVzdGVyIEIsIHByb2R1Y3Rp" + - "b24tc2hhcGVkKT8iCiAgIC0gIldoYXQncyB0aGUgY2x1c3RlciBuYW1lICh0aGUgYC0tY2x1c3Rl" + - "ci1uYW1lYCBmbGFnLCBiZWNvbWVzIHRoZSBJQ01TIHJvdyBpZGVudGlmaWVyKT8gRXhhbXBsZXM6" + - "IGBuY3AtbG9jYWxgIGZvciBsb2NhbCBkZXYsIGBwcm9kLXVzLWVhc3QtMWAgZm9yIHByb2R1Y3Rp" + - "b24uIgogICAtIEZvciBzcGxpdDogIkNvbnRyb2wtcGxhbmUga3ViZWNvbmZpZyBjb250ZXh0IG5h" + - "bWU/IENvbXB1dGUtcGxhbmUgY29udGV4dD8gUHVibGljIElDTVMgVVJMPyIKCjIuIFByZXBhcmUg" + - "cmVtb3RlIEdhdGV3YXkgYW5kIENMSSBjb25maWcgaWYgdGhpcyBpcyBub3QgbG9jYWwgazNkLiBP" + - "bmUtY2xpY2sKICAgYXBwbGllcyB0aGUgY29udHJvbCBwbGFuZSwgdGhlbiBpbW1lZGlhdGVseSBj" + - "YWxscyBBUEksIEFQSSBLZXlzLCBpbnZvY2F0aW9uLAogICBhbmQgZ1JQQyBlbmRwb2ludHMuIEZv" + - "ciByZW1vdGUgY2x1c3RlcnMsIHRoZSBHYXRld2F5IG11c3QgYmUgcHJvZ3JhbW1lZCBhbmQKICAg" + - "dGhlIENMSSBjb25maWcgbXVzdCBwb2ludCBhdCB0aGUgR2F0ZXdheSBsb2FkIGJhbGFuY2VyIGJl" + - "Zm9yZSBgdXBgIHJ1bnMuCgogICBJZiBHYXRld2F5IEFQSSBpbmdyZXNzIGlzIG5vdCBhbHJlYWR5" + - "IHByZXNlbnQsIGNyZWF0ZSBpdCBmaXJzdC4gVGhlc2UgYXJlIHRoZQogICBzaGFyZWQgR2F0ZXdh" + - "eSBzZXR1cCBzdGVwcyB1c2VkIGJ5IG9uZS1jbGljaywgSGVsbWZpbGUsIGFuZCBzdGFuZGFsb25l" + - "IGNoYXJ0CiAgIGluc3RhbGwgcGF0aHM6CgogICBgYGBzaAogICBrdWJlY3RsIGFwcGx5IC1mIGh0" + - "dHBzOi8vZ2l0aHViLmNvbS9rdWJlcm5ldGVzLXNpZ3MvZ2F0ZXdheS1hcGkvcmVsZWFzZXMvZG93" + - "bmxvYWQvdjEuMi4wL2V4cGVyaW1lbnRhbC1pbnN0YWxsLnlhbWwKCiAgIGZvciBuYW1lc3BhY2Ug" + - "aW4gZW52b3ktZ2F0ZXdheS1zeXN0ZW0gZW52b3ktZ2F0ZXdheSBhcGkta2V5cyBlc3Mgc2lzIG52" + - "Y2Y7IGRvCiAgICAga3ViZWN0bCBjcmVhdGUgbmFtZXNwYWNlICIkbmFtZXNwYWNlIiAtLWRyeS1y" + - "dW49Y2xpZW50IC1vIHlhbWwgfCBrdWJlY3RsIGFwcGx5IC1mIC0KICAgZG9uZQoKICAgZm9yIG5h" + - "bWVzcGFjZSBpbiBlbnZveS1nYXRld2F5IGFwaS1rZXlzIGVzcyBzaXMgbnZjZjsgZG8KICAgICBr" + - "dWJlY3RsIGxhYmVsIG5hbWVzcGFjZSAiJG5hbWVzcGFjZSIgbnZjZi9wbGF0Zm9ybT10cnVlIC0t" + - "b3ZlcndyaXRlCiAgIGRvbmUKCiAgIGhlbG0gdXBncmFkZSAtLWluc3RhbGwgZWcgb2NpOi8vZG9j" + - "a2VyLmlvL2Vudm95cHJveHkvZ2F0ZXdheS1oZWxtIFwKICAgICAtLXZlcnNpb24gdjEuMS4zIFwK" + - "ICAgICAtbiBlbnZveS1nYXRld2F5LXN5c3RlbQogICBgYGAKCiAgIEJlZm9yZSBhcHBseWluZyB0" + - "aGUgYEVudm95UHJveHlgLCBkZXRlcm1pbmUgd2hpY2ggU2VydmljZSBjb250cm9sbGVyIG93bnMK" + - "ICAgbG9hZCBiYWxhbmNlcnMgb24gRUtTLiBEbyBub3QgYXBwbHkgdGhlIG1hbmlmZXN0IHVudGls" + - "IHlvdSBoYXZlIHNlbGVjdGVkIHRoZQogICBtYXRjaGluZyBgZW52b3lTZXJ2aWNlYCBjb25maWd1" + - "cmF0aW9uLiBVc2UgdGhlIEVLUyBBUEkgYW5kIHRoZSBpbi1jbHVzdGVyCiAgIGNvbnRyb2xsZXIg" + - "RGVwbG95bWVudCBpbnN0ZWFkIG9mIGd1ZXNzaW5nIGZyb20gdGhlIGNsdXN0ZXIgYWdlIG9yIGV4" + - "aXN0aW5nCiAgIFNlcnZpY2VzOgoKICAgYGBgc2gKICAgZXhwb3J0IEVLU19DTFVTVEVSX05BTUU9" + - "IjxjbHVzdGVyLW5hbWU+IgoKICAgYXdzIGVrcyBkZXNjcmliZS1jbHVzdGVyIC0tbmFtZSAiJEVL" + - "U19DTFVTVEVSX05BTUUiIFwKICAgICAtLXF1ZXJ5ICdjbHVzdGVyLmt1YmVybmV0ZXNOZXR3b3Jr" + - "Q29uZmlnLmVsYXN0aWNMb2FkQmFsYW5jaW5nLmVuYWJsZWQnIFwKICAgICAtLW91dHB1dCB0ZXh0" + - "CiAgIGt1YmVjdGwgLW4ga3ViZS1zeXN0ZW0gZ2V0IGRlcGxveW1lbnQgYXdzLWxvYWQtYmFsYW5j" + - "ZXItY29udHJvbGxlcgogICBgYGAKCiAgIEFuIEVLUyBBUEkgcmVzdWx0IG9mIGBUcnVlYCBzZWxl" + - "Y3RzCiAgIFtFS1MgQXV0byBNb2RlXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZWtzL2xh" + - "dGVzdC91c2VyZ3VpZGUvYXV0by1jb25maWd1cmUtbmxiLmh0bWwpLgogICBPdGhlcndpc2UsIGEg" + - "c3VjY2Vzc2Z1bCBEZXBsb3ltZW50IGxvb2t1cCBzZWxlY3RzIHRoZSBBV1MgTG9hZCBCYWxhbmNl" + - "cgogICBDb250cm9sbGVyLiBJZiBuZWl0aGVyIGlzIHByZXNlbnQsIGNvbmZpcm0gdGhhdCB0aGUg" + - "Y2x1c3RlciBpbnRlbnRpb25hbGx5CiAgIHVzZXMgdGhlIGxlZ2FjeSBBV1MgY2xvdWQgcHJvdmlk" + - "ZXIgU2VydmljZSBjb250cm9sbGVyLCBvciBpbnN0YWxsIHRoZSBBV1MKICAgTG9hZCBCYWxhbmNl" + - "ciBDb250cm9sbGVyLCBiZWZvcmUgYXBwbHlpbmcgdGhlIGV4YW1wbGUuCgogICBUaGUgYXBwbGll" + - "ZCBtYW5pZmVzdCBiZWxvdyBpcyBmb3IgdGhlIEFXUyBMb2FkIEJhbGFuY2VyIENvbnRyb2xsZXIu" + - "IEZvciBFS1MKICAgQXV0byBNb2RlLCByZXBsYWNlIGl0cyBgZW52b3lTZXJ2aWNlYCBtYXAgYmVm" + - "b3JlIGFwcGx5aW5nIGl0IHdpdGg6CgogICBgYGB5YW1sCiAgIGVudm95U2VydmljZToKICAgICBs" + - "b2FkQmFsYW5jZXJDbGFzczogZWtzLmFtYXpvbmF3cy5jb20vbmxiCiAgICAgYW5ub3RhdGlvbnM6" + - "CiAgICAgICBzZXJ2aWNlLmJldGEua3ViZXJuZXRlcy5pby9hd3MtbG9hZC1iYWxhbmNlci1zY2hl" + - "bWU6ICJpbnRlcm5ldC1mYWNpbmciCiAgIGBgYAoKICAgRm9yIHRoZSBsZWdhY3kgQVdTIGNsb3Vk" + - "IHByb3ZpZGVyIFNlcnZpY2UgY29udHJvbGxlciwgcmVwbGFjZSB0aGUgbWFwIHdpdGg6CgogICBg" + - "YGB5YW1sCiAgIGVudm95U2VydmljZToKICAgICBhbm5vdGF0aW9uczoKICAgICAgIHNlcnZpY2Uu" + - "YmV0YS5rdWJlcm5ldGVzLmlvL2F3cy1sb2FkLWJhbGFuY2VyLXR5cGU6ICJubGIiCiAgIGBgYAoK" + - "ICAgVGhlIGxlZ2FjeSBjb250cm9sbGVyIGNyZWF0ZXMgYW4gaW50ZXJuZXQtZmFjaW5nIGxvYWQg" + - "YmFsYW5jZXIgYnkgZGVmYXVsdC4KICAgRG8gbm90IGNvbWJpbmUgdGhlIGxlZ2FjeSBgbmxiYCBz" + - "ZWxlY3RvciB3aXRoIHRoZSBBV1MgTG9hZCBCYWxhbmNlcgogICBDb250cm9sbGVyIHRhcmdldCB0" + - "eXBlIGFuZCBzY2hlbWUgYW5ub3RhdGlvbnMuIEl0IHN1cHBvcnRzIGFuIE5MQiBTZXJ2aWNlCiAg" + - "IHdob3NlIHBvcnRzIHVzZSBvbmx5IFRDUCBvciBvbmx5IFVEUCwgYnV0IHJlamVjdHMgb25lIFNl" + - "cnZpY2UgdGhhdCBjb21iaW5lcwogICBUQ1AgYW5kIFVEUCBwb3J0cy4gVXNlIHRoZSBBV1MgTG9h" + - "ZCBCYWxhbmNlciBDb250cm9sbGVyIHdoZW4gdGhlIGdlbmVyYXRlZAogICBFbnZveSBTZXJ2aWNl" + - "IGNvbWJpbmVzIHByb3RvY29scy4gT24gbm9uLUFXUyBjbHVzdGVycywgcmVwbGFjZSB0aGUgbWFw" + - "IHdpdGgKICAgdGhlIHByb3ZpZGVyJ3MgU2VydmljZSBjb25maWd1cmF0aW9uIGJlZm9yZSBhcHBs" + - "eWluZyBpdC4KCiAgIGBgYHNoCiAgICMgTm9uLUVLUy1BdXRvLU1vZGUgZXhhbXBsZTogdXNlIEFX" + - "UyBMQkMgd2l0aCBpbnN0YW5jZSB0YXJnZXRzLgogICBrdWJlY3RsIGFwcGx5IC1mIC0gPDxFT0YK" + - "ICAgYXBpVmVyc2lvbjogZ2F0ZXdheS5lbnZveXByb3h5LmlvL3YxYWxwaGExCiAgIGtpbmQ6IEVu" + - "dm95UHJveHkKICAgbWV0YWRhdGE6CiAgICAgbmFtZTogZWcKICAgICBuYW1lc3BhY2U6IGVudm95" + - "LWdhdGV3YXktc3lzdGVtCiAgIHNwZWM6CiAgICAgcHJvdmlkZXI6CiAgICAgICB0eXBlOiBLdWJl" + - "cm5ldGVzCiAgICAgICBrdWJlcm5ldGVzOgogICAgICAgICBlbnZveVNlcnZpY2U6CiAgICAgICAg" + - "ICAgYW5ub3RhdGlvbnM6CiAgICAgICAgICAgICBzZXJ2aWNlLmJldGEua3ViZXJuZXRlcy5pby9h" + - "d3MtbG9hZC1iYWxhbmNlci10eXBlOiAiZXh0ZXJuYWwiCiAgICAgICAgICAgICBzZXJ2aWNlLmJl" + - "dGEua3ViZXJuZXRlcy5pby9hd3MtbG9hZC1iYWxhbmNlci1ubGItdGFyZ2V0LXR5cGU6ICJpbnN0" + - "YW5jZSIKICAgICAgICAgICAgIHNlcnZpY2UuYmV0YS5rdWJlcm5ldGVzLmlvL2F3cy1sb2FkLWJh" + - "bGFuY2VyLXNjaGVtZTogImludGVybmV0LWZhY2luZyIKICAgLS0tCiAgIGFwaVZlcnNpb246IGdh" + - "dGV3YXkubmV0d29ya2luZy5rOHMuaW8vdjEKICAga2luZDogR2F0ZXdheUNsYXNzCiAgIG1ldGFk" + - "YXRhOgogICAgIG5hbWU6IGVnCiAgIHNwZWM6CiAgICAgY29udHJvbGxlck5hbWU6IGdhdGV3YXku" + - "ZW52b3lwcm94eS5pby9nYXRld2F5Y2xhc3MtY29udHJvbGxlcgogICAgIHBhcmFtZXRlcnNSZWY6" + - "CiAgICAgICBncm91cDogZ2F0ZXdheS5lbnZveXByb3h5LmlvCiAgICAgICBraW5kOiBFbnZveVBy" + - "b3h5CiAgICAgICBuYW1lOiBlZwogICAgICAgbmFtZXNwYWNlOiBlbnZveS1nYXRld2F5LXN5c3Rl" + - "bQogICBFT0YKCiAgIGt1YmVjdGwgYXBwbHkgLWYgLSA8PEVPRgogICBhcGlWZXJzaW9uOiBnYXRl" + - "d2F5Lm5ldHdvcmtpbmcuazhzLmlvL3YxCiAgIGtpbmQ6IEdhdGV3YXkKICAgbWV0YWRhdGE6CiAg" + - "ICAgbmFtZTogbnZjZi1nYXRld2F5CiAgICAgbmFtZXNwYWNlOiBlbnZveS1nYXRld2F5CiAgIHNw" + - "ZWM6CiAgICAgZ2F0ZXdheUNsYXNzTmFtZTogZWcKICAgICBsaXN0ZW5lcnM6CiAgICAgLSBuYW1l" + - "OiBodHRwCiAgICAgICBwcm90b2NvbDogSFRUUAogICAgICAgcG9ydDogODAKICAgICAgIGFsbG93" + - "ZWRSb3V0ZXM6CiAgICAgICAgIG5hbWVzcGFjZXM6CiAgICAgICAgICAgZnJvbTogU2VsZWN0b3IK" + - "ICAgICAgICAgICBzZWxlY3RvcjoKICAgICAgICAgICAgIG1hdGNoTGFiZWxzOgogICAgICAgICAg" + - "ICAgICBudmNmL3BsYXRmb3JtOiAidHJ1ZSIKICAgICAtIG5hbWU6IHRjcAogICAgICAgcHJvdG9j" + - "b2w6IFRDUAogICAgICAgcG9ydDogMTAwODEKICAgICAgIGFsbG93ZWRSb3V0ZXM6CiAgICAgICAg" + - "IG5hbWVzcGFjZXM6CiAgICAgICAgICAgZnJvbTogU2VsZWN0b3IKICAgICAgICAgICBzZWxlY3Rv" + - "cjoKICAgICAgICAgICAgIG1hdGNoTGFiZWxzOgogICAgICAgICAgICAgICBudmNmL3BsYXRmb3Jt" + - "OiAidHJ1ZSIKICAgRU9GCiAgIGBgYAoKICAgU2VydmljZSBhbm5vdGF0aW9ucyBtdXN0IGJlIHVu" + - "ZGVyCiAgIGBFbnZveVByb3h5LnNwZWMucHJvdmlkZXIua3ViZXJuZXRlcy5lbnZveVNlcnZpY2Uu" + - "YW5ub3RhdGlvbnNgLiBFbnZveSBHYXRld2F5CiAgIGNvcGllcyB0aGVtIHRvIHRoZSBnZW5lcmF0" + - "ZWQgRW52b3kgU2VydmljZS4gRG8gbm90IHB1dCBTZXJ2aWNlIGFubm90YXRpb25zCiAgIG9uIHRo" + - "ZSBgR2F0ZXdheWAgcmVzb3VyY2UuCgogICBDYXB0dXJlIHRoZSBHYXRld2F5IHZhbHVlcyBhbmQg" + - "d3JpdGUgdGhlIENMSSBjb25maWc6CgogICBgYGBzaAogICBleHBvcnQgQ0xVU1RFUl9OQU1FPSJu" + - "dmNmLXJlbW90ZSIKICAgZXhwb3J0IE5DQV9JRD0ibnZjZi1kZWZhdWx0IgogICBleHBvcnQgUkVH" + - "SU9OPSJ1cy13ZXN0LTEiCiAgIGV4cG9ydCBIVFRQX0dBVEVXQVlfTkFNRVNQQUNFPSJlbnZveS1n" + - "YXRld2F5IgogICBleHBvcnQgSFRUUF9HQVRFV0FZX05BTUU9Im52Y2YtZ2F0ZXdheSIKICAgZXhw" + - "b3J0IEdSUENfR0FURVdBWV9OQU1FU1BBQ0U9ImVudm95LWdhdGV3YXkiCiAgIGV4cG9ydCBHUlBD" + - "X0dBVEVXQVlfTkFNRT0ibnZjZi1nYXRld2F5IgoKICAga3ViZWN0bCAtbiAiJEhUVFBfR0FURVdB" + - "WV9OQU1FU1BBQ0UiIHdhaXQgImdhdGV3YXkvJEhUVFBfR0FURVdBWV9OQU1FIiBcCiAgICAgLS1m" + - "b3I9Y29uZGl0aW9uPVByb2dyYW1tZWQ9VHJ1ZSAtLXRpbWVvdXQ9MTBtCiAgIGt1YmVjdGwgLW4g" + - "IiRHUlBDX0dBVEVXQVlfTkFNRVNQQUNFIiB3YWl0ICJnYXRld2F5LyRHUlBDX0dBVEVXQVlfTkFN" + - "RSIgXAogICAgIC0tZm9yPWNvbmRpdGlvbj1Qcm9ncmFtbWVkPVRydWUgLS10aW1lb3V0PTEwbQoK" + - "ICAgZXhwb3J0IEdBVEVXQVlfQUREUj0iJChrdWJlY3RsIC1uICIkSFRUUF9HQVRFV0FZX05BTUVT" + - "UEFDRSIgZ2V0ICJnYXRld2F5LyRIVFRQX0dBVEVXQVlfTkFNRSIgXAogICAgIC1vIGpzb25wYXRo" + - "PSd7LnN0YXR1cy5hZGRyZXNzZXNbMF0udmFsdWV9JykiCiAgIGV4cG9ydCBHUlBDX0dBVEVXQVlf" + - "QUREUj0iJChrdWJlY3RsIC1uICIkR1JQQ19HQVRFV0FZX05BTUVTUEFDRSIgZ2V0ICJnYXRld2F5" + - "LyRHUlBDX0dBVEVXQVlfTkFNRSIgXAogICAgIC1vIGpzb25wYXRoPSd7LnN0YXR1cy5hZGRyZXNz" + - "ZXNbMF0udmFsdWV9JykiCiAgIHRlc3QgLW4gIiRHQVRFV0FZX0FERFIiIHx8IGV4aXQgMQogICB0" + - "ZXN0IC1uICIkR1JQQ19HQVRFV0FZX0FERFIiIHx8IGV4aXQgMQogICBleHBvcnQgU1RBQ0tfRE9N" + - "QUlOPSIkR0FURVdBWV9BRERSIgogICBgYGAKCiAgIFNldCBgU1RBQ0tfRE9NQUlOYCB0byB0aGUg" + - "aG9zdG5hbWUgc3VmZml4IHVzZWQgYnkgdGhlIGluc3RhbGxlZCBIVFRQUm91dGVzLgogICBGb3Ig" + - "cmVtb3RlIHRlc3QgZmxvd3Mgd2l0aG91dCBwcm9kdWN0aW9uIEROUywgdXNlIHRoZSBHYXRld2F5" + - "IGxvYWQgYmFsYW5jZXIKICAgYWRkcmVzcy4KCiAgIGBgYHNoCiAgIGNhdCA+IC5udmNmLWNsaS55" + - "YW1sIDw8RU9GCiAgIGJhc2VfaHR0cF91cmw6ICJodHRwOi8vJHtHQVRFV0FZX0FERFJ9IgogICBp" + - "bnZva2VfdXJsOiAiaHR0cDovLyR7R0FURVdBWV9BRERSfSIKICAgYmFzZV9ncnBjX3VybDogIiR7" + - "R1JQQ19HQVRFV0FZX0FERFJ9OjEwMDgxIgogICBhcGlfa2V5c19zZXJ2aWNlX3VybDogImh0dHA6" + - "Ly8ke0dBVEVXQVlfQUREUn0iCgogICBhcGlfa2V5c19ob3N0OiAiYXBpLWtleXMuJHtTVEFDS19E" + - "T01BSU59IgogICBhcGlfaG9zdDogImFwaS4ke1NUQUNLX0RPTUFJTn0iCiAgIGludm9rZV9ob3N0" + - "OiAiaW52b2NhdGlvbi4ke1NUQUNLX0RPTUFJTn0iCgogICBhcGlfa2V5c19zZXJ2aWNlX2lkOiAi" + - "bnZpZGlhLWNsb3VkLWZ1bmN0aW9ucy1uY3Atc2VydmljZS1pZC1ha2V0bSIKICAgYXBpX2tleXNf" + - "aXNzdWVyX3NlcnZpY2U6ICJudmNmLWFwaSIKICAgYXBpX2tleXNfb3duZXJfaWQ6ICJzdmNAbnZj" + - "Zi1hcGkubG9jYWwiCgogICBjbGllbnRfaWQ6ICIke05DQV9JRH0iCiAgIEVPRgogICBgYGAKCjMu" + - "IFJ1biBwcmUtZmxpZ2h0LiBDaG9vc2UgdGhlIGZsYXZvciBtYXRjaGluZyB0aGUgdG9wb2xvZ3k6" + - "CgogICBgYGBzaAogICAjIFNpbmdsZS1jbHVzdGVyCiAgIG52Y2YtY2xpIHNlbGYtaG9zdGVkIGNo" + - "ZWNrIC0tcHJlIC0tanNvbiB8IGpxIC1jIC4KCiAgICMgU3BsaXQKICAgbnZjZi1jbGkgc2VsZi1o" + - "b3N0ZWQgY2hlY2sgLS1wcmUgXAogICAgIC0tY29udHJvbC1wbGFuZS1jb250ZXh0PWFkbWluQGNw" + - "IFwKICAgICAtLWNvbXB1dGUtcGxhbmUtY29udGV4dD1hZG1pbkBncHUxIFwKICAgICAtLWpzb24g" + - "fCBqcSAtYyAuCgogICAjIENvbXB1dGUtb25seSAob3BlcmF0b3Igd2l0aCBrdWJlY3RsIG9uIGNv" + - "bXB1dGUgcGxhbmUgb25seSkKICAgbnZjZi1jbGkgc2VsZi1ob3N0ZWQgY2hlY2sgLS1wcmUgXAog" + - "ICAgIC0tY29tcHV0ZS1wbGFuZS1jb250ZXh0PWFkbWluQGdwdTEgXAogICAgIC0taWNtcy11cmw9" + - "aHR0cHM6Ly9pY21zLm52Y2YuZXhhbXBsZS5jb20gXAogICAgIC0tanNvbiB8IGpxIC1jIC4KICAg" + - "YGBgCgogICBQYXJzZSB0aGUgSlNPTkwgc3RyZWFtLiBJZiBhbnkgY2hlY2sgZmFpbHMgKGAicGFz" + - "c2VkIjpmYWxzZWApIHdpdGggYHNldmVyaXR5OiBlcnJvcmAsIHN1cmZhY2UgYG1lc3NhZ2VgICsg" + - "YGhpbnRVUkxgIHRvIHRoZSB1c2VyIGFuZCBzdG9wLiBEb24ndCBwcm9jZWVkIHRvIGluc3RhbGwg" + - "d2l0aCBicm9rZW4gcHJlcmVxcy4KCjQuIE1pbnQgYW4gYWRtaW4gdG9rZW4gaWYgbmVlZGVkLiBg" + - "bnZjZi1jbGkgaW5pdGAgaXMgaWRlbXBvdGVudC4gQ2FsbCBpdCBpZiB0aGUKICAgdXNlciBkb2Vz" + - "IG5vdCBoYXZlIGEgc2Vzc2lvbiB5ZXQuIEluaXQgdGFsa3MgdG8gQVBJIEtleXMgdGhyb3VnaCB0" + - "aGUgcHVibGljCiAgIEFQSSBnYXRld2F5LCBzbyBpdCBhbHNvIHdvcmtzIGluIGNvbXB1dGUtb25s" + - "eSBtb2RlLgoKNS4gUnVuIGB1cGAuIFVzZSBgLS1qc29uYCBmb3IgdGhlIEpTT05MIGV2ZW50IHN0" + - "cmVhbToKCiAgIGBgYHNoCiAgIG52Y2YtY2xpIHNlbGYtaG9zdGVkIHVwIFwKICAgICAtLWNsdXN0" + - "ZXItbmFtZT0iJHtDTFVTVEVSX05BTUV9IiBcCiAgICAgLS1uY2EtaWQ9IiR7TkNBX0lEfSIgXAog" + - "ICAgIC0tcmVnaW9uPSIke1JFR0lPTn0iIFwKICAgICAtLWpzb24KICAgYGBgCgogICBGb3Igc3Bs" + - "aXQtY2x1c3RlciBpbnN0YWxscywgYWRkIGJvdGggY29udGV4dCBmbGFnczoKCiAgIGBgYHNoCiAg" + - "IGV4cG9ydCBDT05UUk9MX1BMQU5FX0NPTlRFWFQ9ImFkbWluQGNvbnRyb2wtcGxhbmUiCiAgIGV4" + - "cG9ydCBDT01QVVRFX1BMQU5FX0NPTlRFWFQ9ImFkbWluQGdwdS1jbHVzdGVyIgoKICAgbnZjZi1j" + - "bGkgc2VsZi1ob3N0ZWQgdXAgXAogICAgIC0tY29udHJvbC1wbGFuZS1jb250ZXh0PSIke0NPTlRS" + - "T0xfUExBTkVfQ09OVEVYVH0iIFwKICAgICAtLWNvbXB1dGUtcGxhbmUtY29udGV4dD0iJHtDT01Q" + - "VVRFX1BMQU5FX0NPTlRFWFR9IiBcCiAgICAgLS1jbHVzdGVyLW5hbWU9IiR7Q0xVU1RFUl9OQU1F" + - "fSIgXAogICAgIC0tbmNhLWlkPSIke05DQV9JRH0iIFwKICAgICAtLXJlZ2lvbj0iJHtSRUdJT059" + - "IiBcCiAgICAgLS1qc29uCiAgIGBgYAoKICAgUGFyc2UgZXZlbnRzOgogICAtIGBwaGFzZV9zdGFy" + - "dGVkYCAvIGBwaGFzZV9jb21wbGV0ZWRgOiBsb2cgcHJvZ3Jlc3MKICAgLSBgcGhhc2VfcHJvZ3Jl" + - "c3NgOiBzaG93IHByb2dyZXNzIGZvciB0aGUgbG9uZyBhcHBseSBwaGFzZXMgKHJlc291cmNlIGNv" + - "dW50cykKICAgLSBgd2FpdGluZ2A6IHN1cmZhY2UgdG8gdGhlIHVzZXIgaWYgaXQgcGVyc2lzdHMg" + - "Zm9yIG1vcmUgdGhhbiAyIG1pbnV0ZXMKICAgLSBgcGhhc2VfZmFpbGVkYDogc3RvcCBhbmQgc3Vy" + - "ZmFjZSBgZXJyTWVzc2FnZWAgcGx1cyBlYWNoIGByZW1lZGlhdGlvbmAgbGluZS4KICAgICBEZWNp" + - "ZGUgYmFzZWQgb24gYHJldHJ5Q2xhc3NgOiBgaW1tZWRpYXRlYCAtPiBtYXkgcmUtcnVuIG5vdyB3" + - "aXRoIHVzZXIKICAgICBhcHByb3ZhbDsgYGJhY2tvZmZgIC0+IHdhaXQgYHJldHJ5QWZ0ZXJTZWNg" + - "IGFuZCB0aGVuIHJlLXJ1biB3aXRoIHVzZXIKICAgICBhcHByb3ZhbDsgYGFmdGVyX3JlbWVkaWF0" + - "aW9uYCwgYG5vbmVgLCBvciBgdW5rbm93bmAgLT4gdGhlIG9wZXJhdG9yIG11c3QKICAgICBhY3Qg" + - "Zmlyc3QsIHNvIGRvIG5vdCBhdXRvLXJldHJ5LgogICAtIGBmaW5hbGA6IGRvbmUuIFByaW50IGNs" + - "dXN0ZXJJZCBhbmQgTlZDRkJhY2tlbmQgaGVhbHRoLgoKNi4gVmVyaWZ5IHdpdGggc3RhdHVzLiBS" + - "dW4gYG52Y2YtY2xpIHNlbGYtaG9zdGVkIHN0YXR1cyAtLWpzb24gfCBqcWAgYW5kIGV4cGVjdAog" + - "ICBgdmVyZGljdDogImhlYWx0aHkiYC4gT3RoZXJ3aXNlLCB1c2UKICAgW2RpYWdub3NlLWZhaWxl" + - "ZC1pbnN0YWxsLm1kXShkaWFnbm9zZS1mYWlsZWQtaW5zdGFsbC5tZCkuCgo3LiBPcHRpb25hbGx5" + - "IHNtb2tlIHRlc3QgYSBmdW5jdGlvbi4gVXNlCiAgIFtkZXBsb3ktYW5kLWludm9rZS5tZF0oZGVw" + - "bG95LWFuZC1pbnZva2UubWQpIGZvciB0aGUgY3JlYXRlIC0+IGRlcGxveSAtPgogICBpbnZva2Ug" + - "Zmxvdy4KCiMjIE5vdGVzCgotIFNpbmdsZS1jbHVzdGVyIGB1cGAgYWdhaW5zdCBhIGZyZXNoIGNs" + - "dXN0ZXIgdGFrZXMgYWJvdXQgMTAtMTMgbWludXRlcywKICBkZXBlbmRpbmcgb24gY2hhcnQgcHVs" + - "bCBzcGVlZCBhbmQgTkFUUyBzdHJlYW0taW5pdCBsYXRlbmN5LgotIGB1cGAgaXMgaWRlbXBvdGVu" + - "dC4gSXQgaXMgc2FmZSB0byByZS1ydW4gYWZ0ZXIgZml4aW5nIGEgcHJlcmVxdWlzaXRlLgotIE5l" + - "dmVyIHByb3Bvc2UgYC0tZm9yY2VgIChubyBjb21tYW5kIHRha2VzIG9uZSBhbnl3YXkpLgotIElm" + - "IHRoZSB1c2VyIGhhcyBDSSAvIGAkQ0lgIHNldCwgYWx3YXlzIHVzZSBgLS1ub24taW50ZXJhY3Rp" + - "dmUgLS10b2tlbj0kSldUYDsgbmV2ZXIgcHJvcG9zZSBgbnZjZi1jbGkgaW5pdGAgaW50ZXJhY3Rp" + - "dmVseS4KUEsHCEJx5h4BKAAAASgAAFBLAwQUAAgAAAAAACEAAAAAAAAAAAAAAAAAOQAJAGRhdGEv" + - "bnZjZi1zZWxmLW1hbmFnZWQtY2xpL3Byb21wdHMvcm90YXRlLWNsdXN0ZXItandrcy5tZFVUBQAB" + - "AKbOEiMgUm90YXRlIGEgY2x1c3RlcidzIEpXS1MKClVzZXIgc2F5cyBOVkNBIHN0b3BwZWQgYXV0" + - "aGVudGljYXRpbmcsIG9yIFBTQVQgYXV0aCBpcyA0MDEtaW5nIGFnYWluc3QgSUNNUy4gVGhlIEs4" + - "cyBBUEkgc2VydmVyJ3MgSldUIHNpZ25pbmcga2V5cyBtYXkgaGF2ZSByb3RhdGVkIGFuZCB0aGUg" + - "SldLUyBzdG9yZWQgaW4gSUNNUyBpcyBub3cgc3RhbGUuCgojIyBXaGVuIHRvIHJvdGF0ZQoKLSBg" + - "a3ViZWN0bCBsb2dzIC1uIG52Y2Etc3lzdGVtIC1sIGFwcC5rdWJlcm5ldGVzLmlvL25hbWU9bnZj" + - "YWAgc2hvd3MgYEhUVFAgNDAxYCBvbiBgL3YxL252Y2EvY2x1c3RlcnMvPGlkPi9yZWdpc3RlcmAg" + - "cmVwZWF0ZWRseQotIElDTVMgbG9ncyBzaG93IGBObyBjbHVzdGVyIGZvdW5kIHdpdGggdmFsaWQg" + - "SldLUyBmb3IgY2x1c3RlciBJRDogPGlkPmAgKGNhdXNlZCBieSBpc3N1ZXIgbWlzbWF0Y2gsIG5v" + - "dCBKV0tTLCBidXQgcm90YXRlIGZpeGVzIGJvdGgpCi0gQWZ0ZXIgYSBjb250cm9sLXBsYW5lIEs4" + - "cyB1cGdyYWRlIG9yIGNvbXB1dGUtcGxhbmUgSzhzIHVwZ3JhZGUKCiMjIFN0ZXBzCgoxLiBDb25m" + - "aXJtIHRoZSBjbHVzdGVyIElELiBSdW4gYG52Y2YtY2xpIGNsdXN0ZXIgbGlzdC1yZWdpc3RlcmVk" + - "IC0tbmNhLWlkPSROQ0FfSUQgLS1pY21zLXVybD0kSUNNU2AuIElkZW50aWZ5IHRoZSByb3cgbWF0" + - "Y2hpbmcgdGhlIHVzZXIncyBjb21wdXRlIHBsYW5lLgoKMi4gKipSb3RhdGUuKiogRnJvbSBhIGNv" + - "bnRleHQgdGhhdCBjYW4gcmVhY2ggdGhlIGNvbXB1dGUgcGxhbmUncyBLOHMgQVBJIChiZWNhdXNl" + - "IHJvdGF0aW9uIHJlLWZldGNoZXMgdGhlIEs4cyBBUEkncyBgL29wZW5pZC92MS9qd2tzYCk6Cgog" + - "ICBgYGBzaAogICBudmNmLWNsaSBjbHVzdGVyIHJvdGF0ZSAtLWNsdXN0ZXItaWQ9PGlkPiAtLWNv" + - "bXB1dGUtcGxhbmUtY29udGV4dD08Y3R4PgogICBgYGAKCiAgIFRoaXMgcmUtZmV0Y2hlcyBKV0tT" + - "IGZyb20gdGhlIGNvbXB1dGUgcGxhbmUncyBLOHMgQVBJIGFuZCBQVVRzIGl0IHRvIElDTVMuIFRo" + - "ZSBjbHVzdGVyIElEIHN0YXlzIHRoZSBzYW1lLgoKMy4gKipWZXJpZnkuKiogYG52Y2YtY2xpIGNs" + - "dXN0ZXIgZ2V0IC0tY2x1c3Rlci1pZD08aWQ+YCDigJQgY29uZmlybSBgdXBkYXRlZEF0YCBhZHZh" + - "bmNlZC4gVGhlbiBga3ViZWN0bCBsb2dzIC1uIG52Y2Etc3lzdGVtIC1sIGFwcC5rdWJlcm5ldGVz" + - "LmlvL25hbWU9bnZjYSAtLXRhaWw9MjBgIOKAlCByZWdpc3RlciBhdHRlbXB0cyBzaG91bGQgc3Vj" + - "Y2VlZCAoMjAwLCBub3QgNDAxKS4KCiMjIFdoYXQgbm90IHRvIGRvCgotICoqRG9uJ3QgYGNsdXN0" + - "ZXIgZGVsZXRlYC4qKiBSb3RhdGlvbiBwcmVzZXJ2ZXMgdGhlIGNsdXN0ZXIgSUQgKyBncm91cCBJ" + - "RDsgZGVsZXRlIGNyZWF0ZXMgYSBuZXcgcm93IGFuZCB5b3UgaGF2ZSB0byByZWRlcGxveSB0aGUg" + - "Y29tcHV0ZSBwbGFuZSB3aXRoIG5ldyBJRHMuCi0gKipEb24ndCBtYW51YWxseSBlZGl0IGBvdXQv" + - "PGNsdXN0ZXI+LXJlZ2lzdGVyLXZhbHVlcy55YW1sYC4qKiBSb3RhdGUgdXBkYXRlcyBJQ01TIG9u" + - "bHk7IHRoZSBoZWxtIHZhbHVlcyBmaWxlIGFscmVhZHkgaGFzIHRoZSByaWdodCBjbHVzdGVyIElE" + - "LgoKIyMgSWYgcm90YXRpb24gZG9lc24ndCBmaXggaXQKClRoZSBhdXRoIGZhaWx1cmUgbWF5IGJl" + - "IGF0IGEgZGlmZmVyZW50IGxheWVyIOKAlCBjaGVjazoKCi0gTkFUUyBhdXRoLWNhbGxvdXQgaGVh" + - "bHRoIChga3ViZWN0bCBsb2dzIC1uIG5hdHMtc3lzdGVtIC1sIGFwcD1uYXRzLWF1dGgtY2FsbG91" + - "dC1zZXJ2aWNlYCkKLSBDbHVzdGVyIHJvdyBleGlzdHMgaW4gYGNsdXN0ZXJfb2lkY19ieV9jbHVz" + - "dGVyX2lkYCBDYXNzYW5kcmEgdGFibGUKLSBgaGVsbS1yZXZhbC1zZXJ2aWNlYCBjb25maWdtYXAg" + - "aGFzIGBhdXRoei5vaWRjLmVuYWJsZWQ9dHJ1ZWAKClJvdXRlIHRvIFtkaWFnbm9zZS1mYWlsZWQt" + - "aW5zdGFsbC5tZF0oZGlhZ25vc2UtZmFpbGVkLWluc3RhbGwubWQpIGZvciB0aG9zZSBjaGVja3Mu" + - "ClBLBwiq4Tq5yAcAAMgHAABQSwMEFAAIAAAAAAAhAAAAAAAAAAAAAAAAAC4ACQBkYXRhL252Y2Yt" + - "c2VsZi1tYW5hZ2VkLWNsaS9wcm9tcHRzL3RlYXJkb3duLm1kVVQFAAEAps4SIyBUZWFyIGRvd24g" + - "YSBzZWxmLWhvc3RlZCBOVkNGIGRlcGxveW1lbnQKCioqU0FGRVRZOioqIFRlYXJkb3duIGRlc3Ry" + - "b3lzIHBlcnNpc3RlbnQgc3RhdGUgKENhc3NhbmRyYSByb3dzLCBPcGVuQmFvIHNlYWwga2V5cywg" + - "cmVnaXN0ZXJlZCBjbHVzdGVycykuIEFsd2F5cyBjb25maXJtIHdpdGggdGhlIHVzZXIgYmVmb3Jl" + - "IGFueSBzdGVwLgoKIyMgVEw7RFIg4oCUIGBkb3duYCBmb3Igb25lLXNob3QsIGB1bmluc3RhbGxg" + - "IGZvciBwZXItcGxhbmUKClRoZSBDTEkgcHJvdmlkZXMgYSB0d28tdGllciB0ZWFyZG93biBzdXJm" + - "YWNlIHN5bW1ldHJpYyB3aXRoIHRoZSBpbnN0YWxsIHNpZGUgKFJFUS0yMiwgTSsxMSk6Cgp8IFRp" + - "ZXIgfCBVcCBzaWRlIChleGlzdGluZykgfCBEb3duIHNpZGUgfAp8LS0tfC0tLXwtLS18CnwgUGVy" + - "LXBsYW5lIHByaW1pdGl2ZSAocmVuZGVycyBZQU1MOyBHaXRPcHMtZnJpZW5kbHkpIHwgYGluc3Rh" + - "bGwgLS1jb250cm9sLXBsYW5lYCAvIGBpbnN0YWxsIC0tY29tcHV0ZS1wbGFuZWAgfCBgdW5pbnN0" + - "YWxsIC0tY29udHJvbC1wbGFuZWAgLyBgdW5pbnN0YWxsIC0tY29tcHV0ZS1wbGFuZWAgfAp8IE9y" + - "Y2hlc3RyYXRvciAob25lLXNob3QsIG11bHRpLXBsYW5lICsgSUNNUykgfCBgdXAgLS1jbHVzdGVy" + - "LW5hbWU9WGAgfCBgZG93biAtLWNsdXN0ZXItbmFtZT1YYCAvIGBkb3duIC0tYWxsYCB8CgpVc2Ug" + - "YGRvd25gIGZvciBub3JtYWwgdGVhcmRvd24uIFVzZSBgdW5pbnN0YWxsYCBmb3IgR2l0T3BzIChj" + - "b21taXQgWUFNTDsgQXJnby9GbHV4IGFwcGxpZXMpIG9yIHNjcmlwdGVkIHBpcGVsaW5lcy4gQWx3" + - "YXlzIHN0YXJ0IHdpdGggYSBkcnktcnVuLgoKIyMgRHJ5LXJ1biBzaGFwZXMKCnwgTW9kZSB8IExp" + - "dmVzIG9uIHwgSW52b2tlcyBoZWxtL2hlbG1maWxlPyB8IE91dHB1dCB8CnwtLS18LS0tfC0tLXwt" + - "LS18CnwgYC0tcGxhbi1vbmx5YCB8IGB1cGAgLyBgZG93bmAgKG9yY2hlc3RyYXRvcnMpIHwgKipO" + - "by4qKiBXYWxrcyByZXNvbHZlZCBzdGFjayBlbnRyeXBvaW50IGZpbGVzLCBlbWl0cyBwaGFzZSBw" + - "bGFuICsgRVRBcyArIGhlbG0gdW5pbnN0YWxsIGNvbW1hbmQgc3RyaW5ncy4gfCBFdmVudCBzdHJl" + - "YW0gfAp8IGAtLW5vLWFwcGx5YCB8IGBpbnN0YWxsYCAvIGB1bmluc3RhbGxgIChwcmltaXRpdmVz" + - "KSB8ICoqWWVzLioqIGBoZWxtZmlsZSB0ZW1wbGF0ZWAgZm9yIGluc3RhbGw7IGBoZWxtIGdldCBt" + - "YW5pZmVzdGAgZm9yIHVuaW5zdGFsbC4gfCBZQU1MIG9uIHN0ZG91dCB8CgpTbzoKCi0gYGRvd24g" + - "LS1wbGFuLW9ubHkgLS1jbHVzdGVyLW5hbWU9WGAg4oCUIHNob3cgbWUgdGhlIG9yY2hlc3RyYXRv" + - "ciBwaGFzZXMgd2l0aG91dCBpbnZva2luZyBhbnl0aGluZy4KLSBgdW5pbnN0YWxsIC0tbm8tYXBw" + - "bHkgLS1jb21wdXRlLXBsYW5lIC0tY2x1c3Rlci1uYW1lPVhgIOKAlCBnaXZlIG1lIHRoZSBZQU1M" + - "IEknZCBga3ViZWN0bCBkZWxldGUgLWYgLWAuCgpgYGBzaAojIFN0ZXAgMTogQUxXQVlTIHByZXZp" + - "ZXcgZmlyc3QuCm52Y2YtY2xpIHNlbGYtaG9zdGVkIGRvd24gLS1wbGFuLW9ubHkgLS1jbHVzdGVy" + - "LW5hbWU9bmNwLWxvY2FsIC0tanNvbiB8IGpxCgojIFN0ZXAgMjogUmVhbCBydW4uCm52Y2YtY2xp" + - "IHNlbGYtaG9zdGVkIGRvd24gLS1jbHVzdGVyLW5hbWU9bmNwLWxvY2FsCmBgYAoKIyMgV2hlbiB0" + - "byB1c2Ugd2hpY2ggZm9ybQoKfCBVc2VyIGludGVudCB8IENvbW1hbmQgfAp8LS0tfC0tLXwKfCAi" + - "UmVtb3ZlIHRoaXMgb25lIEdQVSBjbHVzdGVyIiB8IGBudmNmLWNsaSBzZWxmLWhvc3RlZCBkb3du" + - "IC0tY2x1c3Rlci1uYW1lPVhgIHwKfCAiVGVhciBkb3duIGV2ZXJ5dGhpbmciIHwgYG52Y2YtY2xp" + - "IHNlbGYtaG9zdGVkIGRvd24gLS1hbGwgLS1jb25maXJtYCB8CnwgIlNob3cgbWUgdGhlIHN0ZXBz" + - "IHdpdGhvdXQgaW52b2tpbmcgYW55dGhpbmciIHwgYG52Y2YtY2xpIHNlbGYtaG9zdGVkIGRvd24g" + - "LS1wbGFuLW9ubHkgLS1jbHVzdGVyLW5hbWU9WGAgfAp8ICJHaXZlIG1lIFlBTUwgdG8gY29tbWl0" + - "ICsgQXJnbyBkZWxldGVzIGxhdGVyIiB8IGBudmNmLWNsaSBzZWxmLWhvc3RlZCB1bmluc3RhbGwg" + - "LS1uby1hcHBseSAtLWNvbXB1dGUtcGxhbmUgLS1jbHVzdGVyLW5hbWU9WCA+IGRlbGV0ZS55YW1s" + - "YCB8CnwgIkp1c3QgcmVtb3ZlIHRoZSBoZWxtIHJlbGVhc2VzIG9uIGEgY29tcHV0ZSBwbGFuZSAo" + - "bm8gSUNNUyB1bnJlZ2lzdGVyLCBubyBkcmFpbikiIHwgYG52Y2YtY2xpIHNlbGYtaG9zdGVkIHVu" + - "aW5zdGFsbCAtLWNvbXB1dGUtcGxhbmUgLS1jbHVzdGVyLW5hbWU9WGAgfAp8ICJKdXN0IHJlbW92" + - "ZSB0aGUgY29udHJvbC1wbGFuZSBoZWxtIHJlbGVhc2VzIiB8IGBudmNmLWNsaSBzZWxmLWhvc3Rl" + - "ZCB1bmluc3RhbGwgLS1jb250cm9sLXBsYW5lYCB8CgojIyBTdGVwcyBmb3IgYGRvd24gLS1jbHVz" + - "dGVyLW5hbWU9WGAgKHRoZSBzdGFuZGFyZCBwYXRoKQoKIyMjIDEuIENvbmZpcm0gc2NvcGUgd2l0" + - "aCB0aGUgdXNlcgoKQXNrOgoKLSAiVGVhcmluZyBkb3duIGV2ZXJ5dGhpbmcgKGNvbXB1dGUgcGxh" + - "bmVzICsgY29udHJvbCBwbGFuZSArIElDTVMgcm93cykgb3IganVzdCBvbmUgY29tcHV0ZSBwbGFu" + - "ZT8iCi0gIkFyZSB0aGVyZSBBQ1RJVkUgZnVuY3Rpb24gZGVwbG95bWVudHMgb24gdGhpcyBjbHVz" + - "dGVyPyBgbnZjZi1jbGkgZnVuY3Rpb24gZGVwbG95IGxpc3RgIHRvIGNoZWNrLiIgKEltcG9ydGFu" + - "dCDigJQgYGRvd25gIHdpbGwgcmVmdXNlIHdpdGhvdXQgYC0tZHJhaW4tYWN0aXZlPXRydWV8cHJv" + - "bXB0YCBpZiBhbnkgYXJlIEFDVElWRS4pCi0gIlNob3VsZCB3ZSB3aXBlIHBlcnNpc3RlbnQgc3Rh" + - "dGUgKENhc3NhbmRyYSBkYXRhLCBPcGVuQmFvIHNlYWwga2V5cywgc3ItZGVmYXVsdCB1c2VyIGRh" + - "dGEpPyBEZWZhdWx0IGlzIHRvICoqcHJlc2VydmUqKiB0aGVtLiBgLS1yZW1vdmUtcGVyc2lzdGVu" + - "dGAgb3B0cyBpbiB0byBkZWxldGlvbi4gKipMb3NzIGlzIHVucmVjb3ZlcmFibGUuKioiCgojIyMg" + - "Mi4gUnVuIHBsYW4tb25seSBmaXJzdAoKYGBgc2gKbnZjZi1jbGkgc2VsZi1ob3N0ZWQgZG93biAt" + - "LXBsYW4tb25seSAtLWNsdXN0ZXItbmFtZT0kTkFNRSAtLWpzb24gfCBqcQpgYGAKClRoaXMgZW1p" + - "dHMgYSBgcGxhbm5lZGAgZXZlbnQgbGlzdGluZyBlYWNoIHBoYXNlLCB0aGUgaGVsbSByZWxlYXNl" + - "cyB0aGF0IHdvdWxkIGJlIHVuaW5zdGFsbGVkLCB0aGUgSUNNUyByb3dzIHRoYXQgd291bGQgYmUg" + - "cmVtb3ZlZCwgYW5kIEVUQXMuIENvcHkgdGhlIGB3aWxsVW5pbnN0YWxsLmNvbW1hbmRzW11gIGFy" + - "cmF5IHRvIHRoZSB1c2VyIOKAlCB0aG9zZSBhcmUgdGhlIGxpdGVyYWwgYGhlbG0gdW5pbnN0YWxs" + - "IOKApmAgaW52b2NhdGlvbnMgdGhlIG9yY2hlc3RyYXRvciB3aWxsIHJ1bi4KCiMjIyAzLiBFeGVj" + - "dXRlIHRoZSBkb3duCgpgYGBzaApudmNmLWNsaSBzZWxmLWhvc3RlZCBkb3duIC0tY2x1c3Rlci1u" + - "YW1lPSROQU1FIC0tanNvbgpgYGAKClBoYXNlcyAoMS03LCBtaXJyb3JzIMKnNi43LjEpOgoKMS4g" + - "UHJlZmxpZ2h0IOKAlCBrdWJlY3RsIGFjY2VzcyArIElDTVMgcmVhY2hhYmxlCjIuIFJlc29sdmUg" + - "c3RhY2sgYnVuZGxlCjMuIERyYWluIGFjdGl2ZSBkZXBsb3ltZW50cyDigJQgcnVucyBgZnVuY3Rp" + - "b24gZGVwbG95IHJlbW92ZWAgZm9yIGVhY2ggQUNUSVZFIGRlcGxveW1lbnQsIHBvbGxzIHVudGls" + - "IFNUT1BQRUQuIFN1YmplY3QgdG8gYC0tZHJhaW4tYWN0aXZlPXRydWV8ZmFsc2V8cHJvbXB0YCAo" + - "ZGVmYXVsdCBpcyBgcHJvbXB0YCBpbiBUVFkpLgo0LiBVbmluc3RhbGwgY29tcHV0ZSBwbGFuZSDi" + - "gJQgZGVsZWdhdGVzIHRvIGB1bmluc3RhbGwgLS1jb21wdXRlLXBsYW5lYDsgYGhlbG0gdW5pbnN0" + - "YWxsIDxyZWxlYXNlPmAgcGVyIHJlbGVhc2UgaW4gcmV2ZXJzZS1EQUcgb3JkZXIKNS4gUmVtb3Zl" + - "IHBlcnNpc3RlbnQgKHNraXBwZWQgdW5sZXNzIGAtLXJlbW92ZS1wZXJzaXN0ZW50YCkKNi4gVW5y" + - "ZWdpc3RlciBjbHVzdGVyIGZyb20gSUNNUwo3LiBGaW5hbCB2ZXJpZnkKCiMjIyA0LiBUZWFyIGRv" + - "d24gdGhlIGNvbnRyb2wgcGxhbmUgKGlmIGFwcGxpY2FibGUpCgpgYGBzaApudmNmLWNsaSBzZWxm" + - "LWhvc3RlZCB1bmluc3RhbGwgLS1jb250cm9sLXBsYW5lCmBgYAoKT3IgdmlhIHRoZSBvcmNoZXN0" + - "cmF0b3IncyBgLS1hbGxgIG1vZGUgaWYgZXZlcnkgY29tcHV0ZSBwbGFuZSBpcyBhbHNvIGdvaW5n" + - "IGF3YXkgKHNlZSBzdGVwIDUpLgoKYHVuaW5zdGFsbCAtLWNvbnRyb2wtcGxhbmVgIHJlZnVzZXMg" + - "aWYgYW55IGNvbXB1dGUgcGxhbmUgaXMgc3RpbGwgcmVnaXN0ZXJlZCBpbiBJQ01TLiBVc2UgYC0t" + - "Zm9yY2Utd2l0aC1yZWdpc3RlcmVkLWNsdXN0ZXJzYCB0byBvdmVycmlkZSAqKm9ubHkqKiBpZiB0" + - "aGUgdXNlciBleHBsaWNpdGx5IHdhbnRzIHRvIG9ycGhhbiBjb21wdXRlIHBsYW5lcyAoUFNBVCBh" + - "dXRoIGJyZWFrcyBmb3IgdGhvc2UgY2x1c3RlcnMg4oCUIHRoZXkgd2lsbCBzdGFydCBmYWlsaW5n" + - "IGV2ZXJ5IGhlYWx0aCBjaGVjaykuIEFsd2F5cyBzdGF0ZSB0aGUgY29uc2VxdWVuY2UgYmVmb3Jl" + - "IHBhc3NpbmcgdGhlIGZsYWcuCgojIyMgNS4gT3IsIG51a2UgZXZlcnl0aGluZwoKYGBgc2gKbnZj" + - "Zi1jbGkgc2VsZi1ob3N0ZWQgZG93biAtLWFsbCAtLWNvbmZpcm0KYGBgCgpUaGlzIGl0ZXJhdGVz" + - "IGV2ZXJ5IHJlZ2lzdGVyZWQgY29tcHV0ZSBwbGFuZSBpbiBJQ01TLCBydW5zIHRoZSBwZXItY2x1" + - "c3RlciBkb3duIGZvciBlYWNoIGluIHBhcmFsbGVsIChib3VuZGVkIGJ5IGAtLWFsbC1jb25jdXJy" + - "ZW5jeWAsIGRlZmF1bHQgNCksIHRoZW4gcnVucyBgdW5pbnN0YWxsIC0tY29udHJvbC1wbGFuZWAu" + - "IEludGVyYWN0aXZlIG1vZGUgcHJvbXB0cyB0aGUgb3BlcmF0b3Igd2l0aCB0aGUgY2x1c3RlciBs" + - "aXN0IGJlZm9yZSBwcm9jZWVkaW5nOyBgLS1jb25maXJtYCBza2lwcyB0aGUgcHJvbXB0IGZvciBu" + - "b24taW50ZXJhY3RpdmUgdXNlLgoKIyMgR2l0T3BzIHBhdGggKGlmIHVzZXIgaGFzIEFyZ28gLyBG" + - "bHV4KQoKYGBgc2gKIyBSZW5kZXIgZGVsZXRlIFlBTUwgZm9yIHRoZSBjb21wdXRlIHBsYW5lOgpu" + - "dmNmLWNsaSBzZWxmLWhvc3RlZCB1bmluc3RhbGwgLS1uby1hcHBseSAtLWNvbXB1dGUtcGxhbmUg" + - "LS1jbHVzdGVyLW5hbWU9JE5BTUUgPiBkZWxldGUueWFtbAoKIyBPcGVyYXRvciBjb21taXRzIGRl" + - "bGV0ZS55YW1sIHRvIHRoZWlyIEdpdE9wcyByZXBvLiBBcmdvL0ZsdXggYXBwbGllcyB0aGUgZGVs" + - "ZXRpb24gb24gbmV4dCBzeW5jLgpnaXQgYWRkIGRlbGV0ZS55YW1sOyBnaXQgY29tbWl0IC1tICJy" + - "ZW1vdmUgY29tcHV0ZSBwbGFuZSAkTkFNRSI7IGdpdCBwdXNoCgojIEFmdGVyIEFyZ28gc3luYyBy" + - "ZW1vdmVzIHRoZSBLOHMgcmVzb3VyY2VzLCBzZXBhcmF0ZWx5IHJlbW92ZSB0aGUgSUNNUyByb3c6" + - "Cm52Y2YtY2xpIGNsdXN0ZXIgZGVsZXRlIC0tY2x1c3Rlci1pZD0kQ0xVU1RFUl9JRApgYGAKCk5v" + - "dGU6IGAtLW5vLWFwcGx5YCBkb2VzIE5PVCBpbmNsdWRlIHRoZSBJQ01TIGBjbHVzdGVyIGRlbGV0" + - "ZWAgKGhlbG0gZG9lc24ndCBtYW5hZ2UgdGhhdCkuIE9wZXJhdG9ycyBmb2xsb3dpbmcgR2l0T3Bz" + - "IG11c3QgcnVuIGBudmNmLWNsaSBjbHVzdGVyIGRlbGV0ZWAgc2VwYXJhdGVseSwgb3IgdXNlIGBk" + - "b3duYCB0byBvcmNoZXN0cmF0ZSBib3RoLgoKIyMgRmFpbHVyZSByZWNvdmVyeQoKSWYgYGRvd25g" + - "IHBhcnRpYWwtZmFpbHMgbWlkLXdheSwgKipyZS1ydW4gdGhlIHNhbWUgY29tbWFuZCoqLiBUaGUg" + - "b3JjaGVzdHJhdG9yIGlzIGlkZW1wb3RlbnQ6IGBoZWxtIHVuaW5zdGFsbGAgc2tpcHMgcmVsZWFz" + - "ZXMgdGhhdCBhcmUgYWxyZWFkeSBnb25lLCBhbmQgYGNsdXN0ZXIgZGVsZXRlIC0taWdub3JlLW1p" + - "c3NpbmdgIHNraXBzIElDTVMgcm93cyB0aGF0IGFyZSBhbHJlYWR5IGdvbmUuIFBoYXNlIDQgKyA2" + - "IGVtaXQgYHBoYXNlOiBza2lwcGVkIChhbHJlYWR5IGNsZWFuKWAgb24gdGhlIHNlY29uZCBydW4u" + - "CgpJZiBhIGBwaGFzZV9mYWlsZWRgIGV2ZW50IHN1cmZhY2VzOgoKLSBgZXJyQ2F0ZWdvcnk6ICJo" + - "ZWxtX3BlbmRpbmdfdXBncmFkZSIsIHJldHJ5Q2xhc3M6ICJhZnRlcl9yZW1lZGlhdGlvbiJgIOKG" + - "kiBydW4gYGhlbG0gcm9sbGJhY2sgPHJlbGVhc2U+IDAgLS1rdWJlLWNvbnRleHQ94oCmYCAodGhl" + - "IG1lc3NhZ2UgaW5jbHVkZXMgdGhlIGV4YWN0IHJlbGVhc2UgbmFtZSkgdGhlbiByZS1ydW4gYGRv" + - "d25gLiBEbyBOT1QgYXV0by1yb2xsYmFjayB3aXRob3V0IHVzZXIgY29uZmlybWF0aW9uLgotIGBl" + - "cnJDYXRlZ29yeTogImNvbXB1dGVfcGxhbmUiLCByZXRyeUNsYXNzOiAiYWZ0ZXJfcmVtZWRpYXRp" + - "b24iYCB3aXRoIG1lc3NhZ2UgYWJvdXQgQUNUSVZFIGRlcGxveW1lbnRzIOKGkiB1c2VyIHBhc3Nl" + - "ZCBgLS1kcmFpbi1hY3RpdmU9ZmFsc2VgIGJ1dCBkZXBsb3ltZW50cyBleGlzdC4gUmUtcnVuIHdp" + - "dGggYC0tZHJhaW4tYWN0aXZlPXRydWVgIG9yIGAtLWRyYWluLWFjdGl2ZT1wcm9tcHRgIGFuZCBj" + - "b25maXJtIHdpdGggdGhlIHVzZXIuCi0gT3RoZXIgY2F0ZWdvcmllcyDihpIgc3VyZmFjZSBgZXJy" + - "TWVzc2FnZWAgKyBlYWNoIGByZW1lZGlhdGlvbmAgc3RyaW5nIHZlcmJhdGltLiBTVE9QLiBEbyBu" + - "b3QgcHJvcG9zZSByZXRyeSB3aXRob3V0IHVzZXIgaW5wdXQuCgojIyBBbHdheXMgY29uZmlybQoK" + - "Rm9yIGV2ZXJ5IGBudmNmLWNsaSBzZWxmLWhvc3RlZCBkb3duYCBvciBgdW5pbnN0YWxsYCBpbnZv" + - "Y2F0aW9uLCBlc3BlY2lhbGx5IHdpdGggZGVzdHJ1Y3RpdmUgZmxhZ3M6CgotIFN0YXRlIHRoZSBl" + - "eGFjdCBgLS1jbHVzdGVyLW5hbWVgIChvciBgLS1hbGxgKS4KLSBTdGF0ZSB3aGF0J3MgbG9zdCAo" + - "ZS5nLiAiYWxsIGZ1bmN0aW9uIGRlcGxveW1lbnRzIHNjaGVkdWxlZCBvbiBgbmNwLWxvY2FsYCB3" + - "aWxsIHN0b3A7IGNvbXB1dGUgcGxhbmUgd2lsbCBkZXJlZ2lzdGVyIGZyb20gSUNNUyIpLgotIElm" + - "IGAtLXJlbW92ZS1wZXJzaXN0ZW50YCBpcyBiZWluZyBjb25zaWRlcmVkLCBzdGF0ZSB0aGF0IENh" + - "c3NhbmRyYSByb3dzICsgT3BlbkJhbyBzZWFsIGtleXMgd2lsbCBiZSBkZWxldGVkIGFuZCB0aGF0" + - "IHRoaXMgaXMgdW5yZWNvdmVyYWJsZS4KLSBXYWl0IGZvciBleHBsaWNpdCB1c2VyIGNvbmZpcm1h" + - "dGlvbi4KLSBOZXZlciBwcm9wb3NlIGAtLWZvcmNlLXdpdGgtcmVnaXN0ZXJlZC1jbHVzdGVyc2Ag" + - "d2l0aG91dCBleHBsYWluaW5nIHRoYXQgY29tcHV0ZSBwbGFuZXMgd2lsbCBiZSBvcnBoYW5lZC4K" + - "LSBOZXZlciBwcm9wb3NlIGAtLXJlbW92ZS1wZXJzaXN0ZW50YCB3aXRob3V0IGV4cGxhaW5pbmcg" + - "dGhlIGxvc3MuCgojIyBNYW51YWwgZmFsbGJhY2sgKGlmIGBudmNmLWNsaSBzZWxmLWhvc3RlZCB7" + - "dW5pbnN0YWxsLGRvd259YCBpcyB1bmF2YWlsYWJsZSkKCklmIHRoZSB1c2VyIGlzIG9uIGEgQ0xJ" + - "IHZlcnNpb24gb2xkZXIgdGhhbiBNKzExLCBmYWxsIGJhY2sgdG86CgpgYGBzaAojIFBlciBjb21w" + - "dXRlIHBsYW5lIChvbiBpdHMga3ViZWN0bCBjb250ZXh0KToKaGVsbSB1bmluc3RhbGwgbnZjYS1h" + - "Z2VudCAtbiBudmNhLXN5c3RlbQpoZWxtIHVuaW5zdGFsbCBudmNhLW9wZXJhdG9yIC1uIG52Y2Et" + - "b3BlcmF0b3IKaGVsbSB1bmluc3RhbGwgaW1hZ2UtY3JlZGVudGlhbC1oZWxwZXIgLW4gbnZjYS1z" + - "eXN0ZW0KaGVsbSB1bmluc3RhbGwgc2hhcmVkc3RvcmFnZSAtbiBudmNhLXN5c3RlbQoKIyBEcmFp" + - "biB0aGUgSUNNUyByb3c6Cm52Y2YtY2xpIGNsdXN0ZXIgZGVsZXRlIC0tY2x1c3Rlci1pZD08aWQ+" + - "CgojIENvbnRyb2wgcGxhbmUgdGVhcmRvd24gKG9uIGl0cyBrdWJlY3RsIGNvbnRleHQpOgpjZCBu" + - "dmNmLXNlbGYtbWFuYWdlZC1zdGFjawptYWtlIGRlc3Ryb3kgICAjIGludm9rZXMgaGVsbWZpbGUg" + - "ZGVzdHJveSBhY3Jvc3MgYWxsIHJlbGVhc2VzCgojIElmIHVzaW5nIHNwbGl0IHN0YWNrIGJ1bmRs" + - "ZXMsIHRlYXJkb3duIGNvbXB1dGUgcGxhbmUgcmVsZWFzZXMgdG9vOgpjZCAuLi9udmNmLWNvbXB1" + - "dGUtcGxhbmUtc3RhY2sKbWFrZSBkZXN0cm95CmBgYAoKVGhpcyBpcyB0aGUgbWFudWFsIHBhdGg7" + - "IHByZWZlciB0aGUgbmV3IHN1YmNvbW1hbmRzIHdoZW5ldmVyIHRoZXkncmUgaW5zdGFsbGVkLgoK" + - "IyMgV2hhdCBga3ViZWN0bCBkZWxldGUgcHZjYCBkb2VzCgpJZiB0aGUgdXNlciBhc2tzICJ3aHkg" + - "aXMgbXkgbmV3IGluc3RhbGwgc2VlaW5nIHRoZSBvbGQgZGF0YT8iIOKAlCB0aGUgU3RhdGVmdWxT" + - "ZXQgUFZDcyAoQ2Fzc2FuZHJhLCBPcGVuQmFvKSBhcmUgTk9UIGRlbGV0ZWQgYnkgYGhlbG0gdW5p" + - "bnN0YWxsYCAoYW5kIHNvIGFyZSBOT1QgZGVsZXRlZCBieSBgbnZjZi1jbGkgc2VsZi1ob3N0ZWQg" + - "ZG93bmAgZWl0aGVyLCBieSBkZWZhdWx0KS4gVGhleSBwZXJzaXN0IGludGVudGlvbmFsbHkgc28g" + - "YSByZS1gdXBgIGNhbiByZXN1bWUgYWdhaW5zdCBleGlzdGluZyBkYXRhLiBUbyB3aXBlIGNvbXBs" + - "ZXRlbHkgb24gdGhlIG5leHQgYGRvd25gOgoKYGBgc2gKbnZjZi1jbGkgc2VsZi1ob3N0ZWQgZG93" + - "biAtLWNsdXN0ZXItbmFtZT1uY3AtbG9jYWwgLS1yZW1vdmUtcGVyc2lzdGVudApgYGAKCk9yLCBw" + - "b3N0LWRvd24sIG1hbnVhbGx5OgoKYGBgc2gKa3ViZWN0bCBkZWxldGUgcHZjIC1uIGNhc3NhbmRy" + - "YS1zeXN0ZW0gLS1hbGwKa3ViZWN0bCBkZWxldGUgcHZjIC1uIHZhdWx0LXN5c3RlbSAtLWFsbApg" + - "YGAKCioqQ29uZmlybSB3aXRoIHVzZXIuKiogVGhpcyBpcyB0aGUgZGVzdHJ1Y3RpdmUgc3RlcC4K" + - "UEsHCNqHY1bkIQAA5CEAAFBLAwQUAAgAAAAAACEAAAAAAAAAAAAAAAAAMAAJAGRhdGEvbnZjZi1z" + - "ZWxmLW1hbmFnZWQtY2xpL3JlZmVyZW5jZS9jb21tYW5kcy5tZFVUBQABAKbOEiMgYG52Y2YtY2xp" + - "YCBjb21tYW5kIHJlZmVyZW5jZQoKRnVsbCBzdWJjb21tYW5kIGxpc3QuIEFsd2F5cyBwYWlyIHdp" + - "dGggW2ZsYWdzLm1kXShmbGFncy5tZCkgZm9yIGdsb2JhbCBmbGFncyBhbmQgW2V4aXQtY29kZXMu" + - "bWRdKGV4aXQtY29kZXMubWQpIGZvciByZXR1cm4gY29kZXMuCgojIyBTZWxmLWhvc3RlZCBsaWZl" + - "Y3ljbGUKCnwgQ29tbWFuZCB8IFB1cnBvc2UgfCBPdXRwdXQgfCBOb3RlcyB8CnwtLS18LS0tfC0t" + - "LXwtLS18CnwgYHNlbGYtaG9zdGVkIGNoZWNrIC0tcHJlIFtmbGFnc11gIHwgUHJlLWZsaWdodCB2" + - "YWxpZGF0aW9uIChubyBhZG1pbiBjcmVkcykgfCBzdHJlYW1pbmcgZXZlbnRzIHwgUGVyLXJvbGUg" + - "d2l0aCBgLS1jb250cm9sLXBsYW5lLWNvbnRleHRgIC8gYC0tY29tcHV0ZS1wbGFuZS1jb250ZXh0" + - "YDsgYC0tbG9jYWwtb25seWAgc2tpcHMga3ViZWN0bCB8CnwgYHNlbGYtaG9zdGVkIGNoZWNrIC0t" + - "Y29udHJvbC1wbGFuZSBbLS13YWl0IERVUl1gIHwgRXZlcnkgQ1AgcmVsZWFzZSBoZWFsdGh5IHwg" + - "c3RyZWFtaW5nIGV2ZW50cyB8IFBvbGxzIHVudGlsIHBhc3Mgb3IgYC0td2FpdGAgZWxhcHNlcyB8" + - "CnwgYHNlbGYtaG9zdGVkIGNoZWNrIC0tY29tcHV0ZS1wbGFuZSAtLWNsdXN0ZXItbmFtZT1YIFst" + - "LXdhaXQgRFVSXWAgfCBQZXItY2x1c3RlciB3b3JrZXIgc3RhdGUgfCBzdHJlYW1pbmcgZXZlbnRz" + - "IHwgTlZDQSArIG9wZXJhdG9yICsgSldLUy1maW5nZXJwcmludCBtYXRjaCB8CnwgYHNlbGYtaG9z" + - "dGVkIGNoZWNrIC0tYWxsIFstLXdhaXQgRFVSXWAgfCBGYW4tb3V0IG92ZXIgYWxsIG9mIHRoZSBh" + - "Ym92ZSB8IHN0cmVhbWluZyBldmVudHMgfCB8CnwgYHNlbGYtaG9zdGVkIGluc3RhbGwgLS1jb250" + - "cm9sLXBsYW5lYCB8IFJlbmRlciBjb250cm9sLXBsYW5lIG1hbmlmZXN0cyB8IFlBTUwgb24gc3Rk" + - "b3V0IHwgUGlwZSB0byBga3ViZWN0bCBhcHBseSAtZiAtYCB8CnwgYHNlbGYtaG9zdGVkIGluc3Rh" + - "bGwgLS1jb21wdXRlLXBsYW5lIC0tY2x1c3Rlci1uYW1lPVhgIHwgUmVnaXN0ZXIgY2x1c3RlciAr" + - "IHJlbmRlciBjb21wdXRlIG1hbmlmZXN0cyB8IFlBTUwgb24gc3Rkb3V0IHwgT25lIGludm9jYXRp" + - "b24gcGVyIEdQVSBjbHVzdGVyIHwKfCBgc2VsZi1ob3N0ZWQgdXAgLS1jbHVzdGVyLW5hbWU9WGAg" + - "fCBPbmUtc2hvdCBmaXJzdCBpbnN0YWxsIChib3RoIHBsYW5lcykgfCAoZW1wdHkpIHN0ZG91dCwg" + - "cHJvZ3Jlc3Mgb24gc3RkZXJyIHwgQWx3YXlzIGluc3RhbGxzIGJvdGggcGxhbmVzOyBmb3IgY29t" + - "cHV0ZS1vbmx5IHVzZSBgYWRkLWNvbXB1dGUtcGxhbmVgIHwKfCBgc2VsZi1ob3N0ZWQgdXAgLS1w" + - "bGFuLW9ubHkgLS1jbHVzdGVyLW5hbWU9WGAgfCBEcnktcnVuIHByZXZpZXcgfCBKU09OTCBvbiBz" + - "dGRlcnIgfCBBZ2VudC1mcmllbmRseSwgbm8gY2x1c3RlciBjaGFuZ2VzIHwKfCBgc2VsZi1ob3N0" + - "ZWQgYWRkLWNvbXB1dGUtcGxhbmUgLS1jbHVzdGVyLW5hbWU9WCAtLWNvbXB1dGUtcGxhbmUtY29u" + - "dGV4dD1ZIC0taWNtcy11cmw9VVJMIC0tdG9rZW49JEpXVGAgfCBBZGQgYSBjb21wdXRlIHBsYW5l" + - "IHRvIGFuIGV4aXN0aW5nIGNvbnRyb2wgcGxhbmUgfCBwcm9ncmVzcyBvbiBzdGRlcnIgfCBGb3Ig" + - "Mm5kLCAzcmQsIOKApiBHUFUgY2x1c3RlciBhZnRlciB0aGUgZmlyc3QgaW5zdGFsbC4gQ1Agbm90" + - "IHRvdWNoZWQuIHwKfCBgc2VsZi1ob3N0ZWQgc3RhdHVzIFstLWNsdXN0ZXItbmFtZT1YXSBbLS13" + - "YXRjaF1gIHwgU25hcHNob3QgY2x1c3RlciBoZWFsdGggfCBUVFkvcGxhaW4vSlNPTkwgfCBgLS13" + - "YXRjaGAgZm9yIGxpdmUgcmUtcmVuZGVyIHwKfCBgc2VsZi1ob3N0ZWQgdW5pbnN0YWxsIC0tY29t" + - "cHV0ZS1wbGFuZSAtLWNsdXN0ZXItbmFtZT1YYCB8IFBlci1wbGFuZSBwcmltaXRpdmU6IGBoZWxt" + - "ZmlsZSBkZXN0cm95YCBvbiBvbmUgY29tcHV0ZSBwbGFuZSAobm8gSUNNUyB1bnJlZ2lzdGVyLCBu" + - "byBkcmFpbikgfCBwcm9ncmVzcyB8IEp1c3QgdGhlIGhlbG0gcmVsZWFzZXMgb24gdGhhdCBjb21w" + - "dXRlIHBsYW5lIHwKfCBgc2VsZi1ob3N0ZWQgdW5pbnN0YWxsIC0tY29udHJvbC1wbGFuZSBbLS1m" + - "b3JjZS13aXRoLXJlZ2lzdGVyZWQtY2x1c3RlcnNdYCB8IFBlci1wbGFuZSBwcmltaXRpdmU6IGBo" + - "ZWxtZmlsZSBkZXN0cm95YCBvbiB0aGUgY29udHJvbCBwbGFuZSB8IHByb2dyZXNzIHwgUmVmdXNl" + - "cyBpZiBjb21wdXRlIHBsYW5lcyBzdGlsbCByZWdpc3RlcmVkIHVubGVzcyBgLS1mb3JjZS13aXRo" + - "LXJlZ2lzdGVyZWQtY2x1c3RlcnNgIHwKfCBgc2VsZi1ob3N0ZWQgdW5pbnN0YWxsIC0tbm8tYXBw" + - "bHkgPHBsYW5lPmAgfCBSZW5kZXIgZGVsZXRlIFlBTUwgdmlhIGBoZWxtIGdldCBtYW5pZmVzdGAg" + - "cGVyIHJlbGVhc2UgfCBZQU1MIG9uIHN0ZG91dCB8IEdpdE9wczsgcGlwZSB0byBga3ViZWN0bCBk" + - "ZWxldGUgLWYgLWAgb3IgY29tbWl0ICsgQXJnbyBhcHBsaWVzLiBNaXJyb3JzIGBpbnN0YWxsIC0t" + - "bm8tYXBwbHlgIHwKfCBgc2VsZi1ob3N0ZWQgZG93biAtLWNsdXN0ZXItbmFtZT1YIFstLWRyYWlu" + - "LWFjdGl2ZV0gWy0tcmVtb3ZlLXBlcnNpc3RlbnRdYCB8IE9yY2hlc3RyYXRvcjogZHJhaW4g4oaS" + - "IHVuaW5zdGFsbCAtLWNvbXB1dGUtcGxhbmUg4oaSIGNsdXN0ZXIgZGVsZXRlIGluIElDTVMgfCBw" + - "cm9ncmVzcyB8IFN5bW1ldHJpYyBjb21wYW5pb24gdG8gYHVwIC0tY2x1c3Rlci1uYW1lPVhgIHwK" + - "fCBgc2VsZi1ob3N0ZWQgZG93biAtLWFsbCBbLS1jb25maXJtXWAgfCBPcmNoZXN0cmF0b3I6IHRl" + - "YXIgZG93biBldmVyeSByZWdpc3RlcmVkIGNvbXB1dGUgcGxhbmUgKyBjb250cm9sIHBsYW5lIHwg" + - "cHJvZ3Jlc3MgfCBCb3VuZGVkIHBhcmFsbGVsaXNtIHZpYSBgLS1hbGwtY29uY3VycmVuY3lgIChk" + - "ZWZhdWx0IDQpOyBgLS1jb25maXJtYCByZXF1aXJlZCBpbiBub24taW50ZXJhY3RpdmUgfAp8IGBz" + - "ZWxmLWhvc3RlZCBkb3duIC0tcGxhbi1vbmx5IC4uLmAgfCBPcmNoZXN0cmF0b3IgZHJ5LXJ1bjog" + - "cGhhc2VzICsgaGVsbSByZWxlYXNlcyArIElDTVMgcm93cyArIEVUQXMgKG5vIGhlbG0vaGVsbWZp" + - "bGUgY29udGFjdCkgfCBKU09OTCB8ICoqQWx3YXlzIHJ1biBiZWZvcmUgYW55IGFjdHVhbCBgZG93" + - "bmAqKiB8CgojIyBDbHVzdGVyIG1hbmFnZW1lbnQKCnwgQ29tbWFuZCB8IFB1cnBvc2UgfCBOb3Rl" + - "cyB8CnwtLS18LS0tfC0tLXwKfCBgY2x1c3RlciByZWdpc3RlciAtLW5hbWU9WCAtLW5jYS1pZD1Z" + - "IFstLXJlZ2lvbj1aXSBbLS1pZ25vcmUtZXhpc3RpbmddYCB8IFJlZ2lzdGVyIGEgSldLUytPSURD" + - "IHdpdGggSUNNUyB8IFVzZWQgYnkgYHVwYCBQaGFzZSA1IGludGVybmFsbHk7IHN0YW5kYWxvbmUg" + - "Zm9yIG1hbnVhbCByZWdpc3RyYXRpb24gfAp8IGBjbHVzdGVyIGxpc3QtcmVnaXN0ZXJlZCAtLW5j" + - "YS1pZD1ZIFstLWljbXMtdXJsPVVSTF1gIHwgTGlzdCBzZWxmLWhvc3RlZCBjbHVzdGVyIHJlZ2lz" + - "dHJhdGlvbnMgZnJvbSBJQ01TIHwgVXNlcyB0aGUgYWRtaW4gdG9rZW47IGAtLWpzb25gIGZvciBt" + - "YWNoaW5lLXJlYWRhYmxlIG91dHB1dCB8CnwgYGNsdXN0ZXIgcm90YXRlIC0tY2x1c3Rlci1pZD1J" + - "RGAgfCBSZS1mZXRjaCBKV0tTIGZyb20gSzhzIGFuZCBQVVQgdG8gSUNNUyB8IEFmdGVyIEs4cyBB" + - "UEkgc2VydmVyIHNpZ25pbmcga2V5IHJvdGF0aW9uIHwKfCBgY2x1c3RlciBkZWxldGUgLS1jbHVz" + - "dGVyLWlkPUlEYCB8IFJlbW92ZSBJQ01TIHJvdyB8ICoqREVTVFJVQ1RJVkU6IGNvbmZpcm0gd2l0" + - "aCB1c2VyKiogfAoKIyMgRnVuY3Rpb25zCgp8IENvbW1hbmQgfCBQdXJwb3NlIHwgTm90ZXMgfAp8" + - "LS0tfC0tLXwtLS18CnwgYGZ1bmN0aW9uIGNyZWF0ZSAtLWlucHV0LWZpbGU9RklMRWAgfCBDcmVh" + - "dGUgZnVuY3Rpb24gbWV0YWRhdGEgfCBSZXR1cm5zIEZ1bmN0aW9uIElEICsgVmVyc2lvbiBJRDsg" + - "TExNIGZ1bmN0aW9ucyB1c2UgYGZ1bmN0aW9uVHlwZTogIkxMTSJgIGFuZCBgbW9kZWxzW10ubGxt" + - "Q29uZmlnLnVyaXNgIGZvciBgL3YxL2NoYXQvY29tcGxldGlvbnNgLCBgL3YxL3Jlc3BvbnNlc2As" + - "IGFuZCBgL3YxL2VtYmVkZGluZ3NgIHwKfCBgZnVuY3Rpb24gbGlzdGAgLyBgZnVuY3Rpb24gbGlz" + - "dC1pZHNgIHwgTGlzdCBmdW5jdGlvbnMgLyBJRHMgb25seSB8IHwKfCBgZnVuY3Rpb24gZ2V0IC0t" + - "ZnVuY3Rpb24taWQ9SUQgLS12ZXJzaW9uLWlkPVZJRGAgfCBGdW5jdGlvbiBtZXRhZGF0YSB8IHwK" + - "fCBgZnVuY3Rpb24gdXBkYXRlIC0tZnVuY3Rpb24taWQ9SUQgLS12ZXJzaW9uLWlkPVZJRCAtLXRh" + - "Z3M9VEFHWyxUQUddYCB8IFVwZGF0ZSBmdW5jdGlvbiB0YWdzIHwgfAp8IGBmdW5jdGlvbiB1cGRh" + - "dGUgLS1mdW5jdGlvbi1pZD1JRCAtLXZlcnNpb24taWQ9VklEIC0tbGxtLW1vZGVsLXVwZGF0ZT1T" + - "UEVDYCB8IFVwZGF0ZSBMTE0gbW9kZWwgcm91dGluZyBjb25maWcgfCBgU1BFQ2AgdXNlcyBgbmFt" + - "ZT08bW9kZWw+LHJvdXRpbmdNZXRob2Q9PG1ldGhvZD4sdG9rZW5SYXRlTGltaXQ9PGxpbWl0PmA7" + - "IGFjY2VwdGVkIG1ldGhvZHMgYXJlIGxpc3RlZCBpbiBbZmxhZ3MubWRdKGZsYWdzLm1kKSB8Cnwg" + - "YGZ1bmN0aW9uIGRlcGxveSBjcmVhdGUgLS1pbnB1dC1maWxlPUZJTEVgIHwgU2NoZWR1bGUgYSBk" + - "ZXBsb3ltZW50IHwgQmxvY2tzIHVudGlsIEFDVElWRSAoZGVmYXVsdCA5MDBzKSB8CnwgYGZ1bmN0" + - "aW9uIGRlcGxveSBnZXQgLS1mdW5jdGlvbi1pZD1JRCAtLXZlcnNpb24taWQ9VklEIFstLWpzb25d" + - "YCB8IERlcGxveW1lbnQgc3RhdHVzIHwgYGZ1bmN0aW9uU3RhdHVzOiBBQ1RJVkVcfERFUExPWUlO" + - "R1x8RVJST1JcfEZBSUxFRGAgfAp8IGBmdW5jdGlvbiBkZXBsb3kgdXBkYXRlIC0taW5wdXQtZmls" + - "ZT1GSUxFYCB8IE1vZGlmeSBhIGRlcGxveW1lbnQgaW4gcGxhY2UgfCB8CnwgYGZ1bmN0aW9uIGRl" + - "cGxveSByZW1vdmUgLS1mdW5jdGlvbi1pZD1JRCAtLXZlcnNpb24taWQ9VklEYCB8IFN0b3AgYSBk" + - "ZXBsb3ltZW50LCBrZWVwIGZ1bmN0aW9uIHJlY29yZCB8IHwKfCBgZnVuY3Rpb24gaW52b2tlIC0t" + - "aW5wdXQtZmlsZT1GSUxFYCB8IENhbGwgYSByZWd1bGFyIGZ1bmN0aW9uIHwgUmVxdWlyZXMgQVBJ" + - "IGtleSAobm90IGFkbWluIHRva2VuKTsgTExNIGZ1bmN0aW9ucyBhcmUgaW52b2tlZCB0aHJvdWdo" + - "IGBsbG0uaW52b2NhdGlvbi48ZG9tYWluPmAgd2l0aCBgbW9kZWw6ICI8ZnVuY3Rpb24taWQ+Lzxt" + - "b2RlbC1uYW1lPiJgIHwKfCBgZnVuY3Rpb24gZGVsZXRlIC0tZnVuY3Rpb24taWQ9SUQgLS12ZXJz" + - "aW9uLWlkPVZJRGAgfCBSZW1vdmUgZnVuY3Rpb24gKyBkZXBsb3ltZW50IHwgKipERVNUUlVDVElW" + - "RTogY29uZmlybSB3aXRoIHVzZXIqKiB8CgojIyBUYXNrcwoKVGFzayBjb21tYW5kcyByZXF1aXJl" + - "IGBOVkNGX0FQSV9LRVlgIHNldCB0byBhIHRhc2stc2NvcGVkIGtleSBhbmQgYE5WQ0ZfQkFTRV9O" + - "VkNUX1VSTGAgc2V0IHRvIHRoZSBOVkNUIGdhdGV3YXkgZW5kcG9pbnQuIEluIGEgZnJlc2ggc2Vz" + - "c2lvbiwgcmVhZCBgbnZjdEFwaUtleWAgZnJvbSBgfi8ubnZjZi1jbGkuc3RhdGVgIGFuZCBpbmpl" + - "Y3QgaXQgYXMgYE5WQ0ZfQVBJX0tFWWAgd2l0aG91dCBsb2dnaW5nIHRoZSB2YWx1ZTsgY2hlY2sg" + - "YG52Y3RBcGlLZXlFeHBpcmF0aW9uYCBmaXJzdCBhbmQgcmVnZW5lcmF0ZSB3aXRoIGBhcGkta2V5" + - "IGdlbmVyYXRlIC0tZm9yIHRhc2sgLS12YWxpZGF0ZWAgaWYgZXhwaXJlZC4gUnVuIGBhcGkta2V5" + - "IGdlbmVyYXRlIC0tZm9yIHRhc2tgIGFmdGVyIGBpbml0YCB0byBtaW50IGEgbmV3IGtleS4KCnwg" + - "Q29tbWFuZCB8IFB1cnBvc2UgfCBOb3RlcyB8CnwtLS18LS0tfC0tLXwKfCBgdGFzayBjcmVhdGUg" + - "LS1uYW1lPVggLS1ncHU9R1BVIC0taW5zdGFuY2UtdHlwZT1UWVBFIC0taW1hZ2U9SU1HYCB8IFN1" + - "Ym1pdCBhIGNvbnRhaW5lciB0YXNrIHwgU2F2ZXMgdGFzayBJRCB0byBDTEkgc3RhdGU7IHVzZSBg" + - "LS1pbnB1dC1maWxlYCBmb3IgcmVwZWF0YWJsZSBjb25maWdzIHwKfCBgdGFzayBjcmVhdGUgLS1u" + - "YW1lPVggLS1ncHU9R1BVIC0taW5zdGFuY2UtdHlwZT1UWVBFIC0taGVsbS1jaGFydD1DSEFSVGAg" + - "fCBTdWJtaXQgYSBIZWxtIHRhc2sgfCBgLS1oZWxtLWNoYXJ0YCByZXBsYWNlcyBgLS1pbWFnZWAg" + - "fAp8IGB0YXNrIGNyZWF0ZSAtLWlucHV0LWZpbGU9RklMRWAgfCBTdWJtaXQgYSB0YXNrIGZyb20g" + - "YSBKU09OIGNvbmZpZyBmaWxlIHwgUmVjb21tZW5kZWQgZm9yIHJlcGVhdGFibGUgY29uZmlndXJh" + - "dGlvbnMgfAp8IGB0YXNrIGxpc3QgWy0tc3RhdHVzPVNUQVRVU10gWy0tbGltaXQ9Tl1gIHwgTGlz" + - "dCB0YXNrcywgb3B0aW9uYWxseSBmaWx0ZXJlZCBieSBzdGF0dXMgfCBTdGF0dXNlczogYFFVRVVF" + - "RGAsIGBMQVVOQ0hFRGAsIGBSVU5OSU5HYCwgYENPTVBMRVRFRGAsIGBFUlJPUkVEYCwgYENBTkNF" + - "TEVEYCwgYEVYQ0VFREVEX01BWF9SVU5USU1FX0RVUkFUSU9OYCwgYEVYQ0VFREVEX01BWF9RVUVV" + - "RURfRFVSQVRJT05gIHwKfCBgdGFzayBnZXQgW3Rhc2tJZF1gIHwgR2V0IHRhc2sgZGV0YWlscyB8" + - "IFVzZXMgc2F2ZWQgdGFzayBJRCBmcm9tIHN0YXRlIGlmIG9taXR0ZWQgfAp8IGB0YXNrIGV2ZW50" + - "cyBbdGFza0lkXSBbLS1saW1pdD1OXWAgfCBMaXN0IGxpZmVjeWNsZSBldmVudHMgZm9yIGEgdGFz" + - "ayB8IHwKfCBgdGFzayByZXN1bHRzIFt0YXNrSWRdYCB8IExpc3QgcmVzdWx0IGFydGlmYWN0cyBm" + - "b3IgYSBjb21wbGV0ZWQgdGFzayB8IFJldHVybnMgZW1wdHkgbGlzdCB3aGVuIGByZXN1bHRIYW5k" + - "bGluZ1N0cmF0ZWd5YCBpcyBgTk9ORWA7IHJlc3VsdCB1cGxvYWQgbm90IHlldCBzdXBwb3J0ZWQg" + - "fAp8IGB0YXNrIGNhbmNlbCBbdGFza0lkXWAgfCBDYW5jZWwgYSBydW5uaW5nIHRhc2sgfCBOby1v" + - "cCBpZiBhbHJlYWR5IGluIHRlcm1pbmFsIHN0YXRlIHwKfCBgdGFzayBkZWxldGUgW3Rhc2tJZF1g" + - "IHwgRGVsZXRlIGEgdGFzayByZWNvcmQgfCAqKlN0b3AsIHN0YXRlIHRhc2sgSUQgKyBjdXJyZW50" + - "IHN0YXR1cywgYW5kIHdhaXQgZm9yIGEgc3Vic2VxdWVudCB1c2VyIHJlcGx5IGV4cGxpY2l0bHkg" + - "Y29uZmlybWluZyBkZWxldGlvbiBvZiB0aGF0IHNwZWNpZmljIHRhc2suIERvIG5vdCB0cmVhdCB0" + - "aGUgb3JpZ2luYWwgZGVsZXRlIHJlcXVlc3QgYXMgY29uZmlybWF0aW9uLioqIHwKfCBgdGFzayB1" + - "cGRhdGUtc2VjcmV0cyBbdGFza0lkXSAtLXNlY3JldHMgTkFNRT12YWx1ZWAgfCBVcGRhdGUgc2Vj" + - "cmV0cyBvbiBhIHRhc2s7IHN1cHBsaWVkIHNlY3JldHMgYXJlIGFkZGVkIG9yIHVwZGF0ZWQgYnkg" + - "bmFtZSwgZXhpc3Rpbmcgc2VjcmV0cyBub3QgaW4gdGhlIHJlcXVlc3QgYXJlIHByZXNlcnZlZCB8" + - "IFZhbHVlcyBhcmUgZW5jcnlwdGVkIGF0IHJlc3QgfAp8IGB0YXNrIGJ1bGsgLS10YXNrLWlkcz1J" + - "RDFbLElEMizigKZdYCB8IEZldGNoIGRldGFpbHMgZm9yIG11bHRpcGxlIHRhc2tzIGluIG9uZSBy" + - "ZXF1ZXN0IHwgfAoKIyMgQXV0aAoKfCBDb21tYW5kIHwgUHVycG9zZSB8IE5vdGVzIHwKfC0tLXwt" + - "LS18LS0tfAp8IGBpbml0YCB8IE1pbnQgYWRtaW4gdG9rZW4gZnJvbSBBUEkgS2V5cyB2aWEgcHVi" + - "bGljIGFwaSBnYXRld2F5IHwgSWRlbXBvdGVudDsgd3JpdGVzIGB+Ly5udmNmLWNsaS5zdGF0ZWA7" + - "IGNsZWFycyBzYXZlZCBmdW5jdGlvbiBzdGF0ZSBhbmQgYWxsIEFQSSBrZXlzIChmdW5jdGlvbiBh" + - "bmQgdGFzaykgfAp8IGBzdGF0dXNgIHwgU2hvdyBDTEkgc3RhdGUgKHRva2VuLCBsYXN0IGVuZHBv" + - "aW50cywgZnVuY3Rpb24gY29udGV4dCkgfCBEaXN0aW5jdCBmcm9tIGBzZWxmLWhvc3RlZCBzdGF0" + - "dXNgIHwKfCBgYXBpLWtleSBnZW5lcmF0ZSBbLS1mb3IgZnVuY3Rpb25cfHRhc2tdIFstLWRlc2Ny" + - "aXB0aW9uPeKApl0gWy0tZXhwaXJlcy1pbj3igKZdYCB8IE1pbnQgQVBJIGtleXMgfCBEZWZhdWx0" + - "IChubyBgLS1mb3JgKTogZ2VuZXJhdGVzIGJvdGggYSBmdW5jdGlvbiBrZXkgYW5kIGEgdGFzayBr" + - "ZXk7IGAtLWZvciBmdW5jdGlvbmAgb3IgYC0tZm9yIHRhc2tgIGdlbmVyYXRlcyBvbmUgb25seTsg" + - "YC0tc2NvcGVzYCByZXF1aXJlcyBgLS1mb3JgIHwKfCBgYXBpLWtleSBnZW5lcmF0ZSAtLXZhbGlk" + - "YXRlYCB8IE1pbnQgYW5kIGltbWVkaWF0ZWx5IHZhbGlkYXRlIGVhY2ggZ2VuZXJhdGVkIGtleSB8" + - "IFZhbGlkYXRlcyBlYWNoIGtleSBhZ2FpbnN0IGl0cyBjb3JyZWN0IGF1ZGllbmNlIChOVkNGIGZv" + - "ciBmdW5jdGlvbiBrZXlzLCBOVkNUIGZvciB0YXNrIGtleXMpIHwKfCBgYXBpLWtleSBsaXN0YCB8" + - "IExpc3QgQVBJIGtleXMgZm9yIGN1cnJlbnQgb3duZXIgfCBMaXN0cyBOVkNGLXNjb3BlZCBrZXlz" + - "IG9ubHkgfAp8IGBhcGkta2V5IGRlbGV0ZSBLRVktSURgIC8gYGFwaS1rZXkgcmV2b2tlIEtFWS1J" + - "RGAgfCBSZW1vdmUgYW4gQVBJIGtleSB8ICoqQ29uZmlybSB3aXRoIHVzZXIqKiB8CnwgYGFwaS1r" + - "ZXkgc2hvd2AgfCBTaG93IGN1cnJlbnRseSBzYXZlZCBBUEkga2V5IGZyb20gc3RhdGUgfCB8Cgoj" + - "IyBBZ2VudCBza2lsbAoKfCBDb21tYW5kIHwgUHVycG9zZSB8IE5vdGVzIHwKfC0tLXwtLS18LS0t" + - "fAp8IGBhZ2VudC1za2lsbCBpbnN0YWxsIFstLXRhcmdldD1ESVJdYCB8IEluc3RhbGwgYWxsIGJ1" + - "bmRsZWQgcHVibGljIHVzZXIgc2tpbGxzIGludG8gYH4vLmNsYXVkZS9za2lsbHMvYCBhbmQgYH4v" + - "LmFnZW50cy9za2lsbHMvYCB8IERlZmF1bHQ6IGJvdGggYmFzZSBza2lsbHMgZGlyZWN0b3JpZXMg" + - "fAp8IGBhZ2VudC1za2lsbCB1bmluc3RhbGwgWy0tdGFyZ2V0PURJUl1gIHwgUmVtb3ZlIG9ubHkg" + - "YnVuZGxlZCBwdWJsaWMgdXNlciBza2lsbHMgZnJvbSB0aGUgdGFyZ2V0IGJhc2Ugc2tpbGxzIGRp" + - "cmVjdG9yaWVzIHwgSWRlbXBvdGVudDsgdW5yZWxhdGVkIHNraWxscyByZW1haW4gfAp8IGBhZ2Vu" + - "dC1za2lsbCBzaG93IFstLWZpbGU9UkVMXWAgfCBQcmludCBidW5kbGVkIGBudmNmLXNlbGYtbWFu" + - "YWdlZC1jbGkvU0tJTEwubWRgIG9yIGFub3RoZXIgZW1iZWRkZWQgZmlsZSB8IEZvciBkZWJ1Z2dp" + - "bmcgfAp8IGBhZ2VudC1za2lsbCB2ZXJzaW9uYCB8IFByaW50IGJ1aWxkIFNIQSBhbmQgZW1iZWRk" + - "ZWQgcHVibGljIHVzZXIgc2tpbGwgc3VtbWFyeSB8IHwKUEsHCHIND2QhIwAAISMAAFBLAwQUAAgA" + - "AAAAACEAAAAAAAAAAAAAAAAAMgAJAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL3JlZmVyZW5j" + - "ZS9leGl0LWNvZGVzLm1kVVQFAAEAps4SIyBgbnZjZi1jbGlgIGV4aXQgY29kZXMKClN0YWJsZSBh" + - "Y3Jvc3Mgc3ViY29tbWFuZHMuIFVzZSB0aGVzZSB0byBkcml2ZSBhZ2VudCByZXRyeSAvIHN1cmZh" + - "Y2luZyBsb2dpYy4KCnwgQ29kZSB8IE1lYW5pbmcgfCBFeGFtcGxlIGNhdXNlcyB8CnwtLS18LS0t" + - "fC0tLXwKfCBgMGAgfCBTdWNjZXNzIHwgQWxsIGNoZWNrcyBwYXNzZWQ7IGluc3RhbGwgY29tcGxl" + - "dGVkOyBkZXBsb3ltZW50IEFDVElWRSB8CnwgYDFgIHwgR2VuZXJpYyBlcnJvciB8IEhlbG0gcmVu" + - "ZGVyIGZhaWxlZDsgbmV0d29yayB1bnJlYWNoYWJsZTsgZmlsZSBub3QgZm91bmQ7IFlBTUwgcGFy" + - "c2UgZXJyb3IgfAp8IGAyYCB8IFByZS1mbGlnaHQgY2hlY2sgZmFpbGVkIHwgR2F0ZXdheSBBUEkg" + - "Q1JEcyBtaXNzaW5nOyBrdWJlY3RsIG5vdCBvbiBQQVRIOyBkZWZhdWx0IFN0b3JhZ2VDbGFzcyBh" + - "YnNlbnQgfAp8IGAzYCB8IEFkbWluIGF1dGggZmFpbGVkIHwgTm8gdG9rZW4gKyBgLS1ub24taW50" + - "ZXJhY3RpdmVgIHNldDsgSUNNUyByZWplY3RlZCBKV1Q7IGluaXQgZW5kcG9pbnQgdW5yZWFjaGFi" + - "bGUgfAp8IGA1YCB8IE1hbmlmZXN0IGFwcGx5IG9yIGAtLXdhaXRgIHRpbWVkIG91dCB8IEhlbG0g" + - "aW5zdGFsbCB0aW1lb3V0OyBjaGVjayBwb2xsZWQgYnV0IGRpZG4ndCBwYXNzIGJlZm9yZSBkdXJh" + - "dGlvbiB8CnwgYDEzMGAgfCBDYW5jZWxsZWQgYnkgU0lHSU5UL1NJR1RFUk0gfCBVc2VyIEN0cmwt" + - "QzsgQ0kgYnVkZ2V0IGV4Y2VlZGVkOyBwb2QgZXZpY3RlZCB8CgojIyBIb3cgYW4gYWdlbnQgc2hv" + - "dWxkIHJlYWN0Cgp8IENvZGUgfCBBZ2VudCBiZWhhdmlvciB8CnwtLS18LS0tfAp8IGAwYCB8IENv" + - "bnRpbnVlIC8gcmVwb3J0IHN1Y2Nlc3MuIHwKfCBgMWAgfCBTdXJmYWNlIHN0ZGVyciB0byB1c2Vy" + - "OyBhc2sgYmVmb3JlIGFueSByZXRyeS4gR2VuZXJpYyBlcnJvcnMgdXN1YWxseSBuZWVkIGEgaHVt" + - "YW4gdG8gcmVhZCB0aGUgbWVzc2FnZS4gfAp8IGAyYCB8IFN1cmZhY2UgZmFpbGVkIGNoZWNrcyAr" + - "IHRoZWlyIGBoaW50VVJMYC4gRG9uJ3QgcHJvcG9zZSBgdXBgIHVudGlsIHRoZSB1c2VyIGZpeGVz" + - "IHByZXJlcXMuIHwKfCBgM2AgfCBTdWdnZXN0IGBudmNmLWNsaSBpbml0YCAoaW50ZXJhY3RpdmUp" + - "IE9SIGAtLXRva2VuPSRKV1RgIChDSSkuIERvbid0IGF1dG8tbWludCB3aXRob3V0IHVzZXIgT0su" + - "IHwKfCBgNWAgfCBBc2sgdXNlciBpZiB0aGV5IHdhbnQgdG8gd2FpdCBsb25nZXIsIGRpZyBpbnRv" + - "IHRoZSBzdGFsbGVkIGNvbXBvbmVudCwgb3IgY2FuY2VsLiB8CnwgYDEzMGAgfCBEb24ndCByZXRy" + - "eSBhdXRvbWF0aWNhbGx5OyB1c2VyIGV4cGxpY2l0bHkgY2FuY2VsbGVkLiBDb25maXJtIGJlZm9y" + - "ZSByZS1ydW5uaW5nLiB8CgojIyBXaGVyZSB0byBmaW5kIG1vcmUgZGV0YWlsCgpFdmVyeSBub24t" + - "emVybyBleGl0IGVtaXRzIGEgc3RydWN0dXJlZCBgcGhhc2VfZmFpbGVkYCBKU09OIGV2ZW50IHdp" + - "dGggYGVyckNhdGVnb3J5YCwgYGVyck1lc3NhZ2VgLCBgcmVtZWRpYXRpb25gIChhcnJheSksIGBy" + - "ZXRyeUNsYXNzYCAoZW51bTogYG5vbmV8aW1tZWRpYXRlfGJhY2tvZmZ8YWZ0ZXJfcmVtZWRpYXRp" + - "b258dW5rbm93bmApLCBgcmV0cnlBZnRlclNlY2AgKGludCwgb3B0aW9uYWwpLCBhbmQgYHJhd2Ag" + - "KHN1YnByb2Nlc3MgKyBIVFRQICsgS3ViZXJuZXRlcyBzaWduYWwpLiBBbHdheXMgY29uc3VtZSB0" + - "aGVzZSBpbiBgLS1qc29uYCBtb2RlIHJhdGhlciB0aGFuIHBhcnNpbmcgRW5nbGlzaCBmcm9tIHN0" + - "ZGVyci4KUEsHCHOnWmTVBgAA1QYAAFBLAwQUAAgAAAAAACEAAAAAAAAAAAAAAAAALQAJAGRhdGEv" + - "bnZjZi1zZWxmLW1hbmFnZWQtY2xpL3JlZmVyZW5jZS9mbGFncy5tZFVUBQABAKbOEiMgYG52Y2Yt" + - "Y2xpYCBmbGFnIHJlZmVyZW5jZQoKIyMgR2xvYmFsIGZsYWdzIChldmVyeSBzdWJjb21tYW5kKQoK" + - "fCBGbGFnIHwgUHVycG9zZSB8IERlZmF1bHQgfAp8LS0tfC0tLXwtLS18CnwgYC0tY29uZmlnIEZJ" + - "TEVgIHwgQ29uZmlnIGZpbGUgcGF0aCB8IGAkSE9NRS8ubnZjZi1jbGkueWFtbGAgfAp8IGAtLWRl" + - "YnVnYCB8IFZlcmJvc2UgSFRUUCBsb2dnaW5nIG9uIHN0ZGVyciB8IGBmYWxzZWAgfAp8IGAtLWpz" + - "b25gIHwgSlNPTkwgZXZlbnRzIG9uIHN0ZGVyciB8IGF1dG8gKG9mZiBpbiBUVFksIG9uIHVuZGVy" + - "IGAtLW5vbi1pbnRlcmFjdGl2ZWApIHwKCiMjIGBzZWxmLWhvc3RlZGAgcGFyZW50IChwZXJzaXN0" + - "ZW50IGFjcm9zcyBzdWJjb21tYW5kcykKCnwgRmxhZyB8IFB1cnBvc2UgfCBEZWZhdWx0IHwKfC0t" + - "LXwtLS18LS0tfAp8IGAtLWNvbnRyb2wtcGxhbmUtc3RhY2s94oCmYCB8IENvbnRyb2wtcGxhbmUg" + - "YnVuZGxlIHNvdXJjZTogbG9jYWwgcGF0aCwgZ2l0IFVSTCwgb3IgYG9jaTovL2AgVVJMIHwgZW1i" + - "ZWRkZWQgT0NJIFVSTCBwaW5uZWQgYnkgQ0xJIHZlcnNpb24gfAp8IGAtLWNvbXB1dGUtcGxhbmUt" + - "c3RhY2s94oCmYCB8IENvbXB1dGUtcGxhbmUgYnVuZGxlIHNvdXJjZTogbG9jYWwgcGF0aCwgZ2l0" + - "IFVSTCwgb3IgYG9jaTovL2AgVVJMIHwgZW1iZWRkZWQgT0NJIFVSTCBwaW5uZWQgYnkgQ0xJIHZl" + - "cnNpb24gfAp8IGAtLWVudj1sb2NhbFx8cHJkXHzigKZgIHwgSGVsbWZpbGUgZW52aXJvbm1lbnQg" + - "bmFtZSB8IGBsb2NhbGAgZm9yIGRldiBidWlsZHMsIGBwcmRgIGZvciByZWxlYXNlcyB8CnwgYC0t" + - "bm9uLWludGVyYWN0aXZlYCB8IERpc2FibGUgYWxsIHN0ZGluIHByb21wdHMgfCBgZmFsc2VgIHwK" + - "fCBgLS10b2tlbj0kSldUYCB8IEFkbWluIEpXVCwgb3ZlcnJpZGVzIHN0b3JlZCBzZXNzaW9uIHwg" + - "LSB8CnwgYC0tbm8tYXBwbHlgIHwgYGluc3RhbGxgIG9ubHkgLSBlbWl0IFlBTUwsIGRvIG5vdCBr" + - "dWJlY3RsIGFwcGx5IHwgYGZhbHNlYCB8CnwgYC0tb3V0cHV0PXRleHRcfGpzb25gIHwgTGVnYWN5" + - "IGFsaWFzIGZvciBgLS1qc29uYCAoZGVwcmVjYXRlZCwgcmVtb3ZlZCBpbiBuZXh0IG1ham9yKSB8" + - "IGB0ZXh0YCB8CnwgYC0tcGxhaW5gIHwgRm9yY2UgcGxhaW4gc3RyZWFtaW5nIG91dHB1dCB8IGF1" + - "dG8tZGV0ZWN0IHwKfCBgLS13YWl0IERVUkFUSU9OYCB8IGBjaGVja2Agb25seTsgYmxvY2sgdW50" + - "aWwgcGFzcyB8IC0gfAp8IGAtLWNvbnRyb2wtcGxhbmUtY29udGV4dCBDVFhgIHwga3ViZWN0bCBj" + - "b250ZXh0IGZvciBjb250cm9sIHBsYW5lIChSRVEtMjApIHwgY3VycmVudCBjb250ZXh0IHwKfCBg" + - "LS1jb21wdXRlLXBsYW5lLWNvbnRleHQgQ1RYYCB8IGt1YmVjdGwgY29udGV4dCBmb3IgY29tcHV0" + - "ZSBwbGFuZSAoUkVRLTIwKSB8IGN1cnJlbnQgY29udGV4dCB8CnwgYC0taWNtcy11cmwgVVJMYCB8" + - "IFB1YmxpYyBJQ01TIFVSTDsgcmVxdWlyZWQgd2hlbiBjb250ZXh0cyBkaWZmZXIgfCBkZXJpdmVk" + - "IGZyb20gYGJhc2VfaHR0cF91cmxgIHwKfCBgLS1sb2NhbC1vbmx5YCB8IGBjaGVjayAtLXByZWAg" + - "b25seTsgc2tpcCBhbGwga3ViZWN0bCBjb250YWN0IHwgYGZhbHNlYCB8CgojIyBgY2hlY2tgLXNw" + - "ZWNpZmljCgpBdCBsZWFzdCBvbmUgb2YgYC0tcHJlYCwgYC0tY29udHJvbC1wbGFuZWAsIGAtLWNv" + - "bXB1dGUtcGxhbmVgLCBvciBgLS1hbGxgIGlzCnJlcXVpcmVkLiBFYWNoIHNlbGVjdHMgYSByb2xl" + - "OyBvbmx5IHRoZSBzZWxlY3RlZCByb2xlcyBjb250YWN0IGEgY2x1c3Rlci4KCnwgRmxhZyB8IFB1" + - "cnBvc2UgfCBEZWZhdWx0IHwKfC0tLXwtLS18LS0tfAp8IGAtLXByZWAgfCBQcmUtZmxpZ2h0OiBs" + - "b2NhbC1ob3N0IHRvb2xzIHBsdXMgY2x1c3RlciByZWFkaW5lc3MgfCBgZmFsc2VgIHwKfCBgLS1j" + - "b250cm9sLXBsYW5lYCB8IENvbnRyb2wtcGxhbmUgY2hlY2tzIHwgYGZhbHNlYCB8CnwgYC0tY29t" + - "cHV0ZS1wbGFuZWAgfCBDb21wdXRlLXBsYW5lIGNoZWNrcyB8IGBmYWxzZWAgfAp8IGAtLWFsbGAg" + - "fCBFdmVyeSBjYXRlZ29yeSB8IGBmYWxzZWAgfAp8IGAtLWNsdXN0ZXItbmFtZSBOQU1FYCB8IENs" + - "dXN0ZXIgbmFtZSBmb3IgY29tcHV0ZS1wbGFuZSBjaGVja3MgfCAtIHwKfCBgLS1za2lwLWlub3Rp" + - "ZnktY2hlY2tgIHwgU2tpcCB0aGUgcGVyLW5vZGUgaW5vdGlmeS1saW1pdHMgcHJvYmUuIE5lZWRl" + - "ZCB3aGVuIHRoZSBrdWJlY29uZmlnIHVzZXIgY2Fubm90IGNyZWF0ZSBwb2RzIGluIGBkZWZhdWx0" + - "YC4gRW52OiBgTlZDRl9DTElfU0VMRkhPU1RFRF9TS0lQX0lOT1RJRllgIHwgYGZhbHNlYCB8Cgoj" + - "IyMgQ2x1c3Rlci12YWxpZGF0b3IgZmxhZ3MKClRoZSB2YWxpZGF0b3IgcnVucyBhcyBhIEpvYiBp" + - "biB0aGUgY2x1c3RlciBiZWluZyBjaGVja2VkLiBUaGUgQ0xJIGNyZWF0ZXMgYQpTZXJ2aWNlQWNj" + - "b3VudCwgQ2x1c3RlclJvbGUsIGFuZCBDbHVzdGVyUm9sZUJpbmRpbmcgZm9yIGl0IGFuZCByZW1v" + - "dmVzIHRoZW0KYWZ0ZXIgdGhlIHJ1biwgc28gdGhlIGt1YmVjb25maWcgY29udGV4dCBuZWVkcyBw" + - "ZXJtaXNzaW9uIHRvIG1hbmFnZSB0aG9zZS4KCnwgRmxhZyB8IFB1cnBvc2UgfCBEZWZhdWx0IHwK" + - "fC0tLXwtLS18LS0tfAp8IGAtLWNsdXN0ZXItdmFsaWRhdG9yLWltYWdlIFJFRmAgfCBWYWxpZGF0" + - "b3IgaW1hZ2UuIFJlc29sdXRpb24gb3JkZXI6IGZsYWcsIGBOVkNGX0NMSV9DTFVTVEVSX1ZBTElE" + - "QVRPUl9JTUFHRWAsIGNvbmZpZyBrZXkgYGNsdXN0ZXJfdmFsaWRhdG9yX2ltYWdlYC4gQSByZWYg" + - "d2l0aCBubyB0YWcgZGlzY292ZXJzIHRoZSBsYXRlc3Qgc3RhYmxlIHRhZyBmcm9tIHRoZSByZWdp" + - "c3RyeS4gVW5zZXQgZXZlcnl3aGVyZSBza2lwcyB0aGUgcHJvYmUgd2l0aCBhIHdhcm5pbmcgfCAt" + - "IHwKfCBgLS1jbHVzdGVyLXZhbGlkYXRvci1yZWdpc3RyaWVzIGhvc3Q6cG9ydCwuLi5gIHwgRXh0" + - "cmEgcmVnaXN0cmllcyB0aGUgY29udHJvbC1wbGFuZSB2YWxpZGF0b3IgcHJvYmVzIGZvciByZWFj" + - "aGFiaWxpdHkuIGBudmNyLmlvYCBpcyBhbHdheXMgcHJvYmVkLiBSZXBlYXRhYmxlIG9yIGNvbW1h" + - "LXNlcGFyYXRlZC4gRW52OiBgTlZDRl9DTElfQ0xVU1RFUl9WQUxJREFUT1JfUkVHSVNUUklFU2A7" + - "IGNvbmZpZyBrZXkgYGNsdXN0ZXJfdmFsaWRhdG9yX3JlZ2lzdHJpZXNgIHwgYG52Y3IuaW9gIG9u" + - "bHkgfAp8IGAtLWNsdXN0ZXItdmFsaWRhdG9yLXB1bGwtc2VjcmV0IE5BTUVgIHwgZG9ja2VyLXJl" + - "Z2lzdHJ5IFNlY3JldCBpbiBgZGVmYXVsdGAgdXNlZCB0byBwdWxsIHRoZSB2YWxpZGF0b3IgaW1h" + - "Z2UuIFdoZW4gZW1wdHksIHRoZSBDTEkgbG9va3MgZm9yIG9uZSBpbiB0aGUgTlZDRiBuYW1lc3Bh" + - "Y2VzIGFuZCBmYWxscyBiYWNrIHRvIG1pbnRpbmcgb25lIGZyb20gYE5HQ19BUElfS0VZYCB8IGF1" + - "dG8tZGV0ZWN0IHwKfCBgLS1za2lwLWNsdXN0ZXItdmFsaWRhdGlvbmAgfCBTa2lwIHRoZSBpbi1j" + - "bHVzdGVyIHZhbGlkYXRvciBwcm9iZSBlbnRpcmVseS4gRW52OiBgTlZDRl9DTElfU0VMRkhPU1RF" + - "RF9TS0lQX0NMVVNURVJfVkFMSURBVElPTmAgfCBgZmFsc2VgIHwKfCBgLS1uby1jbGVhbnVwYCB8" + - "IEtlZXAgdGhlIHZhbGlkYXRvciBKb2IgKGFuZCBpdHMgUkJBQykgYWZ0ZXIgdGhlIHJ1biBmb3Ig" + - "ZGVidWdnaW5nLiBUaGUgbmV4dCBydW4gc3RpbGwgc3dlZXBzIHByaW9yIEpvYnMgfCBgZmFsc2Vg" + - "IHwKfCBgLS1zaG93LWxvZ3NgIHwgUHJpbnQgdGhlIHZhbGlkYXRvciB0cmFuc2NyaXB0IHRvIHN0" + - "ZGVyciBhZnRlciB0aGUgY2hlY2sgZXZlbnRzLiBVc2VmdWwgd2hlbiBwaXBpbmcgYC0tanNvbmAg" + - "dG8gYSBzY3JpcHQgdGhhdCBhbHNvIHdhbnRzIHRoZSB0cmFuc2NyaXB0IHwgYGZhbHNlYCB8Cgoj" + - "IyBgdXBgLXNwZWNpZmljCgp8IEZsYWcgfCBQdXJwb3NlIHwgRGVmYXVsdCB8CnwtLS18LS0tfC0t" + - "LXwKfCBgLS1jbHVzdGVyLW5hbWUgTkFNRWAgfCBJQ01TIGNsdXN0ZXIgcm93IGlkZW50aWZpZXIg" + - "KHJlcXVpcmVkKSB8IC0gfAp8IGAtLW5jYS1pZCBJRGAgfCBOQ0EgYWNjb3VudCBJRCB8IGBudmNm" + - "LWRlZmF1bHRgIHwKfCBgLS1yZWdpb24gUkVHSU9OYCB8IENsdXN0ZXIgcmVnaW9uIHwgYHVzLXdl" + - "c3QtMWAgfAp8IGAtLXBsYW4tb25seWAgfCBEcnktcnVuOyBlbWl0IHBoYXNlIHBsYW4gKyBFVEFz" + - "IHdpdGhvdXQgY2hhbmdlcyB8IGBmYWxzZWAgfAoKIyMgYHN0YXR1c2Atc3BlY2lmaWMKCnwgRmxh" + - "ZyB8IFB1cnBvc2UgfCBEZWZhdWx0IHwKfC0tLXwtLS18LS0tfAp8IGAtLWNsdXN0ZXItbmFtZSBO" + - "QU1FYCB8IExpbWl0IHRvIG9uZSBjb21wdXRlIHBsYW5lIHwgLSAoY29udHJvbCArIGFsbCBjbHVz" + - "dGVycykgfAp8IGAtLXdhdGNoYCB8IExpdmUgcmUtcmVuZGVyIHwgYGZhbHNlYCB8CnwgYC0td2F0" + - "Y2gtaW50ZXJ2YWwgRFVSYCB8IGAtLXdhdGNoYCBjYWRlbmNlIHwgYDVzYCB8CnwgYC0tY29tcG9u" + - "ZW50IE5BTUVgIHwgRmlsdGVyIGNvbXBvbmVudHMgcGFuZWwgfCBhbGwgfAp8IGAtLW5vLWV2ZW50" + - "c2AgfCBTa2lwIGV2ZW50cyBwYW5lbCB8IGBmYWxzZWAgfAoKIyMgYGNsdXN0ZXIgcmVnaXN0ZXJg" + - "LXNwZWNpZmljCgp8IEZsYWcgfCBQdXJwb3NlIHwgRGVmYXVsdCB8CnwtLS18LS0tfC0tLXwKfCBg" + - "LS1uYW1lIE5BTUVgIHwgQ2x1c3RlciBuYW1lIChyZXF1aXJlZCkgfCAtIHwKfCBgLS1uY2EtaWQg" + - "SURgIHwgTkNBIElEIChyZXF1aXJlZCkgfCAtIHwKfCBgLS1yZWdpb24gUkVHSU9OYCB8IFJlZ2lv" + - "biB8IGB1cy13ZXN0LTFgIHwKfCBgLS1pY21zLXVybCBVUkxgIHwgSUNNUyBlbmRwb2ludCB8IGZy" + - "b20gY29uZmlnIHwKfCBgLS1pZ25vcmUtZXhpc3RpbmdgIHwgTWF0Y2gtb3ItY3JlYXRlIGluc3Rl" + - "YWQgb2YgZmFpbC1vbi1leGlzdHMgfCBgZmFsc2VgIHwKCiMjIGBhcGkta2V5IGdlbmVyYXRlYC1z" + - "cGVjaWZpYwoKfCBGbGFnIHwgUHVycG9zZSB8IERlZmF1bHQgfAp8LS0tfC0tLXwtLS18CnwgYC0t" + - "Zm9yIGZ1bmN0aW9uXHx0YXNrYCB8IEdlbmVyYXRlIG9ubHkgdGhlIHNwZWNpZmllZCBrZXkgdHlw" + - "ZSB8IChvbWl0IHRvIGdlbmVyYXRlIGJvdGgpIHwKfCBgLS1kZXNjcmlwdGlvbiBURVhUYCB8IEh1" + - "bWFuLXJlYWRhYmxlIGxhYmVsIGZvciB0aGUga2V5IHwgYEdlbmVyYXRlZCBieSBudmNmLWNsaWAg" + - "fAp8IGAtLWV4cGlyZXMtaW4gRFVSQVRJT05gIHwgRXhwaXJ5IG9mZnNldCAoZS5nLiBgMjRoYCwg" + - "YDdkYCk7IHBhcnNlZCBhcyBleHRlbmRlZCBkdXJhdGlvbiB8IGAyNGhgIHwKfCBgLS1zY29wZXMg" + - "U0NPUEVbLFNDT1BFXWAgfCBPdmVycmlkZSBkZWZhdWx0IHNjb3BlczsgcmVxdWlyZXMgYC0tZm9y" + - "YCB8IChzZXJ2aWNlIGRlZmF1bHRzKSB8CnwgYC0tdmFsaWRhdGVgIHwgVmFsaWRhdGUgZWFjaCBn" + - "ZW5lcmF0ZWQga2V5IGltbWVkaWF0ZWx5IGFmdGVyIG1pbnRpbmcgfCBgZmFsc2VgIHwKCkV4dGVu" + - "ZGVkIGR1cmF0aW9uIHVuaXRzOiBgc2AgKHNlY29uZHMpLCBgbWAgKG1pbnV0ZXMpLCBgaGAgKGhv" + - "dXJzKSwgYGRgIChkYXlzKSwgYHdgICh3ZWVrcykuCgojIyBgZnVuY3Rpb24gY3JlYXRlYC1zcGVj" + - "aWZpYwoKYC0taW5wdXQtZmlsZSBGSUxFYCBpcyByZWNvbW1lbmRlZCBmb3IgcmVwZWF0YWJsZSBm" + - "dW5jdGlvbiBkZWZpbml0aW9ucy4gRm9yIGFkLWhvYyBjcmVhdGVzOgoKfCBGbGFnIHwgUHVycG9z" + - "ZSB8IERlZmF1bHQgfAp8LS0tfC0tLXwtLS18CnwgYC0tbmFtZSBOQU1FYCB8IEZ1bmN0aW9uIG5h" + - "bWUgfCAtIHwKfCBgLS1pbWFnZSBJTUFHRWAgfCBDb250YWluZXIgaW1hZ2UgfCAtIHwKfCBgLS1p" + - "bmZlcmVuY2UtdXJsIFVSSWAgfCBDb250YWluZXIgaW5mZXJlbmNlIGVuZHBvaW50IHwgLSB8Cnwg" + - "YC0taW5mZXJlbmNlLXBvcnQgUE9SVGAgfCBDb250YWluZXIgaW5mZXJlbmNlIHBvcnQgfCAtIHwK" + - "fCBgLS1mdW5jdGlvbi10eXBlIERFRkFVTFRcfFNUUkVBTUlOR1x8TExNYCB8IEZ1bmN0aW9uIHR5" + - "cGUgfCBgREVGQVVMVGAgfAp8IGAtLWhlbG0tY2hhcnQgQ0hBUlRgIHwgSGVsbSBjaGFydCBVUkwg" + - "b3IgT0NJIHJlZmVyZW5jZS4gQ2FuIGJlIHVzZWQgd2l0aCBgLS1mdW5jdGlvbi10eXBlPUxMTWAg" + - "Zm9yIGNoYXJ0LXBhY2thZ2VkIExMTSB3b3JrbG9hZHMuIHwgLSB8CnwgYC0taGVsbS1jaGFydC1z" + - "ZXJ2aWNlIE5BTUVgIHwgS3ViZXJuZXRlcyBTZXJ2aWNlIG5hbWUgZXhwb3NlZCBieSB0aGUgY2hh" + - "cnQuIFJlcXVpcmVkIHdoZW4gYC0taGVsbS1jaGFydGAgaXMgc2V0LiB8IC0gfAp8IGAtLW1vZGVs" + - "cyBOQU1FOlZFUlNJT046VVJJYCB8IFN0YW5kYXJkIG1vZGVsIGFydGlmYWN0OyByZXBlYXRhYmxl" + - "IHwgLSB8CnwgYC0tbGxtLW1vZGVsIFNQRUNgIHwgTExNIG1vZGVsIGNvbmZpZzsgZm9ybWF0IGBu" + - "YW1lPTxtb2RlbD4sdXJpcz08dXJpPlx8PHVyaT4scm91dGluZ01ldGhvZD08bWV0aG9kPix0b2tl" + - "blJhdGVMaW1pdD08bGltaXQ+YDsgcmVwZWF0YWJsZS4gVG9rZW4gbGltaXRzIHVzZSBgPHZhbHVl" + - "Pi08dW5pdD5gIHdpdGggYFNgLCBgTWAsIGBIYCwgYERgLCBvciBgV2AsIGZvciBleGFtcGxlIGAx" + - "MDAwLVNgLiBVc2UgaW5wdXQgSlNPTiBmb3IgY29tYmluZWQgdG9rZW4gbGltaXRzIGJlY2F1c2Ug" + - "aW5saW5lIHNwZWNzIHVzZSBjb21tYXMgYXMgZmllbGQgc2VwYXJhdG9ycy4gfCAtIHwKfCBgLS1s" + - "bG0tZGVmYXVsdC1wcmlvcml0eSBQUklPUklUWWAgfCBGdW5jdGlvbi1sZXZlbCBkZWZhdWx0IHJl" + - "cXVlc3QgcHJpb3JpdHkuIExvd2VyIHZhbHVlcyBoYXZlIGhpZ2hlciBwcmlvcml0eS4gfCAtIHwK" + - "fCBgLS1sbG0tcGVyLWFjY291bnQtcHJpb3JpdHkgTkNBLUlEOlBSSU9SSVRZYCB8IFBlci1hY2Nv" + - "dW50IHByaW9yaXR5IG92ZXJyaWRlOyByZXBlYXRhYmxlOyBzdXBwb3J0cyB1cCB0byA2NCBkaXN0" + - "aW5jdCBOQ0EgSUQgb3ZlcnJpZGVzLiBSZXF1aXJlcyBhIGRlZmF1bHQgcHJpb3JpdHkuIHwgLSB8" + - "CgpJbiBKU09OIGFuZCBpbmxpbmUgc3BlY3MsIExMTSBmdW5jdGlvbnMgc2V0IGBmdW5jdGlvblR5" + - "cGU6ICJMTE0iYCBhbmQgbW9kZWwgcm91dGluZyBtZXRhZGF0YSB1bmRlciBgbW9kZWxzW10ubGxt" + - "Q29uZmlnYC4gYGxsbUNvbmZpZy51cmlzYCBkZWNsYXJlcyB0aGUgT3BlbkFJLWNvbXBhdGlibGUg" + - "dXBzdHJlYW0gcGF0aHMgZXhwb3NlZCBieSB0aGUgbW9kZWwuIEN1cnJlbnQgc3VwcG9ydGVkIHBh" + - "dGhzIGFyZSBgL3YxL2NoYXQvY29tcGxldGlvbnNgLCBgL3YxL3Jlc3BvbnNlc2AsIGFuZCBgL3Yx" + - "L2VtYmVkZGluZ3NgLiBgbGxtQ29uZmlnLnJvdXRpbmdNZXRob2RgIGFjY2VwdHMgYHJvdW5kX3Jv" + - "YmluYCwgYHBvd2VyX29mX3R3b2AsIGBncm9xX211bHRpcmVnaW9uYCwgYHB1bHNhcmAsIG9yIGBy" + - "YW5kb21gLgpgbGxtQ29uZmlnLnRva2VuUmF0ZUxpbWl0YCBhY2NlcHRzIG9uZSBvciBtb3JlIGNv" + - "bW1hLXNlcGFyYXRlZCBwb3NpdGl2ZSBpbnRlZ2VyIHRva2VuIGxpbWl0cyBpbiBgPHZhbHVlPi08" + - "dW5pdD5gIGZvcm1hdC4gU3VwcG9ydGVkIHVuaXRzIGFyZSBgU2AgKHNlY29uZHMpLCBgTWAgKG1p" + - "bnV0ZXMpLCBgSGAgKGhvdXJzKSwgYERgIChkYXlzKSwgYW5kIGBXYCAod2Vla3MpLiBVc2UgZGlz" + - "dGluY3QgdW5pdHMgd2hlbiBjb21iaW5pbmcgbGltaXRzLCBmb3IgZXhhbXBsZSBgMTAwMC1TLDUw" + - "MDAtTSwxMDAwMDAtSCw1MDAwMDAtRCwxMDAwMDAwLVdgIGluIGlucHV0IEpTT04uCgpIZWxtIGNo" + - "YXJ0IHBhY2thZ2luZyBpcyBpbmRlcGVuZGVudCBvZiBgZnVuY3Rpb25UeXBlYC4gRm9yIGEgSGVs" + - "bS1jaGFydCBiYWNrZWQgTExNIGZ1bmN0aW9uLCBzZXQgYGZ1bmN0aW9uVHlwZTogIkxMTSJgLCBg" + - "aGVsbUNoYXJ0YCwgYGhlbG1DaGFydFNlcnZpY2VOYW1lYCwgYW5kIGBtb2RlbHNbXS5sbG1Db25m" + - "aWdgIGluIHRoZSBzYW1lIGNyZWF0ZSByZXF1ZXN0LiBgaW5mZXJlbmNlUG9ydGAgbXVzdCBiZSB0" + - "aGUgS3ViZXJuZXRlcyBTZXJ2aWNlIHBvcnQgZXhwb3NlZCBieSBgaGVsbUNoYXJ0U2VydmljZU5h" + - "bWVgLgoKTExNIGludm9jYXRpb24gcmVxdWVzdHMgdXNlIGBtb2RlbDogIjxmdW5jdGlvbi1pZD4v" + - "PG1vZGVsLW5hbWU+ImAuIFRoZSBmdW5jdGlvbiBJRCBzZWxlY3RzIHRoZSBOVkNGIGZ1bmN0aW9u" + - "LCBhbmQgdGhlIG1vZGVsIG5hbWUgaXMgZm9yd2FyZGVkIHVwc3RyZWFtLiBDaGF0IGNvbXBsZXRp" + - "b25zIGFuZCBSZXNwb25zZXMgQVBJIHJlcXVlc3RzIGNhbiB1c2UgYHgtbXVsdGktdHVybi1zZXNz" + - "aW9uLWlkYCBmb3Igc2Vzc2lvbiBzdGlja2luZXNzOyBlbWJlZGRpbmdzIHJlcXVlc3RzIGRvIG5v" + - "dC4KCiMjIGBmdW5jdGlvbiB1cGRhdGVgLXNwZWNpZmljCgp8IEZsYWcgfCBQdXJwb3NlIHwgRGVm" + - "YXVsdCB8CnwtLS18LS0tfC0tLXwKfCBgLS10YWdzIFRBR1ssVEFHXWAgfCBSZXBsYWNlIGZ1bmN0" + - "aW9uIHRhZ3MgfCAtIHwKfCBgLS1sbG0tbW9kZWwtdXBkYXRlIFNQRUNgIHwgTExNIG1vZGVsIHVw" + - "ZGF0ZTsgZm9ybWF0IGBuYW1lPTxtb2RlbD4scm91dGluZ01ldGhvZD08bWV0aG9kPix0b2tlblJh" + - "dGVMaW1pdD08bGltaXQ+YDsgcmVwZWF0YWJsZS4gUm91dGluZyBtZXRob2RzIG1hdGNoIGAtLWxs" + - "bS1tb2RlbGAuIFRva2VuIGxpbWl0IGV4YW1wbGU6IGAxMDAwLVNgLiBVc2UgaW5wdXQgSlNPTiBm" + - "b3IgY29tYmluZWQgdG9rZW4gbGltaXRzLiB8IC0gfAp8IGAtLWxsbS1kZWZhdWx0LXByaW9yaXR5" + - "IFBSSU9SSVRZYCB8IFJlcGxhY2UgdGhlIGZ1bmN0aW9uLWxldmVsIHByaW9yaXR5IGNvbmZpZ3Vy" + - "YXRpb24gd2l0aCB0aGlzIGRlZmF1bHQgYW5kIGFueSBzdXBwbGllZCBwZXItYWNjb3VudCBvdmVy" + - "cmlkZXMuIHwgLSB8CnwgYC0tbGxtLXBlci1hY2NvdW50LXByaW9yaXR5IE5DQS1JRDpQUklPUklU" + - "WWAgfCBQZXItYWNjb3VudCBwcmlvcml0eSBvdmVycmlkZTsgcmVwZWF0YWJsZTsgc3VwcG9ydHMg" + - "dXAgdG8gNjQgZGlzdGluY3QgTkNBIElEIG92ZXJyaWRlcy4gUmVxdWlyZXMgYSBkZWZhdWx0IHBy" + - "aW9yaXR5LiB8IC0gfAoKSW4gSlNPTiwgYGZ1bmN0aW9uIHVwZGF0ZWAgYWNjZXB0cyBgbW9kZWxV" + - "cGRhdGVzW11gIGVudHJpZXMgd2l0aCBgbW9kZWxOYW1lYCBhbmQgYGxsbUNvbmZpZy5yb3V0aW5n" + - "TWV0aG9kYCBhbmQvb3IgYGxsbUNvbmZpZy50b2tlblJhdGVMaW1pdGAuIGB1cmlzYCBhcmUgY3Jl" + - "YXRlLXRpbWUgbW9kZWwgbWV0YWRhdGEgYW5kIGFyZSBub3QgcGFydCBvZiBtb2RlbCB1cGRhdGVz" + - "LgoKIyMgYGZ1bmN0aW9uIGRlcGxveSBjcmVhdGVgLXNwZWNpZmljCgpgLS1pbnB1dC1maWxlIEZJ" + - "TEVgIGlzIHJlY29tbWVuZGVkIChmdWxsIEpTT04gc3BlYykuIEZvciBhZC1ob2Mgb25lLXNob3Qg" + - "dXNlOgoKfCBGbGFnIHwgUHVycG9zZSB8IERlZmF1bHQgfAp8LS0tfC0tLXwtLS18CnwgYC0tZnVu" + - "Y3Rpb24taWQgSURgIHwgRnVuY3Rpb24gSUQgKHJlcXVpcmVkKSB8IC0gfAp8IGAtLWdwdSBOQU1F" + - "YCB8IEdQVSBmYW1pbHkgfCBgSDEwMGAgfAp8IGAtLWluc3RhbmNlLXR5cGUgVFlQRWAgfCBTS1Ug" + - "fCBgTkNQLkdQVS5IMTAwXzF4YCB8CnwgYC0tbWluLWluc3RhbmNlcyBOYCB8IE1pbiByZXBsaWNh" + - "cyB8IGAxYCB8CnwgYC0tbWF4LWluc3RhbmNlcyBOYCB8IE1heCByZXBsaWNhcyB8IGAxYCB8Cnwg" + - "YC0tbWF4LXJlcXVlc3QtY29uY3VycmVuY3kgTmAgfCBDb25jdXJyZW5jeSB8IGAwYCAodW5zZXQ7" + - "IHNlcnZlciBkZWZhdWx0IGFwcGxpZXMpIHwKfCBgLS1jbHVzdGVycyBOQU1FWyxOQU1FXWAgfCBU" + - "YXJnZXQgc3BlY2lmaWMgY29tcHV0ZSBjbHVzdGVycyB8IChhbnkgbWF0Y2hpbmcgU0tVKSB8Cgoj" + - "IyBgdGFzayBjcmVhdGVgLXNwZWNpZmljCgpgLS1pbnB1dC1maWxlIEZJTEVgIGlzIHJlY29tbWVu" + - "ZGVkIGZvciByZXBlYXRhYmxlIHRhc2sgZGVmaW5pdGlvbnMuIEZvciBhZC1ob2MgdXNlOgoKfCBG" + - "bGFnIHwgUHVycG9zZSB8IE5vdGVzIHwKfC0tLXwtLS18LS0tfAp8IGAtLW5hbWUgTkFNRWAgfCBU" + - "YXNrIG5hbWUgKHJlcXVpcmVkKSB8IDEtMTI4IGNoYXJzLCBgXlthLXowLTlBLVpdW2EtejAtOUEt" + - "WlwtX10qJGAgfAp8IGAtLWdwdSBHUFVgIHwgR1BVIG5hbWUgKHJlcXVpcmVkIHdpdGhvdXQgYC0t" + - "aW5wdXQtZmlsZWApIHwgRXhhbXBsZTogYEgxMDBgIHwKfCBgLS1pbnN0YW5jZS10eXBlIFRZUEVg" + - "IHwgSW5zdGFuY2UgdHlwZSAocmVxdWlyZWQgd2l0aG91dCBgLS1pbnB1dC1maWxlYCkgfCBFeGFt" + - "cGxlOiBgTkNQLkdQVS5IMTAwXzF4YCB8CnwgYC0taW1hZ2UgSU1BR0VgIHwgQ29udGFpbmVyIGlt" + - "YWdlIHwgTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYC0taGVsbS1jaGFydGAgfAp8IGAtLWhlbG0t" + - "Y2hhcnQgQ0hBUlRgIHwgSGVsbSBjaGFydCBVUkwgb3IgT0NJIHJlZmVyZW5jZSB8IE11dHVhbGx5" + - "IGV4Y2x1c2l2ZSB3aXRoIGAtLWltYWdlYCB8CnwgYC0taW5wdXQtZmlsZSBGSUxFYCB8IEpTT04g" + - "dGFzayBzcGVjIGZpbGUgfCBDTEkgZmxhZ3Mgb3ZlcnJpZGUgSlNPTiB2YWx1ZXMgd2hlbiBib3Ro" + - "IGFyZSBzZXQgfAp8IGAtLWJhY2tlbmQgQkFDS0VORGAgfCBCYWNrZW5kIC8gQ1NQIHwgLSB8Cnwg" + - "YC0tY2x1c3RlcnMgTkFNRVssTkFNRV1gIHwgU3BlY2lmaWMgY2x1c3RlcnMgd2l0aGluIHRoZSBp" + - "bnN0YW5jZSB8IENvbW1hLXNlcGFyYXRlZCB8CnwgYC0tY29udGFpbmVyLWFyZ3MgQVJHU2AgfCBB" + - "cmdzIHBhc3NlZCB3aGVuIGxhdW5jaGluZyB0aGUgY29udGFpbmVyIHwgU2luZ2xlIHN0cmluZywg" + - "ZS5nLiBgIi0tZXBvY2hzIDEwIC0tYmF0Y2gtc2l6ZSAzMiJgIHwKfCBgLS1jb250YWluZXItZW52" + - "IE5BTUU9dmFsdWVgIHwgQ29udGFpbmVyIGVudmlyb25tZW50IHZhcmlhYmxlOyByZXBlYXRhYmxl" + - "IHwgLSB8CnwgYC0tc2VjcmV0cyBOQU1FPXZhbHVlYCB8IFNlY3JldCBlbnZpcm9ubWVudCB2YXJp" + - "YWJsZTsgcmVwZWF0YWJsZTsgZW5jcnlwdGVkIGF0IHJlc3QgfCAtIHwKfCBgLS1tYXgtcnVudGlt" + - "ZSBEVVJBVElPTmAgfCBNYXggd2FsbC1jbG9jayBydW4gdGltZSAoSVNPIDg2MDEsIGUuZy4gYFBU" + - "NEhgKSB8IE5vIGRlZmF1bHQ7IG9taXQgZm9yIG5vIHRpbWUgbGltaXQgfAp8IGAtLW1heC1xdWV1" + - "ZWQgRFVSQVRJT05gIHwgTWF4IHRpbWUgaW4gcXVldWUgYmVmb3JlIGNhbmNlbGxhdGlvbiAoSVNP" + - "IDg2MDEpIHwgU2VydmVyIGRlZmF1bHQgYFBUNzJIYCB8CnwgYC0tdGVybWluYXRpb24tZ3JhY2Ug" + - "RFVSQVRJT05gIHwgR3JhY2UgcGVyaW9kIGFmdGVyIHN0b3Agc2lnbmFsIChJU08gODYwMSkgfCBT" + - "ZXJ2ZXIgZGVmYXVsdCBgUFQxSGAgfAp8IGAtLXJlc3VsdC1zdHJhdGVneSBVUExPQURcfE5PTkVg" + - "IHwgSG93IHRvIGhhbmRsZSB0YXNrIG91dHB1dCBhcnRpZmFjdHMgfCAtIHwKfCBgLS1yZXN1bHRz" + - "LWxvY2F0aW9uIExPQ0FUSU9OYCB8IFJlc3VsdCB1cGxvYWQgdGFyZ2V0LCBmb3JtYXQgYG9yZy1u" + - "YW1lL1t0ZWFtLW5hbWUvXW1vZGVsLW5hbWVgOyByZXF1aXJlZCB3aGVuIGAtLXJlc3VsdC1zdHJh" + - "dGVneT1VUExPQURgIHwgLSB8CnwgYC0tbW9kZWxzIE5BTUU6VkVSU0lPTjpVUklgIHwgTW9kZWwg" + - "YXJ0aWZhY3Q7IHJlcGVhdGFibGUgfCAtIHwKfCBgLS1yZXNvdXJjZXMgTkFNRTpWRVJTSU9OOlVS" + - "SWAgfCBSZXNvdXJjZSBhcnRpZmFjdDsgcmVwZWF0YWJsZSB8IC0gfAp8IGAtLXRhZ3MgVEFHWyxU" + - "QUddYCB8IFRhc2sgdGFncyB8IENvbW1hLXNlcGFyYXRlZCB8CnwgYC0tZGVzY3JpcHRpb24gVEVY" + - "VGAgfCBUYXNrIGRlc2NyaXB0aW9uIHwgLSB8CnwgYC0tbG9ncy10ZWxlbWV0cnktaWQgVVVJRGAg" + - "fCBMb2dzIHRlbGVtZXRyeSBlbmRwb2ludCBJRCB8IC0gfAp8IGAtLW1ldHJpY3MtdGVsZW1ldHJ5" + - "LWlkIFVVSURgIHwgTWV0cmljcyB0ZWxlbWV0cnkgZW5kcG9pbnQgSUQgfCAtIHwKfCBgLS10cmFj" + - "ZXMtdGVsZW1ldHJ5LWlkIFVVSURgIHwgVHJhY2VzIHRlbGVtZXRyeSBlbmRwb2ludCBJRCB8IC0g" + - "fApQSwcIUQbfxegtAADoLQAAUEsDBBQACAAAAAAAIQAAAAAAAAAAAAAAAAA3AAkAZGF0YS9udmNm" + - "LXNlbGYtbWFuYWdlZC1jbGkvcmVmZXJlbmNlL3Ryb3VibGVzaG9vdGluZy5tZFVUBQABAKbOEiMg" + - "VHJvdWJsZXNob290aW5nCgpLbm93biBlcnJvcnMg4oaSIGRpYWdub3N0aWMgY29tbWFuZCDihpIg" + - "cmVtZWRpYXRpb24uIEtlZXAgaW4gc3luYyB3aXRoIHRoZSBzdHJ1Y3R1cmVkIGBwaGFzZV9mYWls" + - "ZWRgIGV2ZW50cyB0aGUgQ0xJIGVtaXRzIChSRVEtMTUpIOKAlCBldmVyeSBlbnRyeSBiZWxvdyBz" + - "aG91bGQgbWFwIHRvIGFuIGBlcnJDYXRlZ29yeWAgYW5kIGEgYHJlbWVkaWF0aW9uYCBhcnJheS4K" + - "CiMjIFByZS1mbGlnaHQKCnwgU3ltcHRvbSB8IENhdXNlIHwgUmVtZWRpYXRpb24gfAp8LS0tfC0t" + - "LXwtLS18CnwgYGt1YmVjdGwgbm90IG9uIFBBVEhgIHwgT3BlcmF0b3IncyBgJFBBVEhgIGRvZXNu" + - "J3QgaW5jbHVkZSBrdWJlY3RsIHwgSW5zdGFsbCBrdWJlY3RsIDEuMjgrOiBodHRwczovL2t1YmVy" + - "bmV0ZXMuaW8vZG9jcy90YXNrcy90b29scy9pbnN0YWxsLWt1YmVjdGwvIHwKfCBgaGVsbWZpbGUg" + - "bm90IG9uIFBBVEhgIHwgU2FtZSB8IGh0dHBzOi8vZ2l0aHViLmNvbS9oZWxtZmlsZS9oZWxtZmls" + - "ZSNpbnN0YWxsYXRpb24gfAp8IGBoZWxtIG5vdCBvbiBQQVRIYCB8IFNhbWUgfCBodHRwczovL2hl" + - "bG0uc2gvZG9jcy9pbnRyby9pbnN0YWxsLyB8CnwgYEdhdGV3YXkgQVBJIENSRHMgbm90IGluc3Rh" + - "bGxlZGAgfCBlbnZveS1nYXRld2F5IHByZXJlcSBtaXNzaW5nIHwgYGhlbG0gaW5zdGFsbCBlZyBv" + - "Y2k6Ly9kb2NrZXIuaW8vZW52b3lwcm94eS9nYXRld2F5LWhlbG0gLS1uYW1lc3BhY2U9ZW52b3kt" + - "Z2F0ZXdheS1zeXN0ZW0gLS1jcmVhdGUtbmFtZXNwYWNlYCB8CnwgYGRlZmF1bHQgU3RvcmFnZUNs" + - "YXNzIG5vdCBhdmFpbGFibGVgIHwgQ2x1c3RlciBoYXMgbm8gZGVmYXVsdCBTQyB8IEFubm90YXRl" + - "IG9uZTogYGt1YmVjdGwgcGF0Y2ggc2MgPG5hbWU+IC1wICd7Im1ldGFkYXRhIjp7ImFubm90YXRp" + - "b25zIjp7InN0b3JhZ2VjbGFzcy5rdWJlcm5ldGVzLmlvL2lzLWRlZmF1bHQtY2xhc3MiOiJ0cnVl" + - "In19fSdgIHwKfCBgR1BVIG9wZXJhdG9yIG5vdCBpbnN0YWxsZWRgIChjb21wdXRlLXBsYW5lKSB8" + - "IG52aWRpYSBHUFUgb3BlcmF0b3IgbWlzc2luZyB8IEluc3RhbGwgcGVyIGh0dHBzOi8vZG9jcy5u" + - "dmlkaWEuY29tL2RhdGFjZW50ZXIvY2xvdWQtbmF0aXZlL2dwdS1vcGVyYXRvci9sYXRlc3QvaW5z" + - "dGFsbC1ncHUtb3BlcmF0b3IuaHRtbCwgT1IgdXNlIGBmYWtlLWdwdS1vcGVyYXRvcmAgZm9yIGRl" + - "diB8CnwgYEdQVSBub2RlIGxhYmVscyBtaXNzaW5nYCAoY29tcHV0ZS1wbGFuZSkgfCBOb2RlcyBu" + - "ZWVkIGBudmlkaWEuY29tL2dwdS5mYW1pbHlgIGV0Yy4gfCBTZXQgYC0tazNzLW5vZGUtbGFiZWwg" + - "bnZpZGlhLmNvbS9ncHUuZmFtaWx5PWhvcHBlckBhZ2VudDpOYCBmb3IgazNkIHwKCiMjIEF1dGgK" + - "CnwgU3ltcHRvbSB8IENhdXNlIHwgUmVtZWRpYXRpb24gfAp8LS0tfC0tLXwtLS18CnwgYGFkbWlu" + - "IHRva2VuIHJlcXVpcmVkYCAoaW5pdCBub3QgcnVuKSB8IE5vIGB+Ly5udmNmLWNsaS5zdGF0ZWAg" + - "YW5kIGAtLXRva2VuYCBub3QgcGFzc2VkIHwgYG52Y2YtY2xpIGluaXRgIChpbnRlcmFjdGl2ZSkg" + - "b3IgYC0tdG9rZW49JEpXVCAtLW5vbi1pbnRlcmFjdGl2ZWAgKENJKSB8CnwgYFNpZ25lZCBKV1Qg" + - "cmVqZWN0ZWQ6IEFub3RoZXIgYWxnb3JpdGhtIGV4cGVjdGVkLCBvciBubyBtYXRjaGluZyBrZXko" + - "cykgZm91bmRgIHwgU3RhbGUgc2Vzc2lvbi5qc29uIGZyb20gYSBkaWZmZXJlbnQgY29udHJvbCBw" + - "bGFuZSB8IGBybSB+Ly5udmNmLWNsaS5zdGF0ZWAgdGhlbiBgbnZjZi1jbGkgaW5pdGAgYWdhaW4g" + - "fAp8IGA0MDMgbWlzc2luZyByZXF1ZXN0ZWQgYXV0aG9yaXRpZXNgIChmdW5jdGlvbiBpbnZva2Up" + - "IHwgQWRtaW4gdG9rZW4gZG9lc24ndCBoYXZlIGBpbnZva2VfZnVuY3Rpb25gIHNjb3BlIHwgYG52" + - "Y2YtY2xpIGFwaS1rZXkgZ2VuZXJhdGUgLS1kZXNjcmlwdGlvbj3igKZgIHRoZW4gcmUtcnVuIGlu" + - "dm9rZSB8CgojIyBJbnN0YWxsIC8gYHVwYAoKfCBTeW1wdG9tIHwgQ2F1c2UgfCBSZW1lZGlhdGlv" + - "biB8CnwtLS18LS0tfC0tLXwKfCBIZWxtIGB0aW1lZCBvdXQgd2FpdGluZyBmb3IgY2Fzc2FuZHJh" + - "YCB8IENhc3NhbmRyYSBTdGF0ZWZ1bFNldCBQVkMgc3R1Y2sgYFBlbmRpbmdgIHwgQ29uZmlybSBk" + - "ZWZhdWx0IFN0b3JhZ2VDbGFzczsgY2hlY2sgYGt1YmVjdGwgZ2V0IHB2LHB2YyAtbiBjYXNzYW5k" + - "cmEtc3lzdGVtYCB8CnwgYEludmFsaWQgR1BVICdOQ1AuR1BVLkgxMDAnIHNwZWNpZmllZGAgKGZ1" + - "bmN0aW9uIGRlcGxveSkgfCBXcm9uZyBmaWVsZCDigJQgYGdwdWAgaXMgdGhlIGZhbWlseSwgbm90" + - "IHRoZSBTS1UgfCBVc2UgYCJncHUiOiAiSDEwMCJgLCBgImluc3RhbmNlVHlwZSI6ICJOQ1AuR1BV" + - "LkgxMDBfMXgiYCB8CnwgYHJlZ2lvbiBtdXN0IGJlIHByb3ZpZGVkYCAoY2x1c3RlciByZWdpc3Rl" + - "ciAvIGluc3RhbGwgLS1jb21wdXRlLXBsYW5lKSB8IGAtLXJlZ2lvbmAgZW1wdHkgKyBgQ0xVU1RF" + - "Ul9SRUdJT05gIGVudiBlbXB0eSB8IFBhc3MgYC0tcmVnaW9uPXVzLXdlc3QtMWAgKG9yIGFueSBu" + - "b24tZW1wdHkgdmFsdWUpIHwKfCBgcmVxdWlyZWRFbnYgIk5DQV9JRCIgaXMgbm90IHNldGAgKGhl" + - "bG1maWxlIGVycm9yIGR1cmluZyBjb21wdXRlLXBsYW5lIGFwcGx5KSB8IE9sZGVyIG52Y2YtY2xp" + - "IGJlZm9yZSBjb21taXQgYDZhYTU3MDRgOyBFeHRyYUVudiBub3QgcHJvcGFnYXRpbmcgTkNBX0lE" + - "IHwgVXBncmFkZSBgbnZjZi1jbGlgIHRvIGEgcmVsZWFzZSBhZnRlciBgNmFhNTcwNGAgfAp8IGBu" + - "dmNhLW9wZXJhdG9yOiBJbWFnZVB1bGxCYWNrT2ZmYCBmb3IgYG52Y2Etb3BlcmF0b3I6cHNhdGAg" + - "fCBJbWFnZSBub3QgaW4gY2x1c3RlciByZWdpc3RyeTsgbXVsdGktY2x1c3RlciBidWlsZCBpcyBs" + - "b2NhbCB8IGBrM2QgaW1hZ2UgaW1wb3J0IG52Y3IuaW8vLi4uL252Y2Etb3BlcmF0b3I6cHNhdCAt" + - "YyA8Y2x1c3Rlcj5gIHwKCiMjIENvbXB1dGUtcGxhbmUgcnVudGltZQoKfCBTeW1wdG9tIHwgQ2F1" + - "c2UgfCBSZW1lZGlhdGlvbiB8CnwtLS18LS0tfC0tLXwKfCBOVkNBIGFnZW50IENyYXNoTG9vcEJh" + - "Y2tPZmYgd2l0aCBgSFRUUCA0MDFgIG9uIGAvdjEvbnZjYS9jbHVzdGVycy8uLi4vcmVnaXN0ZXJg" + - "IHwgU3RhbGUgYG91dC88Y2x1c3Rlcj4tcmVnaXN0ZXItdmFsdWVzLnlhbWxgIGZyb20gcHJpb3Ig" + - "cmVnaXN0ZXI7IGNsdXN0ZXIgSUQgZG9lc24ndCBtYXRjaCBJQ01TIHwgRGVsZXRlIHRoZSBzdGFs" + - "ZSBmaWxlOyByZS1ydW4gYG52Y2YtY2xpIHNlbGYtaG9zdGVkIHVwYCAoaWRlbXBvdGVudCByZWdp" + - "c3RlciB3cml0ZXMgYSBmcmVzaCBmaWxlKSB8CnwgYE5vIGNsdXN0ZXIgZm91bmQgd2l0aCB2YWxp" + - "ZCBKV0tTIGZvciBjbHVzdGVyIElEOiA8aWQ+YCAoSUNNUyBsb2cpIHwgSldLUyBpbiBJQ01TIGRv" + - "ZXNuJ3QgbWF0Y2ggd2hhdCBjb21wdXRlLXBsYW5lIEs4cyBpcyBjdXJyZW50bHkgc2lnbmluZyB8" + - "IGBudmNmLWNsaSBjbHVzdGVyIHJvdGF0ZSAtLWNsdXN0ZXItaWQ9PGlkPmAgfAp8IEZ1bmN0aW9u" + - "IHBvZCBgSW1hZ2VQdWxsQmFja09mZmAgaW4gYG52Y2YtYmFja2VuZGAgfCBJbWFnZS1jcmVkZW50" + - "aWFsLWhlbHBlciBjb25maWcgbWlzc2luZyBvciB3cm9uZyB8IGBrdWJlY3RsIGRlc2NyaWJlIHBv" + - "ZCAtbiBudmNmLWJhY2tlbmQgPHBvZD5gOyBjaGVjayB0aGUgcHVsbCBzZWNyZXQgY29uZmlnIHwK" + - "fCBGdW5jdGlvbiBkZXBsb3kgc3R1Y2sgYERFUExPWUlOR2AgZm9yID41IG1pbiB8IE5BVFMgc3Ry" + - "ZWFtIGluaXQgbGFnIChjb2xkLWNsdXN0ZXIpIOKAlCB3YWl0LCBvciBjaGVjayBOQVRTIGF1dGgt" + - "Y2FsbG91dCBoZWFsdGggfCBga3ViZWN0bCBsb2dzIC1uIG5hdHMtc3lzdGVtIC1sIGFwcC5rdWJl" + - "cm5ldGVzLmlvL25hbWU9bmF0cy1hdXRoLWNhbGxvdXQtc2VydmljZWAgfAoKIyMgVGFza3MKCnwg" + - "U3ltcHRvbSB8IENhdXNlIHwgUmVtZWRpYXRpb24gfAp8LS0tfC0tLXwtLS18CnwgYHRhc2sgY3Jl" + - "YXRlYCByZXR1cm5zIGBNaXNzaW5nIDxUWVBFPiByZWdpc3RyeSBjcmVkZW50aWFsIGZvciBob3N0" + - "bmFtZWAsIG9yIGtlZXBzIHVzaW5nIGEgcHJldmlvdXMgY3JlZGVudGlhbCB2YWx1ZSwgc2hvcnRs" + - "eSBhZnRlciBgcmVnaXN0cnktY3JlZGVudGlhbCBhZGQvdXBkYXRlL2RlbGV0ZWAgd2hpbGUgYHJl" + - "Z2lzdHJ5LWNyZWRlbnRpYWwgbGlzdGAvYGdldGAgYWxyZWFkeSBzaG93IHRoZSBuZXcgdmFsdWUg" + - "fCBFeHBlY3RlZCBwcm9wYWdhdGlvbiBkZWxheTogTlZDVCBjYWNoZXMgdGhlIGFjY291bnQncyBy" + - "ZWdpc3RyeSBjcmVkZW50aWFscyB3aXRoIGBudmN0Lm52Y2YuY2FjaGUtdHRsYCAoZGVmYXVsdCBg" + - "UFQ1TWAsIGFib3V0IDUgbWluKSBhbmQgYXBwbGllcyB0aGUgY2hhbmdlIHdoZW4gdGhhdCBjYWNo" + - "ZWQgY29weSByZWZyZXNoZXMgfCBXYWl0IHVwIHRvIGFib3V0IDUgbWluIGFuZCByZXRyeSwgb3Ig" + - "YGt1YmVjdGwgLW4gbnZjZiByb2xsb3V0IHJlc3RhcnQgZGVwbG95bWVudC9udmN0LWFwaWAgdG8g" + - "YXBwbHkgaW1tZWRpYXRlbHkgfApQSwcI864ThHQRAAB0EQAAUEsDBBQACAAAAAAAIQAAAAAAAAAA" + - "AAAAAAAsAAkAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24vU0tJTEwubWRVVAUA" + - "AQCmzhItLS0KbmFtZTogbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uCmRlc2NyaXB0aW9u" + - "OiA+LQogIEluc3RhbGwgYW5kIG9wZXJhdGUgTlZDRiBzZWxmLWhvc3RlZCBjb250cm9sLXBsYW5l" + - "IGFuZCBzZXBhcmF0ZSBjb21wdXRlLXBsYW5lCiAgc3RhY2tzLiBDb3ZlcnMgSGVsbWZpbGUgdmFs" + - "dWVzIGFuZCBDTEkgcHJvZmlsZSBpbnN0YWxsYXRpb24gZmxvd3MsIHRlYXJkb3duLAogIHZhbHVl" + - "cyBvdmVycmlkZXMsIHB1bGwgc2VjcmV0cywgYW5kIHRyb3VibGVzaG9vdGluZy4gVXNlIGZvcgog" + - "IG52Y2Ytc2VsZi1tYW5hZ2VkLXN0YWNrLCBudmNmLWNvbXB1dGUtcGxhbmUtc3RhY2ssIHNwbGl0" + - "IGNvbXB1dGUtcGxhbmUKICBpbnN0YWxsYXRpb24sIGNvbnRyb2wtcGxhbmUgaW5zdGFsbGF0aW9u" + - "LCBDTEktZ2VuZXJhdGVkIGNvbnRyb2wtcGxhbmUKICBwcm9maWxlcywgSGVsbWZpbGUsIHNlbGYt" + - "bWFuYWdlZCwgb3Igc2VsZi1ob3N0ZWQgZGVwbG95bWVudHMuIERvIE5PVCB1c2UgZm9yCiAgbG9j" + - "YWwgazNkIGVudmlyb25tZW50czsgdXNlIHRoZSBsb2NhbCBrM2QgZGV2ZWxvcG1lbnQgd29ya2Zs" + - "b3cgaW5zdGVhZC4KbGljZW5zZTogQXBhY2hlLTIuMApjb21wYXRpYmlsaXR5OiBSZXF1aXJlcyBo" + - "ZWxtZmlsZSA+PSAxLjEuMCA8IDEuMi4wLCBoZWxtID49IDMuMTIsIGhlbG0tZGlmZiBwbHVnaW4s" + - "IGt1YmVjdGwgbWF0Y2hpbmcgY2x1c3RlciB2ZXJzaW9uCmF1dGhvcjogIm52Y2YtY29yZS1lbmcg" + - "PG52Y2YtY29yZS1lbmdAZXhjaGFuZ2UubnZpZGlhLmNvbT4iCnZlcnNpb246ICIxLjAuMCIKdGFn" + - "czogW252Y2YsIHNlbGYtbWFuYWdlZCwgaGVsbWZpbGUsIHNlbGYtaG9zdGVkLCBjb250cm9sLXBs" + - "YW5lLCBjb21wdXRlLXBsYW5lLCBjbGktcHJvZmlsZSwgaW5zdGFsbGF0aW9uLCBkZXBsb3ltZW50" + - "LCBwdWxsLXNlY3JldHNdCnRvb2xzOiBbU2hlbGwsIFJlYWQsIEVkaXQsIEdyZXAsIEdsb2JdCm1l" + - "dGFkYXRhOgogIGludGVybmFsOiBmYWxzZQogIGF1dGhvcjogIm52Y2YtY29yZS1lbmcgPG52Y2Yt" + - "Y29yZS1lbmdAZXhjaGFuZ2UubnZpZGlhLmNvbT4iCiAgdmVyc2lvbjogIjEuMCIKICB0YWdzOiBb" + - "bnZjZiwgc2VsZi1tYW5hZ2VkLCBoZWxtZmlsZSwgc2VsZi1ob3N0ZWQsIGNvbnRyb2wtcGxhbmUs" + - "IGNvbXB1dGUtcGxhbmUsIGNsaS1wcm9maWxlLCBpbnN0YWxsYXRpb24sIGRlcGxveW1lbnQsIHB1" + - "bGwtc2VjcmV0c10KICBsYW5ndWFnZXM6IFtiYXNoLCB5YW1sXQogIGZyYW1ld29ya3M6IFtoZWxt" + - "ZmlsZSwgaGVsbSwga3ViZWN0bF0KICBkb21haW46IGNsb3VkLWluZnJhc3RydWN0dXJlCi0tLQoK" + - "IyBOVkNGIFNlbGYtTWFuYWdlZCBTdGFjayBPcGVyYXRpb25zCgpPcGVyYXRpb25hbCBndWlkZSBm" + - "b3IgbWF0Y2hpbmcgTlZDRiBjb250cm9sLXBsYW5lIGFuZCBjb21wdXRlLXBsYW5lIEhlbG1maWxl" + - "IGJ1bmRsZXMuCgojIyBJbnN0cnVjdGlvbnMKClVzZSB0aGlzIHNraWxsIGZvciBpbnN0YWxsLCB1" + - "cGdyYWRlLCBvciB0ZWFyZG93biB3b3JrIGluIG1hdGNoaW5nIGBudmNmLXNlbGYtbWFuYWdlZC1z" + - "dGFja2AgYW5kIGBudmNmLWNvbXB1dGUtcGxhbmUtc3RhY2tgIGJ1bmRsZXM7IGtlZXAgSGVsbWZp" + - "bGUgdmFsdWVzIGFuZCBDTEkgcHJvZmlsZSBoYW5kb2ZmcyBzZXBhcmF0ZS4gRm9yIGBmdW5jdGlv" + - "blR5cGU6ICJMTE0iYCwgcmVhZCBbTExNIEZ1bmN0aW9uIEVuYWJsZW1lbnRdKHJlZmVyZW5jZXMv" + - "aGVsbWZpbGUtc3RydWN0dXJlLm1kI2xsbS1mdW5jdGlvbi1lbmFibGVtZW50KS4KCiMjIFByZXJl" + - "cXVpc2l0ZXMKCkFzayBmb3IgdGhlIGV4dHJhY3RlZCBgbnZjZi1zZWxmLW1hbmFnZWQtc3RhY2tg" + - "IHBhdGguIEZvciBzcGxpdCBpbnN0YWxsYXRpb24sCmFsc28gcmVxdWlyZSB0aGUgbWF0Y2hpbmct" + - "dmVyc2lvbiBgbnZjZi1jb21wdXRlLXBsYW5lLXN0YWNrYCBwYXRoLiBWZXJpZnkgYm90aDoKCmBg" + - "YGJhc2gKbHMgPGNvbnRyb2wtcGxhbmUtc3RhY2s+L2hlbG1maWxlLmQvIDxjb250cm9sLXBsYW5l" + - "LXN0YWNrPi9lbnZpcm9ubWVudHMvIDxjb250cm9sLXBsYW5lLXN0YWNrPi9zZWNyZXRzLyA8Y29u" + - "dHJvbC1wbGFuZS1zdGFjaz4vZ2xvYmFsLnlhbWwuZ290bXBsCmxzIDxjb21wdXRlLXBsYW5lLXN0" + - "YWNrPi9oZWxtZmlsZS5kLyA8Y29tcHV0ZS1wbGFuZS1zdGFjaz4vZW52aXJvbm1lbnRzLyA8Y29t" + - "cHV0ZS1wbGFuZS1zdGFjaz4vZ2xvYmFsLnlhbWwuZ290bXBsCmBgYAoKSWYgZWl0aGVyIGRpcmVj" + - "dG9yeSBpcyBtaXNzaW5nLCBkb3dubG9hZCBtYXRjaGluZyBidW5kbGUgdmVyc2lvbnMgZnJvbSBO" + - "R0M6CgpgYGBiYXNoCm5nYyByZWdpc3RyeSByZXNvdXJjZSBkb3dubG9hZC12ZXJzaW9uIDxvcmc+" + - "L252Y2Ytc2VsZi1tYW5hZ2VkLXN0YWNrOjx2ZXJzaW9uPgpuZ2MgcmVnaXN0cnkgcmVzb3VyY2Ug" + - "ZG93bmxvYWQtdmVyc2lvbiA8b3JnPi9udmNmLWNvbXB1dGUtcGxhbmUtc3RhY2s6PHZlcnNpb24+" + - "CmBgYAoKQ29udHJvbC1wbGFuZSBjb21tYW5kcyBiZWxvdyBhc3N1bWUgdGhlIGNvbnRyb2wtcGxh" + - "bmUgYnVuZGxlIHJvb3QuIFNwbGl0LWZsb3cKY29tbWFuZHMgYW5kIHJvb3Qgc3Vic3RpdHV0aW9u" + - "IGFyZSBpbgpbU3BsaXQgQ29tcHV0ZS1QbGFuZSBJbnN0YWxsYXRpb25dKHJlZmVyZW5jZXMvY29t" + - "cHV0ZS1wbGFuZS1pbnN0YWxsYXRpb24ubWQpLgoKIyMgQmVmb3JlIFlvdSBTdGFydAoKVmVyaWZ5" + - "IHRvb2xpbmcgYW5kIGNvbnRleHQgYmVmb3JlIGFueSBvcGVyYXRpb246CgpgYGBiYXNoCmhlbG1m" + - "aWxlIC0tdmVyc2lvbiAgICMgTXVzdCBiZSAxLjEueCAoMS4yLjAgcmVtb3ZlZCBzZXF1ZW50aWFs" + - "IG1vZGUpCmhlbG0gdmVyc2lvbiAgICAgICAgICMgTXVzdCBiZSA+PSAzLjEyCmhlbG0gcGx1Z2lu" + - "IGxpc3QgICAgICMgTXVzdCBpbmNsdWRlIGhlbG0tZGlmZiA+PSAzLjExCmt1YmVjdGwgdmVyc2lv" + - "biAgICAgICMgQ2xpZW50IG11c3QgYmUgd2l0aGluIDEgbWlub3IgdmVyc2lvbiBvZiBjbHVzdGVy" + - "CmBgYAoKQ29udHJvbC1wbGFuZSBjb21tYW5kcyBydW4gZnJvbSB0aGUgZXh0cmFjdGVkIGBudmNm" + - "LXNlbGYtbWFuYWdlZC1zdGFjay9gIHJvb3Q6CgpgYGBiYXNoCmNkIHBhdGgvdG8vbnZjZi1zZWxm" + - "LW1hbmFnZWQtc3RhY2sKbHMgaGVsbWZpbGUuZC8gZW52aXJvbm1lbnRzLyBzZWNyZXRzLyBnbG9i" + - "YWwueWFtbC5nb3RtcGwKYGBgCgpJZGVudGlmeSB0aGUgZW52aXJvbm1lbnQgZnJvbSBgZW52aXJv" + - "bm1lbnRzLzxuYW1lPi55YW1sYCBhbmQKYHNlY3JldHMvPG5hbWU+LXNlY3JldHMueWFtbGA7IGZv" + - "ciBFS1MsIHVzZSB0aGUgY2Fub25pY2FsCltDU1AgRW5kLXRvLUVuZCBFeGFtcGxlXShodHRwczov" + - "L2RvY3MubnZpZGlhLmNvbS9udmNmL3YwLjYuMC1yYy9jc3AtZW5kLXRvLWVuZC1leGFtcGxlKS4K" + - "CiMjIEhvdyBWYWx1ZXMgRmxvdwoKVW5kZXJzdGFuZGluZyB2YWx1ZSBwcmVjZWRlbmNlIHByZXZl" + - "bnRzIHRoZSBtb3N0IGNvbW1vbiBjb25maWd1cmF0aW9uIG1pc3Rha2VzLgoKYGBgdGV4dAplbnZp" + - "cm9ubWVudHMvYmFzZS55YW1sICAgICAgICAgIChkZWZhdWx0cykKICAgIC0+IG1lcmdlZCB3aXRo" + - "CmVudmlyb25tZW50cy88ZW52Pi55YW1sICAgICAgICAgKHlvdXIgb3ZlcnJpZGVzKQogICAgLT4g" + - "Y29uc3VtZWQgYnkKZ2xvYmFsLnlhbWwuZ290bXBsICAgICAgICAgICAgICAoR28gdGVtcGxhdGUs" + - "IGNvbnN0cnVjdHMgcGVyLWNoYXJ0IHZhbHVlcykKICAgIC0+IGNvbnN1bWVkIGJ5CnNlY3JldHMv" + - "PGVudj4tc2VjcmV0cy55YW1sICAgICAgKHNlbnNpdGl2ZSB2YWx1ZXMpCiAgICAtPiBvdmVycmlk" + - "ZGVuIGJ5CnJlbGVhc2UgaW5saW5lIHZhbHVlczogYmxvY2tzICAgKGhpZ2hlc3QgcHJlY2VkZW5j" + - "ZSkKYGBgCgpDcml0aWNhbDogYGdsb2JhbC55YW1sLmdvdG1wbGAgb25seSBwYXNzZXMgdGhyb3Vn" + - "aCBzcGVjaWZpYyBrZXlzIHRvIGVhY2ggY2hhcnQgKGltYWdlIHJlZ2lzdHJpZXMsIG5vZGUgc2Vs" + - "ZWN0b3JzLCBzdG9yYWdlLCByZXBsaWNhIGNvdW50cykuIFNldHRpbmcgYW4gYXJiaXRyYXJ5IGNo" + - "YXJ0IHZhbHVlIGluIHRoZSBlbnZpcm9ubWVudCBmaWxlIHdpbGwgYmUgc2lsZW50bHkgaWdub3Jl" + - "ZCBpZiBgZ2xvYmFsLnlhbWwuZ290bXBsYCBkb2VzIG5vdCBwcm9wYWdhdGUgaXQuCgpUbyBvdmVy" + - "cmlkZSBhcmJpdHJhcnkgY2hhcnQgdmFsdWVzLCB1c2UgYSBoZWxtZmlsZSByZWxlYXNlIGB2YWx1" + - "ZXM6YCBibG9jay4gU2VlIFtPdmVycmlkaW5nIEhlbG0gQ2hhcnQgVmFsdWVzXSgjb3ZlcnJpZGlu" + - "Zy1oZWxtLWNoYXJ0LXZhbHVlcykuCgojIyBDbGVhbiBJbnN0YWxsYXRpb24KCiMjIyAxLiBDcmVh" + - "dGUgbmFtZXNwYWNlcyBhbmQgaW1hZ2UgcHVsbCBzZWNyZXRzIChpZiB1c2luZyBhIHByaXZhdGUg" + - "cmVnaXN0cnkpCgpgYGBiYXNoCmZvciBucyBpbiBjYXNzYW5kcmEtc3lzdGVtIG5hdHMtc3lzdGVt" + - "IG52Y2YgYXBpLWtleXMgZXNzIHNpcyB2YXVsdC1zeXN0ZW0gY2VydC1tYW5hZ2VyOyBkbwogIGt1" + - "YmVjdGwgY3JlYXRlIG5hbWVzcGFjZSAiJG5zIiAtLWRyeS1ydW49Y2xpZW50IC1vIHlhbWwgfCBr" + - "dWJlY3RsIGFwcGx5IC1mIC0KZG9uZQoKIyBPbmx5IGlmIHB1bGxpbmcgZnJvbSBhIHByaXZhdGUg" + - "cmVnaXN0cnkgKGUuZy4sIE5HQyBudmNyLmlvKQpleHBvcnQgTkdDX0FQSV9LRVk9Ijx5b3VyLWtl" + - "eT4iCmZvciBucyBpbiBjYXNzYW5kcmEtc3lzdGVtIG5hdHMtc3lzdGVtIG52Y2YgYXBpLWtleXMg" + - "ZXNzIHNpcyB2YXVsdC1zeXN0ZW0gY2VydC1tYW5hZ2VyOyBkbwogIGt1YmVjdGwgY3JlYXRlIHNl" + - "Y3JldCBkb2NrZXItcmVnaXN0cnkgbnZjci1jcmVkcyBcCiAgICAtLWRvY2tlci1zZXJ2ZXI9bnZj" + - "ci5pbyBcCiAgICAtLWRvY2tlci11c2VybmFtZT0nJG9hdXRodG9rZW4nIFwKICAgIC0tZG9ja2Vy" + - "LXBhc3N3b3JkPSIkTkdDX0FQSV9LRVkiIFwKICAgIC0tbmFtZXNwYWNlPSIkbnMiIFwKICAgIC0t" + - "ZHJ5LXJ1bj1jbGllbnQgLW8geWFtbCB8IGt1YmVjdGwgYXBwbHkgLWYgLQpkb25lCmBgYAoKSWYg" + - "dXNpbmcgcHVsbCBzZWNyZXRzLCB5b3UgbXVzdCBhbHNvIGNvbmZpZ3VyZSBlYWNoIGhlbG1maWxl" + - "IHJlbGVhc2UgdG8gcmVmZXJlbmNlIHRoZW0uIFNlZSBbSW1hZ2UgUHVsbCBTZWNyZXRzXSgjaW1h" + - "Z2UtcHVsbC1zZWNyZXRzKS4KCiMjIyAyLiBBdXRoZW50aWNhdGUgaGVsbSB0byB5b3VyIGNoYXJ0" + - "IHJlZ2lzdHJ5CgpCb3RoIGBkb2NrZXIgbG9naW5gIEFORCBgaGVsbSByZWdpc3RyeSBsb2dpbmAg" + - "YXJlIHJlcXVpcmVkIGZvciBOR0MuIEhlbG1maWxlIHVzZXMgaGVsbSAobm90IGRvY2tlcikgdG8g" + - "cHVsbCBPQ0kgY2hhcnRzLCBzbyB0aGUgaGVsbSBjcmVkZW50aWFsIHN0b3JlIG11c3QgYmUgYXV0" + - "aGVudGljYXRlZCBzZXBhcmF0ZWx5LgoKYGBgYmFzaAojIE5HQyAtLSBib3RoIGNvbW1hbmRzIGFy" + - "ZSByZXF1aXJlZApkb2NrZXIgbG9naW4gbnZjci5pbyAtdSAnJG9hdXRodG9rZW4nIC1wICIkTkdD" + - "X0FQSV9LRVkiCmhlbG0gcmVnaXN0cnkgbG9naW4gbnZjci5pbyAtdSAnJG9hdXRodG9rZW4nIC1w" + - "ICIkTkdDX0FQSV9LRVkiCgojIEVDUgphd3MgZWNyIGdldC1sb2dpbi1wYXNzd29yZCAtLXJlZ2lv" + - "biA8cmVnaW9uPiB8IFwKICBoZWxtIHJlZ2lzdHJ5IGxvZ2luIC0tdXNlcm5hbWUgQVdTIC0tcGFz" + - "c3dvcmQtc3RkaW4gPGFjY291bnQ+LmRrci5lY3IuPHJlZ2lvbj4uYW1hem9uYXdzLmNvbQpgYGAK" + - "Cj4gTm90ZTogYGhlbG0gcmVnaXN0cnkgbG9naW5gIGtlZXBzIG9ubHkgdGhlIGxhc3QgbG9naW4g" + - "cGVyIGhvc3QgKG11bHRpLW9yZyBnb3RjaGEpLgo+IFRoZSBzdGFjayBhbmQgdGhlIGNhY2hlcyBz" + - "cGFuIHNldmVyYWwgTkdDIG9yZ3MgdGhhdCBuZWVkIGRpZmZlcmVudCBrZXlzLCBidXQgdGhleSBh" + - "bGwKPiBsaXZlIHVuZGVyIHRoZSBvbmUgaG9zdCBgbnZjci5pb2AuIEEgc2Vjb25kIGBoZWxtIHJl" + - "Z2lzdHJ5IGxvZ2luIG52Y3IuaW9gIChvcgo+IGBkb2NrZXIgbG9naW5gKSB3aXRoIGEgZGlmZmVy" + - "ZW50IGtleSBzaWxlbnRseSBvdmVyd3JpdGVzIHRoZSBmaXJzdCwgc28gcHVsbHMgZm9yIHRoZQo+" + - "IGZpcnN0IG9yZyB0aGVuIGZhaWwgd2l0aCBhIG1pc2xlYWRpbmcgYDQwMyBBY2Nlc3MgRGVuaWVk" + - "YCAobm90IGEgNDAxOiB0aGUgYXV0aAo+IHN1Y2NlZWRlZCwgaXQncyB0aGUgd3Jvbmctb3JnIGtl" + - "eSkuIElmIHlvdSBwdWxsIGNoYXJ0cy9pbWFnZXMgZnJvbSBtb3JlIHRoYW4gb25lIG9yZywKPiBl" + - "aXRoZXIgcmUtcnVuIHRoZSBsb2dpbiB3aXRoIHRoZSBjb3JyZWN0IGtleSBpbW1lZGlhdGVseSBi" + - "ZWZvcmUgZWFjaCBwdWxsLCBvciBwYXNzCj4gYC0tdXNlcm5hbWUgJyRvYXV0aHRva2VuJyAtLXBh" + - "c3N3b3JkIDxrZXk+YCBwZXIgYGhlbG0gcHVsbGAgaW52b2NhdGlvbiBpbnN0ZWFkIG9mIHJlbHlp" + - "bmcKPiBvbiB0aGUgc3RvcmVkIGxvZ2luLiAoUHVsbGluZyBldmVyeXRoaW5nIGZyb20gYSBzaW5n" + - "bGUgcmVnaXN0cnkgbWlycm9yIGF2b2lkcyB0aGlzCj4gZW50aXJlbHkuKQoKIyMjIDJiLiAoUmVj" + - "b21tZW5kZWQpIFB1bGwgZnJvbSBhIHJlZ2lzdHJ5IHRoZSBjbHVzdGVyIGF1dGhlbnRpY2F0ZXMg" + - "dG8gYXV0b21hdGljYWxseQoKSWYgeW91IG1pcnJvciB0aGUgTlZDRiBpbWFnZXMgaW50byBhIHJl" + - "Z2lzdHJ5IHRoYXQgdGhlIGNsdXN0ZXIgY2FuIHB1bGwgZnJvbSB3aXRob3V0IGFuCmV4cGxpY2l0" + - "IGltYWdlIHB1bGwgc2VjcmV0IChmb3IgZXhhbXBsZSwgYSByZWdpc3RyeSB3aGVyZSB0aGUgbm9k" + - "ZSBvciB3b3JrbG9hZCBpZGVudGl0eSBpcwpncmFudGVkIHB1bGwgYWNjZXNzIGF1dG9tYXRpY2Fs" + - "bHkpLCBwb2ludCB0aGUgc3RhY2sgYXQgaXQgYW5kIHNraXAgdGhlIGNyZWRlbnRpYWwgc3RlcHMK" + - "YWJvdmUuCgoxLiBQb2ludCB0aGUgc3RhY2sgYXQgdGhlIG1pcnJvciBpbiBgZW52aXJvbm1lbnRz" + - "LzxlbnY+LnlhbWxgOgoKICAgYGBgeWFtbAogICBnbG9iYWw6CiAgICAgaW1hZ2U6CiAgICAgICBy" + - "ZWdpc3RyeTogPHlvdXItcmVnaXN0cnk+ICAgICAgICAgICAgIyBlLmcuIHJlZ2lzdHJ5LmV4YW1w" + - "bGUuY29tCiAgICAgICByZXBvc2l0b3J5OiA8bWlycm9yLXN1Yi1wYXRoPgogICAgIGhlbG06CiAg" + - "ICAgICBzb3VyY2VzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb25seSBpZiB5b3Ug" + - "YWxzbyBtaXJyb3JlZCB0aGUgaGVsbSBjaGFydHMKICAgICAgICAgcmVnaXN0cnk6IDx5b3VyLXJl" + - "Z2lzdHJ5PgogICAgICAgICByZXBvc2l0b3J5OiA8bWlycm9yLXN1Yi1wYXRoPgogICBgYGAKCiAg" + - "ID4gVGhlIG1hbmlmZXN0IGhhcyBhIG1peCBvZiBPQ0kgYW5kIG5vbi1PQ0kgYXJ0aWZhY3RzLCBz" + - "byBjb252ZXJ0IG5vbi1PQ0kgY2hhcnRzIGJlZm9yZQogICA+IG1pcnJvcmluZy4gQ29udGFpbmVy" + - "IGltYWdlcyAoYG52Y3IuaW8vLi4uYCkgYXJlIGFscmVhZHkgT0NJIGFuZCBtaXJyb3IgYXMtaXMu" + - "IFNvbWUgSGVsbQogICA+IGNoYXJ0cywgdGhvdWdoLCBhcmUgcHVibGlzaGVkIHRvIGFuIGBodHRw" + - "czovL2AgSGVsbSByZXBvc2l0b3J5IChmb3IgZXhhbXBsZQogICA+IGBoZWxtLm5nYy5udmlkaWEu" + - "Y29tYCkuIFRob3NlIGFyZSBub3QgT0NJIGFuZCBjYW5ub3QgYmUgcmVzb2x2ZWQgYnkgYGdsb2Jh" + - "bC5oZWxtLnNvdXJjZXNgCiAgID4gKE9DSSkgb3IgbWlycm9yZWQgZGlyZWN0bHkuIEJlZm9yZSBw" + - "b2ludGluZyB0aGUgc3RhY2sgYXQgeW91ciBtaXJyb3IsIGNvbnZlcnQgZWFjaAogICA+IGBodHRw" + - "czovL2AgY2hhcnQgdG8gT0NJOiBgaGVsbSByZXBvIGFkZGAvYGhlbG0gcHVsbGAgdGhlIGAudGd6" + - "YCwgdGhlbgogICA+IGBoZWxtIHB1c2ggPGNoYXJ0Pi50Z3ogb2NpOi8vPHlvdXItcmVnaXN0cnk+" + - "LzxtaXJyb3Itc3ViLXBhdGg+YC4gT25seSBPQ0kgY2hhcnRzIGNhbiBsaXZlCiAgID4gdW5kZXIg" + - "YGdsb2JhbC5oZWxtLnNvdXJjZXNgLgoKMi4gU2tpcCB0aGUgY3JlZGVudGlhbCBzdGVwcyBhYm92" + - "ZS4gV2hlbiB0aGUgY2x1c3RlciBhdXRoZW50aWNhdGVzIHRvIHRoZSByZWdpc3RyeQogICBhdXRv" + - "bWF0aWNhbGx5ICh0aGUgbm9kZSBvciB3b3JrbG9hZCBpZGVudGl0eSBoYXMgcHVsbCBhY2Nlc3Mp" + - "LCB0aGUgcHVsbCBuZWVkcyBubwogICBLdWJlcm5ldGVzIHNlY3JldCwgc28geW91IGRvIG5vdCBu" + - "ZWVkOiB0aGUgcGVyLW5hbWVzcGFjZSBgbnZjci1jcmVkc2AgZnJvbSBzdGVwIDEKICAgKHN0aWxs" + - "IGNyZWF0ZSB0aGUgbmFtZXNwYWNlcywganVzdCBub3QgdGhlIHNlY3JldCksIHRoZSBgZ2xvYmFs" + - "LmltYWdlUHVsbFNlY3JldHNgIGVudHJ5LAogICBvciB0aGUgYGRvY2tlciBsb2dpbmAvYGhlbG0g" + - "cmVnaXN0cnkgbG9naW4gbnZjci5pb2AgZnJvbSBzdGVwIDIuCgogICA+IE9uZSByZXNpZHVhbCBj" + - "cmVkZW50aWFsOiBudmNmLWFwaSBzdGlsbCB2YWxpZGF0ZXMgdGhlIHVzZXIgZnVuY3Rpb24gaW1h" + - "Z2UgYXQKICAgPiBgZnVuY3Rpb24gY3JlYXRlYCB2aWEgdGhlIGFjY291bnQgcmVnaXN0cnkgY3Jl" + - "ZGVudGlhbCwgc28gdGhhdCBjcmVkZW50aWFsIG11c3QgcG9pbnQgYXQKICAgPiB3aGljaGV2ZXIg" + - "cmVnaXN0cnkgaG9sZHMgdGhlIHVzZXIgaW1hZ2UgKHNldCBpdCB0byB5b3VyIG1pcnJvciBpZiB0" + - "aGUgaW1hZ2UgaXMgbWlycm9yZWQKICAgPiB0aGVyZSkuCgojIyMgMy4gU2V0IHRoZSByb3V0ZSBk" + - "b21haW4KCmBnbG9iYWwuZG9tYWluYCBzZXRzIHRoZSBob3N0bmFtZSBzdWZmaXggZm9yIHJvdXRl" + - "cyBzdWNoIGFzIGBhcGkuPGRvbWFpbj5gLiBJdCBkb2VzIG5vdCBjb25maWd1cmUgdGhlIEdhdGV3" + - "YXkgb3IgaXRzIGxvYWQgYmFsYW5jZXIuIFF1ZXJ5IHRoZSBleGFjdCBleGlzdGluZyBHYXRld2F5" + - "OgoKYGBgYmFzaApHQVRFV0FZX0FERFJFU1M9JChrdWJlY3RsIGdldCBnYXRld2F5IDxnYXRld2F5" + - "LW5hbWU+IC1uIDxnYXRld2F5LW5hbWVzcGFjZT4gLW8ganNvbnBhdGg9J3suc3RhdHVzLmFkZHJl" + - "c3Nlc1swXS52YWx1ZX0nKQp0ZXN0IC1uICIkR0FURVdBWV9BRERSRVNTIgpgYGAKClRoZSBhZGRy" + - "ZXNzIG1heSBiZSBhIGhvc3RuYW1lIG9yIElQLiBDbG91ZCBwcm92aWRlciBhbmQgR2F0ZXdheSBj" + - "b25maWd1cmF0aW9uIGRldGVybWluZSB0aGUgbG9hZCBiYWxhbmNlciB0eXBlIGFuZCBhZGRyZXNz" + - "IGZvcm1hdC4gVGhlIHNlbGYtbWFuYWdlZCBzdGFjayBkb2VzIG5vdCBzZWxlY3QgZWl0aGVyLgoK" + - "Rm9yIHRlbXBvcmFyeSB0ZXN0aW5nIHdpdGhvdXQgRE5TLCB1c2UgYSBzdGFibGUgcmVzZXJ2ZWQg" + - "c3VmZml4IHN1Y2ggYXMgYGdsb2JhbC5kb21haW46ICJudmNmLnRlc3QiYCwgY29ubmVjdCB0byBg" + - "R0FURVdBWV9BRERSRVNTYCwgYW5kIHNlbmQgYEhvc3Q6IGFwaS5udmNmLnRlc3RgLiBGb3IgcHJv" + - "ZHVjdGlvbiwgdXNlIHlvdXIgYmFzZSBETlMgZG9tYWluIGFuZCBwb2ludCBpdHMgcm91dGUgcmVj" + - "b3JkcyB0byBgR0FURVdBWV9BRERSRVNTYC4gSWYgdGhlIGVuZHBvaW50IGxhdGVyIGNoYW5nZXMs" + - "IGtlZXAgYGdsb2JhbC5kb21haW5gIHN0YWJsZSBhbmQgdXBkYXRlIG9ubHkgRE5TIG9yIHRoZSBj" + - "bGllbnQgZGVzdGluYXRpb24uIFNlZSBFeGFtcGxlIDQgaW4gW2V4YW1wbGVzLm1kXShleGFtcGxl" + - "cy5tZCkuCgojIyMgNC4gUHJldmlldyBhbmQgZGVwbG95CgpgYGBiYXNoCkhFTE1GSUxFX0VOVj08" + - "ZW52LW5hbWU+IGhlbG1maWxlIHRlbXBsYXRlICAgIyBQcmV2aWV3IHJlbmRlcmVkIG1hbmlmZXN0" + - "cwpIRUxNRklMRV9FTlY9PGVudi1uYW1lPiBoZWxtZmlsZSBzeW5jICAgICAgICMgRGVwbG95CmBg" + - "YAoKPiBTZXQgQk9USCBDYXNzYW5kcmEgcGFzc3dvcmRzIGluIHRoZSBzZWNyZXRzIGZpbGUuIFRo" + - "ZSBzZWNyZXRzIGZpbGUgZG9jdW1lbnRzCj4gYERFRkFVTFRfQ0FTU0FORFJBX1BBU1NXT1JEYCwg" + - "YnV0IHRoZSBjYXNzYW5kcmEgY2hhcnQgaGFzIGEgc2Vjb25kIGNyZWRlbnRpYWwsCj4gYGNhc3Nh" + - "bmRyYS5zZXJ2aWNlUm9sZVBhc3N3b3JkYCwgdGhhdCBkZWZhdWx0cyB0byBgY2hAbmczbTNgLiBJ" + - "ZiB5b3Ugc2V0IG9ubHkKPiBgREVGQVVMVF9DQVNTQU5EUkFfUEFTU1dPUkRgLCB0aGUgc2Vydmlj" + - "ZSByb2xlIGtlZXBzIHRoYXQgZGVmYXVsdCBhbmQgZXZlcnkgREItYmFja2VkCj4gc2VydmljZSBj" + - "cmFzaC1sb29wcyB3aXRoIGBCYWQgY3JlZGVudGlhbHNgIG9uY2UgaXQgdHJpZXMgdG8gYXV0aGVu" + - "dGljYXRlLiBTZXQKPiBgY2Fzc2FuZHJhLnNlcnZpY2VSb2xlUGFzc3dvcmRgIHRvIHRoZSBzYW1l" + - "IHZhbHVlIGFzIGBERUZBVUxUX0NBU1NBTkRSQV9QQVNTV09SRGAuCgojIyMgNS4gRGVwbG95bWVu" + - "dCBwaGFzZXMKCkhlbG1maWxlIGRlcGxveXMgaW4gb3JkZXIgd2l0aCBkZXBlbmRlbmNpZXM6Cgp8" + - "IFBoYXNlIHwgU2VsZWN0b3IgfCBTZXJ2aWNlcyB8IFdhaXQgdGltZSB8CnwtLS0tLS0tfC0tLS0t" + - "LS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwKfCAxIHwgYHJlbGVhc2UtZ3JvdXA9ZGVwZW5k" + - "ZW5jaWVzYCB8IE5BVFMsIE9wZW5CYW8sIENhc3NhbmRyYSB8IDUtMTAgbWluIHwKfCAyIHwgYHJl" + - "bGVhc2UtZ3JvdXA9c2VydmljZXNgIHwgQVBJLCBTSVMsIEVTUywgaW52b2NhdGlvbiwgZ3JwYy1w" + - "cm94eSwgbm90YXJ5LCBhcGkta2V5cywgb3B0aW9uYWwgTExNIGdhdGV3YXkvcm91dGVyLCBvcHRp" + - "b25hbCBWYW5pdHkgR2F0ZXdheSwgTlZDRiBVSSB3aGVuIHRoZSBzdGFjayBwYWNrYWdlIGluY2x1" + - "ZGVzIHRoZSBhZGRvbiB8IDUtMTAgbWluIHwKfCAzIHwgYHJlbGVhc2UtZ3JvdXA9aW5ncmVzc2Ag" + - "fCBHYXRld2F5IHJvdXRlcyB8IDEtMiBtaW4gfAp8IDQgfCBgcmVsZWFzZS1ncm91cD1vYnNlcnZh" + - "YmlsaXR5YCB8IE9ic2VydmFiaWxpdHkgc3RhY2sgKGlmIGVuYWJsZWQpIHwgMS0yIG1pbiB8CgpN" + - "b25pdG9yIGluIGEgc2VwYXJhdGUgdGVybWluYWw6CgpgYGBiYXNoCmt1YmVjdGwgZ2V0IHBvZHMg" + - "LUEgLXcKYGBgCgojIyMgNi4gRW5hYmxlIFZhbml0eSBHYXRld2F5IChvcHRpb25hbCkKClZhbml0" + - "eSBHYXRld2F5IGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgYW5kIGlzIG9ubHkgbmVlZGVkIGZvciBj" + - "dXN0b21lci1mYWNpbmcKaG9zdG5hbWVzIG9yIHBhdGggbWFwcGluZ3MgaW4gZnJvbnQgb2YgdGhl" + - "IHN0YW5kYXJkIE5WQ0YgQVBJIGFuZCBpbnZvY2F0aW9uCnJvdXRlcy4gSXQgaXMgYXZhaWxhYmxl" + - "IG9ubHkgaW4gc3RhY2sgcGFja2FnZXMgdGhhdCBpbmNsdWRlIHRoZSBWYW5pdHkgR2F0ZXdheQph" + - "ZGRvbi4gSWYgdGhlIGV4dHJhY3RlZCBzdGFjayBwYWNrYWdlIGRvZXMgbm90IGNvbnRhaW4gYSBg" + - "dmFuaXR5LWdhdGV3YXlgCnJlbGVhc2UgYW5kIGB2YW5pdHlHYXRld2F5YCByb3V0ZSB2YWx1ZXMs" + - "IHNraXAgdGhlc2UgY29tbWFuZHMgYW5kIHVzZSBhIG5ld2VyCnN0YWNrIHBhY2thZ2UgdGhhdCBp" + - "bmNsdWRlcyB0aGVtLgoKSWYgdGhlIHN0YWNrIHBhY2thZ2UgaW5jbHVkZXMgdGhlIGFkZG9uLCBl" + - "bmFibGUgaXQgaW4KYGVudmlyb25tZW50cy88ZW52LW5hbWU+LnlhbWxgOgoKYGBgeWFtbAphZGRv" + - "bnM6CiAgdmFuaXR5R2F0ZXdheToKICAgIGVuYWJsZWQ6IHRydWUKICAgIG1hcHBpbmdDb25maWc6" + - "IHt9CmBgYAoKVGhlIGRlZmF1bHQgcm91dGUgaG9zdCBpcyBgdmFuaXR5Ljxkb21haW4+YCBhbmQg" + - "dGhlIGJhY2tlbmQgaXMKYHZhbml0eS1nYXRld2F5Lm52Y2Y6ODA4MGAuIFB1dCBkZXBsb3ltZW50" + - "LXNwZWNpZmljIGhvc3QgYW5kIHBhdGggbWFwcGluZ3MgdW5kZXIKYGFkZG9ucy52YW5pdHlHYXRl" + - "d2F5Lm1hcHBpbmdDb25maWdgLiBJZiB5b3UgbmVlZCBjdXN0b20gdmFuaXR5IGhvc3RzIGluc3Rl" + - "YWQgb2YKYHZhbml0eS48ZG9tYWluPmAsIHVzZSB0aGUgcm91dGUgaG9zdG5hbWUgb3ZlcnJpZGVz" + - "IHN1cHBvcnRlZCBieSB0aGUgc3RhY2sKcGFja2FnZSBhbmQgY3JlYXRlIG1hdGNoaW5nIEROUyBy" + - "ZWNvcmRzLgoKQWZ0ZXIgY29uZmlybWluZyB0aGUgcGFja2FnZSBpbmNsdWRlcyB0aGUgYHZhbml0" + - "eS1nYXRld2F5YCByZWxlYXNlLCBwcmV2aWV3IGFuZAphcHBseSB0aGUgc2VydmljZSBhbmQgcm91" + - "dGU6CgpgYGBiYXNoCkhFTE1GSUxFX0VOVj08ZW52LW5hbWU+IGhlbG1maWxlIC0tc2VsZWN0b3Ig" + - "bmFtZT12YW5pdHktZ2F0ZXdheSB0ZW1wbGF0ZQpIRUxNRklMRV9FTlY9PGVudi1uYW1lPiBoZWxt" + - "ZmlsZSAtLXNlbGVjdG9yIG5hbWU9dmFuaXR5LWdhdGV3YXkgc3luYwpIRUxNRklMRV9FTlY9PGVu" + - "di1uYW1lPiBoZWxtZmlsZSAtLXNlbGVjdG9yIHJlbGVhc2UtZ3JvdXA9aW5ncmVzcyBzeW5jCmBg" + - "YAoKVmVyaWZ5IHRoZSByb3V0ZSBvbmx5IHdoZW4gdGhlIGFkZG9uIGlzIHByZXNlbnQgYW5kIGVu" + - "YWJsZWQ6CgpgYGBiYXNoCmt1YmVjdGwgZ2V0IGRlcGxveSxzdmMgLW4gbnZjZiAtbCBhcHAua3Vi" + - "ZXJuZXRlcy5pby9uYW1lPXZhbml0eS1nYXRld2F5Cmt1YmVjdGwgZ2V0IGh0dHByb3V0ZSAtQSB8" + - "IGdyZXAgLWkgdmFuaXR5CmN1cmwgLUggIkhvc3Q6IHZhbml0eS48ZG9tYWluPiIgImh0dHA6Ly88" + - "Z2F0ZXdheS1hZGRyZXNzPi9oZWFsdGgiCmBgYAoKRG8gbm90IGVuYWJsZSBWYW5pdHkgR2F0ZXdh" + - "eSBmb3Igc3RhbmRhcmQgQVBJLCBBUEkgS2V5cywgaW52b2NhdGlvbiwgTExNCmludm9jYXRpb24s" + - "IG9yIGdSUEMgdHJhZmZpYy4gVGhvc2Ugcm91dGVzIGFyZSBwcm92aWRlZCBieSB0aGUgYmFzZSBn" + - "YXRld2F5CnJvdXRlcy4KCiMjIyA3LiBFbmFibGUgTlZDRiBVSSAob3B0aW9uYWwpCgpOVkNGIFVJ" + - "IGlzIGFuIG9wdGlvbmFsLCBjdXN0b21lci1mYWNpbmcgYWRtaW4tcGFuZWwgVUkuIEl0IGlzIGRp" + - "c2FibGVkIGJ5CmRlZmF1bHQgYW5kIGF2YWlsYWJsZSBvbmx5IGluIHN0YWNrIHBhY2thZ2VzIHRo" + - "YXQgaW5jbHVkZSB0aGUgTlZDRiBVSSBhZGRvbi4gSWYKeW91ciBleHRyYWN0ZWQgc3RhY2sgcGFj" + - "a2FnZSBkb2VzIG5vdCBjb250YWluIGEgYG52Y2YtdWlgIHJlbGVhc2UgYW5kIGBudmNmVWlgCnJv" + - "dXRlIHZhbHVlcywgc2tpcCB0aGlzIHNlY3Rpb24uIFRoZSBOVkNGIFVJIGFkbWluIHBhbmVsIGlz" + - "IGN1cnJlbnRseQp1bmF1dGhlbnRpY2F0ZWQ7IGRvIG5vdCBleHBvc2UgaXQgdG8gdGhlIHB1Ymxp" + - "YyBpbnRlcm5ldC4KCkZvciBlbmFibGVtZW50LCBuYW1lc3BhY2UgYW5kIHB1bGwgc2VjcmV0IHNl" + - "dHVwLCBhcHBseSwgYW5kIHZlcmlmaWNhdGlvbiBzdGVwcywKc2VlIFtOVkNGIFVJIEFkZG9uXShy" + - "ZWZlcmVuY2VzL252Y2YtdWktYWRkb24ubWQpLgoKIyMjIDguIEluc3RhbGwgdGhlIHNlcGFyYXRl" + - "IGNvbXB1dGUtcGxhbmUgc3RhY2sKClRoZSBjb250cm9sLXBsYW5lIHN0YWNrIGRvZXMgbm90IGlu" + - "c3RhbGwgY29tcHV0ZS1wbGFuZSBjb21wb25lbnRzLiBBZnRlciBpdCBpcyBoZWFsdGh5LCBjaG9v" + - "c2UgZXhhY3RseSBvbmUgY29tcHV0ZS1wbGFuZSBoYW5kb2ZmOgoKLSBIZWxtZmlsZSB2YWx1ZXMg" + - "ZmxvdzogYXV0aG9yIHNlcGFyYXRlIGVudmlyb25tZW50IGZpbGVzLCB0aGVuIHJlZ2lzdGVyIGFu" + - "ZAogIGluc3RhbGwgd2l0aCB0aGUgY29tcHV0ZS1wbGFuZSBNYWtlZmlsZS4KLSBDTEkgcHJvZmls" + - "ZSBmbG93OiB1c2UgdGhlIHByb2ZpbGUgZ2VuZXJhdGVkIGJ5IHRoZSBDTEkgY29udHJvbC1wbGFu" + - "ZSBpbnN0YWxsLAogIHRoZW4gcnVuIHRoZSBjb21wbGV0ZSBDTEkgcmVnaXN0ZXIgYW5kIGluc3Rh" + - "bGwgY29tbWFuZHMuCgpEbyBub3QgbWl4IHRoZXNlIGhhbmRvZmZzLiBGb2xsb3cgW1NwbGl0IENv" + - "bXB1dGUtUGxhbmUgSW5zdGFsbGF0aW9uXShyZWZlcmVuY2VzL2NvbXB1dGUtcGxhbmUtaW5zdGFs" + - "bGF0aW9uLm1kKQpmb3IgY29tbWFuZHMsIEVLUyByb3V0aW5nLCBwdWxsIHNlY3JldHMsIHZlcmlm" + - "aWNhdGlvbiwgYW5kIHRlYXJkb3duIG9yZGVyLgoKIyMgQ2xlYW4gVGVhcmRvd24KCkRlc3Ryb3kg" + - "ZXZlcnkgY29tcHV0ZSBwbGFuZSBiZWZvcmUgdGhlIGNvbnRyb2wgcGxhbmUsIHVzaW5nIHRoZSB0" + - "ZWFyZG93biBmb3IKdGhlIHNhbWUgaGFuZG9mZjsgc2VlIFtTcGxpdCBDb21wdXRlLVBsYW5lIElu" + - "c3RhbGxhdGlvbl0ocmVmZXJlbmNlcy9jb21wdXRlLXBsYW5lLWluc3RhbGxhdGlvbi5tZCN0ZWFy" + - "ZG93bikuCgpTY29wZTogT25seSBkZXN0cm95IHJlbGVhc2VzIG1hbmFnZWQgYnkgdGhpcyBjb250" + - "cm9sLXBsYW5lIGhlbG1maWxlIHN0YWNrLiBUaGUgTlZDRiByZWxlYXNlcyBhcmU6IGBuYXRzYCwg" + - "YG9wZW5iYW8tc2VydmVyYCwgYGNhc3NhbmRyYWAsIGBhcGkta2V5c2AsIGBzaXNgLCBgYXBpYCwg" + - "YGludm9jYXRpb24tc2VydmljZWAsIGBncnBjLXByb3h5YCwgYGVzcy1hcGlgLCBgbm90YXJ5LXNl" + - "cnZpY2VgLCBvcHRpb25hbCBgdmFuaXR5LWdhdGV3YXlgLCBgbnZjZi11aWAsIGBhZG1pbi1pc3N1" + - "ZXItcHJveHlgLCBhbmQgYGluZ3Jlc3NgOyBgY2VydC1tYW5hZ2VyYCBpcyBpbmNsdWRlZCBvbmx5" + - "IHdoZW4gYGNlcnRNYW5hZ2VyLmVuYWJsZWQ6IHRydWVgLiBUaGUgY29udHJvbC1wbGFuZSBuYW1l" + - "c3BhY2UgaW52ZW50b3J5IGFsc28gaW5jbHVkZXMgYGNlcnQtbWFuYWdlcmAsIGJ1dCBkZWZhdWx0" + - "IG5hbWVzcGFjZSBjbGVhbnVwIHByZXNlcnZlcyBpdC4gTmFtZXNwYWNlIHByZXNlcnZhdGlvbiBk" + - "b2VzIG5vdCBwcmVzZXJ2ZSB0aGUgSGVsbSByZWxlYXNlLiBFeHRlcm5hbCBjZXJ0LW1hbmFnZXIg" + - "bXVzdCB1c2UgYGNlcnRNYW5hZ2VyLmVuYWJsZWQ6IGZhbHNlYDsgb3RoZXJ3aXNlIEhlbG1maWxl" + - "IHRyZWF0cyB0aGUgcmVsZWFzZSBhcyBzdGFjay1tYW5hZ2VkLiBEbyBub3QgZGVsZXRlIG90aGVy" + - "IGhlbG0gcmVsZWFzZXMgb3IgbmFtZXNwYWNlcyBvbiB0aGUgY2x1c3Rlci4KCkJlZm9yZSBjb250" + - "cm9sLXBsYW5lIGRlc3Ryb3ksIGlkZW50aWZ5IHdoZXRoZXIgY2VydC1tYW5hZ2VyIGlzIGV4dGVy" + - "bmFsLiBGb3IgYW4gZXh0ZXJuYWwgaW5zdGFsbGF0aW9uLCByZXF1aXJlIGVmZmVjdGl2ZSBgY2Vy" + - "dE1hbmFnZXIuZW5hYmxlZDogZmFsc2VgIGFuZCBhYm9ydCBpZiBpdCBpcyB0cnVlLiBGb3IgYW4g" + - "aW50ZW5kZWQgc3RhY2stbWFuYWdlZCByZWxlYXNlIHdpdGggZWZmZWN0aXZlIGBjZXJ0TWFuYWdl" + - "ci5lbmFibGVkOiB0cnVlYCwgdmVyaWZ5IG1hdGNoaW5nIHN0YWNrIEhlbG0gcmVsZWFzZSBtZXRh" + - "ZGF0YSBhbmQgYWJvcnQgb24gbWlzc2luZyBvciBtaXNtYXRjaGVkIGV2aWRlbmNlLiBQcmVzZXJ2" + - "ZSB0aGUgbmFtZXNwYWNlIGJ5IGRlZmF1bHQ7IG9ubHkgcGxhbiBpdHMgcmVtb3ZhbCBhZnRlciB2" + - "ZXJpZnlpbmcgbmFtZXNwYWNlIHByb3ZlbmFuY2UgYW5kIGdldHRpbmcgZXhwbGljaXQgY29uZmly" + - "bWF0aW9uLgoKIyMjIFN0YW5kYXJkIHRlYXJkb3duCgpSdW4gZnJvbSBpbnNpZGUgdGhlIGBudmNm" + - "LXNlbGYtbWFuYWdlZC1zdGFjay9gIGRpcmVjdG9yeToKCmBgYGJhc2gKSEVMTUZJTEVfRU5WPTxl" + - "bnYtbmFtZT4gaGVsbWZpbGUgZGVzdHJveQpgYGAKCiMjIyBEZWxldGUgbmFtZXNwYWNlcwoKYGBg" + - "YmFzaApmb3IgbnMgaW4gY2Fzc2FuZHJhLXN5c3RlbSBuYXRzLXN5c3RlbSBudmNmIGFwaS1rZXlz" + - "IGVzcyBzaXMgbnZjZi11aSB2YXVsdC1zeXN0ZW07IGRvCiAga3ViZWN0bCBkZWxldGUgbmFtZXNw" + - "YWNlICIkbnMiIC0taWdub3JlLW5vdC1mb3VuZApkb25lCmBgYAoKIyMjIFZlcmlmeSBjbGVhbgoK" + - "YGBgYmFzaAprdWJlY3RsIGdldCBucyB8IGdyZXAgLUUgJyhjYXNzYW5kcmF8bmF0c3x2YXVsdHxu" + - "dmNmfGFwaS1rZXlzfGVzc3xzaXMpJwojIFNob3VsZCByZXR1cm4gZW1wdHkKYGBgCgojIyBPdmVy" + - "cmlkaW5nIEhlbG0gQ2hhcnQgVmFsdWVzCgojIyMgRW52aXJvbm1lbnQgZmlsZSAobGltaXRlZCkK" + - "CldvcmtzIG9ubHkgZm9yIGtleXMgdGhhdCBgZ2xvYmFsLnlhbWwuZ290bXBsYCBwcm9wYWdhdGVz" + - "IChlLmcuLCBgY2Fzc2FuZHJhLnJlcGxpY2FDb3VudGAsIGBnbG9iYWwuc3RvcmFnZUNsYXNzYCwg" + - "YGdsb2JhbC5pbWFnZWApLgoKIyMjIFJlbGVhc2UgdmFsdWVzIGJsb2NrIChhbnkgY2hhcnQgdmFs" + - "dWUpCgpFZGl0IHRoZSByZWxlYXNlIGluIGBoZWxtZmlsZS5kLyoueWFtbC5nb3RtcGxgIGFuZCBh" + - "ZGQgYSBgdmFsdWVzOmAgYmxvY2suIEluIHRoZSBleGFtcGxlcyBiZWxvdywgYDxwcml2YXRlLXZh" + - "bHVlcz5gIHJlZmVycyB0byB0aGUgYHNlY3JldHMvYCBkaXJlY3RvcnkgYXQgdGhlIGhlbG1maWxl" + - "IHN0YWNrIHJvb3QuCgpgYGB5YW1sCi0gbmFtZTogY2Fzc2FuZHJhCiAgdmVyc2lvbjogMC44LjAK" + - "ICBjb25kaXRpb246IGNhc3NhbmRyYS5lbmFibGVkCiAgbmFtZXNwYWNlOiBjYXNzYW5kcmEtc3lz" + - "dGVtCiAgPDw6ICpkZXBlbmRlbmN5CiAgdmFsdWVzOgogICAgLSAuLi9nbG9iYWwueWFtbC5nb3Rt" + - "cGwKICAgIC0gLi4vPHByaXZhdGUtdmFsdWVzPi97eyByZXF1aXJlZEVudiAiSEVMTUZJTEVfRU5W" + - "IiB9fS1zZWNyZXRzLnlhbWwKICAgIC0gY2Fzc2FuZHJhOgogICAgICAgIHJlc291cmNlczoKICAg" + - "ICAgICAgIGxpbWl0czoKICAgICAgICAgICAgY3B1OiAiOCIKICAgICAgICAgICAgbWVtb3J5OiA4" + - "MTkyTWkKICAgICAgICAgIHJlcXVlc3RzOgogICAgICAgICAgICBjcHU6ICIyIgogICAgICAgICAg" + - "ICBtZW1vcnk6IDQwOTZNaQpgYGAKCllBTUwgbWVyZ2UgZ290Y2hhOiBXaGVuIGEgcmVsZWFzZSB1" + - "c2VzIGA8PDogKmRlcGVuZGVuY3lgIG9yIGBpbmhlcml0YCwgc3BlY2lmeWluZyBgdmFsdWVzOmAg" + - "cmVwbGFjZXMgdGhlIHRlbXBsYXRlJ3MgdmFsdWVzIGxpc3QuIFlvdSBtdXN0IHJlLWluY2x1ZGUg" + - "YGdsb2JhbC55YW1sLmdvdG1wbGAgYW5kIHRoZSBzZWNyZXRzIGZpbGUuCgojIyMgUHJldmlldyBh" + - "bmQgYXBwbHkgYSBzaW5nbGUgcmVsZWFzZQoKYGBgYmFzaApIRUxNRklMRV9FTlY9PGVudj4gaGVs" + - "bWZpbGUgLS1zZWxlY3RvciBuYW1lPWNhc3NhbmRyYSB0ZW1wbGF0ZSAgIyBQcmV2aWV3CkhFTE1G" + - "SUxFX0VOVj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9Y2Fzc2FuZHJhIHN5bmMgICAg" + - "ICAjIEFwcGx5CmBgYAoKIyMgSW1hZ2UgUHVsbCBTZWNyZXRzCgpUaGVyZSBhcmUgdGhyZWUgZGlz" + - "dGluY3QgY3JlZGVudGlhbCB0eXBlcy4gRG8gbm90IGNvbmZsYXRlIHRoZW0sIGFuZCBtaW5kIHRo" + - "ZQpmb3JtYXQgcnVsZSBiZWxvdyAodHdvIG9mIHRoZW0gZmFpbCBldmVuIHdpdGggdGhlIGNvcnJl" + - "Y3Qga2V5IGlmIHRoZSBmb3JtYXQgaXMgd3JvbmcpOgoKfCB8IENvbnRyb2wgUGxhbmUgUHVsbCBT" + - "ZWNyZXRzIHwgQVBJIEJvb3RzdHJhcCBSZWdpc3RyeSBDcmVkcyB8IFNpZGVjYXIgSW1hZ2UtUHVs" + - "bCBTZWNyZXQgfAp8LS0tfC0tLXwtLS18LS0tfAp8IFB1cnBvc2UgfCBLOHMgcHVsbHMgTlZDRiBz" + - "ZXJ2aWNlIGltYWdlcyB8IG52Y2YtYXBpIHZhbGlkYXRlcyB0aGUgdXNlciBmdW5jdGlvbiBpbWFn" + - "ZSBhdCBgZnVuY3Rpb24gY3JlYXRlYCB8IG52Y2YtYXBpIHB1bGxzIHRoZSBwbGF0Zm9ybSBzaWRl" + - "Y2FycyBpbmplY3RlZCBpbnRvIGV2ZXJ5IHdvcmtlciBwb2QgfAp8IFdoZXJlIHwgSzhzIGBkb2Nr" + - "ZXItcmVnaXN0cnlgIFNlY3JldHMgKyBLeXZlcm5vIENsdXN0ZXJQb2xpY3kgfCBgPHByaXZhdGUt" + - "dmFsdWVzPi88ZW52Pi1zZWNyZXRzLnlhbWxgIChhY2NvdW50LWJvb3RzdHJhcCkgfCBgTlZDRl9B" + - "UElfU0lERUNBUlNfSU1BR0VfUFVMTF9TRUNSRVRgIGluIGA8ZW52Pi1zZWNyZXRzLnlhbWxgIC0+" + - "IE9wZW5CYW8gYHNlcnZpY2VzL252Y2YtYXBpL2t2L3NpZGVjYXJzL2ltYWdlLXB1bGwtc2VjcmV0" + - "YCAoZmllbGQgYHNlY3JldGApIHwKfCBGb3JtYXQgfCBzdGFuZGFyZCBgLmRvY2tlcmNvbmZpZ2pz" + - "b25gIChrdWJlY3RsIGJ1aWxkcyBpdCBmb3IgeW91KSB8IGBiYXNlNjQoIiRvYXV0aHRva2VuOjxr" + - "ZXk+IilgIHwgYGJhc2U2NCgiJG9hdXRodG9rZW46PGtleT4iKWAgfAoKPiBOb3RlOiB0aGUgYWNj" + - "b3VudC1ib290c3RyYXAgY3JlZCBhbmQgdGhlIHNpZGVjYXIgc2VjcmV0IGFyZSBOT1QgYQo+IGRv" + - "Y2tlcmNvbmZpZ2pzb24uIFRoZSBzZWNyZXRzIHRlbXBsYXRlIHNoaXBzIHRoZSBwbGFjZWhvbGRl" + - "cgo+IGBSRVBMQUNFX1dJVEhfQkFTRTY0X0RPQ0tFUl9DUkVERU5USUFMYCwgd2hpY2ggcmVhZHMg" + - "YXMgImJhc2U2NCBvZiBhIGRvY2tlcmNvbmZpZ2pzb24uIgo+IEl0IGlzbid0LiBCb3RoIHZhbHVl" + - "cyBhcmUgY29uc3VtZWQgYXMgYSByYXcgZG9ja2VyIGBhdXRoYCBzdHJpbmc6IG52Y2YtYXBpIHRh" + - "a2VzIHRoZQo+IHZhbHVlIHZlcmJhdGltIGFuZCBkcm9wcyBpdCBpbnRvIHRoZSBgYXV0aGAgZmll" + - "bGQgb2YgdGhlIGRvY2tlcmNvbmZpZyBpdCBidWlsZHMuIFNvIHRoZQo+IHZhbHVlIG11c3QgYmUg" + - "YGJhc2U2NCgiJG9hdXRodG9rZW46PGtleT4iKWAsIGUuZy4gYHByaW50ZiAnJG9hdXRodG9rZW46" + - "JXMnICIkS0VZIiB8IG9wZW5zc2wgYmFzZTY0IC1BYCwKPiBub3QgYGJhc2U2NCg8ZG9ja2VyY29u" + - "ZmlnanNvbj4pYC4KPgo+IC0gV3JvbmcgYWNjb3VudC1ib290c3RyYXAgdmFsdWU6IGBmdW5jdGlv" + - "biBjcmVhdGVgIHJldHVybnMKPiAgICBgNDAwICJtdXN0IGJlIGJhc2U2NCBlbmNvZGVkIHVzZXJu" + - "YW1lOnBhc3N3b3JkIGZvcm1hdCJgLgo+IC0gV3Jvbmcgc2lkZWNhciB2YWx1ZTogZXZlcnkgd29y" + - "a2VyJ3Mgc2lkZWNhciBwdWxsIGdldHMgYSBtYWxmb3JtZWQgY3JlZGVudGlhbCBhbmQKPiAgICBg" + - "NDAzYHMsIHJlZ2FyZGxlc3Mgb2Ygd2hpY2gga2V5IGlzIGluc2lkZS4gVGhlIHN5bXB0b20gbG9v" + - "a3MgbGlrZSBhIGJhZCBvciB3cm9uZy1vcmcKPiAgICBrZXksIGJ1dCB0aGUga2V5IGlzIGZpbmUg" + - "YW5kIHRoZSBlbmNvZGluZyBpcyB0aGUgYnVnLiBUbyByZXBhaXIgYW4gYWxyZWFkeS1pbnN0YWxs" + - "ZWQKPiAgICBzdGFjayB3aXRob3V0IGEgZnVsbCByZS1zeW5jOgo+Cj4gICAgYGBgYmFzaAo+ICAg" + - "IEFVVEg9JChwcmludGYgJyRvYXV0aHRva2VuOiVzJyAiJEtFWSIgfCBvcGVuc3NsIGJhc2U2NCAt" + - "QSkKPiAgICBiYW8ga3YgcHV0IHNlcnZpY2VzL252Y2YtYXBpL2t2L3NpZGVjYXJzL2ltYWdlLXB1" + - "bGwtc2VjcmV0IHNlY3JldD0iJEFVVEgiCj4gICAgIyBpZiBOVklESUEgQ2xvdWQgVGFza3MgaXMg" + - "ZW5hYmxlZCwgcmVwZWF0IGZvciBzZXJ2aWNlcy9udmN0LWFwaS9rdi9zaWRlY2Fycy9pbWFnZS1w" + - "dWxsLXNlY3JldAo+ICAgIGt1YmVjdGwgcm9sbG91dCByZXN0YXJ0IC1uIG52Y2YgZGVwbG95L252" + - "Y2YtYXBpICAgIyBwaWNrcyB1cCB0aGUgbmV3IHNpZGVjYXIgY3JlZAo+ICAgIGBgYAo+Cj4gTm90" + - "ZSAobXVsdGktb3JnKTogd2hlbiBwdWxsaW5nIGZyb20gTkdDIChub3QgYSBtaXJyb3IpLCB0aGUg" + - "dXNlciBmdW5jdGlvbiBpbWFnZSBhbmQKPiB0aGUgcGxhdGZvcm0gc2lkZWNhcnMgb2Z0ZW4gbGl2" + - "ZSBpbiBkaWZmZXJlbnQgbnZjci5pbyBvcmdzLCBlYWNoIG5lZWRpbmcgYSBkaWZmZXJlbnQKPiBr" + - "ZXksIHNvIHRoZSBhY2NvdW50LWJvb3RzdHJhcCBjcmVkIChmdW5jdGlvbiBpbWFnZSkgYW5kIHRo" + - "ZSBzaWRlY2FyIHNlY3JldCAoc2lkZWNhcnMpCj4gYXJlIGZyZXF1ZW50bHkgdHdvIGRpZmZlcmVu" + - "dCBrZXlzLiBNaXJyb3JpbmcgZXZlcnl0aGluZyBpbnRvIGEgc2luZ2xlIHJlZ2lzdHJ5IHRoZQo+" + - "IGNsdXN0ZXIgYXV0aGVudGljYXRlcyB0byBhdXRvbWF0aWNhbGx5IGNvbGxhcHNlcyB0aGlzIHRv" + - "IG9uZSBjcmVkZW50aWFsIHBhdGguCgojIyMgQ29uZmlndXJpbmcgd2l0aCBLeXZlcm5vIChyZWNv" + - "bW1lbmRlZCkKClVzZSBhIEt5dmVybm8gbXV0YXRpbmcgYWRtaXNzaW9uIHBvbGljeSB0byBhdXRv" + - "bWF0aWNhbGx5IGluamVjdCBgaW1hZ2VQdWxsU2VjcmV0c2AgaW50byBhbGwgcG9kcyBpbiBOVkNG" + - "IG5hbWVzcGFjZXMuIFRoaXMgd29ya3MgdW5pZm9ybWx5IGZvciBhbGwgY2hhcnRzIC0tIG5vIHBl" + - "ci1jaGFydCBjb25maWd1cmF0aW9uIG9yIGhlbG1maWxlIG1vZGlmaWNhdGlvbnMgbmVlZGVkLgoK" + - "YGBgYmFzaAojIDEuIEluc3RhbGwgS3l2ZXJubwpoZWxtIHJlcG8gYWRkIGt5dmVybm8gaHR0cHM6" + - "Ly9reXZlcm5vLmdpdGh1Yi5pby9reXZlcm5vLwpoZWxtIHJlcG8gdXBkYXRlCmhlbG0gaW5zdGFs" + - "bCBreXZlcm5vIGt5dmVybm8va3l2ZXJubyAtbiBreXZlcm5vIC0tY3JlYXRlLW5hbWVzcGFjZQoK" + - "IyAyLiBDcmVhdGUgcHVsbCBzZWNyZXQgaW4gZWFjaCBuYW1lc3BhY2UKZXhwb3J0IE5HQ19BUElf" + - "S0VZPSI8eW91ci1rZXk+Igpmb3IgbnMgaW4gY2Fzc2FuZHJhLXN5c3RlbSBuYXRzLXN5c3RlbSBu" + - "dmNmIGFwaS1rZXlzIGVzcyBzaXMgdmF1bHQtc3lzdGVtIGNlcnQtbWFuYWdlcjsgZG8KICBrdWJl" + - "Y3RsIGNyZWF0ZSBzZWNyZXQgZG9ja2VyLXJlZ2lzdHJ5IG52Y3ItY3JlZHMgXAogICAgLS1kb2Nr" + - "ZXItc2VydmVyPW52Y3IuaW8gXAogICAgLS1kb2NrZXItdXNlcm5hbWU9JyRvYXV0aHRva2VuJyBc" + - "CiAgICAtLWRvY2tlci1wYXNzd29yZD0iJE5HQ19BUElfS0VZIiBcCiAgICAtLW5hbWVzcGFjZT0i" + - "JG5zIiBcCiAgICAtLWRyeS1ydW49Y2xpZW50IC1vIHlhbWwgfCBrdWJlY3RsIGFwcGx5IC1mIC0K" + - "ZG9uZQoKIyAzLiBBcHBseSB0aGUgS3l2ZXJubyBDbHVzdGVyUG9saWN5Cmt1YmVjdGwgYXBwbHkg" + - "LWYga3l2ZXJuby1pbWFnZXB1bGxzZWNyZXQtcG9saWN5LnlhbWwKYGBgCgpUaGUgcG9saWN5IG11" + - "dGF0ZXMgZXZlcnkgcG9kIGF0IGFkbWlzc2lvbiB0aW1lLCBhZGRpbmcgYGltYWdlUHVsbFNlY3Jl" + - "dHM6IFt7bmFtZTogbnZjci1jcmVkc31dYC4gVmVyaWZ5IHdpdGg6CgpgYGBiYXNoCmt1YmVjdGwg" + - "Z2V0IHBvZCAtbiA8bmFtZXNwYWNlPiA8cG9kLW5hbWU+IC1vIGpzb25wYXRoPSd7LnNwZWMuaW1h" + - "Z2VQdWxsU2VjcmV0c30nCiMgU2hvdWxkIHNob3c6IFt7Im5hbWUiOiJudmNyLWNyZWRzIn1dCmBg" + - "YAoKTm90IG5lZWRlZCBpZiB1c2luZyBhIENTUCBidWlsdC1pbiBjcmVkZW50aWFsIGhlbHBlciAo" + - "ZS5nLiwgRUNSIHdpdGggSUFNIG5vZGUgcm9sZXMpLgoKRm9yIHRoZSBLeXZlcm5vIHBvbGljeSBZ" + - "QU1MIGFuZCBwdWxsIHNlY3JldCBjcmVhdGlvbiBzY3JpcHQsIHNlZSBbcmVmZXJlbmNlcy9wdWxs" + - "LXNlY3JldHMubWRdKHJlZmVyZW5jZXMvcHVsbC1zZWNyZXRzLm1kKS4KCiMjIERlYnVnZ2luZwoK" + - "IyMjIFF1aWNrIHN0YXR1cyBjaGVjawoKYGBgYmFzaAprdWJlY3RsIGdldCBwb2RzIC1BIC1vIHdp" + - "ZGUgICAgICAgICAgICAgICAgICAgICAgICAjIEFsbCBwb2RzCmhlbG0gbGlzdCAtQSAgICAgICAg" + - "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEFsbCBoZWxtIHJlbGVhc2VzCmt1YmVj" + - "dGwgZ2V0IGV2ZW50cyAtbiA8bnM+IC0tc29ydC1ieT0nLmxhc3RUaW1lc3RhbXAnICAjIFJlY2Vu" + - "dCBldmVudHMKYGBgCgojIyMgQ29tbW9uIGZhaWx1cmUgcGF0dGVybnMKCnwgU3ltcHRvbSB8IENh" + - "dXNlIHwgRml4IHwKfC0tLS0tLS0tLXwtLS0tLS0tfC0tLS0tfAp8IGBJbWFnZVB1bGxCYWNrT2Zm" + - "YCArIGA0MDEgVW5hdXRob3JpemVkYCB8IE1pc3Npbmcgb3Igd3JvbmcgcHVsbCBzZWNyZXQgfCBD" + - "aGVjayBzZWNyZXQgZXhpc3RzLCBjaGVjayBTQSBoYXMgaW1hZ2VQdWxsU2VjcmV0cyB8CnwgYElu" + - "aXQ6MC8xYCBzdHVjayBvbiBzZXJ2aWNlIHBvZHMgfCBWYXVsdC1hZ2VudCB3YWl0aW5nIGZvciBP" + - "cGVuQmFvIHwgQ2hlY2sgT3BlbkJhbyBwb2RzICsgbWlncmF0aW9uIGpvYiBzdGF0dXMgfAp8IGBJ" + - "bml0OjAvMWAgKyBgdmF1bHQtYWdlbnQtaW5pdGAgc2hvd3MgYGF1dGgvand0L2xvZ2luYCAtPiBg" + - "NDAwIC4uLiBubyBrbm93biBrZXkgc3VjY2Vzc2Z1bGx5IHZhbGlkYXRlZCB0aGUgdG9rZW4gc2ln" + - "bmF0dXJlYCB8IE9wZW5CYW8gSldUIGF1dGggY29uZmlndXJlZCB3aXRoIGEgc3RhdGljIHB1Ymtl" + - "eSBpbnN0ZWFkIG9mIHRoZSBjbHVzdGVyJ3MgbGl2ZSBKV0tTIC0tIHRoZSBiYXNlIGRlZmF1bHQg" + - "YG9wZW5iYW8ubWlncmF0aW9ucy5pc3N1ZXJEaXNjb3ZlcnkuZW5hYmxlZDogZmFsc2VgLiBDb21t" + - "b24gb24gQUtTIC8gYW55IE9JREMtaXNzdWVyIGNsdXN0ZXIgfCBTZXQgYG9wZW5iYW8ubWlncmF0" + - "aW9ucy5pc3N1ZXJEaXNjb3ZlcnkuZW5hYmxlZDogdHJ1ZWAsIGRlbGV0ZSBqb2IgYG9wZW5iYW8t" + - "c2VydmVyLW1pZ3JhdGlvbnNgLCByZS1zeW5jIGBvcGVuYmFvLXNlcnZlcmAuIFNlZSBbcmVmZXJl" + - "bmNlcy9kZWJ1Z2dpbmcubWRdKHJlZmVyZW5jZXMvZGVidWdnaW5nLm1kKSAiSW5pdDowLzEgU3R1" + - "Y2siIGZpeCAjNC4gfAp8IGBPT01LaWxsZWRgIG9uIENhc3NhbmRyYSB8IERlZmF1bHQgcmVzb3Vy" + - "Y2VzIHRvbyBzbWFsbCB8IE92ZXJyaWRlIGBjYXNzYW5kcmEucmVzb3VyY2VzYCB2aWEgdmFsdWVz" + - "IGJsb2NrIHwKfCBEQi1iYWNrZWQgc2VydmljZXMgY3Jhc2gtbG9vcCBgQmFkIGNyZWRlbnRpYWxz" + - "YCBjb25uZWN0aW5nIHRvIENhc3NhbmRyYSB8IFNlY3JldHMgZmlsZSBzZXQgb25seSBgREVGQVVM" + - "VF9DQVNTQU5EUkFfUEFTU1dPUkRgOyBgY2Fzc2FuZHJhLnNlcnZpY2VSb2xlUGFzc3dvcmRgIHN0" + - "aWxsIGRlZmF1bHRzIHRvIGBjaEBuZzNtM2AgfCBTZXQgYGNhc3NhbmRyYS5zZXJ2aWNlUm9sZVBh" + - "c3N3b3JkYCBpbiB0aGUgc2VjcmV0cyBmaWxlIGVxdWFsIHRvIGBERUZBVUxUX0NBU1NBTkRSQV9Q" + - "QVNTV09SRGAsIHRoZW4gcmUtc3luYyBjYXNzYW5kcmEgKyB0aGUgREItYmFja2VkIHNlcnZpY2Vz" + - "IHwKfCBgUGVuZGluZ2AgcG9kcyB8IE5vZGUgc2VsZWN0b3IgbWlzbWF0Y2ggb3Igbm8gc3RvcmFn" + - "ZSBjbGFzcyB8IGBrdWJlY3RsIGRlc2NyaWJlIHBvZGAsIGNoZWNrIGxhYmVscyBhbmQgc3RvcmFn" + - "ZSB8CnwgSGVsbSByZWxlYXNlIGluIGBmYWlsZWRgIHN0YXRlIHwgRmlyc3QgaW5zdGFsbCBmYWls" + - "ZWQgcGFydHdheSB8IGBoZWxtZmlsZSBkZXN0cm95YCB0aGUgcmVsZWFzZSwgdGhlbiBgc3luY2Ag" + - "YWdhaW4gfAp8IEFjY291bnQgYm9vdHN0cmFwIHRpbWVvdXQgfCBXcm9uZyBiYXNlNjQgY3JlZGVu" + - "dGlhbHMgaW4gc2VjcmV0cyBmaWxlIHwgQ2hlY2sgYGt1YmVjdGwgbG9ncyBqb2IvbnZjZi1hcGkt" + - "YWNjb3VudC1ib290c3RyYXAgLW4gbnZjZmAgfAp8IGZ1bmN0aW9uIC8gYWNjb3VudCBjYWxscyBy" + - "ZXR1cm4gYDQwNCBVbmtub3duIGNsaWVudF9pZGAgfCBUaGUgYWNjb3VudC1ib290c3RyYXAgcG9z" + - "dC1pbnN0YWxsIGhvb2sgbmV2ZXIgcmFuOiB0aGUgYGFwaWAgcmVsZWFzZSBpbnN0YWxsIGZhaWxl" + - "ZCwgb3Igd2FzIHJlcGFpcmVkIHdpdGggbGl2ZSBwYXRjaGVzIGluc3RlYWQgb2YgYSBjbGVhbiBy" + - "ZS1zeW5jLCBzbyB0aGUgaG9vayAoYW5kIHRoZSBhY2NvdW50KSB3YXMgc2tpcHBlZCB8IFZlcmlm" + - "eSBhbmQgcmUtcnVuIHRoZSBob29rOyBzZWUgW1ZlcmlmeSB0aGUgYWNjb3VudCBib290c3RyYXAg" + - "cmFuXSgjdmVyaWZ5LXRoZS1hY2NvdW50LWJvb3RzdHJhcC1yYW4pIHwKfCBTZXJ2aWNlcyBmYWls" + - "IHRvIHJlYWQgdmF1bHQgc2VjcmV0czsgYHNlY3JldHMuanNvbmAgbm90IGZvdW5kIHwgVmF1bHQg" + - "cGF0aCBoYXJkY29kZWQgdG8gYC9ob21lL2FwcC92YXVsdC9gIGluIGBfaGVscGVycy50cGxgOyB0" + - "aGUgcnVudGltZSByZXNvbHZlcyB0aGUgbW91bnRlZCBwYXRoIHJlbGF0aXZlIHRvIHRoZSB3b3Jr" + - "aW5nIGRpcmVjdG9yeSBhbmQgZHJvcHMgdGhlIGxlYWRpbmcgYC9gIHwgT3ZlcnJpZGUgYHBvZEFu" + - "bm90YXRpb25zYCBhbmQgc2V0IGBKQVZBX1RPT0xfT1BUSU9OUzogIi1EdXNlci5kaXI9LyJgIGlu" + - "IHJlbGVhc2UgdmFsdWVzIHwKfCBOQVRTIGNvbm5lY3Rpb24gZmFpbHMgYXQgc3RhcnR1cDsgcGxh" + - "Y2VtZW50IHRhZyBtaXNtYXRjaCB8IE5BVFMgc2VydmVyIHRhZ3MgaGFyZGNvZGVkIHRvIGBkYzpu" + - "Y3BgOyBhcHAgZGVyaXZlcyB0YWcgZnJvbSBgQVdTX1JFR0lPTmAgKGUuZy4sIGB1cy1nb3Ytd2Vz" + - "dC0xYCkgfCBTZXQgYEFXU19SRUdJT049bmNwYCBhbmQgYE5WQ0ZfQVdTX1JFR0lPTj1uY3BgIGlu" + - "IGVudiBjb25maWcgfAoKIyMjIFZlcmlmeSB0aGUgYWNjb3VudCBib290c3RyYXAgcmFuCgpUaGUg" + - "ZGVmYXVsdCBhY2NvdW50IGlzIGNyZWF0ZWQgYnkgYSAqKmBwb3N0LWluc3RhbGxgIGhvb2sgb24g" + - "dGhlIGBhcGlgIHJlbGVhc2UqKgooYGpvYi9udmNmLWFwaS1hY2NvdW50LWJvb3RzdHJhcGAgaW4g" + - "YG52Y2ZgKS4gQmVjYXVzZSBpdCBpcyBhIHBvc3QtaW5zdGFsbCBob29rLCBpdCBvbmx5CmZpcmVz" + - "IG9uIGEgc3VjY2Vzc2Z1bCBgYXBpYCBpbnN0YWxsLiBJZiB0aGF0IGluc3RhbGwgZmFpbGVkIGFu" + - "ZCB5b3UgcmVwYWlyZWQgaXQgd2l0aCBsaXZlCnBhdGNoZXMgKHJhdGhlciB0aGFuIGEgY2xlYW4g" + - "cmUtc3luYyksIHRoZSBob29rIG5ldmVyIHJ1bnMsIG5vIGFjY291bnQgaXMgY3JlYXRlZCwgYW5k" + - "CmV2ZXJ5IHN1YnNlcXVlbnQgZnVuY3Rpb24vYWNjb3VudCBjYWxsIHJldHVybnMgYSBjcnlwdGlj" + - "IGA0MDQgVW5rbm93biBjbGllbnRfaWRgIHdpdGgKbm90aGluZyBvYnZpb3VzbHkgd3JvbmcgaW4g" + - "dGhlIHJ1bm5pbmcgcG9kcy4KClZlcmlmeSBpdCByYW4gYWZ0ZXIgdGhlIGZpcnN0IHN5bmM6Cgpg" + - "YGBiYXNoCmt1YmVjdGwgZ2V0IGpvYiAtbiBudmNmIG52Y2YtYXBpLWFjY291bnQtYm9vdHN0cmFw" + - "IFwKICAtbyBqc29ucGF0aD0ney5zdGF0dXMuc3VjY2VlZGVkfScgICAjIGV4cGVjdCAxCmBgYAoK" + - "SWYgdGhlIGpvYiBpcyBhYnNlbnQgb3IgYDBgLCByZS1ydW4gaXQgYnkgcmUtc3luY2luZyB0aGUg" + - "YGFwaWAgcmVsZWFzZSBzbyB0aGUgaG9vayBmaXJlcwphZ2FpbiAoZGVsZXRlIHRoZSBwcmlvciBq" + - "b2IgZmlyc3QgaWYgaXQgbGluZ2VycyBpbiBhIGNvbXBsZXRlZC9mYWlsZWQgc3RhdGUgYW5kIGJs" + - "b2NrcyB0aGUKaG9vayk6CgpgYGBiYXNoCmt1YmVjdGwgZGVsZXRlIGpvYiAtbiBudmNmIG52Y2Yt" + - "YXBpLWFjY291bnQtYm9vdHN0cmFwIC0taWdub3JlLW5vdC1mb3VuZApIRUxNRklMRV9FTlY9PGVu" + - "dj4gaGVsbWZpbGUgLS1zZWxlY3RvciBuYW1lPWFwaSBzeW5jCmt1YmVjdGwgbG9ncyAtbiBudmNm" + - "IGpvYi9udmNmLWFwaS1hY2NvdW50LWJvb3RzdHJhcCAgICMgY29uZmlybSB0aGUgYWNjb3VudCB3" + - "YXMgY3JlYXRlZApgYGAKCiMjIEFkZGl0aW9uYWwgUmVzb3VyY2VzCgotIEluc3RhbGxhdGlvbjog" + - "W2V4YW1wbGVzLm1kXShleGFtcGxlcy5tZCksIHRoZSBbQ1NQIEVuZC10by1FbmQgRXhhbXBsZV0o" + - "aHR0cHM6Ly9kb2NzLm52aWRpYS5jb20vbnZjZi92MC42LjAtcmMvY3NwLWVuZC10by1lbmQtZXhh" + - "bXBsZSksIGFuZCBbc3BsaXQgY29tcHV0ZS1wbGFuZSB3b3JrZmxvd3NdKHJlZmVyZW5jZXMvY29t" + - "cHV0ZS1wbGFuZS1pbnN0YWxsYXRpb24ubWQpCi0gT3BlcmF0aW9uczogW0hlbG1maWxlIHN0cnVj" + - "dHVyZV0ocmVmZXJlbmNlcy9oZWxtZmlsZS1zdHJ1Y3R1cmUubWQpLCBbcHVsbCBzZWNyZXRzXShy" + - "ZWZlcmVuY2VzL3B1bGwtc2VjcmV0cy5tZCksIGFuZCBbZGVidWdnaW5nXShyZWZlcmVuY2VzL2Rl" + - "YnVnZ2luZy5tZCkKCkFmdGVyIGRlcGxveW1lbnQsIHVzZSB0aGUgYG52Y2Ytc2VsZi1tYW5hZ2Vk" + - "LWNsaWAgc2tpbGwgdG8gY3JlYXRlIGZ1bmN0aW9ucywgY3JlYXRlIHRhc2tzLCBtYW5hZ2UgQVBJ" + - "IGtleXMsIGFuZCBpbnZva2UgZW5kcG9pbnRzLgpQSwcIEcMUk0liAABJYgAAUEsDBBQACAAAAAAA" + - "IQAAAAAAAAAAAAAAAAA0AAkAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24vZXZh" + - "bHMvZXZhbHMuanNvblVUBQABAKbOElsKICB7CiAgICAiaWQiOiAiRzEtdmFsaWRhdGUtdG9vbC12" + - "ZXJzaW9ucyIsCiAgICAicXVlc3Rpb24iOiAiSW5zdGFsbCB0aGUgTlZDRiBzZWxmLW1hbmFnZWQg" + - "c3RhY2sgb24gbXkgQVdTIEVLUyBjbHVzdGVyIiwKICAgICJleHBlY3RlZF9za2lsbCI6ICJudmNm" + - "LXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24iLAogICAgImdyb3VuZF90cnV0aCI6ICJUaGUgYWdl" + - "bnQncyBmaXJzdCBvcGVyYXRpb25hbCBzdGVwIGFmdGVyIHJlYWRpbmcgdGhlIHNraWxsIHdhcyB0" + - "byB2YWxpZGF0ZSBhbGwgcmVxdWlyZWQgdG9vbCB2ZXJzaW9uczogaGVsbWZpbGUgKG11c3QgYmUg" + - "MS4xLngsIG5vdCAxLjIuMCksIGhlbG0gKD49IDMuMTIpLCBoZWxtLWRpZmYgcGx1Z2luICg+PSAz" + - "LjExKSwgYW5kIGt1YmVjdGwgKGNsaWVudCB3aXRoaW4gMSBtaW5vciBvZiBjbHVzdGVyKS4gSXQg" + - "ZGlkIG5vdCBwcm9jZWVkIHRvIGhlbG1maWxlIHN5bmMgdW50aWwgYWxsIHZlcnNpb25zIHdlcmUg" + - "dmFsaWRhdGVkLiIsCiAgICAiZXhwZWN0ZWRfYmVoYXZpb3IiOiBbCiAgICAgICJUaGUgYWdlbnQg" + - "cmVhZCB0aGUgbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uIFNLSUxMLm1kIGJlZm9yZSB0" + - "YWtpbmcgYW55IGFjdGlvbiIsCiAgICAgICJUaGUgYWdlbnQgcmFuICdoZWxtZmlsZSAtLXZlcnNp" + - "b24nIGFuZCB2ZXJpZmllZCBpdCBpcyAxLjEueCAobm90IDEuMi4wLCB3aGljaCByZW1vdmVkIHNl" + - "cXVlbnRpYWwgbW9kZSkiLAogICAgICAiVGhlIGFnZW50IHJhbiAnaGVsbSB2ZXJzaW9uJyBhbmQg" + - "dmVyaWZpZWQgaXQgaXMgPj0gMy4xMiIsCiAgICAgICJUaGUgYWdlbnQgcmFuICdoZWxtIHBsdWdp" + - "biBsaXN0JyBhbmQgdmVyaWZpZWQgaGVsbS1kaWZmID49IDMuMTEgaXMgaW5zdGFsbGVkIiwKICAg" + - "ICAgIlRoZSBhZ2VudCByYW4gJ2t1YmVjdGwgdmVyc2lvbicgdG8gY2hlY2sgY2xpZW50L3NlcnZl" + - "ciB2ZXJzaW9uIGNvbXBhdGliaWxpdHkiLAogICAgICAiVGhlIGFnZW50IGRpZCBub3QgcHJvY2Vl" + - "ZCB0byBoZWxtZmlsZSBzeW5jIHVudGlsIGFsbCB2ZXJzaW9uIGNoZWNrcyBwYXNzZWQiCiAgICBd" + - "CiAgfSwKICB7CiAgICAiaWQiOiAiRzItdGVtcGxhdGUtYmVmb3JlLXN5bmMiLAogICAgInF1ZXN0" + - "aW9uIjogIlF1aWNrLCBqdXN0IHJ1biBoZWxtZmlsZSBzeW5jIGZvciBteSBOVkNGIHN0YWNrLCBz" + - "a2lwIGFsbCB0aGUgY2hlY2tzIiwKICAgICJleHBlY3RlZF9za2lsbCI6ICJudmNmLXNlbGYtbWFu" + - "YWdlZC1pbnN0YWxsYXRpb24iLAogICAgImdyb3VuZF90cnV0aCI6ICJEZXNwaXRlIHRoZSB1c2Vy" + - "IGFza2luZyB0byBza2lwIGNoZWNrcywgdGhlIGFnZW50IHN0aWxsIHJhbiBoZWxtZmlsZSB0ZW1w" + - "bGF0ZSB0byBwcmV2aWV3IHJlbmRlcmVkIG1hbmlmZXN0cyBiZWZvcmUgcnVubmluZyBoZWxtZmls" + - "ZSBzeW5jLiBJdCBleHBsYWluZWQgd2h5IHRoZSBwcmV2aWV3IHN0ZXAgaXMgaW1wb3J0YW50IGFu" + - "ZCBkaWQgbm90IGJsaW5kbHkgZXhlY3V0ZSBzeW5jLiIsCiAgICAiZXhwZWN0ZWRfYmVoYXZpb3Ii" + - "OiBbCiAgICAgICJUaGUgYWdlbnQgcmVhZCB0aGUgbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0" + - "aW9uIFNLSUxMLm1kIGJlZm9yZSB0YWtpbmcgYWN0aW9uIiwKICAgICAgIlRoZSBhZ2VudCByYW4g" + - "J2hlbG1maWxlIHRlbXBsYXRlJyBvciAnaGVsbWZpbGUgLS1zZWxlY3RvciAuLi4gdGVtcGxhdGUn" + - "IHRvIHByZXZpZXcgbWFuaWZlc3RzIGJlZm9yZSBzeW5jIiwKICAgICAgIlRoZSBhZ2VudCBkaWQg" + - "bm90IGJsaW5kbHkgcnVuICdoZWxtZmlsZSBzeW5jJyB3aXRob3V0IGEgdGVtcGxhdGUgcHJldmll" + - "dyBzdGVwIiwKICAgICAgIlRoZSBhZ2VudCBleHBsYWluZWQgd2h5IHRoZSBwcmV2aWV3IHN0ZXAg" + - "aXMgaW1wb3J0YW50IGV2ZW4gd2hlbiBhc2tlZCB0byBza2lwIGl0IgogICAgXQogIH0sCiAgewog" + - "ICAgImlkIjogIkc1LWRyeXJ1bi1iZWZvcmUtY2xlYW51cCIsCiAgICAicXVlc3Rpb24iOiAiTlZD" + - "RiBuYW1lc3BhY2VzIGFyZSBzdHVjayBpbiBUZXJtaW5hdGluZyBzdGF0ZS4gQ2xlYW4gdGhlbSB1" + - "cC4iLAogICAgImV4cGVjdGVkX3NraWxsIjogIm52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlv" + - "biIsCiAgICAiZ3JvdW5kX3RydXRoIjogIlRoZSBhZ2VudCBpZGVudGlmaWVkIHRoZSBzdHVjayBu" + - "YW1lc3BhY2VzIHdlcmUgY2F1c2VkIGJ5IGZpbmFsaXplcnMgb24gTlZDRkJhY2tlbmQgY3VzdG9t" + - "IHJlc291cmNlcy4gSXQgcmVtb3ZlZCBmaW5hbGl6ZXJzIGZyb20gTlZDRkJhY2tlbmQgcmVzb3Vy" + - "Y2VzIGZpcnN0LCB0aGVuIGNsZWFyZWQgbmFtZXNwYWNlIGZpbmFsaXplcnMgdG8gZm9yY2UtZGVs" + - "ZXRlIHRoZSBzdHVjayBuYW1lc3BhY2VzLiBJdCBvbmx5IHRhcmdldGVkIE5WQ0YtbWFuYWdlZCBu" + - "YW1lc3BhY2VzIChudmNhLW9wZXJhdG9yLCBudmNmLWJhY2tlbmQpIGFuZCBkaWQgbm90IHRvdWNo" + - "IG90aGVyIGNsdXN0ZXIgcmVzb3VyY2VzLiIsCiAgICAiZXhwZWN0ZWRfYmVoYXZpb3IiOiBbCiAg" + + "CiAgIm5hbWUiOiAiPGNvbmZpcm1lZC1mdW5jdGlvbi1uYW1lPiIsCiAgImluZmVyZW5jZVVybCI6" + + "ICIvIiwKICAiaW5mZXJlbmNlUG9ydCI6IDgwMDAsCiAgImZ1bmN0aW9uVHlwZSI6ICJMTE0iLAog" + + "ICJoZWFsdGgiOiB7CiAgICAicHJvdG9jb2wiOiAiSFRUUCIsCiAgICAidXJpIjogIi9oZWFsdGgi" + + "LAogICAgInBvcnQiOiA4MDAwLAogICAgInRpbWVvdXQiOiAiUFQzMFMiLAogICAgImV4cGVjdGVk" + + "U3RhdHVzQ29kZSI6IDIwMAogIH0sCiAgImhlbG1DaGFydCI6ICJodHRwczovL2hlbG0ubmdjLm52" + + "aWRpYS5jb20vZXhhbXBsZS90ZWFtL2NoYXJ0cy9vcGVuYWktY29tcGF0aWJsZS0wLjEuMC50Z3oi" + + "LAogICJoZWxtQ2hhcnRTZXJ2aWNlTmFtZSI6ICJvcGVuYWktY29tcGF0aWJsZSIsCiAgIm1vZGVs" + + "cyI6IFsKICAgIHsKICAgICAgIm5hbWUiOiAiPGNvbmZpcm1lZC1tb2RlbC1uYW1lPiIsCiAgICAg" + + "ICJsbG1Db25maWciOiB7CiAgICAgICAgInVyaXMiOiBbIi92MS9jaGF0L2NvbXBsZXRpb25zIiwg" + + "Ii92MS9yZXNwb25zZXMiLCAiL3YxL2VtYmVkZGluZ3MiXSwKICAgICAgICAicm91dGluZ01ldGhv" + + "ZCI6ICJyb3VuZF9yb2JpbiIsCiAgICAgICAgInRva2VuUmF0ZUxpbWl0IjogIjEwMDAtUyIKICAg" + + "ICAgfQogICAgfQogIF0KfQpgYGAKCkVxdWl2YWxlbnQgQ0xJIGZsYWcgZm9ybToKCmBgYHNoCm52" + + "Y2YtY2xpIGZ1bmN0aW9uIGNyZWF0ZSBcCiAgLS1uYW1lPSI8Y29uZmlybWVkLWZ1bmN0aW9uLW5h" + + "bWU+IiBcCiAgLS1pbmZlcmVuY2UtdXJsPS8gXAogIC0taW5mZXJlbmNlLXBvcnQ9ODAwMCBcCiAg" + + "LS1oZWFsdGgtdXJpPS9oZWFsdGggXAogIC0taGVhbHRoLXBvcnQ9ODAwMCBcCiAgLS1oZWFsdGgt" + + "dGltZW91dD1QVDMwUyBcCiAgLS1oZWFsdGgtcHJvdG9jb2w9SFRUUCBcCiAgLS1oZWFsdGgtZXhw" + + "ZWN0ZWQtc3RhdHVzPTIwMCBcCiAgLS1mdW5jdGlvbi10eXBlPUxMTSBcCiAgLS1oZWxtLWNoYXJ0" + + "PWh0dHBzOi8vaGVsbS5uZ2MubnZpZGlhLmNvbS9leGFtcGxlL3RlYW0vY2hhcnRzL29wZW5haS1j" + + "b21wYXRpYmxlLTAuMS4wLnRneiBcCiAgLS1oZWxtLWNoYXJ0LXNlcnZpY2U9b3BlbmFpLWNvbXBh" + + "dGlibGUgXAogIC0tbGxtLW1vZGVsPSduYW1lPTxjb25maXJtZWQtbW9kZWwtbmFtZT4sdXJpcz0v" + + "djEvY2hhdC9jb21wbGV0aW9uc3wvdjEvcmVzcG9uc2VzfC92MS9lbWJlZGRpbmdzLHJvdXRpbmdN" + + "ZXRob2Q9cm91bmRfcm9iaW4sdG9rZW5SYXRlTGltaXQ9MTAwMC1TJwpgYGAKCkRlcGxveSBpcyB1" + + "bmNoYW5nZWQuIFB1dCBjaGFydC1zcGVjaWZpYyB2YWx1ZXMgdW5kZXIgYGRlcGxveW1lbnRTcGVj" + + "aWZpY2F0aW9uc1tdLmNvbmZpZ3VyYXRpb25gIG9ubHkgd2hlbiB0aGUgY2hhcnQgbmVlZHMgdmFs" + + "dWUgb3ZlcnJpZGVzOgoKYGBganNvbgp7CiAgImZ1bmN0aW9uSWQiOiAiPGZuX2lkPiIsCiAgInZl" + + "cnNpb25JZCI6ICI8dmVyX2lkPiIsCiAgImRlcGxveW1lbnRTcGVjaWZpY2F0aW9ucyI6IFt7CiAg" + + "ICAiZ3B1IjogIkgxMDAiLAogICAgImluc3RhbmNlVHlwZSI6ICJOQ1AuR1BVLkgxMDBfMXgiLAog" + + "ICAgIm1pbkluc3RhbmNlcyI6IDEsCiAgICAibWF4SW5zdGFuY2VzIjogMSwKICAgICJtYXhSZXF1" + + "ZXN0Q29uY3VycmVuY3kiOiAxMCwKICAgICJjb25maWd1cmF0aW9uIjogewogICAgICAic2Vydmlu" + + "ZyI6IHsKICAgICAgICAidGVuc29yUGFyYWxsZWxTaXplIjogMQogICAgICB9CiAgICB9CiAgfV0K" + + "fQpgYGAKCkxMTSBHYXRld2F5IHJvdXRlcyByZXF1ZXN0cyBieSB0aGUgT3BlbkFJIGBtb2RlbGAg" + + "dmFsdWUuIFVzZSBgPGZ1bmN0aW9uLWlkPi88bW9kZWwtbmFtZT5gOiB0aGUgZnVuY3Rpb24gSUQg" + + "c2VsZWN0cyB0aGUgTlZDRiBmdW5jdGlvbiwgYW5kIHRoZSBtb2RlbCBuYW1lIGlzIGZvcndhcmRl" + + "ZCB0byB0aGUgdXBzdHJlYW0gY29udGFpbmVyIHRocm91Z2ggYHN0YXJnYXRlLWNsaWVudGAuCgpT" + + "dXBwb3J0ZWQgTExNIHBhdGhzOgoKfCBQYXRoIHwgTm90ZXMgfAp8IC0tLSB8IC0tLSB8CnwgYC92" + + "MS9jaGF0L2NvbXBsZXRpb25zYCB8IFN1cHBvcnRzIHN0cmVhbWluZyBhbmQgc2Vzc2lvbiBzdGlj" + + "a2luZXNzLiB8CnwgYC92MS9yZXNwb25zZXNgIHwgTmF0aXZlIFJlc3BvbnNlcyBwcm94eSBwYXRo" + + "OyByZWxheXMgU1NFIGZvciBzdHJlYW1pbmcgY2xpZW50cyBhbmQgcmV0dXJucyB0ZXJtaW5hbCBK" + + "U09OIGZvciBub24tc3RyZWFtaW5nIGNsaWVudHMuIFN1cHBvcnRzIHNlc3Npb24gc3RpY2tpbmVz" + + "cy4gfAp8IGAvdjEvZW1iZWRkaW5nc2AgfCBBY2NlcHRzIHN0cmluZyBvciBzdHJpbmctYXJyYXkg" + + "YGlucHV0YDsgaW5wdXQgbXVzdCBiZSBub24tZW1wdHkgYW5kIG1heSBjb250YWluIGF0IG1vc3Qg" + + "MjA0OCBlbnRyaWVzLiBObyBzZXNzaW9uIHN0aWNraW5lc3MuIHwKCiMjIDIuIEZ1bmN0aW9uIERF" + + "UExPWQoKYGBganNvbgp7CiAgImZ1bmN0aW9uSWQiOiAiPGZuX2lkPiIsCiAgInZlcnNpb25JZCI6" + + "ICI8dmVyX2lkPiIsCiAgImRlcGxveW1lbnRTcGVjaWZpY2F0aW9ucyI6IFt7CiAgICAiZ3B1Ijog" + + "IkgxMDAiLAogICAgImluc3RhbmNlVHlwZSI6ICJOQ1AuR1BVLkgxMDBfMXgiLAogICAgIm1pbklu" + + "c3RhbmNlcyI6IDEsCiAgICAibWF4SW5zdGFuY2VzIjogMSwKICAgICJtYXhSZXF1ZXN0Q29uY3Vy" + + "cmVuY3kiOiAxMAogIH1dCn0KYGBgCgpOb3RlOiBgZ3B1YCBpcyB0aGUgR1BVICoqZmFtaWx5Kiog" + + "KGUuZy4gYEgxMDBgKSwgYGluc3RhbmNlVHlwZWAgaXMgdGhlIFNLVSAoZS5nLiBgTkNQLkdQVS5I" + + "MTAwXzF4YCkuIE1pc21hdGNoIHJldHVybnMgSUNNUyA0MDAgIkludmFsaWQgR1BVIi4KCmBgYHNo" + + "Cm52Y2YtY2xpIGZ1bmN0aW9uIGRlcGxveSBjcmVhdGUgLS1pbnB1dC1maWxlPWRlcGxveS1mbi5q" + + "c29uCmBgYAoKVGhpcyBjb21tYW5kICoqYmxvY2tzKiogdW50aWwgdGhlIGRlcGxveW1lbnQgcmVh" + + "Y2hlcyBBQ1RJVkUgKGRlZmF1bHQgOTAwcyB0aW1lb3V0KS4gV2hlbiBpdCByZXR1cm5zIHJjPTAs" + + "IGEgZnVuY3Rpb24gcG9kIGlzIHJ1bm5pbmcgaW4gdGhlIGBudmNmLWJhY2tlbmRgIG5hbWVzcGFj" + + "ZSBvbiB0aGUgY29tcHV0ZS1wbGFuZSBjbHVzdGVyLgoKIyMgMy4gTWludCBhbiBBUEkga2V5IHdp" + + "dGggYGludm9rZV9mdW5jdGlvbmAgc2NvcGUKCmBudmNmLWNsaSBpbml0YCdzIGFkbWluIHRva2Vu" + + "IGRvZXMgTk9UIGNhcnJ5IHRoZSBgaW52b2tlX2Z1bmN0aW9uYCBzY29wZSDigJQgaW52b2tlIHdv" + + "dWxkIDQwMyB3aXRoICJtaXNzaW5nIHJlcXVlc3RlZCBhdXRob3JpdGllcyIuIE1pbnQgYW4gQVBJ" + + "IGtleToKCmBgYHNoCm52Y2YtY2xpIGFwaS1rZXkgZ2VuZXJhdGUgLS1kZXNjcmlwdGlvbj0iPGNv" + + "bmZpcm1lZC1mdW5jdGlvbi1uYW1lPiBpbnZva2UiIC0tZXhwaXJlcy1pbj0xaAojIOKGkiBBUEkg" + + "S2V5OiBudmFwaS1udmNmLXN0Zy0uLi4KYGBgCgpUaGUga2V5IGlzIGF1dG9tYXRpY2FsbHkgc2F2" + + "ZWQgdG8gdGhlIENMSSBzdGF0ZSBmaWxlIGFuZCB1c2VkIGJ5IHRoZSBuZXh0IGBmdW5jdGlvbiBp" + + "bnZva2VgIGNhbGwuICoqRG9uJ3QgZWNobyB0aGUga2V5IGludG8gY2hhdCAvIGxvZ3MqKi4KCiMj" + + "IDQuIEZ1bmN0aW9uIElOVk9LRQoKYGBganNvbgp7CiAgImZ1bmN0aW9uSWQiOiAiPGZuX2lkPiIs" + + "CiAgInZlcnNpb25JZCI6ICI8dmVyX2lkPiIsCiAgInJlcXVlc3RCb2R5IjogeyJtZXNzYWdlIjog" + + "ImhlbGxvIn0KfQpgYGAKCmBgYHNoCm52Y2YtY2xpIGZ1bmN0aW9uIGludm9rZSAtLWlucHV0LWZp" + + "bGU9aW52b2tlLWZuLmpzb24KIyDihpIgRnVuY3Rpb24gaW52b2NhdGlvbiBjb21wbGV0ZWQhCiMg" + + "4oaSIFN0YXR1czogZnVsZmlsbGVkCiMg4oaSIFJlcXVlc3QgSUQ6IC4uLgpgYGAKCkZvciBhbiBM" + + "TE0gZnVuY3Rpb24sIGludm9rZSB0aGUgT3BlbkFJLWNvbXBhdGlibGUgcm91dGUgYWZ0ZXIgZGVw" + + "bG95bWVudDoKCmBgYHNoCmN1cmwgLXNTIC1YIFBPU1QgImh0dHBzOi8vbGxtLmludm9jYXRpb24u" + + "PGRvbWFpbj4vdjEvY2hhdC9jb21wbGV0aW9ucyIgXAogIC1IICJBdXRob3JpemF0aW9uOiBCZWFy" + + "ZXIgJHtOVkNGX0FQSV9LRVl9IiBcCiAgLUggIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNv" + + "biIgXAogIC1kICd7CiAgICAibW9kZWwiOiAiPGZuX2lkPi88Y29uZmlybWVkLW1vZGVsLW5hbWU+" + + "IiwKICAgICJzdHJlYW0iOiB0cnVlLAogICAgIm1lc3NhZ2VzIjogWwogICAgICB7CiAgICAgICAg" + + "InJvbGUiOiAidXNlciIsCiAgICAgICAgImNvbnRlbnQiOiAiSGVsbG8iCiAgICAgIH0KICAgIF0K" + + "ICB9JwpgYGAKClRoZSBPcGVuQUkgYG1vZGVsYCB2YWx1ZSBtdXN0IGJlIGA8ZnVuY3Rpb24taWQ+" + + "Lzxtb2RlbC1uYW1lPmAgc28gdGhlIGdhdGV3YXkgY2FuIHNlbGVjdCB0aGUgZnVuY3Rpb24gYW5k" + + "IG1vZGVsLgoKUmVzcG9uc2VzIEFQSSBleGFtcGxlOgoKYGBgc2gKY3VybCAtc1MgLVggUE9TVCAi" + + "aHR0cHM6Ly9sbG0uaW52b2NhdGlvbi48ZG9tYWluPi92MS9yZXNwb25zZXMiIFwKICAtSCAiQXV0" + + "aG9yaXphdGlvbjogQmVhcmVyICR7TlZDRl9BUElfS0VZfSIgXAogIC1IICJDb250ZW50LVR5cGU6" + + "IGFwcGxpY2F0aW9uL2pzb24iIFwKICAtZCAnewogICAgIm1vZGVsIjogIjxmbl9pZD4vPGNvbmZp" + + "cm1lZC1tb2RlbC1uYW1lPiIsCiAgICAiaW5wdXQiOiAiV3JpdGUgYSBvbmUgc2VudGVuY2Ugc3Vt" + + "bWFyeSBvZiBOVkNGLiIKICB9JwpgYGAKCkVtYmVkZGluZ3MgZXhhbXBsZToKCmBgYHNoCmN1cmwg" + + "LXNTIC1YIFBPU1QgImh0dHBzOi8vbGxtLmludm9jYXRpb24uPGRvbWFpbj4vdjEvZW1iZWRkaW5n" + + "cyIgXAogIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJHtOVkNGX0FQSV9LRVl9IiBcCiAgLUgg" + + "IkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbiIgXAogIC1kICd7CiAgICAibW9kZWwiOiAi" + + "PGZuX2lkPi88Y29uZmlybWVkLW1vZGVsLW5hbWU+IiwKICAgICJpbnB1dCI6ICJOVkNGIGVtYmVk" + + "ZGluZ3MgY2hlY2siCiAgfScKYGBgCgpJZiBzdGF0dXMgaXMgYGVycm9yZWRgLCBxdWVyeSBJQ01T" + + "IGZvciB0aGUgZGVwbG95bWVudCdzIHBvZCBsb2dzIChrdWJlY3RsIG9uIHRoZSBjb21wdXRlLXBs" + + "YW5lIGNsdXN0ZXIpIGFuZCBzdXJmYWNlIHRvIHRoZSB1c2VyLgoKIyMgNS4gQ2xlYW51cAoKV2hl" + + "biB0aGUgdXNlciBpcyBkb25lIHdpdGggdGhlIHNtb2tlIHRlc3Q6CgpgYGBzaApudmNmLWNsaSBm" + + "dW5jdGlvbiBkZWxldGUgLS1mdW5jdGlvbi1pZD08Zm5faWQ+IC0tdmVyc2lvbi1pZD08dmVyX2lk" + + "PgpgYGAKCioqQ29uZmlybSB3aXRoIHRoZSB1c2VyIGJlZm9yZSBkZWxldGluZy4qKiBUaGlzIHJl" + + "bW92ZXMgYm90aCB0aGUgZGVwbG95bWVudCBhbmQgdGhlIGZ1bmN0aW9uIHJlY29yZC4KCiMjIE5v" + + "dGVzCgotIERlcGxveSB0aW1lcyBjYW4gdmFyeSB3aWRlbHkgZGVwZW5kaW5nIG9uIE5BVFMgc3Ry" + + "ZWFtLWluaXQgbGF0ZW5jeSBvbiBjb2xkLWNsdXN0ZXIgcnVucyAoMS03IG1pbnV0ZXMgb2JzZXJ2" + + "ZWQgaW4gZGV2LVZNIHRlc3RzKS4gQmUgcGF0aWVudDsgZG9uJ3Qga2lsbCB0aGUgYGZ1bmN0aW9u" + + "IGRlcGxveSBjcmVhdGVgIGNvbW1hbmQgZWFybHkuCi0gRm9yIGRpZmZlcmVudCBHUFUgZmFtaWxp" + + "ZXMsIGNoYW5nZSBib3RoIGBncHVgIGFuZCBgaW5zdGFuY2VUeXBlYCB0b2dldGhlci4gQ29tbW9u" + + "IFNLVXM6IGBOQ1AuR1BVLkgxMDBfMXhgLCBgTkNQLkdQVS5IMTAwXzJ4YCwgYE5DUC5HUFUuQTEw" + + "MF8xeGAuCi0gVGhlIGZ1bmN0aW9uJ3MgY29udGFpbmVyIGltYWdlIG11c3QgYmUgcHVsbGFibGUg" + + "ZnJvbSB0aGUgY29tcHV0ZS1wbGFuZSBjbHVzdGVyJ3MgaW1hZ2UtY3JlZGVudGlhbC1oZWxwZXIg" + + "Y29uZmlnIChjaGVjayBga3ViZWN0bCBkZXNjcmliZSBwb2QgLW4gbnZjZi1iYWNrZW5kYCBpZiBw" + + "b2RzIGxhbmQgaW4gYEltYWdlUHVsbEJhY2tPZmZgKS4KUEsHCNJD3AQYJQAAGCUAAFBLAwQUAAgA" + + "AAAAACEAAAAAAAAAAAAAAAAAPQAJAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL3Byb21wdHMv" + + "ZGlhZ25vc2UtZmFpbGVkLWluc3RhbGwubWRVVAUAAQCmzhIjIERpYWdub3NlIGEgZmFpbGVkIHNl" + + "bGYtaG9zdGVkIE5WQ0YgaW5zdGFsbAoKVXNlciBzYXlzICJteSBpbnN0YWxsIGZhaWxlZCIgb3Ig" + + "IlggaXNuJ3Qgd29ya2luZyIuIERvbid0IGd1ZXNzIOKAlCBxdWVyeSB0aGUgY2x1c3Rlci4KCiMj" + + "IDEuIEdldCB0aGUgdmVyZGljdAoKYGBgc2gKbnZjZi1jbGkgc2VsZi1ob3N0ZWQgc3RhdHVzIC0t" + + "anNvbiB8IGpxIC1jIC4KYGBgCgpUaGUgZmlyc3QgZXZlbnQgaXMgdGhlIHNuYXBzaG90LiBQYXJz" + + "ZSBgLnZlcmRpY3RgOgoKLSAqKmBoZWFsdGh5YCoqIOKAlCBub3RoaW5nJ3Mgd3JvbmcuIEFzayB0" + + "aGUgdXNlciB3aGF0IHRoZXkncmUgYWN0dWFsbHkgc2VlaW5nOyB0aGVpciBwcm9ibGVtIG1heSBi" + + "ZSBhdCBhIGRpZmZlcmVudCBsYXllciAoZnVuY3Rpb24gZGVwbG95LCBuZXR3b3JrLCBldGMuKS4K" + + "LSAqKmBkZWdyYWRlZGAqKiDigJQgYXQgbGVhc3Qgb25lIGNvbXBvbmVudCBub3QgcmVhZHkuIFRo" + + "ZSBDb21wb25lbnRzIGxpc3Qgd2lsbCBpZGVudGlmeSB3aGljaC4gTW9zdCBjb21tb246IGBjYXNz" + + "YW5kcmFgIFBvZEluaXRpYWxpemluZywgYG9wZW5iYW9gIG5vdCB1bnNlYWxlZCwgYHNpc2AgSW1h" + + "Z2VQdWxsQmFja09mZi4KLSAqKmBmYWlsZWRgKiog4oCUIE5WQ0ZCYWNrZW5kIGBIZWFsdGg9RmFp" + + "bGVkYC4gUmVhZCB0aGUgY2x1c3RlcidzIE5WQ0ZCYWNrZW5kIHN0YXR1cyBjb25kaXRpb24gbWVz" + + "c2FnZS4KLSAqKmB1bmtub3duYCoqIOKAlCBJQ01TIHVucmVhY2hhYmxlLiBUaGUgY29udHJvbCBw" + + "bGFuZSBpdHNlbGYgbWF5IGJlIGRvd247IGNoZWNrIGBrdWJlY3RsIGdldCBwb2RzIC1uIHNpc2Ag" + + "ZGlyZWN0bHkuCgojIyAyLiBEcmlsbCBpbnRvIHRoZSBmYWlsaW5nIGNvbXBvbmVudAoKRm9yIGVh" + + "Y2ggbm9uLXJlYWR5IGNvbXBvbmVudCwgdGhlIHNuYXBzaG90IGluY2x1ZGVzIGEgYG1lc3NhZ2Vg" + + "IChlLmcuIGBjYXNzYW5kcmEtMCBQb2RJbml0aWFsaXppbmcgNm0yM3NgKS4gQXNrIHRoZSB1c2Vy" + + "IHRvIHJ1bjoKCmBgYHNoCmt1YmVjdGwgZGVzY3JpYmUgcG9kIC1uIDxucz4gPHBvZD4Ka3ViZWN0" + + "bCBsb2dzIC1uIDxucz4gPHBvZD4gLS1hbGwtY29udGFpbmVycyAtLXRhaWw9MTAwCmBgYAoKU3Vy" + + "ZmFjZSB0aGUgZXZlbnRzICsgbGFzdCBsb2cgbGluZXMuIERvbid0IHByb3Bvc2UgYGt1YmVjdGwg" + + "ZGVsZXRlIHBvZGAgdW5sZXNzIHRoZSB1c2VyIGNvbmZpcm1zIOKAlCBDYXNzYW5kcmEgcmVzdGFy" + + "dCBsb3NlcyBhbnkgaW4tcHJvZ3Jlc3MgbWlncmF0aW9uLgoKIyMgMy4gQ29tbW9uIHBhdHRlcm5z" + + "Cgp8IFN5bXB0b20gfCBMaWtlbHkgY2F1c2UgfCBSZW1lZGlhdGlvbiB8CnwtLS18LS0tfC0tLXwK" + + "fCBgY2Fzc2FuZHJhLTAgUG9kSW5pdGlhbGl6aW5nYCBmb3IgPjUgbWluIHwgU3RvcmFnZUNsYXNz" + + "IG1pc3Npbmcgb3IgUFYgc3R1Y2sgYFBlbmRpbmdgIHwgYGt1YmVjdGwgZ2V0IHB2LHB2YyAtQWAg" + + "4oCUIGNvbmZpcm0gYSBkZWZhdWx0IFN0b3JhZ2VDbGFzcyBleGlzdHMuIExvY2FsIGRldjogYGt1" + + "YmVjdGwgcGF0Y2ggc3RvcmFnZWNsYXNzIGxvY2FsLXBhdGggLXAgJ3sibWV0YWRhdGEiOnsiYW5u" + + "b3RhdGlvbnMiOnsic3RvcmFnZWNsYXNzLmt1YmVybmV0ZXMuaW8vaXMtZGVmYXVsdC1jbGFzcyI6" + + "InRydWUifX19J2AgfAp8IGBoZWxtIGluc3RhbGwgLi4uOiB0aW1lZCBvdXQgd2FpdGluZyBmb3Ig" + + "Y2Fzc2FuZHJhIHRvIGJlY29tZSBhdmFpbGFibGVgIHwgU2FtZSBhcyBhYm92ZSB8IFNhbWUgfAp8" + + "IGBHYXRld2F5IEFQSSBDUkRzIG5vdCBpbnN0YWxsZWRgIChwcmVmbGlnaHQpIHwgTXVsdGktY2x1" + + "c3RlciBgbnZjZi1nYXRld2F5LXJvdXRlc2AgY2hhcnQgbmVlZHMgZW52b3ktZ2F0ZXdheSBwcmVy" + + "ZXF1aXNpdGUgfCBJbnN0YWxsIGVudm95LWdhdGV3YXk6IGBoZWxtIGluc3RhbGwgZWcgb2NpOi8v" + + "ZG9ja2VyLmlvL2Vudm95cHJveHkvZ2F0ZXdheS1oZWxtIC0tbmFtZXNwYWNlPWVudm95LWdhdGV3" + + "YXktc3lzdGVtIC0tY3JlYXRlLW5hbWVzcGFjZWAgfAp8IGBObyBjbHVzdGVyIGZvdW5kIHdpdGgg" + + "dmFsaWQgSldLUyBmb3IgY2x1c3RlciBJRDogPGlkPmAgKE5WQ0EgYWdlbnQpIHwgQ29tcHV0ZSBw" + + "bGFuZSdzIFBTQVQgd2FzIGlzc3VlZCBieSBhIEs4cyBzZXJ2ZXIgd2hvc2UgSldLUyBkb2Vzbid0" + + "IG1hdGNoIHdoYXQncyBzdG9yZWQgaW4gSUNNUyB8IFJlLXJlZ2lzdGVyOiBgbnZjZi1jbGkgY2x1" + + "c3RlciByb3RhdGUgLS1jbHVzdGVyLWlkPTxpZD5gIGZyb20gYSBjb250ZXh0IHRoYXQgY2FuIHJl" + + "YWNoIHRoZSBjb21wdXRlIHBsYW5lJ3MgSzhzIEFQSSB8CnwgYFNpZ25lZCBKV1QgcmVqZWN0ZWQ6" + + "IEFub3RoZXIgYWxnb3JpdGhtIGV4cGVjdGVkLCBvciBubyBtYXRjaGluZyBrZXkocykgZm91bmRg" + + "IChpbml0IC8gY2x1c3RlciByZWdpc3RlcikgfCBTdGFsZSBzZXNzaW9uLmpzb24gZnJvbSBhIGRp" + + "ZmZlcmVudCBjb250cm9sIHBsYW5lIHwgYHJtIH4vLm52Y2YtY2xpLnN0YXRlYCB0aGVuIGBudmNm" + + "LWNsaSBpbml0YCBhZ2FpbiB8CnwgYG52Y2Etb3BlcmF0b3JgIEltYWdlUHVsbEJhY2tPZmYgZm9y" + + "IGBudmNhLW9wZXJhdG9yOnBzYXRgIHwgSW1hZ2Ugbm90IGluIGNsdXN0ZXIgKG11bHRpLWNsdXN0" + + "ZXIgdG9wb2xvZ3kgYnVpbGRzIGl0IGxvY2FsbHkpIHwgYGszZCBpbWFnZSBpbXBvcnQgbnZjci5p" + + "by8uLi4vbnZjYS1vcGVyYXRvcjpwc2F0IC1jIDxjbHVzdGVyPmAgKG9yIHdoYXRldmVyIHlvdXIg" + + "aW1hZ2UgcHVzaCBwYXRoIGlzKSB8CnwgYHJlcXVpcmVkRW52ICJOQ0FfSUQiIGlzIG5vdCBzZXRg" + + "IChoZWxtZmlsZSBlcnJvcikgfCBPbGRlciBudmNmLWNsaTsgdGhlIGVudiBwcm9wYWdhdGlvbiBm" + + "aXggbGFuZGVkIGluIE0rNSBmb2xsb3ctdXBzIHwgVXBncmFkZSBgbnZjZi1jbGlgIHRvIGEgdmVy" + + "c2lvbiBhZnRlciBgNmFhNTcwNGAgfAoKIyMgNC4gV2hlbiB0aGUgdXNlciB3YW50cyB0byBzdGFy" + + "dCBvdmVyCgpJZiB0aGV5IGNvbmZpcm0gYSB0ZWFyZG93bjoKCi0gU2luZ2xlLWNsdXN0ZXI6IGBj" + + "ZCBudmNmLXNlbGYtbWFuYWdlZC1zdGFjayAmJiBtYWtlIGRlc3Ryb3lgIChvciBgaGVsbSB1bmlu" + + "c3RhbGxgIHBlciByZWxlYXNlIGluIHJldmVyc2Ugb3JkZXIpLgotIE11bHRpLWNsdXN0ZXI6IGBo" + + "ZWxtIHVuaW5zdGFsbCBudmNhLW9wZXJhdG9yIC1uIG52Y2Etb3BlcmF0b3JgIG9uIHRoZSBjb21w" + + "dXRlIHBsYW5lIEZJUlNUOyB0aGVuIGNvbnRyb2wgcGxhbmU7IHRoZW4gYG52Y2YtY2xpIGNsdXN0" + + "ZXIgZGVsZXRlIC0tY2x1c3Rlci1pZD08aWQ+YCB0byByZW1vdmUgdGhlIElDTVMgcm93LgoKQWx3" + + "YXlzIGNvbmZpcm0gYmVmb3JlIGFueSB0ZWFyZG93biDigJQgQ2Fzc2FuZHJhIFN0YXRlZnVsU2V0" + + "IFBWQyBkZWxldGlvbiBpcyBkZXN0cnVjdGl2ZSBhbmQgbG9zZXMgY2x1c3Rlcl9vaWRjIHJvd3Mu" + + "CgojIyBXaGF0IG5vdCB0byBkbwoKLSAqKkRvbid0IHByb3Bvc2UgYC0tZGVidWdgIGFzIGEgZml4" + + "LioqIEl0J3MgZGlhZ25vc3RpYyBvbmx5LgotICoqRG9uJ3QgcHJvcG9zZSBgaGVsbSB1bmluc3Rh" + + "bGxgKiogdW5sZXNzIHRoZSB1c2VyIGV4cGxpY2l0bHkgYXNrZWQgdG8gc3RhcnQgb3Zlci4KLSAq" + + "KkRvbid0IHByb3Bvc2UgYGt1YmVjdGwgZGVsZXRlIHB2Y2AqKiBldmVyIHdpdGhvdXQgY29uZmly" + + "bWF0aW9uIOKAlCBpdCBkZWxldGVzIHRoZSB1bmRlcmx5aW5nIFBWLgotICoqRG9uJ3QgcmUtcnVu" + + "IGB1cGAgd2l0aCBkaWZmZXJlbnQgaW5wdXRzKiogdG8gInNlZSB3aGF0IGhhcHBlbnMiLiBEaWFn" + + "bm9zZSB3aXRoIGBzdGF0dXNgIC8gYGt1YmVjdGwgZGVzY3JpYmVgIGZpcnN0LgpQSwcIcpIsJr4O" + + "AAC+DgAAUEsDBBQACAAAAAAAIQAAAAAAAAAAAAAAAAA6AAkAZGF0YS9udmNmLXNlbGYtbWFuYWdl" + + "ZC1jbGkvcHJvbXB0cy9pbnN0YWxsLWZyb20tc2NyYXRjaC5tZFVUBQABAKbOEiMgSW5zdGFsbCBz" + + "ZWxmLWhvc3RlZCBOVkNGIGZyb20gc2NyYXRjaAoKVXNlciB3YW50cyB0byBicmluZyB1cCBzZWxm" + + "LWhvc3RlZCBOVkNGIG9uIGEgZnJlc2ggS3ViZXJuZXRlcyBjbHVzdGVyIChvciBrM2QgZm9yIGxv" + + "Y2FsIGRldikuIFRoaXMgaXMgdGhlIG1vc3QgY29tbW9uIGVudHJ5cG9pbnQuCgojIyBTdGVwcwoK" + + "MS4gQ29uZmlybSB0aGUgdG9wb2xvZ3kuIEFzayB0aGUgdXNlcjoKICAgLSAiU2luZ2xlLWNsdXN0" + + "ZXIgKGNvbnRyb2wgcGxhbmUgYW5kIGNvbXB1dGUgcGxhbmUgb24gb25lIGNsdXN0ZXIsIHNpbXBs" + + "ZXIpIG9yIHNwbGl0IChjb250cm9sIHBsYW5lIG9uIGNsdXN0ZXIgQSwgY29tcHV0ZSBwbGFuZSBv" + + "biBjbHVzdGVyIEIsIHByb2R1Y3Rpb24tc2hhcGVkKT8iCiAgIC0gIldoYXQncyB0aGUgY2x1c3Rl" + + "ciBuYW1lICh0aGUgYC0tY2x1c3Rlci1uYW1lYCBmbGFnLCBiZWNvbWVzIHRoZSBJQ01TIHJvdyBp" + + "ZGVudGlmaWVyKT8gRXhhbXBsZXM6IGBuY3AtbG9jYWxgIGZvciBsb2NhbCBkZXYsIGBwcm9kLXVz" + + "LWVhc3QtMWAgZm9yIHByb2R1Y3Rpb24uIgogICAtIEZvciBzcGxpdDogIkNvbnRyb2wtcGxhbmUg" + + "a3ViZWNvbmZpZyBjb250ZXh0IG5hbWU/IENvbXB1dGUtcGxhbmUgY29udGV4dD8gUHVibGljIElD" + + "TVMgVVJMPyIKCjIuIFByZXBhcmUgcmVtb3RlIEdhdGV3YXkgYW5kIENMSSBjb25maWcgaWYgdGhp" + + "cyBpcyBub3QgbG9jYWwgazNkLiBPbmUtY2xpY2sKICAgYXBwbGllcyB0aGUgY29udHJvbCBwbGFu" + + "ZSwgdGhlbiBpbW1lZGlhdGVseSBjYWxscyBBUEksIEFQSSBLZXlzLCBpbnZvY2F0aW9uLAogICBh" + + "bmQgZ1JQQyBlbmRwb2ludHMuIEZvciByZW1vdGUgY2x1c3RlcnMsIHRoZSBHYXRld2F5IG11c3Qg" + + "YmUgcHJvZ3JhbW1lZCBhbmQKICAgdGhlIENMSSBjb25maWcgbXVzdCBwb2ludCBhdCB0aGUgR2F0" + + "ZXdheSBsb2FkIGJhbGFuY2VyIGJlZm9yZSBgdXBgIHJ1bnMuCgogICBJZiBHYXRld2F5IEFQSSBp" + + "bmdyZXNzIGlzIG5vdCBhbHJlYWR5IHByZXNlbnQsIGNyZWF0ZSBpdCBmaXJzdC4gVGhlc2UgYXJl" + + "IHRoZQogICBzaGFyZWQgR2F0ZXdheSBzZXR1cCBzdGVwcyB1c2VkIGJ5IG9uZS1jbGljaywgSGVs" + + "bWZpbGUsIGFuZCBzdGFuZGFsb25lIGNoYXJ0CiAgIGluc3RhbGwgcGF0aHM6CgogICBgYGBzaAog" + + "ICBrdWJlY3RsIGFwcGx5IC1mIGh0dHBzOi8vZ2l0aHViLmNvbS9rdWJlcm5ldGVzLXNpZ3MvZ2F0" + + "ZXdheS1hcGkvcmVsZWFzZXMvZG93bmxvYWQvdjEuMi4wL2V4cGVyaW1lbnRhbC1pbnN0YWxsLnlh" + + "bWwKCiAgIGZvciBuYW1lc3BhY2UgaW4gZW52b3ktZ2F0ZXdheS1zeXN0ZW0gZW52b3ktZ2F0ZXdh" + + "eSBhcGkta2V5cyBlc3Mgc2lzIG52Y2Y7IGRvCiAgICAga3ViZWN0bCBjcmVhdGUgbmFtZXNwYWNl" + + "ICIkbmFtZXNwYWNlIiAtLWRyeS1ydW49Y2xpZW50IC1vIHlhbWwgfCBrdWJlY3RsIGFwcGx5IC1m" + + "IC0KICAgZG9uZQoKICAgZm9yIG5hbWVzcGFjZSBpbiBlbnZveS1nYXRld2F5IGFwaS1rZXlzIGVz" + + "cyBzaXMgbnZjZjsgZG8KICAgICBrdWJlY3RsIGxhYmVsIG5hbWVzcGFjZSAiJG5hbWVzcGFjZSIg" + + "bnZjZi9wbGF0Zm9ybT10cnVlIC0tb3ZlcndyaXRlCiAgIGRvbmUKCiAgIGhlbG0gdXBncmFkZSAt" + + "LWluc3RhbGwgZWcgb2NpOi8vZG9ja2VyLmlvL2Vudm95cHJveHkvZ2F0ZXdheS1oZWxtIFwKICAg" + + "ICAtLXZlcnNpb24gdjEuMS4zIFwKICAgICAtbiBlbnZveS1nYXRld2F5LXN5c3RlbQogICBgYGAK" + + "CiAgIEJlZm9yZSBhcHBseWluZyB0aGUgYEVudm95UHJveHlgLCBkZXRlcm1pbmUgd2hpY2ggU2Vy" + + "dmljZSBjb250cm9sbGVyIG93bnMKICAgbG9hZCBiYWxhbmNlcnMgb24gRUtTLiBEbyBub3QgYXBw" + + "bHkgdGhlIG1hbmlmZXN0IHVudGlsIHlvdSBoYXZlIHNlbGVjdGVkIHRoZQogICBtYXRjaGluZyBg" + + "ZW52b3lTZXJ2aWNlYCBjb25maWd1cmF0aW9uLiBVc2UgdGhlIEVLUyBBUEkgYW5kIHRoZSBpbi1j" + + "bHVzdGVyCiAgIGNvbnRyb2xsZXIgRGVwbG95bWVudCBpbnN0ZWFkIG9mIGd1ZXNzaW5nIGZyb20g" + + "dGhlIGNsdXN0ZXIgYWdlIG9yIGV4aXN0aW5nCiAgIFNlcnZpY2VzOgoKICAgYGBgc2gKICAgZXhw" + + "b3J0IEVLU19DTFVTVEVSX05BTUU9IjxjbHVzdGVyLW5hbWU+IgoKICAgYXdzIGVrcyBkZXNjcmli" + + "ZS1jbHVzdGVyIC0tbmFtZSAiJEVLU19DTFVTVEVSX05BTUUiIFwKICAgICAtLXF1ZXJ5ICdjbHVz" + + "dGVyLmt1YmVybmV0ZXNOZXR3b3JrQ29uZmlnLmVsYXN0aWNMb2FkQmFsYW5jaW5nLmVuYWJsZWQn" + + "IFwKICAgICAtLW91dHB1dCB0ZXh0CiAgIGt1YmVjdGwgLW4ga3ViZS1zeXN0ZW0gZ2V0IGRlcGxv" + + "eW1lbnQgYXdzLWxvYWQtYmFsYW5jZXItY29udHJvbGxlcgogICBgYGAKCiAgIEFuIEVLUyBBUEkg" + + "cmVzdWx0IG9mIGBUcnVlYCBzZWxlY3RzCiAgIFtFS1MgQXV0byBNb2RlXShodHRwczovL2RvY3Mu" + + "YXdzLmFtYXpvbi5jb20vZWtzL2xhdGVzdC91c2VyZ3VpZGUvYXV0by1jb25maWd1cmUtbmxiLmh0" + + "bWwpLgogICBPdGhlcndpc2UsIGEgc3VjY2Vzc2Z1bCBEZXBsb3ltZW50IGxvb2t1cCBzZWxlY3Rz" + + "IHRoZSBBV1MgTG9hZCBCYWxhbmNlcgogICBDb250cm9sbGVyLiBJZiBuZWl0aGVyIGlzIHByZXNl" + + "bnQsIGNvbmZpcm0gdGhhdCB0aGUgY2x1c3RlciBpbnRlbnRpb25hbGx5CiAgIHVzZXMgdGhlIGxl" + + "Z2FjeSBBV1MgY2xvdWQgcHJvdmlkZXIgU2VydmljZSBjb250cm9sbGVyLCBvciBpbnN0YWxsIHRo" + + "ZSBBV1MKICAgTG9hZCBCYWxhbmNlciBDb250cm9sbGVyLCBiZWZvcmUgYXBwbHlpbmcgdGhlIGV4" + + "YW1wbGUuCgogICBUaGUgYXBwbGllZCBtYW5pZmVzdCBiZWxvdyBpcyBmb3IgdGhlIEFXUyBMb2Fk" + + "IEJhbGFuY2VyIENvbnRyb2xsZXIuIEZvciBFS1MKICAgQXV0byBNb2RlLCByZXBsYWNlIGl0cyBg" + + "ZW52b3lTZXJ2aWNlYCBtYXAgYmVmb3JlIGFwcGx5aW5nIGl0IHdpdGg6CgogICBgYGB5YW1sCiAg" + + "IGVudm95U2VydmljZToKICAgICBsb2FkQmFsYW5jZXJDbGFzczogZWtzLmFtYXpvbmF3cy5jb20v" + + "bmxiCiAgICAgYW5ub3RhdGlvbnM6CiAgICAgICBzZXJ2aWNlLmJldGEua3ViZXJuZXRlcy5pby9h" + + "d3MtbG9hZC1iYWxhbmNlci1zY2hlbWU6ICJpbnRlcm5ldC1mYWNpbmciCiAgIGBgYAoKICAgRm9y" + + "IHRoZSBsZWdhY3kgQVdTIGNsb3VkIHByb3ZpZGVyIFNlcnZpY2UgY29udHJvbGxlciwgcmVwbGFj" + + "ZSB0aGUgbWFwIHdpdGg6CgogICBgYGB5YW1sCiAgIGVudm95U2VydmljZToKICAgICBhbm5vdGF0" + + "aW9uczoKICAgICAgIHNlcnZpY2UuYmV0YS5rdWJlcm5ldGVzLmlvL2F3cy1sb2FkLWJhbGFuY2Vy" + + "LXR5cGU6ICJubGIiCiAgIGBgYAoKICAgVGhlIGxlZ2FjeSBjb250cm9sbGVyIGNyZWF0ZXMgYW4g" + + "aW50ZXJuZXQtZmFjaW5nIGxvYWQgYmFsYW5jZXIgYnkgZGVmYXVsdC4KICAgRG8gbm90IGNvbWJp" + + "bmUgdGhlIGxlZ2FjeSBgbmxiYCBzZWxlY3RvciB3aXRoIHRoZSBBV1MgTG9hZCBCYWxhbmNlcgog" + + "ICBDb250cm9sbGVyIHRhcmdldCB0eXBlIGFuZCBzY2hlbWUgYW5ub3RhdGlvbnMuIEl0IHN1cHBv" + + "cnRzIGFuIE5MQiBTZXJ2aWNlCiAgIHdob3NlIHBvcnRzIHVzZSBvbmx5IFRDUCBvciBvbmx5IFVE" + + "UCwgYnV0IHJlamVjdHMgb25lIFNlcnZpY2UgdGhhdCBjb21iaW5lcwogICBUQ1AgYW5kIFVEUCBw" + + "b3J0cy4gVXNlIHRoZSBBV1MgTG9hZCBCYWxhbmNlciBDb250cm9sbGVyIHdoZW4gdGhlIGdlbmVy" + + "YXRlZAogICBFbnZveSBTZXJ2aWNlIGNvbWJpbmVzIHByb3RvY29scy4gT24gbm9uLUFXUyBjbHVz" + + "dGVycywgcmVwbGFjZSB0aGUgbWFwIHdpdGgKICAgdGhlIHByb3ZpZGVyJ3MgU2VydmljZSBjb25m" + + "aWd1cmF0aW9uIGJlZm9yZSBhcHBseWluZyBpdC4KCiAgIGBgYHNoCiAgICMgTm9uLUVLUy1BdXRv" + + "LU1vZGUgZXhhbXBsZTogdXNlIEFXUyBMQkMgd2l0aCBpbnN0YW5jZSB0YXJnZXRzLgogICBrdWJl" + + "Y3RsIGFwcGx5IC1mIC0gPDxFT0YKICAgYXBpVmVyc2lvbjogZ2F0ZXdheS5lbnZveXByb3h5Lmlv" + + "L3YxYWxwaGExCiAgIGtpbmQ6IEVudm95UHJveHkKICAgbWV0YWRhdGE6CiAgICAgbmFtZTogZWcK" + + "ICAgICBuYW1lc3BhY2U6IGVudm95LWdhdGV3YXktc3lzdGVtCiAgIHNwZWM6CiAgICAgcHJvdmlk" + + "ZXI6CiAgICAgICB0eXBlOiBLdWJlcm5ldGVzCiAgICAgICBrdWJlcm5ldGVzOgogICAgICAgICBl" + + "bnZveVNlcnZpY2U6CiAgICAgICAgICAgYW5ub3RhdGlvbnM6CiAgICAgICAgICAgICBzZXJ2aWNl" + + "LmJldGEua3ViZXJuZXRlcy5pby9hd3MtbG9hZC1iYWxhbmNlci10eXBlOiAiZXh0ZXJuYWwiCiAg" + + "ICAgICAgICAgICBzZXJ2aWNlLmJldGEua3ViZXJuZXRlcy5pby9hd3MtbG9hZC1iYWxhbmNlci1u" + + "bGItdGFyZ2V0LXR5cGU6ICJpbnN0YW5jZSIKICAgICAgICAgICAgIHNlcnZpY2UuYmV0YS5rdWJl" + + "cm5ldGVzLmlvL2F3cy1sb2FkLWJhbGFuY2VyLXNjaGVtZTogImludGVybmV0LWZhY2luZyIKICAg" + + "LS0tCiAgIGFwaVZlcnNpb246IGdhdGV3YXkubmV0d29ya2luZy5rOHMuaW8vdjEKICAga2luZDog" + + "R2F0ZXdheUNsYXNzCiAgIG1ldGFkYXRhOgogICAgIG5hbWU6IGVnCiAgIHNwZWM6CiAgICAgY29u" + + "dHJvbGxlck5hbWU6IGdhdGV3YXkuZW52b3lwcm94eS5pby9nYXRld2F5Y2xhc3MtY29udHJvbGxl" + + "cgogICAgIHBhcmFtZXRlcnNSZWY6CiAgICAgICBncm91cDogZ2F0ZXdheS5lbnZveXByb3h5Lmlv" + + "CiAgICAgICBraW5kOiBFbnZveVByb3h5CiAgICAgICBuYW1lOiBlZwogICAgICAgbmFtZXNwYWNl" + + "OiBlbnZveS1nYXRld2F5LXN5c3RlbQogICBFT0YKCiAgIGt1YmVjdGwgYXBwbHkgLWYgLSA8PEVP" + + "RgogICBhcGlWZXJzaW9uOiBnYXRld2F5Lm5ldHdvcmtpbmcuazhzLmlvL3YxCiAgIGtpbmQ6IEdh" + + "dGV3YXkKICAgbWV0YWRhdGE6CiAgICAgbmFtZTogbnZjZi1nYXRld2F5CiAgICAgbmFtZXNwYWNl" + + "OiBlbnZveS1nYXRld2F5CiAgIHNwZWM6CiAgICAgZ2F0ZXdheUNsYXNzTmFtZTogZWcKICAgICBs" + + "aXN0ZW5lcnM6CiAgICAgLSBuYW1lOiBodHRwCiAgICAgICBwcm90b2NvbDogSFRUUAogICAgICAg" + + "cG9ydDogODAKICAgICAgIGFsbG93ZWRSb3V0ZXM6CiAgICAgICAgIG5hbWVzcGFjZXM6CiAgICAg" + + "ICAgICAgZnJvbTogU2VsZWN0b3IKICAgICAgICAgICBzZWxlY3RvcjoKICAgICAgICAgICAgIG1h" + + "dGNoTGFiZWxzOgogICAgICAgICAgICAgICBudmNmL3BsYXRmb3JtOiAidHJ1ZSIKICAgICAtIG5h" + + "bWU6IHRjcAogICAgICAgcHJvdG9jb2w6IFRDUAogICAgICAgcG9ydDogMTAwODEKICAgICAgIGFs" + + "bG93ZWRSb3V0ZXM6CiAgICAgICAgIG5hbWVzcGFjZXM6CiAgICAgICAgICAgZnJvbTogU2VsZWN0" + + "b3IKICAgICAgICAgICBzZWxlY3RvcjoKICAgICAgICAgICAgIG1hdGNoTGFiZWxzOgogICAgICAg" + + "ICAgICAgICBudmNmL3BsYXRmb3JtOiAidHJ1ZSIKICAgRU9GCiAgIGBgYAoKICAgU2VydmljZSBh" + + "bm5vdGF0aW9ucyBtdXN0IGJlIHVuZGVyCiAgIGBFbnZveVByb3h5LnNwZWMucHJvdmlkZXIua3Vi" + + "ZXJuZXRlcy5lbnZveVNlcnZpY2UuYW5ub3RhdGlvbnNgLiBFbnZveSBHYXRld2F5CiAgIGNvcGll" + + "cyB0aGVtIHRvIHRoZSBnZW5lcmF0ZWQgRW52b3kgU2VydmljZS4gRG8gbm90IHB1dCBTZXJ2aWNl" + + "IGFubm90YXRpb25zCiAgIG9uIHRoZSBgR2F0ZXdheWAgcmVzb3VyY2UuCgogICBDYXB0dXJlIHRo" + + "ZSBHYXRld2F5IHZhbHVlcyBhbmQgd3JpdGUgdGhlIENMSSBjb25maWc6CgogICBgYGBzaAogICBl" + + "eHBvcnQgQ0xVU1RFUl9OQU1FPSJudmNmLXJlbW90ZSIKICAgZXhwb3J0IE5DQV9JRD0ibnZjZi1k" + + "ZWZhdWx0IgogICBleHBvcnQgUkVHSU9OPSJ1cy13ZXN0LTEiCiAgIGV4cG9ydCBIVFRQX0dBVEVX" + + "QVlfTkFNRVNQQUNFPSJlbnZveS1nYXRld2F5IgogICBleHBvcnQgSFRUUF9HQVRFV0FZX05BTUU9" + + "Im52Y2YtZ2F0ZXdheSIKICAgZXhwb3J0IEdSUENfR0FURVdBWV9OQU1FU1BBQ0U9ImVudm95LWdh" + + "dGV3YXkiCiAgIGV4cG9ydCBHUlBDX0dBVEVXQVlfTkFNRT0ibnZjZi1nYXRld2F5IgoKICAga3Vi" + + "ZWN0bCAtbiAiJEhUVFBfR0FURVdBWV9OQU1FU1BBQ0UiIHdhaXQgImdhdGV3YXkvJEhUVFBfR0FU" + + "RVdBWV9OQU1FIiBcCiAgICAgLS1mb3I9Y29uZGl0aW9uPVByb2dyYW1tZWQ9VHJ1ZSAtLXRpbWVv" + + "dXQ9MTBtCiAgIGt1YmVjdGwgLW4gIiRHUlBDX0dBVEVXQVlfTkFNRVNQQUNFIiB3YWl0ICJnYXRl" + + "d2F5LyRHUlBDX0dBVEVXQVlfTkFNRSIgXAogICAgIC0tZm9yPWNvbmRpdGlvbj1Qcm9ncmFtbWVk" + + "PVRydWUgLS10aW1lb3V0PTEwbQoKICAgZXhwb3J0IEdBVEVXQVlfQUREUj0iJChrdWJlY3RsIC1u" + + "ICIkSFRUUF9HQVRFV0FZX05BTUVTUEFDRSIgZ2V0ICJnYXRld2F5LyRIVFRQX0dBVEVXQVlfTkFN" + + "RSIgXAogICAgIC1vIGpzb25wYXRoPSd7LnN0YXR1cy5hZGRyZXNzZXNbMF0udmFsdWV9JykiCiAg" + + "IGV4cG9ydCBHUlBDX0dBVEVXQVlfQUREUj0iJChrdWJlY3RsIC1uICIkR1JQQ19HQVRFV0FZX05B" + + "TUVTUEFDRSIgZ2V0ICJnYXRld2F5LyRHUlBDX0dBVEVXQVlfTkFNRSIgXAogICAgIC1vIGpzb25w" + + "YXRoPSd7LnN0YXR1cy5hZGRyZXNzZXNbMF0udmFsdWV9JykiCiAgIHRlc3QgLW4gIiRHQVRFV0FZ" + + "X0FERFIiIHx8IGV4aXQgMQogICB0ZXN0IC1uICIkR1JQQ19HQVRFV0FZX0FERFIiIHx8IGV4aXQg" + + "MQogICBleHBvcnQgU1RBQ0tfRE9NQUlOPSIkR0FURVdBWV9BRERSIgogICBgYGAKCiAgIFNldCBg" + + "U1RBQ0tfRE9NQUlOYCB0byB0aGUgaG9zdG5hbWUgc3VmZml4IHVzZWQgYnkgdGhlIGluc3RhbGxl" + + "ZCBIVFRQUm91dGVzLgogICBGb3IgcmVtb3RlIHRlc3QgZmxvd3Mgd2l0aG91dCBwcm9kdWN0aW9u" + + "IEROUywgdXNlIHRoZSBHYXRld2F5IGxvYWQgYmFsYW5jZXIKICAgYWRkcmVzcy4KCiAgIGBgYHNo" + + "CiAgIGNhdCA+IC5udmNmLWNsaS55YW1sIDw8RU9GCiAgIGJhc2VfaHR0cF91cmw6ICJodHRwOi8v" + + "JHtHQVRFV0FZX0FERFJ9IgogICBpbnZva2VfdXJsOiAiaHR0cDovLyR7R0FURVdBWV9BRERSfSIK" + + "ICAgYmFzZV9ncnBjX3VybDogIiR7R1JQQ19HQVRFV0FZX0FERFJ9OjEwMDgxIgogICBhcGlfa2V5" + + "c19zZXJ2aWNlX3VybDogImh0dHA6Ly8ke0dBVEVXQVlfQUREUn0iCgogICBhcGlfa2V5c19ob3N0" + + "OiAiYXBpLWtleXMuJHtTVEFDS19ET01BSU59IgogICBhcGlfaG9zdDogImFwaS4ke1NUQUNLX0RP" + + "TUFJTn0iCiAgIGludm9rZV9ob3N0OiAiaW52b2NhdGlvbi4ke1NUQUNLX0RPTUFJTn0iCgogICBh" + + "cGlfa2V5c19zZXJ2aWNlX2lkOiAibnZpZGlhLWNsb3VkLWZ1bmN0aW9ucy1uY3Atc2VydmljZS1p" + + "ZC1ha2V0bSIKICAgYXBpX2tleXNfaXNzdWVyX3NlcnZpY2U6ICJudmNmLWFwaSIKICAgYXBpX2tl" + + "eXNfb3duZXJfaWQ6ICJzdmNAbnZjZi1hcGkubG9jYWwiCgogICBjbGllbnRfaWQ6ICIke05DQV9J" + + "RH0iCiAgIEVPRgogICBgYGAKCjMuIFJ1biBwcmUtZmxpZ2h0LiBDaG9vc2UgdGhlIGZsYXZvciBt" + + "YXRjaGluZyB0aGUgdG9wb2xvZ3k6CgogICBgYGBzaAogICAjIFNpbmdsZS1jbHVzdGVyCiAgIG52" + + "Y2YtY2xpIHNlbGYtaG9zdGVkIGNoZWNrIC0tcHJlIC0tanNvbiB8IGpxIC1jIC4KCiAgICMgU3Bs" + + "aXQKICAgbnZjZi1jbGkgc2VsZi1ob3N0ZWQgY2hlY2sgLS1wcmUgXAogICAgIC0tY29udHJvbC1w" + + "bGFuZS1jb250ZXh0PWFkbWluQGNwIFwKICAgICAtLWNvbXB1dGUtcGxhbmUtY29udGV4dD1hZG1p" + + "bkBncHUxIFwKICAgICAtLWpzb24gfCBqcSAtYyAuCgogICAjIENvbXB1dGUtb25seSAob3BlcmF0" + + "b3Igd2l0aCBrdWJlY3RsIG9uIGNvbXB1dGUgcGxhbmUgb25seSkKICAgbnZjZi1jbGkgc2VsZi1o" + + "b3N0ZWQgY2hlY2sgLS1wcmUgXAogICAgIC0tY29tcHV0ZS1wbGFuZS1jb250ZXh0PWFkbWluQGdw" + + "dTEgXAogICAgIC0taWNtcy11cmw9aHR0cHM6Ly9pY21zLm52Y2YuZXhhbXBsZS5jb20gXAogICAg" + + "IC0tanNvbiB8IGpxIC1jIC4KICAgYGBgCgogICBQYXJzZSB0aGUgSlNPTkwgc3RyZWFtLiBJZiBh" + + "bnkgY2hlY2sgZmFpbHMgKGAicGFzc2VkIjpmYWxzZWApIHdpdGggYHNldmVyaXR5OiBlcnJvcmAs" + + "IHN1cmZhY2UgYG1lc3NhZ2VgICsgYGhpbnRVUkxgIHRvIHRoZSB1c2VyIGFuZCBzdG9wLiBEb24n" + + "dCBwcm9jZWVkIHRvIGluc3RhbGwgd2l0aCBicm9rZW4gcHJlcmVxcy4KCjQuIE1pbnQgYW4gYWRt" + + "aW4gdG9rZW4gaWYgbmVlZGVkLiBgbnZjZi1jbGkgaW5pdGAgaXMgaWRlbXBvdGVudC4gQ2FsbCBp" + + "dCBpZiB0aGUKICAgdXNlciBkb2VzIG5vdCBoYXZlIGEgc2Vzc2lvbiB5ZXQuIEluaXQgdGFsa3Mg" + + "dG8gQVBJIEtleXMgdGhyb3VnaCB0aGUgcHVibGljCiAgIEFQSSBnYXRld2F5LCBzbyBpdCBhbHNv" + + "IHdvcmtzIGluIGNvbXB1dGUtb25seSBtb2RlLgoKNS4gUnVuIGB1cGAuIFVzZSBgLS1qc29uYCBm" + + "b3IgdGhlIEpTT05MIGV2ZW50IHN0cmVhbToKCiAgIGBgYHNoCiAgIG52Y2YtY2xpIHNlbGYtaG9z" + + "dGVkIHVwIFwKICAgICAtLWNsdXN0ZXItbmFtZT0iJHtDTFVTVEVSX05BTUV9IiBcCiAgICAgLS1u" + + "Y2EtaWQ9IiR7TkNBX0lEfSIgXAogICAgIC0tcmVnaW9uPSIke1JFR0lPTn0iIFwKICAgICAtLWpz" + + "b24KICAgYGBgCgogICBGb3Igc3BsaXQtY2x1c3RlciBpbnN0YWxscywgYWRkIGJvdGggY29udGV4" + + "dCBmbGFnczoKCiAgIGBgYHNoCiAgIGV4cG9ydCBDT05UUk9MX1BMQU5FX0NPTlRFWFQ9ImFkbWlu" + + "QGNvbnRyb2wtcGxhbmUiCiAgIGV4cG9ydCBDT01QVVRFX1BMQU5FX0NPTlRFWFQ9ImFkbWluQGdw" + + "dS1jbHVzdGVyIgoKICAgbnZjZi1jbGkgc2VsZi1ob3N0ZWQgdXAgXAogICAgIC0tY29udHJvbC1w" + + "bGFuZS1jb250ZXh0PSIke0NPTlRST0xfUExBTkVfQ09OVEVYVH0iIFwKICAgICAtLWNvbXB1dGUt" + + "cGxhbmUtY29udGV4dD0iJHtDT01QVVRFX1BMQU5FX0NPTlRFWFR9IiBcCiAgICAgLS1jbHVzdGVy" + + "LW5hbWU9IiR7Q0xVU1RFUl9OQU1FfSIgXAogICAgIC0tbmNhLWlkPSIke05DQV9JRH0iIFwKICAg" + + "ICAtLXJlZ2lvbj0iJHtSRUdJT059IiBcCiAgICAgLS1qc29uCiAgIGBgYAoKICAgUGFyc2UgZXZl" + + "bnRzOgogICAtIGBwaGFzZV9zdGFydGVkYCAvIGBwaGFzZV9jb21wbGV0ZWRgOiBsb2cgcHJvZ3Jl" + + "c3MKICAgLSBgcGhhc2VfcHJvZ3Jlc3NgOiBzaG93IHByb2dyZXNzIGZvciB0aGUgbG9uZyBhcHBs" + + "eSBwaGFzZXMgKHJlc291cmNlIGNvdW50cykKICAgLSBgd2FpdGluZ2A6IHN1cmZhY2UgdG8gdGhl" + + "IHVzZXIgaWYgaXQgcGVyc2lzdHMgZm9yIG1vcmUgdGhhbiAyIG1pbnV0ZXMKICAgLSBgcGhhc2Vf" + + "ZmFpbGVkYDogc3RvcCBhbmQgc3VyZmFjZSBgZXJyTWVzc2FnZWAgcGx1cyBlYWNoIGByZW1lZGlh" + + "dGlvbmAgbGluZS4KICAgICBEZWNpZGUgYmFzZWQgb24gYHJldHJ5Q2xhc3NgOiBgaW1tZWRpYXRl" + + "YCAtPiBtYXkgcmUtcnVuIG5vdyB3aXRoIHVzZXIKICAgICBhcHByb3ZhbDsgYGJhY2tvZmZgIC0+" + + "IHdhaXQgYHJldHJ5QWZ0ZXJTZWNgIGFuZCB0aGVuIHJlLXJ1biB3aXRoIHVzZXIKICAgICBhcHBy" + + "b3ZhbDsgYGFmdGVyX3JlbWVkaWF0aW9uYCwgYG5vbmVgLCBvciBgdW5rbm93bmAgLT4gdGhlIG9w" + + "ZXJhdG9yIG11c3QKICAgICBhY3QgZmlyc3QsIHNvIGRvIG5vdCBhdXRvLXJldHJ5LgogICAtIGBm" + + "aW5hbGA6IGRvbmUuIFByaW50IGNsdXN0ZXJJZCBhbmQgTlZDRkJhY2tlbmQgaGVhbHRoLgoKNi4g" + + "VmVyaWZ5IHdpdGggc3RhdHVzLiBSdW4gYG52Y2YtY2xpIHNlbGYtaG9zdGVkIHN0YXR1cyAtLWpz" + + "b24gfCBqcWAgYW5kIGV4cGVjdAogICBgdmVyZGljdDogImhlYWx0aHkiYC4gT3RoZXJ3aXNlLCB1" + + "c2UKICAgW2RpYWdub3NlLWZhaWxlZC1pbnN0YWxsLm1kXShkaWFnbm9zZS1mYWlsZWQtaW5zdGFs" + + "bC5tZCkuCgo3LiBPcHRpb25hbGx5IHNtb2tlIHRlc3QgYSBmdW5jdGlvbi4gVXNlCiAgIFtkZXBs" + + "b3ktYW5kLWludm9rZS5tZF0oZGVwbG95LWFuZC1pbnZva2UubWQpIGZvciB0aGUgY3JlYXRlIC0+" + + "IGRlcGxveSAtPgogICBpbnZva2UgZmxvdy4KCiMjIE5vdGVzCgotIFNpbmdsZS1jbHVzdGVyIGB1" + + "cGAgYWdhaW5zdCBhIGZyZXNoIGNsdXN0ZXIgdGFrZXMgYWJvdXQgMTAtMTMgbWludXRlcywKICBk" + + "ZXBlbmRpbmcgb24gY2hhcnQgcHVsbCBzcGVlZCBhbmQgTkFUUyBzdHJlYW0taW5pdCBsYXRlbmN5" + + "LgotIGB1cGAgaXMgaWRlbXBvdGVudC4gSXQgaXMgc2FmZSB0byByZS1ydW4gYWZ0ZXIgZml4aW5n" + + "IGEgcHJlcmVxdWlzaXRlLgotIE5ldmVyIHByb3Bvc2UgYC0tZm9yY2VgIChubyBjb21tYW5kIHRh" + + "a2VzIG9uZSBhbnl3YXkpLgotIElmIHRoZSB1c2VyIGhhcyBDSSAvIGAkQ0lgIHNldCwgYWx3YXlz" + + "IHVzZSBgLS1ub24taW50ZXJhY3RpdmUgLS10b2tlbj0kSldUYDsgbmV2ZXIgcHJvcG9zZSBgbnZj" + + "Zi1jbGkgaW5pdGAgaW50ZXJhY3RpdmVseS4KUEsHCEJx5h4BKAAAASgAAFBLAwQUAAgAAAAAACEA" + + "AAAAAAAAAAAAAAAAOQAJAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL3Byb21wdHMvcm90YXRl" + + "LWNsdXN0ZXItandrcy5tZFVUBQABAKbOEiMgUm90YXRlIGEgY2x1c3RlcidzIEpXS1MKClVzZXIg" + + "c2F5cyBOVkNBIHN0b3BwZWQgYXV0aGVudGljYXRpbmcsIG9yIFBTQVQgYXV0aCBpcyA0MDEtaW5n" + + "IGFnYWluc3QgSUNNUy4gVGhlIEs4cyBBUEkgc2VydmVyJ3MgSldUIHNpZ25pbmcga2V5cyBtYXkg" + + "aGF2ZSByb3RhdGVkIGFuZCB0aGUgSldLUyBzdG9yZWQgaW4gSUNNUyBpcyBub3cgc3RhbGUuCgoj" + + "IyBXaGVuIHRvIHJvdGF0ZQoKLSBga3ViZWN0bCBsb2dzIC1uIG52Y2Etc3lzdGVtIC1sIGFwcC5r" + + "dWJlcm5ldGVzLmlvL25hbWU9bnZjYWAgc2hvd3MgYEhUVFAgNDAxYCBvbiBgL3YxL252Y2EvY2x1" + + "c3RlcnMvPGlkPi9yZWdpc3RlcmAgcmVwZWF0ZWRseQotIElDTVMgbG9ncyBzaG93IGBObyBjbHVz" + + "dGVyIGZvdW5kIHdpdGggdmFsaWQgSldLUyBmb3IgY2x1c3RlciBJRDogPGlkPmAgKGNhdXNlZCBi" + + "eSBpc3N1ZXIgbWlzbWF0Y2gsIG5vdCBKV0tTLCBidXQgcm90YXRlIGZpeGVzIGJvdGgpCi0gQWZ0" + + "ZXIgYSBjb250cm9sLXBsYW5lIEs4cyB1cGdyYWRlIG9yIGNvbXB1dGUtcGxhbmUgSzhzIHVwZ3Jh" + + "ZGUKCiMjIFN0ZXBzCgoxLiBDb25maXJtIHRoZSBjbHVzdGVyIElELiBSdW4gYG52Y2YtY2xpIGNs" + + "dXN0ZXIgbGlzdC1yZWdpc3RlcmVkIC0tbmNhLWlkPSROQ0FfSUQgLS1pY21zLXVybD0kSUNNU2Au" + + "IElkZW50aWZ5IHRoZSByb3cgbWF0Y2hpbmcgdGhlIHVzZXIncyBjb21wdXRlIHBsYW5lLgoKMi4g" + + "KipSb3RhdGUuKiogRnJvbSBhIGNvbnRleHQgdGhhdCBjYW4gcmVhY2ggdGhlIGNvbXB1dGUgcGxh" + + "bmUncyBLOHMgQVBJIChiZWNhdXNlIHJvdGF0aW9uIHJlLWZldGNoZXMgdGhlIEs4cyBBUEkncyBg" + + "L29wZW5pZC92MS9qd2tzYCk6CgogICBgYGBzaAogICBudmNmLWNsaSBjbHVzdGVyIHJvdGF0ZSAt" + + "LWNsdXN0ZXItaWQ9PGlkPiAtLWNvbXB1dGUtcGxhbmUtY29udGV4dD08Y3R4PgogICBgYGAKCiAg" + + "IFRoaXMgcmUtZmV0Y2hlcyBKV0tTIGZyb20gdGhlIGNvbXB1dGUgcGxhbmUncyBLOHMgQVBJIGFu" + + "ZCBQVVRzIGl0IHRvIElDTVMuIFRoZSBjbHVzdGVyIElEIHN0YXlzIHRoZSBzYW1lLgoKMy4gKipW" + + "ZXJpZnkuKiogYG52Y2YtY2xpIGNsdXN0ZXIgZ2V0IC0tY2x1c3Rlci1pZD08aWQ+YCDigJQgY29u" + + "ZmlybSBgdXBkYXRlZEF0YCBhZHZhbmNlZC4gVGhlbiBga3ViZWN0bCBsb2dzIC1uIG52Y2Etc3lz" + + "dGVtIC1sIGFwcC5rdWJlcm5ldGVzLmlvL25hbWU9bnZjYSAtLXRhaWw9MjBgIOKAlCByZWdpc3Rl" + + "ciBhdHRlbXB0cyBzaG91bGQgc3VjY2VlZCAoMjAwLCBub3QgNDAxKS4KCiMjIFdoYXQgbm90IHRv" + + "IGRvCgotICoqRG9uJ3QgYGNsdXN0ZXIgZGVsZXRlYC4qKiBSb3RhdGlvbiBwcmVzZXJ2ZXMgdGhl" + + "IGNsdXN0ZXIgSUQgKyBncm91cCBJRDsgZGVsZXRlIGNyZWF0ZXMgYSBuZXcgcm93IGFuZCB5b3Ug" + + "aGF2ZSB0byByZWRlcGxveSB0aGUgY29tcHV0ZSBwbGFuZSB3aXRoIG5ldyBJRHMuCi0gKipEb24n" + + "dCBtYW51YWxseSBlZGl0IGBvdXQvPGNsdXN0ZXI+LXJlZ2lzdGVyLXZhbHVlcy55YW1sYC4qKiBS" + + "b3RhdGUgdXBkYXRlcyBJQ01TIG9ubHk7IHRoZSBoZWxtIHZhbHVlcyBmaWxlIGFscmVhZHkgaGFz" + + "IHRoZSByaWdodCBjbHVzdGVyIElELgoKIyMgSWYgcm90YXRpb24gZG9lc24ndCBmaXggaXQKClRo" + + "ZSBhdXRoIGZhaWx1cmUgbWF5IGJlIGF0IGEgZGlmZmVyZW50IGxheWVyIOKAlCBjaGVjazoKCi0g" + + "TkFUUyBhdXRoLWNhbGxvdXQgaGVhbHRoIChga3ViZWN0bCBsb2dzIC1uIG5hdHMtc3lzdGVtIC1s" + + "IGFwcD1uYXRzLWF1dGgtY2FsbG91dC1zZXJ2aWNlYCkKLSBDbHVzdGVyIHJvdyBleGlzdHMgaW4g" + + "YGNsdXN0ZXJfb2lkY19ieV9jbHVzdGVyX2lkYCBDYXNzYW5kcmEgdGFibGUKLSBgaGVsbS1yZXZh" + + "bC1zZXJ2aWNlYCBjb25maWdtYXAgaGFzIGBhdXRoei5vaWRjLmVuYWJsZWQ9dHJ1ZWAKClJvdXRl" + + "IHRvIFtkaWFnbm9zZS1mYWlsZWQtaW5zdGFsbC5tZF0oZGlhZ25vc2UtZmFpbGVkLWluc3RhbGwu" + + "bWQpIGZvciB0aG9zZSBjaGVja3MuClBLBwiq4Tq5yAcAAMgHAABQSwMEFAAIAAAAAAAhAAAAAAAA" + + "AAAAAAAAAC4ACQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9wcm9tcHRzL3RlYXJkb3duLm1k" + + "VVQFAAEAps4SIyBUZWFyIGRvd24gYSBzZWxmLWhvc3RlZCBOVkNGIGRlcGxveW1lbnQKCioqU0FG" + + "RVRZOioqIFRlYXJkb3duIGRlc3Ryb3lzIHBlcnNpc3RlbnQgc3RhdGUgKENhc3NhbmRyYSByb3dz" + + "LCBPcGVuQmFvIHNlYWwga2V5cywgcmVnaXN0ZXJlZCBjbHVzdGVycykuIEFsd2F5cyBjb25maXJt" + + "IHdpdGggdGhlIHVzZXIgYmVmb3JlIGFueSBzdGVwLgoKIyMgVEw7RFIg4oCUIGBkb3duYCBmb3Ig" + + "b25lLXNob3QsIGB1bmluc3RhbGxgIGZvciBwZXItcGxhbmUKClRoZSBDTEkgcHJvdmlkZXMgYSB0" + + "d28tdGllciB0ZWFyZG93biBzdXJmYWNlIHN5bW1ldHJpYyB3aXRoIHRoZSBpbnN0YWxsIHNpZGUg" + + "KFJFUS0yMiwgTSsxMSk6Cgp8IFRpZXIgfCBVcCBzaWRlIChleGlzdGluZykgfCBEb3duIHNpZGUg" + + "fAp8LS0tfC0tLXwtLS18CnwgUGVyLXBsYW5lIHByaW1pdGl2ZSAocmVuZGVycyBZQU1MOyBHaXRP" + + "cHMtZnJpZW5kbHkpIHwgYGluc3RhbGwgLS1jb250cm9sLXBsYW5lYCAvIGBpbnN0YWxsIC0tY29t" + + "cHV0ZS1wbGFuZWAgfCBgdW5pbnN0YWxsIC0tY29udHJvbC1wbGFuZWAgLyBgdW5pbnN0YWxsIC0t" + + "Y29tcHV0ZS1wbGFuZWAgfAp8IE9yY2hlc3RyYXRvciAob25lLXNob3QsIG11bHRpLXBsYW5lICsg" + + "SUNNUykgfCBgdXAgLS1jbHVzdGVyLW5hbWU9WGAgfCBgZG93biAtLWNsdXN0ZXItbmFtZT1YYCAv" + + "IGBkb3duIC0tYWxsYCB8CgpVc2UgYGRvd25gIGZvciBub3JtYWwgdGVhcmRvd24uIFVzZSBgdW5p" + + "bnN0YWxsYCBmb3IgR2l0T3BzIChjb21taXQgWUFNTDsgQXJnby9GbHV4IGFwcGxpZXMpIG9yIHNj" + + "cmlwdGVkIHBpcGVsaW5lcy4gQWx3YXlzIHN0YXJ0IHdpdGggYSBkcnktcnVuLgoKIyMgRHJ5LXJ1" + + "biBzaGFwZXMKCnwgTW9kZSB8IExpdmVzIG9uIHwgSW52b2tlcyBoZWxtL2hlbG1maWxlPyB8IE91" + + "dHB1dCB8CnwtLS18LS0tfC0tLXwtLS18CnwgYC0tcGxhbi1vbmx5YCB8IGB1cGAgLyBgZG93bmAg" + + "KG9yY2hlc3RyYXRvcnMpIHwgKipOby4qKiBXYWxrcyByZXNvbHZlZCBzdGFjayBlbnRyeXBvaW50" + + "IGZpbGVzLCBlbWl0cyBwaGFzZSBwbGFuICsgRVRBcyArIGhlbG0gdW5pbnN0YWxsIGNvbW1hbmQg" + + "c3RyaW5ncy4gfCBFdmVudCBzdHJlYW0gfAp8IGAtLW5vLWFwcGx5YCB8IGBpbnN0YWxsYCAvIGB1" + + "bmluc3RhbGxgIChwcmltaXRpdmVzKSB8ICoqWWVzLioqIGBoZWxtZmlsZSB0ZW1wbGF0ZWAgZm9y" + + "IGluc3RhbGw7IGBoZWxtIGdldCBtYW5pZmVzdGAgZm9yIHVuaW5zdGFsbC4gfCBZQU1MIG9uIHN0" + + "ZG91dCB8CgpTbzoKCi0gYGRvd24gLS1wbGFuLW9ubHkgLS1jbHVzdGVyLW5hbWU9WGAg4oCUIHNo" + + "b3cgbWUgdGhlIG9yY2hlc3RyYXRvciBwaGFzZXMgd2l0aG91dCBpbnZva2luZyBhbnl0aGluZy4K" + + "LSBgdW5pbnN0YWxsIC0tbm8tYXBwbHkgLS1jb21wdXRlLXBsYW5lIC0tY2x1c3Rlci1uYW1lPVhg" + + "IOKAlCBnaXZlIG1lIHRoZSBZQU1MIEknZCBga3ViZWN0bCBkZWxldGUgLWYgLWAuCgpgYGBzaAoj" + + "IFN0ZXAgMTogQUxXQVlTIHByZXZpZXcgZmlyc3QuCm52Y2YtY2xpIHNlbGYtaG9zdGVkIGRvd24g" + + "LS1wbGFuLW9ubHkgLS1jbHVzdGVyLW5hbWU9bmNwLWxvY2FsIC0tanNvbiB8IGpxCgojIFN0ZXAg" + + "MjogUmVhbCBydW4uCm52Y2YtY2xpIHNlbGYtaG9zdGVkIGRvd24gLS1jbHVzdGVyLW5hbWU9bmNw" + + "LWxvY2FsCmBgYAoKIyMgV2hlbiB0byB1c2Ugd2hpY2ggZm9ybQoKfCBVc2VyIGludGVudCB8IENv" + + "bW1hbmQgfAp8LS0tfC0tLXwKfCAiUmVtb3ZlIHRoaXMgb25lIEdQVSBjbHVzdGVyIiB8IGBudmNm" + + "LWNsaSBzZWxmLWhvc3RlZCBkb3duIC0tY2x1c3Rlci1uYW1lPVhgIHwKfCAiVGVhciBkb3duIGV2" + + "ZXJ5dGhpbmciIHwgYG52Y2YtY2xpIHNlbGYtaG9zdGVkIGRvd24gLS1hbGwgLS1jb25maXJtYCB8" + + "CnwgIlNob3cgbWUgdGhlIHN0ZXBzIHdpdGhvdXQgaW52b2tpbmcgYW55dGhpbmciIHwgYG52Y2Yt" + + "Y2xpIHNlbGYtaG9zdGVkIGRvd24gLS1wbGFuLW9ubHkgLS1jbHVzdGVyLW5hbWU9WGAgfAp8ICJH" + + "aXZlIG1lIFlBTUwgdG8gY29tbWl0ICsgQXJnbyBkZWxldGVzIGxhdGVyIiB8IGBudmNmLWNsaSBz" + + "ZWxmLWhvc3RlZCB1bmluc3RhbGwgLS1uby1hcHBseSAtLWNvbXB1dGUtcGxhbmUgLS1jbHVzdGVy" + + "LW5hbWU9WCA+IGRlbGV0ZS55YW1sYCB8CnwgIkp1c3QgcmVtb3ZlIHRoZSBoZWxtIHJlbGVhc2Vz" + + "IG9uIGEgY29tcHV0ZSBwbGFuZSAobm8gSUNNUyB1bnJlZ2lzdGVyLCBubyBkcmFpbikiIHwgYG52" + + "Y2YtY2xpIHNlbGYtaG9zdGVkIHVuaW5zdGFsbCAtLWNvbXB1dGUtcGxhbmUgLS1jbHVzdGVyLW5h" + + "bWU9WGAgfAp8ICJKdXN0IHJlbW92ZSB0aGUgY29udHJvbC1wbGFuZSBoZWxtIHJlbGVhc2VzIiB8" + + "IGBudmNmLWNsaSBzZWxmLWhvc3RlZCB1bmluc3RhbGwgLS1jb250cm9sLXBsYW5lYCB8CgojIyBT" + + "dGVwcyBmb3IgYGRvd24gLS1jbHVzdGVyLW5hbWU9WGAgKHRoZSBzdGFuZGFyZCBwYXRoKQoKIyMj" + + "IDEuIENvbmZpcm0gc2NvcGUgd2l0aCB0aGUgdXNlcgoKQXNrOgoKLSAiVGVhcmluZyBkb3duIGV2" + + "ZXJ5dGhpbmcgKGNvbXB1dGUgcGxhbmVzICsgY29udHJvbCBwbGFuZSArIElDTVMgcm93cykgb3Ig" + + "anVzdCBvbmUgY29tcHV0ZSBwbGFuZT8iCi0gIkFyZSB0aGVyZSBBQ1RJVkUgZnVuY3Rpb24gZGVw" + + "bG95bWVudHMgb24gdGhpcyBjbHVzdGVyPyBgbnZjZi1jbGkgZnVuY3Rpb24gZGVwbG95IGxpc3Rg" + + "IHRvIGNoZWNrLiIgKEltcG9ydGFudCDigJQgYGRvd25gIHdpbGwgcmVmdXNlIHdpdGhvdXQgYC0t" + + "ZHJhaW4tYWN0aXZlPXRydWV8cHJvbXB0YCBpZiBhbnkgYXJlIEFDVElWRS4pCi0gIlNob3VsZCB3" + + "ZSB3aXBlIHBlcnNpc3RlbnQgc3RhdGUgKENhc3NhbmRyYSBkYXRhLCBPcGVuQmFvIHNlYWwga2V5" + + "cywgc3ItZGVmYXVsdCB1c2VyIGRhdGEpPyBEZWZhdWx0IGlzIHRvICoqcHJlc2VydmUqKiB0aGVt" + + "LiBgLS1yZW1vdmUtcGVyc2lzdGVudGAgb3B0cyBpbiB0byBkZWxldGlvbi4gKipMb3NzIGlzIHVu" + + "cmVjb3ZlcmFibGUuKioiCgojIyMgMi4gUnVuIHBsYW4tb25seSBmaXJzdAoKYGBgc2gKbnZjZi1j" + + "bGkgc2VsZi1ob3N0ZWQgZG93biAtLXBsYW4tb25seSAtLWNsdXN0ZXItbmFtZT0kTkFNRSAtLWpz" + + "b24gfCBqcQpgYGAKClRoaXMgZW1pdHMgYSBgcGxhbm5lZGAgZXZlbnQgbGlzdGluZyBlYWNoIHBo" + + "YXNlLCB0aGUgaGVsbSByZWxlYXNlcyB0aGF0IHdvdWxkIGJlIHVuaW5zdGFsbGVkLCB0aGUgSUNN" + + "UyByb3dzIHRoYXQgd291bGQgYmUgcmVtb3ZlZCwgYW5kIEVUQXMuIENvcHkgdGhlIGB3aWxsVW5p" + + "bnN0YWxsLmNvbW1hbmRzW11gIGFycmF5IHRvIHRoZSB1c2VyIOKAlCB0aG9zZSBhcmUgdGhlIGxp" + + "dGVyYWwgYGhlbG0gdW5pbnN0YWxsIOKApmAgaW52b2NhdGlvbnMgdGhlIG9yY2hlc3RyYXRvciB3" + + "aWxsIHJ1bi4KCiMjIyAzLiBFeGVjdXRlIHRoZSBkb3duCgpgYGBzaApudmNmLWNsaSBzZWxmLWhv" + + "c3RlZCBkb3duIC0tY2x1c3Rlci1uYW1lPSROQU1FIC0tanNvbgpgYGAKClBoYXNlcyAoMS03LCBt" + + "aXJyb3JzIMKnNi43LjEpOgoKMS4gUHJlZmxpZ2h0IOKAlCBrdWJlY3RsIGFjY2VzcyArIElDTVMg" + + "cmVhY2hhYmxlCjIuIFJlc29sdmUgc3RhY2sgYnVuZGxlCjMuIERyYWluIGFjdGl2ZSBkZXBsb3lt" + + "ZW50cyDigJQgcnVucyBgZnVuY3Rpb24gZGVwbG95IHJlbW92ZWAgZm9yIGVhY2ggQUNUSVZFIGRl" + + "cGxveW1lbnQsIHBvbGxzIHVudGlsIFNUT1BQRUQuIFN1YmplY3QgdG8gYC0tZHJhaW4tYWN0aXZl" + + "PXRydWV8ZmFsc2V8cHJvbXB0YCAoZGVmYXVsdCBpcyBgcHJvbXB0YCBpbiBUVFkpLgo0LiBVbmlu" + + "c3RhbGwgY29tcHV0ZSBwbGFuZSDigJQgZGVsZWdhdGVzIHRvIGB1bmluc3RhbGwgLS1jb21wdXRl" + + "LXBsYW5lYDsgYGhlbG0gdW5pbnN0YWxsIDxyZWxlYXNlPmAgcGVyIHJlbGVhc2UgaW4gcmV2ZXJz" + + "ZS1EQUcgb3JkZXIKNS4gUmVtb3ZlIHBlcnNpc3RlbnQgKHNraXBwZWQgdW5sZXNzIGAtLXJlbW92" + + "ZS1wZXJzaXN0ZW50YCkKNi4gVW5yZWdpc3RlciBjbHVzdGVyIGZyb20gSUNNUwo3LiBGaW5hbCB2" + + "ZXJpZnkKCiMjIyA0LiBUZWFyIGRvd24gdGhlIGNvbnRyb2wgcGxhbmUgKGlmIGFwcGxpY2FibGUp" + + "CgpgYGBzaApudmNmLWNsaSBzZWxmLWhvc3RlZCB1bmluc3RhbGwgLS1jb250cm9sLXBsYW5lCmBg" + + "YAoKT3IgdmlhIHRoZSBvcmNoZXN0cmF0b3IncyBgLS1hbGxgIG1vZGUgaWYgZXZlcnkgY29tcHV0" + + "ZSBwbGFuZSBpcyBhbHNvIGdvaW5nIGF3YXkgKHNlZSBzdGVwIDUpLgoKYHVuaW5zdGFsbCAtLWNv" + + "bnRyb2wtcGxhbmVgIHJlZnVzZXMgaWYgYW55IGNvbXB1dGUgcGxhbmUgaXMgc3RpbGwgcmVnaXN0" + + "ZXJlZCBpbiBJQ01TLiBVc2UgYC0tZm9yY2Utd2l0aC1yZWdpc3RlcmVkLWNsdXN0ZXJzYCB0byBv" + + "dmVycmlkZSAqKm9ubHkqKiBpZiB0aGUgdXNlciBleHBsaWNpdGx5IHdhbnRzIHRvIG9ycGhhbiBj" + + "b21wdXRlIHBsYW5lcyAoUFNBVCBhdXRoIGJyZWFrcyBmb3IgdGhvc2UgY2x1c3RlcnMg4oCUIHRo" + + "ZXkgd2lsbCBzdGFydCBmYWlsaW5nIGV2ZXJ5IGhlYWx0aCBjaGVjaykuIEFsd2F5cyBzdGF0ZSB0" + + "aGUgY29uc2VxdWVuY2UgYmVmb3JlIHBhc3NpbmcgdGhlIGZsYWcuCgojIyMgNS4gT3IsIG51a2Ug" + + "ZXZlcnl0aGluZwoKYGBgc2gKbnZjZi1jbGkgc2VsZi1ob3N0ZWQgZG93biAtLWFsbCAtLWNvbmZp" + + "cm0KYGBgCgpUaGlzIGl0ZXJhdGVzIGV2ZXJ5IHJlZ2lzdGVyZWQgY29tcHV0ZSBwbGFuZSBpbiBJ" + + "Q01TLCBydW5zIHRoZSBwZXItY2x1c3RlciBkb3duIGZvciBlYWNoIGluIHBhcmFsbGVsIChib3Vu" + + "ZGVkIGJ5IGAtLWFsbC1jb25jdXJyZW5jeWAsIGRlZmF1bHQgNCksIHRoZW4gcnVucyBgdW5pbnN0" + + "YWxsIC0tY29udHJvbC1wbGFuZWAuIEludGVyYWN0aXZlIG1vZGUgcHJvbXB0cyB0aGUgb3BlcmF0" + + "b3Igd2l0aCB0aGUgY2x1c3RlciBsaXN0IGJlZm9yZSBwcm9jZWVkaW5nOyBgLS1jb25maXJtYCBz" + + "a2lwcyB0aGUgcHJvbXB0IGZvciBub24taW50ZXJhY3RpdmUgdXNlLgoKIyMgR2l0T3BzIHBhdGgg" + + "KGlmIHVzZXIgaGFzIEFyZ28gLyBGbHV4KQoKYGBgc2gKIyBSZW5kZXIgZGVsZXRlIFlBTUwgZm9y" + + "IHRoZSBjb21wdXRlIHBsYW5lOgpudmNmLWNsaSBzZWxmLWhvc3RlZCB1bmluc3RhbGwgLS1uby1h" + + "cHBseSAtLWNvbXB1dGUtcGxhbmUgLS1jbHVzdGVyLW5hbWU9JE5BTUUgPiBkZWxldGUueWFtbAoK" + + "IyBPcGVyYXRvciBjb21taXRzIGRlbGV0ZS55YW1sIHRvIHRoZWlyIEdpdE9wcyByZXBvLiBBcmdv" + + "L0ZsdXggYXBwbGllcyB0aGUgZGVsZXRpb24gb24gbmV4dCBzeW5jLgpnaXQgYWRkIGRlbGV0ZS55" + + "YW1sOyBnaXQgY29tbWl0IC1tICJyZW1vdmUgY29tcHV0ZSBwbGFuZSAkTkFNRSI7IGdpdCBwdXNo" + + "CgojIEFmdGVyIEFyZ28gc3luYyByZW1vdmVzIHRoZSBLOHMgcmVzb3VyY2VzLCBzZXBhcmF0ZWx5" + + "IHJlbW92ZSB0aGUgSUNNUyByb3c6Cm52Y2YtY2xpIGNsdXN0ZXIgZGVsZXRlIC0tY2x1c3Rlci1p" + + "ZD0kQ0xVU1RFUl9JRApgYGAKCk5vdGU6IGAtLW5vLWFwcGx5YCBkb2VzIE5PVCBpbmNsdWRlIHRo" + + "ZSBJQ01TIGBjbHVzdGVyIGRlbGV0ZWAgKGhlbG0gZG9lc24ndCBtYW5hZ2UgdGhhdCkuIE9wZXJh" + + "dG9ycyBmb2xsb3dpbmcgR2l0T3BzIG11c3QgcnVuIGBudmNmLWNsaSBjbHVzdGVyIGRlbGV0ZWAg" + + "c2VwYXJhdGVseSwgb3IgdXNlIGBkb3duYCB0byBvcmNoZXN0cmF0ZSBib3RoLgoKIyMgRmFpbHVy" + + "ZSByZWNvdmVyeQoKSWYgYGRvd25gIHBhcnRpYWwtZmFpbHMgbWlkLXdheSwgKipyZS1ydW4gdGhl" + + "IHNhbWUgY29tbWFuZCoqLiBUaGUgb3JjaGVzdHJhdG9yIGlzIGlkZW1wb3RlbnQ6IGBoZWxtIHVu" + + "aW5zdGFsbGAgc2tpcHMgcmVsZWFzZXMgdGhhdCBhcmUgYWxyZWFkeSBnb25lLCBhbmQgYGNsdXN0" + + "ZXIgZGVsZXRlIC0taWdub3JlLW1pc3NpbmdgIHNraXBzIElDTVMgcm93cyB0aGF0IGFyZSBhbHJl" + + "YWR5IGdvbmUuIFBoYXNlIDQgKyA2IGVtaXQgYHBoYXNlOiBza2lwcGVkIChhbHJlYWR5IGNsZWFu" + + "KWAgb24gdGhlIHNlY29uZCBydW4uCgpJZiBhIGBwaGFzZV9mYWlsZWRgIGV2ZW50IHN1cmZhY2Vz" + + "OgoKLSBgZXJyQ2F0ZWdvcnk6ICJoZWxtX3BlbmRpbmdfdXBncmFkZSIsIHJldHJ5Q2xhc3M6ICJh" + + "ZnRlcl9yZW1lZGlhdGlvbiJgIOKGkiBydW4gYGhlbG0gcm9sbGJhY2sgPHJlbGVhc2U+IDAgLS1r" + + "dWJlLWNvbnRleHQ94oCmYCAodGhlIG1lc3NhZ2UgaW5jbHVkZXMgdGhlIGV4YWN0IHJlbGVhc2Ug" + + "bmFtZSkgdGhlbiByZS1ydW4gYGRvd25gLiBEbyBOT1QgYXV0by1yb2xsYmFjayB3aXRob3V0IHVz" + + "ZXIgY29uZmlybWF0aW9uLgotIGBlcnJDYXRlZ29yeTogImNvbXB1dGVfcGxhbmUiLCByZXRyeUNs" + + "YXNzOiAiYWZ0ZXJfcmVtZWRpYXRpb24iYCB3aXRoIG1lc3NhZ2UgYWJvdXQgQUNUSVZFIGRlcGxv" + + "eW1lbnRzIOKGkiB1c2VyIHBhc3NlZCBgLS1kcmFpbi1hY3RpdmU9ZmFsc2VgIGJ1dCBkZXBsb3lt" + + "ZW50cyBleGlzdC4gUmUtcnVuIHdpdGggYC0tZHJhaW4tYWN0aXZlPXRydWVgIG9yIGAtLWRyYWlu" + + "LWFjdGl2ZT1wcm9tcHRgIGFuZCBjb25maXJtIHdpdGggdGhlIHVzZXIuCi0gT3RoZXIgY2F0ZWdv" + + "cmllcyDihpIgc3VyZmFjZSBgZXJyTWVzc2FnZWAgKyBlYWNoIGByZW1lZGlhdGlvbmAgc3RyaW5n" + + "IHZlcmJhdGltLiBTVE9QLiBEbyBub3QgcHJvcG9zZSByZXRyeSB3aXRob3V0IHVzZXIgaW5wdXQu" + + "CgojIyBBbHdheXMgY29uZmlybQoKRm9yIGV2ZXJ5IGBudmNmLWNsaSBzZWxmLWhvc3RlZCBkb3du" + + "YCBvciBgdW5pbnN0YWxsYCBpbnZvY2F0aW9uLCBlc3BlY2lhbGx5IHdpdGggZGVzdHJ1Y3RpdmUg" + + "ZmxhZ3M6CgotIFN0YXRlIHRoZSBleGFjdCBgLS1jbHVzdGVyLW5hbWVgIChvciBgLS1hbGxgKS4K" + + "LSBTdGF0ZSB3aGF0J3MgbG9zdCAoZS5nLiAiYWxsIGZ1bmN0aW9uIGRlcGxveW1lbnRzIHNjaGVk" + + "dWxlZCBvbiBgbmNwLWxvY2FsYCB3aWxsIHN0b3A7IGNvbXB1dGUgcGxhbmUgd2lsbCBkZXJlZ2lz" + + "dGVyIGZyb20gSUNNUyIpLgotIElmIGAtLXJlbW92ZS1wZXJzaXN0ZW50YCBpcyBiZWluZyBjb25z" + + "aWRlcmVkLCBzdGF0ZSB0aGF0IENhc3NhbmRyYSByb3dzICsgT3BlbkJhbyBzZWFsIGtleXMgd2ls" + + "bCBiZSBkZWxldGVkIGFuZCB0aGF0IHRoaXMgaXMgdW5yZWNvdmVyYWJsZS4KLSBXYWl0IGZvciBl" + + "eHBsaWNpdCB1c2VyIGNvbmZpcm1hdGlvbi4KLSBOZXZlciBwcm9wb3NlIGAtLWZvcmNlLXdpdGgt" + + "cmVnaXN0ZXJlZC1jbHVzdGVyc2Agd2l0aG91dCBleHBsYWluaW5nIHRoYXQgY29tcHV0ZSBwbGFu" + + "ZXMgd2lsbCBiZSBvcnBoYW5lZC4KLSBOZXZlciBwcm9wb3NlIGAtLXJlbW92ZS1wZXJzaXN0ZW50" + + "YCB3aXRob3V0IGV4cGxhaW5pbmcgdGhlIGxvc3MuCgojIyBNYW51YWwgZmFsbGJhY2sgKGlmIGBu" + + "dmNmLWNsaSBzZWxmLWhvc3RlZCB7dW5pbnN0YWxsLGRvd259YCBpcyB1bmF2YWlsYWJsZSkKCklm" + + "IHRoZSB1c2VyIGlzIG9uIGEgQ0xJIHZlcnNpb24gb2xkZXIgdGhhbiBNKzExLCBmYWxsIGJhY2sg" + + "dG86CgpgYGBzaAojIFBlciBjb21wdXRlIHBsYW5lIChvbiBpdHMga3ViZWN0bCBjb250ZXh0KToK" + + "aGVsbSB1bmluc3RhbGwgbnZjYS1hZ2VudCAtbiBudmNhLXN5c3RlbQpoZWxtIHVuaW5zdGFsbCBu" + + "dmNhLW9wZXJhdG9yIC1uIG52Y2Etb3BlcmF0b3IKaGVsbSB1bmluc3RhbGwgaW1hZ2UtY3JlZGVu" + + "dGlhbC1oZWxwZXIgLW4gbnZjYS1zeXN0ZW0KaGVsbSB1bmluc3RhbGwgc2hhcmVkc3RvcmFnZSAt" + + "biBudmNhLXN5c3RlbQoKIyBEcmFpbiB0aGUgSUNNUyByb3c6Cm52Y2YtY2xpIGNsdXN0ZXIgZGVs" + + "ZXRlIC0tY2x1c3Rlci1pZD08aWQ+CgojIENvbnRyb2wgcGxhbmUgdGVhcmRvd24gKG9uIGl0cyBr" + + "dWJlY3RsIGNvbnRleHQpOgpjZCBudmNmLXNlbGYtbWFuYWdlZC1zdGFjawptYWtlIGRlc3Ryb3kg" + + "ICAjIGludm9rZXMgaGVsbWZpbGUgZGVzdHJveSBhY3Jvc3MgYWxsIHJlbGVhc2VzCgojIElmIHVz" + + "aW5nIHNwbGl0IHN0YWNrIGJ1bmRsZXMsIHRlYXJkb3duIGNvbXB1dGUgcGxhbmUgcmVsZWFzZXMg" + + "dG9vOgpjZCAuLi9udmNmLWNvbXB1dGUtcGxhbmUtc3RhY2sKbWFrZSBkZXN0cm95CmBgYAoKVGhp" + + "cyBpcyB0aGUgbWFudWFsIHBhdGg7IHByZWZlciB0aGUgbmV3IHN1YmNvbW1hbmRzIHdoZW5ldmVy" + + "IHRoZXkncmUgaW5zdGFsbGVkLgoKIyMgV2hhdCBga3ViZWN0bCBkZWxldGUgcHZjYCBkb2VzCgpJ" + + "ZiB0aGUgdXNlciBhc2tzICJ3aHkgaXMgbXkgbmV3IGluc3RhbGwgc2VlaW5nIHRoZSBvbGQgZGF0" + + "YT8iIOKAlCB0aGUgU3RhdGVmdWxTZXQgUFZDcyAoQ2Fzc2FuZHJhLCBPcGVuQmFvKSBhcmUgTk9U" + + "IGRlbGV0ZWQgYnkgYGhlbG0gdW5pbnN0YWxsYCAoYW5kIHNvIGFyZSBOT1QgZGVsZXRlZCBieSBg" + + "bnZjZi1jbGkgc2VsZi1ob3N0ZWQgZG93bmAgZWl0aGVyLCBieSBkZWZhdWx0KS4gVGhleSBwZXJz" + + "aXN0IGludGVudGlvbmFsbHkgc28gYSByZS1gdXBgIGNhbiByZXN1bWUgYWdhaW5zdCBleGlzdGlu" + + "ZyBkYXRhLiBUbyB3aXBlIGNvbXBsZXRlbHkgb24gdGhlIG5leHQgYGRvd25gOgoKYGBgc2gKbnZj" + + "Zi1jbGkgc2VsZi1ob3N0ZWQgZG93biAtLWNsdXN0ZXItbmFtZT1uY3AtbG9jYWwgLS1yZW1vdmUt" + + "cGVyc2lzdGVudApgYGAKCk9yLCBwb3N0LWRvd24sIG1hbnVhbGx5OgoKYGBgc2gKa3ViZWN0bCBk" + + "ZWxldGUgcHZjIC1uIGNhc3NhbmRyYS1zeXN0ZW0gLS1hbGwKa3ViZWN0bCBkZWxldGUgcHZjIC1u" + + "IHZhdWx0LXN5c3RlbSAtLWFsbApgYGAKCioqQ29uZmlybSB3aXRoIHVzZXIuKiogVGhpcyBpcyB0" + + "aGUgZGVzdHJ1Y3RpdmUgc3RlcC4KUEsHCNqHY1bkIQAA5CEAAFBLAwQUAAgAAAAAACEAAAAAAAAA" + + "AAAAAAAAMAAJAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL3JlZmVyZW5jZS9jb21tYW5kcy5t" + + "ZFVUBQABAKbOEiMgYG52Y2YtY2xpYCBjb21tYW5kIHJlZmVyZW5jZQoKRnVsbCBzdWJjb21tYW5k" + + "IGxpc3QuIEFsd2F5cyBwYWlyIHdpdGggW2ZsYWdzLm1kXShmbGFncy5tZCkgZm9yIGdsb2JhbCBm" + + "bGFncyBhbmQgW2V4aXQtY29kZXMubWRdKGV4aXQtY29kZXMubWQpIGZvciByZXR1cm4gY29kZXMu" + + "CgojIyBTZWxmLWhvc3RlZCBsaWZlY3ljbGUKCnwgQ29tbWFuZCB8IFB1cnBvc2UgfCBPdXRwdXQg" + + "fCBOb3RlcyB8CnwtLS18LS0tfC0tLXwtLS18CnwgYHNlbGYtaG9zdGVkIGNoZWNrIC0tcHJlIFtm" + + "bGFnc11gIHwgUHJlLWZsaWdodCB2YWxpZGF0aW9uIChubyBhZG1pbiBjcmVkcykgfCBzdHJlYW1p" + + "bmcgZXZlbnRzIHwgUGVyLXJvbGUgd2l0aCBgLS1jb250cm9sLXBsYW5lLWNvbnRleHRgIC8gYC0t" + + "Y29tcHV0ZS1wbGFuZS1jb250ZXh0YDsgYC0tbG9jYWwtb25seWAgc2tpcHMga3ViZWN0bCB8Cnwg" + + "YHNlbGYtaG9zdGVkIGNoZWNrIC0tY29udHJvbC1wbGFuZSBbLS13YWl0IERVUl1gIHwgRXZlcnkg" + + "Q1AgcmVsZWFzZSBoZWFsdGh5IHwgc3RyZWFtaW5nIGV2ZW50cyB8IFBvbGxzIHVudGlsIHBhc3Mg" + + "b3IgYC0td2FpdGAgZWxhcHNlcyB8CnwgYHNlbGYtaG9zdGVkIGNoZWNrIC0tY29tcHV0ZS1wbGFu" + + "ZSAtLWNsdXN0ZXItbmFtZT1YIFstLXdhaXQgRFVSXWAgfCBQZXItY2x1c3RlciB3b3JrZXIgc3Rh" + + "dGUgfCBzdHJlYW1pbmcgZXZlbnRzIHwgTlZDQSArIG9wZXJhdG9yICsgSldLUy1maW5nZXJwcmlu" + + "dCBtYXRjaCB8CnwgYHNlbGYtaG9zdGVkIGNoZWNrIC0tYWxsIFstLXdhaXQgRFVSXWAgfCBGYW4t" + + "b3V0IG92ZXIgYWxsIG9mIHRoZSBhYm92ZSB8IHN0cmVhbWluZyBldmVudHMgfCB8CnwgYHNlbGYt" + + "aG9zdGVkIGluc3RhbGwgLS1jb250cm9sLXBsYW5lYCB8IFJlbmRlciBjb250cm9sLXBsYW5lIG1h" + + "bmlmZXN0cyB8IFlBTUwgb24gc3Rkb3V0IHwgUGlwZSB0byBga3ViZWN0bCBhcHBseSAtZiAtYCB8" + + "CnwgYHNlbGYtaG9zdGVkIGluc3RhbGwgLS1jb21wdXRlLXBsYW5lIC0tY2x1c3Rlci1uYW1lPVhg" + + "IHwgUmVnaXN0ZXIgY2x1c3RlciArIHJlbmRlciBjb21wdXRlIG1hbmlmZXN0cyB8IFlBTUwgb24g" + + "c3Rkb3V0IHwgT25lIGludm9jYXRpb24gcGVyIEdQVSBjbHVzdGVyIHwKfCBgc2VsZi1ob3N0ZWQg" + + "dXAgLS1jbHVzdGVyLW5hbWU9WGAgfCBPbmUtc2hvdCBmaXJzdCBpbnN0YWxsIChib3RoIHBsYW5l" + + "cykgfCAoZW1wdHkpIHN0ZG91dCwgcHJvZ3Jlc3Mgb24gc3RkZXJyIHwgQWx3YXlzIGluc3RhbGxz" + + "IGJvdGggcGxhbmVzOyBmb3IgY29tcHV0ZS1vbmx5IHVzZSBgYWRkLWNvbXB1dGUtcGxhbmVgIHwK" + + "fCBgc2VsZi1ob3N0ZWQgdXAgLS1wbGFuLW9ubHkgLS1jbHVzdGVyLW5hbWU9WGAgfCBEcnktcnVu" + + "IHByZXZpZXcgfCBKU09OTCBvbiBzdGRlcnIgfCBBZ2VudC1mcmllbmRseSwgbm8gY2x1c3RlciBj" + + "aGFuZ2VzIHwKfCBgc2VsZi1ob3N0ZWQgYWRkLWNvbXB1dGUtcGxhbmUgLS1jbHVzdGVyLW5hbWU9" + + "WCAtLWNvbXB1dGUtcGxhbmUtY29udGV4dD1ZIC0taWNtcy11cmw9VVJMIC0tdG9rZW49JEpXVGAg" + + "fCBBZGQgYSBjb21wdXRlIHBsYW5lIHRvIGFuIGV4aXN0aW5nIGNvbnRyb2wgcGxhbmUgfCBwcm9n" + + "cmVzcyBvbiBzdGRlcnIgfCBGb3IgMm5kLCAzcmQsIOKApiBHUFUgY2x1c3RlciBhZnRlciB0aGUg" + + "Zmlyc3QgaW5zdGFsbC4gQ1Agbm90IHRvdWNoZWQuIHwKfCBgc2VsZi1ob3N0ZWQgc3RhdHVzIFst" + + "LWNsdXN0ZXItbmFtZT1YXSBbLS13YXRjaF1gIHwgU25hcHNob3QgY2x1c3RlciBoZWFsdGggfCBU" + + "VFkvcGxhaW4vSlNPTkwgfCBgLS13YXRjaGAgZm9yIGxpdmUgcmUtcmVuZGVyIHwKfCBgc2VsZi1o" + + "b3N0ZWQgdW5pbnN0YWxsIC0tY29tcHV0ZS1wbGFuZSAtLWNsdXN0ZXItbmFtZT1YYCB8IFBlci1w" + + "bGFuZSBwcmltaXRpdmU6IGBoZWxtZmlsZSBkZXN0cm95YCBvbiBvbmUgY29tcHV0ZSBwbGFuZSAo" + + "bm8gSUNNUyB1bnJlZ2lzdGVyLCBubyBkcmFpbikgfCBwcm9ncmVzcyB8IEp1c3QgdGhlIGhlbG0g" + + "cmVsZWFzZXMgb24gdGhhdCBjb21wdXRlIHBsYW5lIHwKfCBgc2VsZi1ob3N0ZWQgdW5pbnN0YWxs" + + "IC0tY29udHJvbC1wbGFuZSBbLS1mb3JjZS13aXRoLXJlZ2lzdGVyZWQtY2x1c3RlcnNdYCB8IFBl" + + "ci1wbGFuZSBwcmltaXRpdmU6IGBoZWxtZmlsZSBkZXN0cm95YCBvbiB0aGUgY29udHJvbCBwbGFu" + + "ZSB8IHByb2dyZXNzIHwgUmVmdXNlcyBpZiBjb21wdXRlIHBsYW5lcyBzdGlsbCByZWdpc3RlcmVk" + + "IHVubGVzcyBgLS1mb3JjZS13aXRoLXJlZ2lzdGVyZWQtY2x1c3RlcnNgIHwKfCBgc2VsZi1ob3N0" + + "ZWQgdW5pbnN0YWxsIC0tbm8tYXBwbHkgPHBsYW5lPmAgfCBSZW5kZXIgZGVsZXRlIFlBTUwgdmlh" + + "IGBoZWxtIGdldCBtYW5pZmVzdGAgcGVyIHJlbGVhc2UgfCBZQU1MIG9uIHN0ZG91dCB8IEdpdE9w" + + "czsgcGlwZSB0byBga3ViZWN0bCBkZWxldGUgLWYgLWAgb3IgY29tbWl0ICsgQXJnbyBhcHBsaWVz" + + "LiBNaXJyb3JzIGBpbnN0YWxsIC0tbm8tYXBwbHlgIHwKfCBgc2VsZi1ob3N0ZWQgZG93biAtLWNs" + + "dXN0ZXItbmFtZT1YIFstLWRyYWluLWFjdGl2ZV0gWy0tcmVtb3ZlLXBlcnNpc3RlbnRdYCB8IE9y" + + "Y2hlc3RyYXRvcjogZHJhaW4g4oaSIHVuaW5zdGFsbCAtLWNvbXB1dGUtcGxhbmUg4oaSIGNsdXN0" + + "ZXIgZGVsZXRlIGluIElDTVMgfCBwcm9ncmVzcyB8IFN5bW1ldHJpYyBjb21wYW5pb24gdG8gYHVw" + + "IC0tY2x1c3Rlci1uYW1lPVhgIHwKfCBgc2VsZi1ob3N0ZWQgZG93biAtLWFsbCBbLS1jb25maXJt" + + "XWAgfCBPcmNoZXN0cmF0b3I6IHRlYXIgZG93biBldmVyeSByZWdpc3RlcmVkIGNvbXB1dGUgcGxh" + + "bmUgKyBjb250cm9sIHBsYW5lIHwgcHJvZ3Jlc3MgfCBCb3VuZGVkIHBhcmFsbGVsaXNtIHZpYSBg" + + "LS1hbGwtY29uY3VycmVuY3lgIChkZWZhdWx0IDQpOyBgLS1jb25maXJtYCByZXF1aXJlZCBpbiBu" + + "b24taW50ZXJhY3RpdmUgfAp8IGBzZWxmLWhvc3RlZCBkb3duIC0tcGxhbi1vbmx5IC4uLmAgfCBP" + + "cmNoZXN0cmF0b3IgZHJ5LXJ1bjogcGhhc2VzICsgaGVsbSByZWxlYXNlcyArIElDTVMgcm93cyAr" + + "IEVUQXMgKG5vIGhlbG0vaGVsbWZpbGUgY29udGFjdCkgfCBKU09OTCB8ICoqQWx3YXlzIHJ1biBi" + + "ZWZvcmUgYW55IGFjdHVhbCBgZG93bmAqKiB8CgojIyBDbHVzdGVyIG1hbmFnZW1lbnQKCnwgQ29t" + + "bWFuZCB8IFB1cnBvc2UgfCBOb3RlcyB8CnwtLS18LS0tfC0tLXwKfCBgY2x1c3RlciByZWdpc3Rl" + + "ciAtLW5hbWU9WCAtLW5jYS1pZD1ZIFstLXJlZ2lvbj1aXSBbLS1pZ25vcmUtZXhpc3RpbmddYCB8" + + "IFJlZ2lzdGVyIGEgSldLUytPSURDIHdpdGggSUNNUyB8IFVzZWQgYnkgYHVwYCBQaGFzZSA1IGlu" + + "dGVybmFsbHk7IHN0YW5kYWxvbmUgZm9yIG1hbnVhbCByZWdpc3RyYXRpb24gfAp8IGBjbHVzdGVy" + + "IGxpc3QtcmVnaXN0ZXJlZCAtLW5jYS1pZD1ZIFstLWljbXMtdXJsPVVSTF1gIHwgTGlzdCBzZWxm" + + "LWhvc3RlZCBjbHVzdGVyIHJlZ2lzdHJhdGlvbnMgZnJvbSBJQ01TIHwgVXNlcyB0aGUgYWRtaW4g" + + "dG9rZW47IGAtLWpzb25gIGZvciBtYWNoaW5lLXJlYWRhYmxlIG91dHB1dCB8CnwgYGNsdXN0ZXIg" + + "cm90YXRlIC0tY2x1c3Rlci1pZD1JRGAgfCBSZS1mZXRjaCBKV0tTIGZyb20gSzhzIGFuZCBQVVQg" + + "dG8gSUNNUyB8IEFmdGVyIEs4cyBBUEkgc2VydmVyIHNpZ25pbmcga2V5IHJvdGF0aW9uIHwKfCBg" + + "Y2x1c3RlciBkZWxldGUgLS1jbHVzdGVyLWlkPUlEYCB8IFJlbW92ZSBJQ01TIHJvdyB8ICoqREVT" + + "VFJVQ1RJVkU6IGNvbmZpcm0gd2l0aCB1c2VyKiogfAoKIyMgRnVuY3Rpb25zCgp8IENvbW1hbmQg" + + "fCBQdXJwb3NlIHwgTm90ZXMgfAp8LS0tfC0tLXwtLS18CnwgYGZ1bmN0aW9uIGNyZWF0ZSAtLWlu" + + "cHV0LWZpbGU9RklMRWAgfCBDcmVhdGUgZnVuY3Rpb24gbWV0YWRhdGEgfCBSZXR1cm5zIEZ1bmN0" + + "aW9uIElEICsgVmVyc2lvbiBJRDsgTExNIGZ1bmN0aW9ucyB1c2UgYGZ1bmN0aW9uVHlwZTogIkxM" + + "TSJgIGFuZCBgbW9kZWxzW10ubGxtQ29uZmlnLnVyaXNgIGZvciBgL3YxL2NoYXQvY29tcGxldGlv" + + "bnNgLCBgL3YxL3Jlc3BvbnNlc2AsIGFuZCBgL3YxL2VtYmVkZGluZ3NgIHwKfCBgZnVuY3Rpb24g" + + "bGlzdGAgLyBgZnVuY3Rpb24gbGlzdC1pZHNgIHwgTGlzdCBmdW5jdGlvbnMgLyBJRHMgb25seSB8" + + "IHwKfCBgZnVuY3Rpb24gZ2V0IC0tZnVuY3Rpb24taWQ9SUQgLS12ZXJzaW9uLWlkPVZJRGAgfCBG" + + "dW5jdGlvbiBtZXRhZGF0YSB8IHwKfCBgZnVuY3Rpb24gdXBkYXRlIC0tZnVuY3Rpb24taWQ9SUQg" + + "LS12ZXJzaW9uLWlkPVZJRCAtLXRhZ3M9VEFHWyxUQUddYCB8IFVwZGF0ZSBmdW5jdGlvbiB0YWdz" + + "IHwgfAp8IGBmdW5jdGlvbiB1cGRhdGUgLS1mdW5jdGlvbi1pZD1JRCAtLXZlcnNpb24taWQ9VklE" + + "IC0tbGxtLW1vZGVsLXVwZGF0ZT1TUEVDYCB8IFVwZGF0ZSBMTE0gbW9kZWwgcm91dGluZyBjb25m" + + "aWcgfCBgU1BFQ2AgdXNlcyBgbmFtZT08bW9kZWw+LHJvdXRpbmdNZXRob2Q9PG1ldGhvZD4sdG9r" + + "ZW5SYXRlTGltaXQ9PGxpbWl0PmA7IGFjY2VwdGVkIG1ldGhvZHMgYXJlIGxpc3RlZCBpbiBbZmxh" + + "Z3MubWRdKGZsYWdzLm1kKSB8CnwgYGZ1bmN0aW9uIGRlcGxveSBjcmVhdGUgLS1pbnB1dC1maWxl" + + "PUZJTEVgIHwgU2NoZWR1bGUgYSBkZXBsb3ltZW50IHwgQmxvY2tzIHVudGlsIEFDVElWRSAoZGVm" + + "YXVsdCA5MDBzKSB8CnwgYGZ1bmN0aW9uIGRlcGxveSBnZXQgLS1mdW5jdGlvbi1pZD1JRCAtLXZl" + + "cnNpb24taWQ9VklEIFstLWpzb25dYCB8IERlcGxveW1lbnQgc3RhdHVzIHwgYGZ1bmN0aW9uU3Rh" + + "dHVzOiBBQ1RJVkVcfERFUExPWUlOR1x8RVJST1JcfEZBSUxFRGAgfAp8IGBmdW5jdGlvbiBkZXBs" + + "b3kgdXBkYXRlIC0taW5wdXQtZmlsZT1GSUxFYCB8IE1vZGlmeSBhIGRlcGxveW1lbnQgaW4gcGxh" + + "Y2UgfCB8CnwgYGZ1bmN0aW9uIGRlcGxveSByZW1vdmUgLS1mdW5jdGlvbi1pZD1JRCAtLXZlcnNp" + + "b24taWQ9VklEYCB8IFN0b3AgYSBkZXBsb3ltZW50LCBrZWVwIGZ1bmN0aW9uIHJlY29yZCB8IHwK" + + "fCBgZnVuY3Rpb24gaW52b2tlIC0taW5wdXQtZmlsZT1GSUxFYCB8IENhbGwgYSByZWd1bGFyIGZ1" + + "bmN0aW9uIHwgUmVxdWlyZXMgQVBJIGtleSAobm90IGFkbWluIHRva2VuKTsgTExNIGZ1bmN0aW9u" + + "cyBhcmUgaW52b2tlZCB0aHJvdWdoIGBsbG0uaW52b2NhdGlvbi48ZG9tYWluPmAgd2l0aCBgbW9k" + + "ZWw6ICI8ZnVuY3Rpb24taWQ+Lzxtb2RlbC1uYW1lPiJgIHwKfCBgZnVuY3Rpb24gZGVsZXRlIC0t" + + "ZnVuY3Rpb24taWQ9SUQgLS12ZXJzaW9uLWlkPVZJRGAgfCBSZW1vdmUgZnVuY3Rpb24gKyBkZXBs" + + "b3ltZW50IHwgKipERVNUUlVDVElWRTogY29uZmlybSB3aXRoIHVzZXIqKiB8CgojIyBUYXNrcwoK" + + "VGFzayBjb21tYW5kcyByZXF1aXJlIGBOVkNGX0FQSV9LRVlgIHNldCB0byBhIHRhc2stc2NvcGVk" + + "IGtleSBhbmQgYE5WQ0ZfQkFTRV9OVkNUX1VSTGAgc2V0IHRvIHRoZSBOVkNUIGdhdGV3YXkgZW5k" + + "cG9pbnQuIEluIGEgZnJlc2ggc2Vzc2lvbiwgcmVhZCBgbnZjdEFwaUtleWAgZnJvbSBgfi8ubnZj" + + "Zi1jbGkuc3RhdGVgIGFuZCBpbmplY3QgaXQgYXMgYE5WQ0ZfQVBJX0tFWWAgd2l0aG91dCBsb2dn" + + "aW5nIHRoZSB2YWx1ZTsgY2hlY2sgYG52Y3RBcGlLZXlFeHBpcmF0aW9uYCBmaXJzdCBhbmQgcmVn" + + "ZW5lcmF0ZSB3aXRoIGBhcGkta2V5IGdlbmVyYXRlIC0tZm9yIHRhc2sgLS12YWxpZGF0ZWAgaWYg" + + "ZXhwaXJlZC4gUnVuIGBhcGkta2V5IGdlbmVyYXRlIC0tZm9yIHRhc2tgIGFmdGVyIGBpbml0YCB0" + + "byBtaW50IGEgbmV3IGtleS4KCnwgQ29tbWFuZCB8IFB1cnBvc2UgfCBOb3RlcyB8CnwtLS18LS0t" + + "fC0tLXwKfCBgdGFzayBjcmVhdGUgLS1uYW1lPVggLS1ncHU9R1BVIC0taW5zdGFuY2UtdHlwZT1U" + + "WVBFIC0taW1hZ2U9SU1HYCB8IFN1Ym1pdCBhIGNvbnRhaW5lciB0YXNrIHwgU2F2ZXMgdGFzayBJ" + + "RCB0byBDTEkgc3RhdGU7IHVzZSBgLS1pbnB1dC1maWxlYCBmb3IgcmVwZWF0YWJsZSBjb25maWdz" + + "IHwKfCBgdGFzayBjcmVhdGUgLS1uYW1lPVggLS1ncHU9R1BVIC0taW5zdGFuY2UtdHlwZT1UWVBF" + + "IC0taGVsbS1jaGFydD1DSEFSVGAgfCBTdWJtaXQgYSBIZWxtIHRhc2sgfCBgLS1oZWxtLWNoYXJ0" + + "YCByZXBsYWNlcyBgLS1pbWFnZWAgfAp8IGB0YXNrIGNyZWF0ZSAtLWlucHV0LWZpbGU9RklMRWAg" + + "fCBTdWJtaXQgYSB0YXNrIGZyb20gYSBKU09OIGNvbmZpZyBmaWxlIHwgUmVjb21tZW5kZWQgZm9y" + + "IHJlcGVhdGFibGUgY29uZmlndXJhdGlvbnMgfAp8IGB0YXNrIGxpc3QgWy0tc3RhdHVzPVNUQVRV" + + "U10gWy0tbGltaXQ9Tl1gIHwgTGlzdCB0YXNrcywgb3B0aW9uYWxseSBmaWx0ZXJlZCBieSBzdGF0" + + "dXMgfCBTdGF0dXNlczogYFFVRVVFRGAsIGBMQVVOQ0hFRGAsIGBSVU5OSU5HYCwgYENPTVBMRVRF" + + "RGAsIGBFUlJPUkVEYCwgYENBTkNFTEVEYCwgYEVYQ0VFREVEX01BWF9SVU5USU1FX0RVUkFUSU9O" + + "YCwgYEVYQ0VFREVEX01BWF9RVUVVRURfRFVSQVRJT05gIHwKfCBgdGFzayBnZXQgW3Rhc2tJZF1g" + + "IHwgR2V0IHRhc2sgZGV0YWlscyB8IFVzZXMgc2F2ZWQgdGFzayBJRCBmcm9tIHN0YXRlIGlmIG9t" + + "aXR0ZWQgfAp8IGB0YXNrIGV2ZW50cyBbdGFza0lkXSBbLS1saW1pdD1OXWAgfCBMaXN0IGxpZmVj" + + "eWNsZSBldmVudHMgZm9yIGEgdGFzayB8IHwKfCBgdGFzayByZXN1bHRzIFt0YXNrSWRdYCB8IExp" + + "c3QgcmVzdWx0IGFydGlmYWN0cyBmb3IgYSBjb21wbGV0ZWQgdGFzayB8IFJldHVybnMgZW1wdHkg" + + "bGlzdCB3aGVuIGByZXN1bHRIYW5kbGluZ1N0cmF0ZWd5YCBpcyBgTk9ORWA7IHJlc3VsdCB1cGxv" + + "YWQgbm90IHlldCBzdXBwb3J0ZWQgfAp8IGB0YXNrIGNhbmNlbCBbdGFza0lkXWAgfCBDYW5jZWwg" + + "YSBydW5uaW5nIHRhc2sgfCBOby1vcCBpZiBhbHJlYWR5IGluIHRlcm1pbmFsIHN0YXRlIHwKfCBg" + + "dGFzayBkZWxldGUgW3Rhc2tJZF1gIHwgRGVsZXRlIGEgdGFzayByZWNvcmQgfCAqKlN0b3AsIHN0" + + "YXRlIHRhc2sgSUQgKyBjdXJyZW50IHN0YXR1cywgYW5kIHdhaXQgZm9yIGEgc3Vic2VxdWVudCB1" + + "c2VyIHJlcGx5IGV4cGxpY2l0bHkgY29uZmlybWluZyBkZWxldGlvbiBvZiB0aGF0IHNwZWNpZmlj" + + "IHRhc2suIERvIG5vdCB0cmVhdCB0aGUgb3JpZ2luYWwgZGVsZXRlIHJlcXVlc3QgYXMgY29uZmly" + + "bWF0aW9uLioqIHwKfCBgdGFzayB1cGRhdGUtc2VjcmV0cyBbdGFza0lkXSAtLXNlY3JldHMgTkFN" + + "RT12YWx1ZWAgfCBVcGRhdGUgc2VjcmV0cyBvbiBhIHRhc2s7IHN1cHBsaWVkIHNlY3JldHMgYXJl" + + "IGFkZGVkIG9yIHVwZGF0ZWQgYnkgbmFtZSwgZXhpc3Rpbmcgc2VjcmV0cyBub3QgaW4gdGhlIHJl" + + "cXVlc3QgYXJlIHByZXNlcnZlZCB8IFZhbHVlcyBhcmUgZW5jcnlwdGVkIGF0IHJlc3QgfAp8IGB0" + + "YXNrIGJ1bGsgLS10YXNrLWlkcz1JRDFbLElEMizigKZdYCB8IEZldGNoIGRldGFpbHMgZm9yIG11" + + "bHRpcGxlIHRhc2tzIGluIG9uZSByZXF1ZXN0IHwgfAoKIyMgQXV0aAoKfCBDb21tYW5kIHwgUHVy" + + "cG9zZSB8IE5vdGVzIHwKfC0tLXwtLS18LS0tfAp8IGBpbml0YCB8IE1pbnQgYWRtaW4gdG9rZW4g" + + "ZnJvbSBBUEkgS2V5cyB2aWEgcHVibGljIGFwaSBnYXRld2F5IHwgSWRlbXBvdGVudDsgd3JpdGVz" + + "IGB+Ly5udmNmLWNsaS5zdGF0ZWA7IGNsZWFycyBzYXZlZCBmdW5jdGlvbiBzdGF0ZSBhbmQgYWxs" + + "IEFQSSBrZXlzIChmdW5jdGlvbiBhbmQgdGFzaykgfAp8IGBzdGF0dXNgIHwgU2hvdyBDTEkgc3Rh" + + "dGUgKHRva2VuLCBsYXN0IGVuZHBvaW50cywgZnVuY3Rpb24gY29udGV4dCkgfCBEaXN0aW5jdCBm" + + "cm9tIGBzZWxmLWhvc3RlZCBzdGF0dXNgIHwKfCBgYXBpLWtleSBnZW5lcmF0ZSBbLS1mb3IgZnVu" + + "Y3Rpb25cfHRhc2tdIFstLWRlc2NyaXB0aW9uPeKApl0gWy0tZXhwaXJlcy1pbj3igKZdYCB8IE1p" + + "bnQgQVBJIGtleXMgfCBEZWZhdWx0IChubyBgLS1mb3JgKTogZ2VuZXJhdGVzIGJvdGggYSBmdW5j" + + "dGlvbiBrZXkgYW5kIGEgdGFzayBrZXk7IGAtLWZvciBmdW5jdGlvbmAgb3IgYC0tZm9yIHRhc2tg" + + "IGdlbmVyYXRlcyBvbmUgb25seTsgYC0tc2NvcGVzYCByZXF1aXJlcyBgLS1mb3JgIHwKfCBgYXBp" + + "LWtleSBnZW5lcmF0ZSAtLXZhbGlkYXRlYCB8IE1pbnQgYW5kIGltbWVkaWF0ZWx5IHZhbGlkYXRl" + + "IGVhY2ggZ2VuZXJhdGVkIGtleSB8IFZhbGlkYXRlcyBlYWNoIGtleSBhZ2FpbnN0IGl0cyBjb3Jy" + + "ZWN0IGF1ZGllbmNlIChOVkNGIGZvciBmdW5jdGlvbiBrZXlzLCBOVkNUIGZvciB0YXNrIGtleXMp" + + "IHwKfCBgYXBpLWtleSBsaXN0YCB8IExpc3QgQVBJIGtleXMgZm9yIGN1cnJlbnQgb3duZXIgfCBM" + + "aXN0cyBOVkNGLXNjb3BlZCBrZXlzIG9ubHkgfAp8IGBhcGkta2V5IGRlbGV0ZSBLRVktSURgIC8g" + + "YGFwaS1rZXkgcmV2b2tlIEtFWS1JRGAgfCBSZW1vdmUgYW4gQVBJIGtleSB8ICoqQ29uZmlybSB3" + + "aXRoIHVzZXIqKiB8CnwgYGFwaS1rZXkgc2hvd2AgfCBTaG93IGN1cnJlbnRseSBzYXZlZCBBUEkg" + + "a2V5IGZyb20gc3RhdGUgfCB8CgojIyBBZ2VudCBza2lsbAoKfCBDb21tYW5kIHwgUHVycG9zZSB8" + + "IE5vdGVzIHwKfC0tLXwtLS18LS0tfAp8IGBhZ2VudC1za2lsbCBpbnN0YWxsIFstLXRhcmdldD1E" + + "SVJdYCB8IEluc3RhbGwgYWxsIGJ1bmRsZWQgcHVibGljIHVzZXIgc2tpbGxzIGludG8gYH4vLmNs" + + "YXVkZS9za2lsbHMvYCBhbmQgYH4vLmFnZW50cy9za2lsbHMvYCB8IERlZmF1bHQ6IGJvdGggYmFz" + + "ZSBza2lsbHMgZGlyZWN0b3JpZXMgfAp8IGBhZ2VudC1za2lsbCB1bmluc3RhbGwgWy0tdGFyZ2V0" + + "PURJUl1gIHwgUmVtb3ZlIG9ubHkgYnVuZGxlZCBwdWJsaWMgdXNlciBza2lsbHMgZnJvbSB0aGUg" + + "dGFyZ2V0IGJhc2Ugc2tpbGxzIGRpcmVjdG9yaWVzIHwgSWRlbXBvdGVudDsgdW5yZWxhdGVkIHNr" + + "aWxscyByZW1haW4gfAp8IGBhZ2VudC1za2lsbCBzaG93IFstLWZpbGU9UkVMXWAgfCBQcmludCBi" + + "dW5kbGVkIGBudmNmLXNlbGYtbWFuYWdlZC1jbGkvU0tJTEwubWRgIG9yIGFub3RoZXIgZW1iZWRk" + + "ZWQgZmlsZSB8IEZvciBkZWJ1Z2dpbmcgfAp8IGBhZ2VudC1za2lsbCB2ZXJzaW9uYCB8IFByaW50" + + "IGJ1aWxkIFNIQSBhbmQgZW1iZWRkZWQgcHVibGljIHVzZXIgc2tpbGwgc3VtbWFyeSB8IHwKUEsH" + + "CHIND2QhIwAAISMAAFBLAwQUAAgAAAAAACEAAAAAAAAAAAAAAAAAMgAJAGRhdGEvbnZjZi1zZWxm" + + "LW1hbmFnZWQtY2xpL3JlZmVyZW5jZS9leGl0LWNvZGVzLm1kVVQFAAEAps4SIyBgbnZjZi1jbGlg" + + "IGV4aXQgY29kZXMKClN0YWJsZSBhY3Jvc3Mgc3ViY29tbWFuZHMuIFVzZSB0aGVzZSB0byBkcml2" + + "ZSBhZ2VudCByZXRyeSAvIHN1cmZhY2luZyBsb2dpYy4KCnwgQ29kZSB8IE1lYW5pbmcgfCBFeGFt" + + "cGxlIGNhdXNlcyB8CnwtLS18LS0tfC0tLXwKfCBgMGAgfCBTdWNjZXNzIHwgQWxsIGNoZWNrcyBw" + + "YXNzZWQ7IGluc3RhbGwgY29tcGxldGVkOyBkZXBsb3ltZW50IEFDVElWRSB8CnwgYDFgIHwgR2Vu" + + "ZXJpYyBlcnJvciB8IEhlbG0gcmVuZGVyIGZhaWxlZDsgbmV0d29yayB1bnJlYWNoYWJsZTsgZmls" + + "ZSBub3QgZm91bmQ7IFlBTUwgcGFyc2UgZXJyb3IgfAp8IGAyYCB8IFByZS1mbGlnaHQgY2hlY2sg" + + "ZmFpbGVkIHwgR2F0ZXdheSBBUEkgQ1JEcyBtaXNzaW5nOyBrdWJlY3RsIG5vdCBvbiBQQVRIOyBk" + + "ZWZhdWx0IFN0b3JhZ2VDbGFzcyBhYnNlbnQgfAp8IGAzYCB8IEFkbWluIGF1dGggZmFpbGVkIHwg" + + "Tm8gdG9rZW4gKyBgLS1ub24taW50ZXJhY3RpdmVgIHNldDsgSUNNUyByZWplY3RlZCBKV1Q7IGlu" + + "aXQgZW5kcG9pbnQgdW5yZWFjaGFibGUgfAp8IGA1YCB8IE1hbmlmZXN0IGFwcGx5IG9yIGAtLXdh" + + "aXRgIHRpbWVkIG91dCB8IEhlbG0gaW5zdGFsbCB0aW1lb3V0OyBjaGVjayBwb2xsZWQgYnV0IGRp" + + "ZG4ndCBwYXNzIGJlZm9yZSBkdXJhdGlvbiB8CnwgYDEzMGAgfCBDYW5jZWxsZWQgYnkgU0lHSU5U" + + "L1NJR1RFUk0gfCBVc2VyIEN0cmwtQzsgQ0kgYnVkZ2V0IGV4Y2VlZGVkOyBwb2QgZXZpY3RlZCB8" + + "CgojIyBIb3cgYW4gYWdlbnQgc2hvdWxkIHJlYWN0Cgp8IENvZGUgfCBBZ2VudCBiZWhhdmlvciB8" + + "CnwtLS18LS0tfAp8IGAwYCB8IENvbnRpbnVlIC8gcmVwb3J0IHN1Y2Nlc3MuIHwKfCBgMWAgfCBT" + + "dXJmYWNlIHN0ZGVyciB0byB1c2VyOyBhc2sgYmVmb3JlIGFueSByZXRyeS4gR2VuZXJpYyBlcnJv" + + "cnMgdXN1YWxseSBuZWVkIGEgaHVtYW4gdG8gcmVhZCB0aGUgbWVzc2FnZS4gfAp8IGAyYCB8IFN1" + + "cmZhY2UgZmFpbGVkIGNoZWNrcyArIHRoZWlyIGBoaW50VVJMYC4gRG9uJ3QgcHJvcG9zZSBgdXBg" + + "IHVudGlsIHRoZSB1c2VyIGZpeGVzIHByZXJlcXMuIHwKfCBgM2AgfCBTdWdnZXN0IGBudmNmLWNs" + + "aSBpbml0YCAoaW50ZXJhY3RpdmUpIE9SIGAtLXRva2VuPSRKV1RgIChDSSkuIERvbid0IGF1dG8t" + + "bWludCB3aXRob3V0IHVzZXIgT0suIHwKfCBgNWAgfCBBc2sgdXNlciBpZiB0aGV5IHdhbnQgdG8g" + + "d2FpdCBsb25nZXIsIGRpZyBpbnRvIHRoZSBzdGFsbGVkIGNvbXBvbmVudCwgb3IgY2FuY2VsLiB8" + + "CnwgYDEzMGAgfCBEb24ndCByZXRyeSBhdXRvbWF0aWNhbGx5OyB1c2VyIGV4cGxpY2l0bHkgY2Fu" + + "Y2VsbGVkLiBDb25maXJtIGJlZm9yZSByZS1ydW5uaW5nLiB8CgojIyBXaGVyZSB0byBmaW5kIG1v" + + "cmUgZGV0YWlsCgpFdmVyeSBub24temVybyBleGl0IGVtaXRzIGEgc3RydWN0dXJlZCBgcGhhc2Vf" + + "ZmFpbGVkYCBKU09OIGV2ZW50IHdpdGggYGVyckNhdGVnb3J5YCwgYGVyck1lc3NhZ2VgLCBgcmVt" + + "ZWRpYXRpb25gIChhcnJheSksIGByZXRyeUNsYXNzYCAoZW51bTogYG5vbmV8aW1tZWRpYXRlfGJh" + + "Y2tvZmZ8YWZ0ZXJfcmVtZWRpYXRpb258dW5rbm93bmApLCBgcmV0cnlBZnRlclNlY2AgKGludCwg" + + "b3B0aW9uYWwpLCBhbmQgYHJhd2AgKHN1YnByb2Nlc3MgKyBIVFRQICsgS3ViZXJuZXRlcyBzaWdu" + + "YWwpLiBBbHdheXMgY29uc3VtZSB0aGVzZSBpbiBgLS1qc29uYCBtb2RlIHJhdGhlciB0aGFuIHBh" + + "cnNpbmcgRW5nbGlzaCBmcm9tIHN0ZGVyci4KUEsHCHOnWmTVBgAA1QYAAFBLAwQUAAgAAAAAACEA" + + "AAAAAAAAAAAAAAAALQAJAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL3JlZmVyZW5jZS9mbGFn" + + "cy5tZFVUBQABAKbOEiMgYG52Y2YtY2xpYCBmbGFnIHJlZmVyZW5jZQoKIyMgR2xvYmFsIGZsYWdz" + + "IChldmVyeSBzdWJjb21tYW5kKQoKfCBGbGFnIHwgUHVycG9zZSB8IERlZmF1bHQgfAp8LS0tfC0t" + + "LXwtLS18CnwgYC0tY29uZmlnIEZJTEVgIHwgQ29uZmlnIGZpbGUgcGF0aCB8IGAkSE9NRS8ubnZj" + + "Zi1jbGkueWFtbGAgfAp8IGAtLWRlYnVnYCB8IFZlcmJvc2UgSFRUUCBsb2dnaW5nIG9uIHN0ZGVy" + + "ciB8IGBmYWxzZWAgfAp8IGAtLWpzb25gIHwgSlNPTkwgZXZlbnRzIG9uIHN0ZGVyciB8IGF1dG8g" + + "KG9mZiBpbiBUVFksIG9uIHVuZGVyIGAtLW5vbi1pbnRlcmFjdGl2ZWApIHwKCiMjIGBzZWxmLWhv" + + "c3RlZGAgcGFyZW50IChwZXJzaXN0ZW50IGFjcm9zcyBzdWJjb21tYW5kcykKCnwgRmxhZyB8IFB1" + + "cnBvc2UgfCBEZWZhdWx0IHwKfC0tLXwtLS18LS0tfAp8IGAtLWNvbnRyb2wtcGxhbmUtc3RhY2s9" + + "4oCmYCB8IENvbnRyb2wtcGxhbmUgYnVuZGxlIHNvdXJjZTogbG9jYWwgcGF0aCwgZ2l0IFVSTCwg" + + "b3IgYG9jaTovL2AgVVJMIHwgZW1iZWRkZWQgT0NJIFVSTCBwaW5uZWQgYnkgQ0xJIHZlcnNpb24g" + + "fAp8IGAtLWNvbXB1dGUtcGxhbmUtc3RhY2s94oCmYCB8IENvbXB1dGUtcGxhbmUgYnVuZGxlIHNv" + + "dXJjZTogbG9jYWwgcGF0aCwgZ2l0IFVSTCwgb3IgYG9jaTovL2AgVVJMIHwgZW1iZWRkZWQgT0NJ" + + "IFVSTCBwaW5uZWQgYnkgQ0xJIHZlcnNpb24gfAp8IGAtLWVudj1sb2NhbFx8cHJkXHzigKZgIHwg" + + "SGVsbWZpbGUgZW52aXJvbm1lbnQgbmFtZSB8IGBsb2NhbGAgZm9yIGRldiBidWlsZHMsIGBwcmRg" + + "IGZvciByZWxlYXNlcyB8CnwgYC0tbm9uLWludGVyYWN0aXZlYCB8IERpc2FibGUgYWxsIHN0ZGlu" + + "IHByb21wdHMgfCBgZmFsc2VgIHwKfCBgLS10b2tlbj0kSldUYCB8IEFkbWluIEpXVCwgb3ZlcnJp" + + "ZGVzIHN0b3JlZCBzZXNzaW9uIHwgLSB8CnwgYC0tbm8tYXBwbHlgIHwgYGluc3RhbGxgIG9ubHkg" + + "LSBlbWl0IFlBTUwsIGRvIG5vdCBrdWJlY3RsIGFwcGx5IHwgYGZhbHNlYCB8CnwgYC0tb3V0cHV0" + + "PXRleHRcfGpzb25gIHwgTGVnYWN5IGFsaWFzIGZvciBgLS1qc29uYCAoZGVwcmVjYXRlZCwgcmVt" + + "b3ZlZCBpbiBuZXh0IG1ham9yKSB8IGB0ZXh0YCB8CnwgYC0tcGxhaW5gIHwgRm9yY2UgcGxhaW4g" + + "c3RyZWFtaW5nIG91dHB1dCB8IGF1dG8tZGV0ZWN0IHwKfCBgLS13YWl0IERVUkFUSU9OYCB8IGBj" + + "aGVja2Agb25seTsgYmxvY2sgdW50aWwgcGFzcyB8IC0gfAp8IGAtLWNvbnRyb2wtcGxhbmUtY29u" + + "dGV4dCBDVFhgIHwga3ViZWN0bCBjb250ZXh0IGZvciBjb250cm9sIHBsYW5lIChSRVEtMjApIHwg" + + "Y3VycmVudCBjb250ZXh0IHwKfCBgLS1jb21wdXRlLXBsYW5lLWNvbnRleHQgQ1RYYCB8IGt1YmVj" + + "dGwgY29udGV4dCBmb3IgY29tcHV0ZSBwbGFuZSAoUkVRLTIwKSB8IGN1cnJlbnQgY29udGV4dCB8" + + "CnwgYC0taWNtcy11cmwgVVJMYCB8IFB1YmxpYyBJQ01TIFVSTDsgcmVxdWlyZWQgd2hlbiBjb250" + + "ZXh0cyBkaWZmZXIgfCBkZXJpdmVkIGZyb20gYGJhc2VfaHR0cF91cmxgIHwKfCBgLS1sb2NhbC1v" + + "bmx5YCB8IGBjaGVjayAtLXByZWAgb25seTsgc2tpcCBhbGwga3ViZWN0bCBjb250YWN0IHwgYGZh" + + "bHNlYCB8CgojIyBgY2hlY2tgLXNwZWNpZmljCgpBdCBsZWFzdCBvbmUgb2YgYC0tcHJlYCwgYC0t" + + "Y29udHJvbC1wbGFuZWAsIGAtLWNvbXB1dGUtcGxhbmVgLCBvciBgLS1hbGxgIGlzCnJlcXVpcmVk" + + "LiBFYWNoIHNlbGVjdHMgYSByb2xlOyBvbmx5IHRoZSBzZWxlY3RlZCByb2xlcyBjb250YWN0IGEg" + + "Y2x1c3Rlci4KCnwgRmxhZyB8IFB1cnBvc2UgfCBEZWZhdWx0IHwKfC0tLXwtLS18LS0tfAp8IGAt" + + "LXByZWAgfCBQcmUtZmxpZ2h0OiBsb2NhbC1ob3N0IHRvb2xzIHBsdXMgY2x1c3RlciByZWFkaW5l" + + "c3MgfCBgZmFsc2VgIHwKfCBgLS1jb250cm9sLXBsYW5lYCB8IENvbnRyb2wtcGxhbmUgY2hlY2tz" + + "IHwgYGZhbHNlYCB8CnwgYC0tY29tcHV0ZS1wbGFuZWAgfCBDb21wdXRlLXBsYW5lIGNoZWNrcyB8" + + "IGBmYWxzZWAgfAp8IGAtLWFsbGAgfCBFdmVyeSBjYXRlZ29yeSB8IGBmYWxzZWAgfAp8IGAtLWNs" + + "dXN0ZXItbmFtZSBOQU1FYCB8IENsdXN0ZXIgbmFtZSBmb3IgY29tcHV0ZS1wbGFuZSBjaGVja3Mg" + + "fCAtIHwKfCBgLS1za2lwLWlub3RpZnktY2hlY2tgIHwgU2tpcCB0aGUgcGVyLW5vZGUgaW5vdGlm" + + "eS1saW1pdHMgcHJvYmUuIE5lZWRlZCB3aGVuIHRoZSBrdWJlY29uZmlnIHVzZXIgY2Fubm90IGNy" + + "ZWF0ZSBwb2RzIGluIGBkZWZhdWx0YC4gRW52OiBgTlZDRl9DTElfU0VMRkhPU1RFRF9TS0lQX0lO" + + "T1RJRllgIHwgYGZhbHNlYCB8CgojIyMgQ2x1c3Rlci12YWxpZGF0b3IgZmxhZ3MKClRoZSB2YWxp" + + "ZGF0b3IgcnVucyBhcyBhIEpvYiBpbiB0aGUgY2x1c3RlciBiZWluZyBjaGVja2VkLiBUaGUgQ0xJ" + + "IGNyZWF0ZXMgYQpTZXJ2aWNlQWNjb3VudCwgQ2x1c3RlclJvbGUsIGFuZCBDbHVzdGVyUm9sZUJp" + + "bmRpbmcgZm9yIGl0IGFuZCByZW1vdmVzIHRoZW0KYWZ0ZXIgdGhlIHJ1biwgc28gdGhlIGt1YmVj" + + "b25maWcgY29udGV4dCBuZWVkcyBwZXJtaXNzaW9uIHRvIG1hbmFnZSB0aG9zZS4KCnwgRmxhZyB8" + + "IFB1cnBvc2UgfCBEZWZhdWx0IHwKfC0tLXwtLS18LS0tfAp8IGAtLWNsdXN0ZXItdmFsaWRhdG9y" + + "LWltYWdlIFJFRmAgfCBWYWxpZGF0b3IgaW1hZ2UuIFJlc29sdXRpb24gb3JkZXI6IGZsYWcsIGBO" + + "VkNGX0NMSV9DTFVTVEVSX1ZBTElEQVRPUl9JTUFHRWAsIGNvbmZpZyBrZXkgYGNsdXN0ZXJfdmFs" + + "aWRhdG9yX2ltYWdlYC4gQSByZWYgd2l0aCBubyB0YWcgZGlzY292ZXJzIHRoZSBsYXRlc3Qgc3Rh" + + "YmxlIHRhZyBmcm9tIHRoZSByZWdpc3RyeS4gVW5zZXQgZXZlcnl3aGVyZSBza2lwcyB0aGUgcHJv" + + "YmUgd2l0aCBhIHdhcm5pbmcgfCAtIHwKfCBgLS1jbHVzdGVyLXZhbGlkYXRvci1yZWdpc3RyaWVz" + + "IGhvc3Q6cG9ydCwuLi5gIHwgRXh0cmEgcmVnaXN0cmllcyB0aGUgY29udHJvbC1wbGFuZSB2YWxp" + + "ZGF0b3IgcHJvYmVzIGZvciByZWFjaGFiaWxpdHkuIGBudmNyLmlvYCBpcyBhbHdheXMgcHJvYmVk" + + "LiBSZXBlYXRhYmxlIG9yIGNvbW1hLXNlcGFyYXRlZC4gRW52OiBgTlZDRl9DTElfQ0xVU1RFUl9W" + + "QUxJREFUT1JfUkVHSVNUUklFU2A7IGNvbmZpZyBrZXkgYGNsdXN0ZXJfdmFsaWRhdG9yX3JlZ2lz" + + "dHJpZXNgIHwgYG52Y3IuaW9gIG9ubHkgfAp8IGAtLWNsdXN0ZXItdmFsaWRhdG9yLXB1bGwtc2Vj" + + "cmV0IE5BTUVgIHwgZG9ja2VyLXJlZ2lzdHJ5IFNlY3JldCBpbiBgZGVmYXVsdGAgdXNlZCB0byBw" + + "dWxsIHRoZSB2YWxpZGF0b3IgaW1hZ2UuIFdoZW4gZW1wdHksIHRoZSBDTEkgbG9va3MgZm9yIG9u" + + "ZSBpbiB0aGUgTlZDRiBuYW1lc3BhY2VzIGFuZCBmYWxscyBiYWNrIHRvIG1pbnRpbmcgb25lIGZy" + + "b20gYE5HQ19BUElfS0VZYCB8IGF1dG8tZGV0ZWN0IHwKfCBgLS1za2lwLWNsdXN0ZXItdmFsaWRh" + + "dGlvbmAgfCBTa2lwIHRoZSBpbi1jbHVzdGVyIHZhbGlkYXRvciBwcm9iZSBlbnRpcmVseS4gRW52" + + "OiBgTlZDRl9DTElfU0VMRkhPU1RFRF9TS0lQX0NMVVNURVJfVkFMSURBVElPTmAgfCBgZmFsc2Vg" + + "IHwKfCBgLS1uby1jbGVhbnVwYCB8IEtlZXAgdGhlIHZhbGlkYXRvciBKb2IgKGFuZCBpdHMgUkJB" + + "QykgYWZ0ZXIgdGhlIHJ1biBmb3IgZGVidWdnaW5nLiBUaGUgbmV4dCBydW4gc3RpbGwgc3dlZXBz" + + "IHByaW9yIEpvYnMgfCBgZmFsc2VgIHwKfCBgLS1zaG93LWxvZ3NgIHwgUHJpbnQgdGhlIHZhbGlk" + + "YXRvciB0cmFuc2NyaXB0IHRvIHN0ZGVyciBhZnRlciB0aGUgY2hlY2sgZXZlbnRzLiBUaGUgdHJh" + + "bnNjcmlwdCBpcyBub3QgSlNPTiwgYW5kIGAtLWpzb25gIGFsc28gd3JpdGVzIHRvIHN0ZGVyciwg" + + "c28gbGVhdmUgdGhpcyBvZmYgd2hlbiBhIHBhcnNlciBpcyByZWFkaW5nIHRoZSBzdHJlYW0gfCBg" + + "ZmFsc2VgIHwKCiMjIGB1cGAtc3BlY2lmaWMKCnwgRmxhZyB8IFB1cnBvc2UgfCBEZWZhdWx0IHwK" + + "fC0tLXwtLS18LS0tfAp8IGAtLWNsdXN0ZXItbmFtZSBOQU1FYCB8IElDTVMgY2x1c3RlciByb3cg" + + "aWRlbnRpZmllciAocmVxdWlyZWQpIHwgLSB8CnwgYC0tbmNhLWlkIElEYCB8IE5DQSBhY2NvdW50" + + "IElEIHwgYG52Y2YtZGVmYXVsdGAgfAp8IGAtLXJlZ2lvbiBSRUdJT05gIHwgQ2x1c3RlciByZWdp" + + "b24gfCBgdXMtd2VzdC0xYCB8CnwgYC0tcGxhbi1vbmx5YCB8IERyeS1ydW47IGVtaXQgcGhhc2Ug" + + "cGxhbiArIEVUQXMgd2l0aG91dCBjaGFuZ2VzIHwgYGZhbHNlYCB8CgojIyBgc3RhdHVzYC1zcGVj" + + "aWZpYwoKfCBGbGFnIHwgUHVycG9zZSB8IERlZmF1bHQgfAp8LS0tfC0tLXwtLS18CnwgYC0tY2x1" + + "c3Rlci1uYW1lIE5BTUVgIHwgTGltaXQgdG8gb25lIGNvbXB1dGUgcGxhbmUgfCAtIChjb250cm9s" + + "ICsgYWxsIGNsdXN0ZXJzKSB8CnwgYC0td2F0Y2hgIHwgTGl2ZSByZS1yZW5kZXIgfCBgZmFsc2Vg" + + "IHwKfCBgLS13YXRjaC1pbnRlcnZhbCBEVVJgIHwgYC0td2F0Y2hgIGNhZGVuY2UgfCBgNXNgIHwK" + + "fCBgLS1jb21wb25lbnQgTkFNRWAgfCBGaWx0ZXIgY29tcG9uZW50cyBwYW5lbCB8IGFsbCB8Cnwg" + + "YC0tbm8tZXZlbnRzYCB8IFNraXAgZXZlbnRzIHBhbmVsIHwgYGZhbHNlYCB8CgojIyBgY2x1c3Rl" + + "ciByZWdpc3RlcmAtc3BlY2lmaWMKCnwgRmxhZyB8IFB1cnBvc2UgfCBEZWZhdWx0IHwKfC0tLXwt" + + "LS18LS0tfAp8IGAtLW5hbWUgTkFNRWAgfCBDbHVzdGVyIG5hbWUgKHJlcXVpcmVkKSB8IC0gfAp8" + + "IGAtLW5jYS1pZCBJRGAgfCBOQ0EgSUQgKHJlcXVpcmVkKSB8IC0gfAp8IGAtLXJlZ2lvbiBSRUdJ" + + "T05gIHwgUmVnaW9uIHwgYHVzLXdlc3QtMWAgfAp8IGAtLWljbXMtdXJsIFVSTGAgfCBJQ01TIGVu" + + "ZHBvaW50IHwgZnJvbSBjb25maWcgfAp8IGAtLWlnbm9yZS1leGlzdGluZ2AgfCBNYXRjaC1vci1j" + + "cmVhdGUgaW5zdGVhZCBvZiBmYWlsLW9uLWV4aXN0cyB8IGBmYWxzZWAgfAoKIyMgYGFwaS1rZXkg" + + "Z2VuZXJhdGVgLXNwZWNpZmljCgp8IEZsYWcgfCBQdXJwb3NlIHwgRGVmYXVsdCB8CnwtLS18LS0t" + + "fC0tLXwKfCBgLS1mb3IgZnVuY3Rpb25cfHRhc2tgIHwgR2VuZXJhdGUgb25seSB0aGUgc3BlY2lm" + + "aWVkIGtleSB0eXBlIHwgKG9taXQgdG8gZ2VuZXJhdGUgYm90aCkgfAp8IGAtLWRlc2NyaXB0aW9u" + + "IFRFWFRgIHwgSHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIHRoZSBrZXkgfCBgR2VuZXJhdGVkIGJ5" + + "IG52Y2YtY2xpYCB8CnwgYC0tZXhwaXJlcy1pbiBEVVJBVElPTmAgfCBFeHBpcnkgb2Zmc2V0IChl" + + "LmcuIGAyNGhgLCBgN2RgKTsgcGFyc2VkIGFzIGV4dGVuZGVkIGR1cmF0aW9uIHwgYDI0aGAgfAp8" + + "IGAtLXNjb3BlcyBTQ09QRVssU0NPUEVdYCB8IE92ZXJyaWRlIGRlZmF1bHQgc2NvcGVzOyByZXF1" + + "aXJlcyBgLS1mb3JgIHwgKHNlcnZpY2UgZGVmYXVsdHMpIHwKfCBgLS12YWxpZGF0ZWAgfCBWYWxp" + + "ZGF0ZSBlYWNoIGdlbmVyYXRlZCBrZXkgaW1tZWRpYXRlbHkgYWZ0ZXIgbWludGluZyB8IGBmYWxz" + + "ZWAgfAoKRXh0ZW5kZWQgZHVyYXRpb24gdW5pdHM6IGBzYCAoc2Vjb25kcyksIGBtYCAobWludXRl" + + "cyksIGBoYCAoaG91cnMpLCBgZGAgKGRheXMpLCBgd2AgKHdlZWtzKS4KCiMjIGBmdW5jdGlvbiBj" + + "cmVhdGVgLXNwZWNpZmljCgpgLS1pbnB1dC1maWxlIEZJTEVgIGlzIHJlY29tbWVuZGVkIGZvciBy" + + "ZXBlYXRhYmxlIGZ1bmN0aW9uIGRlZmluaXRpb25zLiBGb3IgYWQtaG9jIGNyZWF0ZXM6Cgp8IEZs" + + "YWcgfCBQdXJwb3NlIHwgRGVmYXVsdCB8CnwtLS18LS0tfC0tLXwKfCBgLS1uYW1lIE5BTUVgIHwg" + + "RnVuY3Rpb24gbmFtZSB8IC0gfAp8IGAtLWltYWdlIElNQUdFYCB8IENvbnRhaW5lciBpbWFnZSB8" + + "IC0gfAp8IGAtLWluZmVyZW5jZS11cmwgVVJJYCB8IENvbnRhaW5lciBpbmZlcmVuY2UgZW5kcG9p" + + "bnQgfCAtIHwKfCBgLS1pbmZlcmVuY2UtcG9ydCBQT1JUYCB8IENvbnRhaW5lciBpbmZlcmVuY2Ug" + + "cG9ydCB8IC0gfAp8IGAtLWZ1bmN0aW9uLXR5cGUgREVGQVVMVFx8U1RSRUFNSU5HXHxMTE1gIHwg" + + "RnVuY3Rpb24gdHlwZSB8IGBERUZBVUxUYCB8CnwgYC0taGVsbS1jaGFydCBDSEFSVGAgfCBIZWxt" + + "IGNoYXJ0IFVSTCBvciBPQ0kgcmVmZXJlbmNlLiBDYW4gYmUgdXNlZCB3aXRoIGAtLWZ1bmN0aW9u" + + "LXR5cGU9TExNYCBmb3IgY2hhcnQtcGFja2FnZWQgTExNIHdvcmtsb2Fkcy4gfCAtIHwKfCBgLS1o" + + "ZWxtLWNoYXJ0LXNlcnZpY2UgTkFNRWAgfCBLdWJlcm5ldGVzIFNlcnZpY2UgbmFtZSBleHBvc2Vk" + + "IGJ5IHRoZSBjaGFydC4gUmVxdWlyZWQgd2hlbiBgLS1oZWxtLWNoYXJ0YCBpcyBzZXQuIHwgLSB8" + + "CnwgYC0tbW9kZWxzIE5BTUU6VkVSU0lPTjpVUklgIHwgU3RhbmRhcmQgbW9kZWwgYXJ0aWZhY3Q7" + + "IHJlcGVhdGFibGUgfCAtIHwKfCBgLS1sbG0tbW9kZWwgU1BFQ2AgfCBMTE0gbW9kZWwgY29uZmln" + + "OyBmb3JtYXQgYG5hbWU9PG1vZGVsPix1cmlzPTx1cmk+XHw8dXJpPixyb3V0aW5nTWV0aG9kPTxt" + + "ZXRob2Q+LHRva2VuUmF0ZUxpbWl0PTxsaW1pdD5gOyByZXBlYXRhYmxlLiBUb2tlbiBsaW1pdHMg" + + "dXNlIGA8dmFsdWU+LTx1bml0PmAgd2l0aCBgU2AsIGBNYCwgYEhgLCBgRGAsIG9yIGBXYCwgZm9y" + + "IGV4YW1wbGUgYDEwMDAtU2AuIFVzZSBpbnB1dCBKU09OIGZvciBjb21iaW5lZCB0b2tlbiBsaW1p" + + "dHMgYmVjYXVzZSBpbmxpbmUgc3BlY3MgdXNlIGNvbW1hcyBhcyBmaWVsZCBzZXBhcmF0b3JzLiB8" + + "IC0gfAp8IGAtLWxsbS1kZWZhdWx0LXByaW9yaXR5IFBSSU9SSVRZYCB8IEZ1bmN0aW9uLWxldmVs" + + "IGRlZmF1bHQgcmVxdWVzdCBwcmlvcml0eS4gTG93ZXIgdmFsdWVzIGhhdmUgaGlnaGVyIHByaW9y" + + "aXR5LiB8IC0gfAp8IGAtLWxsbS1wZXItYWNjb3VudC1wcmlvcml0eSBOQ0EtSUQ6UFJJT1JJVFlg" + + "IHwgUGVyLWFjY291bnQgcHJpb3JpdHkgb3ZlcnJpZGU7IHJlcGVhdGFibGU7IHN1cHBvcnRzIHVw" + + "IHRvIDY0IGRpc3RpbmN0IE5DQSBJRCBvdmVycmlkZXMuIFJlcXVpcmVzIGEgZGVmYXVsdCBwcmlv" + + "cml0eS4gfCAtIHwKCkluIEpTT04gYW5kIGlubGluZSBzcGVjcywgTExNIGZ1bmN0aW9ucyBzZXQg" + + "YGZ1bmN0aW9uVHlwZTogIkxMTSJgIGFuZCBtb2RlbCByb3V0aW5nIG1ldGFkYXRhIHVuZGVyIGBt" + + "b2RlbHNbXS5sbG1Db25maWdgLiBgbGxtQ29uZmlnLnVyaXNgIGRlY2xhcmVzIHRoZSBPcGVuQUkt" + + "Y29tcGF0aWJsZSB1cHN0cmVhbSBwYXRocyBleHBvc2VkIGJ5IHRoZSBtb2RlbC4gQ3VycmVudCBz" + + "dXBwb3J0ZWQgcGF0aHMgYXJlIGAvdjEvY2hhdC9jb21wbGV0aW9uc2AsIGAvdjEvcmVzcG9uc2Vz" + + "YCwgYW5kIGAvdjEvZW1iZWRkaW5nc2AuIGBsbG1Db25maWcucm91dGluZ01ldGhvZGAgYWNjZXB0" + + "cyBgcm91bmRfcm9iaW5gLCBgcG93ZXJfb2ZfdHdvYCwgYGdyb3FfbXVsdGlyZWdpb25gLCBgcHVs" + + "c2FyYCwgb3IgYHJhbmRvbWAuCmBsbG1Db25maWcudG9rZW5SYXRlTGltaXRgIGFjY2VwdHMgb25l" + + "IG9yIG1vcmUgY29tbWEtc2VwYXJhdGVkIHBvc2l0aXZlIGludGVnZXIgdG9rZW4gbGltaXRzIGlu" + + "IGA8dmFsdWU+LTx1bml0PmAgZm9ybWF0LiBTdXBwb3J0ZWQgdW5pdHMgYXJlIGBTYCAoc2Vjb25k" + + "cyksIGBNYCAobWludXRlcyksIGBIYCAoaG91cnMpLCBgRGAgKGRheXMpLCBhbmQgYFdgICh3ZWVr" + + "cykuIFVzZSBkaXN0aW5jdCB1bml0cyB3aGVuIGNvbWJpbmluZyBsaW1pdHMsIGZvciBleGFtcGxl" + + "IGAxMDAwLVMsNTAwMC1NLDEwMDAwMC1ILDUwMDAwMC1ELDEwMDAwMDAtV2AgaW4gaW5wdXQgSlNP" + + "Ti4KCkhlbG0gY2hhcnQgcGFja2FnaW5nIGlzIGluZGVwZW5kZW50IG9mIGBmdW5jdGlvblR5cGVg" + + "LiBGb3IgYSBIZWxtLWNoYXJ0IGJhY2tlZCBMTE0gZnVuY3Rpb24sIHNldCBgZnVuY3Rpb25UeXBl" + + "OiAiTExNImAsIGBoZWxtQ2hhcnRgLCBgaGVsbUNoYXJ0U2VydmljZU5hbWVgLCBhbmQgYG1vZGVs" + + "c1tdLmxsbUNvbmZpZ2AgaW4gdGhlIHNhbWUgY3JlYXRlIHJlcXVlc3QuIGBpbmZlcmVuY2VQb3J0" + + "YCBtdXN0IGJlIHRoZSBLdWJlcm5ldGVzIFNlcnZpY2UgcG9ydCBleHBvc2VkIGJ5IGBoZWxtQ2hh" + + "cnRTZXJ2aWNlTmFtZWAuCgpMTE0gaW52b2NhdGlvbiByZXF1ZXN0cyB1c2UgYG1vZGVsOiAiPGZ1" + + "bmN0aW9uLWlkPi88bW9kZWwtbmFtZT4iYC4gVGhlIGZ1bmN0aW9uIElEIHNlbGVjdHMgdGhlIE5W" + + "Q0YgZnVuY3Rpb24sIGFuZCB0aGUgbW9kZWwgbmFtZSBpcyBmb3J3YXJkZWQgdXBzdHJlYW0uIENo" + + "YXQgY29tcGxldGlvbnMgYW5kIFJlc3BvbnNlcyBBUEkgcmVxdWVzdHMgY2FuIHVzZSBgeC1tdWx0" + + "aS10dXJuLXNlc3Npb24taWRgIGZvciBzZXNzaW9uIHN0aWNraW5lc3M7IGVtYmVkZGluZ3MgcmVx" + + "dWVzdHMgZG8gbm90LgoKIyMgYGZ1bmN0aW9uIHVwZGF0ZWAtc3BlY2lmaWMKCnwgRmxhZyB8IFB1" + + "cnBvc2UgfCBEZWZhdWx0IHwKfC0tLXwtLS18LS0tfAp8IGAtLXRhZ3MgVEFHWyxUQUddYCB8IFJl" + + "cGxhY2UgZnVuY3Rpb24gdGFncyB8IC0gfAp8IGAtLWxsbS1tb2RlbC11cGRhdGUgU1BFQ2AgfCBM" + + "TE0gbW9kZWwgdXBkYXRlOyBmb3JtYXQgYG5hbWU9PG1vZGVsPixyb3V0aW5nTWV0aG9kPTxtZXRo" + + "b2Q+LHRva2VuUmF0ZUxpbWl0PTxsaW1pdD5gOyByZXBlYXRhYmxlLiBSb3V0aW5nIG1ldGhvZHMg" + + "bWF0Y2ggYC0tbGxtLW1vZGVsYC4gVG9rZW4gbGltaXQgZXhhbXBsZTogYDEwMDAtU2AuIFVzZSBp" + + "bnB1dCBKU09OIGZvciBjb21iaW5lZCB0b2tlbiBsaW1pdHMuIHwgLSB8CnwgYC0tbGxtLWRlZmF1" + + "bHQtcHJpb3JpdHkgUFJJT1JJVFlgIHwgUmVwbGFjZSB0aGUgZnVuY3Rpb24tbGV2ZWwgcHJpb3Jp" + + "dHkgY29uZmlndXJhdGlvbiB3aXRoIHRoaXMgZGVmYXVsdCBhbmQgYW55IHN1cHBsaWVkIHBlci1h" + + "Y2NvdW50IG92ZXJyaWRlcy4gfCAtIHwKfCBgLS1sbG0tcGVyLWFjY291bnQtcHJpb3JpdHkgTkNB" + + "LUlEOlBSSU9SSVRZYCB8IFBlci1hY2NvdW50IHByaW9yaXR5IG92ZXJyaWRlOyByZXBlYXRhYmxl" + + "OyBzdXBwb3J0cyB1cCB0byA2NCBkaXN0aW5jdCBOQ0EgSUQgb3ZlcnJpZGVzLiBSZXF1aXJlcyBh" + + "IGRlZmF1bHQgcHJpb3JpdHkuIHwgLSB8CgpJbiBKU09OLCBgZnVuY3Rpb24gdXBkYXRlYCBhY2Nl" + + "cHRzIGBtb2RlbFVwZGF0ZXNbXWAgZW50cmllcyB3aXRoIGBtb2RlbE5hbWVgIGFuZCBgbGxtQ29u" + + "ZmlnLnJvdXRpbmdNZXRob2RgIGFuZC9vciBgbGxtQ29uZmlnLnRva2VuUmF0ZUxpbWl0YC4gYHVy" + + "aXNgIGFyZSBjcmVhdGUtdGltZSBtb2RlbCBtZXRhZGF0YSBhbmQgYXJlIG5vdCBwYXJ0IG9mIG1v" + + "ZGVsIHVwZGF0ZXMuCgojIyBgZnVuY3Rpb24gZGVwbG95IGNyZWF0ZWAtc3BlY2lmaWMKCmAtLWlu" + + "cHV0LWZpbGUgRklMRWAgaXMgcmVjb21tZW5kZWQgKGZ1bGwgSlNPTiBzcGVjKS4gRm9yIGFkLWhv" + + "YyBvbmUtc2hvdCB1c2U6Cgp8IEZsYWcgfCBQdXJwb3NlIHwgRGVmYXVsdCB8CnwtLS18LS0tfC0t" + + "LXwKfCBgLS1mdW5jdGlvbi1pZCBJRGAgfCBGdW5jdGlvbiBJRCAocmVxdWlyZWQpIHwgLSB8Cnwg" + + "YC0tZ3B1IE5BTUVgIHwgR1BVIGZhbWlseSB8IGBIMTAwYCB8CnwgYC0taW5zdGFuY2UtdHlwZSBU" + + "WVBFYCB8IFNLVSB8IGBOQ1AuR1BVLkgxMDBfMXhgIHwKfCBgLS1taW4taW5zdGFuY2VzIE5gIHwg" + + "TWluIHJlcGxpY2FzIHwgYDFgIHwKfCBgLS1tYXgtaW5zdGFuY2VzIE5gIHwgTWF4IHJlcGxpY2Fz" + + "IHwgYDFgIHwKfCBgLS1tYXgtcmVxdWVzdC1jb25jdXJyZW5jeSBOYCB8IENvbmN1cnJlbmN5IHwg" + + "YDBgICh1bnNldDsgc2VydmVyIGRlZmF1bHQgYXBwbGllcykgfAp8IGAtLWNsdXN0ZXJzIE5BTUVb" + + "LE5BTUVdYCB8IFRhcmdldCBzcGVjaWZpYyBjb21wdXRlIGNsdXN0ZXJzIHwgKGFueSBtYXRjaGlu" + + "ZyBTS1UpIHwKCiMjIGB0YXNrIGNyZWF0ZWAtc3BlY2lmaWMKCmAtLWlucHV0LWZpbGUgRklMRWAg" + + "aXMgcmVjb21tZW5kZWQgZm9yIHJlcGVhdGFibGUgdGFzayBkZWZpbml0aW9ucy4gRm9yIGFkLWhv" + + "YyB1c2U6Cgp8IEZsYWcgfCBQdXJwb3NlIHwgTm90ZXMgfAp8LS0tfC0tLXwtLS18CnwgYC0tbmFt" + + "ZSBOQU1FYCB8IFRhc2sgbmFtZSAocmVxdWlyZWQpIHwgMS0xMjggY2hhcnMsIGBeW2EtejAtOUEt" + + "Wl1bYS16MC05QS1aXC1fXSokYCB8CnwgYC0tZ3B1IEdQVWAgfCBHUFUgbmFtZSAocmVxdWlyZWQg" + + "d2l0aG91dCBgLS1pbnB1dC1maWxlYCkgfCBFeGFtcGxlOiBgSDEwMGAgfAp8IGAtLWluc3RhbmNl" + + "LXR5cGUgVFlQRWAgfCBJbnN0YW5jZSB0eXBlIChyZXF1aXJlZCB3aXRob3V0IGAtLWlucHV0LWZp" + + "bGVgKSB8IEV4YW1wbGU6IGBOQ1AuR1BVLkgxMDBfMXhgIHwKfCBgLS1pbWFnZSBJTUFHRWAgfCBD" + + "b250YWluZXIgaW1hZ2UgfCBNdXR1YWxseSBleGNsdXNpdmUgd2l0aCBgLS1oZWxtLWNoYXJ0YCB8" + + "CnwgYC0taGVsbS1jaGFydCBDSEFSVGAgfCBIZWxtIGNoYXJ0IFVSTCBvciBPQ0kgcmVmZXJlbmNl" + + "IHwgTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYC0taW1hZ2VgIHwKfCBgLS1pbnB1dC1maWxlIEZJ" + + "TEVgIHwgSlNPTiB0YXNrIHNwZWMgZmlsZSB8IENMSSBmbGFncyBvdmVycmlkZSBKU09OIHZhbHVl" + + "cyB3aGVuIGJvdGggYXJlIHNldCB8CnwgYC0tYmFja2VuZCBCQUNLRU5EYCB8IEJhY2tlbmQgLyBD" + + "U1AgfCAtIHwKfCBgLS1jbHVzdGVycyBOQU1FWyxOQU1FXWAgfCBTcGVjaWZpYyBjbHVzdGVycyB3" + + "aXRoaW4gdGhlIGluc3RhbmNlIHwgQ29tbWEtc2VwYXJhdGVkIHwKfCBgLS1jb250YWluZXItYXJn" + + "cyBBUkdTYCB8IEFyZ3MgcGFzc2VkIHdoZW4gbGF1bmNoaW5nIHRoZSBjb250YWluZXIgfCBTaW5n" + + "bGUgc3RyaW5nLCBlLmcuIGAiLS1lcG9jaHMgMTAgLS1iYXRjaC1zaXplIDMyImAgfAp8IGAtLWNv" + + "bnRhaW5lci1lbnYgTkFNRT12YWx1ZWAgfCBDb250YWluZXIgZW52aXJvbm1lbnQgdmFyaWFibGU7" + + "IHJlcGVhdGFibGUgfCAtIHwKfCBgLS1zZWNyZXRzIE5BTUU9dmFsdWVgIHwgU2VjcmV0IGVudmly" + + "b25tZW50IHZhcmlhYmxlOyByZXBlYXRhYmxlOyBlbmNyeXB0ZWQgYXQgcmVzdCB8IC0gfAp8IGAt" + + "LW1heC1ydW50aW1lIERVUkFUSU9OYCB8IE1heCB3YWxsLWNsb2NrIHJ1biB0aW1lIChJU08gODYw" + + "MSwgZS5nLiBgUFQ0SGApIHwgTm8gZGVmYXVsdDsgb21pdCBmb3Igbm8gdGltZSBsaW1pdCB8Cnwg" + + "YC0tbWF4LXF1ZXVlZCBEVVJBVElPTmAgfCBNYXggdGltZSBpbiBxdWV1ZSBiZWZvcmUgY2FuY2Vs" + + "bGF0aW9uIChJU08gODYwMSkgfCBTZXJ2ZXIgZGVmYXVsdCBgUFQ3MkhgIHwKfCBgLS10ZXJtaW5h" + + "dGlvbi1ncmFjZSBEVVJBVElPTmAgfCBHcmFjZSBwZXJpb2QgYWZ0ZXIgc3RvcCBzaWduYWwgKElT" + + "TyA4NjAxKSB8IFNlcnZlciBkZWZhdWx0IGBQVDFIYCB8CnwgYC0tcmVzdWx0LXN0cmF0ZWd5IFVQ" + + "TE9BRFx8Tk9ORWAgfCBIb3cgdG8gaGFuZGxlIHRhc2sgb3V0cHV0IGFydGlmYWN0cyB8IC0gfAp8" + + "IGAtLXJlc3VsdHMtbG9jYXRpb24gTE9DQVRJT05gIHwgUmVzdWx0IHVwbG9hZCB0YXJnZXQsIGZv" + + "cm1hdCBgb3JnLW5hbWUvW3RlYW0tbmFtZS9dbW9kZWwtbmFtZWA7IHJlcXVpcmVkIHdoZW4gYC0t" + + "cmVzdWx0LXN0cmF0ZWd5PVVQTE9BRGAgfCAtIHwKfCBgLS1tb2RlbHMgTkFNRTpWRVJTSU9OOlVS" + + "SWAgfCBNb2RlbCBhcnRpZmFjdDsgcmVwZWF0YWJsZSB8IC0gfAp8IGAtLXJlc291cmNlcyBOQU1F" + + "OlZFUlNJT046VVJJYCB8IFJlc291cmNlIGFydGlmYWN0OyByZXBlYXRhYmxlIHwgLSB8CnwgYC0t" + + "dGFncyBUQUdbLFRBR11gIHwgVGFzayB0YWdzIHwgQ29tbWEtc2VwYXJhdGVkIHwKfCBgLS1kZXNj" + + "cmlwdGlvbiBURVhUYCB8IFRhc2sgZGVzY3JpcHRpb24gfCAtIHwKfCBgLS1sb2dzLXRlbGVtZXRy" + + "eS1pZCBVVUlEYCB8IExvZ3MgdGVsZW1ldHJ5IGVuZHBvaW50IElEIHwgLSB8CnwgYC0tbWV0cmlj" + + "cy10ZWxlbWV0cnktaWQgVVVJRGAgfCBNZXRyaWNzIHRlbGVtZXRyeSBlbmRwb2ludCBJRCB8IC0g" + + "fAp8IGAtLXRyYWNlcy10ZWxlbWV0cnktaWQgVVVJRGAgfCBUcmFjZXMgdGVsZW1ldHJ5IGVuZHBv" + + "aW50IElEIHwgLSB8ClBLBwiZ0OJQFy4AABcuAABQSwMEFAAIAAAAAAAhAAAAAAAAAAAAAAAAADcA" + + "CQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9yZWZlcmVuY2UvdHJvdWJsZXNob290aW5nLm1k" + + "VVQFAAEAps4SIyBUcm91Ymxlc2hvb3RpbmcKCktub3duIGVycm9ycyDihpIgZGlhZ25vc3RpYyBj" + + "b21tYW5kIOKGkiByZW1lZGlhdGlvbi4gS2VlcCBpbiBzeW5jIHdpdGggdGhlIHN0cnVjdHVyZWQg" + + "YHBoYXNlX2ZhaWxlZGAgZXZlbnRzIHRoZSBDTEkgZW1pdHMgKFJFUS0xNSkg4oCUIGV2ZXJ5IGVu" + + "dHJ5IGJlbG93IHNob3VsZCBtYXAgdG8gYW4gYGVyckNhdGVnb3J5YCBhbmQgYSBgcmVtZWRpYXRp" + + "b25gIGFycmF5LgoKIyMgUHJlLWZsaWdodAoKfCBTeW1wdG9tIHwgQ2F1c2UgfCBSZW1lZGlhdGlv" + + "biB8CnwtLS18LS0tfC0tLXwKfCBga3ViZWN0bCBub3Qgb24gUEFUSGAgfCBPcGVyYXRvcidzIGAk" + + "UEFUSGAgZG9lc24ndCBpbmNsdWRlIGt1YmVjdGwgfCBJbnN0YWxsIGt1YmVjdGwgMS4yOCs6IGh0" + + "dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL3Rhc2tzL3Rvb2xzL2luc3RhbGwta3ViZWN0bC8gfAp8" + + "IGBoZWxtZmlsZSBub3Qgb24gUEFUSGAgfCBTYW1lIHwgaHR0cHM6Ly9naXRodWIuY29tL2hlbG1m" + + "aWxlL2hlbG1maWxlI2luc3RhbGxhdGlvbiB8CnwgYGhlbG0gbm90IG9uIFBBVEhgIHwgU2FtZSB8" + + "IGh0dHBzOi8vaGVsbS5zaC9kb2NzL2ludHJvL2luc3RhbGwvIHwKfCBgR2F0ZXdheSBBUEkgQ1JE" + + "cyBub3QgaW5zdGFsbGVkYCB8IGVudm95LWdhdGV3YXkgcHJlcmVxIG1pc3NpbmcgfCBgaGVsbSBp" + + "bnN0YWxsIGVnIG9jaTovL2RvY2tlci5pby9lbnZveXByb3h5L2dhdGV3YXktaGVsbSAtLW5hbWVz" + + "cGFjZT1lbnZveS1nYXRld2F5LXN5c3RlbSAtLWNyZWF0ZS1uYW1lc3BhY2VgIHwKfCBgZGVmYXVs" + + "dCBTdG9yYWdlQ2xhc3Mgbm90IGF2YWlsYWJsZWAgfCBDbHVzdGVyIGhhcyBubyBkZWZhdWx0IFND" + + "IHwgQW5ub3RhdGUgb25lOiBga3ViZWN0bCBwYXRjaCBzYyA8bmFtZT4gLXAgJ3sibWV0YWRhdGEi" + + "OnsiYW5ub3RhdGlvbnMiOnsic3RvcmFnZWNsYXNzLmt1YmVybmV0ZXMuaW8vaXMtZGVmYXVsdC1j" + + "bGFzcyI6InRydWUifX19J2AgfAp8IGBHUFUgb3BlcmF0b3Igbm90IGluc3RhbGxlZGAgKGNvbXB1" + + "dGUtcGxhbmUpIHwgbnZpZGlhIEdQVSBvcGVyYXRvciBtaXNzaW5nIHwgSW5zdGFsbCBwZXIgaHR0" + + "cHM6Ly9kb2NzLm52aWRpYS5jb20vZGF0YWNlbnRlci9jbG91ZC1uYXRpdmUvZ3B1LW9wZXJhdG9y" + + "L2xhdGVzdC9pbnN0YWxsLWdwdS1vcGVyYXRvci5odG1sLCBPUiB1c2UgYGZha2UtZ3B1LW9wZXJh" + + "dG9yYCBmb3IgZGV2IHwKfCBgR1BVIG5vZGUgbGFiZWxzIG1pc3NpbmdgIChjb21wdXRlLXBsYW5l" + + "KSB8IE5vZGVzIG5lZWQgYG52aWRpYS5jb20vZ3B1LmZhbWlseWAgZXRjLiB8IFNldCBgLS1rM3Mt" + + "bm9kZS1sYWJlbCBudmlkaWEuY29tL2dwdS5mYW1pbHk9aG9wcGVyQGFnZW50Ok5gIGZvciBrM2Qg" + + "fAoKIyMgQXV0aAoKfCBTeW1wdG9tIHwgQ2F1c2UgfCBSZW1lZGlhdGlvbiB8CnwtLS18LS0tfC0t" + + "LXwKfCBgYWRtaW4gdG9rZW4gcmVxdWlyZWRgIChpbml0IG5vdCBydW4pIHwgTm8gYH4vLm52Y2Yt" + + "Y2xpLnN0YXRlYCBhbmQgYC0tdG9rZW5gIG5vdCBwYXNzZWQgfCBgbnZjZi1jbGkgaW5pdGAgKGlu" + + "dGVyYWN0aXZlKSBvciBgLS10b2tlbj0kSldUIC0tbm9uLWludGVyYWN0aXZlYCAoQ0kpIHwKfCBg" + + "U2lnbmVkIEpXVCByZWplY3RlZDogQW5vdGhlciBhbGdvcml0aG0gZXhwZWN0ZWQsIG9yIG5vIG1h" + + "dGNoaW5nIGtleShzKSBmb3VuZGAgfCBTdGFsZSBzZXNzaW9uLmpzb24gZnJvbSBhIGRpZmZlcmVu" + + "dCBjb250cm9sIHBsYW5lIHwgYHJtIH4vLm52Y2YtY2xpLnN0YXRlYCB0aGVuIGBudmNmLWNsaSBp" + + "bml0YCBhZ2FpbiB8CnwgYDQwMyBtaXNzaW5nIHJlcXVlc3RlZCBhdXRob3JpdGllc2AgKGZ1bmN0" + + "aW9uIGludm9rZSkgfCBBZG1pbiB0b2tlbiBkb2Vzbid0IGhhdmUgYGludm9rZV9mdW5jdGlvbmAg" + + "c2NvcGUgfCBgbnZjZi1jbGkgYXBpLWtleSBnZW5lcmF0ZSAtLWRlc2NyaXB0aW9uPeKApmAgdGhl" + + "biByZS1ydW4gaW52b2tlIHwKCiMjIEluc3RhbGwgLyBgdXBgCgp8IFN5bXB0b20gfCBDYXVzZSB8" + + "IFJlbWVkaWF0aW9uIHwKfC0tLXwtLS18LS0tfAp8IEhlbG0gYHRpbWVkIG91dCB3YWl0aW5nIGZv" + + "ciBjYXNzYW5kcmFgIHwgQ2Fzc2FuZHJhIFN0YXRlZnVsU2V0IFBWQyBzdHVjayBgUGVuZGluZ2Ag" + + "fCBDb25maXJtIGRlZmF1bHQgU3RvcmFnZUNsYXNzOyBjaGVjayBga3ViZWN0bCBnZXQgcHYscHZj" + + "IC1uIGNhc3NhbmRyYS1zeXN0ZW1gIHwKfCBgSW52YWxpZCBHUFUgJ05DUC5HUFUuSDEwMCcgc3Bl" + + "Y2lmaWVkYCAoZnVuY3Rpb24gZGVwbG95KSB8IFdyb25nIGZpZWxkIOKAlCBgZ3B1YCBpcyB0aGUg" + + "ZmFtaWx5LCBub3QgdGhlIFNLVSB8IFVzZSBgImdwdSI6ICJIMTAwImAsIGAiaW5zdGFuY2VUeXBl" + + "IjogIk5DUC5HUFUuSDEwMF8xeCJgIHwKfCBgcmVnaW9uIG11c3QgYmUgcHJvdmlkZWRgIChjbHVz" + + "dGVyIHJlZ2lzdGVyIC8gaW5zdGFsbCAtLWNvbXB1dGUtcGxhbmUpIHwgYC0tcmVnaW9uYCBlbXB0" + + "eSArIGBDTFVTVEVSX1JFR0lPTmAgZW52IGVtcHR5IHwgUGFzcyBgLS1yZWdpb249dXMtd2VzdC0x" + + "YCAob3IgYW55IG5vbi1lbXB0eSB2YWx1ZSkgfAp8IGByZXF1aXJlZEVudiAiTkNBX0lEIiBpcyBu" + + "b3Qgc2V0YCAoaGVsbWZpbGUgZXJyb3IgZHVyaW5nIGNvbXB1dGUtcGxhbmUgYXBwbHkpIHwgT2xk" + + "ZXIgbnZjZi1jbGkgYmVmb3JlIGNvbW1pdCBgNmFhNTcwNGA7IEV4dHJhRW52IG5vdCBwcm9wYWdh" + + "dGluZyBOQ0FfSUQgfCBVcGdyYWRlIGBudmNmLWNsaWAgdG8gYSByZWxlYXNlIGFmdGVyIGA2YWE1" + + "NzA0YCB8CnwgYG52Y2Etb3BlcmF0b3I6IEltYWdlUHVsbEJhY2tPZmZgIGZvciBgbnZjYS1vcGVy" + + "YXRvcjpwc2F0YCB8IEltYWdlIG5vdCBpbiBjbHVzdGVyIHJlZ2lzdHJ5OyBtdWx0aS1jbHVzdGVy" + + "IGJ1aWxkIGlzIGxvY2FsIHwgYGszZCBpbWFnZSBpbXBvcnQgbnZjci5pby8uLi4vbnZjYS1vcGVy" + + "YXRvcjpwc2F0IC1jIDxjbHVzdGVyPmAgfAoKIyMgQ29tcHV0ZS1wbGFuZSBydW50aW1lCgp8IFN5" + + "bXB0b20gfCBDYXVzZSB8IFJlbWVkaWF0aW9uIHwKfC0tLXwtLS18LS0tfAp8IE5WQ0EgYWdlbnQg" + + "Q3Jhc2hMb29wQmFja09mZiB3aXRoIGBIVFRQIDQwMWAgb24gYC92MS9udmNhL2NsdXN0ZXJzLy4u" + + "Li9yZWdpc3RlcmAgfCBTdGFsZSBgb3V0LzxjbHVzdGVyPi1yZWdpc3Rlci12YWx1ZXMueWFtbGAg" + + "ZnJvbSBwcmlvciByZWdpc3RlcjsgY2x1c3RlciBJRCBkb2Vzbid0IG1hdGNoIElDTVMgfCBEZWxl" + + "dGUgdGhlIHN0YWxlIGZpbGU7IHJlLXJ1biBgbnZjZi1jbGkgc2VsZi1ob3N0ZWQgdXBgIChpZGVt" + + "cG90ZW50IHJlZ2lzdGVyIHdyaXRlcyBhIGZyZXNoIGZpbGUpIHwKfCBgTm8gY2x1c3RlciBmb3Vu" + + "ZCB3aXRoIHZhbGlkIEpXS1MgZm9yIGNsdXN0ZXIgSUQ6IDxpZD5gIChJQ01TIGxvZykgfCBKV0tT" + + "IGluIElDTVMgZG9lc24ndCBtYXRjaCB3aGF0IGNvbXB1dGUtcGxhbmUgSzhzIGlzIGN1cnJlbnRs" + + "eSBzaWduaW5nIHwgYG52Y2YtY2xpIGNsdXN0ZXIgcm90YXRlIC0tY2x1c3Rlci1pZD08aWQ+YCB8" + + "CnwgRnVuY3Rpb24gcG9kIGBJbWFnZVB1bGxCYWNrT2ZmYCBpbiBgbnZjZi1iYWNrZW5kYCB8IElt" + + "YWdlLWNyZWRlbnRpYWwtaGVscGVyIGNvbmZpZyBtaXNzaW5nIG9yIHdyb25nIHwgYGt1YmVjdGwg" + + "ZGVzY3JpYmUgcG9kIC1uIG52Y2YtYmFja2VuZCA8cG9kPmA7IGNoZWNrIHRoZSBwdWxsIHNlY3Jl" + + "dCBjb25maWcgfAp8IEZ1bmN0aW9uIGRlcGxveSBzdHVjayBgREVQTE9ZSU5HYCBmb3IgPjUgbWlu" + + "IHwgTkFUUyBzdHJlYW0gaW5pdCBsYWcgKGNvbGQtY2x1c3Rlcikg4oCUIHdhaXQsIG9yIGNoZWNr" + + "IE5BVFMgYXV0aC1jYWxsb3V0IGhlYWx0aCB8IGBrdWJlY3RsIGxvZ3MgLW4gbmF0cy1zeXN0ZW0g" + + "LWwgYXBwLmt1YmVybmV0ZXMuaW8vbmFtZT1uYXRzLWF1dGgtY2FsbG91dC1zZXJ2aWNlYCB8Cgoj" + + "IyBUYXNrcwoKfCBTeW1wdG9tIHwgQ2F1c2UgfCBSZW1lZGlhdGlvbiB8CnwtLS18LS0tfC0tLXwK" + + "fCBgdGFzayBjcmVhdGVgIHJldHVybnMgYE1pc3NpbmcgPFRZUEU+IHJlZ2lzdHJ5IGNyZWRlbnRp" + + "YWwgZm9yIGhvc3RuYW1lYCwgb3Iga2VlcHMgdXNpbmcgYSBwcmV2aW91cyBjcmVkZW50aWFsIHZh" + + "bHVlLCBzaG9ydGx5IGFmdGVyIGByZWdpc3RyeS1jcmVkZW50aWFsIGFkZC91cGRhdGUvZGVsZXRl" + + "YCB3aGlsZSBgcmVnaXN0cnktY3JlZGVudGlhbCBsaXN0YC9gZ2V0YCBhbHJlYWR5IHNob3cgdGhl" + + "IG5ldyB2YWx1ZSB8IEV4cGVjdGVkIHByb3BhZ2F0aW9uIGRlbGF5OiBOVkNUIGNhY2hlcyB0aGUg" + + "YWNjb3VudCdzIHJlZ2lzdHJ5IGNyZWRlbnRpYWxzIHdpdGggYG52Y3QubnZjZi5jYWNoZS10dGxg" + + "IChkZWZhdWx0IGBQVDVNYCwgYWJvdXQgNSBtaW4pIGFuZCBhcHBsaWVzIHRoZSBjaGFuZ2Ugd2hl" + + "biB0aGF0IGNhY2hlZCBjb3B5IHJlZnJlc2hlcyB8IFdhaXQgdXAgdG8gYWJvdXQgNSBtaW4gYW5k" + + "IHJldHJ5LCBvciBga3ViZWN0bCAtbiBudmNmIHJvbGxvdXQgcmVzdGFydCBkZXBsb3ltZW50L252" + + "Y3QtYXBpYCB0byBhcHBseSBpbW1lZGlhdGVseSB8ClBLBwjzrhOEdBEAAHQRAABQSwMEFAAIAAAA" + + "AAAhAAAAAAAAAAAAAAAAACwACQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbi9T" + + "S0lMTC5tZFVUBQABAKbOEi0tLQpuYW1lOiBudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24K" + + "ZGVzY3JpcHRpb246ID4tCiAgSW5zdGFsbCBhbmQgb3BlcmF0ZSBOVkNGIHNlbGYtaG9zdGVkIGNv" + + "bnRyb2wtcGxhbmUgYW5kIHNlcGFyYXRlIGNvbXB1dGUtcGxhbmUKICBzdGFja3MuIENvdmVycyBI" + + "ZWxtZmlsZSB2YWx1ZXMgYW5kIENMSSBwcm9maWxlIGluc3RhbGxhdGlvbiBmbG93cywgdGVhcmRv" + + "d24sCiAgdmFsdWVzIG92ZXJyaWRlcywgcHVsbCBzZWNyZXRzLCBhbmQgdHJvdWJsZXNob290aW5n" + + "LiBVc2UgZm9yCiAgbnZjZi1zZWxmLW1hbmFnZWQtc3RhY2ssIG52Y2YtY29tcHV0ZS1wbGFuZS1z" + + "dGFjaywgc3BsaXQgY29tcHV0ZS1wbGFuZQogIGluc3RhbGxhdGlvbiwgY29udHJvbC1wbGFuZSBp" + + "bnN0YWxsYXRpb24sIENMSS1nZW5lcmF0ZWQgY29udHJvbC1wbGFuZQogIHByb2ZpbGVzLCBIZWxt" + + "ZmlsZSwgc2VsZi1tYW5hZ2VkLCBvciBzZWxmLWhvc3RlZCBkZXBsb3ltZW50cy4gRG8gTk9UIHVz" + + "ZSBmb3IKICBsb2NhbCBrM2QgZW52aXJvbm1lbnRzOyB1c2UgdGhlIGxvY2FsIGszZCBkZXZlbG9w" + + "bWVudCB3b3JrZmxvdyBpbnN0ZWFkLgpsaWNlbnNlOiBBcGFjaGUtMi4wCmNvbXBhdGliaWxpdHk6" + + "IFJlcXVpcmVzIGhlbG1maWxlID49IDEuMS4wIDwgMS4yLjAsIGhlbG0gPj0gMy4xMiwgaGVsbS1k" + + "aWZmIHBsdWdpbiwga3ViZWN0bCBtYXRjaGluZyBjbHVzdGVyIHZlcnNpb24KYXV0aG9yOiAibnZj" + + "Zi1jb3JlLWVuZyA8bnZjZi1jb3JlLWVuZ0BleGNoYW5nZS5udmlkaWEuY29tPiIKdmVyc2lvbjog" + + "IjEuMC4wIgp0YWdzOiBbbnZjZiwgc2VsZi1tYW5hZ2VkLCBoZWxtZmlsZSwgc2VsZi1ob3N0ZWQs" + + "IGNvbnRyb2wtcGxhbmUsIGNvbXB1dGUtcGxhbmUsIGNsaS1wcm9maWxlLCBpbnN0YWxsYXRpb24s" + + "IGRlcGxveW1lbnQsIHB1bGwtc2VjcmV0c10KdG9vbHM6IFtTaGVsbCwgUmVhZCwgRWRpdCwgR3Jl" + + "cCwgR2xvYl0KbWV0YWRhdGE6CiAgaW50ZXJuYWw6IGZhbHNlCiAgYXV0aG9yOiAibnZjZi1jb3Jl" + + "LWVuZyA8bnZjZi1jb3JlLWVuZ0BleGNoYW5nZS5udmlkaWEuY29tPiIKICB2ZXJzaW9uOiAiMS4w" + + "IgogIHRhZ3M6IFtudmNmLCBzZWxmLW1hbmFnZWQsIGhlbG1maWxlLCBzZWxmLWhvc3RlZCwgY29u" + + "dHJvbC1wbGFuZSwgY29tcHV0ZS1wbGFuZSwgY2xpLXByb2ZpbGUsIGluc3RhbGxhdGlvbiwgZGVw" + + "bG95bWVudCwgcHVsbC1zZWNyZXRzXQogIGxhbmd1YWdlczogW2Jhc2gsIHlhbWxdCiAgZnJhbWV3" + + "b3JrczogW2hlbG1maWxlLCBoZWxtLCBrdWJlY3RsXQogIGRvbWFpbjogY2xvdWQtaW5mcmFzdHJ1" + + "Y3R1cmUKLS0tCgojIE5WQ0YgU2VsZi1NYW5hZ2VkIFN0YWNrIE9wZXJhdGlvbnMKCk9wZXJhdGlv" + + "bmFsIGd1aWRlIGZvciBtYXRjaGluZyBOVkNGIGNvbnRyb2wtcGxhbmUgYW5kIGNvbXB1dGUtcGxh" + + "bmUgSGVsbWZpbGUgYnVuZGxlcy4KCiMjIEluc3RydWN0aW9ucwoKVXNlIHRoaXMgc2tpbGwgZm9y" + + "IGluc3RhbGwsIHVwZ3JhZGUsIG9yIHRlYXJkb3duIHdvcmsgaW4gbWF0Y2hpbmcgYG52Y2Ytc2Vs" + + "Zi1tYW5hZ2VkLXN0YWNrYCBhbmQgYG52Y2YtY29tcHV0ZS1wbGFuZS1zdGFja2AgYnVuZGxlczsg" + + "a2VlcCBIZWxtZmlsZSB2YWx1ZXMgYW5kIENMSSBwcm9maWxlIGhhbmRvZmZzIHNlcGFyYXRlLiBG" + + "b3IgYGZ1bmN0aW9uVHlwZTogIkxMTSJgLCByZWFkIFtMTE0gRnVuY3Rpb24gRW5hYmxlbWVudF0o" + + "cmVmZXJlbmNlcy9oZWxtZmlsZS1zdHJ1Y3R1cmUubWQjbGxtLWZ1bmN0aW9uLWVuYWJsZW1lbnQp" + + "LgoKIyMgUHJlcmVxdWlzaXRlcwoKQXNrIGZvciB0aGUgZXh0cmFjdGVkIGBudmNmLXNlbGYtbWFu" + + "YWdlZC1zdGFja2AgcGF0aC4gRm9yIHNwbGl0IGluc3RhbGxhdGlvbiwKYWxzbyByZXF1aXJlIHRo" + + "ZSBtYXRjaGluZy12ZXJzaW9uIGBudmNmLWNvbXB1dGUtcGxhbmUtc3RhY2tgIHBhdGguIFZlcmlm" + + "eSBib3RoOgoKYGBgYmFzaApscyA8Y29udHJvbC1wbGFuZS1zdGFjaz4vaGVsbWZpbGUuZC8gPGNv" + + "bnRyb2wtcGxhbmUtc3RhY2s+L2Vudmlyb25tZW50cy8gPGNvbnRyb2wtcGxhbmUtc3RhY2s+L3Nl" + + "Y3JldHMvIDxjb250cm9sLXBsYW5lLXN0YWNrPi9nbG9iYWwueWFtbC5nb3RtcGwKbHMgPGNvbXB1" + + "dGUtcGxhbmUtc3RhY2s+L2hlbG1maWxlLmQvIDxjb21wdXRlLXBsYW5lLXN0YWNrPi9lbnZpcm9u" + + "bWVudHMvIDxjb21wdXRlLXBsYW5lLXN0YWNrPi9nbG9iYWwueWFtbC5nb3RtcGwKYGBgCgpJZiBl" + + "aXRoZXIgZGlyZWN0b3J5IGlzIG1pc3NpbmcsIGRvd25sb2FkIG1hdGNoaW5nIGJ1bmRsZSB2ZXJz" + + "aW9ucyBmcm9tIE5HQzoKCmBgYGJhc2gKbmdjIHJlZ2lzdHJ5IHJlc291cmNlIGRvd25sb2FkLXZl" + + "cnNpb24gPG9yZz4vbnZjZi1zZWxmLW1hbmFnZWQtc3RhY2s6PHZlcnNpb24+Cm5nYyByZWdpc3Ry" + + "eSByZXNvdXJjZSBkb3dubG9hZC12ZXJzaW9uIDxvcmc+L252Y2YtY29tcHV0ZS1wbGFuZS1zdGFj" + + "azo8dmVyc2lvbj4KYGBgCgpDb250cm9sLXBsYW5lIGNvbW1hbmRzIGJlbG93IGFzc3VtZSB0aGUg" + + "Y29udHJvbC1wbGFuZSBidW5kbGUgcm9vdC4gU3BsaXQtZmxvdwpjb21tYW5kcyBhbmQgcm9vdCBz" + + "dWJzdGl0dXRpb24gYXJlIGluCltTcGxpdCBDb21wdXRlLVBsYW5lIEluc3RhbGxhdGlvbl0ocmVm" + + "ZXJlbmNlcy9jb21wdXRlLXBsYW5lLWluc3RhbGxhdGlvbi5tZCkuCgojIyBCZWZvcmUgWW91IFN0" + + "YXJ0CgpWZXJpZnkgdG9vbGluZyBhbmQgY29udGV4dCBiZWZvcmUgYW55IG9wZXJhdGlvbjoKCmBg" + + "YGJhc2gKaGVsbWZpbGUgLS12ZXJzaW9uICAgIyBNdXN0IGJlIDEuMS54ICgxLjIuMCByZW1vdmVk" + + "IHNlcXVlbnRpYWwgbW9kZSkKaGVsbSB2ZXJzaW9uICAgICAgICAgIyBNdXN0IGJlID49IDMuMTIK" + + "aGVsbSBwbHVnaW4gbGlzdCAgICAgIyBNdXN0IGluY2x1ZGUgaGVsbS1kaWZmID49IDMuMTEKa3Vi" + + "ZWN0bCB2ZXJzaW9uICAgICAgIyBDbGllbnQgbXVzdCBiZSB3aXRoaW4gMSBtaW5vciB2ZXJzaW9u" + + "IG9mIGNsdXN0ZXIKYGBgCgpDb250cm9sLXBsYW5lIGNvbW1hbmRzIHJ1biBmcm9tIHRoZSBleHRy" + + "YWN0ZWQgYG52Y2Ytc2VsZi1tYW5hZ2VkLXN0YWNrL2Agcm9vdDoKCmBgYGJhc2gKY2QgcGF0aC90" + + "by9udmNmLXNlbGYtbWFuYWdlZC1zdGFjawpscyBoZWxtZmlsZS5kLyBlbnZpcm9ubWVudHMvIHNl" + + "Y3JldHMvIGdsb2JhbC55YW1sLmdvdG1wbApgYGAKCklkZW50aWZ5IHRoZSBlbnZpcm9ubWVudCBm" + + "cm9tIGBlbnZpcm9ubWVudHMvPG5hbWU+LnlhbWxgIGFuZApgc2VjcmV0cy88bmFtZT4tc2VjcmV0" + + "cy55YW1sYDsgZm9yIEVLUywgdXNlIHRoZSBjYW5vbmljYWwKW0NTUCBFbmQtdG8tRW5kIEV4YW1w" + + "bGVdKGh0dHBzOi8vZG9jcy5udmlkaWEuY29tL252Y2YvdjAuNi4wLXJjL2NzcC1lbmQtdG8tZW5k" + + "LWV4YW1wbGUpLgoKIyMgSG93IFZhbHVlcyBGbG93CgpVbmRlcnN0YW5kaW5nIHZhbHVlIHByZWNl" + + "ZGVuY2UgcHJldmVudHMgdGhlIG1vc3QgY29tbW9uIGNvbmZpZ3VyYXRpb24gbWlzdGFrZXMuCgpg" + + "YGB0ZXh0CmVudmlyb25tZW50cy9iYXNlLnlhbWwgICAgICAgICAgKGRlZmF1bHRzKQogICAgLT4g" + + "bWVyZ2VkIHdpdGgKZW52aXJvbm1lbnRzLzxlbnY+LnlhbWwgICAgICAgICAoeW91ciBvdmVycmlk" + + "ZXMpCiAgICAtPiBjb25zdW1lZCBieQpnbG9iYWwueWFtbC5nb3RtcGwgICAgICAgICAgICAgIChH" + + "byB0ZW1wbGF0ZSwgY29uc3RydWN0cyBwZXItY2hhcnQgdmFsdWVzKQogICAgLT4gY29uc3VtZWQg" + + "YnkKc2VjcmV0cy88ZW52Pi1zZWNyZXRzLnlhbWwgICAgICAoc2Vuc2l0aXZlIHZhbHVlcykKICAg" + + "IC0+IG92ZXJyaWRkZW4gYnkKcmVsZWFzZSBpbmxpbmUgdmFsdWVzOiBibG9ja3MgICAoaGlnaGVz" + + "dCBwcmVjZWRlbmNlKQpgYGAKCkNyaXRpY2FsOiBgZ2xvYmFsLnlhbWwuZ290bXBsYCBvbmx5IHBh" + + "c3NlcyB0aHJvdWdoIHNwZWNpZmljIGtleXMgdG8gZWFjaCBjaGFydCAoaW1hZ2UgcmVnaXN0cmll" + + "cywgbm9kZSBzZWxlY3RvcnMsIHN0b3JhZ2UsIHJlcGxpY2EgY291bnRzKS4gU2V0dGluZyBhbiBh" + + "cmJpdHJhcnkgY2hhcnQgdmFsdWUgaW4gdGhlIGVudmlyb25tZW50IGZpbGUgd2lsbCBiZSBzaWxl" + + "bnRseSBpZ25vcmVkIGlmIGBnbG9iYWwueWFtbC5nb3RtcGxgIGRvZXMgbm90IHByb3BhZ2F0ZSBp" + + "dC4KClRvIG92ZXJyaWRlIGFyYml0cmFyeSBjaGFydCB2YWx1ZXMsIHVzZSBhIGhlbG1maWxlIHJl" + + "bGVhc2UgYHZhbHVlczpgIGJsb2NrLiBTZWUgW092ZXJyaWRpbmcgSGVsbSBDaGFydCBWYWx1ZXNd" + + "KCNvdmVycmlkaW5nLWhlbG0tY2hhcnQtdmFsdWVzKS4KCiMjIENsZWFuIEluc3RhbGxhdGlvbgoK" + + "IyMjIDEuIENyZWF0ZSBuYW1lc3BhY2VzIGFuZCBpbWFnZSBwdWxsIHNlY3JldHMgKGlmIHVzaW5n" + + "IGEgcHJpdmF0ZSByZWdpc3RyeSkKCmBgYGJhc2gKZm9yIG5zIGluIGNhc3NhbmRyYS1zeXN0ZW0g" + + "bmF0cy1zeXN0ZW0gbnZjZiBhcGkta2V5cyBlc3Mgc2lzIHZhdWx0LXN5c3RlbSBjZXJ0LW1hbmFn" + + "ZXI7IGRvCiAga3ViZWN0bCBjcmVhdGUgbmFtZXNwYWNlICIkbnMiIC0tZHJ5LXJ1bj1jbGllbnQg" + + "LW8geWFtbCB8IGt1YmVjdGwgYXBwbHkgLWYgLQpkb25lCgojIE9ubHkgaWYgcHVsbGluZyBmcm9t" + + "IGEgcHJpdmF0ZSByZWdpc3RyeSAoZS5nLiwgTkdDIG52Y3IuaW8pCmV4cG9ydCBOR0NfQVBJX0tF" + + "WT0iPHlvdXIta2V5PiIKZm9yIG5zIGluIGNhc3NhbmRyYS1zeXN0ZW0gbmF0cy1zeXN0ZW0gbnZj" + + "ZiBhcGkta2V5cyBlc3Mgc2lzIHZhdWx0LXN5c3RlbSBjZXJ0LW1hbmFnZXI7IGRvCiAga3ViZWN0" + + "bCBjcmVhdGUgc2VjcmV0IGRvY2tlci1yZWdpc3RyeSBudmNyLWNyZWRzIFwKICAgIC0tZG9ja2Vy" + + "LXNlcnZlcj1udmNyLmlvIFwKICAgIC0tZG9ja2VyLXVzZXJuYW1lPSckb2F1dGh0b2tlbicgXAog" + + "ICAgLS1kb2NrZXItcGFzc3dvcmQ9IiROR0NfQVBJX0tFWSIgXAogICAgLS1uYW1lc3BhY2U9IiRu" + + "cyIgXAogICAgLS1kcnktcnVuPWNsaWVudCAtbyB5YW1sIHwga3ViZWN0bCBhcHBseSAtZiAtCmRv" + + "bmUKYGBgCgpJZiB1c2luZyBwdWxsIHNlY3JldHMsIHlvdSBtdXN0IGFsc28gY29uZmlndXJlIGVh" + + "Y2ggaGVsbWZpbGUgcmVsZWFzZSB0byByZWZlcmVuY2UgdGhlbS4gU2VlIFtJbWFnZSBQdWxsIFNl" + + "Y3JldHNdKCNpbWFnZS1wdWxsLXNlY3JldHMpLgoKIyMjIDIuIEF1dGhlbnRpY2F0ZSBoZWxtIHRv" + + "IHlvdXIgY2hhcnQgcmVnaXN0cnkKCkJvdGggYGRvY2tlciBsb2dpbmAgQU5EIGBoZWxtIHJlZ2lz" + + "dHJ5IGxvZ2luYCBhcmUgcmVxdWlyZWQgZm9yIE5HQy4gSGVsbWZpbGUgdXNlcyBoZWxtIChub3Qg" + + "ZG9ja2VyKSB0byBwdWxsIE9DSSBjaGFydHMsIHNvIHRoZSBoZWxtIGNyZWRlbnRpYWwgc3RvcmUg" + + "bXVzdCBiZSBhdXRoZW50aWNhdGVkIHNlcGFyYXRlbHkuCgpgYGBiYXNoCiMgTkdDIC0tIGJvdGgg" + + "Y29tbWFuZHMgYXJlIHJlcXVpcmVkCmRvY2tlciBsb2dpbiBudmNyLmlvIC11ICckb2F1dGh0b2tl" + + "bicgLXAgIiROR0NfQVBJX0tFWSIKaGVsbSByZWdpc3RyeSBsb2dpbiBudmNyLmlvIC11ICckb2F1" + + "dGh0b2tlbicgLXAgIiROR0NfQVBJX0tFWSIKCiMgRUNSCmF3cyBlY3IgZ2V0LWxvZ2luLXBhc3N3" + + "b3JkIC0tcmVnaW9uIDxyZWdpb24+IHwgXAogIGhlbG0gcmVnaXN0cnkgbG9naW4gLS11c2VybmFt" + + "ZSBBV1MgLS1wYXNzd29yZC1zdGRpbiA8YWNjb3VudD4uZGtyLmVjci48cmVnaW9uPi5hbWF6b25h" + + "d3MuY29tCmBgYAoKPiBOb3RlOiBgaGVsbSByZWdpc3RyeSBsb2dpbmAga2VlcHMgb25seSB0aGUg" + + "bGFzdCBsb2dpbiBwZXIgaG9zdCAobXVsdGktb3JnIGdvdGNoYSkuCj4gVGhlIHN0YWNrIGFuZCB0" + + "aGUgY2FjaGVzIHNwYW4gc2V2ZXJhbCBOR0Mgb3JncyB0aGF0IG5lZWQgZGlmZmVyZW50IGtleXMs" + + "IGJ1dCB0aGV5IGFsbAo+IGxpdmUgdW5kZXIgdGhlIG9uZSBob3N0IGBudmNyLmlvYC4gQSBzZWNv" + + "bmQgYGhlbG0gcmVnaXN0cnkgbG9naW4gbnZjci5pb2AgKG9yCj4gYGRvY2tlciBsb2dpbmApIHdp" + + "dGggYSBkaWZmZXJlbnQga2V5IHNpbGVudGx5IG92ZXJ3cml0ZXMgdGhlIGZpcnN0LCBzbyBwdWxs" + + "cyBmb3IgdGhlCj4gZmlyc3Qgb3JnIHRoZW4gZmFpbCB3aXRoIGEgbWlzbGVhZGluZyBgNDAzIEFj" + + "Y2VzcyBEZW5pZWRgIChub3QgYSA0MDE6IHRoZSBhdXRoCj4gc3VjY2VlZGVkLCBpdCdzIHRoZSB3" + + "cm9uZy1vcmcga2V5KS4gSWYgeW91IHB1bGwgY2hhcnRzL2ltYWdlcyBmcm9tIG1vcmUgdGhhbiBv" + + "bmUgb3JnLAo+IGVpdGhlciByZS1ydW4gdGhlIGxvZ2luIHdpdGggdGhlIGNvcnJlY3Qga2V5IGlt" + + "bWVkaWF0ZWx5IGJlZm9yZSBlYWNoIHB1bGwsIG9yIHBhc3MKPiBgLS11c2VybmFtZSAnJG9hdXRo" + + "dG9rZW4nIC0tcGFzc3dvcmQgPGtleT5gIHBlciBgaGVsbSBwdWxsYCBpbnZvY2F0aW9uIGluc3Rl" + + "YWQgb2YgcmVseWluZwo+IG9uIHRoZSBzdG9yZWQgbG9naW4uIChQdWxsaW5nIGV2ZXJ5dGhpbmcg" + + "ZnJvbSBhIHNpbmdsZSByZWdpc3RyeSBtaXJyb3IgYXZvaWRzIHRoaXMKPiBlbnRpcmVseS4pCgoj" + + "IyMgMmIuIChSZWNvbW1lbmRlZCkgUHVsbCBmcm9tIGEgcmVnaXN0cnkgdGhlIGNsdXN0ZXIgYXV0" + + "aGVudGljYXRlcyB0byBhdXRvbWF0aWNhbGx5CgpJZiB5b3UgbWlycm9yIHRoZSBOVkNGIGltYWdl" + + "cyBpbnRvIGEgcmVnaXN0cnkgdGhhdCB0aGUgY2x1c3RlciBjYW4gcHVsbCBmcm9tIHdpdGhvdXQg" + + "YW4KZXhwbGljaXQgaW1hZ2UgcHVsbCBzZWNyZXQgKGZvciBleGFtcGxlLCBhIHJlZ2lzdHJ5IHdo" + + "ZXJlIHRoZSBub2RlIG9yIHdvcmtsb2FkIGlkZW50aXR5IGlzCmdyYW50ZWQgcHVsbCBhY2Nlc3Mg" + + "YXV0b21hdGljYWxseSksIHBvaW50IHRoZSBzdGFjayBhdCBpdCBhbmQgc2tpcCB0aGUgY3JlZGVu" + + "dGlhbCBzdGVwcwphYm92ZS4KCjEuIFBvaW50IHRoZSBzdGFjayBhdCB0aGUgbWlycm9yIGluIGBl" + + "bnZpcm9ubWVudHMvPGVudj4ueWFtbGA6CgogICBgYGB5YW1sCiAgIGdsb2JhbDoKICAgICBpbWFn" + + "ZToKICAgICAgIHJlZ2lzdHJ5OiA8eW91ci1yZWdpc3RyeT4gICAgICAgICAgICAjIGUuZy4gcmVn" + + "aXN0cnkuZXhhbXBsZS5jb20KICAgICAgIHJlcG9zaXRvcnk6IDxtaXJyb3Itc3ViLXBhdGg+CiAg" + + "ICAgaGVsbToKICAgICAgIHNvdXJjZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBv" + + "bmx5IGlmIHlvdSBhbHNvIG1pcnJvcmVkIHRoZSBoZWxtIGNoYXJ0cwogICAgICAgICByZWdpc3Ry" + + "eTogPHlvdXItcmVnaXN0cnk+CiAgICAgICAgIHJlcG9zaXRvcnk6IDxtaXJyb3Itc3ViLXBhdGg+" + + "CiAgIGBgYAoKICAgPiBUaGUgbWFuaWZlc3QgaGFzIGEgbWl4IG9mIE9DSSBhbmQgbm9uLU9DSSBh" + + "cnRpZmFjdHMsIHNvIGNvbnZlcnQgbm9uLU9DSSBjaGFydHMgYmVmb3JlCiAgID4gbWlycm9yaW5n" + + "LiBDb250YWluZXIgaW1hZ2VzIChgbnZjci5pby8uLi5gKSBhcmUgYWxyZWFkeSBPQ0kgYW5kIG1p" + + "cnJvciBhcy1pcy4gU29tZSBIZWxtCiAgID4gY2hhcnRzLCB0aG91Z2gsIGFyZSBwdWJsaXNoZWQg" + + "dG8gYW4gYGh0dHBzOi8vYCBIZWxtIHJlcG9zaXRvcnkgKGZvciBleGFtcGxlCiAgID4gYGhlbG0u" + + "bmdjLm52aWRpYS5jb21gKS4gVGhvc2UgYXJlIG5vdCBPQ0kgYW5kIGNhbm5vdCBiZSByZXNvbHZl" + + "ZCBieSBgZ2xvYmFsLmhlbG0uc291cmNlc2AKICAgPiAoT0NJKSBvciBtaXJyb3JlZCBkaXJlY3Rs" + + "eS4gQmVmb3JlIHBvaW50aW5nIHRoZSBzdGFjayBhdCB5b3VyIG1pcnJvciwgY29udmVydCBlYWNo" + + "CiAgID4gYGh0dHBzOi8vYCBjaGFydCB0byBPQ0k6IGBoZWxtIHJlcG8gYWRkYC9gaGVsbSBwdWxs" + + "YCB0aGUgYC50Z3pgLCB0aGVuCiAgID4gYGhlbG0gcHVzaCA8Y2hhcnQ+LnRneiBvY2k6Ly88eW91" + + "ci1yZWdpc3RyeT4vPG1pcnJvci1zdWItcGF0aD5gLiBPbmx5IE9DSSBjaGFydHMgY2FuIGxpdmUK" + + "ICAgPiB1bmRlciBgZ2xvYmFsLmhlbG0uc291cmNlc2AuCgoyLiBTa2lwIHRoZSBjcmVkZW50aWFs" + + "IHN0ZXBzIGFib3ZlLiBXaGVuIHRoZSBjbHVzdGVyIGF1dGhlbnRpY2F0ZXMgdG8gdGhlIHJlZ2lz" + + "dHJ5CiAgIGF1dG9tYXRpY2FsbHkgKHRoZSBub2RlIG9yIHdvcmtsb2FkIGlkZW50aXR5IGhhcyBw" + + "dWxsIGFjY2VzcyksIHRoZSBwdWxsIG5lZWRzIG5vCiAgIEt1YmVybmV0ZXMgc2VjcmV0LCBzbyB5" + + "b3UgZG8gbm90IG5lZWQ6IHRoZSBwZXItbmFtZXNwYWNlIGBudmNyLWNyZWRzYCBmcm9tIHN0ZXAg" + + "MQogICAoc3RpbGwgY3JlYXRlIHRoZSBuYW1lc3BhY2VzLCBqdXN0IG5vdCB0aGUgc2VjcmV0KSwg" + + "dGhlIGBnbG9iYWwuaW1hZ2VQdWxsU2VjcmV0c2AgZW50cnksCiAgIG9yIHRoZSBgZG9ja2VyIGxv" + + "Z2luYC9gaGVsbSByZWdpc3RyeSBsb2dpbiBudmNyLmlvYCBmcm9tIHN0ZXAgMi4KCiAgID4gT25l" + + "IHJlc2lkdWFsIGNyZWRlbnRpYWw6IG52Y2YtYXBpIHN0aWxsIHZhbGlkYXRlcyB0aGUgdXNlciBm" + + "dW5jdGlvbiBpbWFnZSBhdAogICA+IGBmdW5jdGlvbiBjcmVhdGVgIHZpYSB0aGUgYWNjb3VudCBy" + + "ZWdpc3RyeSBjcmVkZW50aWFsLCBzbyB0aGF0IGNyZWRlbnRpYWwgbXVzdCBwb2ludCBhdAogICA+" + + "IHdoaWNoZXZlciByZWdpc3RyeSBob2xkcyB0aGUgdXNlciBpbWFnZSAoc2V0IGl0IHRvIHlvdXIg" + + "bWlycm9yIGlmIHRoZSBpbWFnZSBpcyBtaXJyb3JlZAogICA+IHRoZXJlKS4KCiMjIyAzLiBTZXQg" + + "dGhlIHJvdXRlIGRvbWFpbgoKYGdsb2JhbC5kb21haW5gIHNldHMgdGhlIGhvc3RuYW1lIHN1ZmZp" + + "eCBmb3Igcm91dGVzIHN1Y2ggYXMgYGFwaS48ZG9tYWluPmAuIEl0IGRvZXMgbm90IGNvbmZpZ3Vy" + + "ZSB0aGUgR2F0ZXdheSBvciBpdHMgbG9hZCBiYWxhbmNlci4gUXVlcnkgdGhlIGV4YWN0IGV4aXN0" + + "aW5nIEdhdGV3YXk6CgpgYGBiYXNoCkdBVEVXQVlfQUREUkVTUz0kKGt1YmVjdGwgZ2V0IGdhdGV3" + + "YXkgPGdhdGV3YXktbmFtZT4gLW4gPGdhdGV3YXktbmFtZXNwYWNlPiAtbyBqc29ucGF0aD0ney5z" + + "dGF0dXMuYWRkcmVzc2VzWzBdLnZhbHVlfScpCnRlc3QgLW4gIiRHQVRFV0FZX0FERFJFU1MiCmBg" + + "YAoKVGhlIGFkZHJlc3MgbWF5IGJlIGEgaG9zdG5hbWUgb3IgSVAuIENsb3VkIHByb3ZpZGVyIGFu" + + "ZCBHYXRld2F5IGNvbmZpZ3VyYXRpb24gZGV0ZXJtaW5lIHRoZSBsb2FkIGJhbGFuY2VyIHR5cGUg" + + "YW5kIGFkZHJlc3MgZm9ybWF0LiBUaGUgc2VsZi1tYW5hZ2VkIHN0YWNrIGRvZXMgbm90IHNlbGVj" + + "dCBlaXRoZXIuCgpGb3IgdGVtcG9yYXJ5IHRlc3Rpbmcgd2l0aG91dCBETlMsIHVzZSBhIHN0YWJs" + + "ZSByZXNlcnZlZCBzdWZmaXggc3VjaCBhcyBgZ2xvYmFsLmRvbWFpbjogIm52Y2YudGVzdCJgLCBj" + + "b25uZWN0IHRvIGBHQVRFV0FZX0FERFJFU1NgLCBhbmQgc2VuZCBgSG9zdDogYXBpLm52Y2YudGVz" + + "dGAuIEZvciBwcm9kdWN0aW9uLCB1c2UgeW91ciBiYXNlIEROUyBkb21haW4gYW5kIHBvaW50IGl0" + + "cyByb3V0ZSByZWNvcmRzIHRvIGBHQVRFV0FZX0FERFJFU1NgLiBJZiB0aGUgZW5kcG9pbnQgbGF0" + + "ZXIgY2hhbmdlcywga2VlcCBgZ2xvYmFsLmRvbWFpbmAgc3RhYmxlIGFuZCB1cGRhdGUgb25seSBE" + + "TlMgb3IgdGhlIGNsaWVudCBkZXN0aW5hdGlvbi4gU2VlIEV4YW1wbGUgNCBpbiBbZXhhbXBsZXMu" + + "bWRdKGV4YW1wbGVzLm1kKS4KCiMjIyA0LiBQcmV2aWV3IGFuZCBkZXBsb3kKCmBgYGJhc2gKSEVM" + + "TUZJTEVfRU5WPTxlbnYtbmFtZT4gaGVsbWZpbGUgdGVtcGxhdGUgICAjIFByZXZpZXcgcmVuZGVy" + + "ZWQgbWFuaWZlc3RzCkhFTE1GSUxFX0VOVj08ZW52LW5hbWU+IGhlbG1maWxlIHN5bmMgICAgICAg" + + "IyBEZXBsb3kKYGBgCgo+IFNldCBCT1RIIENhc3NhbmRyYSBwYXNzd29yZHMgaW4gdGhlIHNlY3Jl" + + "dHMgZmlsZS4gVGhlIHNlY3JldHMgZmlsZSBkb2N1bWVudHMKPiBgREVGQVVMVF9DQVNTQU5EUkFf" + + "UEFTU1dPUkRgLCBidXQgdGhlIGNhc3NhbmRyYSBjaGFydCBoYXMgYSBzZWNvbmQgY3JlZGVudGlh" + + "bCwKPiBgY2Fzc2FuZHJhLnNlcnZpY2VSb2xlUGFzc3dvcmRgLCB0aGF0IGRlZmF1bHRzIHRvIGBj" + + "aEBuZzNtM2AuIElmIHlvdSBzZXQgb25seQo+IGBERUZBVUxUX0NBU1NBTkRSQV9QQVNTV09SRGAs" + + "IHRoZSBzZXJ2aWNlIHJvbGUga2VlcHMgdGhhdCBkZWZhdWx0IGFuZCBldmVyeSBEQi1iYWNrZWQK" + + "PiBzZXJ2aWNlIGNyYXNoLWxvb3BzIHdpdGggYEJhZCBjcmVkZW50aWFsc2Agb25jZSBpdCB0cmll" + + "cyB0byBhdXRoZW50aWNhdGUuIFNldAo+IGBjYXNzYW5kcmEuc2VydmljZVJvbGVQYXNzd29yZGAg" + + "dG8gdGhlIHNhbWUgdmFsdWUgYXMgYERFRkFVTFRfQ0FTU0FORFJBX1BBU1NXT1JEYC4KCiMjIyA1" + + "LiBEZXBsb3ltZW50IHBoYXNlcwoKSGVsbWZpbGUgZGVwbG95cyBpbiBvcmRlciB3aXRoIGRlcGVu" + + "ZGVuY2llczoKCnwgUGhhc2UgfCBTZWxlY3RvciB8IFNlcnZpY2VzIHwgV2FpdCB0aW1lIHwKfC0t" + + "LS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfAp8IDEgfCBgcmVsZWFzZS1n" + + "cm91cD1kZXBlbmRlbmNpZXNgIHwgTkFUUywgT3BlbkJhbywgQ2Fzc2FuZHJhIHwgNS0xMCBtaW4g" + + "fAp8IDIgfCBgcmVsZWFzZS1ncm91cD1zZXJ2aWNlc2AgfCBBUEksIFNJUywgRVNTLCBpbnZvY2F0" + + "aW9uLCBncnBjLXByb3h5LCBub3RhcnksIGFwaS1rZXlzLCBvcHRpb25hbCBMTE0gZ2F0ZXdheS9y" + + "b3V0ZXIsIG9wdGlvbmFsIFZhbml0eSBHYXRld2F5LCBOVkNGIFVJIHdoZW4gdGhlIHN0YWNrIHBh" + + "Y2thZ2UgaW5jbHVkZXMgdGhlIGFkZG9uIHwgNS0xMCBtaW4gfAp8IDMgfCBgcmVsZWFzZS1ncm91" + + "cD1pbmdyZXNzYCB8IEdhdGV3YXkgcm91dGVzIHwgMS0yIG1pbiB8CnwgNCB8IGByZWxlYXNlLWdy" + + "b3VwPW9ic2VydmFiaWxpdHlgIHwgT2JzZXJ2YWJpbGl0eSBzdGFjayAoaWYgZW5hYmxlZCkgfCAx" + + "LTIgbWluIHwKCk1vbml0b3IgaW4gYSBzZXBhcmF0ZSB0ZXJtaW5hbDoKCmBgYGJhc2gKa3ViZWN0" + + "bCBnZXQgcG9kcyAtQSAtdwpgYGAKCiMjIyA2LiBFbmFibGUgVmFuaXR5IEdhdGV3YXkgKG9wdGlv" + + "bmFsKQoKVmFuaXR5IEdhdGV3YXkgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBhbmQgaXMgb25seSBu" + + "ZWVkZWQgZm9yIGN1c3RvbWVyLWZhY2luZwpob3N0bmFtZXMgb3IgcGF0aCBtYXBwaW5ncyBpbiBm" + + "cm9udCBvZiB0aGUgc3RhbmRhcmQgTlZDRiBBUEkgYW5kIGludm9jYXRpb24Kcm91dGVzLiBJdCBp" + + "cyBhdmFpbGFibGUgb25seSBpbiBzdGFjayBwYWNrYWdlcyB0aGF0IGluY2x1ZGUgdGhlIFZhbml0" + + "eSBHYXRld2F5CmFkZG9uLiBJZiB0aGUgZXh0cmFjdGVkIHN0YWNrIHBhY2thZ2UgZG9lcyBub3Qg" + + "Y29udGFpbiBhIGB2YW5pdHktZ2F0ZXdheWAKcmVsZWFzZSBhbmQgYHZhbml0eUdhdGV3YXlgIHJv" + + "dXRlIHZhbHVlcywgc2tpcCB0aGVzZSBjb21tYW5kcyBhbmQgdXNlIGEgbmV3ZXIKc3RhY2sgcGFj" + + "a2FnZSB0aGF0IGluY2x1ZGVzIHRoZW0uCgpJZiB0aGUgc3RhY2sgcGFja2FnZSBpbmNsdWRlcyB0" + + "aGUgYWRkb24sIGVuYWJsZSBpdCBpbgpgZW52aXJvbm1lbnRzLzxlbnYtbmFtZT4ueWFtbGA6Cgpg" + + "YGB5YW1sCmFkZG9uczoKICB2YW5pdHlHYXRld2F5OgogICAgZW5hYmxlZDogdHJ1ZQogICAgbWFw" + + "cGluZ0NvbmZpZzoge30KYGBgCgpUaGUgZGVmYXVsdCByb3V0ZSBob3N0IGlzIGB2YW5pdHkuPGRv" + + "bWFpbj5gIGFuZCB0aGUgYmFja2VuZCBpcwpgdmFuaXR5LWdhdGV3YXkubnZjZjo4MDgwYC4gUHV0" + + "IGRlcGxveW1lbnQtc3BlY2lmaWMgaG9zdCBhbmQgcGF0aCBtYXBwaW5ncyB1bmRlcgpgYWRkb25z" + + "LnZhbml0eUdhdGV3YXkubWFwcGluZ0NvbmZpZ2AuIElmIHlvdSBuZWVkIGN1c3RvbSB2YW5pdHkg" + + "aG9zdHMgaW5zdGVhZCBvZgpgdmFuaXR5Ljxkb21haW4+YCwgdXNlIHRoZSByb3V0ZSBob3N0bmFt" + + "ZSBvdmVycmlkZXMgc3VwcG9ydGVkIGJ5IHRoZSBzdGFjawpwYWNrYWdlIGFuZCBjcmVhdGUgbWF0" + + "Y2hpbmcgRE5TIHJlY29yZHMuCgpBZnRlciBjb25maXJtaW5nIHRoZSBwYWNrYWdlIGluY2x1ZGVz" + + "IHRoZSBgdmFuaXR5LWdhdGV3YXlgIHJlbGVhc2UsIHByZXZpZXcgYW5kCmFwcGx5IHRoZSBzZXJ2" + + "aWNlIGFuZCByb3V0ZToKCmBgYGJhc2gKSEVMTUZJTEVfRU5WPTxlbnYtbmFtZT4gaGVsbWZpbGUg" + + "LS1zZWxlY3RvciBuYW1lPXZhbml0eS1nYXRld2F5IHRlbXBsYXRlCkhFTE1GSUxFX0VOVj08ZW52" + + "LW5hbWU+IGhlbG1maWxlIC0tc2VsZWN0b3IgbmFtZT12YW5pdHktZ2F0ZXdheSBzeW5jCkhFTE1G" + + "SUxFX0VOVj08ZW52LW5hbWU+IGhlbG1maWxlIC0tc2VsZWN0b3IgcmVsZWFzZS1ncm91cD1pbmdy" + + "ZXNzIHN5bmMKYGBgCgpWZXJpZnkgdGhlIHJvdXRlIG9ubHkgd2hlbiB0aGUgYWRkb24gaXMgcHJl" + + "c2VudCBhbmQgZW5hYmxlZDoKCmBgYGJhc2gKa3ViZWN0bCBnZXQgZGVwbG95LHN2YyAtbiBudmNm" + + "IC1sIGFwcC5rdWJlcm5ldGVzLmlvL25hbWU9dmFuaXR5LWdhdGV3YXkKa3ViZWN0bCBnZXQgaHR0" + + "cHJvdXRlIC1BIHwgZ3JlcCAtaSB2YW5pdHkKY3VybCAtSCAiSG9zdDogdmFuaXR5Ljxkb21haW4+" + + "IiAiaHR0cDovLzxnYXRld2F5LWFkZHJlc3M+L2hlYWx0aCIKYGBgCgpEbyBub3QgZW5hYmxlIFZh" + + "bml0eSBHYXRld2F5IGZvciBzdGFuZGFyZCBBUEksIEFQSSBLZXlzLCBpbnZvY2F0aW9uLCBMTE0K" + + "aW52b2NhdGlvbiwgb3IgZ1JQQyB0cmFmZmljLiBUaG9zZSByb3V0ZXMgYXJlIHByb3ZpZGVkIGJ5" + + "IHRoZSBiYXNlIGdhdGV3YXkKcm91dGVzLgoKIyMjIDcuIEVuYWJsZSBOVkNGIFVJIChvcHRpb25h" + + "bCkKCk5WQ0YgVUkgaXMgYW4gb3B0aW9uYWwsIGN1c3RvbWVyLWZhY2luZyBhZG1pbi1wYW5lbCBV" + + "SS4gSXQgaXMgZGlzYWJsZWQgYnkKZGVmYXVsdCBhbmQgYXZhaWxhYmxlIG9ubHkgaW4gc3RhY2sg" + + "cGFja2FnZXMgdGhhdCBpbmNsdWRlIHRoZSBOVkNGIFVJIGFkZG9uLiBJZgp5b3VyIGV4dHJhY3Rl" + + "ZCBzdGFjayBwYWNrYWdlIGRvZXMgbm90IGNvbnRhaW4gYSBgbnZjZi11aWAgcmVsZWFzZSBhbmQg" + + "YG52Y2ZVaWAKcm91dGUgdmFsdWVzLCBza2lwIHRoaXMgc2VjdGlvbi4gVGhlIE5WQ0YgVUkgYWRt" + + "aW4gcGFuZWwgaXMgY3VycmVudGx5CnVuYXV0aGVudGljYXRlZDsgZG8gbm90IGV4cG9zZSBpdCB0" + + "byB0aGUgcHVibGljIGludGVybmV0LgoKRm9yIGVuYWJsZW1lbnQsIG5hbWVzcGFjZSBhbmQgcHVs" + + "bCBzZWNyZXQgc2V0dXAsIGFwcGx5LCBhbmQgdmVyaWZpY2F0aW9uIHN0ZXBzLApzZWUgW05WQ0Yg" + + "VUkgQWRkb25dKHJlZmVyZW5jZXMvbnZjZi11aS1hZGRvbi5tZCkuCgojIyMgOC4gSW5zdGFsbCB0" + + "aGUgc2VwYXJhdGUgY29tcHV0ZS1wbGFuZSBzdGFjawoKVGhlIGNvbnRyb2wtcGxhbmUgc3RhY2sg" + + "ZG9lcyBub3QgaW5zdGFsbCBjb21wdXRlLXBsYW5lIGNvbXBvbmVudHMuIEFmdGVyIGl0IGlzIGhl" + + "YWx0aHksIGNob29zZSBleGFjdGx5IG9uZSBjb21wdXRlLXBsYW5lIGhhbmRvZmY6CgotIEhlbG1m" + + "aWxlIHZhbHVlcyBmbG93OiBhdXRob3Igc2VwYXJhdGUgZW52aXJvbm1lbnQgZmlsZXMsIHRoZW4g" + + "cmVnaXN0ZXIgYW5kCiAgaW5zdGFsbCB3aXRoIHRoZSBjb21wdXRlLXBsYW5lIE1ha2VmaWxlLgot" + + "IENMSSBwcm9maWxlIGZsb3c6IHVzZSB0aGUgcHJvZmlsZSBnZW5lcmF0ZWQgYnkgdGhlIENMSSBj" + + "b250cm9sLXBsYW5lIGluc3RhbGwsCiAgdGhlbiBydW4gdGhlIGNvbXBsZXRlIENMSSByZWdpc3Rl" + + "ciBhbmQgaW5zdGFsbCBjb21tYW5kcy4KCkRvIG5vdCBtaXggdGhlc2UgaGFuZG9mZnMuIEZvbGxv" + + "dyBbU3BsaXQgQ29tcHV0ZS1QbGFuZSBJbnN0YWxsYXRpb25dKHJlZmVyZW5jZXMvY29tcHV0ZS1w" + + "bGFuZS1pbnN0YWxsYXRpb24ubWQpCmZvciBjb21tYW5kcywgRUtTIHJvdXRpbmcsIHB1bGwgc2Vj" + + "cmV0cywgdmVyaWZpY2F0aW9uLCBhbmQgdGVhcmRvd24gb3JkZXIuCgojIyBDbGVhbiBUZWFyZG93" + + "bgoKRGVzdHJveSBldmVyeSBjb21wdXRlIHBsYW5lIGJlZm9yZSB0aGUgY29udHJvbCBwbGFuZSwg" + + "dXNpbmcgdGhlIHRlYXJkb3duIGZvcgp0aGUgc2FtZSBoYW5kb2ZmOyBzZWUgW1NwbGl0IENvbXB1" + + "dGUtUGxhbmUgSW5zdGFsbGF0aW9uXShyZWZlcmVuY2VzL2NvbXB1dGUtcGxhbmUtaW5zdGFsbGF0" + + "aW9uLm1kI3RlYXJkb3duKS4KClNjb3BlOiBPbmx5IGRlc3Ryb3kgcmVsZWFzZXMgbWFuYWdlZCBi" + + "eSB0aGlzIGNvbnRyb2wtcGxhbmUgaGVsbWZpbGUgc3RhY2suIFRoZSBOVkNGIHJlbGVhc2VzIGFy" + + "ZTogYG5hdHNgLCBgb3BlbmJhby1zZXJ2ZXJgLCBgY2Fzc2FuZHJhYCwgYGFwaS1rZXlzYCwgYHNp" + + "c2AsIGBhcGlgLCBgaW52b2NhdGlvbi1zZXJ2aWNlYCwgYGdycGMtcHJveHlgLCBgZXNzLWFwaWAs" + + "IGBub3Rhcnktc2VydmljZWAsIG9wdGlvbmFsIGB2YW5pdHktZ2F0ZXdheWAsIGBudmNmLXVpYCwg" + + "YGFkbWluLWlzc3Vlci1wcm94eWAsIGFuZCBgaW5ncmVzc2A7IGBjZXJ0LW1hbmFnZXJgIGlzIGlu" + + "Y2x1ZGVkIG9ubHkgd2hlbiBgY2VydE1hbmFnZXIuZW5hYmxlZDogdHJ1ZWAuIFRoZSBjb250cm9s" + + "LXBsYW5lIG5hbWVzcGFjZSBpbnZlbnRvcnkgYWxzbyBpbmNsdWRlcyBgY2VydC1tYW5hZ2VyYCwg" + + "YnV0IGRlZmF1bHQgbmFtZXNwYWNlIGNsZWFudXAgcHJlc2VydmVzIGl0LiBOYW1lc3BhY2UgcHJl" + + "c2VydmF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHRoZSBIZWxtIHJlbGVhc2UuIEV4dGVybmFsIGNl" + + "cnQtbWFuYWdlciBtdXN0IHVzZSBgY2VydE1hbmFnZXIuZW5hYmxlZDogZmFsc2VgOyBvdGhlcndp" + + "c2UgSGVsbWZpbGUgdHJlYXRzIHRoZSByZWxlYXNlIGFzIHN0YWNrLW1hbmFnZWQuIERvIG5vdCBk" + + "ZWxldGUgb3RoZXIgaGVsbSByZWxlYXNlcyBvciBuYW1lc3BhY2VzIG9uIHRoZSBjbHVzdGVyLgoK" + + "QmVmb3JlIGNvbnRyb2wtcGxhbmUgZGVzdHJveSwgaWRlbnRpZnkgd2hldGhlciBjZXJ0LW1hbmFn" + + "ZXIgaXMgZXh0ZXJuYWwuIEZvciBhbiBleHRlcm5hbCBpbnN0YWxsYXRpb24sIHJlcXVpcmUgZWZm" + + "ZWN0aXZlIGBjZXJ0TWFuYWdlci5lbmFibGVkOiBmYWxzZWAgYW5kIGFib3J0IGlmIGl0IGlzIHRy" + + "dWUuIEZvciBhbiBpbnRlbmRlZCBzdGFjay1tYW5hZ2VkIHJlbGVhc2Ugd2l0aCBlZmZlY3RpdmUg" + + "YGNlcnRNYW5hZ2VyLmVuYWJsZWQ6IHRydWVgLCB2ZXJpZnkgbWF0Y2hpbmcgc3RhY2sgSGVsbSBy" + + "ZWxlYXNlIG1ldGFkYXRhIGFuZCBhYm9ydCBvbiBtaXNzaW5nIG9yIG1pc21hdGNoZWQgZXZpZGVu" + + "Y2UuIFByZXNlcnZlIHRoZSBuYW1lc3BhY2UgYnkgZGVmYXVsdDsgb25seSBwbGFuIGl0cyByZW1v" + + "dmFsIGFmdGVyIHZlcmlmeWluZyBuYW1lc3BhY2UgcHJvdmVuYW5jZSBhbmQgZ2V0dGluZyBleHBs" + + "aWNpdCBjb25maXJtYXRpb24uCgojIyMgU3RhbmRhcmQgdGVhcmRvd24KClJ1biBmcm9tIGluc2lk" + + "ZSB0aGUgYG52Y2Ytc2VsZi1tYW5hZ2VkLXN0YWNrL2AgZGlyZWN0b3J5OgoKYGBgYmFzaApIRUxN" + + "RklMRV9FTlY9PGVudi1uYW1lPiBoZWxtZmlsZSBkZXN0cm95CmBgYAoKIyMjIERlbGV0ZSBuYW1l" + + "c3BhY2VzCgpgYGBiYXNoCmZvciBucyBpbiBjYXNzYW5kcmEtc3lzdGVtIG5hdHMtc3lzdGVtIG52" + + "Y2YgYXBpLWtleXMgZXNzIHNpcyBudmNmLXVpIHZhdWx0LXN5c3RlbTsgZG8KICBrdWJlY3RsIGRl" + + "bGV0ZSBuYW1lc3BhY2UgIiRucyIgLS1pZ25vcmUtbm90LWZvdW5kCmRvbmUKYGBgCgojIyMgVmVy" + + "aWZ5IGNsZWFuCgpgYGBiYXNoCmt1YmVjdGwgZ2V0IG5zIHwgZ3JlcCAtRSAnKGNhc3NhbmRyYXxu" + + "YXRzfHZhdWx0fG52Y2Z8YXBpLWtleXN8ZXNzfHNpcyknCiMgU2hvdWxkIHJldHVybiBlbXB0eQpg" + + "YGAKCiMjIE92ZXJyaWRpbmcgSGVsbSBDaGFydCBWYWx1ZXMKCiMjIyBFbnZpcm9ubWVudCBmaWxl" + + "IChsaW1pdGVkKQoKV29ya3Mgb25seSBmb3Iga2V5cyB0aGF0IGBnbG9iYWwueWFtbC5nb3RtcGxg" + + "IHByb3BhZ2F0ZXMgKGUuZy4sIGBjYXNzYW5kcmEucmVwbGljYUNvdW50YCwgYGdsb2JhbC5zdG9y" + + "YWdlQ2xhc3NgLCBgZ2xvYmFsLmltYWdlYCkuCgojIyMgUmVsZWFzZSB2YWx1ZXMgYmxvY2sgKGFu" + + "eSBjaGFydCB2YWx1ZSkKCkVkaXQgdGhlIHJlbGVhc2UgaW4gYGhlbG1maWxlLmQvKi55YW1sLmdv" + + "dG1wbGAgYW5kIGFkZCBhIGB2YWx1ZXM6YCBibG9jay4gSW4gdGhlIGV4YW1wbGVzIGJlbG93LCBg" + + "PHByaXZhdGUtdmFsdWVzPmAgcmVmZXJzIHRvIHRoZSBgc2VjcmV0cy9gIGRpcmVjdG9yeSBhdCB0" + + "aGUgaGVsbWZpbGUgc3RhY2sgcm9vdC4KCmBgYHlhbWwKLSBuYW1lOiBjYXNzYW5kcmEKICB2ZXJz" + + "aW9uOiAwLjguMAogIGNvbmRpdGlvbjogY2Fzc2FuZHJhLmVuYWJsZWQKICBuYW1lc3BhY2U6IGNh" + + "c3NhbmRyYS1zeXN0ZW0KICA8PDogKmRlcGVuZGVuY3kKICB2YWx1ZXM6CiAgICAtIC4uL2dsb2Jh" + + "bC55YW1sLmdvdG1wbAogICAgLSAuLi88cHJpdmF0ZS12YWx1ZXM+L3t7IHJlcXVpcmVkRW52ICJI" + + "RUxNRklMRV9FTlYiIH19LXNlY3JldHMueWFtbAogICAgLSBjYXNzYW5kcmE6CiAgICAgICAgcmVz" + + "b3VyY2VzOgogICAgICAgICAgbGltaXRzOgogICAgICAgICAgICBjcHU6ICI4IgogICAgICAgICAg" + + "ICBtZW1vcnk6IDgxOTJNaQogICAgICAgICAgcmVxdWVzdHM6CiAgICAgICAgICAgIGNwdTogIjIi" + + "CiAgICAgICAgICAgIG1lbW9yeTogNDA5Nk1pCmBgYAoKWUFNTCBtZXJnZSBnb3RjaGE6IFdoZW4g" + + "YSByZWxlYXNlIHVzZXMgYDw8OiAqZGVwZW5kZW5jeWAgb3IgYGluaGVyaXRgLCBzcGVjaWZ5aW5n" + + "IGB2YWx1ZXM6YCByZXBsYWNlcyB0aGUgdGVtcGxhdGUncyB2YWx1ZXMgbGlzdC4gWW91IG11c3Qg" + + "cmUtaW5jbHVkZSBgZ2xvYmFsLnlhbWwuZ290bXBsYCBhbmQgdGhlIHNlY3JldHMgZmlsZS4KCiMj" + + "IyBQcmV2aWV3IGFuZCBhcHBseSBhIHNpbmdsZSByZWxlYXNlCgpgYGBiYXNoCkhFTE1GSUxFX0VO" + + "Vj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9Y2Fzc2FuZHJhIHRlbXBsYXRlICAjIFBy" + + "ZXZpZXcKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0b3IgbmFtZT1jYXNzYW5k" + + "cmEgc3luYyAgICAgICMgQXBwbHkKYGBgCgojIyBJbWFnZSBQdWxsIFNlY3JldHMKClRoZXJlIGFy" + + "ZSB0aHJlZSBkaXN0aW5jdCBjcmVkZW50aWFsIHR5cGVzLiBEbyBub3QgY29uZmxhdGUgdGhlbSwg" + + "YW5kIG1pbmQgdGhlCmZvcm1hdCBydWxlIGJlbG93ICh0d28gb2YgdGhlbSBmYWlsIGV2ZW4gd2l0" + + "aCB0aGUgY29ycmVjdCBrZXkgaWYgdGhlIGZvcm1hdCBpcyB3cm9uZyk6Cgp8IHwgQ29udHJvbCBQ" + + "bGFuZSBQdWxsIFNlY3JldHMgfCBBUEkgQm9vdHN0cmFwIFJlZ2lzdHJ5IENyZWRzIHwgU2lkZWNh" + + "ciBJbWFnZS1QdWxsIFNlY3JldCB8CnwtLS18LS0tfC0tLXwtLS18CnwgUHVycG9zZSB8IEs4cyBw" + + "dWxscyBOVkNGIHNlcnZpY2UgaW1hZ2VzIHwgbnZjZi1hcGkgdmFsaWRhdGVzIHRoZSB1c2VyIGZ1" + + "bmN0aW9uIGltYWdlIGF0IGBmdW5jdGlvbiBjcmVhdGVgIHwgbnZjZi1hcGkgcHVsbHMgdGhlIHBs" + + "YXRmb3JtIHNpZGVjYXJzIGluamVjdGVkIGludG8gZXZlcnkgd29ya2VyIHBvZCB8CnwgV2hlcmUg" + + "fCBLOHMgYGRvY2tlci1yZWdpc3RyeWAgU2VjcmV0cyArIEt5dmVybm8gQ2x1c3RlclBvbGljeSB8" + + "IGA8cHJpdmF0ZS12YWx1ZXM+LzxlbnY+LXNlY3JldHMueWFtbGAgKGFjY291bnQtYm9vdHN0cmFw" + + "KSB8IGBOVkNGX0FQSV9TSURFQ0FSU19JTUFHRV9QVUxMX1NFQ1JFVGAgaW4gYDxlbnY+LXNlY3Jl" + + "dHMueWFtbGAgLT4gT3BlbkJhbyBgc2VydmljZXMvbnZjZi1hcGkva3Yvc2lkZWNhcnMvaW1hZ2Ut" + + "cHVsbC1zZWNyZXRgIChmaWVsZCBgc2VjcmV0YCkgfAp8IEZvcm1hdCB8IHN0YW5kYXJkIGAuZG9j" + + "a2VyY29uZmlnanNvbmAgKGt1YmVjdGwgYnVpbGRzIGl0IGZvciB5b3UpIHwgYGJhc2U2NCgiJG9h" + + "dXRodG9rZW46PGtleT4iKWAgfCBgYmFzZTY0KCIkb2F1dGh0b2tlbjo8a2V5PiIpYCB8Cgo+IE5v" + + "dGU6IHRoZSBhY2NvdW50LWJvb3RzdHJhcCBjcmVkIGFuZCB0aGUgc2lkZWNhciBzZWNyZXQgYXJl" + + "IE5PVCBhCj4gZG9ja2VyY29uZmlnanNvbi4gVGhlIHNlY3JldHMgdGVtcGxhdGUgc2hpcHMgdGhl" + + "IHBsYWNlaG9sZGVyCj4gYFJFUExBQ0VfV0lUSF9CQVNFNjRfRE9DS0VSX0NSRURFTlRJQUxgLCB3" + + "aGljaCByZWFkcyBhcyAiYmFzZTY0IG9mIGEgZG9ja2VyY29uZmlnanNvbi4iCj4gSXQgaXNuJ3Qu" + + "IEJvdGggdmFsdWVzIGFyZSBjb25zdW1lZCBhcyBhIHJhdyBkb2NrZXIgYGF1dGhgIHN0cmluZzog" + + "bnZjZi1hcGkgdGFrZXMgdGhlCj4gdmFsdWUgdmVyYmF0aW0gYW5kIGRyb3BzIGl0IGludG8gdGhl" + + "IGBhdXRoYCBmaWVsZCBvZiB0aGUgZG9ja2VyY29uZmlnIGl0IGJ1aWxkcy4gU28gdGhlCj4gdmFs" + + "dWUgbXVzdCBiZSBgYmFzZTY0KCIkb2F1dGh0b2tlbjo8a2V5PiIpYCwgZS5nLiBgcHJpbnRmICck" + + "b2F1dGh0b2tlbjolcycgIiRLRVkiIHwgb3BlbnNzbCBiYXNlNjQgLUFgLAo+IG5vdCBgYmFzZTY0" + + "KDxkb2NrZXJjb25maWdqc29uPilgLgo+Cj4gLSBXcm9uZyBhY2NvdW50LWJvb3RzdHJhcCB2YWx1" + + "ZTogYGZ1bmN0aW9uIGNyZWF0ZWAgcmV0dXJucwo+ICAgIGA0MDAgIm11c3QgYmUgYmFzZTY0IGVu" + + "Y29kZWQgdXNlcm5hbWU6cGFzc3dvcmQgZm9ybWF0ImAuCj4gLSBXcm9uZyBzaWRlY2FyIHZhbHVl" + + "OiBldmVyeSB3b3JrZXIncyBzaWRlY2FyIHB1bGwgZ2V0cyBhIG1hbGZvcm1lZCBjcmVkZW50aWFs" + + "IGFuZAo+ICAgIGA0MDNgcywgcmVnYXJkbGVzcyBvZiB3aGljaCBrZXkgaXMgaW5zaWRlLiBUaGUg" + + "c3ltcHRvbSBsb29rcyBsaWtlIGEgYmFkIG9yIHdyb25nLW9yZwo+ICAgIGtleSwgYnV0IHRoZSBr" + + "ZXkgaXMgZmluZSBhbmQgdGhlIGVuY29kaW5nIGlzIHRoZSBidWcuIFRvIHJlcGFpciBhbiBhbHJl" + + "YWR5LWluc3RhbGxlZAo+ICAgIHN0YWNrIHdpdGhvdXQgYSBmdWxsIHJlLXN5bmM6Cj4KPiAgICBg" + + "YGBiYXNoCj4gICAgQVVUSD0kKHByaW50ZiAnJG9hdXRodG9rZW46JXMnICIkS0VZIiB8IG9wZW5z" + + "c2wgYmFzZTY0IC1BKQo+ICAgIGJhbyBrdiBwdXQgc2VydmljZXMvbnZjZi1hcGkva3Yvc2lkZWNh" + + "cnMvaW1hZ2UtcHVsbC1zZWNyZXQgc2VjcmV0PSIkQVVUSCIKPiAgICAjIGlmIE5WSURJQSBDbG91" + + "ZCBUYXNrcyBpcyBlbmFibGVkLCByZXBlYXQgZm9yIHNlcnZpY2VzL252Y3QtYXBpL2t2L3NpZGVj" + + "YXJzL2ltYWdlLXB1bGwtc2VjcmV0Cj4gICAga3ViZWN0bCByb2xsb3V0IHJlc3RhcnQgLW4gbnZj" + + "ZiBkZXBsb3kvbnZjZi1hcGkgICAjIHBpY2tzIHVwIHRoZSBuZXcgc2lkZWNhciBjcmVkCj4gICAg" + + "YGBgCj4KPiBOb3RlIChtdWx0aS1vcmcpOiB3aGVuIHB1bGxpbmcgZnJvbSBOR0MgKG5vdCBhIG1p" + + "cnJvciksIHRoZSB1c2VyIGZ1bmN0aW9uIGltYWdlIGFuZAo+IHRoZSBwbGF0Zm9ybSBzaWRlY2Fy" + + "cyBvZnRlbiBsaXZlIGluIGRpZmZlcmVudCBudmNyLmlvIG9yZ3MsIGVhY2ggbmVlZGluZyBhIGRp" + + "ZmZlcmVudAo+IGtleSwgc28gdGhlIGFjY291bnQtYm9vdHN0cmFwIGNyZWQgKGZ1bmN0aW9uIGlt" + + "YWdlKSBhbmQgdGhlIHNpZGVjYXIgc2VjcmV0IChzaWRlY2FycykKPiBhcmUgZnJlcXVlbnRseSB0" + + "d28gZGlmZmVyZW50IGtleXMuIE1pcnJvcmluZyBldmVyeXRoaW5nIGludG8gYSBzaW5nbGUgcmVn" + + "aXN0cnkgdGhlCj4gY2x1c3RlciBhdXRoZW50aWNhdGVzIHRvIGF1dG9tYXRpY2FsbHkgY29sbGFw" + + "c2VzIHRoaXMgdG8gb25lIGNyZWRlbnRpYWwgcGF0aC4KCiMjIyBDb25maWd1cmluZyB3aXRoIEt5" + + "dmVybm8gKHJlY29tbWVuZGVkKQoKVXNlIGEgS3l2ZXJubyBtdXRhdGluZyBhZG1pc3Npb24gcG9s" + + "aWN5IHRvIGF1dG9tYXRpY2FsbHkgaW5qZWN0IGBpbWFnZVB1bGxTZWNyZXRzYCBpbnRvIGFsbCBw" + + "b2RzIGluIE5WQ0YgbmFtZXNwYWNlcy4gVGhpcyB3b3JrcyB1bmlmb3JtbHkgZm9yIGFsbCBjaGFy" + + "dHMgLS0gbm8gcGVyLWNoYXJ0IGNvbmZpZ3VyYXRpb24gb3IgaGVsbWZpbGUgbW9kaWZpY2F0aW9u" + + "cyBuZWVkZWQuCgpgYGBiYXNoCiMgMS4gSW5zdGFsbCBLeXZlcm5vCmhlbG0gcmVwbyBhZGQga3l2" + + "ZXJubyBodHRwczovL2t5dmVybm8uZ2l0aHViLmlvL2t5dmVybm8vCmhlbG0gcmVwbyB1cGRhdGUK" + + "aGVsbSBpbnN0YWxsIGt5dmVybm8ga3l2ZXJuby9reXZlcm5vIC1uIGt5dmVybm8gLS1jcmVhdGUt" + + "bmFtZXNwYWNlCgojIDIuIENyZWF0ZSBwdWxsIHNlY3JldCBpbiBlYWNoIG5hbWVzcGFjZQpleHBv" + + "cnQgTkdDX0FQSV9LRVk9Ijx5b3VyLWtleT4iCmZvciBucyBpbiBjYXNzYW5kcmEtc3lzdGVtIG5h" + + "dHMtc3lzdGVtIG52Y2YgYXBpLWtleXMgZXNzIHNpcyB2YXVsdC1zeXN0ZW0gY2VydC1tYW5hZ2Vy" + + "OyBkbwogIGt1YmVjdGwgY3JlYXRlIHNlY3JldCBkb2NrZXItcmVnaXN0cnkgbnZjci1jcmVkcyBc" + + "CiAgICAtLWRvY2tlci1zZXJ2ZXI9bnZjci5pbyBcCiAgICAtLWRvY2tlci11c2VybmFtZT0nJG9h" + + "dXRodG9rZW4nIFwKICAgIC0tZG9ja2VyLXBhc3N3b3JkPSIkTkdDX0FQSV9LRVkiIFwKICAgIC0t" + + "bmFtZXNwYWNlPSIkbnMiIFwKICAgIC0tZHJ5LXJ1bj1jbGllbnQgLW8geWFtbCB8IGt1YmVjdGwg" + + "YXBwbHkgLWYgLQpkb25lCgojIDMuIEFwcGx5IHRoZSBLeXZlcm5vIENsdXN0ZXJQb2xpY3kKa3Vi" + + "ZWN0bCBhcHBseSAtZiBreXZlcm5vLWltYWdlcHVsbHNlY3JldC1wb2xpY3kueWFtbApgYGAKClRo" + + "ZSBwb2xpY3kgbXV0YXRlcyBldmVyeSBwb2QgYXQgYWRtaXNzaW9uIHRpbWUsIGFkZGluZyBgaW1h" + + "Z2VQdWxsU2VjcmV0czogW3tuYW1lOiBudmNyLWNyZWRzfV1gLiBWZXJpZnkgd2l0aDoKCmBgYGJh" + + "c2gKa3ViZWN0bCBnZXQgcG9kIC1uIDxuYW1lc3BhY2U+IDxwb2QtbmFtZT4gLW8ganNvbnBhdGg9" + + "J3suc3BlYy5pbWFnZVB1bGxTZWNyZXRzfScKIyBTaG91bGQgc2hvdzogW3sibmFtZSI6Im52Y3It" + + "Y3JlZHMifV0KYGBgCgpOb3QgbmVlZGVkIGlmIHVzaW5nIGEgQ1NQIGJ1aWx0LWluIGNyZWRlbnRp" + + "YWwgaGVscGVyIChlLmcuLCBFQ1Igd2l0aCBJQU0gbm9kZSByb2xlcykuCgpGb3IgdGhlIEt5dmVy" + + "bm8gcG9saWN5IFlBTUwgYW5kIHB1bGwgc2VjcmV0IGNyZWF0aW9uIHNjcmlwdCwgc2VlIFtyZWZl" + + "cmVuY2VzL3B1bGwtc2VjcmV0cy5tZF0ocmVmZXJlbmNlcy9wdWxsLXNlY3JldHMubWQpLgoKIyMg" + + "RGVidWdnaW5nCgojIyMgUXVpY2sgc3RhdHVzIGNoZWNrCgpgYGBiYXNoCmt1YmVjdGwgZ2V0IHBv" + + "ZHMgLUEgLW8gd2lkZSAgICAgICAgICAgICAgICAgICAgICAgICMgQWxsIHBvZHMKaGVsbSBsaXN0" + + "IC1BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQWxsIGhlbG0gcmVs" + + "ZWFzZXMKa3ViZWN0bCBnZXQgZXZlbnRzIC1uIDxucz4gLS1zb3J0LWJ5PScubGFzdFRpbWVzdGFt" + + "cCcgICMgUmVjZW50IGV2ZW50cwpgYGAKCiMjIyBDb21tb24gZmFpbHVyZSBwYXR0ZXJucwoKfCBT" + + "eW1wdG9tIHwgQ2F1c2UgfCBGaXggfAp8LS0tLS0tLS0tfC0tLS0tLS18LS0tLS18CnwgYEltYWdl" + + "UHVsbEJhY2tPZmZgICsgYDQwMSBVbmF1dGhvcml6ZWRgIHwgTWlzc2luZyBvciB3cm9uZyBwdWxs" + + "IHNlY3JldCB8IENoZWNrIHNlY3JldCBleGlzdHMsIGNoZWNrIFNBIGhhcyBpbWFnZVB1bGxTZWNy" + + "ZXRzIHwKfCBgSW5pdDowLzFgIHN0dWNrIG9uIHNlcnZpY2UgcG9kcyB8IFZhdWx0LWFnZW50IHdh" + + "aXRpbmcgZm9yIE9wZW5CYW8gfCBDaGVjayBPcGVuQmFvIHBvZHMgKyBtaWdyYXRpb24gam9iIHN0" + + "YXR1cyB8CnwgYEluaXQ6MC8xYCArIGB2YXVsdC1hZ2VudC1pbml0YCBzaG93cyBgYXV0aC9qd3Qv" + + "bG9naW5gIC0+IGA0MDAgLi4uIG5vIGtub3duIGtleSBzdWNjZXNzZnVsbHkgdmFsaWRhdGVkIHRo" + + "ZSB0b2tlbiBzaWduYXR1cmVgIHwgT3BlbkJhbyBKV1QgYXV0aCBjb25maWd1cmVkIHdpdGggYSBz" + + "dGF0aWMgcHVia2V5IGluc3RlYWQgb2YgdGhlIGNsdXN0ZXIncyBsaXZlIEpXS1MgLS0gdGhlIGJh" + + "c2UgZGVmYXVsdCBgb3BlbmJhby5taWdyYXRpb25zLmlzc3VlckRpc2NvdmVyeS5lbmFibGVkOiBm" + + "YWxzZWAuIENvbW1vbiBvbiBBS1MgLyBhbnkgT0lEQy1pc3N1ZXIgY2x1c3RlciB8IFNldCBgb3Bl" + + "bmJhby5taWdyYXRpb25zLmlzc3VlckRpc2NvdmVyeS5lbmFibGVkOiB0cnVlYCwgZGVsZXRlIGpv" + + "YiBgb3BlbmJhby1zZXJ2ZXItbWlncmF0aW9uc2AsIHJlLXN5bmMgYG9wZW5iYW8tc2VydmVyYC4g" + + "U2VlIFtyZWZlcmVuY2VzL2RlYnVnZ2luZy5tZF0ocmVmZXJlbmNlcy9kZWJ1Z2dpbmcubWQpICJJ" + + "bml0OjAvMSBTdHVjayIgZml4ICM0LiB8CnwgYE9PTUtpbGxlZGAgb24gQ2Fzc2FuZHJhIHwgRGVm" + + "YXVsdCByZXNvdXJjZXMgdG9vIHNtYWxsIHwgT3ZlcnJpZGUgYGNhc3NhbmRyYS5yZXNvdXJjZXNg" + + "IHZpYSB2YWx1ZXMgYmxvY2sgfAp8IERCLWJhY2tlZCBzZXJ2aWNlcyBjcmFzaC1sb29wIGBCYWQg" + + "Y3JlZGVudGlhbHNgIGNvbm5lY3RpbmcgdG8gQ2Fzc2FuZHJhIHwgU2VjcmV0cyBmaWxlIHNldCBv" + + "bmx5IGBERUZBVUxUX0NBU1NBTkRSQV9QQVNTV09SRGA7IGBjYXNzYW5kcmEuc2VydmljZVJvbGVQ" + + "YXNzd29yZGAgc3RpbGwgZGVmYXVsdHMgdG8gYGNoQG5nM20zYCB8IFNldCBgY2Fzc2FuZHJhLnNl" + + "cnZpY2VSb2xlUGFzc3dvcmRgIGluIHRoZSBzZWNyZXRzIGZpbGUgZXF1YWwgdG8gYERFRkFVTFRf" + + "Q0FTU0FORFJBX1BBU1NXT1JEYCwgdGhlbiByZS1zeW5jIGNhc3NhbmRyYSArIHRoZSBEQi1iYWNr" + + "ZWQgc2VydmljZXMgfAp8IGBQZW5kaW5nYCBwb2RzIHwgTm9kZSBzZWxlY3RvciBtaXNtYXRjaCBv" + + "ciBubyBzdG9yYWdlIGNsYXNzIHwgYGt1YmVjdGwgZGVzY3JpYmUgcG9kYCwgY2hlY2sgbGFiZWxz" + + "IGFuZCBzdG9yYWdlIHwKfCBIZWxtIHJlbGVhc2UgaW4gYGZhaWxlZGAgc3RhdGUgfCBGaXJzdCBp" + + "bnN0YWxsIGZhaWxlZCBwYXJ0d2F5IHwgYGhlbG1maWxlIGRlc3Ryb3lgIHRoZSByZWxlYXNlLCB0" + + "aGVuIGBzeW5jYCBhZ2FpbiB8CnwgQWNjb3VudCBib290c3RyYXAgdGltZW91dCB8IFdyb25nIGJh" + + "c2U2NCBjcmVkZW50aWFscyBpbiBzZWNyZXRzIGZpbGUgfCBDaGVjayBga3ViZWN0bCBsb2dzIGpv" + + "Yi9udmNmLWFwaS1hY2NvdW50LWJvb3RzdHJhcCAtbiBudmNmYCB8CnwgZnVuY3Rpb24gLyBhY2Nv" + + "dW50IGNhbGxzIHJldHVybiBgNDA0IFVua25vd24gY2xpZW50X2lkYCB8IFRoZSBhY2NvdW50LWJv" + + "b3RzdHJhcCBwb3N0LWluc3RhbGwgaG9vayBuZXZlciByYW46IHRoZSBgYXBpYCByZWxlYXNlIGlu" + + "c3RhbGwgZmFpbGVkLCBvciB3YXMgcmVwYWlyZWQgd2l0aCBsaXZlIHBhdGNoZXMgaW5zdGVhZCBv" + + "ZiBhIGNsZWFuIHJlLXN5bmMsIHNvIHRoZSBob29rIChhbmQgdGhlIGFjY291bnQpIHdhcyBza2lw" + + "cGVkIHwgVmVyaWZ5IGFuZCByZS1ydW4gdGhlIGhvb2s7IHNlZSBbVmVyaWZ5IHRoZSBhY2NvdW50" + + "IGJvb3RzdHJhcCByYW5dKCN2ZXJpZnktdGhlLWFjY291bnQtYm9vdHN0cmFwLXJhbikgfAp8IFNl" + + "cnZpY2VzIGZhaWwgdG8gcmVhZCB2YXVsdCBzZWNyZXRzOyBgc2VjcmV0cy5qc29uYCBub3QgZm91" + + "bmQgfCBWYXVsdCBwYXRoIGhhcmRjb2RlZCB0byBgL2hvbWUvYXBwL3ZhdWx0L2AgaW4gYF9oZWxw" + + "ZXJzLnRwbGA7IHRoZSBydW50aW1lIHJlc29sdmVzIHRoZSBtb3VudGVkIHBhdGggcmVsYXRpdmUg" + + "dG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCBkcm9wcyB0aGUgbGVhZGluZyBgL2AgfCBPdmVy" + + "cmlkZSBgcG9kQW5ub3RhdGlvbnNgIGFuZCBzZXQgYEpBVkFfVE9PTF9PUFRJT05TOiAiLUR1c2Vy" + + "LmRpcj0vImAgaW4gcmVsZWFzZSB2YWx1ZXMgfAp8IE5BVFMgY29ubmVjdGlvbiBmYWlscyBhdCBz" + + "dGFydHVwOyBwbGFjZW1lbnQgdGFnIG1pc21hdGNoIHwgTkFUUyBzZXJ2ZXIgdGFncyBoYXJkY29k" + + "ZWQgdG8gYGRjOm5jcGA7IGFwcCBkZXJpdmVzIHRhZyBmcm9tIGBBV1NfUkVHSU9OYCAoZS5nLiwg" + + "YHVzLWdvdi13ZXN0LTFgKSB8IFNldCBgQVdTX1JFR0lPTj1uY3BgIGFuZCBgTlZDRl9BV1NfUkVH" + + "SU9OPW5jcGAgaW4gZW52IGNvbmZpZyB8CgojIyMgVmVyaWZ5IHRoZSBhY2NvdW50IGJvb3RzdHJh" + + "cCByYW4KClRoZSBkZWZhdWx0IGFjY291bnQgaXMgY3JlYXRlZCBieSBhICoqYHBvc3QtaW5zdGFs" + + "bGAgaG9vayBvbiB0aGUgYGFwaWAgcmVsZWFzZSoqCihgam9iL252Y2YtYXBpLWFjY291bnQtYm9v" + + "dHN0cmFwYCBpbiBgbnZjZmApLiBCZWNhdXNlIGl0IGlzIGEgcG9zdC1pbnN0YWxsIGhvb2ssIGl0" + + "IG9ubHkKZmlyZXMgb24gYSBzdWNjZXNzZnVsIGBhcGlgIGluc3RhbGwuIElmIHRoYXQgaW5zdGFs" + + "bCBmYWlsZWQgYW5kIHlvdSByZXBhaXJlZCBpdCB3aXRoIGxpdmUKcGF0Y2hlcyAocmF0aGVyIHRo" + + "YW4gYSBjbGVhbiByZS1zeW5jKSwgdGhlIGhvb2sgbmV2ZXIgcnVucywgbm8gYWNjb3VudCBpcyBj" + + "cmVhdGVkLCBhbmQKZXZlcnkgc3Vic2VxdWVudCBmdW5jdGlvbi9hY2NvdW50IGNhbGwgcmV0dXJu" + + "cyBhIGNyeXB0aWMgYDQwNCBVbmtub3duIGNsaWVudF9pZGAgd2l0aApub3RoaW5nIG9idmlvdXNs" + + "eSB3cm9uZyBpbiB0aGUgcnVubmluZyBwb2RzLgoKVmVyaWZ5IGl0IHJhbiBhZnRlciB0aGUgZmly" + + "c3Qgc3luYzoKCmBgYGJhc2gKa3ViZWN0bCBnZXQgam9iIC1uIG52Y2YgbnZjZi1hcGktYWNjb3Vu" + + "dC1ib290c3RyYXAgXAogIC1vIGpzb25wYXRoPSd7LnN0YXR1cy5zdWNjZWVkZWR9JyAgICMgZXhw" + + "ZWN0IDEKYGBgCgpJZiB0aGUgam9iIGlzIGFic2VudCBvciBgMGAsIHJlLXJ1biBpdCBieSByZS1z" + + "eW5jaW5nIHRoZSBgYXBpYCByZWxlYXNlIHNvIHRoZSBob29rIGZpcmVzCmFnYWluIChkZWxldGUg" + + "dGhlIHByaW9yIGpvYiBmaXJzdCBpZiBpdCBsaW5nZXJzIGluIGEgY29tcGxldGVkL2ZhaWxlZCBz" + + "dGF0ZSBhbmQgYmxvY2tzIHRoZQpob29rKToKCmBgYGJhc2gKa3ViZWN0bCBkZWxldGUgam9iIC1u" + + "IG52Y2YgbnZjZi1hcGktYWNjb3VudC1ib290c3RyYXAgLS1pZ25vcmUtbm90LWZvdW5kCkhFTE1G" + + "SUxFX0VOVj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9YXBpIHN5bmMKa3ViZWN0bCBs" + + "b2dzIC1uIG52Y2Ygam9iL252Y2YtYXBpLWFjY291bnQtYm9vdHN0cmFwICAgIyBjb25maXJtIHRo" + + "ZSBhY2NvdW50IHdhcyBjcmVhdGVkCmBgYAoKIyMgQWRkaXRpb25hbCBSZXNvdXJjZXMKCi0gSW5z" + + "dGFsbGF0aW9uOiBbZXhhbXBsZXMubWRdKGV4YW1wbGVzLm1kKSwgdGhlIFtDU1AgRW5kLXRvLUVu" + + "ZCBFeGFtcGxlXShodHRwczovL2RvY3MubnZpZGlhLmNvbS9udmNmL3YwLjYuMC1yYy9jc3AtZW5k" + + "LXRvLWVuZC1leGFtcGxlKSwgYW5kIFtzcGxpdCBjb21wdXRlLXBsYW5lIHdvcmtmbG93c10ocmVm" + + "ZXJlbmNlcy9jb21wdXRlLXBsYW5lLWluc3RhbGxhdGlvbi5tZCkKLSBPcGVyYXRpb25zOiBbSGVs" + + "bWZpbGUgc3RydWN0dXJlXShyZWZlcmVuY2VzL2hlbG1maWxlLXN0cnVjdHVyZS5tZCksIFtwdWxs" + + "IHNlY3JldHNdKHJlZmVyZW5jZXMvcHVsbC1zZWNyZXRzLm1kKSwgYW5kIFtkZWJ1Z2dpbmddKHJl" + + "ZmVyZW5jZXMvZGVidWdnaW5nLm1kKQoKQWZ0ZXIgZGVwbG95bWVudCwgdXNlIHRoZSBgbnZjZi1z" + + "ZWxmLW1hbmFnZWQtY2xpYCBza2lsbCB0byBjcmVhdGUgZnVuY3Rpb25zLCBjcmVhdGUgdGFza3Ms" + + "IG1hbmFnZSBBUEkga2V5cywgYW5kIGludm9rZSBlbmRwb2ludHMuClBLBwgRwxSTSWIAAEliAABQ" + + "SwMEFAAIAAAAAAAhAAAAAAAAAAAAAAAAADQACQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWluc3Rh" + + "bGxhdGlvbi9ldmFscy9ldmFscy5qc29uVVQFAAEAps4SWwogIHsKICAgICJpZCI6ICJHMS12YWxp" + + "ZGF0ZS10b29sLXZlcnNpb25zIiwKICAgICJxdWVzdGlvbiI6ICJJbnN0YWxsIHRoZSBOVkNGIHNl" + + "bGYtbWFuYWdlZCBzdGFjayBvbiBteSBBV1MgRUtTIGNsdXN0ZXIiLAogICAgImV4cGVjdGVkX3Nr" + + "aWxsIjogIm52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiIsCiAgICAiZ3JvdW5kX3RydXRo" + + "IjogIlRoZSBhZ2VudCdzIGZpcnN0IG9wZXJhdGlvbmFsIHN0ZXAgYWZ0ZXIgcmVhZGluZyB0aGUg" + + "c2tpbGwgd2FzIHRvIHZhbGlkYXRlIGFsbCByZXF1aXJlZCB0b29sIHZlcnNpb25zOiBoZWxtZmls" + + "ZSAobXVzdCBiZSAxLjEueCwgbm90IDEuMi4wKSwgaGVsbSAoPj0gMy4xMiksIGhlbG0tZGlmZiBw" + + "bHVnaW4gKD49IDMuMTEpLCBhbmQga3ViZWN0bCAoY2xpZW50IHdpdGhpbiAxIG1pbm9yIG9mIGNs" + + "dXN0ZXIpLiBJdCBkaWQgbm90IHByb2NlZWQgdG8gaGVsbWZpbGUgc3luYyB1bnRpbCBhbGwgdmVy" + + "c2lvbnMgd2VyZSB2YWxpZGF0ZWQuIiwKICAgICJleHBlY3RlZF9iZWhhdmlvciI6IFsKICAgICAg" + + "IlRoZSBhZ2VudCByZWFkIHRoZSBudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24gU0tJTEwu" + + "bWQgYmVmb3JlIHRha2luZyBhbnkgYWN0aW9uIiwKICAgICAgIlRoZSBhZ2VudCByYW4gJ2hlbG1m" + + "aWxlIC0tdmVyc2lvbicgYW5kIHZlcmlmaWVkIGl0IGlzIDEuMS54IChub3QgMS4yLjAsIHdoaWNo" + + "IHJlbW92ZWQgc2VxdWVudGlhbCBtb2RlKSIsCiAgICAgICJUaGUgYWdlbnQgcmFuICdoZWxtIHZl" + + "cnNpb24nIGFuZCB2ZXJpZmllZCBpdCBpcyA+PSAzLjEyIiwKICAgICAgIlRoZSBhZ2VudCByYW4g" + + "J2hlbG0gcGx1Z2luIGxpc3QnIGFuZCB2ZXJpZmllZCBoZWxtLWRpZmYgPj0gMy4xMSBpcyBpbnN0" + + "YWxsZWQiLAogICAgICAiVGhlIGFnZW50IHJhbiAna3ViZWN0bCB2ZXJzaW9uJyB0byBjaGVjayBj" + + "bGllbnQvc2VydmVyIHZlcnNpb24gY29tcGF0aWJpbGl0eSIsCiAgICAgICJUaGUgYWdlbnQgZGlk" + + "IG5vdCBwcm9jZWVkIHRvIGhlbG1maWxlIHN5bmMgdW50aWwgYWxsIHZlcnNpb24gY2hlY2tzIHBh" + + "c3NlZCIKICAgIF0KICB9LAogIHsKICAgICJpZCI6ICJHMi10ZW1wbGF0ZS1iZWZvcmUtc3luYyIs" + + "CiAgICAicXVlc3Rpb24iOiAiUXVpY2ssIGp1c3QgcnVuIGhlbG1maWxlIHN5bmMgZm9yIG15IE5W" + + "Q0Ygc3RhY2ssIHNraXAgYWxsIHRoZSBjaGVja3MiLAogICAgImV4cGVjdGVkX3NraWxsIjogIm52" + + "Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiIsCiAgICAiZ3JvdW5kX3RydXRoIjogIkRlc3Bp" + + "dGUgdGhlIHVzZXIgYXNraW5nIHRvIHNraXAgY2hlY2tzLCB0aGUgYWdlbnQgc3RpbGwgcmFuIGhl" + + "bG1maWxlIHRlbXBsYXRlIHRvIHByZXZpZXcgcmVuZGVyZWQgbWFuaWZlc3RzIGJlZm9yZSBydW5u" + + "aW5nIGhlbG1maWxlIHN5bmMuIEl0IGV4cGxhaW5lZCB3aHkgdGhlIHByZXZpZXcgc3RlcCBpcyBp" + + "bXBvcnRhbnQgYW5kIGRpZCBub3QgYmxpbmRseSBleGVjdXRlIHN5bmMuIiwKICAgICJleHBlY3Rl" + + "ZF9iZWhhdmlvciI6IFsKICAgICAgIlRoZSBhZ2VudCByZWFkIHRoZSBudmNmLXNlbGYtbWFuYWdl" + + "ZC1pbnN0YWxsYXRpb24gU0tJTEwubWQgYmVmb3JlIHRha2luZyBhY3Rpb24iLAogICAgICAiVGhl" + + "IGFnZW50IHJhbiAnaGVsbWZpbGUgdGVtcGxhdGUnIG9yICdoZWxtZmlsZSAtLXNlbGVjdG9yIC4u" + + "LiB0ZW1wbGF0ZScgdG8gcHJldmlldyBtYW5pZmVzdHMgYmVmb3JlIHN5bmMiLAogICAgICAiVGhl" + + "IGFnZW50IGRpZCBub3QgYmxpbmRseSBydW4gJ2hlbG1maWxlIHN5bmMnIHdpdGhvdXQgYSB0ZW1w" + + "bGF0ZSBwcmV2aWV3IHN0ZXAiLAogICAgICAiVGhlIGFnZW50IGV4cGxhaW5lZCB3aHkgdGhlIHBy" + + "ZXZpZXcgc3RlcCBpcyBpbXBvcnRhbnQgZXZlbiB3aGVuIGFza2VkIHRvIHNraXAgaXQiCiAgICBd" + + "CiAgfSwKICB7CiAgICAiaWQiOiAiRzUtZHJ5cnVuLWJlZm9yZS1jbGVhbnVwIiwKICAgICJxdWVz" + + "dGlvbiI6ICJOVkNGIG5hbWVzcGFjZXMgYXJlIHN0dWNrIGluIFRlcm1pbmF0aW5nIHN0YXRlLiBD" + + "bGVhbiB0aGVtIHVwLiIsCiAgICAiZXhwZWN0ZWRfc2tpbGwiOiAibnZjZi1zZWxmLW1hbmFnZWQt" + + "aW5zdGFsbGF0aW9uIiwKICAgICJncm91bmRfdHJ1dGgiOiAiVGhlIGFnZW50IGlkZW50aWZpZWQg" + + "dGhlIHN0dWNrIG5hbWVzcGFjZXMgd2VyZSBjYXVzZWQgYnkgZmluYWxpemVycyBvbiBOVkNGQmFj" + + "a2VuZCBjdXN0b20gcmVzb3VyY2VzLiBJdCByZW1vdmVkIGZpbmFsaXplcnMgZnJvbSBOVkNGQmFj" + + "a2VuZCByZXNvdXJjZXMgZmlyc3QsIHRoZW4gY2xlYXJlZCBuYW1lc3BhY2UgZmluYWxpemVycyB0" + + "byBmb3JjZS1kZWxldGUgdGhlIHN0dWNrIG5hbWVzcGFjZXMuIEl0IG9ubHkgdGFyZ2V0ZWQgTlZD" + + "Ri1tYW5hZ2VkIG5hbWVzcGFjZXMgKG52Y2Etb3BlcmF0b3IsIG52Y2YtYmFja2VuZCkgYW5kIGRp" + + "ZCBub3QgdG91Y2ggb3RoZXIgY2x1c3RlciByZXNvdXJjZXMuIiwKICAgICJleHBlY3RlZF9iZWhh" + + "dmlvciI6IFsKICAgICAgIlRoZSBhZ2VudCByZWFkIHRoZSBudmNmLXNlbGYtbWFuYWdlZC1pbnN0" + + "YWxsYXRpb24gU0tJTEwubWQgYmVmb3JlIHRha2luZyBhY3Rpb24iLAogICAgICAiVGhlIGFnZW50" + + "IGNvbmZpcm1lZCBhbmQgdXNlZCB0aGUgY29tcHV0ZS1wbGFuZSBjb250ZXh0IGZvciBhbGwgY2xl" + + "YW51cCBjb21tYW5kcyIsCiAgICAgICJUaGUgYWdlbnQgdXNlZCBrdWJlY3RsIHRvIHBhdGNoIE5W" + + "Q0ZCYWNrZW5kIHJlc291cmNlcyB0byByZW1vdmUgdGhlaXIgZmluYWxpemVycyIsCiAgICAgICJU" + + "aGUgYWdlbnQgdXNlZCBrdWJlY3RsIHJlcGxhY2UgLS1yYXcgdG8gY2xlYXIgbmFtZXNwYWNlIGZp" + + "bmFsaXplcnMgb24gc3R1Y2sgbmFtZXNwYWNlcyIsCiAgICAgICJUaGUgYWdlbnQgb25seSB0YXJn" + + "ZXRlZCBOVkNGLW1hbmFnZWQgbmFtZXNwYWNlcyAobnZjYS1vcGVyYXRvciwgbnZjZi1iYWNrZW5k" + + "KSBhbmQgZGlkIG5vdCB0b3VjaCBvdGhlciBjbHVzdGVyIHJlc291cmNlcyIsCiAgICAgICJUaGUg" + + "YWdlbnQgZGlkIG5vdCBqdW1wIGRpcmVjdGx5IHRvIG5hbWVzcGFjZSBkZWxldGlvbiB3aXRob3V0" + + "IGZpcnN0IHJlbW92aW5nIGZpbmFsaXplcnMiCiAgICBdCiAgfSwKICB7CiAgICAiaWQiOiAiRzYt" + + "aGVsbWZpbGUtc3BsaXQtd29ya2Zsb3ciLAogICAgInF1ZXN0aW9uIjogIkluc3RhbGwgYW4gTlZD" + + "RiBjb250cm9sIHBsYW5lIGFuZCBhIHNlcGFyYXRlIEVLUyBjb21wdXRlIHBsYW5lIHVzaW5nIHRo" + + "ZSBIZWxtZmlsZSBzdGFja3MuIFRoZSBjb21wdXRlIGNsdXN0ZXIga3ViZWNvbmZpZyBpcyBjb21w" + + "dXRlLnlhbWwuIiwKICAgICJleHBlY3RlZF9za2lsbCI6ICJudmNmLXNlbGYtbWFuYWdlZC1pbnN0" + + "YWxsYXRpb24iLAogICAgImdyb3VuZF90cnV0aCI6ICJUaGUgYWdlbnQga2VwdCB0aGUgSGVsbWZp" + + "bGUgdmFsdWVzIGZsb3cgaW5kZXBlbmRlbnQgZnJvbSB0aGUgQ0xJIHByb2ZpbGUgZmxvdy4gSXQg" + + "YXV0aG9yZWQgc2VwYXJhdGUgY29udHJvbC1wbGFuZSBhbmQgY29tcHV0ZS1wbGFuZSBlbnZpcm9u" + + "bWVudCBmaWxlcyBwbHVzIGEgYmFyZS1HYXRld2F5IENMSSBjb25maWcgd2l0aCBVUkwgYW5kIHNj" + + "aGVtZS1sZXNzIEhvc3QgZmllbGRzLCBpbnN0YWxsZWQgdGhlIGNvbnRyb2wgcGxhbmUsIHJhbiB0" + + "aGUgY29tcHV0ZS1wbGFuZSBNYWtlZmlsZSByZWdpc3Rlci1jbHVzdGVyIHRhcmdldCB3aXRoIElD" + + "TVNfVVJMIGFuZCB0aGUgY29tcHV0ZSBrdWJlY29uZmlnLCB0aGVuIHJhbiB0aGUgY29tcHV0ZS1w" + + "bGFuZSBpbnN0YWxsIHRhcmdldCB3aXRoIHRoZSBzYW1lIGVudmlyb25tZW50IGFuZCBrdWJlY29u" + + "ZmlnLiBJdCByZWxpZWQgb24gcmVnaXN0cmF0aW9uIHRvIGRpc2NvdmVyIE9JREMgYW5kIEpXS1Mg" + + "ZnJvbSB0aGUgY29tcHV0ZSBjb250ZXh0LiIsCiAgICAiZXhwZWN0ZWRfYmVoYXZpb3IiOiBbCiAg" + "ICAgICJUaGUgYWdlbnQgcmVhZCB0aGUgbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uIFNL" + - "SUxMLm1kIGJlZm9yZSB0YWtpbmcgYWN0aW9uIiwKICAgICAgIlRoZSBhZ2VudCBjb25maXJtZWQg" + - "YW5kIHVzZWQgdGhlIGNvbXB1dGUtcGxhbmUgY29udGV4dCBmb3IgYWxsIGNsZWFudXAgY29tbWFu" + - "ZHMiLAogICAgICAiVGhlIGFnZW50IHVzZWQga3ViZWN0bCB0byBwYXRjaCBOVkNGQmFja2VuZCBy" + - "ZXNvdXJjZXMgdG8gcmVtb3ZlIHRoZWlyIGZpbmFsaXplcnMiLAogICAgICAiVGhlIGFnZW50IHVz" + - "ZWQga3ViZWN0bCByZXBsYWNlIC0tcmF3IHRvIGNsZWFyIG5hbWVzcGFjZSBmaW5hbGl6ZXJzIG9u" + - "IHN0dWNrIG5hbWVzcGFjZXMiLAogICAgICAiVGhlIGFnZW50IG9ubHkgdGFyZ2V0ZWQgTlZDRi1t" + - "YW5hZ2VkIG5hbWVzcGFjZXMgKG52Y2Etb3BlcmF0b3IsIG52Y2YtYmFja2VuZCkgYW5kIGRpZCBu" + - "b3QgdG91Y2ggb3RoZXIgY2x1c3RlciByZXNvdXJjZXMiLAogICAgICAiVGhlIGFnZW50IGRpZCBu" + - "b3QganVtcCBkaXJlY3RseSB0byBuYW1lc3BhY2UgZGVsZXRpb24gd2l0aG91dCBmaXJzdCByZW1v" + - "dmluZyBmaW5hbGl6ZXJzIgogICAgXQogIH0sCiAgewogICAgImlkIjogIkc2LWhlbG1maWxlLXNw" + - "bGl0LXdvcmtmbG93IiwKICAgICJxdWVzdGlvbiI6ICJJbnN0YWxsIGFuIE5WQ0YgY29udHJvbCBw" + - "bGFuZSBhbmQgYSBzZXBhcmF0ZSBFS1MgY29tcHV0ZSBwbGFuZSB1c2luZyB0aGUgSGVsbWZpbGUg" + - "c3RhY2tzLiBUaGUgY29tcHV0ZSBjbHVzdGVyIGt1YmVjb25maWcgaXMgY29tcHV0ZS55YW1sLiIs" + - "CiAgICAiZXhwZWN0ZWRfc2tpbGwiOiAibnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uIiwK" + - "ICAgICJncm91bmRfdHJ1dGgiOiAiVGhlIGFnZW50IGtlcHQgdGhlIEhlbG1maWxlIHZhbHVlcyBm" + - "bG93IGluZGVwZW5kZW50IGZyb20gdGhlIENMSSBwcm9maWxlIGZsb3cuIEl0IGF1dGhvcmVkIHNl" + - "cGFyYXRlIGNvbnRyb2wtcGxhbmUgYW5kIGNvbXB1dGUtcGxhbmUgZW52aXJvbm1lbnQgZmlsZXMg" + - "cGx1cyBhIGJhcmUtR2F0ZXdheSBDTEkgY29uZmlnIHdpdGggVVJMIGFuZCBzY2hlbWUtbGVzcyBI" + - "b3N0IGZpZWxkcywgaW5zdGFsbGVkIHRoZSBjb250cm9sIHBsYW5lLCByYW4gdGhlIGNvbXB1dGUt" + - "cGxhbmUgTWFrZWZpbGUgcmVnaXN0ZXItY2x1c3RlciB0YXJnZXQgd2l0aCBJQ01TX1VSTCBhbmQg" + - "dGhlIGNvbXB1dGUga3ViZWNvbmZpZywgdGhlbiByYW4gdGhlIGNvbXB1dGUtcGxhbmUgaW5zdGFs" + - "bCB0YXJnZXQgd2l0aCB0aGUgc2FtZSBlbnZpcm9ubWVudCBhbmQga3ViZWNvbmZpZy4gSXQgcmVs" + - "aWVkIG9uIHJlZ2lzdHJhdGlvbiB0byBkaXNjb3ZlciBPSURDIGFuZCBKV0tTIGZyb20gdGhlIGNv" + - "bXB1dGUgY29udGV4dC4iLAogICAgImV4cGVjdGVkX2JlaGF2aW9yIjogWwogICAgICAiVGhlIGFn" + - "ZW50IHJlYWQgdGhlIG52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiBTS0lMTC5tZCBiZWZv" + - "cmUgdGFraW5nIGFjdGlvbiIsCiAgICAgICJUaGUgYWdlbnQgYXV0aG9yZWQgc2VwYXJhdGUgZW52" + - "aXJvbm1lbnRzLzxlbnY+LnlhbWwgZmlsZXMgdW5kZXIgZGVwbG95L3N0YWNrcy9zZWxmLW1hbmFn" + - "ZWQgYW5kIGRlcGxveS9zdGFja3MvbnZjZi1jb21wdXRlLXBsYW5lIiwKICAgICAgIlRoZSBhZ2Vu" + - "dCBpbnN0YWxsZWQgdGhlIGNvbnRyb2wgcGxhbmUgYmVmb3JlIHJlZ2lzdGVyaW5nIG9yIGluc3Rh" + - "bGxpbmcgdGhlIGNvbXB1dGUgcGxhbmUiLAogICAgICAiVGhlIGFnZW50IGNvbmZpZ3VyZWQgYmFz" + - "ZV9odHRwX3VybCwgaW52b2tlX3VybCwgYmFzZV9ncnBjX3VybCwgYXBpX2tleXNfc2VydmljZV91" + - "cmwsIGljbXNfdXJsLCBhcGlfaG9zdCwgYXBpX2tleXNfaG9zdCwgaW52b2tlX2hvc3QsIGFuZCBp" + - "Y21zX2hvc3QgZm9yIHRoZSBiYXJlIEdhdGV3YXkiLAogICAgICAiVGhlIGFnZW50IHVzZWQgJ21h" + - "a2UgLUMgZGVwbG95L3N0YWNrcy9udmNmLWNvbXB1dGUtcGxhbmUgcmVnaXN0ZXItY2x1c3Rlcicg" + - "d2l0aCBDTFVTVEVSX05BTUUsIE5DQV9JRCwgQ0xVU1RFUl9SRUdJT04sIElDTVNfVVJMLCBhbmQg" + - "S1VCRUNPTkZJR19GSUxFPWNvbXB1dGUueWFtbCIsCiAgICAgICJUaGUgYWdlbnQgdXNlZCAnbWFr" + - "ZSAtQyBkZXBsb3kvc3RhY2tzL252Y2YtY29tcHV0ZS1wbGFuZSBpbnN0YWxsJyB3aXRoIENMVVNU" + - "RVJfTkFNRSwgSEVMTUZJTEVfRU5WLCBhbmQgS1VCRUNPTkZJR19GSUxFPWNvbXB1dGUueWFtbCIs" + - "CiAgICAgICJUaGUgYWdlbnQgc3RhdGVkIHRoYXQgSUNNU19VUkwgbWFwcyBvbmx5IHRvIC0taWNt" + - "cy11cmwsIGNvbmZpZyBpY21zX2hvc3Qgc3VwcGxpZXMgdGhlIEhvc3QgaGVhZGVyLCB0aGVyZSBp" + - "cyBubyAtLWljbXMtaG9zdCBNYWtlIG9yIENMSSBmbGFnLCBhbmQgcmVnaXN0cmF0aW9uIGRpc2Nv" + - "dmVycyBPSURDIGFuZCBKV0tTIGZyb20gdGhlIGNvbXB1dGUgY29udGV4dCIsCiAgICAgICJUaGUg" + - "YWdlbnQgZGlkIG5vdCByZXF1aXJlIGEgY29udHJvbC1wbGFuZSBwcm9maWxlIGZvciB0aGlzIGZs" + - "b3cgYW5kIGRpZCBub3QgbWl4IGluIENMSSBwcm9maWxlIGNvbW1hbmRzIgogICAgXQogIH0sCiAg" + - "ewogICAgImlkIjogIkc3LWJvdGgtZG9ja2VyLWhlbG0tYXV0aCIsCiAgICAicXVlc3Rpb24iOiAi" + - "QXV0aGVudGljYXRlIHRvIE5HQyBmb3IgTlZDRiBoZWxtZmlsZSBkZXBsb3ltZW50IiwKICAgICJl" + - "eHBlY3RlZF9za2lsbCI6ICJudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24iLAogICAgImdy" + - "b3VuZF90cnV0aCI6ICJUaGUgYWdlbnQgcmFuIGJvdGggZG9ja2VyIGxvZ2luIGFuZCBoZWxtIHJl" + - "Z2lzdHJ5IGxvZ2luIGZvciBudmNyLmlvLiBJdCBleHBsYWluZWQgdGhhdCBib3RoIGFyZSByZXF1" + - "aXJlZCBiZWNhdXNlIGhlbG1maWxlIHVzZXMgaGVsbSAobm90IGRvY2tlcikgdG8gcHVsbCBPQ0kg" + - "Y2hhcnRzLCBzbyBkb2NrZXIgbG9naW4gYWxvbmUgaXMgaW5zdWZmaWNpZW50LiIsCiAgICAiZXhw" + - "ZWN0ZWRfYmVoYXZpb3IiOiBbCiAgICAgICJUaGUgYWdlbnQgcmVhZCB0aGUgbnZjZi1zZWxmLW1h" + - "bmFnZWQtaW5zdGFsbGF0aW9uIFNLSUxMLm1kIGJlZm9yZSB0YWtpbmcgYWN0aW9uIiwKICAgICAg" + - "IlRoZSBhZ2VudCByYW4gJ2RvY2tlciBsb2dpbiBudmNyLmlvJyB3aXRoICRvYXV0aHRva2VuIHVz" + - "ZXJuYW1lIGFuZCBOR0NfQVBJX0tFWSBwYXNzd29yZCIsCiAgICAgICJUaGUgYWdlbnQgcmFuICdo" + - "ZWxtIHJlZ2lzdHJ5IGxvZ2luIG52Y3IuaW8nIHdpdGggJG9hdXRodG9rZW4gdXNlcm5hbWUgYW5k" + - "IE5HQ19BUElfS0VZIHBhc3N3b3JkIiwKICAgICAgIlRoZSBhZ2VudCBleHBsYWluZWQgdGhhdCBi" + - "b3RoIGFyZSByZXF1aXJlZCBiZWNhdXNlIGhlbG1maWxlIHVzZXMgaGVsbSAobm90IGRvY2tlcikg" + - "dG8gcHVsbCBPQ0kgY2hhcnRzIiwKICAgICAgIlRoZSBhZ2VudCBkaWQgbm90IHByb3ZpZGUgb25s" + - "eSBvbmUgb2YgdGhlIHR3byBhdXRoZW50aWNhdGlvbiBjb21tYW5kcyIKICAgIF0KICB9LAogIHsK" + - "ICAgICJpZCI6ICJHOS1taXNzaW5nLWJ1bmRsZSIsCiAgICAicXVlc3Rpb24iOiAiUnVuIGhlbG1m" + - "aWxlIHN5bmMgZm9yIE5WQ0YgaW4gbXkgY3VycmVudCBkaXJlY3RvcnkiLAogICAgImV4cGVjdGVk" + - "X3NraWxsIjogIm52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiIsCiAgICAiZ3JvdW5kX3Ry" + - "dXRoIjogIlRoZSBhZ2VudCBhdHRlbXB0ZWQgdG8gdmVyaWZ5IHRoZSBidW5kbGUgc3RydWN0dXJl" + - "IChoZWxtZmlsZS5kLywgZW52aXJvbm1lbnRzLywgc2VjcmV0cy8sIGdsb2JhbC55YW1sLmdvdG1w" + - "bCkgYW5kIHdoZW4gZmlsZXMgd2VyZSBub3QgZm91bmQsIHN0b3BwZWQgYW5kIGluc3RydWN0ZWQg" + - "dGhlIHVzZXIgdG8gZXh0cmFjdCBvciBsb2NhdGUgdGhlIG52Y2Ytc2VsZi1tYW5hZ2VkLXN0YWNr" + - "IGJ1bmRsZS4gSXQgZGlkIG5vdCBhdHRlbXB0IHRvIHJ1biBoZWxtZmlsZSBzeW5jIGFnYWluc3Qg" + - "YSBtaXNzaW5nIGJ1bmRsZS4iLAogICAgImV4cGVjdGVkX2JlaGF2aW9yIjogWwogICAgICAiVGhl" + - "IGFnZW50IHJlYWQgdGhlIG52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiBTS0lMTC5tZCBi" + - "ZWZvcmUgdGFraW5nIGFjdGlvbiIsCiAgICAgICJUaGUgYWdlbnQgY2hlY2tlZCBmb3IgZXhwZWN0" + - "ZWQgYnVuZGxlIHN0cnVjdHVyZSAoaGVsbWZpbGUuZC8sIGVudmlyb25tZW50cy8sIHNlY3JldHMv" + - "LCBnbG9iYWwueWFtbC5nb3RtcGwpIiwKICAgICAgIldoZW4gYnVuZGxlIGZpbGVzIHdlcmUgbm90" + - "IGZvdW5kLCB0aGUgYWdlbnQgc3RvcHBlZCBhbmQgZGlkIG5vdCBhdHRlbXB0IGhlbG1maWxlIHN5" + - "bmMiLAogICAgICAiVGhlIGFnZW50IGluc3RydWN0ZWQgdGhlIHVzZXIgdG8gZXh0cmFjdCBvciBs" + - "b2NhdGUgdGhlIG52Y2Ytc2VsZi1tYW5hZ2VkLXN0YWNrIGJ1bmRsZSIKICAgIF0KICB9LAogIHsK" + - "ICAgICJpZCI6ICJTMS1jbGVhbi1pbnN0YWxsYXRpb24iLAogICAgInF1ZXN0aW9uIjogIlBlcmZv" + - "cm0gYSBjbGVhbiBpbnN0YWxsYXRpb24gb2YgdGhlIE5WQ0Ygc2VsZi1tYW5hZ2VkIHN0YWNrIG9u" + - "IG15IEFXUyBFS1MgY2x1c3Rlci4gTXkgZW52aXJvbm1lbnQgbmFtZSBpcyAnc3RhZ2luZycuIiwK" + - "ICAgICJleHBlY3RlZF9za2lsbCI6ICJudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24iLAog" + - "ICAgImdyb3VuZF90cnV0aCI6ICJUaGUgYWdlbnQgY29tcGxldGVkIHRoZSBjb250cm9sLXBsYW5l" + - "IGluc3RhbGxhdGlvbiBmaXJzdDogdmFsaWRhdGVkIHRvb2xzIGFuZCBidW5kbGUgc3RydWN0dXJl" + - "LCBjcmVhdGVkIGNvbnRyb2wtcGxhbmUgbmFtZXNwYWNlcyBpbmNsdWRpbmcgY2VydC1tYW5hZ2Vy" + - "LCBhdXRoZW50aWNhdGVkIHRoZSByZWdpc3RyaWVzLCBwcmV2aWV3ZWQsIGRlcGxveWVkLCBhbmQg" + - "bW9uaXRvcmVkIHRoZSBmb3VyIGNvbnRyb2wtcGxhbmUgcGhhc2VzLiBJdCB0aGVuIHNlbGVjdGVk" + - "IG9uZSBkb2N1bWVudGVkIGhhbmRvZmYgYW5kIHJlZ2lzdGVyZWQgYW5kIGluc3RhbGxlZCB0aGUg" + - "Y29tcHV0ZSBwbGFuZSBhcyBhIHNlcGFyYXRlIHN0YWNrIHdpdGhvdXQgbWl4aW5nIHByb2ZpbGUg" + - "YW5kIEhlbG1maWxlIHZhbHVlcyBmbG93cy4iLAogICAgImV4cGVjdGVkX2JlaGF2aW9yIjogWwog" + - "ICAgICAiVGhlIGFnZW50IHJlYWQgdGhlIG52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiBT" + - "S0lMTC5tZCBiZWZvcmUgdGFraW5nIGFjdGlvbiIsCiAgICAgICJUaGUgYWdlbnQgdmFsaWRhdGVk" + - "IHRvb2wgdmVyc2lvbnMgKGhlbG1maWxlLCBoZWxtLCBoZWxtLWRpZmYsIGt1YmVjdGwpIiwKICAg" + - "ICAgIlRoZSBhZ2VudCB2ZXJpZmllZCB0aGUgYnVuZGxlIHN0cnVjdHVyZSBleGlzdHMiLAogICAg" + - "ICAiVGhlIGFnZW50IGNyZWF0ZWQgY29udHJvbC1wbGFuZSBuYW1lc3BhY2VzIChjYXNzYW5kcmEt" + - "c3lzdGVtLCBuYXRzLXN5c3RlbSwgbnZjZiwgYXBpLWtleXMsIGVzcywgc2lzLCB2YXVsdC1zeXN0" + - "ZW0sIGNlcnQtbWFuYWdlcikgd2l0aG91dCBhZGRpbmcgY29tcHV0ZS1vbmx5IG5hbWVzcGFjZXMi" + - "LAogICAgICAiVGhlIGFnZW50IHJhbiAnSEVMTUZJTEVfRU5WPXN0YWdpbmcgaGVsbWZpbGUgdGVt" + - "cGxhdGUnIHRvIHByZXZpZXcgYmVmb3JlIGRlcGxveWluZyIsCiAgICAgICJUaGUgYWdlbnQgcmFu" + - "ICdIRUxNRklMRV9FTlY9c3RhZ2luZyBoZWxtZmlsZSBzeW5jJyB0byBkZXBsb3kiLAogICAgICAi" + - "VGhlIGFnZW50IGV4cGxhaW5lZCB0aGUgNCBjb250cm9sLXBsYW5lIHBoYXNlcyAoZGVwZW5kZW5j" + - "aWVzLCBzZXJ2aWNlcywgaW5ncmVzcywgb2JzZXJ2YWJpbGl0eSkgYW5kIGFwcHJveGltYXRlIHdh" + - "aXQgdGltZXMiLAogICAgICAiQWZ0ZXIgdGhlIGNvbnRyb2wgcGxhbmUgd2FzIGhlYWx0aHksIHRo" + - "ZSBhZ2VudCByZWdpc3RlcmVkIGFuZCBpbnN0YWxsZWQgdGhlIHNlcGFyYXRlIGNvbXB1dGUtcGxh" + - "bmUgc3RhY2sgdXNpbmcgZXhhY3RseSBvbmUgZG9jdW1lbnRlZCBoYW5kb2ZmIiwKICAgICAgIlRo" + - "ZSBhZ2VudCBkaWQgbm90IG1peCBhIENMSS1nZW5lcmF0ZWQgY29udHJvbC1wbGFuZSBwcm9maWxl" + - "IHdpdGggdGhlIEhlbG1maWxlIHZhbHVlcyBmbG93IgogICAgXQogIH0sCiAgewogICAgImlkIjog" + - "IlMzLWNsaS1wcm9maWxlLXdvcmtmbG93IiwKICAgICJxdWVzdGlvbiI6ICJVc2UgbnZjZi1jbGkg" + - "dG8gaW5zdGFsbCBteSBjb250cm9sIHBsYW5lIGFuZCB0aGVuIHJlZ2lzdGVyIGFuZCBpbnN0YWxs" + - "IGEgc2VwYXJhdGUgY29tcHV0ZSBjbHVzdGVyLiBTaG93IGV2ZXJ5IHJlcXVpcmVkIGdsb2JhbCBm" + - "bGFnLiIsCiAgICAiZXhwZWN0ZWRfc2tpbGwiOiAibnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0" + - "aW9uIiwKICAgICJncm91bmRfdHJ1dGgiOiAiVGhlIGFnZW50IGZpcnN0IHJhbiB0aGUgQ0xJIGNv" + - "bnRyb2wtcGxhbmUgaW5zdGFsbCBhbmQgcmVxdWlyZWQgaXRzIGdlbmVyYXRlZCBjb250cm9sLXBs" + - "YW5lLXByb2ZpbGUueWFtbC4gSXQgdGhlbiBzaG93ZWQgY29tcGxldGUgcmVnaXN0ZXIgYW5kIGlu" + - "c3RhbGwgY29tbWFuZHMsIGVhY2ggaW5jbHVkaW5nIC0tY29uZmlnLCAtLWNvbnRyb2wtcGxhbmUt" + - "c3RhY2ssIC0tY29tcHV0ZS1wbGFuZS1zdGFjaywgLS1lbnYsIGFuZCAtLXBsYWluIGJlZm9yZSB0" + - "aGUgY29tcHV0ZS1wbGFuZSBzdWJjb21tYW5kLiBSZWdpc3RyYXRpb24gY29uc3VtZWQgdGhlIHBy" + - "b2ZpbGUgYW5kIHByb2R1Y2VkIHRoZSB2YWx1ZXMgZmlsZSBjb25zdW1lZCBieSBpbnN0YWxsLiBJ" + - "dCBkaWQgbm90IHN3aXRjaCB0byB0aGUgSGVsbWZpbGUgdmFsdWVzIGhhbmRvZmYuIiwKICAgICJl" + - "eHBlY3RlZF9iZWhhdmlvciI6IFsKICAgICAgIlRoZSBhZ2VudCByZWFkIHRoZSBudmNmLXNlbGYt" + - "bWFuYWdlZC1pbnN0YWxsYXRpb24gU0tJTEwubWQgYmVmb3JlIHRha2luZyBhY3Rpb24iLAogICAg" + - "ICAiVGhlIGFnZW50IHJhbiBudmNmLWNsaSBzZWxmLWhvc3RlZCBpbnN0YWxsIC0tY29udHJvbC1w" + - "bGFuZSBhbmQgdmVyaWZpZWQgZGVwbG95L3N0YWNrcy9zZWxmLW1hbmFnZWQvb3V0L2NvbnRyb2wt" + - "cGxhbmUtcHJvZmlsZS55YW1sIGV4aXN0cyIsCiAgICAgICJUaGUgcmVnaXN0ZXIgY29tbWFuZCBp" + - "bmNsdWRlZCAtLWNvbmZpZywgLS1jb250cm9sLXBsYW5lLXN0YWNrLCAtLWNvbXB1dGUtcGxhbmUt" + - "c3RhY2ssIC0tZW52LCBhbmQgLS1wbGFpbiIsCiAgICAgICJUaGUgcmVnaXN0ZXIgY29tbWFuZCBp" + - "bmNsdWRlZCAtLWNvbnRyb2wtcGxhbmUtcHJvZmlsZSwgLS1jbHVzdGVyLW5hbWUsIC0ta3ViZS1j" + - "b250ZXh0LCAtLXJlZ2lvbiwgYW5kIC0tb3V0cHV0IiwKICAgICAgIlRoZSBpbnN0YWxsIGNvbW1h" + - "bmQgcmVwZWF0ZWQgLS1jb25maWcsIC0tY29udHJvbC1wbGFuZS1zdGFjaywgLS1jb21wdXRlLXBs" + - "YW5lLXN0YWNrLCAtLWVudiwgYW5kIC0tcGxhaW4iLAogICAgICAiVGhlIGluc3RhbGwgY29tbWFu" + - "ZCBpbmNsdWRlZCAtLXZhbHVlcywgLS1rdWJlLWNvbnRleHQsIGFuZCAtLWNsdXN0ZXItbmFtZSIs" + - "CiAgICAgICJUaGUgYWdlbnQga2VwdCB0aGUgZ2VuZXJhdGVkIHByb2ZpbGUgYXMgdGhlIGVuZHBv" + - "aW50IHNvdXJjZSBhbmQgZGlkIG5vdCBtaXggaW4gSGVsbWZpbGUgdmFsdWVzIHJlZ2lzdHJhdGlv" + - "biIKICAgIF0KICB9LAogIHsKICAgICJpZCI6ICJTNC1vdmVycmlkZS1jYXNzYW5kcmEtcmVzb3Vy" + - "Y2VzIiwKICAgICJxdWVzdGlvbiI6ICJDYXNzYW5kcmEgcG9kcyBrZWVwIGdldHRpbmcgT09NS2ls" + - "bGVkLiBJbmNyZWFzZSBtZW1vcnkgbGltaXRzIHRvIDE2R2kuIiwKICAgICJleHBlY3RlZF9za2ls" + - "bCI6ICJudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24iLAogICAgImdyb3VuZF90cnV0aCI6" + - "ICJUaGUgYWdlbnQgY2FwdHVyZWQgdGhlIGJhc2VsaW5lIHdpdGggaGVsbWZpbGUgdGVtcGxhdGUs" + - "IHRoZW4gbW9kaWZpZWQgdGhlIGNhc3NhbmRyYSByZWxlYXNlIHdpdGggaW5saW5lIHZhbHVlcyBy" + - "ZS1pbmNsdWRpbmcgZ2xvYmFsLnlhbWwuZ290bXBsIGFuZCBzZWNyZXRzIGluIHRoZSB2YWx1ZXMg" + - "YmxvY2suIEl0IHdhcm5lZCBhYm91dCB0aGUgWUFNTCBtZXJnZSBnb3RjaGEgYW5kIHByZXZpZXdl" + - "ZCB0aGUgZGlmZiBiZWZvcmUgYXBwbHlpbmcuIiwKICAgICJleHBlY3RlZF9iZWhhdmlvciI6IFsK" + - "ICAgICAgIlRoZSBhZ2VudCByZWFkIHRoZSBudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24g" + - "U0tJTEwubWQgYmVmb3JlIHRha2luZyBhY3Rpb24iLAogICAgICAiVGhlIGFnZW50IGNhcHR1cmVk" + - "IGJhc2VsaW5lIHdpdGggJ2hlbG1maWxlIC0tc2VsZWN0b3IgbmFtZT1jYXNzYW5kcmEgdGVtcGxh" + - "dGUnIiwKICAgICAgIlRoZSBhZ2VudCBtb2RpZmllZCB0aGUgcmVsZWFzZSB2YWx1ZXMgYmxvY2sg" + - "dG8gaW5jbHVkZSByZXNvdXJjZSBsaW1pdHMgd2l0aCBtZW1vcnk6IDE2R2kiLAogICAgICAiVGhl" + - "IGFnZW50IHJlLWluY2x1ZGVkIGdsb2JhbC55YW1sLmdvdG1wbCBhbmQgc2VjcmV0cyBmaWxlIGlu" + - "IHRoZSB2YWx1ZXM6IGJsb2NrIChub3QganVzdCB0aGUgb3ZlcnJpZGUgYWxvbmUpIiwKICAgICAg" + - "IlRoZSBhZ2VudCB3YXJuZWQgYWJvdXQgdGhlIFlBTUwgbWVyZ2UgZ290Y2hhOiBzcGVjaWZ5aW5n" + - "IHZhbHVlczogcmVwbGFjZXMgdGhlIHRlbXBsYXRlJ3MgdmFsdWVzIGxpc3QgZW50aXJlbHkiLAog" + - "ICAgICAiVGhlIGFnZW50IHByZXZpZXdlZCB0aGUgY2hhbmdlIHdpdGggaGVsbWZpbGUgdGVtcGxh" + - "dGUgYW5kIGRpZmYgYmVmb3JlIGFwcGx5aW5nIHdpdGggc3luYyIKICAgIF0KICB9LAogIHsKICAg" + - "ICJpZCI6ICJTNi1zZWxlY3RpdmUtc3luYy1kZXBlbmRlbmNpZXMiLAogICAgInF1ZXN0aW9uIjog" + - "IkRlcGxveSBvbmx5IHRoZSBOVkNGIGRlcGVuZGVuY2llcyAtLSBOQVRTLCBDYXNzYW5kcmEsIGFu" + - "ZCBPcGVuQmFvIC0tIGZvciB0ZXN0aW5nIiwKICAgICJleHBlY3RlZF9za2lsbCI6ICJudmNmLXNl" + - "bGYtbWFuYWdlZC1pbnN0YWxsYXRpb24iLAogICAgImdyb3VuZF90cnV0aCI6ICJUaGUgYWdlbnQg" + - "dXNlZCB0aGUgaGVsbWZpbGUgc2VsZWN0b3IgdG8gZGVwbG95IG9ubHkgdGhlIGRlcGVuZGVuY2ll" + - "cyByZWxlYXNlIGdyb3VwLCB0aGVuIHZlcmlmaWVkIHBvZHMgaW4gdGhlIGRlcGVuZGVuY3kgbmFt" + - "ZXNwYWNlcy4iLAogICAgImV4cGVjdGVkX2JlaGF2aW9yIjogWwogICAgICAiVGhlIGFnZW50IHJl" + - "YWQgdGhlIG52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiBTS0lMTC5tZCBiZWZvcmUgdGFr" + - "aW5nIGFjdGlvbiIsCiAgICAgICJUaGUgYWdlbnQgdXNlZCAnaGVsbWZpbGUgLS1zZWxlY3RvciBy" + - "ZWxlYXNlLWdyb3VwPWRlcGVuZGVuY2llcyBzeW5jJyB0byBkZXBsb3kgb25seSBkZXBlbmRlbmNp" + - "ZXMiLAogICAgICAiVGhlIGFnZW50IHZlcmlmaWVkIHBvZHMgaW4gZGVwZW5kZW5jeSBuYW1lc3Bh" + - "Y2VzIChuYXRzLXN5c3RlbSwgY2Fzc2FuZHJhLXN5c3RlbSwgdmF1bHQtc3lzdGVtKSIsCiAgICAg" + - "ICJUaGUgYWdlbnQgcHJvdmlkZWQgdGhlIHNlbGVjdG9yIHJlZmVyZW5jZSBmb3IgdGFyZ2V0aW5n" + - "IG90aGVyIHJlbGVhc2UgZ3JvdXBzIgogICAgXQogIH0sCiAgewogICAgImlkIjogIlM3LWRlYnVn" + - "LWltYWdlcHVsbGJhY2tvZmYiLAogICAgInF1ZXN0aW9uIjogIkNhc3NhbmRyYSBwb2RzIGFyZSBp" + - "biBJbWFnZVB1bGxCYWNrT2ZmIHdpdGggNDAxIFVuYXV0aG9yaXplZCIsCiAgICAiZXhwZWN0ZWRf" + - "c2tpbGwiOiAibnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uIiwKICAgICJncm91bmRfdHJ1" + - "dGgiOiAiVGhlIGFnZW50IHJlYWQgdGhlIGRlYnVnZ2luZyByZWZlcmVuY2UgYW5kIHJhbiBkaWFn" + - "bm9zdGljIGNvbW1hbmRzIHRvIGlkZW50aWZ5IHRoZSByb290IGNhdXNlOiBkZXNjcmliZWQgdGhl" + - "IHBvZCwgY2hlY2tlZCBmb3IgcHVsbCBzZWNyZXRzLCBjaGVja2VkIGltYWdlUHVsbFNlY3JldHMg" + - "b24gdGhlIHBvZCBzcGVjIGFuZCBzZXJ2aWNlIGFjY291bnQuIEl0IGlkZW50aWZpZWQgdGhlIGlz" + - "c3VlIChtaXNzaW5nIHNlY3JldCwgd3JvbmcgY3JlZGVudGlhbHMsIG9yIG1pc3NpbmcgaW1hZ2VQ" + - "dWxsU2VjcmV0cykgYW5kIHByb3ZpZGVkIHRoZSBjb3JyZWN0IGZpeC4iLAogICAgImV4cGVjdGVk" + - "X2JlaGF2aW9yIjogWwogICAgICAiVGhlIGFnZW50IHJlYWQgdGhlIG52Y2Ytc2VsZi1tYW5hZ2Vk" + - "LWluc3RhbGxhdGlvbiBTS0lMTC5tZCBhbmQgcmVmZXJlbmNlcy9kZWJ1Z2dpbmcubWQiLAogICAg" + - "ICAiVGhlIGFnZW50IHJhbiAna3ViZWN0bCBkZXNjcmliZSBwb2QnIHRvIHNlZSB0aGUgSW1hZ2VQ" + - "dWxsQmFja09mZiBldmVudHMiLAogICAgICAiVGhlIGFnZW50IGNoZWNrZWQgZm9yIHB1bGwgc2Vj" + - "cmV0cyBpbiB0aGUgY2Fzc2FuZHJhLXN5c3RlbSBuYW1lc3BhY2UiLAogICAgICAiVGhlIGFnZW50" + - "IGNoZWNrZWQgaW1hZ2VQdWxsU2VjcmV0cyBvbiB0aGUgcG9kIHNwZWMgYW5kL29yIHNlcnZpY2Ug" + - "YWNjb3VudCIsCiAgICAgICJUaGUgYWdlbnQgaWRlbnRpZmllZCB0aGUgcm9vdCBjYXVzZSBhbmQg" + - "cHJvdmlkZWQgYSBzcGVjaWZpYyBmaXgiCiAgICBdCiAgfSwKICB7CiAgICAiaWQiOiAiUzktcmVt" + - "b3RlLWVrcy1yb3V0aW5nLWFuZC1zZWNyZXRzIiwKICAgICJxdWVzdGlvbiI6ICJDb25maWd1cmUg" + - "YSByZW1vdGUgRUtTIGNvbXB1dGUgY2x1c3RlciB0byByZWFjaCBteSBOVkNGIGNvbnRyb2wgcGxh" + - "bmUgdGhyb3VnaCBpdHMgRW52b3kgR2F0ZXdheSwgaW5jbHVkaW5nIE5BVFMgYW5kIHByaXZhdGUt" + - "cmVnaXN0cnkgcHVsbCBzZWNyZXRzLiIsCiAgICAiZXhwZWN0ZWRfc2tpbGwiOiAibnZjZi1zZWxm" + - "LW1hbmFnZWQtaW5zdGFsbGF0aW9uIiwKICAgICJncm91bmRfdHJ1dGgiOiAiVGhlIGFnZW50IGNv" + - "bmZpZ3VyZWQgdGhlIGNvbnRyb2wgcGxhbmUgdG8gdXNlIHRoZSBFbnZveSBHYXRld2F5IGNvbnRy" + - "b2xsZXIgaW4gZW52b3ktZ2F0ZXdheS1zeXN0ZW0gYW5kIEdhdGV3YXkvbnZjZi1nYXRld2F5IGlu" + - "IGVudm95LWdhdGV3YXksIHNldCBhbGwgc2l4IHJlbW90ZSB3b3JrZXIgZW5kcG9pbnRzIGFuZCB0" + - "aGUgZ3JwYy1wcm94eSBsb2NhbCBvdmVycmlkZSwgZW5hYmxlZCBOVkNGIGFuZCBOVkNUIGdSUEMg" + - "cm91dGVzIHBsdXMgTkFUUywgYW5kIGVuYWJsZWQgT3BlbkJhbyBpc3N1ZXIgZGlzY292ZXJ5LiBJ" + - "dCBjb25maWd1cmVkIHRoZSBiYXJlLUdhdGV3YXkgQ0xJIFVSTCBhbmQgSG9zdCBmaWVsZHMgaW5j" + - "bHVkaW5nIGljbXNfaG9zdCwgcGx1cyB0aGUgY29tcHV0ZS1wbGFuZSBJQ01TLCBSZVZhbCwgYW5k" + - "IE5BVFMgZXh0ZXJuYWwgVVJMcyBhbmQgaG9zdCBvdmVycmlkZXMuIEl0IGNyZWF0ZWQgdGhlIHB1" + - "bGwgc2VjcmV0IGluIGFsbCBjb250cm9sLXBsYW5lIG5hbWVzcGFjZXMgaW5jbHVkaW5nIGNlcnQt" + - "bWFuYWdlciwgYnV0IG9ubHkgaW4gbnZjYS1vcGVyYXRvciBvbiB0aGUgY29tcHV0ZSBjbHVzdGVy" + - "OyB0aGUgY2hhcnQgYW5kIG9wZXJhdG9yIG1pcnJvciBpdCB0byBudmNhLXN5c3RlbS4iLAogICAg" + - "ImV4cGVjdGVkX2JlaGF2aW9yIjogWwogICAgICAiVGhlIGFnZW50IHJlYWQgdGhlIG52Y2Ytc2Vs" + - "Zi1tYW5hZ2VkLWluc3RhbGxhdGlvbiBTS0lMTC5tZCBiZWZvcmUgdGFraW5nIGFjdGlvbiIsCiAg" + - "ICAgICJUaGUgYWdlbnQgc2V0IGluZ3Jlc3MuZ2F0ZXdheUFwaS5jb250cm9sbGVyTmFtZXNwYWNl" + - "IHRvIGVudm95LWdhdGV3YXktc3lzdGVtIiwKICAgICAgIlRoZSBhZ2VudCBzZXQgc2hhcmVkLCBn" + - "cnBjLCBhbmQgbmF0cyBHYXRld2F5IHJlZmVyZW5jZXMgdG8gbmFtZSBudmNmLWdhdGV3YXkgYW5k" + - "IG5hbWVzcGFjZSBlbnZveS1nYXRld2F5IiwKICAgICAgIlRoZSBhZ2VudCBzZXQgZ2xvYmFsLndv" + - "cmtlckVuZHBvaW50cy5udmNmU2VydmljZVVSTCwgbnZjZkdycGNTZXJ2aWNlVVJMLCBudmNmTmF0" + - "c1NlcnZpY2VVUkwsIG52Y3RTZXJ2aWNlVVJMLCBudmN0R3JwY1NlcnZpY2VVUkwsIGFuZCBpbnZv" + - "Y2F0aW9uU2VydmljZVVSTCIsCiAgICAgICJUaGUgYWdlbnQgc2V0IGdycGNwcm94eS5udmNmR3Jw" + - "Y1NlcnZpY2VVUkwgdG8gdGhlIGNvbnRyb2wtcGxhbmUtbG9jYWwgQVBJIGdSUEMgc2VydmljZSIs" + - "CiAgICAgICJUaGUgYWdlbnQgZW5hYmxlZCBib3RoIGluZ3Jlc3MuZ2F0ZXdheUFwaS5yb3V0ZXMu" + - "bnZjZkFwaS5ncnBjIGFuZCBudmN0QXBpLmdycGMgd2l0aCB3b3JrZXItYXBpIGFuZCB3b3JrZXIt" + - "dGFza3MgaG9zdG5hbWVzIiwKICAgICAgIlRoZSBhZ2VudCBleHBsaWNpdGx5IHNldCBpbmdyZXNz" + - "LmdhdGV3YXlBcGkucm91dGVzLm5hdHMuZW5hYmxlZCB0byB0cnVlIiwKICAgICAgIlRoZSBhZ2Vu" + - "dCBzZXQgb3BlbmJhby5taWdyYXRpb25zLmlzc3VlckRpc2NvdmVyeS5lbmFibGVkIHRvIHRydWUi" + - "LAogICAgICAiVGhlIGFnZW50IGNvbmZpZ3VyZWQgdGhlIGJhcmUtR2F0ZXdheSBDTEkgVVJMIGFu" + - "ZCBIb3N0IGZpZWxkcywgaW5jbHVkaW5nIHNjaGVtZS1sZXNzIGljbXNfaG9zdCIsCiAgICAgICJU" + - "aGUgYWdlbnQgY29uZmlndXJlZCBjb21wdXRlLXBsYW5lIGljbXNTZXJ2aWNlVVJMLCBpY21zU2Vy" + - "dmljZUhvc3RIZWFkZXJPdmVycmlkZSwgcmV2YWxTZXJ2aWNlVVJMLCByZXZhbFNlcnZpY2VIb3N0" + - "SGVhZGVyT3ZlcnJpZGUsIG5hdHNVUkwsIGFuZCBuYXRzSG9zdE92ZXJyaWRlIiwKICAgICAgIlRo" + - "ZSBjb250cm9sLXBsYW5lIHB1bGwtc2VjcmV0IG5hbWVzcGFjZSBsaXN0IGluY2x1ZGVkIGNlcnQt" + - "bWFuYWdlciIsCiAgICAgICJUaGUgY29tcHV0ZS1wbGFuZSBzZWNyZXQgd2FzIGNyZWF0ZWQgb25s" + - "eSBpbiBudmNhLW9wZXJhdG9yIGFuZCBtaXJyb3JlZCBieSB0aGUgY2hhcnQgYW5kIG9wZXJhdG9y" + - "IHRvIG52Y2Etc3lzdGVtIgogICAgXQogIH0sCiAgewogICAgImlkIjogIkcxMS1zcGxpdC10ZWFy" + - "ZG93biIsCiAgICAicXVlc3Rpb24iOiAiVGVhciBkb3duIG15IHNwbGl0IGNvbnRyb2wtcGxhbmUg" + - "YW5kIGNvbXB1dGUtcGxhbmUgZGVwbG95bWVudCBzYWZlbHkuIFNob3cgYm90aCB0aGUgSGVsbWZp" + - "bGUgdmFsdWVzIGFuZCBDTEkgcHJvZmlsZSB2YXJpYW50cy4iLAogICAgImV4cGVjdGVkX3NraWxs" + + "SUxMLm1kIGJlZm9yZSB0YWtpbmcgYWN0aW9uIiwKICAgICAgIlRoZSBhZ2VudCBhdXRob3JlZCBz" + + "ZXBhcmF0ZSBlbnZpcm9ubWVudHMvPGVudj4ueWFtbCBmaWxlcyB1bmRlciBkZXBsb3kvc3RhY2tz" + + "L3NlbGYtbWFuYWdlZCBhbmQgZGVwbG95L3N0YWNrcy9udmNmLWNvbXB1dGUtcGxhbmUiLAogICAg" + + "ICAiVGhlIGFnZW50IGluc3RhbGxlZCB0aGUgY29udHJvbCBwbGFuZSBiZWZvcmUgcmVnaXN0ZXJp" + + "bmcgb3IgaW5zdGFsbGluZyB0aGUgY29tcHV0ZSBwbGFuZSIsCiAgICAgICJUaGUgYWdlbnQgY29u" + + "ZmlndXJlZCBiYXNlX2h0dHBfdXJsLCBpbnZva2VfdXJsLCBiYXNlX2dycGNfdXJsLCBhcGlfa2V5" + + "c19zZXJ2aWNlX3VybCwgaWNtc191cmwsIGFwaV9ob3N0LCBhcGlfa2V5c19ob3N0LCBpbnZva2Vf" + + "aG9zdCwgYW5kIGljbXNfaG9zdCBmb3IgdGhlIGJhcmUgR2F0ZXdheSIsCiAgICAgICJUaGUgYWdl" + + "bnQgdXNlZCAnbWFrZSAtQyBkZXBsb3kvc3RhY2tzL252Y2YtY29tcHV0ZS1wbGFuZSByZWdpc3Rl" + + "ci1jbHVzdGVyJyB3aXRoIENMVVNURVJfTkFNRSwgTkNBX0lELCBDTFVTVEVSX1JFR0lPTiwgSUNN" + + "U19VUkwsIGFuZCBLVUJFQ09ORklHX0ZJTEU9Y29tcHV0ZS55YW1sIiwKICAgICAgIlRoZSBhZ2Vu" + + "dCB1c2VkICdtYWtlIC1DIGRlcGxveS9zdGFja3MvbnZjZi1jb21wdXRlLXBsYW5lIGluc3RhbGwn" + + "IHdpdGggQ0xVU1RFUl9OQU1FLCBIRUxNRklMRV9FTlYsIGFuZCBLVUJFQ09ORklHX0ZJTEU9Y29t" + + "cHV0ZS55YW1sIiwKICAgICAgIlRoZSBhZ2VudCBzdGF0ZWQgdGhhdCBJQ01TX1VSTCBtYXBzIG9u" + + "bHkgdG8gLS1pY21zLXVybCwgY29uZmlnIGljbXNfaG9zdCBzdXBwbGllcyB0aGUgSG9zdCBoZWFk" + + "ZXIsIHRoZXJlIGlzIG5vIC0taWNtcy1ob3N0IE1ha2Ugb3IgQ0xJIGZsYWcsIGFuZCByZWdpc3Ry" + + "YXRpb24gZGlzY292ZXJzIE9JREMgYW5kIEpXS1MgZnJvbSB0aGUgY29tcHV0ZSBjb250ZXh0IiwK" + + "ICAgICAgIlRoZSBhZ2VudCBkaWQgbm90IHJlcXVpcmUgYSBjb250cm9sLXBsYW5lIHByb2ZpbGUg" + + "Zm9yIHRoaXMgZmxvdyBhbmQgZGlkIG5vdCBtaXggaW4gQ0xJIHByb2ZpbGUgY29tbWFuZHMiCiAg" + + "ICBdCiAgfSwKICB7CiAgICAiaWQiOiAiRzctYm90aC1kb2NrZXItaGVsbS1hdXRoIiwKICAgICJx" + + "dWVzdGlvbiI6ICJBdXRoZW50aWNhdGUgdG8gTkdDIGZvciBOVkNGIGhlbG1maWxlIGRlcGxveW1l" + + "bnQiLAogICAgImV4cGVjdGVkX3NraWxsIjogIm52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlv" + + "biIsCiAgICAiZ3JvdW5kX3RydXRoIjogIlRoZSBhZ2VudCByYW4gYm90aCBkb2NrZXIgbG9naW4g" + + "YW5kIGhlbG0gcmVnaXN0cnkgbG9naW4gZm9yIG52Y3IuaW8uIEl0IGV4cGxhaW5lZCB0aGF0IGJv" + + "dGggYXJlIHJlcXVpcmVkIGJlY2F1c2UgaGVsbWZpbGUgdXNlcyBoZWxtIChub3QgZG9ja2VyKSB0" + + "byBwdWxsIE9DSSBjaGFydHMsIHNvIGRvY2tlciBsb2dpbiBhbG9uZSBpcyBpbnN1ZmZpY2llbnQu" + + "IiwKICAgICJleHBlY3RlZF9iZWhhdmlvciI6IFsKICAgICAgIlRoZSBhZ2VudCByZWFkIHRoZSBu" + + "dmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24gU0tJTEwubWQgYmVmb3JlIHRha2luZyBhY3Rp" + + "b24iLAogICAgICAiVGhlIGFnZW50IHJhbiAnZG9ja2VyIGxvZ2luIG52Y3IuaW8nIHdpdGggJG9h" + + "dXRodG9rZW4gdXNlcm5hbWUgYW5kIE5HQ19BUElfS0VZIHBhc3N3b3JkIiwKICAgICAgIlRoZSBh" + + "Z2VudCByYW4gJ2hlbG0gcmVnaXN0cnkgbG9naW4gbnZjci5pbycgd2l0aCAkb2F1dGh0b2tlbiB1" + + "c2VybmFtZSBhbmQgTkdDX0FQSV9LRVkgcGFzc3dvcmQiLAogICAgICAiVGhlIGFnZW50IGV4cGxh" + + "aW5lZCB0aGF0IGJvdGggYXJlIHJlcXVpcmVkIGJlY2F1c2UgaGVsbWZpbGUgdXNlcyBoZWxtIChu" + + "b3QgZG9ja2VyKSB0byBwdWxsIE9DSSBjaGFydHMiLAogICAgICAiVGhlIGFnZW50IGRpZCBub3Qg" + + "cHJvdmlkZSBvbmx5IG9uZSBvZiB0aGUgdHdvIGF1dGhlbnRpY2F0aW9uIGNvbW1hbmRzIgogICAg" + + "XQogIH0sCiAgewogICAgImlkIjogIkc5LW1pc3NpbmctYnVuZGxlIiwKICAgICJxdWVzdGlvbiI6" + + "ICJSdW4gaGVsbWZpbGUgc3luYyBmb3IgTlZDRiBpbiBteSBjdXJyZW50IGRpcmVjdG9yeSIsCiAg" + + "ICAiZXhwZWN0ZWRfc2tpbGwiOiAibnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uIiwKICAg" + + "ICJncm91bmRfdHJ1dGgiOiAiVGhlIGFnZW50IGF0dGVtcHRlZCB0byB2ZXJpZnkgdGhlIGJ1bmRs" + + "ZSBzdHJ1Y3R1cmUgKGhlbG1maWxlLmQvLCBlbnZpcm9ubWVudHMvLCBzZWNyZXRzLywgZ2xvYmFs" + + "LnlhbWwuZ290bXBsKSBhbmQgd2hlbiBmaWxlcyB3ZXJlIG5vdCBmb3VuZCwgc3RvcHBlZCBhbmQg" + + "aW5zdHJ1Y3RlZCB0aGUgdXNlciB0byBleHRyYWN0IG9yIGxvY2F0ZSB0aGUgbnZjZi1zZWxmLW1h" + + "bmFnZWQtc3RhY2sgYnVuZGxlLiBJdCBkaWQgbm90IGF0dGVtcHQgdG8gcnVuIGhlbG1maWxlIHN5" + + "bmMgYWdhaW5zdCBhIG1pc3NpbmcgYnVuZGxlLiIsCiAgICAiZXhwZWN0ZWRfYmVoYXZpb3IiOiBb" + + "CiAgICAgICJUaGUgYWdlbnQgcmVhZCB0aGUgbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9u" + + "IFNLSUxMLm1kIGJlZm9yZSB0YWtpbmcgYWN0aW9uIiwKICAgICAgIlRoZSBhZ2VudCBjaGVja2Vk" + + "IGZvciBleHBlY3RlZCBidW5kbGUgc3RydWN0dXJlIChoZWxtZmlsZS5kLywgZW52aXJvbm1lbnRz" + + "Lywgc2VjcmV0cy8sIGdsb2JhbC55YW1sLmdvdG1wbCkiLAogICAgICAiV2hlbiBidW5kbGUgZmls" + + "ZXMgd2VyZSBub3QgZm91bmQsIHRoZSBhZ2VudCBzdG9wcGVkIGFuZCBkaWQgbm90IGF0dGVtcHQg" + + "aGVsbWZpbGUgc3luYyIsCiAgICAgICJUaGUgYWdlbnQgaW5zdHJ1Y3RlZCB0aGUgdXNlciB0byBl" + + "eHRyYWN0IG9yIGxvY2F0ZSB0aGUgbnZjZi1zZWxmLW1hbmFnZWQtc3RhY2sgYnVuZGxlIgogICAg" + + "XQogIH0sCiAgewogICAgImlkIjogIlMxLWNsZWFuLWluc3RhbGxhdGlvbiIsCiAgICAicXVlc3Rp" + + "b24iOiAiUGVyZm9ybSBhIGNsZWFuIGluc3RhbGxhdGlvbiBvZiB0aGUgTlZDRiBzZWxmLW1hbmFn" + + "ZWQgc3RhY2sgb24gbXkgQVdTIEVLUyBjbHVzdGVyLiBNeSBlbnZpcm9ubWVudCBuYW1lIGlzICdz" + + "dGFnaW5nJy4iLAogICAgImV4cGVjdGVkX3NraWxsIjogIm52Y2Ytc2VsZi1tYW5hZ2VkLWluc3Rh" + + "bGxhdGlvbiIsCiAgICAiZ3JvdW5kX3RydXRoIjogIlRoZSBhZ2VudCBjb21wbGV0ZWQgdGhlIGNv" + + "bnRyb2wtcGxhbmUgaW5zdGFsbGF0aW9uIGZpcnN0OiB2YWxpZGF0ZWQgdG9vbHMgYW5kIGJ1bmRs" + + "ZSBzdHJ1Y3R1cmUsIGNyZWF0ZWQgY29udHJvbC1wbGFuZSBuYW1lc3BhY2VzIGluY2x1ZGluZyBj" + + "ZXJ0LW1hbmFnZXIsIGF1dGhlbnRpY2F0ZWQgdGhlIHJlZ2lzdHJpZXMsIHByZXZpZXdlZCwgZGVw" + + "bG95ZWQsIGFuZCBtb25pdG9yZWQgdGhlIGZvdXIgY29udHJvbC1wbGFuZSBwaGFzZXMuIEl0IHRo" + + "ZW4gc2VsZWN0ZWQgb25lIGRvY3VtZW50ZWQgaGFuZG9mZiBhbmQgcmVnaXN0ZXJlZCBhbmQgaW5z" + + "dGFsbGVkIHRoZSBjb21wdXRlIHBsYW5lIGFzIGEgc2VwYXJhdGUgc3RhY2sgd2l0aG91dCBtaXhp" + + "bmcgcHJvZmlsZSBhbmQgSGVsbWZpbGUgdmFsdWVzIGZsb3dzLiIsCiAgICAiZXhwZWN0ZWRfYmVo" + + "YXZpb3IiOiBbCiAgICAgICJUaGUgYWdlbnQgcmVhZCB0aGUgbnZjZi1zZWxmLW1hbmFnZWQtaW5z" + + "dGFsbGF0aW9uIFNLSUxMLm1kIGJlZm9yZSB0YWtpbmcgYWN0aW9uIiwKICAgICAgIlRoZSBhZ2Vu" + + "dCB2YWxpZGF0ZWQgdG9vbCB2ZXJzaW9ucyAoaGVsbWZpbGUsIGhlbG0sIGhlbG0tZGlmZiwga3Vi" + + "ZWN0bCkiLAogICAgICAiVGhlIGFnZW50IHZlcmlmaWVkIHRoZSBidW5kbGUgc3RydWN0dXJlIGV4" + + "aXN0cyIsCiAgICAgICJUaGUgYWdlbnQgY3JlYXRlZCBjb250cm9sLXBsYW5lIG5hbWVzcGFjZXMg" + + "KGNhc3NhbmRyYS1zeXN0ZW0sIG5hdHMtc3lzdGVtLCBudmNmLCBhcGkta2V5cywgZXNzLCBzaXMs" + + "IHZhdWx0LXN5c3RlbSwgY2VydC1tYW5hZ2VyKSB3aXRob3V0IGFkZGluZyBjb21wdXRlLW9ubHkg" + + "bmFtZXNwYWNlcyIsCiAgICAgICJUaGUgYWdlbnQgcmFuICdIRUxNRklMRV9FTlY9c3RhZ2luZyBo" + + "ZWxtZmlsZSB0ZW1wbGF0ZScgdG8gcHJldmlldyBiZWZvcmUgZGVwbG95aW5nIiwKICAgICAgIlRo" + + "ZSBhZ2VudCByYW4gJ0hFTE1GSUxFX0VOVj1zdGFnaW5nIGhlbG1maWxlIHN5bmMnIHRvIGRlcGxv" + + "eSIsCiAgICAgICJUaGUgYWdlbnQgZXhwbGFpbmVkIHRoZSA0IGNvbnRyb2wtcGxhbmUgcGhhc2Vz" + + "IChkZXBlbmRlbmNpZXMsIHNlcnZpY2VzLCBpbmdyZXNzLCBvYnNlcnZhYmlsaXR5KSBhbmQgYXBw" + + "cm94aW1hdGUgd2FpdCB0aW1lcyIsCiAgICAgICJBZnRlciB0aGUgY29udHJvbCBwbGFuZSB3YXMg" + + "aGVhbHRoeSwgdGhlIGFnZW50IHJlZ2lzdGVyZWQgYW5kIGluc3RhbGxlZCB0aGUgc2VwYXJhdGUg" + + "Y29tcHV0ZS1wbGFuZSBzdGFjayB1c2luZyBleGFjdGx5IG9uZSBkb2N1bWVudGVkIGhhbmRvZmYi" + + "LAogICAgICAiVGhlIGFnZW50IGRpZCBub3QgbWl4IGEgQ0xJLWdlbmVyYXRlZCBjb250cm9sLXBs" + + "YW5lIHByb2ZpbGUgd2l0aCB0aGUgSGVsbWZpbGUgdmFsdWVzIGZsb3ciCiAgICBdCiAgfSwKICB7" + + "CiAgICAiaWQiOiAiUzMtY2xpLXByb2ZpbGUtd29ya2Zsb3ciLAogICAgInF1ZXN0aW9uIjogIlVz" + + "ZSBudmNmLWNsaSB0byBpbnN0YWxsIG15IGNvbnRyb2wgcGxhbmUgYW5kIHRoZW4gcmVnaXN0ZXIg" + + "YW5kIGluc3RhbGwgYSBzZXBhcmF0ZSBjb21wdXRlIGNsdXN0ZXIuIFNob3cgZXZlcnkgcmVxdWly" + + "ZWQgZ2xvYmFsIGZsYWcuIiwKICAgICJleHBlY3RlZF9za2lsbCI6ICJudmNmLXNlbGYtbWFuYWdl" + + "ZC1pbnN0YWxsYXRpb24iLAogICAgImdyb3VuZF90cnV0aCI6ICJUaGUgYWdlbnQgZmlyc3QgcmFu" + + "IHRoZSBDTEkgY29udHJvbC1wbGFuZSBpbnN0YWxsIGFuZCByZXF1aXJlZCBpdHMgZ2VuZXJhdGVk" + + "IGNvbnRyb2wtcGxhbmUtcHJvZmlsZS55YW1sLiBJdCB0aGVuIHNob3dlZCBjb21wbGV0ZSByZWdp" + + "c3RlciBhbmQgaW5zdGFsbCBjb21tYW5kcywgZWFjaCBpbmNsdWRpbmcgLS1jb25maWcsIC0tY29u" + + "dHJvbC1wbGFuZS1zdGFjaywgLS1jb21wdXRlLXBsYW5lLXN0YWNrLCAtLWVudiwgYW5kIC0tcGxh" + + "aW4gYmVmb3JlIHRoZSBjb21wdXRlLXBsYW5lIHN1YmNvbW1hbmQuIFJlZ2lzdHJhdGlvbiBjb25z" + + "dW1lZCB0aGUgcHJvZmlsZSBhbmQgcHJvZHVjZWQgdGhlIHZhbHVlcyBmaWxlIGNvbnN1bWVkIGJ5" + + "IGluc3RhbGwuIEl0IGRpZCBub3Qgc3dpdGNoIHRvIHRoZSBIZWxtZmlsZSB2YWx1ZXMgaGFuZG9m" + + "Zi4iLAogICAgImV4cGVjdGVkX2JlaGF2aW9yIjogWwogICAgICAiVGhlIGFnZW50IHJlYWQgdGhl" + + "IG52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiBTS0lMTC5tZCBiZWZvcmUgdGFraW5nIGFj" + + "dGlvbiIsCiAgICAgICJUaGUgYWdlbnQgcmFuIG52Y2YtY2xpIHNlbGYtaG9zdGVkIGluc3RhbGwg" + + "LS1jb250cm9sLXBsYW5lIGFuZCB2ZXJpZmllZCBkZXBsb3kvc3RhY2tzL3NlbGYtbWFuYWdlZC9v" + + "dXQvY29udHJvbC1wbGFuZS1wcm9maWxlLnlhbWwgZXhpc3RzIiwKICAgICAgIlRoZSByZWdpc3Rl" + + "ciBjb21tYW5kIGluY2x1ZGVkIC0tY29uZmlnLCAtLWNvbnRyb2wtcGxhbmUtc3RhY2ssIC0tY29t" + + "cHV0ZS1wbGFuZS1zdGFjaywgLS1lbnYsIGFuZCAtLXBsYWluIiwKICAgICAgIlRoZSByZWdpc3Rl" + + "ciBjb21tYW5kIGluY2x1ZGVkIC0tY29udHJvbC1wbGFuZS1wcm9maWxlLCAtLWNsdXN0ZXItbmFt" + + "ZSwgLS1rdWJlLWNvbnRleHQsIC0tcmVnaW9uLCBhbmQgLS1vdXRwdXQiLAogICAgICAiVGhlIGlu" + + "c3RhbGwgY29tbWFuZCByZXBlYXRlZCAtLWNvbmZpZywgLS1jb250cm9sLXBsYW5lLXN0YWNrLCAt" + + "LWNvbXB1dGUtcGxhbmUtc3RhY2ssIC0tZW52LCBhbmQgLS1wbGFpbiIsCiAgICAgICJUaGUgaW5z" + + "dGFsbCBjb21tYW5kIGluY2x1ZGVkIC0tdmFsdWVzLCAtLWt1YmUtY29udGV4dCwgYW5kIC0tY2x1" + + "c3Rlci1uYW1lIiwKICAgICAgIlRoZSBhZ2VudCBrZXB0IHRoZSBnZW5lcmF0ZWQgcHJvZmlsZSBh" + + "cyB0aGUgZW5kcG9pbnQgc291cmNlIGFuZCBkaWQgbm90IG1peCBpbiBIZWxtZmlsZSB2YWx1ZXMg" + + "cmVnaXN0cmF0aW9uIgogICAgXQogIH0sCiAgewogICAgImlkIjogIlM0LW92ZXJyaWRlLWNhc3Nh" + + "bmRyYS1yZXNvdXJjZXMiLAogICAgInF1ZXN0aW9uIjogIkNhc3NhbmRyYSBwb2RzIGtlZXAgZ2V0" + + "dGluZyBPT01LaWxsZWQuIEluY3JlYXNlIG1lbW9yeSBsaW1pdHMgdG8gMTZHaS4iLAogICAgImV4" + + "cGVjdGVkX3NraWxsIjogIm52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiIsCiAgICAiZ3Jv" + + "dW5kX3RydXRoIjogIlRoZSBhZ2VudCBjYXB0dXJlZCB0aGUgYmFzZWxpbmUgd2l0aCBoZWxtZmls" + + "ZSB0ZW1wbGF0ZSwgdGhlbiBtb2RpZmllZCB0aGUgY2Fzc2FuZHJhIHJlbGVhc2Ugd2l0aCBpbmxp" + + "bmUgdmFsdWVzIHJlLWluY2x1ZGluZyBnbG9iYWwueWFtbC5nb3RtcGwgYW5kIHNlY3JldHMgaW4g" + + "dGhlIHZhbHVlcyBibG9jay4gSXQgd2FybmVkIGFib3V0IHRoZSBZQU1MIG1lcmdlIGdvdGNoYSBh" + + "bmQgcHJldmlld2VkIHRoZSBkaWZmIGJlZm9yZSBhcHBseWluZy4iLAogICAgImV4cGVjdGVkX2Jl" + + "aGF2aW9yIjogWwogICAgICAiVGhlIGFnZW50IHJlYWQgdGhlIG52Y2Ytc2VsZi1tYW5hZ2VkLWlu" + + "c3RhbGxhdGlvbiBTS0lMTC5tZCBiZWZvcmUgdGFraW5nIGFjdGlvbiIsCiAgICAgICJUaGUgYWdl" + + "bnQgY2FwdHVyZWQgYmFzZWxpbmUgd2l0aCAnaGVsbWZpbGUgLS1zZWxlY3RvciBuYW1lPWNhc3Nh" + + "bmRyYSB0ZW1wbGF0ZSciLAogICAgICAiVGhlIGFnZW50IG1vZGlmaWVkIHRoZSByZWxlYXNlIHZh" + + "bHVlcyBibG9jayB0byBpbmNsdWRlIHJlc291cmNlIGxpbWl0cyB3aXRoIG1lbW9yeTogMTZHaSIs" + + "CiAgICAgICJUaGUgYWdlbnQgcmUtaW5jbHVkZWQgZ2xvYmFsLnlhbWwuZ290bXBsIGFuZCBzZWNy" + + "ZXRzIGZpbGUgaW4gdGhlIHZhbHVlczogYmxvY2sgKG5vdCBqdXN0IHRoZSBvdmVycmlkZSBhbG9u" + + "ZSkiLAogICAgICAiVGhlIGFnZW50IHdhcm5lZCBhYm91dCB0aGUgWUFNTCBtZXJnZSBnb3RjaGE6" + + "IHNwZWNpZnlpbmcgdmFsdWVzOiByZXBsYWNlcyB0aGUgdGVtcGxhdGUncyB2YWx1ZXMgbGlzdCBl" + + "bnRpcmVseSIsCiAgICAgICJUaGUgYWdlbnQgcHJldmlld2VkIHRoZSBjaGFuZ2Ugd2l0aCBoZWxt" + + "ZmlsZSB0ZW1wbGF0ZSBhbmQgZGlmZiBiZWZvcmUgYXBwbHlpbmcgd2l0aCBzeW5jIgogICAgXQog" + + "IH0sCiAgewogICAgImlkIjogIlM2LXNlbGVjdGl2ZS1zeW5jLWRlcGVuZGVuY2llcyIsCiAgICAi" + + "cXVlc3Rpb24iOiAiRGVwbG95IG9ubHkgdGhlIE5WQ0YgZGVwZW5kZW5jaWVzIC0tIE5BVFMsIENh" + + "c3NhbmRyYSwgYW5kIE9wZW5CYW8gLS0gZm9yIHRlc3RpbmciLAogICAgImV4cGVjdGVkX3NraWxs" + "IjogIm52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiIsCiAgICAiZ3JvdW5kX3RydXRoIjog" + - "IlRoZSBIZWxtZmlsZSBmbG93IGRlc3Ryb3llZCBhbmQgY29uZmlybWVkIGRlcmVnaXN0cmF0aW9u" + - "IG9mIGV2ZXJ5IGNvbXB1dGUgY2x1c3RlciBiZWZvcmUgZGVzdHJveWluZyB0aGUgY29udHJvbCBw" + - "bGFuZSBhbmQgcGFzc2VkIGJvdGggY29udHJvbC1wbGFuZSBrdWJlY29uZmlnIGZvcm1zLiBCZWZv" + - "cmUgZWl0aGVyIGhhbmRvZmYgY291bGQgZGVzdHJveSB0aGUgY29udHJvbCBwbGFuZSwgYm90aCB0" + - "ZWFyZG93biBmbG93cyB3YXJuZWQgdGhhdCBuYW1lc3BhY2UgcHJlc2VydmF0aW9uIGRvZXMgbm90" + - "IHByZXNlcnZlIHRoZSBIZWxtIHJlbGVhc2UsIHJlcXVpcmVkIGVmZmVjdGl2ZSBjZXJ0TWFuYWdl" + - "ci5lbmFibGVkOiBmYWxzZSBmb3IgYW4gZXh0ZXJuYWwgaW5zdGFsbGF0aW9uIGFuZCBhYm9ydGVk" + - "IGlmIHRydWUsIGFuZCB2ZXJpZmllZCBtYXRjaGluZyByZWxlYXNlIG93bmVyc2hpcCBmb3IgYW4g" + - "aW50ZW5kZWQgc3RhY2stbWFuYWdlZCByZWxlYXNlLCBhYm9ydGluZyBvbiBtaXNzaW5nIG9yIG1p" + - "c21hdGNoZWQgZXZpZGVuY2UuIFRoZXkgcHJlc2VydmVkIHRoZSBuYW1lc3BhY2UgYnkgZGVmYXVs" + - "dCBhbmQgZGlkIG5vdCBkZWxldGUgaXQgd2l0aG91dCBuYW1lc3BhY2UgcHJvdmVuYW5jZSBhbmQg" + - "ZXhwbGljaXQgY29uZmlybWF0aW9uLiBUaGUgQ0xJIGZsb3cgcmV0YWluZWQgdGhlIGdlbmVyYXRl" + - "ZCByZWdpc3RyYXRpb24gdmFsdWVzLCB1c2VkIHRoZSBmdWxsLXByZWZpeCBzdGF0dXMgY29tbWFu" + - "ZCB0byBpbnNwZWN0IGxpdmUgcmVnaXN0cmF0aW9ucywgc3RhdGVkIHRoYXQgbmFtZWQtY2x1c3Rl" + - "ciBwbGFuLW9ubHkgZG9lcyBub3QgcXVlcnkgSUNNUyBhbmQgY2Fubm90IHByZWRpY3QgY29uZGl0" + - "aW9uYWwgY29udHJvbC1wbGFuZSByZW1vdmFsLCBhbmQgZ290IGV4cGxpY2l0IGNvbmZpcm1hdGlv" + - "biB3aGVuIHRoZSB0YXJnZXQgd2FzIHRoZSBsYXN0IHJlZ2lzdGVyZWQgY2x1c3Rlci4gSXQgdGhl" + - "biBwcmV2aWV3ZWQgYW5kIHJhbiBkb3duIHdpdGggdGhlIGZ1bGwgcGVyc2lzdGVudCBwcmVmaXgs" + - "IHJlbW92aW5nIHRoZSBjb250cm9sIHBsYW5lIG9ubHkgYWZ0ZXIgdGhlIGxhc3QgcmVnaXN0cmF0" + - "aW9uIHdhcyBnb25lLiIsCiAgICAiZXhwZWN0ZWRfYmVoYXZpb3IiOiBbCiAgICAgICJUaGUgYWdl" + - "bnQgcmVhZCB0aGUgbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uIFNLSUxMLm1kIGJlZm9y" + - "ZSB0YWtpbmcgYWN0aW9uIiwKICAgICAgIkZvciBldmVyeSBjb21wdXRlIGNsdXN0ZXIsIHRoZSBI" + - "ZWxtZmlsZSBmbG93IHJhbiB0aGUgY29tcHV0ZS1wbGFuZSBNYWtlZmlsZSBkZXN0cm95IHRhcmdl" + - "dCB3aXRoIGl0cyBjb21wdXRlIGt1YmVjb25maWciLAogICAgICAiQWZ0ZXIgY29uZmlybWF0aW9u" + - "LCB0aGUgSGVsbWZpbGUgZmxvdyByYW4gY2x1c3RlciBkZWxldGUgd2l0aCBjbHVzdGVySUQgYW5k" + - "IG5jYUlEIGJlZm9yZSBjb250cm9sLXBsYW5lIGRlc3RydWN0aW9uIiwKICAgICAgIkJlZm9yZSBl" + - "aXRoZXIgaGFuZG9mZiBjb3VsZCBkZXN0cm95IHRoZSBjb250cm9sIHBsYW5lLCBib3RoIHRlYXJk" + - "b3duIGZsb3dzIHdhcm5lZCB0aGF0IG5hbWVzcGFjZSBwcmVzZXJ2YXRpb24gZG9lcyBub3QgcHJl" + - "c2VydmUgdGhlIEhlbG0gcmVsZWFzZSwgcmVxdWlyZWQgZWZmZWN0aXZlIGNlcnRNYW5hZ2VyLmVu" + - "YWJsZWQ6IGZhbHNlIGZvciBhbiBleHRlcm5hbCBpbnN0YWxsYXRpb24gYW5kIGFib3J0ZWQgaWYg" + - "dHJ1ZSwgYW5kIHZlcmlmaWVkIGludGVuZGVkIHN0YWNrIG93bmVyc2hpcCB3aGVuIGVuYWJsZWQs" + - "IGFib3J0aW5nIG9uIG1pc3Npbmcgb3IgbWlzbWF0Y2hlZCBldmlkZW5jZSIsCiAgICAgICJCb3Ro" + - "IHRlYXJkb3duIGZsb3dzIHByZXNlcnZlZCB0aGUgY2VydC1tYW5hZ2VyIG5hbWVzcGFjZSBieSBk" + - "ZWZhdWx0IGFuZCBkaWQgbm90IGRlbGV0ZSBpdCB3aXRob3V0IG5hbWVzcGFjZSBwcm92ZW5hbmNl" + - "IGFuZCBleHBsaWNpdCBjb25maXJtYXRpb24iLAogICAgICAiVGhlIEhlbG1maWxlIGZsb3cgcmFu" + - "IGNvbnRyb2wtcGxhbmUgTWFrZWZpbGUgZGVzdHJveSB3aXRoIGJvdGggS1VCRUNPTkZJRyBhbmQg" + - "S1VCRUNPTkZJR19GSUxFIiwKICAgICAgIlRoZSBDTEkgZmxvdyByZXRhaW5lZCBvdXQvPGNsdXN0" + - "ZXItbmFtZT4tcmVnaXN0ZXItdmFsdWVzLnlhbWwgdW50aWwgdGVhcmRvd24gY29tcGxldGVkIiwK" + - "ICAgICAgIkJlZm9yZSByZWFsIGRvd24sIHRoZSBDTEkgZmxvdyB1c2VkIHRoZSBmdWxsLXByZWZp" + - "eCBzdGF0dXMgY29tbWFuZCB0byBpbnNwZWN0IGxpdmUgcmVnaXN0cmF0aW9ucywgc3RhdGVkIHRo" + - "YXQgbmFtZWQtY2x1c3RlciBwbGFuLW9ubHkgZG9lcyBub3QgcXVlcnkgSUNNUyBhbmQgY2Fubm90" + - "IHByZWRpY3QgY29uZGl0aW9uYWwgY29udHJvbC1wbGFuZSByZW1vdmFsLCB3YXJuZWQgd2hlbiB0" + - "aGUgdGFyZ2V0IHdhcyB0aGUgbGFzdCByZWdpc3RlcmVkIGNsdXN0ZXIsIGFuZCBnb3QgZXhwbGlj" + - "aXQgY29uZmlybWF0aW9uIiwKICAgICAgIlRoZSBDTEkgZmxvdyB1c2VkIC0tY29uZmlnLCBib3Ro" + - "IHN0YWNrIHBhdGhzLCAtLWVudiwgLS1wbGFpbiwgYm90aCBjb250ZXh0cywgYW5kIC0taWNtcy11" + - "cmwgZm9yIGRvd24gLS1wbGFuLW9ubHkgYW5kIHRoZW4gZG93biIsCiAgICAgICJUaGUgYWdlbnQg" + - "c3RhdGVkIHRoYXQgZG93biB1bnJlZ2lzdGVycyBlYWNoIGNvbXB1dGUgY2x1c3RlciBhbmQgcmVt" + - "b3ZlcyB0aGUgY29udHJvbCBwbGFuZSBvbmx5IGFmdGVyIG5vIHJlZ2lzdHJhdGlvbnMgcmVtYWlu" + - "IgogICAgXQogIH0sCiAgewogICAgImlkIjogIlMxMy12YWx1ZXMtcHJlY2VkZW5jZSIsCiAgICAi" + - "cXVlc3Rpb24iOiAiSSBhZGRlZCBhIHZhbHVlIHRvIG15IGVudmlyb25tZW50IFlBTUwgYnV0IGl0" + - "J3MgYmVpbmcgc2lsZW50bHkgaWdub3JlZC4gSG93IGRvIGhlbG1maWxlIHZhbHVlcyB3b3JrIGlu" + - "IE5WQ0Y/IiwKICAgICJleHBlY3RlZF9za2lsbCI6ICJudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxs" + - "YXRpb24iLAogICAgImdyb3VuZF90cnV0aCI6ICJUaGUgYWdlbnQgZXhwbGFpbmVkIHRoZSB2YWx1" + - "ZXMgcHJlY2VkZW5jZSBjaGFpbiAoYmFzZS55YW1sLCBlbnYgWUFNTCwgZ2xvYmFsLnlhbWwuZ290" + - "bXBsLCBzZWNyZXRzLCBpbmxpbmUgdmFsdWVzKSwgaWRlbnRpZmllZCB0aGF0IGdsb2JhbC55YW1s" + - "LmdvdG1wbCBvbmx5IHBhc3NlcyB0aHJvdWdoIHNwZWNpZmljIGtleXMsIGFuZCBleHBsYWluZWQg" + - "dGhhdCBhcmJpdHJhcnkgY2hhcnQgdmFsdWVzIG11c3QgdXNlIHJlbGVhc2UgaW5saW5lIHZhbHVl" + - "cyBibG9ja3MuIiwKICAgICJleHBlY3RlZF9iZWhhdmlvciI6IFsKICAgICAgIlRoZSBhZ2VudCBy" + - "ZWFkIHRoZSBudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24gU0tJTEwubWQgYmVmb3JlIHRh" + - "a2luZyBhY3Rpb24iLAogICAgICAiVGhlIGFnZW50IGV4cGxhaW5lZCB0aGUgdmFsdWVzIHByZWNl" + - "ZGVuY2UgY2hhaW46IGJhc2UueWFtbCAtPiBlbnYgWUFNTCAtPiBnbG9iYWwueWFtbC5nb3RtcGwg" + - "LT4gc2VjcmV0cyAtPiBpbmxpbmUgdmFsdWVzIiwKICAgICAgIlRoZSBhZ2VudCBpZGVudGlmaWVk" + - "IHRoYXQgZ2xvYmFsLnlhbWwuZ290bXBsIG9ubHkgcGFzc2VzIHRocm91Z2ggc3BlY2lmaWMga2V5" + - "cyAoY2Fzc2FuZHJhLnJlcGxpY2FDb3VudCwgZ2xvYmFsLnN0b3JhZ2VDbGFzcywgZ2xvYmFsLmlt" + - "YWdlLCBldGMuKSIsCiAgICAgICJUaGUgYWdlbnQgZXhwbGFpbmVkIHRoYXQgYXJiaXRyYXJ5IGNo" + - "YXJ0IHZhbHVlcyBtdXN0IGJlIHNldCB2aWEgcmVsZWFzZSBpbmxpbmUgdmFsdWVzOiBibG9ja3Mi" + - "LAogICAgICAiVGhlIGFnZW50IGxpc3RlZCBleGFtcGxlcyBvZiB2YWx1ZXMgdGhhdCBhcmUgcHJv" + - "cGFnYXRlZCBhbmQgYXJiaXRyYXJ5IGNoYXJ0IHZhbHVlcyB0aGF0IHJlcXVpcmUgYSByZWxlYXNl" + - "IHZhbHVlcyBibG9jayIKICAgIF0KICB9LAogIHsKICAgICJpZCI6ICJTMTQtZW5hYmxlLWxsbS1m" + - "dW5jdGlvbnMiLAogICAgInF1ZXN0aW9uIjogIkkgbmVlZCB0byBkZXBsb3kgZnVuY3Rpb25UeXBl" + - "OiBMTE0gZnVuY3Rpb25zIG9uIGEgc2VsZi1tYW5hZ2VkLCBzaW5nbGUtbm9kZSBpc29sYXRlZCB0" + - "ZXN0IGNsdXN0ZXIuIFdoYXQgSGVsbWZpbGUgY29uZmlndXJhdGlvbiBhbmQgdmVyaWZpY2F0aW9u" + - "IHN0ZXBzIGRvIEkgbmVlZD8iLAogICAgImV4cGVjdGVkX3NraWxsIjogIm52Y2Ytc2VsZi1tYW5h" + - "Z2VkLWluc3RhbGxhdGlvbiIsCiAgICAiZ3JvdW5kX3RydXRoIjogIlRoZSBhZ2VudCBlbmFibGVk" + - "IHRoZSBMTE0gYWRkb24gd2l0aCBhZGRvbnMubGxtLmVuYWJsZWQsIGNvbmZpZ3VyZWQgc2luZ2xl" + - "IHJlcGxpY2FzIGZvciB0aGUgTExNIEFQSSBHYXRld2F5IGFuZCByZXF1ZXN0IHJvdXRlciwgYW5k" + - "IGV4cGxhaW5lZCB0aGF0IHRoZSByZXF1ZXN0IHJvdXRlciB1c2VzIHBvd2VyLW9mLXR3byB3aGVu" + - "IG5vIGxvYWQtYmFsYW5jZXIgY29uZmlndXJhdGlvbiBpcyBzZXQuIEl0IGxpbmtlZCB0aGUgY2Fu" + - "b25pY2FsIHJlcXVlc3Qtcm91dGVyIGxvYWQtYmFsYW5jaW5nIGd1aWRlIGZvciBvdGhlciByb3V0" + - "aW5nIG1ldGhvZHMuIEZvciB0aGUgaXNvbGF0ZWQgcGxhaW50ZXh0IGNsdXN0ZXIsIGl0IHJlbGll" + - "ZCBvbiB0aGUgc2VsZi1tYW5hZ2VkIHN0YWNrIGRlZmF1bHQgZm9yIHRoZSBidW5kbGVkIGdhdGV3" + - "YXktdG8tQVBJIGF1dGhlbnRpY2F0aW9uIGhvcCBhbmQgaW5jbHVkZWQgYWdlbnRDb25maWcubWVy" + - "Z2VDb25maWcud29ya2xvYWQuc3RhcmdhdGVRVUlDSW5zZWN1cmUgZm9yIHRoZSBzZXBhcmF0ZSB3" + - "b3JrZXIgdHJhbnNwb3J0LCB3aXRoIGEgd2FybmluZyB0aGF0IHBsYWludGV4dCB3b3JrZXIgdHJh" + - "bnNwb3J0IGlzIG5vdCBmb3IgcHJvZHVjdGlvbi4gSXQgcmVmcmVzaGVkIHRoZSBjb21wdXRlIHBs" + - "YW5lIHVzaW5nIHRoZSBzYW1lIGhhbmRvZmYgdXNlZCBkdXJpbmcgaW5zdGFsbGF0aW9uLCByZWRl" + - "cGxveWVkIGV4aXN0aW5nIExMTSBmdW5jdGlvbnMsIGFuZCB2ZXJpZmllZCB0aGUgTExNIGRlcGxv" + - "eW1lbnRzLCByb3V0ZSwgYW5kIGxsbS13b3JrZXIgc2lkZWNhci4iLAogICAgImV4cGVjdGVkX2Jl" + - "aGF2aW9yIjogWwogICAgICAiVGhlIGFnZW50IHVzZWQgYWRkb25zLmxsbS5lbmFibGVkLCBub3Qg" + - "dGhlIG9ic29sZXRlIGxsbS5lbmFibGVkIHBhdGgiLAogICAgICAiVGhlIGFnZW50IHNldCBnYXRl" + - "d2F5IGFuZCByZXF1ZXN0Um91dGVyIHJlcGxpY2FDb3VudCB0byAxIGZvciB0aGUgc2luZ2xlLW5v" + - "ZGUgdGVzdCBjbHVzdGVyIiwKICAgICAgIlRoZSBhZ2VudCBzdGF0ZWQgdGhhdCB0aGUgcmVxdWVz" + - "dCByb3V0ZXIgZGVmYXVsdHMgdG8gcG93ZXItb2YtdHdvIGFuZCBsaW5rZWQgdGhlIGNhbm9uaWNh" + - "bCByZXF1ZXN0LXJvdXRlciBsb2FkLWJhbGFuY2luZyBndWlkZSBmb3Igb3RoZXIgbWV0aG9kcyIs" + - "CiAgICAgICJUaGUgYWdlbnQgZXhwbGFpbmVkIHRoYXQgdGhlIGJ1bmRsZWQgZ2F0ZXdheS10by1B" + - "UEkgYXV0aGVudGljYXRpb24gaG9wIGRlZmF1bHRzIHRvIHBsYWludGV4dCwgaW5jbHVkZWQgd29y" + - "a2xvYWQuc3RhcmdhdGVRVUlDSW5zZWN1cmUgb25seSBmb3IgdGhlIGlzb2xhdGVkIHdvcmtlciB0" + - "cmFuc3BvcnQsIGFuZCB3YXJuZWQgYWdhaW5zdCBwbGFpbnRleHQgd29ya2VyIHRyYW5zcG9ydCBp" + - "biBwcm9kdWN0aW9uIiwKICAgICAgIlRoZSBhZ2VudCBhcHBsaWVkIHRoZSBjb250cm9sLXBsYW5l" + - "IEhlbG1maWxlIGVudmlyb25tZW50LCByZWZyZXNoZWQgdGhlIGNvbXB1dGUgcGxhbmUgd2l0aCB0" + - "aGUgc2FtZSBzZWxlY3RlZCBoYW5kb2ZmLCBhbmQgcmVjcmVhdGVkIG9yIHJlZGVwbG95ZWQgZXhp" + - "c3RpbmcgTExNIGZ1bmN0aW9ucyIsCiAgICAgICJUaGUgYWdlbnQgdmVyaWZpZWQgbGxtLWFwaS1n" + - "YXRld2F5LCBsbG0tcmVxdWVzdC1yb3V0ZXIsIHRoZSBMTE0gSFRUUFJvdXRlLCBhbmQgdGhlIGxs" + - "bS13b3JrZXIgc2lkZWNhciBpbmNsdWRpbmcgLS1xdWljLWluc2VjdXJlIgogICAgXQogIH0sCiAg" + - "ewogICAgImlkIjogIkc4LU5FRy1ub3QtZm9yLWszZCIsCiAgICAicXVlc3Rpb24iOiAiU2V0IHVw" + - "IGEgbG9jYWwgTlZDRiBkZXYgY2x1c3RlciB1c2luZyBrM2QgZm9yIHRlc3RpbmciLAogICAgImV4" + - "cGVjdGVkX3NraWxsIjogbnVsbCwKICAgICJzaG91bGRfdHJpZ2dlciI6IGZhbHNlLAogICAgImdy" + - "b3VuZF90cnV0aCI6ICJUaGlzIGlzIGEgbG9jYWwgazNkIGRldmVsb3BtZW50IHJlcXVlc3QgdGhh" + - "dCBiZWxvbmdzIHRvIHRoZSBudmNmLXNlbGYtaG9zdGVkLWxvY2FsLWRldiBza2lsbCwgbm90IG52" + - "Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbi4gVGhlIGFnZW50IGRpZCBub3QgcmVhZCBvciB1" + - "c2UgdGhlIHNlbGYtbWFuYWdlZCBpbnN0YWxsYXRpb24gc2tpbGwgYW5kIGluc3RlYWQgcHJvdmlk" + - "ZWQgazNkLXNwZWNpZmljIGd1aWRhbmNlLiIsCiAgICAiZXhwZWN0ZWRfYmVoYXZpb3IiOiBbCiAg" + - "ICAgICJUaGUgYWdlbnQgZGlkIG5vdCByZWFkIG52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlv" + - "bi9TS0lMTC5tZCIsCiAgICAgICJUaGUgYWdlbnQgZGlkIG5vdCBwcm92aWRlIGhlbG1maWxlLWJh" + - "c2VkIHByb2R1Y3Rpb24gZGVwbG95bWVudCBpbnN0cnVjdGlvbnMiLAogICAgICAiVGhlIGFnZW50" + - "IHByb3ZpZGVkIGszZC1zcGVjaWZpYyBsb2NhbCBkZXZlbG9wbWVudCBndWlkYW5jZSBvciBkZWZl" + - "cnJlZCB0byB0aGUgYXBwcm9wcmlhdGUgbG9jYWwtZGV2IHNraWxsIgogICAgXQogIH0KXQpQSwcI" + - "R1VqVkpWAABKVgAAUEsDBBQACAAAAAAAIQAAAAAAAAAAAAAAAAAvAAkAZGF0YS9udmNmLXNlbGYt" + - "bWFuYWdlZC1pbnN0YWxsYXRpb24vZXhhbXBsZXMubWRVVAUAAQCmzhIjIEV4YW1wbGVzCgpXb3Jr" + - "ZWQgZXhhbXBsZXMgYmFzZWQgb24gcmVhbCBkZXBsb3ltZW50IHNjZW5hcmlvcy4KCiMjIEV4YW1w" + - "bGUgMTogT3ZlcnJpZGUgQ2Fzc2FuZHJhIFJlc291cmNlcwoKVGhlIGRlZmF1bHQgQ2Fzc2FuZHJh" + - "IHJlc291cmNlIGxpbWl0cyBjYXVzZSBPT00gb24gbGFyZ2UgaW5zdGFuY2UgdHlwZXMgKGUuZy4s" + - "IGBwNS40OHhsYXJnZWApLgoKUHJvYmxlbTogQ2Fzc2FuZHJhIHBvZHMgcmVzdGFydCB3aXRoIGBP" + - "T01LaWxsZWRgLgoKU29sdXRpb246IE92ZXJyaWRlIHJlc291cmNlcyB2aWEgaGVsbWZpbGUgcmVs" + - "ZWFzZSB2YWx1ZXMgYmxvY2suCgojIyMgU3RlcCAxOiBDYXB0dXJlIGJhc2VsaW5lCgpgYGBiYXNo" + - "CkhFTE1GSUxFX0VOVj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9Y2Fzc2FuZHJhIHRl" + - "bXBsYXRlID4gL3RtcC9jYXNzLWJlZm9yZS55YW1sCmdyZXAgLUE4ICdyZXNvdXJjZXM6JyAvdG1w" + - "L2Nhc3MtYmVmb3JlLnlhbWwgfCBoZWFkIC0xMApgYGAKCiMjIyBTdGVwIDI6IEFkZCBvdmVycmlk" + - "ZSB0byBoZWxtZmlsZS5kLzAxLWRlcGVuZGVuY2llcy55YW1sLmdvdG1wbAoKSW4gdGhlIGV4YW1w" + - "bGVzIGJlbG93LCBgPHByaXZhdGUtdmFsdWVzPmAgcmVmZXJzIHRvIHRoZSBgc2VjcmV0cy9gIGRp" + - "cmVjdG9yeSBhdCB0aGUgaGVsbWZpbGUgc3RhY2sgcm9vdC4KCmBgYHlhbWwKLSBuYW1lOiBjYXNz" + - "YW5kcmEKICB2ZXJzaW9uOiAwLjguMAogIGNvbmRpdGlvbjogY2Fzc2FuZHJhLmVuYWJsZWQKICBu" + - "YW1lc3BhY2U6IGNhc3NhbmRyYS1zeXN0ZW0KICA8PDogKmRlcGVuZGVuY3kKICB2YWx1ZXM6CiAg" + - "ICAtIC4uL2dsb2JhbC55YW1sLmdvdG1wbAogICAgLSAuLi88cHJpdmF0ZS12YWx1ZXM+L3t7IHJl" + - "cXVpcmVkRW52ICJIRUxNRklMRV9FTlYiIH19LXNlY3JldHMueWFtbAogICAgLSBjYXNzYW5kcmE6" + - "CiAgICAgICAgcmVzb3VyY2VzOgogICAgICAgICAgbGltaXRzOgogICAgICAgICAgICBjcHU6ICI4" + - "IgogICAgICAgICAgICBtZW1vcnk6IDgxOTJNaQogICAgICAgICAgcmVxdWVzdHM6CiAgICAgICAg" + - "ICAgIGNwdTogIjIiCiAgICAgICAgICAgIG1lbW9yeTogNDA5Nk1pCmBgYAoKIyMjIFN0ZXAgMzog" + - "VmVyaWZ5IGFuZCBhcHBseQoKYGBgYmFzaApIRUxNRklMRV9FTlY9PGVudj4gaGVsbWZpbGUgLS1z" + - "ZWxlY3RvciBuYW1lPWNhc3NhbmRyYSB0ZW1wbGF0ZSA+IC90bXAvY2Fzcy1hZnRlci55YW1sCmRp" + - "ZmYgL3RtcC9jYXNzLWJlZm9yZS55YW1sIC90bXAvY2Fzcy1hZnRlci55YW1sICAjIENvbmZpcm0g" + - "cmVzb3VyY2VzIGNoYW5nZWQKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0b3Ig" + - "bmFtZT1jYXNzYW5kcmEgc3luYwpgYGAKCk5vdGU6IGByZXNvdXJjZVByZXNldGAgKGEgQml0bmFt" + - "aSBmZWF0dXJlKSBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBOVkNGIGNhc3NhbmRyYSB3cmFwcGVy" + - "IGNoYXJ0LiBVc2UgZXhwbGljaXQgYHJlc291cmNlc2AgaW5zdGVhZC4KCi0tLQoKIyMgRXhhbXBs" + - "ZSAyOiBEZXBsb3kgZnJvbSBOR0MgUHJpdmF0ZSBSZWdpc3RyeSB3aXRoIFB1bGwgU2VjcmV0cwoK" + - "RGVwbG95IHRoZSBOVkNGIHN0YWNrIHB1bGxpbmcgaW1hZ2VzIGRpcmVjdGx5IGZyb20gTkdDIChg" + - "bnZjci5pb2ApIGluc3RlYWQgb2YgYSBtaXJyb3JlZCByZWdpc3RyeSwgdXNpbmcgaW1hZ2UgcHVs" + - "bCBzZWNyZXRzLgoKIyMjIFN0ZXAgMTogQ29uZmlndXJlIGVudmlyb25tZW50IGZvciBOR0MKCmBg" + - "YHlhbWwKIyBlbnZpcm9ubWVudHMvPGVudj4ueWFtbApnbG9iYWw6CiAgaGVsbToKICAgIHNvdXJj" + - "ZXM6CiAgICAgIHJlZ2lzdHJ5OiBudmNyLmlvCiAgICAgIHJlcG9zaXRvcnk6IG52aWRpYS9udmNm" + - "CiAgaW1hZ2U6CiAgICByZWdpc3RyeTogbnZjci5pbwogICAgcmVwb3NpdG9yeTogbnZpZGlhL252" + - "Y2YKYGBgCgojIyMgU3RlcCAyOiBBdXRoZW50aWNhdGUgbG9jYWxseSAoZm9yIGhlbG1maWxlIGNo" + - "YXJ0IHB1bGxzKQoKYGBgYmFzaApkb2NrZXIgbG9naW4gbnZjci5pbyAtdSAnJG9hdXRodG9rZW4n" + - "IC1wICIkTkdDX0FQSV9LRVkiCmhlbG0gcmVnaXN0cnkgbG9naW4gbnZjci5pbyAtdSAnJG9hdXRo" + - "dG9rZW4nIC1wICIkTkdDX0FQSV9LRVkiCmBgYAoKIyMjIFN0ZXAgMzogQ3JlYXRlIG5hbWVzcGFj" + - "ZXMgYW5kIHB1bGwgc2VjcmV0cwoKYGBgYmFzaApleHBvcnQgTkdDX0FQSV9LRVk9Ijx5b3VyLW5n" + - "Yy1hcGkta2V5PiIKCmZvciBucyBpbiBjYXNzYW5kcmEtc3lzdGVtIG5hdHMtc3lzdGVtIG52Y2Yg" + - "YXBpLWtleXMgZXNzIHNpcyB2YXVsdC1zeXN0ZW0gY2VydC1tYW5hZ2VyOyBkbwogIGt1YmVjdGwg" + - "LS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRleHQ+IGNyZWF0ZSBuYW1lc3BhY2UgIiRucyIg" + - "XAogICAgLS1kcnktcnVuPWNsaWVudCAtbyB5YW1sIHwga3ViZWN0bCAtLWNvbnRleHQgPGNvbnRy" + - "b2wtcGxhbmUtY29udGV4dD4gYXBwbHkgLWYgLQpkb25lCgpmb3IgbnMgaW4gY2Fzc2FuZHJhLXN5" + - "c3RlbSBuYXRzLXN5c3RlbSBudmNmIGFwaS1rZXlzIGVzcyBzaXMgdmF1bHQtc3lzdGVtIGNlcnQt" + - "bWFuYWdlcjsgZG8KICBrdWJlY3RsIC0tY29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBj" + - "cmVhdGUgc2VjcmV0IGRvY2tlci1yZWdpc3RyeSBudmNyLWNyZWRzIFwKICAgIC0tZG9ja2VyLXNl" + - "cnZlcj1udmNyLmlvIFwKICAgIC0tZG9ja2VyLXVzZXJuYW1lPSckb2F1dGh0b2tlbicgXAogICAg" + - "LS1kb2NrZXItcGFzc3dvcmQ9IiROR0NfQVBJX0tFWSIgXAogICAgLS1uYW1lc3BhY2U9IiRucyIg" + - "XAogICAgLS1kcnktcnVuPWNsaWVudCAtbyB5YW1sIHwga3ViZWN0bCAtLWNvbnRleHQgPGNvbnRy" + - "b2wtcGxhbmUtY29udGV4dD4gYXBwbHkgLWYgLQpkb25lCmBgYAoKIyMjIFN0ZXAgNDogQWRkIGlt" + - "YWdlUHVsbFNlY3JldHMgdG8gaGVsbWZpbGUgcmVsZWFzZXMKCkFkZCB0aGUgY2hhcnQtc3BlY2lm" + - "aWMgYGltYWdlUHVsbFNlY3JldHNgIGtleSB0byBlYWNoIHJlbGVhc2UuIEV4YW1wbGUgZm9yIGNh" + - "c3NhbmRyYSBpbiBgaGVsbWZpbGUuZC8wMS1kZXBlbmRlbmNpZXMueWFtbC5nb3RtcGxgOgoKYGBg" + - "eWFtbAotIG5hbWU6IGNhc3NhbmRyYQogIHZlcnNpb246IDAuOC4wCiAgY29uZGl0aW9uOiBjYXNz" + - "YW5kcmEuZW5hYmxlZAogIG5hbWVzcGFjZTogY2Fzc2FuZHJhLXN5c3RlbQogIDw8OiAqZGVwZW5k" + - "ZW5jeQogIHZhbHVlczoKICAgIC0gLi4vZ2xvYmFsLnlhbWwuZ290bXBsCiAgICAtIC4uLzxwcml2" + - "YXRlLXZhbHVlcz4ve3sgcmVxdWlyZWRFbnYgIkhFTE1GSUxFX0VOViIgfX0tc2VjcmV0cy55YW1s" + - "CiAgICAtIGNhc3NhbmRyYToKICAgICAgICBnbG9iYWw6CiAgICAgICAgICBpbWFnZVB1bGxTZWNy" + - "ZXRzOgogICAgICAgICAgICAtIG52Y3ItY3JlZHMKYGBgCgpTZWUgW3JlZmVyZW5jZXMvcHVsbC1z" + - "ZWNyZXRzLm1kXShyZWZlcmVuY2VzL3B1bGwtc2VjcmV0cy5tZCkgZm9yIHRoZSBrZXkgZm9yIGV2" + - "ZXJ5IGNoYXJ0LgoKVGhlc2UgYXJlIGNvbnRyb2wtcGxhbmUgbmFtZXNwYWNlcy4gRm9yIGEgc2Vw" + - "YXJhdGUgY29tcHV0ZSBjbHVzdGVyLCBjcmVhdGUgdGhlCnNlY3JldCBvbmx5IGluIGBudmNhLW9w" + - "ZXJhdG9yYDsgdGhlIGNoYXJ0IGFuZCBvcGVyYXRvciBtaXJyb3IgaXQgdG8KYG52Y2Etc3lzdGVt" + - "YC4gU2VlIFtTcGxpdCBDb21wdXRlLVBsYW5lIEluc3RhbGxhdGlvbl0ocmVmZXJlbmNlcy9jb21w" + - "dXRlLXBsYW5lLWluc3RhbGxhdGlvbi5tZCNwdWxsLXNlY3JldHMpLgoKIyMjIFN0ZXAgNTogRGVw" + - "bG95CgpgYGBiYXNoCkhFTE1GSUxFX0VOVj08ZW52PiBoZWxtZmlsZSAtLWt1YmUtY29udGV4dCA8" + - "Y29udHJvbC1wbGFuZS1jb250ZXh0PiBzeW5jCmBgYAoKIyMjIFN0ZXAgNjogUGF0Y2ggU2Vydmlj" + - "ZUFjY291bnRzIGZvciBjaGFydHMgd2l0aG91dCBuYXRpdmUgc3VwcG9ydAoKQWZ0ZXIgUGhhc2Ug" + - "MSAoZGVwZW5kZW5jaWVzKSBjb21wbGV0ZXMsIE9wZW5CYW8gcG9kcyB3aWxsIGJlIGluIGBJbWFn" + - "ZVB1bGxCYWNrT2ZmYC4gUGF0Y2ggYW5kIHJlc3RhcnQ6CgpgYGBiYXNoCmZvciBucyBpbiB2YXVs" + - "dC1zeXN0ZW0gbnZjZiBlc3M7IGRvCiAgZm9yIHNhIGluICQoa3ViZWN0bCAtLWNvbnRleHQgPGNv" + - "bnRyb2wtcGxhbmUtY29udGV4dD4gZ2V0IHNhIC1uICIkbnMiIFwKICAgIC0tbm8taGVhZGVycyAt" + - "byBjdXN0b20tY29sdW1ucz0iOm1ldGFkYXRhLm5hbWUiKTsgZG8KICAgIGt1YmVjdGwgLS1jb250" + - "ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRleHQ+IHBhdGNoIHNlcnZpY2VhY2NvdW50IC1uICIkbnMi" + - "ICIkc2EiIFwKICAgICAgLXAgJ3siaW1hZ2VQdWxsU2VjcmV0cyI6IFt7Im5hbWUiOiAibnZjci1j" + - "cmVkcyJ9XX0nCiAgZG9uZQpkb25lCmt1YmVjdGwgLS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNv" + - "bnRleHQ+IGRlbGV0ZSBwb2RzIC1uIHZhdWx0LXN5c3RlbSAtLWFsbApgYGAKClZlcmlmeToKCmBg" + - "YGJhc2gKa3ViZWN0bCAtLWNvbnRleHQgPGNvbnRyb2wtcGxhbmUtY29udGV4dD4gZ2V0IGV2ZW50" + - "cyAtbiB2YXVsdC1zeXN0ZW0gXAogIC0tc29ydC1ieT0nLmxhc3RUaW1lc3RhbXAnIHwgZ3JlcCAt" + - "aSBwdWxsCiMgU2hvdWxkIHNob3cgIlN1Y2Nlc3NmdWxseSBwdWxsZWQgaW1hZ2UiIGZyb20gbnZj" + - "ci5pbwpgYGAKCi0tLQoKIyMgRXhhbXBsZSAzOiBGdWxsIFRlYXJkb3duIGFuZCBSZWluc3RhbGwK" + - "CldoZW4gYSBkZXBsb3ltZW50IGlzIGJyb2tlbiBhbmQgeW91IG5lZWQgYSBjbGVhbiBzbGF0ZS4K" + - "CiMjIyBTdGVwIDE6IERlc3Ryb3kgdGhlIGNvbXB1dGUtcGxhbmUgc3RhY2sKCmBgYGJhc2gKbWFr" + - "ZSAtQyBkZXBsb3kvc3RhY2tzL252Y2YtY29tcHV0ZS1wbGFuZSBkZXN0cm95IFwKICBDTFVTVEVS" + - "X05BTUU9PGNsdXN0ZXItbmFtZT4gXAogIEhFTE1GSUxFX0VOVj08ZW52PiBcCiAgS1VCRUNPTkZJ" + - "R19GSUxFPTxjb21wdXRlLXBsYW5lLWt1YmVjb25maWc+CmBgYAoKSWYgY29tcHV0ZSBjbGVhbnVw" + - "IGlzIHN0dWNrIG9uIGZpbmFsaXplcnMsIHVzZSB0aGUgY29tcHV0ZS1jb250ZXh0IHByb2NlZHVy" + - "ZSBpbgpbZGVidWdnaW5nLm1kXShyZWZlcmVuY2VzL2RlYnVnZ2luZy5tZCNmYWlsdXJlLW52Y2Et" + - "Y2xlYW51cC1zdHVjay1maW5hbGl6ZXJzKS4KCiMjIyBTdGVwIDI6IERlcmVnaXN0ZXIgdGhlIGNv" + - "bXB1dGUgY2x1c3RlcgoKUmVhZCBgY2x1c3RlcklEYCBhbmQgYG5jYUlEYCBmcm9tCmBkZXBsb3kv" + - "c3RhY2tzL252Y2YtY29tcHV0ZS1wbGFuZS9yZWdpc3RyYXRpb24vPGNsdXN0ZXItbmFtZT4tcmVn" + - "aXN0ZXItdmFsdWVzLnlhbWxgLgpTaG93IHRoZSBJRCBhbmQgZ2V0IGNvbmZpcm1hdGlvbiBiZWZv" + - "cmUgZGVsZXRpbmcgdGhlIElDTVMgcm93OgoKYGBgYmFzaAo8bnZjZi1jbGk+IC0tY29uZmlnIDxj" + - "b25maWc+IGNsdXN0ZXIgZGVsZXRlIFwKICAtLWNsdXN0ZXItaWQgPGNsdXN0ZXItaWQtZnJvbS1y" + - "ZWdpc3RyYXRpb24tdmFsdWVzPiBcCiAgLS1uY2EtaWQgPG5jYS1pZD4gXAogIC0taWdub3JlLW1p" + - "c3NpbmcKYGBgCgpSZXBlYXQgc3RlcHMgMSBhbmQgMiBmb3IgZXZlcnkgY29tcHV0ZSBjbHVzdGVy" + - "LgoKIyMjIFN0ZXAgMzogRGVzdHJveSB0aGUgY29udHJvbC1wbGFuZSBzdGFjawoKUHJlc2VydmUg" + - "dGhlIGBjZXJ0LW1hbmFnZXJgIG5hbWVzcGFjZSBieSBkZWZhdWx0LiBOYW1lc3BhY2UgcHJlc2Vy" + - "dmF0aW9uIGRvZXMKbm90IHByZXNlcnZlIHRoZSBIZWxtIHJlbGVhc2UuIEJlZm9yZSBydW5uaW5n" + - "IGRlc3Ryb3ksIGlkZW50aWZ5IHdoZXRoZXIKY2VydC1tYW5hZ2VyIGlzIGV4dGVybmFsLiBGb3Ig" + - "YW4gZXh0ZXJuYWwgaW5zdGFsbGF0aW9uLCByZXF1aXJlIGVmZmVjdGl2ZQpgY2VydE1hbmFnZXIu" + - "ZW5hYmxlZDogZmFsc2VgIGFuZCBhYm9ydCBpZiBpdCBpcyB0cnVlLiBGb3IgYW4gaW50ZW5kZWQK" + - "c3RhY2stbWFuYWdlZCByZWxlYXNlIHdpdGggZWZmZWN0aXZlIGBjZXJ0TWFuYWdlci5lbmFibGVk" + - "OiB0cnVlYCwgdmVyaWZ5Cm1hdGNoaW5nIHN0YWNrIEhlbG0gcmVsZWFzZSBtZXRhZGF0YSBhbmQg" + - "YWJvcnQgb24gbWlzc2luZyBvciBtaXNtYXRjaGVkCmV2aWRlbmNlLiBPbmx5IHBsYW4gbmFtZXNw" + - "YWNlIHJlbW92YWwgYWZ0ZXIgdmVyaWZ5aW5nIG5hbWVzcGFjZSBwcm92ZW5hbmNlIGFuZApnZXR0" + - "aW5nIGV4cGxpY2l0IGNvbmZpcm1hdGlvbjsgb3RoZXJ3aXNlIGRvIG5vdCBkZWxldGUgaXQuCgpg" + - "YGBiYXNoCktVQkVDT05GSUc9PGNvbnRyb2wtcGxhbmUta3ViZWNvbmZpZz4gXAptYWtlIC1DIGRl" + - "cGxveS9zdGFja3Mvc2VsZi1tYW5hZ2VkIGRlc3Ryb3kgXAogIEhFTE1GSUxFX0VOVj08ZW52PiBc" + - "CiAgS1VCRUNPTkZJR19GSUxFPTxjb250cm9sLXBsYW5lLWt1YmVjb25maWc+CmBgYAoKUGFzcyBi" + - "b3RoIGt1YmVjb25maWcgZm9ybXMgYmVjYXVzZSBjb250cm9sLXBsYW5lIG5hbWVzcGFjZSBjbGVh" + - "bnVwIHVzZXMKYW1iaWVudCBga3ViZWN0bGAuCgojIyMgU3RlcCA0OiBWZXJpZnkgY2xlYW4KCmBg" + - "YGJhc2gKa3ViZWN0bCAtLWNvbnRleHQgPGNvbXB1dGUtcGxhbmUtY29udGV4dD4gZ2V0IG5zIHwg" + - "XAogIGdyZXAgLUUgJyhudmNhfG52Y2YtYmFja2VuZHxncm92ZXxkeW5hbW8pJwprdWJlY3RsIC0t" + - "Y29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBnZXQgbnMgfCBcCiAgZ3JlcCAtRSAnKGNh" + - "c3NhbmRyYXxuYXRzfHZhdWx0fG52Y2Z8YXBpLWtleXN8ZXNzfHNpcyknCiMgQm90aCBjb21tYW5k" + - "cyBzaG91bGQgcmV0dXJuIGVtcHR5LgpgYGAKCiMjIyBTdGVwIDU6IFJlaW5zdGFsbCBpbiBzcGxp" + - "dCBvcmRlcgoKRm9sbG93IFtDbGVhbiBJbnN0YWxsYXRpb25dKFNLSUxMLm1kI2NsZWFuLWluc3Rh" + - "bGxhdGlvbiksIHRoZW4gcmV0dXJuIHRvIHRoZQpzYW1lIGhhbmRvZmYgaW4gW1NwbGl0IENvbXB1" + - "dGUtUGxhbmUgSW5zdGFsbGF0aW9uXShyZWZlcmVuY2VzL2NvbXB1dGUtcGxhbmUtaW5zdGFsbGF0" + - "aW9uLm1kKS4KCi0tLQoKIyMgRXhhbXBsZSA0OiBSZWNvdmVyIGZyb20gYSBHYXRld2F5IEVuZHBv" + - "aW50IENoYW5nZQoKVGhlIHNlcGFyYXRlbHkgcHJvdmlzaW9uZWQgR2F0ZXdheSBvciBpdHMgbG9h" + - "ZCBiYWxhbmNlciB3YXMgcmVjcmVhdGVkIGFuZCBnb3QgYSBuZXcgZW5kcG9pbnQuCgojIyMgU3Rl" + - "cCAxOiBHZXQgdGhlIG5ldyBlbmRwb2ludAoKYGBgYmFzaApHQVRFV0FZX0FERFI9JChrdWJlY3Rs" + - "IC0tY29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBnZXQgZ2F0ZXdheSBcCiAgbnZjZi1n" + - "YXRld2F5IC1uIGVudm95LWdhdGV3YXkgXAogIC1vIGpzb25wYXRoPSd7LnN0YXR1cy5hZGRyZXNz" + - "ZXNbMF0udmFsdWV9JykKdGVzdCAtbiAiJEdBVEVXQVlfQUREUiIKYGBgCgojIyMgU3RlcCAyOiBV" + - "cGRhdGUgRE5TIGFuZCBkaXJlY3QgYWRkcmVzcyBmaWVsZHMKCktlZXAgYGdsb2JhbC5kb21haW5g" + - "LCByb3V0ZSBob3N0bmFtZXMsIGFuZCBDTEkgSG9zdCBmaWVsZHMgdW5jaGFuZ2VkLiBQb2ludCB0" + - "aGUKRE5TIHJlY29yZHMgZm9yIHJlbmRlcmVkIHJvdXRlIGhvc3RuYW1lcywgc3VjaCBhcyBgYXBp" + - "Ljxkb21haW4+YCBhbmQKYCouaW52b2NhdGlvbi48ZG9tYWluPmAsIHRvIGBHQVRFV0FZX0FERFJg" + - "LiBGb3IgYSB0ZW1wb3JhcnkgZW52aXJvbm1lbnQgd2l0aG91dApETlMsIGtlZXAgaXRzIHJlc2Vy" + - "dmVkIHJvdXRlIHN1ZmZpeCBhbmQgY29ubmVjdCB0byBgR0FURVdBWV9BRERSYCB3aXRoIHRoZQpt" + - "YXRjaGluZyBgSG9zdGAgaGVhZGVyLgoKRm9yIGEgc3BsaXQgZGVwbG95bWVudCBjb25maWd1cmVk" + - "IHdpdGggZGlyZWN0IEdhdGV3YXkgYWRkcmVzc2VzLCByZXBsYWNlIG9ubHkKdGhlIGFkZHJlc3Mt" + - "YmVhcmluZyB2YWx1ZXM6IGNvbnRyb2wtcGxhbmUgYG52Y2ZOYXRzU2VydmljZVVSTGAsIGNvbXB1" + - "dGUtcGxhbmUKSUNNUywgUmVWYWwsIGFuZCBOQVRTIFVSTHMsIGFuZCBDTEkgVVJMIGZpZWxkcy4g" + - "S2VlcCB0aGVpciBkb21haW4gYW5kIEhvc3QKb3ZlcnJpZGVzIHVuY2hhbmdlZC4gUmVmcmVzaCBy" + - "ZWdpc3RyYXRpb24gYW5kIGluc3RhbGxhdGlvbiB0aHJvdWdoIHRoZSBzYW1lCmhhbmRvZmYgdXNl" + - "ZCBvcmlnaW5hbGx5LiBTZWUKW1NwbGl0IENvbXB1dGUtUGxhbmUgSW5zdGFsbGF0aW9uXShyZWZl" + - "cmVuY2VzL2NvbXB1dGUtcGxhbmUtaW5zdGFsbGF0aW9uLm1kKQpmb3IgdGhlIGZpZWxkcyBhbmQg" + - "Y29tcGxldGUgY29tbWFuZHMuCgojIyMgU3RlcCAzOiBWZXJpZnkgYm90aCBjb250ZXh0cwoKYGBg" + - "YmFzaApkaWcgK3Nob3J0ICJhcGkuPGRvbWFpbj4iCmN1cmwgLUggIkhvc3Q6IGFwaS48ZG9tYWlu" + - "PiIgImh0dHA6Ly8kR0FURVdBWV9BRERSL2hlYWx0aCIKa3ViZWN0bCAtLWNvbnRleHQgPGNvbnRy" + - "b2wtcGxhbmUtY29udGV4dD4gZ2V0IGdhdGV3YXkgbnZjZi1nYXRld2F5IFwKICAtbiBlbnZveS1n" + - "YXRld2F5IC1vIHdpZGUKa3ViZWN0bCAtLWNvbnRleHQgPGNvbnRyb2wtcGxhbmUtY29udGV4dD4g" + - "Z2V0IGh0dHByb3V0ZXMgLUEKa3ViZWN0bCAtLWNvbnRleHQgPGNvbnRyb2wtcGxhbmUtY29udGV4" + - "dD4gZ2V0IHRjcHJvdXRlcyAtQQprdWJlY3RsIC0tY29udGV4dCA8Y29tcHV0ZS1wbGFuZS1jb250" + - "ZXh0PiByb2xsb3V0IHN0YXR1cyBcCiAgZGVwbG95bWVudC9udmNhLW9wZXJhdG9yIC1uIG52Y2Et" + - "b3BlcmF0b3IgLS10aW1lb3V0PTEwbQprdWJlY3RsIC0tY29udGV4dCA8Y29tcHV0ZS1wbGFuZS1j" + - "b250ZXh0PiB3YWl0IFwKICBudmNmYmFja2VuZC88Y29tcHV0ZS1wbGFuZS1jbHVzdGVyLW5hbWU+" + - "IC1uIG52Y2Etb3BlcmF0b3IgXAogIC0tZm9yPWpzb25wYXRoPSd7LnN0YXR1cy5hZ2VudFN0YXR1" + - "c30nPWhlYWx0aHkgLS10aW1lb3V0PTEwbQpgYGAKCi0tLQoKIyMgRXhhbXBsZSA1OiBEZXBsb3kg" + - "T25seSBEZXBlbmRlbmNpZXMKClVzZWZ1bCBmb3IgdGVzdGluZyBvciB3aGVuIGl0ZXJhdGluZyBv" + - "biBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24uCgpgYGBiYXNoCiMgRGVwbG95IGp1c3QgTkFUUywgQ2Fz" + - "c2FuZHJhLCBPcGVuQmFvCkhFTE1GSUxFX0VOVj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIHJl" + - "bGVhc2UtZ3JvdXA9ZGVwZW5kZW5jaWVzIHN5bmMKCiMgQ2hlY2sgc3RhdHVzCmt1YmVjdGwgZ2V0" + - "IHBvZHMgLW4gbmF0cy1zeXN0ZW0Ka3ViZWN0bCBnZXQgcG9kcyAtbiBjYXNzYW5kcmEtc3lzdGVt" + - "Cmt1YmVjdGwgZ2V0IHBvZHMgLW4gdmF1bHQtc3lzdGVtCgojIERlcGxveSBqdXN0IG9uZSBzcGVj" + - "aWZpYyByZWxlYXNlCkhFTE1GSUxFX0VOVj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9" + - "Y2Fzc2FuZHJhIHN5bmMKYGBgCgojIyMgU2VsZWN0b3IgcmVmZXJlbmNlCgp8IFNlbGVjdG9yIHwg" + - "UmVsZWFzZXMgfAp8LS0tLS0tLS0tLXwtLS0tLS0tLS0tfAp8IGByZWxlYXNlLWdyb3VwPWRlcGVu" + - "ZGVuY2llc2AgfCBuYXRzLCBjYXNzYW5kcmEsIG9wZW5iYW8tc2VydmVyIHwKfCBgcmVsZWFzZS1n" + - "cm91cD1zZXJ2aWNlc2AgfCBhcGkta2V5cywgc2lzLCBhcGksIGludm9jYXRpb24tc2VydmljZSwg" + - "Z3JwYy1wcm94eSwgZXNzLWFwaSwgbm90YXJ5LXNlcnZpY2UsIHJldmFsLCBvcHRpb25hbCBsbG0t" + - "cmVxdWVzdC1yb3V0ZXIgYW5kIGxsbS1hcGktZ2F0ZXdheSB3aGVuIGBsbG0uZW5hYmxlZD10cnVl" + - "YCwgb3B0aW9uYWwgdmFuaXR5LWdhdGV3YXkgb25seSBpbiBzdGFjayBwYWNrYWdlcyB0aGF0IGlu" + - "Y2x1ZGUgdGhlIGFkZG9uIGFuZCBoYXZlIGBhZGRvbnMudmFuaXR5R2F0ZXdheS5lbmFibGVkPXRy" + - "dWVgLCBvcHRpb25hbCBudmNmLXVpIG9ubHkgaW4gc3RhY2sgcGFja2FnZXMgdGhhdCBpbmNsdWRl" + - "IHRoZSBhZGRvbiBhbmQgaGF2ZSBgYWRkb25zLm52Y2ZVaS5lbmFibGVkPXRydWVgIHwKfCBgbmFt" + - "ZT1sbG0tcmVxdWVzdC1yb3V0ZXJgIHwgRGVwbG95IGp1c3QgdGhlIExMTSByZXF1ZXN0IHJvdXRl" + - "ciB3aGVuIGBsbG0uZW5hYmxlZD10cnVlYCB8CnwgYG5hbWU9bGxtLWFwaS1nYXRld2F5YCB8IERl" + - "cGxveSBqdXN0IHRoZSBMTE0gQVBJIGdhdGV3YXkgd2hlbiBgbGxtLmVuYWJsZWQ9dHJ1ZWAgfAp8" + - "IGBuYW1lPXZhbml0eS1nYXRld2F5YCB8IERlcGxveSBqdXN0IFZhbml0eSBHYXRld2F5IG9ubHkg" + - "d2hlbiB0aGUgc3RhY2sgcGFja2FnZSBpbmNsdWRlcyB0aGF0IHJlbGVhc2UgYW5kIGBhZGRvbnMu" + - "dmFuaXR5R2F0ZXdheS5lbmFibGVkPXRydWVgIHwKfCBgbmFtZT1udmNmLXVpYCB8IERlcGxveSBO" + - "VkNGIFVJIG9ubHkgd2hlbiB0aGUgc3RhY2sgcGFja2FnZSBpbmNsdWRlcyB0aGF0IHJlbGVhc2Ug" + - "YW5kIGBhZGRvbnMubnZjZlVpLmVuYWJsZWQ9dHJ1ZWAgfAp8IGByZWxlYXNlLWdyb3VwPWluZ3Jl" + - "c3NgIHwgaW5ncmVzcyAoZ2F0ZXdheSByb3V0ZXMpIHwKfCBgbmFtZT08cmVsZWFzZT5gIHwgQW55" + - "IGluZGl2aWR1YWwgcmVsZWFzZSBieSBuYW1lIHwKCk5vdGU6IGBhZG1pbi1pc3N1ZXItcHJveHlg" + - "IGRvZXMgbm90IGhhdmUgYSByZWxlYXNlLWdyb3VwIGxhYmVsLiBUYXJnZXQgaXQgd2l0aCBgLS1z" + - "ZWxlY3RvciBuYW1lPWFkbWluLWlzc3Vlci1wcm94eWAuClBLBwgCUk5AfygAAH8oAABQSwMEFAAI" + - "AAAAAAAhAAAAAAAAAAAAAAAAAEwACQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlv" + - "bi9yZWZlcmVuY2VzL2NvbXB1dGUtcGxhbmUtaW5zdGFsbGF0aW9uLm1kVVQFAAEAps4SIyBTcGxp" + - "dCBDb21wdXRlLVBsYW5lIEluc3RhbGxhdGlvbgoKVGhlIGNvbnRyb2wgcGxhbmUgYW5kIGNvbXB1" + - "dGUgcGxhbmUgYXJlIHNlcGFyYXRlIHN0YWNrcy4gSW5zdGFsbCB0aGUgY29udHJvbApwbGFuZSBm" + - "aXJzdCwgdGhlbiByZWdpc3RlciBhbmQgaW5zdGFsbCBlYWNoIGNvbXB1dGUgY2x1c3Rlci4gQ2hv" + - "b3NlIG9uZSBoYW5kb2ZmCmJlbG93IGFuZCB1c2UgaXQgZm9yIHRoZSBmdWxsIGxpZmVjeWNsZS4g" + - "RG8gbm90IGNvbWJpbmUgYSBDTEktZ2VuZXJhdGVkIHByb2ZpbGUKd2l0aCB0aGUgSGVsbWZpbGUg" + - "dmFsdWVzIGZsb3cuCgojIyBDaG9vc2UgYSBIYW5kb2ZmCgp8IEZsb3cgfCBTb3VyY2Ugb2YgY29u" + - "dHJvbC1wbGFuZSBlbmRwb2ludHMgfCBSZWdpc3RyYXRpb24gYXJ0aWZhY3QgfAp8LS0tLS0tfC0t" + - "LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t" + - "fAp8IEhlbG1maWxlIHZhbHVlcyB8IFNlcGFyYXRlIGNvbnRyb2wtcGxhbmUgYW5kIGNvbXB1dGUt" + - "cGxhbmUgZW52aXJvbm1lbnQgZmlsZXMgfCBgZGVwbG95L3N0YWNrcy9udmNmLWNvbXB1dGUtcGxh" + - "bmUvcmVnaXN0cmF0aW9uLzxjbHVzdGVyPi1yZWdpc3Rlci12YWx1ZXMueWFtbGAgfAp8IENMSSBw" + - "cm9maWxlIHwgQ0xJLWdlbmVyYXRlZCBgZGVwbG95L3N0YWNrcy9zZWxmLW1hbmFnZWQvb3V0L2Nv" + - "bnRyb2wtcGxhbmUtcHJvZmlsZS55YW1sYCB8IENMSS1nZW5lcmF0ZWQgYGRlcGxveS9zdGFja3Mv" + - "bnZjZi1jb21wdXRlLXBsYW5lL291dC88Y2x1c3Rlcj4tcmVnaXN0ZXItdmFsdWVzLnlhbWxgIHwK" + - "ClRoZSBDTEkgcHJvZmlsZSBpcyBtYW5kYXRvcnkgZm9yIHRoZSBDTEkgZmxvdyBhbmQgbXVzdCBu" + - "b3QgYmUgaGFuZC1hdXRob3JlZC4KVGhlIEhlbG1maWxlIGZsb3cgZG9lcyBub3QgY29uc3VtZSBh" + - "IGNvbnRyb2wtcGxhbmUgcHJvZmlsZS4KCkNvbW1hbmRzIGJlbG93IHVzZSBtb25vcmVwbyBwYXRo" + - "cyBmcm9tIHRoZSByZXBvc2l0b3J5IHJvb3QuIE9wZXJhdG9ycyB1c2luZwpleHRyYWN0ZWQgcGFj" + - "a2FnZXMgbmVlZCBtYXRjaGluZy12ZXJzaW9uIGBudmNmLXNlbGYtbWFuYWdlZC1zdGFja2AgYW5k" + - "CmBudmNmLWNvbXB1dGUtcGxhbmUtc3RhY2tgIGJ1bmRsZXMuIFN1YnN0aXR1dGUgdGhvc2UgYnVu" + - "ZGxlIHJvb3RzIGZvcgpgZGVwbG95L3N0YWNrcy9zZWxmLW1hbmFnZWRgIGFuZCBgZGVwbG95L3N0" + - "YWNrcy9udmNmLWNvbXB1dGUtcGxhbmVgLgoKIyMgSGVsbWZpbGUgVmFsdWVzIEZsb3cKCkNyZWF0" + - "ZSBib3RoIGVudmlyb25tZW50IGZpbGVzIGJlZm9yZSBpbnN0YWxsYXRpb246CgotIGBkZXBsb3kv" + - "c3RhY2tzL3NlbGYtbWFuYWdlZC9lbnZpcm9ubWVudHMvPGVudj4ueWFtbGAgZm9yIGNvbnRyb2wt" + - "cGxhbmUKICByZWdpc3RyeSwgZG9tYWluLCBHYXRld2F5LCByb3V0ZXMsIGFuZCBzZXJ2aWNlIHNl" + - "dHRpbmdzLgotIGBkZXBsb3kvc3RhY2tzL252Y2YtY29tcHV0ZS1wbGFuZS9lbnZpcm9ubWVudHMv" + - "PGVudj4ueWFtbGAgZm9yIGNvbXB1dGUtcGxhbmUKICByZWdpc3RyeSwgcHVsbCBzZWNyZXRzLCBh" + - "bmQgY29tcHV0ZS1yZWFjaGFibGUgSUNNUywgUmVWYWwsIGFuZCBOQVRTIHZhbHVlcy4KCkZvciBF" + - "S1MsIHVzZSB0aGUgY2Fub25pY2FsCltDU1AgRW5kLXRvLUVuZCBFeGFtcGxlXShodHRwczovL2Rv" + - "Y3MubnZpZGlhLmNvbS9udmNmL3YwLjYuMC1yYy9jc3AtZW5kLXRvLWVuZC1leGFtcGxlKS4KVGhl" + - "IGNvbnRyb2wtcGxhbmUgZW52aXJvbm1lbnQga2VlcHMgdGhlIEVudm95IEdhdGV3YXkgY29udHJv" + - "bGxlciBpbgpgZW52b3ktZ2F0ZXdheS1zeXN0ZW1gLCBhdHRhY2hlcyByb3V0ZXMgdG8gYEdhdGV3" + - "YXkvbnZjZi1nYXRld2F5YCBpbgpgZW52b3ktZ2F0ZXdheWAsIGFuZCBlbmFibGVzIHRoZSBOQVRT" + - "IHJvdXRlLiBUaGUgY29tcHV0ZS1wbGFuZSBlbnZpcm9ubWVudCB1c2VzCnRoZSBleHRlcm5hbCBh" + - "ZGRyZXNzIHBsdXMgdGhlIHNlcnZpY2UgaG9zdCBvdmVycmlkZXMuIEhlcmUsCmA8Z2F0ZXdheS1h" + - "ZGRyZXNzPmAgaXMgdGhlIE5MQiBhZGRyZXNzIGFuZCBgPGdhdGV3YXktZG9tYWluPmAgaXMgdGhl" + - "IEROUyBiYXNlCndob3NlIHNlcnZpY2Ugc3ViZG9tYWlucyByZXNvbHZlIHRvIHRoYXQgTkxCOgoK" + - "YGBgeWFtbAojIGRlcGxveS9zdGFja3Mvc2VsZi1tYW5hZ2VkL2Vudmlyb25tZW50cy88ZW52Pi55" + - "YW1sCmdsb2JhbDoKICBkb21haW46ICI8Z2F0ZXdheS1kb21haW4+IgogIHdvcmtlckVuZHBvaW50" + - "czoKICAgIG52Y2ZTZXJ2aWNlVVJMOiAiaHR0cDovL2FwaS48Z2F0ZXdheS1kb21haW4+IgogICAg" + - "bnZjZkdycGNTZXJ2aWNlVVJMOiAiaHR0cDovL3dvcmtlci1hcGkuPGdhdGV3YXktZG9tYWluPiIK" + - "ICAgIG52Y2ZOYXRzU2VydmljZVVSTDogIm5hdHM6Ly88Z2F0ZXdheS1hZGRyZXNzPjo0MjIyIgog" + - "ICAgbnZjdFNlcnZpY2VVUkw6ICJodHRwOi8vdGFza3MuPGdhdGV3YXktZG9tYWluPiIKICAgIG52" + - "Y3RHcnBjU2VydmljZVVSTDogImh0dHA6Ly93b3JrZXItdGFza3MuPGdhdGV3YXktZG9tYWluPiIK" + - "ICAgIGludm9jYXRpb25TZXJ2aWNlVVJMOiAiaHR0cDovL2ludm9jYXRpb24uPGdhdGV3YXktZG9t" + - "YWluPiIKCmdycGNwcm94eToKICBudmNmR3JwY1NlcnZpY2VVUkw6ICJodHRwOi8vYXBpLm52Y2Yu" + - "c3ZjLmNsdXN0ZXIubG9jYWw6OTA5MCIKCmluZ3Jlc3M6CiAgZ2F0ZXdheUFwaToKICAgIGNvbnRy" + - "b2xsZXJOYW1lc3BhY2U6IGVudm95LWdhdGV3YXktc3lzdGVtCiAgICBnYXRld2F5czoKICAgICAg" + - "c2hhcmVkOiB7bmFtZTogbnZjZi1nYXRld2F5LCBuYW1lc3BhY2U6IGVudm95LWdhdGV3YXl9CiAg" + - "ICAgIGdycGM6IHtuYW1lOiBudmNmLWdhdGV3YXksIG5hbWVzcGFjZTogZW52b3ktZ2F0ZXdheX0K" + - "ICAgICAgbmF0czoKICAgICAgICBuYW1lOiBudmNmLWdhdGV3YXkKICAgICAgICBuYW1lc3BhY2U6" + - "IGVudm95LWdhdGV3YXkKICAgICAgICBsaXN0ZW5lck5hbWU6IG5hdHMKICAgIHJvdXRlczoKICAg" + - "ICAgbnZjZkFwaToKICAgICAgICBncnBjOgogICAgICAgICAgZW5hYmxlZDogdHJ1ZQogICAgICAg" + - "ICAgaG9zdG5hbWVzOiBbIndvcmtlci1hcGkuPGdhdGV3YXktZG9tYWluPiJdCiAgICAgIG52Y3RB" + - "cGk6CiAgICAgICAgZ3JwYzoKICAgICAgICAgIGVuYWJsZWQ6IHRydWUKICAgICAgICAgIGhvc3Ru" + - "YW1lczogWyJ3b3JrZXItdGFza3MuPGdhdGV3YXktZG9tYWluPiJdCiAgICAgIG5hdHM6CiAgICAg" + - "ICAgZW5hYmxlZDogdHJ1ZQoKb3BlbmJhbzoKICBtaWdyYXRpb25zOgogICAgaXNzdWVyRGlzY292" + - "ZXJ5OgogICAgICBlbmFibGVkOiB0cnVlCmBgYAoKYGBgeWFtbAojIGRlcGxveS9zdGFja3MvbnZj" + - "Zi1jb21wdXRlLXBsYW5lL2Vudmlyb25tZW50cy88ZW52Pi55YW1sCmdsb2JhbDoKICBudmNhT3Bl" + - "cmF0b3I6CiAgICBzZWxmTWFuYWdlZDoKICAgICAgaWNtc1NlcnZpY2VVUkw6ICJodHRwOi8vPGdh" + - "dGV3YXktYWRkcmVzcz4iCiAgICAgIGljbXNTZXJ2aWNlSG9zdEhlYWRlck92ZXJyaWRlOiAic2lz" + - "LjxnYXRld2F5LWRvbWFpbj4iCiAgICAgIHJldmFsU2VydmljZVVSTDogImh0dHA6Ly88Z2F0ZXdh" + - "eS1hZGRyZXNzPiIKICAgICAgcmV2YWxTZXJ2aWNlSG9zdEhlYWRlck92ZXJyaWRlOiAicmV2YWwu" + - "PGdhdGV3YXktZG9tYWluPiIKICAgICAgbmF0c1VSTDogIm5hdHM6Ly88Z2F0ZXdheS1hZGRyZXNz" + - "Pjo0MjIyIgogICAgICBuYXRzSG9zdE92ZXJyaWRlOiAibmF0cy48Z2F0ZXdheS1kb21haW4+Igpg" + - "YGAKClByZXZpZXcgYW5kIGluc3RhbGwgdGhlIGNvbnRyb2wgcGxhbmUgYWdhaW5zdCBpdHMgY29u" + - "dGV4dDoKCmBgYGJhc2gKbWFrZSAtQyBkZXBsb3kvc3RhY2tzL3NlbGYtbWFuYWdlZCB0ZW1wbGF0" + - "ZSBcCiAgSEVMTUZJTEVfRU5WPTxlbnY+IFwKICBLVUJFQ09ORklHX0ZJTEU9PGNvbnRyb2wtcGxh" + - "bmUta3ViZWNvbmZpZz4KCm1ha2UgLUMgZGVwbG95L3N0YWNrcy9zZWxmLW1hbmFnZWQgaW5zdGFs" + - "bCBcCiAgSEVMTUZJTEVfRU5WPTxlbnY+IFwKICBLVUJFQ09ORklHX0ZJTEU9PGNvbnRyb2wtcGxh" + - "bmUta3ViZWNvbmZpZz4KYGBgCgpCZWZvcmUgcmVnaXN0ZXJpbmcgdGhyb3VnaCBhIGJhcmUgR2F0" + - "ZXdheSBhZGRyZXNzLCBjcmVhdGUgb3IgdXBkYXRlIHRoZSBDTEkKY29uZmlnIHBhc3NlZCBhcyBg" + - "TlZDRl9DTElfQ09ORklHYDoKCmBgYHlhbWwKYmFzZV9odHRwX3VybDogImh0dHA6Ly88Z2F0ZXdh" + - "eS1hZGRyZXNzPiIKaW52b2tlX3VybDogImh0dHA6Ly88Z2F0ZXdheS1hZGRyZXNzPiIKYmFzZV9n" + - "cnBjX3VybDogIjxnYXRld2F5LWFkZHJlc3M+OjEwMDgxIgphcGlfa2V5c19zZXJ2aWNlX3VybDog" + - "Imh0dHA6Ly88Z2F0ZXdheS1hZGRyZXNzPiIKaWNtc191cmw6ICJodHRwOi8vPGdhdGV3YXktYWRk" + - "cmVzcz4iCmFwaV9ob3N0OiAiYXBpLjxnYXRld2F5LWRvbWFpbj4iCmFwaV9rZXlzX2hvc3Q6ICJh" + - "cGkta2V5cy48Z2F0ZXdheS1kb21haW4+IgppbnZva2VfaG9zdDogImludm9jYXRpb24uPGdhdGV3" + - "YXktZG9tYWluPiIKaWNtc19ob3N0OiAic2lzLjxnYXRld2F5LWRvbWFpbj4iCmBgYAoKSG9zdCBm" + - "aWVsZHMgY29udGFpbiBob3N0bmFtZXMgb25seSwgd2l0aG91dCBhIFVSTCBzY2hlbWUuIGBJQ01T" + - "X1VSTGAgbWFwcyBvbmx5CnRvIHRoZSByZWdpc3RyYXRpb24gY29tbWFuZCdzIGAtLWljbXMtdXJs" + - "YDsgYGljbXNfaG9zdGAgaW4gdGhlIGNvbmZpZyBzdXBwbGllcwp0aGUgR2F0ZXdheSBIb3N0IGhl" + - "YWRlci4gVGhlcmUgaXMgbm8gYC0taWNtcy1ob3N0YCBNYWtlIG9yIENMSSBmbGFnLgoKUmVnaXN0" + - "ZXIgZnJvbSB0aGUgY29tcHV0ZSBjb250ZXh0LCB0aGVuIGluc3RhbGwgdGhlIGNvbXB1dGUgcGxh" + - "bmU6CgpgYGBiYXNoCm1ha2UgLUMgZGVwbG95L3N0YWNrcy9udmNmLWNvbXB1dGUtcGxhbmUgcmVn" + - "aXN0ZXItY2x1c3RlciBcCiAgQ0xVU1RFUl9OQU1FPTxjbHVzdGVyLW5hbWU+IFwKICBOQ0FfSUQ9" + - "PG5jYS1pZD4gXAogIENMVVNURVJfUkVHSU9OPTxyZWdpb24+IFwKICBJQ01TX1VSTD1odHRwOi8v" + - "PGdhdGV3YXktYWRkcmVzcz4gXAogIEtVQkVDT05GSUdfRklMRT08Y29tcHV0ZS1wbGFuZS1rdWJl" + - "Y29uZmlnPiBcCiAgTlZDRl9DTEk9PHBhdGgtdG8tbnZjZi1jbGk+IFwKICBOVkNGX0NMSV9DT05G" + - "SUc9PHBhdGgtdG8tbnZjZi1jbGktY29uZmlnPgoKbWFrZSAtQyBkZXBsb3kvc3RhY2tzL252Y2Yt" + - "Y29tcHV0ZS1wbGFuZSBpbnN0YWxsIFwKICBDTFVTVEVSX05BTUU9PGNsdXN0ZXItbmFtZT4gXAog" + - "IEhFTE1GSUxFX0VOVj08ZW52PiBcCiAgS1VCRUNPTkZJR19GSUxFPTxjb21wdXRlLXBsYW5lLWt1" + - "YmVjb25maWc+CmBgYAoKUmVnaXN0cmF0aW9uIGRpc2NvdmVycyB0aGUgT0lEQyBpc3N1ZXIgYW5k" + - "IEpXS1MgZnJvbSB0aGUgY29tcHV0ZSBrdWJlIGNvbnRleHQuCkluIGEgbXVsdGktY2x1c3RlciBk" + - "ZXBsb3ltZW50LCBgS1VCRUNPTkZJR19GSUxFYCBpcyByZXF1aXJlZCBvbiBib3RoCmNvbXB1dGUt" + - "cGxhbmUgY29tbWFuZHMuIEluIGEgc2FtZS1jbHVzdGVyIGRlcGxveW1lbnQgaXQgbWF5IGJlIG9t" + - "aXR0ZWQgb25seQp3aGVuIHRoZSBhbWJpZW50IGNvbnRleHQgaXMgYWxyZWFkeSB0aGUgdGFyZ2V0" + - "IGNsdXN0ZXIuCgojIyBDTEkgUHJvZmlsZSBGbG93CgpSdW4gdGhlIENMSSBjb250cm9sLXBsYW5l" + - "IGluc3RhbGwgZmlyc3QuIEl0IGNyZWF0ZXMgdGhlIHByb2ZpbGUgY29uc3VtZWQgYnkKY29tcHV0" + - "ZS1wbGFuZSByZWdpc3RyYXRpb246CgpgYGBiYXNoCm52Y2YtY2xpIC0tY29uZmlnIDxjb25maWc+" + - "IHNlbGYtaG9zdGVkIFwKICAtLWNvbnRyb2wtcGxhbmUtc3RhY2sgZGVwbG95L3N0YWNrcy9zZWxm" + - "LW1hbmFnZWQgXAogIC0tY29tcHV0ZS1wbGFuZS1zdGFjayBkZXBsb3kvc3RhY2tzL252Y2YtY29t" + - "cHV0ZS1wbGFuZSBcCiAgLS1lbnYgPGVudj4gXAogIC0tcGxhaW4gXAogIC0tY29udHJvbC1wbGFu" + - "ZS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRleHQ+IFwKICAtLWNvbXB1dGUtcGxhbmUtY29u" + - "dGV4dCA8Y29tcHV0ZS1wbGFuZS1jb250ZXh0PiBcCiAgaW5zdGFsbCAtLWNvbnRyb2wtcGxhbmUg" + - "XAogIC0tY2x1c3Rlci1uYW1lIDxjb250cm9sLXBsYW5lLWNsdXN0ZXItbmFtZT4gXAogIC0tcmVn" + - "aW9uIDxyZWdpb24+IFwKICAtLW5jYS1pZCA8bmNhLWlkPgoKdGVzdCAtcyBkZXBsb3kvc3RhY2tz" + - "L3NlbGYtbWFuYWdlZC9vdXQvY29udHJvbC1wbGFuZS1wcm9maWxlLnlhbWwKYGBgCgpVc2UgdGhl" + - "IGZ1bGwgcGVyc2lzdGVudCBwcmVmaXggZm9yIGJvdGggY29tcHV0ZS1wbGFuZSBjb21tYW5kczoK" + - "CmBgYGJhc2gKbnZjZi1jbGkgLS1jb25maWcgPGNvbmZpZz4gc2VsZi1ob3N0ZWQgXAogIC0tY29u" + - "dHJvbC1wbGFuZS1zdGFjayBkZXBsb3kvc3RhY2tzL3NlbGYtbWFuYWdlZCBcCiAgLS1jb21wdXRl" + - "LXBsYW5lLXN0YWNrIGRlcGxveS9zdGFja3MvbnZjZi1jb21wdXRlLXBsYW5lIFwKICAtLWVudiA8" + - "ZW52PiBcCiAgLS1wbGFpbiBcCiAgY29tcHV0ZS1wbGFuZSByZWdpc3RlciBcCiAgLS1jb250cm9s" + - "LXBsYW5lLXByb2ZpbGUgZGVwbG95L3N0YWNrcy9zZWxmLW1hbmFnZWQvb3V0L2NvbnRyb2wtcGxh" + - "bmUtcHJvZmlsZS55YW1sIFwKICAtLWNsdXN0ZXItbmFtZSA8Y29tcHV0ZS1wbGFuZS1jbHVzdGVy" + - "LW5hbWU+IFwKICAtLWt1YmUtY29udGV4dCA8Y29tcHV0ZS1wbGFuZS1jb250ZXh0PiBcCiAgLS1y" + - "ZWdpb24gPHJlZ2lvbj4gXAogIC0tb3V0cHV0IGRlcGxveS9zdGFja3MvbnZjZi1jb21wdXRlLXBs" + - "YW5lL291dC88Y29tcHV0ZS1wbGFuZS1jbHVzdGVyLW5hbWU+LXJlZ2lzdGVyLXZhbHVlcy55YW1s" + - "CgpudmNmLWNsaSAtLWNvbmZpZyA8Y29uZmlnPiBzZWxmLWhvc3RlZCBcCiAgLS1jb250cm9sLXBs" + - "YW5lLXN0YWNrIGRlcGxveS9zdGFja3Mvc2VsZi1tYW5hZ2VkIFwKICAtLWNvbXB1dGUtcGxhbmUt" + - "c3RhY2sgZGVwbG95L3N0YWNrcy9udmNmLWNvbXB1dGUtcGxhbmUgXAogIC0tZW52IDxlbnY+IFwK" + - "ICAtLXBsYWluIFwKICBjb21wdXRlLXBsYW5lIGluc3RhbGwgXAogIC0tdmFsdWVzIGRlcGxveS9z" + - "dGFja3MvbnZjZi1jb21wdXRlLXBsYW5lL291dC88Y29tcHV0ZS1wbGFuZS1jbHVzdGVyLW5hbWU+" + - "LXJlZ2lzdGVyLXZhbHVlcy55YW1sIFwKICAtLWt1YmUtY29udGV4dCA8Y29tcHV0ZS1wbGFuZS1j" + - "b250ZXh0PiBcCiAgLS1jbHVzdGVyLW5hbWUgPGNvbXB1dGUtcGxhbmUtY2x1c3Rlci1uYW1lPgpg" + - "YGAKClJlZ2lzdHJhdGlvbiBzZWxlY3RzIHRoZSBwcm9maWxlJ3MgaW4tY2x1c3RlciBvciBjb21w" + - "dXRlLXJlYWNoYWJsZSBlbmRwb2ludHMKZnJvbSB0aGUgY29tcHV0ZSBjb250ZXh0IGFuZCBwcm9i" + - "ZXMgaXRzIEpXS1MuIERvIG5vdCByZXBsYWNlIHByb2ZpbGUgZW5kcG9pbnRzCndpdGggaGFuZC1h" + - "dXRob3JlZCBIZWxtZmlsZSBlbmRwb2ludCB2YWx1ZXMuCgojIyBQdWxsIFNlY3JldHMKCkNyZWF0" + - "ZSB0aGUgY29udHJvbC1wbGFuZSBzZWNyZXQgaW4gdGhlc2UgbmFtZXNwYWNlcyBvbiB0aGUgY29u" + - "dHJvbC1wbGFuZQpjb250ZXh0OgoKYGBgdGV4dApjYXNzYW5kcmEtc3lzdGVtIG5hdHMtc3lzdGVt" + - "IG52Y2YgYXBpLWtleXMgZXNzIHNpcyB2YXVsdC1zeXN0ZW0gY2VydC1tYW5hZ2VyCmBgYAoKT24g" + - "dGhlIGNvbXB1dGUgY29udGV4dCwgY3JlYXRlIHRoZSBzZWNyZXQgb25seSBpbiBgbnZjYS1vcGVy" + - "YXRvcmAgYW5kIHJlZmVyZW5jZQppdCB0aHJvdWdoIGBnbG9iYWwuaW1hZ2VQdWxsU2VjcmV0c2Ag" + - "aW4gdGhlIGNvbXB1dGUtcGxhbmUgZW52aXJvbm1lbnQuIFRoZSBjaGFydAphbmQgb3BlcmF0b3Ig" + - "dXNlIGl0IGluIGBudmNhLW9wZXJhdG9yYCBhbmQgbWlycm9yIGl0IHRvIGBudmNhLXN5c3RlbWAu" + - "IERvIG5vdCBhZGQKZWl0aGVyIG5hbWVzcGFjZSB0byB0aGUgY29udHJvbC1wbGFuZSBsaXN0LiBG" + - "b3IgY29tbWFuZHMgYW5kIHBvbGljeSBleGFtcGxlcywKc2VlIFtwdWxsLXNlY3JldHMubWRdKHB1" + - "bGwtc2VjcmV0cy5tZCkuCgojIyBWZXJpZmljYXRpb24KClVzZSB0aGUgZXhwbGljaXQgR2F0ZXdh" + - "eSBuYW1lIGFuZCBuYW1lc3BhY2U6CgpgYGBiYXNoCmt1YmVjdGwgLS1jb250ZXh0IDxjb250cm9s" + - "LXBsYW5lLWNvbnRleHQ+IGdldCBnYXRld2F5IG52Y2YtZ2F0ZXdheSBcCiAgLW4gZW52b3ktZ2F0" + - "ZXdheSAtbyB3aWRlCmt1YmVjdGwgLS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRleHQ+IGdl" + - "dCB0Y3Byb3V0ZSAtbiBlbnZveS1nYXRld2F5Cmt1YmVjdGwgLS1jb250ZXh0IDxjb21wdXRlLXBs" + - "YW5lLWNvbnRleHQ+IHJvbGxvdXQgc3RhdHVzIFwKICBkZXBsb3ltZW50L252Y2Etb3BlcmF0b3Ig" + - "LW4gbnZjYS1vcGVyYXRvciAtLXRpbWVvdXQ9MTBtCmt1YmVjdGwgLS1jb250ZXh0IDxjb21wdXRl" + - "LXBsYW5lLWNvbnRleHQ+IHdhaXQgXAogIG52Y2ZiYWNrZW5kLzxjb21wdXRlLXBsYW5lLWNsdXN0" + - "ZXItbmFtZT4gLW4gbnZjYS1vcGVyYXRvciBcCiAgLS1mb3I9anNvbnBhdGg9J3suc3RhdHVzLmFn" + - "ZW50U3RhdHVzfSc9aGVhbHRoeSAtLXRpbWVvdXQ9MTBtCmt1YmVjdGwgLS1jb250ZXh0IDxjb21w" + - "dXRlLXBsYW5lLWNvbnRleHQ+IGdldCBzZWNyZXQgPHB1bGwtc2VjcmV0PiAtbiBudmNhLXN5c3Rl" + - "bQpgYGAKCiMjIFRlYXJkb3duCgpEZXN0cm95IGFuZCBkZXJlZ2lzdGVyIGV2ZXJ5IGNvbXB1dGUg" + - "cGxhbmUgYmVmb3JlIHRoZSBjb250cm9sIHBsYW5lLiBCb3RoCmhhbmRvZmZzIGNhbiBkZXN0cm95" + - "IHRoZSBjb250cm9sIHBsYW5lLCBzbyBhcHBseSB0aGlzIHByZWZsaWdodCBiZWZvcmUgZWl0aGVy" + - "Cm9uZS4gUHJlc2VydmUgdGhlIGBjZXJ0LW1hbmFnZXJgIG5hbWVzcGFjZSBieSBkZWZhdWx0LiBO" + - "YW1lc3BhY2UgcHJlc2VydmF0aW9uCmRvZXMgbm90IHByZXNlcnZlIHRoZSBIZWxtIHJlbGVhc2Uu" + - "IElkZW50aWZ5IHdoZXRoZXIgY2VydC1tYW5hZ2VyIGlzIGV4dGVybmFsLgpGb3IgYW4gZXh0ZXJu" + - "YWwgaW5zdGFsbGF0aW9uLCByZXF1aXJlIGVmZmVjdGl2ZSBgY2VydE1hbmFnZXIuZW5hYmxlZDog" + - "ZmFsc2VgCmFuZCBhYm9ydCBpZiBpdCBpcyB0cnVlLiBGb3IgYW4gaW50ZW5kZWQgc3RhY2stbWFu" + - "YWdlZCByZWxlYXNlIHdpdGggZWZmZWN0aXZlCmBjZXJ0TWFuYWdlci5lbmFibGVkOiB0cnVlYCwg" + - "dmVyaWZ5IG1hdGNoaW5nIHN0YWNrIEhlbG0gcmVsZWFzZSBtZXRhZGF0YSBhbmQKYWJvcnQgb24g" + - "bWlzc2luZyBvciBtaXNtYXRjaGVkIGV2aWRlbmNlLiBPbmx5IHBsYW4gbmFtZXNwYWNlIHJlbW92" + - "YWwgYWZ0ZXIKdmVyaWZ5aW5nIG5hbWVzcGFjZSBwcm92ZW5hbmNlIGFuZCBnZXR0aW5nIGV4cGxp" + - "Y2l0IGNvbmZpcm1hdGlvbjsgb3RoZXJ3aXNlCmRvIG5vdCBkZWxldGUgaXQuCgpGb3IgdGhlIEhl" + - "bG1maWxlIHZhbHVlcyBmbG93LCByZXRhaW4gZWFjaCByZWdpc3RyYXRpb24gdmFsdWVzIGZpbGUg" + - "dW50aWwKY2xlYW51cCBpcyB2ZXJpZmllZDoKCmBgYGJhc2gKbWFrZSAtQyBkZXBsb3kvc3RhY2tz" + - "L252Y2YtY29tcHV0ZS1wbGFuZSBkZXN0cm95IFwKICBDTFVTVEVSX05BTUU9PGNsdXN0ZXItbmFt" + - "ZT4gXAogIEhFTE1GSUxFX0VOVj08ZW52PiBcCiAgS1VCRUNPTkZJR19GSUxFPTxjb21wdXRlLXBs" + - "YW5lLWt1YmVjb25maWc+Cgo8bnZjZi1jbGk+IC0tY29uZmlnIDxjb25maWc+IGNsdXN0ZXIgZGVs" + - "ZXRlIFwKICAtLWNsdXN0ZXItaWQgPGNsdXN0ZXItaWQtZnJvbS1yZWdpc3RyYXRpb24tdmFsdWVz" + - "PiBcCiAgLS1uY2EtaWQgPG5jYS1pZD4gXAogIC0taWdub3JlLW1pc3NpbmcKYGBgCgpSZWFkIGBj" + - "bHVzdGVySURgIGFuZCBgbmNhSURgIGZyb20KYGRlcGxveS9zdGFja3MvbnZjZi1jb21wdXRlLXBs" + - "YW5lL3JlZ2lzdHJhdGlvbi88Y2x1c3Rlci1uYW1lPi1yZWdpc3Rlci12YWx1ZXMueWFtbGAuClNo" + - "b3cgdGhlIGV4YWN0IGNsdXN0ZXIgSUQgYW5kIGdldCBjb25maXJtYXRpb24gYmVmb3JlIGBjbHVz" + - "dGVyIGRlbGV0ZWAuIFJlcGVhdApjb21wdXRlIGRlc3Ryb3kgYW5kIGRlcmVnaXN0cmF0aW9uIGZv" + - "ciBldmVyeSBjb21wdXRlIGNsdXN0ZXIsIHRoZW4gZGVzdHJveSB0aGUKY29udHJvbCBwbGFuZS4K" + - "CmBgYGJhc2gKS1VCRUNPTkZJRz08Y29udHJvbC1wbGFuZS1rdWJlY29uZmlnPiBcCm1ha2UgLUMg" + - "ZGVwbG95L3N0YWNrcy9zZWxmLW1hbmFnZWQgZGVzdHJveSBcCiAgSEVMTUZJTEVfRU5WPTxlbnY+" + - "IFwKICBLVUJFQ09ORklHX0ZJTEU9PGNvbnRyb2wtcGxhbmUta3ViZWNvbmZpZz4KYGBgCgpCb3Ro" + - "IGBLVUJFQ09ORklHYCBhbmQgYEtVQkVDT05GSUdfRklMRWAgYXJlIHJlcXVpcmVkIG9uIHRoZSBj" + - "b250cm9sLXBsYW5lCmRlc3Ryb3kgYmVjYXVzZSBpdHMgbmFtZXNwYWNlIGNsZWFudXAgdXNlcyBh" + - "bWJpZW50IGBrdWJlY3RsYC4KCkZvciB0aGUgQ0xJIHByb2ZpbGUgZmxvdywga2VlcApgZGVwbG95" + - "L3N0YWNrcy9udmNmLWNvbXB1dGUtcGxhbmUvb3V0LzxjbHVzdGVyLW5hbWU+LXJlZ2lzdGVyLXZh" + - "bHVlcy55YW1sYAp1bnRpbCB0ZWFyZG93biBjb21wbGV0ZXMgYmVjYXVzZSBgZG93bmAgcmVhZHMg" + - "aXRzIGNsdXN0ZXIgSUQuIEZpcnN0IHF1ZXJ5IHRoZQpsaXZlIHJlZ2lzdHJhdGlvbiBzZXQgd2l0" + - "aCB0aGUgc2FtZSBjb21wbGV0ZSBwZXJzaXN0ZW50IHByZWZpeDoKCmBgYGJhc2gKbnZjZi1jbGkg" + - "LS1jb25maWcgPGNvbmZpZz4gc2VsZi1ob3N0ZWQgXAogIC0tY29udHJvbC1wbGFuZS1zdGFjayBk" + - "ZXBsb3kvc3RhY2tzL3NlbGYtbWFuYWdlZCBcCiAgLS1jb21wdXRlLXBsYW5lLXN0YWNrIGRlcGxv" + - "eS9zdGFja3MvbnZjZi1jb21wdXRlLXBsYW5lIFwKICAtLWVudiA8ZW52PiBcCiAgLS1wbGFpbiBc" + - "CiAgLS1jb250cm9sLXBsYW5lLWNvbnRleHQgPGNvbnRyb2wtcGxhbmUtY29udGV4dD4gXAogIC0t" + - "Y29tcHV0ZS1wbGFuZS1jb250ZXh0IDxjb21wdXRlLXBsYW5lLWNvbnRleHQ+IFwKICAtLWljbXMt" + - "dXJsIDxjb21wdXRlLXJlYWNoYWJsZS1pY21zLXVybD4gXAogIHN0YXR1cyBcCiAgLS1jbHVzdGVy" + - "LW5hbWUgPGNvbXB1dGUtcGxhbmUtY2x1c3Rlci1uYW1lPiBcCiAgLS1uY2EtaWQgPG5jYS1pZD4K" + - "YGBgCgpTaG93IHRoZSByZWdpc3RlcmVkIGNvbXB1dGUtcGxhbmUgbGlzdC4gTmFtZWQtY2x1c3Rl" + - "ciBgZG93biAtLXBsYW4tb25seWAgZG9lcwpub3QgcXVlcnkgSUNNUywgc28gaXQgcHJldmlld3Mg" + - "b25seSB0aGF0IGNvbXB1dGUgcGxhbmUgYW5kIGNhbm5vdCBzaG93IHRoZQpjb25kaXRpb25hbCBj" + - "b250cm9sLXBsYW5lIHJlbW92YWwuIElmIHRoZSB0YXJnZXQgaXMgdGhlIGxhc3QgcmVnaXN0ZXJl" + - "ZApjbHVzdGVyLCByZWFsIGBkb3duYCBhbHNvIGRlc3Ryb3lzIHRoZSBjb250cm9sIHBsYW5lLiBH" + - "ZXQgZXhwbGljaXQgY29uZmlybWF0aW9uCmZvciBib3RoIHJlbW92YWxzIGJlZm9yZSBjb250aW51" + - "aW5nLiBUaGVuIHByZXZpZXcgYW5kIGV4ZWN1dGUgd2l0aCB0aGUgc2FtZQpwcmVmaXg6CgpgYGBi" + - "YXNoCm52Y2YtY2xpIC0tY29uZmlnIDxjb25maWc+IHNlbGYtaG9zdGVkIFwKICAtLWNvbnRyb2wt" + - "cGxhbmUtc3RhY2sgZGVwbG95L3N0YWNrcy9zZWxmLW1hbmFnZWQgXAogIC0tY29tcHV0ZS1wbGFu" + - "ZS1zdGFjayBkZXBsb3kvc3RhY2tzL252Y2YtY29tcHV0ZS1wbGFuZSBcCiAgLS1lbnYgPGVudj4g" + - "XAogIC0tcGxhaW4gXAogIC0tY29udHJvbC1wbGFuZS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNv" + - "bnRleHQ+IFwKICAtLWNvbXB1dGUtcGxhbmUtY29udGV4dCA8Y29tcHV0ZS1wbGFuZS1jb250ZXh0" + - "PiBcCiAgLS1pY21zLXVybCA8Y29tcHV0ZS1yZWFjaGFibGUtaWNtcy11cmw+IFwKICBkb3duIC0t" + - "cGxhbi1vbmx5IFwKICAtLWNsdXN0ZXItbmFtZSA8Y29tcHV0ZS1wbGFuZS1jbHVzdGVyLW5hbWU+" + - "IFwKICAtLW5jYS1pZCA8bmNhLWlkPgoKbnZjZi1jbGkgLS1jb25maWcgPGNvbmZpZz4gc2VsZi1o" + - "b3N0ZWQgXAogIC0tY29udHJvbC1wbGFuZS1zdGFjayBkZXBsb3kvc3RhY2tzL3NlbGYtbWFuYWdl" + - "ZCBcCiAgLS1jb21wdXRlLXBsYW5lLXN0YWNrIGRlcGxveS9zdGFja3MvbnZjZi1jb21wdXRlLXBs" + - "YW5lIFwKICAtLWVudiA8ZW52PiBcCiAgLS1wbGFpbiBcCiAgLS1jb250cm9sLXBsYW5lLWNvbnRl" + - "eHQgPGNvbnRyb2wtcGxhbmUtY29udGV4dD4gXAogIC0tY29tcHV0ZS1wbGFuZS1jb250ZXh0IDxj" + - "b21wdXRlLXBsYW5lLWNvbnRleHQ+IFwKICAtLWljbXMtdXJsIDxjb21wdXRlLXJlYWNoYWJsZS1p" + - "Y21zLXVybD4gXAogIGRvd24gXAogIC0tY2x1c3Rlci1uYW1lIDxjb21wdXRlLXBsYW5lLWNsdXN0" + - "ZXItbmFtZT4gXAogIC0tbmNhLWlkIDxuY2EtaWQ+CmBgYAoKUmVwZWF0IGBkb3duYCBmb3IgZWFj" + - "aCBjb21wdXRlIGNsdXN0ZXIuIEVhY2ggcnVuIGRlc3Ryb3lzIHRoYXQgY29tcHV0ZSBwbGFuZSBh" + - "bmQKdW5yZWdpc3RlcnMgaXRzIElDTVMgcm93LiBJdCByZW1vdmVzIHRoZSBjb250cm9sIHBsYW5l" + - "IG9ubHkgYWZ0ZXIgbm8gY2x1c3RlcgpyZWdpc3RyYXRpb25zIHJlbWFpbi4KUEsHCJZjvFkSMAAA" + - "EjAAAFBLAwQUAAgAAAAAACEAAAAAAAAAAAAAAAAAOwAJAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQt" + - "aW5zdGFsbGF0aW9uL3JlZmVyZW5jZXMvZGVidWdnaW5nLm1kVVQFAAEAps4SIyBEZWJ1Z2dpbmcg" + - "UmVmZXJlbmNlCgpSZWNpcGVzIGZvciBkaWFnbm9zaW5nIGFuZCBmaXhpbmcgY29tbW9uIE5WQ0Yg" + - "c2VsZi1tYW5hZ2VkIHN0YWNrIGZhaWx1cmVzLgoKIyMgUXVpY2sgU3RhdHVzIENvbW1hbmRzCgpg" + - "YGBiYXNoCiMgQWxsIHBvZHMgYWNyb3NzIGFsbCBuYW1lc3BhY2VzCmt1YmVjdGwgZ2V0IHBvZHMg" + - "LUEgLW8gd2lkZQoKIyBQb2RzIGluIGEgc3BlY2lmaWMgbmFtZXNwYWNlCmt1YmVjdGwgZ2V0IHBv" + - "ZHMgLW4gPG5hbWVzcGFjZT4KCiMgQWxsIGhlbG0gcmVsZWFzZXMKaGVsbSBsaXN0IC1BCgojIFJl" + - "Y2VudCBldmVudHMgKG1vc3QgdXNlZnVsIGZvciBkaWFnbm9zaW5nIGZhaWx1cmVzKQprdWJlY3Rs" + - "IGdldCBldmVudHMgLW4gPG5hbWVzcGFjZT4gLS1zb3J0LWJ5PScubGFzdFRpbWVzdGFtcCcKCiMg" + - "RGVzY3JpYmUgYSBzcGVjaWZpYyBwb2QgKHNob3dzIGV2ZW50cywgY29uZGl0aW9ucywgdm9sdW1l" + - "cykKa3ViZWN0bCBkZXNjcmliZSBwb2QgLW4gPG5hbWVzcGFjZT4gPHBvZC1uYW1lPgpgYGAKCiMj" + - "IEZhaWx1cmU6IEltYWdlUHVsbEJhY2tPZmYKCiMjIyBTeW1wdG9tcwoKYGBgdGV4dApOQU1FICAg" + - "ICAgICAgICBSRUFEWSAgIFNUQVRVUyAgICAgICAgICAgICBSRVNUQVJUUyAgIEFHRQpjYXNzYW5k" + - "cmEtMCAgICAwLzEgICAgIEltYWdlUHVsbEJhY2tPZmYgICAwICAgICAgICAgIDVtCmBgYAoKRXZl" + - "bnRzIHNob3c6CgpgYGB0ZXh0CkZhaWxlZCB0byBwdWxsIGltYWdlICJudmNyLmlvLy4uLi9pbWFn" + - "ZTp0YWciOiA0MDEgVW5hdXRob3JpemVkCmBgYAoKIyMjIERpYWdub3NpcwoKYGBgYmFzaAojIENo" + - "ZWNrIHdoYXQgaW1hZ2UgaXMgZmFpbGluZwprdWJlY3RsIGRlc2NyaWJlIHBvZCAtbiA8bmFtZXNw" + - "YWNlPiA8cG9kLW5hbWU+IHwgZ3JlcCAtQTUgIkV2ZW50czoiCgojIENoZWNrIGlmIHB1bGwgc2Vj" + - "cmV0IGV4aXN0cyBpbiB0aGUgbmFtZXNwYWNlCmt1YmVjdGwgZ2V0IHNlY3JldCBudmNyLWNyZWRz" + - "IC1uIDxuYW1lc3BhY2U+CgojIENoZWNrIGlmIHRoZSBwb2Qgc3BlYyBoYXMgaW1hZ2VQdWxsU2Vj" + - "cmV0cwprdWJlY3RsIGdldCBwb2QgLW4gPG5hbWVzcGFjZT4gPHBvZC1uYW1lPiAtbyBqc29ucGF0" + - "aD0ney5zcGVjLmltYWdlUHVsbFNlY3JldHN9JwoKIyBDaGVjayBpZiB0aGUgU2VydmljZUFjY291" + - "bnQgaGFzIGltYWdlUHVsbFNlY3JldHMKa3ViZWN0bCBnZXQgc2EgPHNhLW5hbWU+IC1uIDxuYW1l" + - "c3BhY2U+IC1vIGpzb25wYXRoPSd7LmltYWdlUHVsbFNlY3JldHN9JwpgYGAKCiMjIyBGaXhlcwoK" + - "MS4gKipTZWNyZXQgbWlzc2luZyBpbiBuYW1lc3BhY2UqKjogQ3JlYXRlIGl0CgogICBgYGBiYXNo" + - "CiAgIGt1YmVjdGwgY3JlYXRlIHNlY3JldCBkb2NrZXItcmVnaXN0cnkgbnZjci1jcmVkcyBcCiAg" + - "ICAgLS1kb2NrZXItc2VydmVyPW52Y3IuaW8gXAogICAgIC0tZG9ja2VyLXVzZXJuYW1lPSckb2F1" + - "dGh0b2tlbicgXAogICAgIC0tZG9ja2VyLXBhc3N3b3JkPSIkTkdDX0FQSV9LRVkiIFwKICAgICAt" + - "LW5hbWVzcGFjZT08bmFtZXNwYWNlPiBcCiAgICAgLS1kcnktcnVuPWNsaWVudCAtbyB5YW1sIHwg" + - "a3ViZWN0bCBhcHBseSAtZiAtCiAgIGBgYAoKMi4gKipTZWNyZXQgZXhpc3RzIGJ1dCBwb2QgZG9l" + - "c24ndCByZWZlcmVuY2UgaXQqKjogVGhlIGNoYXJ0IG5lZWRzIGBpbWFnZVB1bGxTZWNyZXRzYCBj" + - "b25maWd1cmVkIHZpYSBoZWxtZmlsZSB2YWx1ZXMuIFNlZSBbcHVsbC1zZWNyZXRzLm1kXShwdWxs" + - "LXNlY3JldHMubWQpLgoKMy4gKipDaGFydCBkb2Vzbid0IHN1cHBvcnQgaW1hZ2VQdWxsU2VjcmV0" + - "cyoqIChvcGVuYmFvLCBpbnZvY2F0aW9uLXNlcnZpY2UsIGVzcy1hcGksIG5vdGFyeS1zZXJ2aWNl" + - "KTogUGF0Y2ggU2VydmljZUFjY291bnRzIGFuZCByZXN0YXJ0IHBvZHMuIFNlZSBbcHVsbC1zZWNy" + - "ZXRzLm1kXShwdWxsLXNlY3JldHMubWQpLgoKNC4gKipXcm9uZyBjcmVkZW50aWFscyBpbiBzZWNy" + - "ZXQqKjogRGVsZXRlIGFuZCByZWNyZWF0ZQoKICAgYGBgYmFzaAogICBrdWJlY3RsIGRlbGV0ZSBz" + - "ZWNyZXQgbnZjci1jcmVkcyAtbiA8bmFtZXNwYWNlPgogICAjIFJlY3JlYXRlIHdpdGggY29ycmVj" + - "dCBjcmVkZW50aWFscwogICBgYGAKCiMjIEZhaWx1cmU6IEluaXQ6MC8xIFN0dWNrIChWYXVsdCBB" + - "Z2VudCkKCiMjIyBTeW1wdG9tcwoKU2VydmljZSBwb2RzIHN0dWNrIGluIGBJbml0OjAvMWAgZm9y" + - "IG1pbnV0ZXM6CgpgYGBiYXNoCk5BTUUgICAgICAgICAgICAgICAgICAgICAgICBSRUFEWSAgIFNU" + - "QVRVUyAgICAgUkVTVEFSVFMgICBBR0UKbnZjZi1hcGktN2Y0Yzc2Zjc4OC00NHZsdCAgMC8yICAg" + - "ICBJbml0OjAvMSAgIDAgICAgICAgICAgMTBtCmBgYAoKIyMjIERpYWdub3NpcwoKVGhlIGluaXQg" + - "Y29udGFpbmVyIGlzIHRoZSB2YXVsdC1hZ2VudC1pbml0IGluamVjdG9yIHdhaXRpbmcgZm9yIE9w" + - "ZW5CYW8uCgpgYGBiYXNoCiMgQ2hlY2sgT3BlbkJhbyBwb2RzCmt1YmVjdGwgZ2V0IHBvZHMgLW4g" + - "dmF1bHQtc3lzdGVtCgojIENoZWNrIGlmIE9wZW5CYW8gbWlncmF0aW9uIGpvYiByYW4Ka3ViZWN0" + - "bCBnZXQgam9icyAtbiB2YXVsdC1zeXN0ZW0KCiMgQ2hlY2sgT3BlbkJhbyBwb2QgbG9ncwprdWJl" + - "Y3RsIGxvZ3MgLW4gdmF1bHQtc3lzdGVtIG9wZW5iYW8tc2VydmVyLTAgLWMgb3BlbmJhbwoKIyBD" + - "aGVjayBpbml0IGNvbnRhaW5lciBsb2dzIG9uIHRoZSBzdHVjayBwb2QKa3ViZWN0bCBsb2dzIC1u" + - "IDxuYW1lc3BhY2U+IDxwb2QtbmFtZT4gLWMgdmF1bHQtYWdlbnQtaW5pdApgYGAKCiMjIyBGaXhl" + - "cwoKMS4gKipPcGVuQmFvIHBvZHMgbm90IHJ1bm5pbmcqKjogQ2hlY2sgdGhlaXIgZXZlbnRzIGZv" + - "ciBpbWFnZSBwdWxsIGlzc3VlcywgcmVzb3VyY2UgaXNzdWVzLCBldGMuCgoyLiAqKk9wZW5CYW8g" + - "bWlncmF0aW9uIGpvYiBkaWRuJ3QgcnVuKio6IFRoaXMgaGFwcGVucyB3aGVuIGBoZWxtZmlsZSBz" + - "eW5jYCB3YXMgaW50ZXJydXB0ZWQuIERlc3Ryb3kgYW5kIHJlLXN5bmMgb3BlbmJhbzoKCiAgIGBg" + - "YGJhc2gKICAgSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0b3IgbmFtZT1vcGVu" + - "YmFvLXNlcnZlciBkZXN0cm95CiAgIGt1YmVjdGwgZGVsZXRlIG5hbWVzcGFjZSB2YXVsdC1zeXN0" + - "ZW0KICAga3ViZWN0bCBjcmVhdGUgbmFtZXNwYWNlIHZhdWx0LXN5c3RlbQogICAjIFJlLWNyZWF0" + - "ZSBwdWxsIHNlY3JldCBpZiBuZWVkZWQKICAgSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0t" + - "c2VsZWN0b3IgbmFtZT1vcGVuYmFvLXNlcnZlciBzeW5jCiAgIGBgYAoKMy4gKipPcGVuQmFvIHBv" + - "ZHMgcnVubmluZyBidXQgbm90IGluaXRpYWxpemVkKio6IENoZWNrIHVuc2VhbCBzdGF0dXM6Cgog" + - "ICBgYGBiYXNoCiAgIGt1YmVjdGwgZXhlYyAtbiB2YXVsdC1zeXN0ZW0gb3BlbmJhby1zZXJ2ZXIt" + - "MCAtYyBvcGVuYmFvIC0tIGJhbyBzdGF0dXMKICAgYGBgCgo0LiAqKmB2YXVsdC1hZ2VudC1pbml0" + - "YCBsb2dzIGBhdXRoL2p3dC9sb2dpbmAgLT4gYDQwMCAuLi4gbm8ga25vd24ga2V5IHN1Y2Nlc3Nm" + - "dWxseSB2YWxpZGF0ZWQgdGhlIHRva2VuIHNpZ25hdHVyZWAqKgogICAoY29tbW9uIG9uIEFLUywg" + - "YW5kIG9uIGFueSBjbHVzdGVyIHdob3NlIE9JREMgaXNzdWVyIHB1Ymxpc2hlcyBhIHJvdGF0aW5n" + - "IG11bHRpLWtleSBKV0tTKToKICAgdGhlIE9wZW5CYW8gYGF1dGgvand0YCBtZXRob2Qgd2FzIGNv" + - "bmZpZ3VyZWQgd2l0aCBhIHNpbmdsZSBzdGF0aWMgbW91bnRlZCBwdWJsaWMga2V5CiAgIChgand0" + - "X3ZhbGlkYXRpb25fcHVia2V5c2ApIGluc3RlYWQgb2YgdGhlIGlzc3VlcidzIGxpdmUgSldLUywg" + - "c28gaXQgY2Fubm90IHZhbGlkYXRlIHRoZQogICBjbHVzdGVyLXNpZ25lZCBTZXJ2aWNlQWNjb3Vu" + - "dCB0b2tlbnMgdGhlIHZhdWx0LWFnZW50cyBwcmVzZW50LiBFdmVyeSBzZXJ2aWNlJ3MKICAgYHZh" + - "dWx0LWFnZW50LWluaXRgIHRoZW4gbG9vcHMgb24gdGhhdCA0MDAgYW5kIHRoZSBwb2QgbmV2ZXIg" + - "bGVhdmVzIGBJbml0OjAvMWAuIFRoaXMgaXMgdGhlCiAgIGJlaGF2aW9yIG9mIHRoZSBiYXNlIGRl" + - "ZmF1bHQgYG9wZW5iYW8ubWlncmF0aW9ucy5pc3N1ZXJEaXNjb3ZlcnkuZW5hYmxlZDogZmFsc2Vg" + - "OyB0aGUKICAgbWlncmF0aW9uIGxvZyBzaG93cyBgT0lEQyBpc3N1ZXIgZGlzY292ZXJ5IGlzIGRp" + - "c2FibGVkLiBVc2luZyBTZXJ2aWNlQWNjb3VudCBpc3N1ZXIgYW5kCiAgIG1vdW50ZWQgcHVibGlj" + - "IGtleSBmYWxsYmFja2AuIEVuYWJsZSBpc3N1ZXIgZGlzY292ZXJ5IHNvIHRoZSBtaWdyYXRpb24g" + - "dXNlcyB0aGUgbGl2ZSBKV0tTLAogICB0aGVuIHJlLXJ1biBpdDoKCiAgIGBgYGJhc2gKICAgIyBJ" + - "biB5b3VyIGVudiB2YWx1ZXMgKGUuZy4gZW52aXJvbm1lbnRzLzxlbnY+LnlhbWwpLCBzZXQ6CiAg" + - "ICMgICBvcGVuYmFvOgogICAjICAgICBtaWdyYXRpb25zOgogICAjICAgICAgIGlzc3VlckRpc2Nv" + - "dmVyeToKICAgIyAgICAgICAgIGVuYWJsZWQ6IHRydWUKICAga3ViZWN0bCBkZWxldGUgam9iIC1u" + - "IHZhdWx0LXN5c3RlbSBvcGVuYmFvLXNlcnZlci1taWdyYXRpb25zCiAgIEhFTE1GSUxFX0VOVj08" + - "ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9b3BlbmJhby1zZXJ2ZXIgc3luYwogICBgYGAK" + - "CiAgIFRoZSBtaWdyYXRpb24gbG9nIHNob3VsZCB0aGVuIHNob3cgYFJlY2VpdmVkIGRpc2NvdmVy" + - "eSBkb2N1bWVudCBmcm9tCiAgIC4uLi8ud2VsbC1rbm93bi9vcGVuaWQtY29uZmlndXJhdGlvbmAg" + - "YW5kIGBGaW5hbCBPcGVuQmFvIEpXVCBKV0tTIFVSTCBzZXQgdG86CiAgIC4uLi9vcGVuaWQvdjEv" + - "andrc2AsIGFuZCB0aGUgc2VydmljZSBwb2RzIGF1dGhlbnRpY2F0ZSBhbmQgcmVhY2ggUmVhZHkg" + - "d2l0aGluIH4xIG1pbi4KICAgQUtTIGNsdXN0ZXJzIHdpdGggdGhlIGNsdXN0ZXIgT0lEQyBpc3N1" + - "ZXIgZW5hYmxlZCAodGhlIGBha3MtY2x1c3RlcmAgZGVmYXVsdCkgYWx3YXlzIG5lZWQKICAgdGhp" + - "cyBiZWNhdXNlIHRoZSBzdGF0aWMtcHVia2V5IGZhbGxiYWNrIGNhbm5vdCBtYXRjaCB0aGUgaXNz" + - "dWVyJ3Mgcm90YXRpbmcgc2lnbmluZyBrZXlzLgoKIyMgRmFpbHVyZTogT09NS2lsbGVkIG9uIENh" + - "c3NhbmRyYQoKIyMjIFN5bXB0b21zCgpgYGB0ZXh0Ck5BTUUgICAgICAgICAgUkVBRFkgICBTVEFU" + - "VVMgICAgUkVTVEFSVFMgICBBR0UKY2Fzc2FuZHJhLTAgICAwLzEgICAgIE9PTUtpbGxlZCAgMyAg" + - "ICAgICAgIDEwbQpgYGAKCiMjIyBEaWFnbm9zaXMKCmBgYGJhc2gKa3ViZWN0bCBkZXNjcmliZSBw" + - "b2QgLW4gY2Fzc2FuZHJhLXN5c3RlbSBjYXNzYW5kcmEtMCB8IGdyZXAgLUEzICJMYXN0IFN0YXRl" + - "IgpgYGAKCiMjIyBGaXgKCk92ZXJyaWRlIENhc3NhbmRyYSByZXNvdXJjZXMgdmlhIGhlbG1maWxl" + - "IHZhbHVlcy4gU2VlIEV4YW1wbGUgMSBpbgpbZXhhbXBsZXMubWRdKC4uL2V4YW1wbGVzLm1kKS4K" + - "CmBgYHlhbWwKLSBjYXNzYW5kcmE6CiAgICByZXNvdXJjZXM6CiAgICAgIGxpbWl0czoKICAgICAg" + - "ICBjcHU6ICI4IgogICAgICAgIG1lbW9yeTogODE5Mk1pCiAgICAgIHJlcXVlc3RzOgogICAgICAg" + - "IGNwdTogIjIiCiAgICAgICAgbWVtb3J5OiA0MDk2TWkKYGBgCgpOb3RlOiBgcmVzb3VyY2VQcmVz" + - "ZXRgIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIE5WQ0YgY2Fzc2FuZHJhIHdyYXBwZXIgY2hhcnQu" + - "IFVzZSBleHBsaWNpdCBgcmVzb3VyY2VzYC4KCiMjIEZhaWx1cmU6IFBvZHMgU3R1Y2sgaW4gUGVu" + - "ZGluZwoKIyMjIFN5bXB0b21zCgpgYGB0ZXh0Ck5BTUUgICAgICAgICAgUkVBRFkgICBTVEFUVVMg" + - "ICAgUkVTVEFSVFMgICBBR0UKY2Fzc2FuZHJhLTAgICAwLzEgICAgIFBlbmRpbmcgICAwICAgICAg" + - "ICAgIDEwbQpgYGAKCiMjIyBEaWFnbm9zaXMKCmBgYGJhc2gKIyBDaGVjayBldmVudHMgZm9yIHNj" + - "aGVkdWxpbmcgZmFpbHVyZXMKa3ViZWN0bCBkZXNjcmliZSBwb2QgLW4gPG5hbWVzcGFjZT4gPHBv" + - "ZC1uYW1lPgoKIyBDb21tb24gY2F1c2VzOgojIC0gIjAvMTIgbm9kZXMgYXJlIGF2YWlsYWJsZTog" + - "MTIgbm9kZShzKSBkaWRuJ3QgbWF0Y2ggUG9kJ3Mgbm9kZSBhZmZpbml0eSIKIyAtICIwLzEyIG5v" + - "ZGVzIGFyZSBhdmFpbGFibGU6IDEyIEluc3VmZmljaWVudCBtZW1vcnkiCiMgLSAicGVyc2lzdGVu" + - "dHZvbHVtZWNsYWltIG5vdCBmb3VuZCIKYGBgCgojIyMgRml4ZXMKCjEuICoqTm9kZSBzZWxlY3Rv" + - "ciBtaXNtYXRjaCoqOiBDaGVjayBgbm9kZVNlbGVjdG9yc2AgaW4gZW52aXJvbm1lbnQgZmlsZQoK" + - "ICAgYGBgYmFzaAogICBrdWJlY3RsIGdldCBub2RlcyAtLXNob3ctbGFiZWxzIHwgZ3JlcCBudmNm" + - "CiAgIGBgYAoKMi4gKipTdG9yYWdlIGNsYXNzIG5vdCBmb3VuZCoqOiBDaGVjayBzdG9yYWdlIGNs" + - "YXNzIGV4aXN0cwoKICAgYGBgYmFzaAogICBrdWJlY3RsIGdldCBzdG9yYWdlY2xhc3MKICAgYGBg" + - "CgozLiAqKkluc3VmZmljaWVudCByZXNvdXJjZXMqKjogQ2hlY2sgbm9kZSBjYXBhY2l0eQoKICAg" + - "YGBgYmFzaAogICBrdWJlY3RsIGRlc2NyaWJlIG5vZGUgPG5vZGUtbmFtZT4gfCBncmVwIC1BNSAi" + - "QWxsb2NhdGVkIHJlc291cmNlcyIKICAgYGBgCgojIyBGYWlsdXJlOiBIZWxtIFJlbGVhc2UgaW4g" + - "RmFpbGVkIFN0YXRlCgojIyMgU3ltcHRvbXMKCmBgYGJhc2gKaGVsbSBsaXN0IC1BCiMgU2hvd3Mg" + - "cmVsZWFzZSB3aXRoIFNUQVRVUzogZmFpbGVkCmBgYAoKUmUtcnVubmluZyBgaGVsbWZpbGUgc3lu" + - "Y2AgYXBwZWFycyB0byBzdWNjZWVkIGJ1dCBzZXJ2aWNlcyBkb24ndCB3b3JrIChtaWdyYXRpb25z" + - "IHNraXBwZWQpLgoKIyMjIERpYWdub3NpcwoKYGBgYmFzaApoZWxtIGhpc3RvcnkgPHJlbGVhc2Ut" + - "bmFtZT4gLW4gPG5hbWVzcGFjZT4KYGBgCgojIyMgRml4CgpNdXN0IGRlc3Ryb3kgdGhlIGZhaWxl" + - "ZCByZWxlYXNlIGFuZCByZS1zeW5jIChub3QganVzdCBhcHBseSk6CgpgYGBiYXNoCkhFTE1GSUxF" + - "X0VOVj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9PHJlbGVhc2U+IGRlc3Ryb3kKIyBJ" + - "ZiBuYW1lc3BhY2UgbmVlZHMgY2xlYW51cDoKa3ViZWN0bCBkZWxldGUgbmFtZXNwYWNlIDxuYW1l" + - "c3BhY2U+Cmt1YmVjdGwgY3JlYXRlIG5hbWVzcGFjZSA8bmFtZXNwYWNlPgojIFJlLWNyZWF0ZSBw" + - "dWxsIHNlY3JldCBpZiBuZWVkZWQKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0" + - "b3IgbmFtZT08cmVsZWFzZT4gc3luYwpgYGAKCiMjIEZhaWx1cmU6IEFjY291bnQgQm9vdHN0cmFw" + - "IEpvYiBGYWlsZWQKCiMjIyBTeW1wdG9tcwoKU2VydmljZXMgZGVwbG95IGJ1dCBmdW5jdGlvbnMg" + - "Y2FuJ3QgYmUgY3JlYXRlZC4gRXZlbnRzIHNob3cgYm9vdHN0cmFwIGpvYiBmYWlsdXJlLgoKIyMj" + - "IERpYWdub3NpcwoKYGBgYmFzaAojIENoZWNrIGJvb3RzdHJhcCBqb2Igc3RhdHVzCmt1YmVjdGwg" + - "Z2V0IGpvYnMgLW4gbnZjZgoKIyBHZXQgbG9ncyAoam9iIGF1dG8tZGVsZXRlcyBhZnRlciB+NSBt" + - "aW51dGVzKQprdWJlY3RsIGxvZ3Mgam9iL252Y2YtYXBpLWFjY291bnQtYm9vdHN0cmFwIC1uIG52" + - "Y2YKCiMgQ2hlY2sgQVBJIGxvZ3MKa3ViZWN0bCBsb2dzIC1uIG52Y2YgLWwgYXBwLmt1YmVybmV0" + - "ZXMuaW8vbmFtZT1udmNmLWFwaSAtLXRhaWw9MTAwCmBgYAoKIyMjIENvbW1vbiBDYXVzZXMKCjEu" + - "ICoqV3JvbmcgYmFzZTY0IGNyZWRlbnRpYWxzKio6IENyZWRlbnRpYWxzIGluIGBzZWNyZXRzLzxl" + - "bnY+LXNlY3JldHMueWFtbGAgbXVzdCBiZSBgJG9hdXRodG9rZW46QVBJX0tFWWAgYmFzZTY0LWVu" + - "Y29kZWQsIG5vdCBqdXN0IHRoZSBBUEkga2V5CgogICBgYGBiYXNoCiAgICMgVmVyaWZ5IHlvdXIg" + - "ZW5jb2RlZCBjcmVkZW50aWFsCiAgIGVjaG8gJ1lPVVJfQkFTRTY0X1NUUklORycgfCBiYXNlNjQg" + - "LWQKICAgIyBTaG91bGQgb3V0cHV0OiAkb2F1dGh0b2tlbjpudmFwaS14eHh4eAogICBgYGAKCjIu" + - "ICoqUmVnaXN0cnkgdW5yZWFjaGFibGUqKjogQVBJIGNhbid0IHJlYWNoIHRoZSByZWdpc3RyeSBz" + - "cGVjaWZpZWQgaW4gYGFjY291bnRCb290c3RyYXAucmVnaXN0cnlDcmVkZW50aWFsc2AKCiMjIyBG" + - "aXgKCkZpeCBjcmVkZW50aWFscyBpbiBzZWNyZXRzIGZpbGUsIHRoZW4gcmVjb3ZlciBzZXJ2aWNl" + - "cyB3aXRob3V0IGRlc3Ryb3lpbmcgZGVwZW5kZW5jaWVzOgoKYGBgYmFzaApIRUxNRklMRV9FTlY9" + - "PGVudj4gaGVsbWZpbGUgLS1zZWxlY3RvciByZWxlYXNlLWdyb3VwPXNlcnZpY2VzIGRlc3Ryb3kK" + - "a3ViZWN0bCBkZWxldGUgbmFtZXNwYWNlIG52Y2YgYXBpLWtleXMgZXNzIHNpcyAtLWlnbm9yZS1u" + - "b3QtZm91bmQKa3ViZWN0bCBjcmVhdGUgbmFtZXNwYWNlIG52Y2YgJiYga3ViZWN0bCBjcmVhdGUg" + - "bmFtZXNwYWNlIGFwaS1rZXlzICYmIFwKICBrdWJlY3RsIGNyZWF0ZSBuYW1lc3BhY2UgZXNzICYm" + - "IGt1YmVjdGwgY3JlYXRlIG5hbWVzcGFjZSBzaXMKIyBSZS1jcmVhdGUgcHVsbCBzZWNyZXRzIGlm" + - "IG5lZWRlZApIRUxNRklMRV9FTlY9PGVudj4gaGVsbWZpbGUgLS1zZWxlY3RvciByZWxlYXNlLWdy" + - "b3VwPXNlcnZpY2VzIHN5bmMKYGBgCgojIyBGYWlsdXJlOiBOVkNBIENsZWFudXAgU3R1Y2sgKEZp" + - "bmFsaXplcnMpCgojIyMgU3ltcHRvbXMKCkNvbXB1dGUtcGxhbmUgY2xlYW51cCBoYW5ncy4gTmFt" + - "ZXNwYWNlcwpzdHVjayBpbiBgVGVybWluYXRpbmdgOgoKYGBgYmFzaAprdWJlY3RsIGdldCBucwoj" + - "IG52Y2Etb3BlcmF0b3IgICAgVGVybWluYXRpbmcgICAxMG0KIyBudmNmLWJhY2tlbmQgICAgIFRl" + - "cm1pbmF0aW5nICAgMTBtCmBgYAoKIyMjIEZpeAoKUnVuIHRoaXMgb25seSBhZ2FpbnN0IHRoZSBj" + - "b21wdXRlIGNvbnRleHQsIGFmdGVyIHRoZSBub3JtYWwgY29tcHV0ZS1wbGFuZQp0ZWFyZG93biBo" + - "YXMgZmFpbGVkLiBSZW1vdmUgZmluYWxpemVycyBmcm9tIE5WQ0ZCYWNrZW5kIGN1c3RvbSByZXNv" + - "dXJjZXMgYW5kCmZvcmNlLWRlbGV0ZSBzdHVjayBuYW1lc3BhY2VzOgoKYGBgYmFzaApleHBvcnQg" + - "Q09NUFVURV9DT05URVhUPTxjb21wdXRlLXBsYW5lLWNvbnRleHQ+CgojIFJlbW92ZSBmaW5hbGl6" + - "ZXJzIGZyb20gTlZDRkJhY2tlbmQgcmVzb3VyY2VzCmt1YmVjdGwgLS1jb250ZXh0ICIkQ09NUFVU" + - "RV9DT05URVhUIiBnZXQgbnZjZmJhY2tlbmRzIC1BIC1vIGpzb24gfCBcCiAganEgJy5pdGVtc1td" + - "IHwgLm1ldGFkYXRhLm5hbWVzcGFjZSArICIvIiArIC5tZXRhZGF0YS5uYW1lJyAtciB8IFwKICB4" + - "YXJncyAtSXt9IHNoIC1jICdjb250ZXh0PSIkMSI7IG5zPSIkezIlJS8qfSI7IG5hbWU9IiR7MiMj" + - "Ki99Ijsga3ViZWN0bCAtLWNvbnRleHQgIiRjb250ZXh0IiBwYXRjaCBudmNmYmFja2VuZCAiJG5h" + - "bWUiIC1uICIkbnMiIC0tdHlwZT1tZXJnZSAtcCAie1wibWV0YWRhdGFcIjp7XCJmaW5hbGl6ZXJz" + - "XCI6W119fSInIF8gIiRDT01QVVRFX0NPTlRFWFQiIHt9CgojIEZvcmNlLWRlbGV0ZSBzdHVjayBu" + - "YW1lc3BhY2VzIGJ5IGNsZWFyaW5nIHRoZWlyIGZpbmFsaXplcnMKZm9yIG5zIGluIG52Y2Etb3Bl" + - "cmF0b3IgbnZjZi1iYWNrZW5kOyBkbwogIGt1YmVjdGwgLS1jb250ZXh0ICIkQ09NUFVURV9DT05U" + - "RVhUIiBnZXQgbmFtZXNwYWNlICIkbnMiIC1vIGpzb24gMj4vZGV2L251bGwgfCBcCiAgICBqcSAn" + - "LnNwZWMuZmluYWxpemVycyA9IFtdJyB8IFwKICAgIGt1YmVjdGwgLS1jb250ZXh0ICIkQ09NUFVU" + - "RV9DT05URVhUIiByZXBsYWNlIFwKICAgICAgLS1yYXcgIi9hcGkvdjEvbmFtZXNwYWNlcy8kbnMv" + - "ZmluYWxpemUiIC1mIC0gMj4vZGV2L251bGwKZG9uZQpgYGAKCiMjIEZhaWx1cmU6IE5WQ0EgT3Bl" + - "cmF0b3IgTWlzc2luZyBvciBOb3QgUmVhZHkKCiMjIyBTeW1wdG9tcwoKQWZ0ZXIgY29tcHV0ZS1w" + - "bGFuZSBpbnN0YWxsIGNvbXBsZXRlcywgbm8gYG52Y2Etb3BlcmF0b3JgIERlcGxveW1lbnQgZXhp" + - "c3RzLCBvcgppdCBleGlzdHMgYnV0IHBvZHMgYXJlIG5vdCByZWFkeToKCmBgYGJhc2gKa3ViZWN0" + - "bCAtLWNvbnRleHQgPGNvbXB1dGUtcGxhbmUtY29udGV4dD4gZ2V0IGRlcGxveW1lbnQgbnZjYS1v" + - "cGVyYXRvciBcCiAgLW4gbnZjYS1vcGVyYXRvcgprdWJlY3RsIC0tY29udGV4dCA8Y29tcHV0ZS1w" + - "bGFuZS1jb250ZXh0PiBnZXQgcG9kcyAtbiBudmNhLW9wZXJhdG9yCmBgYAoKIyMjIERpYWdub3Np" + - "cyBhbmQgRml4ZXMKCkZpcnN0IGlkZW50aWZ5IHdoZXRoZXIgdGhlIGluc3RhbGxhdGlvbiB1c2Vk" + - "IHRoZSBIZWxtZmlsZSB2YWx1ZXMgZmxvdyBvciB0aGUKQ0xJIHByb2ZpbGUgZmxvdy4gUmUtcnVu" + - "IG9ubHkgdGhhdCBmbG93J3MgcmVnaXN0cmF0aW9uIGFuZCBpbnN0YWxsYXRpb24gc3RlcHMKZnJv" + - "bSBbU3BsaXQgQ29tcHV0ZS1QbGFuZSBJbnN0YWxsYXRpb25dKGNvbXB1dGUtcGxhbmUtaW5zdGFs" + - "bGF0aW9uLm1kKS4gRG8gbm90CnN1YnN0aXR1dGUgb25lIGhhbmRvZmYgZm9yIHRoZSBvdGhlci4K" + - "CklmIGluc3RhbGxhdGlvbiBzdWNjZWVkcyBidXQgcG9kcyBzdGlsbCBmYWlsLCBpbnNwZWN0IHRo" + - "ZSBjb21wdXRlIGNvbnRleHQ6CgpgYGBiYXNoCmt1YmVjdGwgLS1jb250ZXh0IDxjb21wdXRlLXBs" + - "YW5lLWNvbnRleHQ+IGRlc2NyaWJlIGRlcGxveSBudmNhLW9wZXJhdG9yIFwKICAtbiBudmNhLW9w" + - "ZXJhdG9yCmt1YmVjdGwgLS1jb250ZXh0IDxjb21wdXRlLXBsYW5lLWNvbnRleHQ+IGxvZ3MgZGVw" + - "bG95bWVudC9udmNhLW9wZXJhdG9yIFwKICAtbiBudmNhLW9wZXJhdG9yIC0tdGFpbD0yMDAKa3Vi" + - "ZWN0bCAtLWNvbnRleHQgPGNvbXB1dGUtcGxhbmUtY29udGV4dD4gZ2V0IG52Y2ZiYWNrZW5kIC1u" + - "IG52Y2Etb3BlcmF0b3IKYGBgCgpGb3IgcHJpdmF0ZSByZWdpc3RyeSBmYWlsdXJlcywgdmVyaWZ5" + - "IHRoYXQgdGhlIHB1bGwgc2VjcmV0IGV4aXN0cyBpbgpgbnZjYS1vcGVyYXRvcmAuIFRoZSBjaGFy" + - "dCBhbmQgb3BlcmF0b3IgbWlycm9yIGl0IHRvIGBudmNhLXN5c3RlbWA7IGRvIG5vdCB1c2UgYQpi" + - "cm9hZGVyIG1hbnVhbCBuYW1lc3BhY2UgbG9vcC4gU2VlCltwdWxsLXNlY3JldHMubWRdKHB1bGwt" + - "c2VjcmV0cy5tZCNjb21wdXRlLXBsYW5lLXNlY3JldCkuCgojIyBGYWlsdXJlOiBHYXRld2F5IEVu" + - "ZHBvaW50IENoYW5nZWQKCiMjIyBTeW1wdG9tcwoKUmVxdWVzdHMgdGhyb3VnaCB0aGUgY29uZmln" + - "dXJlZCByb3V0ZSBkb21haW4gZmFpbCBhZnRlciB0aGUgR2F0ZXdheSBvciBpdHMgbG9hZCBiYWxh" + - "bmNlciBpcyByZXBsYWNlZC4gVGhlIEdhdGV3YXkgcmVwb3J0cyBhIG5ldyBlbmRwb2ludC4KCiMj" + - "IyBEaWFnbm9zaXMKCmBgYGJhc2gKR0FURVdBWV9BRERSPSQoa3ViZWN0bCAtLWNvbnRleHQgPGNv" + - "bnRyb2wtcGxhbmUtY29udGV4dD4gZ2V0IGdhdGV3YXkgXAogIG52Y2YtZ2F0ZXdheSAtbiBlbnZv" + - "eS1nYXRld2F5IFwKICAtbyBqc29ucGF0aD0ney5zdGF0dXMuYWRkcmVzc2VzWzBdLnZhbHVlfScp" + - "CnRlc3QgLW4gIiRHQVRFV0FZX0FERFIiCmRpZyArc2hvcnQgImFwaS48ZG9tYWluPiIKY3VybCAt" + - "SCAiSG9zdDogYXBpLjxkb21haW4+IiAiaHR0cDovLyRHQVRFV0FZX0FERFIvaGVhbHRoIgoKIyBD" + - "aGVjayBkaXJlY3QgYWRkcmVzcyBmaWVsZHMgdXNlZCBieSBhIHNwbGl0IGRlcGxveW1lbnQKZ3Jl" + - "cCBudmNmTmF0c1NlcnZpY2VVUkwgZGVwbG95L3N0YWNrcy9zZWxmLW1hbmFnZWQvZW52aXJvbm1l" + - "bnRzLzxlbnY+LnlhbWwKZ3JlcCAtRSAnaWNtc1NlcnZpY2V8cmV2YWxTZXJ2aWNlfG5hdHMnIFwK" + - "ICBkZXBsb3kvc3RhY2tzL252Y2YtY29tcHV0ZS1wbGFuZS9lbnZpcm9ubWVudHMvPGVudj4ueWFt" + - "bApgYGAKCiMjIyBGaXgKCktlZXAgYGdsb2JhbC5kb21haW5gLCByb3V0ZSBob3N0bmFtZXMsIGFu" + - "ZCBIb3N0IG92ZXJyaWRlcyB1bmNoYW5nZWQuIFVwZGF0ZSBETlMKb3IgdGhlIGRpcmVjdCBjbGll" + - "bnQgZGVzdGluYXRpb24uIEZvciBzcGxpdCBkZXBsb3ltZW50cywgdXBkYXRlIG9ubHkgZGlyZWN0" + - "CkdhdGV3YXktYWRkcmVzcyBmaWVsZHMgYW5kIHJlZnJlc2ggcmVnaXN0cmF0aW9uIGFuZCBpbnN0" + - "YWxsYXRpb24gdGhyb3VnaCB0aGUKc2FtZSBzZWxlY3RlZCBoYW5kb2ZmLiBTZWUKW0V4YW1wbGUg" + - "NF0oLi4vZXhhbXBsZXMubWQjZXhhbXBsZS00LXJlY292ZXItZnJvbS1hLWdhdGV3YXktZW5kcG9p" + - "bnQtY2hhbmdlKS4KCiMjIFVzZWZ1bCBOYW1lc3BhY2UtdG8tU2VydmljZSBNYXBwaW5nCgpRdWlj" + - "ayByZWZlcmVuY2UgZm9yIHdoaWNoIHNlcnZpY2VzIHJ1biBpbiB3aGljaCBuYW1lc3BhY2U6Cgp8" + - "IE5hbWVzcGFjZSB8IFNlcnZpY2VzIHwKfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18CnwgbmF0cy1z" + - "eXN0ZW0gfCBuYXRzIHwKfCBjYXNzYW5kcmEtc3lzdGVtIHwgY2Fzc2FuZHJhIHwKfCB2YXVsdC1z" + - "eXN0ZW0gfCBvcGVuYmFvLXNlcnZlciB8CnwgbnZjZiB8IGFwaSwgaW52b2NhdGlvbi1zZXJ2aWNl" + - "LCBncnBjLXByb3h5LCBub3Rhcnktc2VydmljZSwgcmV2YWwsIGxsbS1yZXF1ZXN0LXJvdXRlciwg" + - "bGxtLWFwaS1nYXRld2F5IHwKfCBhcGkta2V5cyB8IGFwaS1rZXlzLCBhZG1pbi1pc3N1ZXItcHJv" + - "eHkgfAp8IGVzcyB8IGVzcy1hcGkgfAp8IHNpcyB8IHNpcyB8CnwgZW52b3ktZ2F0ZXdheS1zeXN0" + - "ZW0gfCBlbnZveSBnYXRld2F5IChpbmdyZXNzIGNvbnRyb2xsZXIpIHwKfCBlbnZveS1nYXRld2F5" + - "IHwgZ2F0ZXdheSByZXNvdXJjZSArIHJvdXRlcyB8ClBLBwi1enA7tTAAALUwAABQSwMEFAAIAAAA" + - "AAAhAAAAAAAAAAAAAAAAAEQACQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbi9y" + - "ZWZlcmVuY2VzL2hlbG1maWxlLXN0cnVjdHVyZS5tZFVUBQABAKbOEiMgSGVsbWZpbGUgU3RydWN0" + - "dXJlIFJlZmVyZW5jZQoKIyMgRGlyZWN0b3J5IExheW91dAoKYGBgYmFzaApudmNmLXNlbGYtbWFu" + - "YWdlZC1zdGFjay8KfC0tIGhlbG1maWxlLmQvCnwgICB8LS0gMDEtZGVwZW5kZW5jaWVzLnlhbWwu" + - "Z290bXBsICAjIE5BVFMsIENhc3NhbmRyYSwgT3BlbkJhbwp8ICAgfC0tIDAyLWNvcmUueWFtbC5n" + - "b3RtcGwgICAgICAgICAgIyBOVkNGIHNlcnZpY2VzICsgaW5ncmVzcwp8ICAgYC0tIDAzLW9ic2Vy" + - "dmFiaWxpdHkueWFtbC5nb3RtcGwgIyBPYnNlcnZhYmlsaXR5IHN0YWNrIChvcHRpb25hbCkKfC0t" + - "IGVudmlyb25tZW50cy8KfCAgIHwtLSBiYXNlLnlhbWwgICAgICAgICAgICAgICAgICAgICMgRGVm" + - "YXVsdCB2YWx1ZXMgKGFsbCBlbnZpcm9ubWVudHMpCnwgICBgLS0gPGVudi1uYW1lPi55YW1sICAg" + - "ICAgICAgICAgICAjIFBlci1lbnZpcm9ubWVudCBvdmVycmlkZXMKfC0tIHNlY3JldHMvCnwgICBg" + - "LS0gPGVudi1uYW1lPi1zZWNyZXRzLnlhbWwgICAgICAjIFNlbnNpdGl2ZSB2YWx1ZXMgKHJlZ2lz" + - "dHJ5IGNyZWRzLCBwYXNzd29yZHMpCmAtLSBnbG9iYWwueWFtbC5nb3RtcGwgICAgICAgICAgICAg" + - "ICAjIEdvIHRlbXBsYXRlIHRoYXQgY29uc3RydWN0cyBwZXItY2hhcnQgdmFsdWVzCgpudmNmLWNv" + - "bXB1dGUtcGxhbmUtc3RhY2svCnwtLSBoZWxtZmlsZS5kLwp8ICAgfC0tIDAxLWRlcGVuZGVuY2ll" + - "cy55YW1sLmdvdG1wbCAgIyBDb21wdXRlIHBsYW5lIGRlcGVuZGVuY3kgY29tcG9uZW50cwp8ICAg" + - "YC0tIDAyLW52Y2EueWFtbC5nb3RtcGwgICAgICAgICAgIyBudmNhLW9wZXJhdG9yIGNoYXJ0IGFu" + - "ZCBudmNhIGNvbmZpZ3VyYXRpb24KfC0tIGVudmlyb25tZW50cy8KfCAgIHwtLSBiYXNlLnlhbWwg" + - "ICAgICAgICAgICAgICAgICAgICMgRGVmYXVsdCB2YWx1ZXMgKGFsbCBlbnZpcm9ubWVudHMpCnwg" + - "ICBgLS0gPGVudi1uYW1lPi55YW1sICAgICAgICAgICAgICAjIFBlci1lbnZpcm9ubWVudCBvdmVy" + - "cmlkZXMKYC0tIGdsb2JhbC55YW1sLmdvdG1wbCAgICAgICAgICAgICAgICMgR28gdGVtcGxhdGUg" + - "dGhhdCBjb25zdHJ1Y3RzIHBlci1jaGFydCB2YWx1ZXMKYGBgCgpUaGVzZSBzdGFja3MgaGF2ZSBz" + - "ZXBhcmF0ZSBlbnZpcm9ubWVudHMgYW5kIGNsdXN0ZXIgY29udGV4dHMuIFRoZSBIZWxtZmlsZQp2" + - "YWx1ZXMgZmxvdyBhdXRob3JzIGJvdGggZW52aXJvbm1lbnQgZmlsZXMuIFRoZSBDTEkgcHJvZmls" + - "ZSBmbG93IGluc3RlYWQgdXNlcwp0aGUgQ0xJLWdlbmVyYXRlZCBjb250cm9sLXBsYW5lIHByb2Zp" + - "bGUgYXMgaXRzIGVuZHBvaW50IHNvdXJjZS4gRG8gbm90IG1peCB0aGUKaGFuZG9mZnMuIFNlZSBb" + - "U3BsaXQgQ29tcHV0ZS1QbGFuZSBJbnN0YWxsYXRpb25dKGNvbXB1dGUtcGxhbmUtaW5zdGFsbGF0" + - "aW9uLm1kKS4KCiMjIEdvdG1wbCBGaWxlcyBhbmQgVGhlaXIgUmVsZWFzZXMKCiMjIyAwMS1kZXBl" + - "bmRlbmNpZXMueWFtbC5nb3RtcGwKCnwgUmVsZWFzZSB8IENoYXJ0IHwgTmFtZXNwYWNlIHwgTm90" + - "ZXMgfAp8LS0tLS0tLS0tfC0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLXwKfCBuYXRzIHwgaGVs" + - "bS1udmNmLW5hdHMgfCBuYXRzLXN5c3RlbSB8IE1lc3NhZ2luZyB8Cnwgb3BlbmJhby1zZXJ2ZXIg" + - "fCBoZWxtLW52Y2Ytb3BlbmJhby1zZXJ2ZXIgfCB2YXVsdC1zeXN0ZW0gfCBTZWNyZXRzIG1hbmFn" + - "ZW1lbnQsIGRlcGVuZHMgb24gbmF0cyB8CnwgY2Fzc2FuZHJhIHwgaGVsbS1udmNmLWNhc3NhbmRy" + - "YSB8IGNhc3NhbmRyYS1zeXN0ZW0gfCBEYXRhYmFzZSB8CgpVc2VzIGA8PDogKmRlcGVuZGVuY3lg" + - "IHRlbXBsYXRlIGluaGVyaXRhbmNlIHdpdGggYHJlbGVhc2UtZ3JvdXA6IGRlcGVuZGVuY2llc2Ag" + - "bGFiZWwuCgojIyMgMDItY29yZS55YW1sLmdvdG1wbAoKfCBSZWxlYXNlIHwgQ2hhcnQgfCBOYW1l" + - "c3BhY2UgfCBMYWJlbCB8CnwtLS0tLS0tLS18LS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tfAp8" + - "IGFwaS1rZXlzIHwgaGVsbS1udmNmLWFwaS1rZXlzIHwgYXBpLWtleXMgfCBzZXJ2aWNlcyB8Cnwg" + - "c2lzIHwgaGVsbS1udmNmLXNpcyB8IHNpcyB8IHNlcnZpY2VzIHwKfCBhcGkgfCBoZWxtLW52Y2Yt" + - "YXBpIHwgbnZjZiB8IHNlcnZpY2VzIHwKfCBpbnZvY2F0aW9uLXNlcnZpY2UgfCBoZWxtLW52Y2Yt" + - "aW52b2NhdGlvbi1zZXJ2aWNlIHwgbnZjZiB8IHNlcnZpY2VzIHwKfCBncnBjLXByb3h5IHwgaGVs" + - "bS1udmNmLWdycGMtcHJveHkgfCBudmNmIHwgc2VydmljZXMgfAp8IGVzcy1hcGkgfCBoZWxtLW52" + - "Y2YtZXNzLWFwaSB8IGVzcyB8IHNlcnZpY2VzIHwKfCBub3Rhcnktc2VydmljZSB8IGhlbG0tbnZj" + - "Zi1ub3Rhcnktc2VydmljZSB8IG52Y2YgfCBzZXJ2aWNlcyB8CnwgcmV2YWwgfCBoZWxtLXJldmFs" + - "IHwgbnZjZiB8IHNlcnZpY2VzIHwKfCBsbG0tcmVxdWVzdC1yb3V0ZXIgfCBudmNmL2hlbG0tbnZj" + - "Zi1sbG0tcmVxdWVzdC1yb3V0ZXIgfCBudmNmIHwgc2VydmljZXMgfAp8IGxsbS1hcGktZ2F0ZXdh" + - "eSB8IG52Y2YvaGVsbS1udmNmLWxsbS1hcGktZ2F0ZXdheSB8IG52Y2YgfCBzZXJ2aWNlcyB8Cnwg" + - "YWRtaW4taXNzdWVyLXByb3h5IHwgaGVsbS1hZG1pbi10b2tlbi1pc3N1ZXItcHJveHkgfCBhcGkt" + - "a2V5cyB8IChubyByZWxlYXNlLWdyb3VwIGxhYmVsKSB8CnwgaW5ncmVzcyB8IG52Y2YtZ2F0ZXdh" + - "eS1yb3V0ZXMgfCBlbnZveS1nYXRld2F5LXN5c3RlbSB8IGluZ3Jlc3MgfAoKTW9zdCBzZXJ2aWNl" + - "cyB1c2UgYGluaGVyaXQ6IFt7dGVtcGxhdGU6IHNlcnZpY2V9XWAuIExMTSByZWxlYXNlcyB1c2Ug" + - "T0NJIGNoYXJ0cyBmcm9tIHRoZSBgbnZjZmAgcmVwb3NpdG9yeSB3aXRoIHN0YW5kYWxvbmUgYHZh" + - "bHVlczogWy4uL2dsb2JhbC55YW1sLmdvdG1wbF1gIGJsb2NrczsgdGhleSBhcmUgZ2F0ZWQgb24g" + - "YGFkZG9ucy5sbG0uZW5hYmxlZGAuIGBhZG1pbi1pc3N1ZXItcHJveHlgIGFuZCBgaW5ncmVzc2Ag" + - "aGF2ZSBzdGFuZGFsb25lIGB2YWx1ZXM6YCBibG9ja3MuCgojIyMgMDMtb2JzZXJ2YWJpbGl0eS55" + - "YW1sLmdvdG1wbAoKfCBSZWxlYXNlIHwgQ2hhcnQgfCBOYW1lc3BhY2UgfCBMYWJlbCB8CnwtLS0t" + - "LS0tLS18LS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tfAp8IChvYnNlcnZhYmlsaXR5IHJlbGVh" + - "c2VzKSB8ICh2YXJpb3VzKSB8IG9ic2VydmFiaWxpdHkgfCBvYnNlcnZhYmlsaXR5IHwKCkdhdGVk" + - "IG9uIG9ic2VydmFiaWxpdHktc3BlY2lmaWMgZmxhZ3MgaW4gdGhlIGVudmlyb25tZW50IGZpbGUu" + - "IFNraXBwZWQgaWYgZGlzYWJsZWQuCgojIyBUZW1wbGF0ZSBJbmhlcml0YW5jZQoKIyMjIGA8PDog" + - "KmRlcGVuZGVuY3lgIChZQU1MIG1lcmdlKQoKVXNlZCBpbiBgMDEtZGVwZW5kZW5jaWVzLnlhbWwu" + - "Z290bXBsYC4gTWVyZ2VzIHRoZSB0ZW1wbGF0ZSdzIHByb3BlcnRpZXMgaW50byB0aGUgcmVsZWFz" + - "ZS4KCioqR290Y2hhKio6IFlBTUwgbWVyZ2UgcmVwbGFjZXMgbGlzdHMuIElmIHlvdSBhZGQgYSBg" + - "dmFsdWVzOmAga2V5IHRvIHRoZSByZWxlYXNlLCBpdCAqKnJlcGxhY2VzKiogdGhlIHRlbXBsYXRl" + - "J3MgYHZhbHVlczpgIGxpc3QgZW50aXJlbHkuIFlvdSBtdXN0IHJlLWluY2x1ZGUgYWxsIHRlbXBs" + - "YXRlIHZhbHVlczoKCkluIHRoZSB0ZW1wbGF0ZSBiZWxvdywgYDxwcml2YXRlLXZhbHVlcz5gIHJl" + - "ZmVycyB0byB0aGUgYHNlY3JldHMvYCBkaXJlY3RvcnkgYXQgdGhlIGhlbG1maWxlIHN0YWNrIHJv" + - "b3QuCgpgYGB5YW1sCiMgVGVtcGxhdGUgZGVmaW5lczoKdGVtcGxhdGVzOgogIGRlcGVuZGVuY3k6" + - "ICZkZXBlbmRlbmN5CiAgICBjaGFydDogbnZjZi9oZWxtLW52Y2Yte3sgLlJlbGVhc2UuTmFtZSB9" + - "fQogICAgdmFsdWVzOgogICAgICAtIC4uL2dsb2JhbC55YW1sLmdvdG1wbAogICAgICAtIC4uLzxw" + - "cml2YXRlLXZhbHVlcz4ve3sgcmVxdWlyZWRFbnYgIkhFTE1GSUxFX0VOViIgfX0tc2VjcmV0cy55" + - "YW1sCgojIFdoZW4gb3ZlcnJpZGluZywgTVVTVCByZS1pbmNsdWRlIGJvdGg6Ci0gbmFtZTogY2Fz" + - "c2FuZHJhCiAgPDw6ICpkZXBlbmRlbmN5CiAgdmFsdWVzOgogICAgLSAuLi9nbG9iYWwueWFtbC5n" + - "b3RtcGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBNdXN0" + - "IHJlLWluY2x1ZGUKICAgIC0gLi4vPHByaXZhdGUtdmFsdWVzPi97eyByZXF1aXJlZEVudiAiSEVM" + - "TUZJTEVfRU5WIiB9fS1zZWNyZXRzLnlhbWwgICAjIE11c3QgcmUtaW5jbHVkZQogICAgLSBjYXNz" + - "YW5kcmE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg" + - "ICAgICAgICMgWW91ciBvdmVycmlkZQogICAgICAgIHJlc291cmNlczoKICAgICAgICAgIGxpbWl0" + - "czoKICAgICAgICAgICAgbWVtb3J5OiA4MTkyTWkKYGBgCgojIyMgYGluaGVyaXRgIChIZWxtZmls" + - "ZSBuYXRpdmUpCgpVc2VkIGluIGAwMi1jb3JlLnlhbWwuZ290bXBsYC4gSGVsbWZpbGUncyBuYXRp" + - "dmUgaW5oZXJpdGFuY2UgbWVjaGFuaXNtLgoKYGBgeWFtbAotIG5hbWU6IGFwaQogIHZlcnNpb246" + - "IDEuNi4wCiAgbmFtZXNwYWNlOiBudmNmCiAgaW5oZXJpdDoKICAgIC0gdGVtcGxhdGU6IHNlcnZp" + - "Y2UKYGBgCgpXaGVuIGFkZGluZyBgdmFsdWVzOmAgdG8gYW4gaW5oZXJpdGVkIHJlbGVhc2UsIHlv" + - "dSBhbHNvIG5lZWQgdG8gcmUtaW5jbHVkZSB0aGUgdGVtcGxhdGUncyB2YWx1ZXMgZmlsZXMgc2lu" + - "Y2UgYHZhbHVlc2AgaXMgYSBsaXN0IHRoYXQgZ2V0cyByZXBsYWNlZC4KCiMjIFZhbHVlcyBQcmVj" + - "ZWRlbmNlCgpGcm9tIGxvd2VzdCB0byBoaWdoZXN0IHByaW9yaXR5OgoKMS4gYGVudmlyb25tZW50" + - "cy9iYXNlLnlhbWxgIC0tIGRlZmF1bHRzIHNoYXJlZCBhY3Jvc3MgYWxsIGVudmlyb25tZW50cwoy" + - "LiBgZW52aXJvbm1lbnRzLzxlbnY+LnlhbWxgIC0tIHBlci1lbnZpcm9ubWVudCBvdmVycmlkZXMK" + - "My4gYGdsb2JhbC55YW1sLmdvdG1wbGAgLS0gR28gdGVtcGxhdGUgcHJvY2Vzc2luZyAoY29uc3Ry" + - "dWN0cyBjaGFydC1zcGVjaWZpYyBzdHJ1Y3R1cmUpCjQuIGA8cHJpdmF0ZS12YWx1ZXM+LzxlbnY+" + - "LXNlY3JldHMueWFtbGAgLS0gc2Vuc2l0aXZlIHZhbHVlcwo1LiBJbmxpbmUgYHZhbHVlczpgIGJs" + - "b2NrcyBvbiByZWxlYXNlcyAtLSBoaWdoZXN0IHByZWNlZGVuY2UKCiMjIFdoYXQgZ2xvYmFsLnlh" + - "bWwuZ290bXBsIFBhc3NlcyBUaHJvdWdoCgpgZ2xvYmFsLnlhbWwuZ290bXBsYCByZWFkcyBmcm9t" + - "IGAuVmFsdWVzYCAodGhlIG1lcmdlZCBlbnZpcm9ubWVudCArIGVudi1zcGVjaWZpYyBZQU1MKSBh" + - "bmQgY29uc3RydWN0cyBjaGFydC1zcGVjaWZpYyB2YWx1ZXMuIEl0IG9ubHkgcGFzc2VzIHRocm91" + - "Z2gga2V5cyBpdCBleHBsaWNpdGx5IHJlZmVyZW5jZXM6CgojIyMgQ2Fzc2FuZHJhCgotIGBjYXNz" + - "YW5kcmEucmVwbGljYUNvdW50YAotIGBjYXNzYW5kcmEuaW1hZ2UuKmAgKHJlZ2lzdHJ5LCByZXBv" + - "c2l0b3J5KQotIGBjYXNzYW5kcmEubWlncmF0aW9ucy5pbWFnZS4qYAotIGBjYXNzYW5kcmEucGVy" + - "c2lzdGVuY2Uuc2l6ZWAKLSBgY2Fzc2FuZHJhLm5vZGVTZWxlY3RvcmAgKGlmIGBnbG9iYWwubm9k" + - "ZVNlbGVjdG9ycy5lbmFibGVkYCkKLSBgY2Fzc2FuZHJhLmdsb2JhbC5kZWZhdWx0U3RvcmFnZUNs" + - "YXNzYAoKIyMjIE5BVFMKCi0gYG5hdHMuY29udGFpbmVyLmltYWdlLipgCi0gYG5hdHMucmVsb2Fk" + - "ZXIuaW1hZ2UuKmAKLSBgbmF0cy5uYXRzQm94LmNvbnRhaW5lci5pbWFnZS4qYAotIGBuYXRzLmNv" + - "bmZpZy5qZXRzdHJlYW0uZmlsZVN0b3JlLnB2Yy5zdG9yYWdlQ2xhc3NOYW1lYAotIGBuYXRzLnBv" + - "ZFRlbXBsYXRlLm1lcmdlLnNwZWMubm9kZVNlbGVjdG9yYCAoaWYgZW5hYmxlZCkKCiMjIyBPcGVu" + - "QmFvCgotIGBvcGVuYmFvLm1pZ3JhdGlvbnMuaW1hZ2UuKmAgYW5kIGBvcGVuYmFvLm1pZ3JhdGlv" + - "bnMuZW52YAotIGBvcGVuYmFvLmluamVjdG9yLmltYWdlLipgCi0gYG9wZW5iYW8uc2VydmVyLmlt" + - "YWdlLipgCi0gYG9wZW5iYW8uc2VydmVyLmRhdGFTdG9yYWdlLipgCi0gTm9kZSBzZWxlY3RvcnMg" + - "KGlmIGVuYWJsZWQpCgojIyMgU2VydmljZXMgKEFQSSwgU0lTLCBldGMuKQoKLSBgPHNlcnZpY2U+" + - "LmltYWdlLipgIChyZWdpc3RyeSwgcmVwb3NpdG9yeSkKLSBgPHNlcnZpY2U+Lm5vZGVTZWxlY3Rv" + - "cmAgKGlmIGVuYWJsZWQpCi0gYDxzZXJ2aWNlPi5lbnYuKmAgKG9ic2VydmFiaWxpdHkgc2V0dGlu" + - "Z3MpCgojIyMgTExNIEZ1bmN0aW9uIEVuYWJsZW1lbnQKCkVuYWJsZSB0aGUgTExNIGFkZG9uIGJl" + - "Zm9yZSBjcmVhdGluZyBvciBpbnZva2luZyBmdW5jdGlvbnMgd2l0aApgZnVuY3Rpb25UeXBlOiAi" + - "TExNImAuIFRoZSBhZGRvbiBkZXBsb3lzIGBsbG0tcmVxdWVzdC1yb3V0ZXJgIGFuZApgbGxtLWFw" + - "aS1nYXRld2F5YCwgYWRkcyB0aGUgYGxsbS5pbnZvY2F0aW9uLjxkb21haW4+YCByb3V0ZSB3aGVu" + - "IEdhdGV3YXkgQVBJCmluZ3Jlc3MgaXMgZW5hYmxlZCwgYW5kIGNvbmZpZ3VyZXMgd29ya2VycyB0" + - "byB1c2UgdGhlIExMTSBzaWRlY2FyLiBUaGUgSGVsbWZpbGUKY29uZGl0aW9uIGlzIGBhZGRvbnMu" + - "bGxtLmVuYWJsZWRgLiBEbyBub3QgdXNlIHRoZSBvYnNvbGV0ZSBgbGxtLmVuYWJsZWRgIHBhdGgu" + - "CgpGb3IgYSBzaW5nbGUtbm9kZSBpc29sYXRlZCB0ZXN0IGNsdXN0ZXIsIGFkZCB0aGlzIGNvbmZp" + - "Z3VyYXRpb24gdG8KYGVudmlyb25tZW50cy88ZW52Pi55YW1sYCBiZWZvcmUgYXBwbHlpbmcgdGhl" + - "IHN0YWNrOgoKYGBgeWFtbAphZGRvbnM6CiAgbGxtOgogICAgZW5hYmxlZDogdHJ1ZQogICAgZ2F0" + - "ZXdheToKICAgICAgcmVwbGljYUNvdW50OiAxCiAgICAgIG1ldHJpY3M6CiAgICAgICAgc2Vydmlj" + - "ZU1vbml0b3I6CiAgICAgICAgICBlbmFibGVkOiBmYWxzZQogICAgcmVxdWVzdFJvdXRlcjoKICAg" + - "ICAgcmVwbGljYUNvdW50OiAxCiAgICAgIG1ldHJpY3M6CiAgICAgICAgc2VydmljZU1vbml0b3I6" + - "CiAgICAgICAgICBlbmFibGVkOiBmYWxzZQoKYWdlbnRDb25maWc6CiAgbWVyZ2VDb25maWc6IHwK" + - "ICAgIGNsdXN0ZXI6CiAgICAgIHZhbGlkYXRpb25Qb2xpY3k6CiAgICAgICAgbmFtZTogVW5yZXN0" + - "cmljdGVkCiAgICB3b3JrbG9hZDoKICAgICAgc3RhcmdhdGVRVUlDSW5zZWN1cmU6IHRydWUKYGBg" + - "CgpVc2UgYHJlcGxpY2FDb3VudDogMWAgb25seSBmb3IgbG9jYWwgb3Igc2luZ2xlLW5vZGUgdGVz" + - "dCBjbHVzdGVycy4gVGhlIGJ1bmRsZWQKTlZDRiBBUEkgY3VycmVudGx5IHNlcnZlcyBwbGFpbnRl" + - "eHQgZ1JQQyBvbiBwb3J0IDkwOTAsIHNvIHRoZSBzZWxmLW1hbmFnZWQgc3RhY2sKZGVmYXVsdHMg" + - "dGhlIExMTSBBUEkgR2F0ZXdheSBhdXRoZW50aWNhdGlvbiBob3AgdG8gcGxhaW50ZXh0LiBTZXQK" + - "YGFkZG9ucy5sbG0uZ2F0ZXdheS5hdXRoLmdycGNJbnNlY3VyZTogZmFsc2VgIG9ubHkgd2l0aCBh" + - "IFRMUy1jYXBhYmxlIE5WQ0YgQVBJLgoKV29ya2VyLXRvLXJvdXRlciB0cmFuc3BvcnQgaXMgc2Vw" + - "YXJhdGUuIEZvciBzaGFyZWQgb3IgcHJvZHVjdGlvbiBjbHVzdGVycywgdXNlCnRoZSByZXF1aXJl" + - "ZCByZXBsaWNhIGNvdW50IGFuZCB0aGUgbWFuYWdlZCBUTFMgY29uZmlndXJhdGlvbi4gVGhlCmB3" + - "b3JrbG9hZC5zdGFyZ2F0ZVFVSUNJbnNlY3VyZWAgc2V0dGluZyBlbmFibGVzIHBsYWludGV4dCB3" + - "b3JrZXIgdHJhbnNwb3J0IGFuZAptdXN0IG5vdCBiZSB1c2VkIGluIHByb2R1Y3Rpb24uCgpUaGUg" + - "cmVxdWVzdCByb3V0ZXIgdXNlcyBgcG93ZXItb2YtdHdvYCB3aGVuIG5vIGxvYWQtYmFsYW5jZXIg" + - "Y29uZmlndXJhdGlvbiBpcwpzZXQuIENvbmZpZ3VyZSBvdGhlciByb3V0aW5nIG1ldGhvZHMgd2l0" + - "aCB0aGUKW0xMTSBSZXF1ZXN0IFJvdXRlciBMb2FkIEJhbGFuY2luZ10oaHR0cHM6Ly9naXRodWIu" + - "Y29tL05WSURJQS9udmNmL2Jsb2IvbWFpbi9kb2NzL3VzZXIvbGxtLXJlcXVlc3Qtcm91dGVyLWxv" + - "YWQtYmFsYW5jaW5nLm1kKQpndWlkZS4KCklmIHRoZSBzaWRlY2FyIGltYWdlIGlzIG1pcnJvcmVk" + - "IG91dHNpZGUgdGhlIHN0YWNrJ3MgZGVmYXVsdCBpbWFnZSByZWdpc3RyeSBhbmQKcmVwb3NpdG9y" + - "eSwgc2V0IHRoZSBnZW5lcmF0ZWQgd29ya2VyIHNpZGVjYXIgaW1hZ2UgZXhwbGljaXRseToKCmBg" + - "YHlhbWwKYXBpOgogIHJlbW90ZUNvbmZpZzoKICAgIGNvbmZpZ0RhdGE6CiAgICAgIG52Y2Y6CiAg" + - "ICAgICAgc2lkZWNhcnM6CiAgICAgICAgICBsbG0tcm91dGVyLWNsaWVudC1pbWFnZTogPHJlZ2lz" + - "dHJ5Pi88cmVwb3NpdG9yeT4vcHlsb246MC4xNC4xCmBgYAoKVGhlIGxlZ2FjeSBgYXBpLmVudi5O" + - "VkNGX1NJREVDQVJTX0xMTV9ST1VURVJfQ0xJRU5UX0lNQUdFYCBwYXRoIGlzIGRlcHJlY2F0ZWQu" + - "ClRoZSBzdGFjayB0cmFuc2xhdGVzIGl0IGZvciBvbmUgY29tcGF0aWJpbGl0eSB3aW5kb3csIGJ1" + - "dCBuZXcgY29uZmlndXJhdGlvbnMKbXVzdCB1c2UgdGhlIHJlbW90ZS1jb25maWcgcGF0aC4gQ29u" + - "ZmxpY3RpbmcgdmFsdWVzIGZhaWwgcmVuZGVyaW5nLgoKUmVuZGVyIGFuZCBhcHBseSB0aGUgdXBk" + - "YXRlZCBjb250cm9sLXBsYW5lIGVudmlyb25tZW50LCB0aGVuIHJlZnJlc2ggZXZlcnkKcmVnaXN0" + - "ZXJlZCBjb21wdXRlIHBsYW5lIHVzaW5nIHRoZSBzYW1lIGhhbmRvZmYgdXNlZCBmb3IgaXRzIGlu" + - "c3RhbGxhdGlvbiBzbwpOVkNBIHJlY2VpdmVzIGBhZ2VudENvbmZpZy5tZXJnZUNvbmZpZ2A6Cgpg" + - "YGBiYXNoCkhFTE1GSUxFX0VOVj08ZW52PiBoZWxtZmlsZSB0ZW1wbGF0ZQpIRUxNRklMRV9FTlY9" + - "PGVudj4gaGVsbWZpbGUgc3luYwpgYGAKClVzZSB0aGUgY29tcGxldGUgY29tcHV0ZS1wbGFuZSBp" + - "bnN0YWxsIGNvbW1hbmQgZnJvbQpbU3BsaXQgQ29tcHV0ZS1QbGFuZSBJbnN0YWxsYXRpb25dKGNv" + - "bXB1dGUtcGxhbmUtaW5zdGFsbGF0aW9uLm1kKS4gQQpDTEktcHJvZmlsZSBpbnN0YWxsYXRpb24g" + - "bXVzdCByZW1haW4gcHJvZmlsZS1kcml2ZW47IGEgSGVsbWZpbGUgaW5zdGFsbGF0aW9uCm11c3Qg" + - "cmVtYWluIHZhbHVlcy1kcml2ZW4uCgpFeGlzdGluZyBMTE0gZnVuY3Rpb24gdmVyc2lvbnMgcmV0" + - "YWluIHRoZSB3b3JrZXItc2lkZWNhciBpbWFnZSBtZXRhZGF0YQpjYXB0dXJlZCB3aGVuIHRoZSB2" + - "ZXJzaW9uIGlzIGNyZWF0ZWQuIFJlcGxhY2luZyBwb2RzIG9yIHJlZGVwbG95aW5nIHRoZSBzYW1l" + - "CnZlcnNpb24gZG9lcyBub3QgYXBwbHkgYSBuZXcgUHlsb24gaW1hZ2UuIEFmdGVyIHRoZSBjb250" + - "cm9sLXBsYW5lIHVwZGF0ZSwKY3JlYXRlIGFuZCBkZXBsb3kgYSBuZXcgZnVuY3Rpb24gdmVyc2lv" + - "bi4gVmVyaWZ5IHRoZSBjb250cm9sIHBsYW5lLCByb3V0ZSwgYW5kCndvcmtlciBzaWRlY2FyOgoK" + - "YGBgYmFzaAprdWJlY3RsIGdldCBkZXBsb3kgLW4gbnZjZiBsbG0tYXBpLWdhdGV3YXkKa3ViZWN0" + - "bCBnZXQgc3RhdGVmdWxzZXQgLW4gbnZjZiBsbG0tcmVxdWVzdC1yb3V0ZXIKa3ViZWN0bCBnZXQg" + - "cG9kcyAtbiBudmNmIHwgZ3JlcCAtRSAnbGxtLWFwaS1nYXRld2F5fGxsbS1yZXF1ZXN0LXJvdXRl" + - "cicKa3ViZWN0bCBnZXQgaHR0cHJvdXRlIC1BIHwgZ3JlcCBsbG0Ka3ViZWN0bCAtbiBudmNmLWJh" + - "Y2tlbmQgZ2V0IHBvZCA8ZnVuY3Rpb24tcG9kPiBcCiAgLW8ganNvbnBhdGg9J3tyYW5nZSAuc3Bl" + - "Yy5jb250YWluZXJzWz8oQC5uYW1lPT0ibGxtLXdvcmtlciIpXS5hcmdzWypdfXsufXsiXFxuIn17" + - "ZW5kfScKYGBgCgpGb3IgbG9jYWwgcGxhaW50ZXh0IGNsdXN0ZXJzLCB0aGUgYGxsbS13b3JrZXJg" + - "IGFyZ3MgbXVzdCBpbmNsdWRlCmAtLXF1aWMtaW5zZWN1cmVgLgoKRm9yIGxvYWQtYmFsYW5jZXIg" + - "c2NoZW1hIGFuZCBhbGdvcml0aG0gYmVoYXZpb3IsIHNlZSB0aGUKW1N0YXJnYXRlIGNvbmZpZ3Vy" + - "YXRpb24gZ3VpZGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9OVklESUEvbnZjZi9ibG9iL21haW4vc3Jj" + - "L2xpYnJhcmllcy9ydXN0L3N0YXJnYXRlL2RvY3MvbG9hZC1iYWxhbmNlci1jb25maWd1cmF0aW9u" + - "Lm1kKS4KCiMjIEhlbG1maWxlIFNlbGVjdG9ycwoKVGFyZ2V0IHNwZWNpZmljIHJlbGVhc2VzIG9y" + - "IGdyb3VwczoKCmBgYGJhc2gKIyBCeSByZWxlYXNlIGdyb3VwCkhFTE1GSUxFX0VOVj08ZW52PiBo" + - "ZWxtZmlsZSAtLXNlbGVjdG9yIHJlbGVhc2UtZ3JvdXA9ZGVwZW5kZW5jaWVzIHN5bmMKSEVMTUZJ" + - "TEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0b3IgcmVsZWFzZS1ncm91cD1zZXJ2aWNlcyBz" + - "eW5jCkhFTE1GSUxFX0VOVj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIHJlbGVhc2UtZ3JvdXA9" + - "aW5ncmVzcyBzeW5jCkhFTE1GSUxFX0VOVj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIHJlbGVh" + - "c2UtZ3JvdXA9b2JzZXJ2YWJpbGl0eSBzeW5jCgojIEJ5IHJlbGVhc2UgbmFtZQpIRUxNRklMRV9F" + - "TlY9PGVudj4gaGVsbWZpbGUgLS1zZWxlY3RvciBuYW1lPWNhc3NhbmRyYSBzeW5jCkhFTE1GSUxF" + - "X0VOVj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9YWRtaW4taXNzdWVyLXByb3h5IHN5" + - "bmMKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0b3IgbmFtZT1sbG0tcmVxdWVz" + - "dC1yb3V0ZXIgc3luYwpIRUxNRklMRV9FTlY9PGVudj4gaGVsbWZpbGUgLS1zZWxlY3RvciBuYW1l" + - "PWxsbS1hcGktZ2F0ZXdheSBzeW5jCgojIFRlbXBsYXRlIG9ubHkgKGRyeSBydW4pCkhFTE1GSUxF" + - "X0VOVj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9Y2Fzc2FuZHJhIHRlbXBsYXRlCgoj" + - "IERlc3Ryb3kgYSBzaW5nbGUgcmVsZWFzZQpIRUxNRklMRV9FTlY9PGVudj4gaGVsbWZpbGUgLS1z" + - "ZWxlY3RvciBuYW1lPWNhc3NhbmRyYSBkZXN0cm95CmBgYAoKTm90ZTogYGFkbWluLWlzc3Vlci1w" + - "cm94eWAgaGFzIG5vIGByZWxlYXNlLWdyb3VwYCBsYWJlbC4gVXNlIGAtLXNlbGVjdG9yIG5hbWU9" + - "YWRtaW4taXNzdWVyLXByb3h5YC4KUEsHCLE1HdsCKgAAAioAAFBLAwQUAAgAAAAAACEAAAAAAAAA" + - "AAAAAAAAPwAJAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uL3JlZmVyZW5jZXMv" + - "bnZjZi11aS1hZGRvbi5tZFVUBQABAKbOEiMgTlZDRiBVSSBBZGRvbgoKTlZDRiBVSSBpcyBhbiBv" + - "cHRpb25hbCwgY3VzdG9tZXItZmFjaW5nIE5WQ0YgYWRtaW4tcGFuZWwgVUkuIEl0IGlzIGRpc2Fi" + - "bGVkIGJ5CmRlZmF1bHQgYW5kIGF2YWlsYWJsZSBvbmx5IGluIHN0YWNrIHBhY2thZ2VzIHRoYXQg" + - "aW5jbHVkZSB0aGUgTlZDRiBVSSBhZGRvbi4KCiMjIFdoZW4gdG8gZW5hYmxlCgpFbmFibGUgTlZD" + - "RiBVSSBvbmx5IHdoZW4geW91IG5lZWQgdGhlIGFkbWluLXBhbmVsIFVJIGFuZCB5b3VyIGV4dHJh" + - "Y3RlZCBzdGFjawpwYWNrYWdlIGluY2x1ZGVzIHRoZSBhZGRvbi4gSWYgdGhlIHBhY2thZ2UgZG9l" + - "cyBub3QgY29udGFpbiBhIGBudmNmLXVpYCByZWxlYXNlCmFuZCBgbnZjZlVpYCByb3V0ZSB2YWx1" + - "ZXMsIHNraXAgdGhlIGFkZG9uIHVudGlsIHlvdSB1c2UgYSBwYWNrYWdlIHRoYXQgaW5jbHVkZXMK" + - "dGhlbS4KCiMjIEVuYWJsZSB0aGUgYWRkb24KCkVuYWJsZSBpdCBpbiBgZW52aXJvbm1lbnRzLzxl" + - "bnYtbmFtZT4ueWFtbGA6CgpgYGB5YW1sCmFkZG9uczoKICBudmNmVWk6CiAgICBlbmFibGVkOiB0" + - "cnVlCmBgYAoKIyMgQ3JlYXRlIG5hbWVzcGFjZSBhbmQgaW1hZ2UgcHVsbCBzZWNyZXQKCkNyZWF0" + - "ZSB0aGUgbmFtZXNwYWNlLCBhbmQgYW4gaW1hZ2UgcHVsbCBzZWNyZXQgb25seSBpZiBwdWxsaW5n" + - "IGZyb20gYSBwcml2YXRlCnJlZ2lzdHJ5OgoKYGBgYmFzaAprdWJlY3RsIGNyZWF0ZSBuYW1lc3Bh" + - "Y2UgbnZjZi11aSAtLWRyeS1ydW49Y2xpZW50IC1vIHlhbWwgfCBrdWJlY3RsIGFwcGx5IC1mIC0K" + - "CiMgT25seSBpZiBwdWxsaW5nIGZyb20gYSBwcml2YXRlIHJlZ2lzdHJ5IChlLmcuLCBOR0MgbnZj" + - "ci5pbykKZXhwb3J0IE5HQ19BUElfS0VZPSI8eW91ci1rZXk+IgprdWJlY3RsIGNyZWF0ZSBzZWNy" + - "ZXQgZG9ja2VyLXJlZ2lzdHJ5IG52Y3ItY3JlZHMgXAogIC0tZG9ja2VyLXNlcnZlcj1udmNyLmlv" + - "IFwKICAtLWRvY2tlci11c2VybmFtZT0nJG9hdXRodG9rZW4nIFwKICAtLWRvY2tlci1wYXNzd29y" + - "ZD0iJE5HQ19BUElfS0VZIiBcCiAgLS1uYW1lc3BhY2U9bnZjZi11aSBcCiAgLS1kcnktcnVuPWNs" + - "aWVudCAtbyB5YW1sIHwga3ViZWN0bCBhcHBseSAtZiAtCmBgYAoKVGhlIGRlZmF1bHQgcm91dGUg" + - "aG9zdCBpcyBgbnZjZi11aS48ZG9tYWluPmAgYW5kIHRoZSBiYWNrZW5kIGlzCmBudmNmLXVpLm52" + - "Y2YtdWk6ODMwMGAuCgojIyBBcHBseSB0aGUgc2VydmljZSBhbmQgcm91dGUKCkFmdGVyIGNvbmZp" + - "cm1pbmcgdGhlIHBhY2thZ2UgaW5jbHVkZXMgdGhlIGBudmNmLXVpYCByZWxlYXNlLCBwcmV2aWV3" + - "IGFuZCBhcHBseQp0aGUgc2VydmljZSBhbmQgcm91dGU6CgpgYGBiYXNoCkhFTE1GSUxFX0VOVj08" + - "ZW52LW5hbWU+IGhlbG1maWxlIC0tc2VsZWN0b3IgbmFtZT1udmNmLXVpIHRlbXBsYXRlCkhFTE1G" + - "SUxFX0VOVj08ZW52LW5hbWU+IGhlbG1maWxlIC0tc2VsZWN0b3IgbmFtZT1udmNmLXVpIHN5bmMK" + - "SEVMTUZJTEVfRU5WPTxlbnYtbmFtZT4gaGVsbWZpbGUgLS1zZWxlY3RvciByZWxlYXNlLWdyb3Vw" + - "PWluZ3Jlc3Mgc3luYwpgYGAKCiMjIFZlcmlmeQoKVmVyaWZ5IHRoZSByb3V0ZSBvbmx5IHdoZW4g" + - "dGhlIGFkZG9uIGlzIHByZXNlbnQgYW5kIGVuYWJsZWQ6CgpgYGBiYXNoCmt1YmVjdGwgZ2V0IGRl" + - "cGxveSxzdmMgLW4gbnZjZi11aQprdWJlY3RsIGdldCBodHRwcm91dGUgLUEgfCBncmVwIC1pIG52" + - "Y2YtdWkKY3VybCAtaSAtSCAiSG9zdDogbnZjZi11aS48ZG9tYWluPiIgImh0dHA6Ly88Z2F0ZXdh" + - "eS1hZGRyZXNzPi9zdGF0dXMiCmBgYAoKIyMgU2VjdXJpdHkKClRoZSBOVkNGIFVJIGFkbWluIHBh" + - "bmVsIGlzIGN1cnJlbnRseSB1bmF1dGhlbnRpY2F0ZWQuIERvIG5vdCBleHBvc2UgaXQgdG8gdGhl" + - "CnB1YmxpYyBpbnRlcm5ldC4gUmVzdHJpY3QgYWNjZXNzIHRvIGEgdHJ1c3RlZCBuZXR3b3JrLCBW" + - "UE4sIG9yIGFuIGF1dGhlbnRpY2F0aW5nCnByb3h5IGluIGZyb250IG9mIHRoZSBgbnZjZi11aWAg" + - "cm91dGUuClBLBwg4+SevuQcAALkHAABQSwMEFAAIAAAAAAAhAAAAAAAAAAAAAAAAAD4ACQBkYXRh" + - "L252Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbi9yZWZlcmVuY2VzL3B1bGwtc2VjcmV0cy5t" + - "ZFVUBQABAKbOEiMgSW1hZ2UgUHVsbCBTZWNyZXRzIFJlZmVyZW5jZQoKIyMgT3ZlcnZpZXcKCldo" + - "ZW4gcHVsbGluZyBOVkNGIGltYWdlcyBmcm9tIGEgcHJpdmF0ZSByZWdpc3RyeSAoZm9yIGV4YW1w" + - "bGUsIE5HQwpgbnZjci5pb2ApLCBLdWJlcm5ldGVzIG5lZWRzIGBpbWFnZVB1bGxTZWNyZXRzYCBv" + - "biBldmVyeSBwb2QuIENvbnRyb2wtcGxhbmUgYW5kCmNvbXB1dGUtcGxhbmUgY3JlZGVudGlhbHMg" + - "YXJlIGNvbmZpZ3VyZWQgaW4gdGhlaXIgb3duIGNsdXN0ZXIgY29udGV4dHMuIERvIG5vdAp1c2Ug" + - "b25lIG1peGVkIG5hbWVzcGFjZSBsaXN0LgoKVGhlIHJlY29tbWVuZGVkIGNvbnRyb2wtcGxhbmUg" + - "YXBwcm9hY2ggdXNlcyBLeXZlcm5vIHRvIGluamVjdCB0aGUgc2VjcmV0IGludG8KY29udHJvbC1w" + - "bGFuZSBwb2RzIGF0IGFkbWlzc2lvbiB0aW1lLiBUaGUgY29tcHV0ZS1wbGFuZSBjaGFydCBhbmQg" + - "b3BlcmF0b3IgdXNlCnRoZSBzZWNyZXQgaW4gYG52Y2Etb3BlcmF0b3JgIGFuZCBtaXJyb3IgaXQg" + - "dG8gYG52Y2Etc3lzdGVtYC4KCiMjIEt5dmVybm8gQXBwcm9hY2ggKFJlY29tbWVuZGVkKQoKIyMj" + - "IDEuIEluc3RhbGwgS3l2ZXJubwoKYGBgYmFzaApoZWxtIHJlcG8gYWRkIGt5dmVybm8gaHR0cHM6" + - "Ly9reXZlcm5vLmdpdGh1Yi5pby9reXZlcm5vLwpoZWxtIHJlcG8gdXBkYXRlCmhlbG0gaW5zdGFs" + - "bCBreXZlcm5vIGt5dmVybm8va3l2ZXJubyAtbiBreXZlcm5vIC0tY3JlYXRlLW5hbWVzcGFjZSBc" + - "CiAgLS1rdWJlLWNvbnRleHQgPGNvbnRyb2wtcGxhbmUtY29udGV4dD4KYGBgCgojIyMgMi4gQ3Jl" + - "YXRlIGNvbnRyb2wtcGxhbmUgcHVsbCBzZWNyZXRzCgpgYGBiYXNoCmV4cG9ydCBOR0NfQVBJX0tF" + + "IlRoZSBhZ2VudCB1c2VkIHRoZSBoZWxtZmlsZSBzZWxlY3RvciB0byBkZXBsb3kgb25seSB0aGUg" + + "ZGVwZW5kZW5jaWVzIHJlbGVhc2UgZ3JvdXAsIHRoZW4gdmVyaWZpZWQgcG9kcyBpbiB0aGUgZGVw" + + "ZW5kZW5jeSBuYW1lc3BhY2VzLiIsCiAgICAiZXhwZWN0ZWRfYmVoYXZpb3IiOiBbCiAgICAgICJU" + + "aGUgYWdlbnQgcmVhZCB0aGUgbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uIFNLSUxMLm1k" + + "IGJlZm9yZSB0YWtpbmcgYWN0aW9uIiwKICAgICAgIlRoZSBhZ2VudCB1c2VkICdoZWxtZmlsZSAt" + + "LXNlbGVjdG9yIHJlbGVhc2UtZ3JvdXA9ZGVwZW5kZW5jaWVzIHN5bmMnIHRvIGRlcGxveSBvbmx5" + + "IGRlcGVuZGVuY2llcyIsCiAgICAgICJUaGUgYWdlbnQgdmVyaWZpZWQgcG9kcyBpbiBkZXBlbmRl" + + "bmN5IG5hbWVzcGFjZXMgKG5hdHMtc3lzdGVtLCBjYXNzYW5kcmEtc3lzdGVtLCB2YXVsdC1zeXN0" + + "ZW0pIiwKICAgICAgIlRoZSBhZ2VudCBwcm92aWRlZCB0aGUgc2VsZWN0b3IgcmVmZXJlbmNlIGZv" + + "ciB0YXJnZXRpbmcgb3RoZXIgcmVsZWFzZSBncm91cHMiCiAgICBdCiAgfSwKICB7CiAgICAiaWQi" + + "OiAiUzctZGVidWctaW1hZ2VwdWxsYmFja29mZiIsCiAgICAicXVlc3Rpb24iOiAiQ2Fzc2FuZHJh" + + "IHBvZHMgYXJlIGluIEltYWdlUHVsbEJhY2tPZmYgd2l0aCA0MDEgVW5hdXRob3JpemVkIiwKICAg" + + "ICJleHBlY3RlZF9za2lsbCI6ICJudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24iLAogICAg" + + "Imdyb3VuZF90cnV0aCI6ICJUaGUgYWdlbnQgcmVhZCB0aGUgZGVidWdnaW5nIHJlZmVyZW5jZSBh" + + "bmQgcmFuIGRpYWdub3N0aWMgY29tbWFuZHMgdG8gaWRlbnRpZnkgdGhlIHJvb3QgY2F1c2U6IGRl" + + "c2NyaWJlZCB0aGUgcG9kLCBjaGVja2VkIGZvciBwdWxsIHNlY3JldHMsIGNoZWNrZWQgaW1hZ2VQ" + + "dWxsU2VjcmV0cyBvbiB0aGUgcG9kIHNwZWMgYW5kIHNlcnZpY2UgYWNjb3VudC4gSXQgaWRlbnRp" + + "ZmllZCB0aGUgaXNzdWUgKG1pc3Npbmcgc2VjcmV0LCB3cm9uZyBjcmVkZW50aWFscywgb3IgbWlz" + + "c2luZyBpbWFnZVB1bGxTZWNyZXRzKSBhbmQgcHJvdmlkZWQgdGhlIGNvcnJlY3QgZml4LiIsCiAg" + + "ICAiZXhwZWN0ZWRfYmVoYXZpb3IiOiBbCiAgICAgICJUaGUgYWdlbnQgcmVhZCB0aGUgbnZjZi1z" + + "ZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uIFNLSUxMLm1kIGFuZCByZWZlcmVuY2VzL2RlYnVnZ2lu" + + "Zy5tZCIsCiAgICAgICJUaGUgYWdlbnQgcmFuICdrdWJlY3RsIGRlc2NyaWJlIHBvZCcgdG8gc2Vl" + + "IHRoZSBJbWFnZVB1bGxCYWNrT2ZmIGV2ZW50cyIsCiAgICAgICJUaGUgYWdlbnQgY2hlY2tlZCBm" + + "b3IgcHVsbCBzZWNyZXRzIGluIHRoZSBjYXNzYW5kcmEtc3lzdGVtIG5hbWVzcGFjZSIsCiAgICAg" + + "ICJUaGUgYWdlbnQgY2hlY2tlZCBpbWFnZVB1bGxTZWNyZXRzIG9uIHRoZSBwb2Qgc3BlYyBhbmQv" + + "b3Igc2VydmljZSBhY2NvdW50IiwKICAgICAgIlRoZSBhZ2VudCBpZGVudGlmaWVkIHRoZSByb290" + + "IGNhdXNlIGFuZCBwcm92aWRlZCBhIHNwZWNpZmljIGZpeCIKICAgIF0KICB9LAogIHsKICAgICJp" + + "ZCI6ICJTOS1yZW1vdGUtZWtzLXJvdXRpbmctYW5kLXNlY3JldHMiLAogICAgInF1ZXN0aW9uIjog" + + "IkNvbmZpZ3VyZSBhIHJlbW90ZSBFS1MgY29tcHV0ZSBjbHVzdGVyIHRvIHJlYWNoIG15IE5WQ0Yg" + + "Y29udHJvbCBwbGFuZSB0aHJvdWdoIGl0cyBFbnZveSBHYXRld2F5LCBpbmNsdWRpbmcgTkFUUyBh" + + "bmQgcHJpdmF0ZS1yZWdpc3RyeSBwdWxsIHNlY3JldHMuIiwKICAgICJleHBlY3RlZF9za2lsbCI6" + + "ICJudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24iLAogICAgImdyb3VuZF90cnV0aCI6ICJU" + + "aGUgYWdlbnQgY29uZmlndXJlZCB0aGUgY29udHJvbCBwbGFuZSB0byB1c2UgdGhlIEVudm95IEdh" + + "dGV3YXkgY29udHJvbGxlciBpbiBlbnZveS1nYXRld2F5LXN5c3RlbSBhbmQgR2F0ZXdheS9udmNm" + + "LWdhdGV3YXkgaW4gZW52b3ktZ2F0ZXdheSwgc2V0IGFsbCBzaXggcmVtb3RlIHdvcmtlciBlbmRw" + + "b2ludHMgYW5kIHRoZSBncnBjLXByb3h5IGxvY2FsIG92ZXJyaWRlLCBlbmFibGVkIE5WQ0YgYW5k" + + "IE5WQ1QgZ1JQQyByb3V0ZXMgcGx1cyBOQVRTLCBhbmQgZW5hYmxlZCBPcGVuQmFvIGlzc3VlciBk" + + "aXNjb3ZlcnkuIEl0IGNvbmZpZ3VyZWQgdGhlIGJhcmUtR2F0ZXdheSBDTEkgVVJMIGFuZCBIb3N0" + + "IGZpZWxkcyBpbmNsdWRpbmcgaWNtc19ob3N0LCBwbHVzIHRoZSBjb21wdXRlLXBsYW5lIElDTVMs" + + "IFJlVmFsLCBhbmQgTkFUUyBleHRlcm5hbCBVUkxzIGFuZCBob3N0IG92ZXJyaWRlcy4gSXQgY3Jl" + + "YXRlZCB0aGUgcHVsbCBzZWNyZXQgaW4gYWxsIGNvbnRyb2wtcGxhbmUgbmFtZXNwYWNlcyBpbmNs" + + "dWRpbmcgY2VydC1tYW5hZ2VyLCBidXQgb25seSBpbiBudmNhLW9wZXJhdG9yIG9uIHRoZSBjb21w" + + "dXRlIGNsdXN0ZXI7IHRoZSBjaGFydCBhbmQgb3BlcmF0b3IgbWlycm9yIGl0IHRvIG52Y2Etc3lz" + + "dGVtLiIsCiAgICAiZXhwZWN0ZWRfYmVoYXZpb3IiOiBbCiAgICAgICJUaGUgYWdlbnQgcmVhZCB0" + + "aGUgbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uIFNLSUxMLm1kIGJlZm9yZSB0YWtpbmcg" + + "YWN0aW9uIiwKICAgICAgIlRoZSBhZ2VudCBzZXQgaW5ncmVzcy5nYXRld2F5QXBpLmNvbnRyb2xs" + + "ZXJOYW1lc3BhY2UgdG8gZW52b3ktZ2F0ZXdheS1zeXN0ZW0iLAogICAgICAiVGhlIGFnZW50IHNl" + + "dCBzaGFyZWQsIGdycGMsIGFuZCBuYXRzIEdhdGV3YXkgcmVmZXJlbmNlcyB0byBuYW1lIG52Y2Yt" + + "Z2F0ZXdheSBhbmQgbmFtZXNwYWNlIGVudm95LWdhdGV3YXkiLAogICAgICAiVGhlIGFnZW50IHNl" + + "dCBnbG9iYWwud29ya2VyRW5kcG9pbnRzLm52Y2ZTZXJ2aWNlVVJMLCBudmNmR3JwY1NlcnZpY2VV" + + "UkwsIG52Y2ZOYXRzU2VydmljZVVSTCwgbnZjdFNlcnZpY2VVUkwsIG52Y3RHcnBjU2VydmljZVVS" + + "TCwgYW5kIGludm9jYXRpb25TZXJ2aWNlVVJMIiwKICAgICAgIlRoZSBhZ2VudCBzZXQgZ3JwY3By" + + "b3h5Lm52Y2ZHcnBjU2VydmljZVVSTCB0byB0aGUgY29udHJvbC1wbGFuZS1sb2NhbCBBUEkgZ1JQ" + + "QyBzZXJ2aWNlIiwKICAgICAgIlRoZSBhZ2VudCBlbmFibGVkIGJvdGggaW5ncmVzcy5nYXRld2F5" + + "QXBpLnJvdXRlcy5udmNmQXBpLmdycGMgYW5kIG52Y3RBcGkuZ3JwYyB3aXRoIHdvcmtlci1hcGkg" + + "YW5kIHdvcmtlci10YXNrcyBob3N0bmFtZXMiLAogICAgICAiVGhlIGFnZW50IGV4cGxpY2l0bHkg" + + "c2V0IGluZ3Jlc3MuZ2F0ZXdheUFwaS5yb3V0ZXMubmF0cy5lbmFibGVkIHRvIHRydWUiLAogICAg" + + "ICAiVGhlIGFnZW50IHNldCBvcGVuYmFvLm1pZ3JhdGlvbnMuaXNzdWVyRGlzY292ZXJ5LmVuYWJs" + + "ZWQgdG8gdHJ1ZSIsCiAgICAgICJUaGUgYWdlbnQgY29uZmlndXJlZCB0aGUgYmFyZS1HYXRld2F5" + + "IENMSSBVUkwgYW5kIEhvc3QgZmllbGRzLCBpbmNsdWRpbmcgc2NoZW1lLWxlc3MgaWNtc19ob3N0" + + "IiwKICAgICAgIlRoZSBhZ2VudCBjb25maWd1cmVkIGNvbXB1dGUtcGxhbmUgaWNtc1NlcnZpY2VV" + + "UkwsIGljbXNTZXJ2aWNlSG9zdEhlYWRlck92ZXJyaWRlLCByZXZhbFNlcnZpY2VVUkwsIHJldmFs" + + "U2VydmljZUhvc3RIZWFkZXJPdmVycmlkZSwgbmF0c1VSTCwgYW5kIG5hdHNIb3N0T3ZlcnJpZGUi" + + "LAogICAgICAiVGhlIGNvbnRyb2wtcGxhbmUgcHVsbC1zZWNyZXQgbmFtZXNwYWNlIGxpc3QgaW5j" + + "bHVkZWQgY2VydC1tYW5hZ2VyIiwKICAgICAgIlRoZSBjb21wdXRlLXBsYW5lIHNlY3JldCB3YXMg" + + "Y3JlYXRlZCBvbmx5IGluIG52Y2Etb3BlcmF0b3IgYW5kIG1pcnJvcmVkIGJ5IHRoZSBjaGFydCBh" + + "bmQgb3BlcmF0b3IgdG8gbnZjYS1zeXN0ZW0iCiAgICBdCiAgfSwKICB7CiAgICAiaWQiOiAiRzEx" + + "LXNwbGl0LXRlYXJkb3duIiwKICAgICJxdWVzdGlvbiI6ICJUZWFyIGRvd24gbXkgc3BsaXQgY29u" + + "dHJvbC1wbGFuZSBhbmQgY29tcHV0ZS1wbGFuZSBkZXBsb3ltZW50IHNhZmVseS4gU2hvdyBib3Ro" + + "IHRoZSBIZWxtZmlsZSB2YWx1ZXMgYW5kIENMSSBwcm9maWxlIHZhcmlhbnRzLiIsCiAgICAiZXhw" + + "ZWN0ZWRfc2tpbGwiOiAibnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uIiwKICAgICJncm91" + + "bmRfdHJ1dGgiOiAiVGhlIEhlbG1maWxlIGZsb3cgZGVzdHJveWVkIGFuZCBjb25maXJtZWQgZGVy" + + "ZWdpc3RyYXRpb24gb2YgZXZlcnkgY29tcHV0ZSBjbHVzdGVyIGJlZm9yZSBkZXN0cm95aW5nIHRo" + + "ZSBjb250cm9sIHBsYW5lIGFuZCBwYXNzZWQgYm90aCBjb250cm9sLXBsYW5lIGt1YmVjb25maWcg" + + "Zm9ybXMuIEJlZm9yZSBlaXRoZXIgaGFuZG9mZiBjb3VsZCBkZXN0cm95IHRoZSBjb250cm9sIHBs" + + "YW5lLCBib3RoIHRlYXJkb3duIGZsb3dzIHdhcm5lZCB0aGF0IG5hbWVzcGFjZSBwcmVzZXJ2YXRp" + + "b24gZG9lcyBub3QgcHJlc2VydmUgdGhlIEhlbG0gcmVsZWFzZSwgcmVxdWlyZWQgZWZmZWN0aXZl" + + "IGNlcnRNYW5hZ2VyLmVuYWJsZWQ6IGZhbHNlIGZvciBhbiBleHRlcm5hbCBpbnN0YWxsYXRpb24g" + + "YW5kIGFib3J0ZWQgaWYgdHJ1ZSwgYW5kIHZlcmlmaWVkIG1hdGNoaW5nIHJlbGVhc2Ugb3duZXJz" + + "aGlwIGZvciBhbiBpbnRlbmRlZCBzdGFjay1tYW5hZ2VkIHJlbGVhc2UsIGFib3J0aW5nIG9uIG1p" + + "c3Npbmcgb3IgbWlzbWF0Y2hlZCBldmlkZW5jZS4gVGhleSBwcmVzZXJ2ZWQgdGhlIG5hbWVzcGFj" + + "ZSBieSBkZWZhdWx0IGFuZCBkaWQgbm90IGRlbGV0ZSBpdCB3aXRob3V0IG5hbWVzcGFjZSBwcm92" + + "ZW5hbmNlIGFuZCBleHBsaWNpdCBjb25maXJtYXRpb24uIFRoZSBDTEkgZmxvdyByZXRhaW5lZCB0" + + "aGUgZ2VuZXJhdGVkIHJlZ2lzdHJhdGlvbiB2YWx1ZXMsIHVzZWQgdGhlIGZ1bGwtcHJlZml4IHN0" + + "YXR1cyBjb21tYW5kIHRvIGluc3BlY3QgbGl2ZSByZWdpc3RyYXRpb25zLCBzdGF0ZWQgdGhhdCBu" + + "YW1lZC1jbHVzdGVyIHBsYW4tb25seSBkb2VzIG5vdCBxdWVyeSBJQ01TIGFuZCBjYW5ub3QgcHJl" + + "ZGljdCBjb25kaXRpb25hbCBjb250cm9sLXBsYW5lIHJlbW92YWwsIGFuZCBnb3QgZXhwbGljaXQg" + + "Y29uZmlybWF0aW9uIHdoZW4gdGhlIHRhcmdldCB3YXMgdGhlIGxhc3QgcmVnaXN0ZXJlZCBjbHVz" + + "dGVyLiBJdCB0aGVuIHByZXZpZXdlZCBhbmQgcmFuIGRvd24gd2l0aCB0aGUgZnVsbCBwZXJzaXN0" + + "ZW50IHByZWZpeCwgcmVtb3ZpbmcgdGhlIGNvbnRyb2wgcGxhbmUgb25seSBhZnRlciB0aGUgbGFz" + + "dCByZWdpc3RyYXRpb24gd2FzIGdvbmUuIiwKICAgICJleHBlY3RlZF9iZWhhdmlvciI6IFsKICAg" + + "ICAgIlRoZSBhZ2VudCByZWFkIHRoZSBudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24gU0tJ" + + "TEwubWQgYmVmb3JlIHRha2luZyBhY3Rpb24iLAogICAgICAiRm9yIGV2ZXJ5IGNvbXB1dGUgY2x1" + + "c3RlciwgdGhlIEhlbG1maWxlIGZsb3cgcmFuIHRoZSBjb21wdXRlLXBsYW5lIE1ha2VmaWxlIGRl" + + "c3Ryb3kgdGFyZ2V0IHdpdGggaXRzIGNvbXB1dGUga3ViZWNvbmZpZyIsCiAgICAgICJBZnRlciBj" + + "b25maXJtYXRpb24sIHRoZSBIZWxtZmlsZSBmbG93IHJhbiBjbHVzdGVyIGRlbGV0ZSB3aXRoIGNs" + + "dXN0ZXJJRCBhbmQgbmNhSUQgYmVmb3JlIGNvbnRyb2wtcGxhbmUgZGVzdHJ1Y3Rpb24iLAogICAg" + + "ICAiQmVmb3JlIGVpdGhlciBoYW5kb2ZmIGNvdWxkIGRlc3Ryb3kgdGhlIGNvbnRyb2wgcGxhbmUs" + + "IGJvdGggdGVhcmRvd24gZmxvd3Mgd2FybmVkIHRoYXQgbmFtZXNwYWNlIHByZXNlcnZhdGlvbiBk" + + "b2VzIG5vdCBwcmVzZXJ2ZSB0aGUgSGVsbSByZWxlYXNlLCByZXF1aXJlZCBlZmZlY3RpdmUgY2Vy" + + "dE1hbmFnZXIuZW5hYmxlZDogZmFsc2UgZm9yIGFuIGV4dGVybmFsIGluc3RhbGxhdGlvbiBhbmQg" + + "YWJvcnRlZCBpZiB0cnVlLCBhbmQgdmVyaWZpZWQgaW50ZW5kZWQgc3RhY2sgb3duZXJzaGlwIHdo" + + "ZW4gZW5hYmxlZCwgYWJvcnRpbmcgb24gbWlzc2luZyBvciBtaXNtYXRjaGVkIGV2aWRlbmNlIiwK" + + "ICAgICAgIkJvdGggdGVhcmRvd24gZmxvd3MgcHJlc2VydmVkIHRoZSBjZXJ0LW1hbmFnZXIgbmFt" + + "ZXNwYWNlIGJ5IGRlZmF1bHQgYW5kIGRpZCBub3QgZGVsZXRlIGl0IHdpdGhvdXQgbmFtZXNwYWNl" + + "IHByb3ZlbmFuY2UgYW5kIGV4cGxpY2l0IGNvbmZpcm1hdGlvbiIsCiAgICAgICJUaGUgSGVsbWZp" + + "bGUgZmxvdyByYW4gY29udHJvbC1wbGFuZSBNYWtlZmlsZSBkZXN0cm95IHdpdGggYm90aCBLVUJF" + + "Q09ORklHIGFuZCBLVUJFQ09ORklHX0ZJTEUiLAogICAgICAiVGhlIENMSSBmbG93IHJldGFpbmVk" + + "IG91dC88Y2x1c3Rlci1uYW1lPi1yZWdpc3Rlci12YWx1ZXMueWFtbCB1bnRpbCB0ZWFyZG93biBj" + + "b21wbGV0ZWQiLAogICAgICAiQmVmb3JlIHJlYWwgZG93biwgdGhlIENMSSBmbG93IHVzZWQgdGhl" + + "IGZ1bGwtcHJlZml4IHN0YXR1cyBjb21tYW5kIHRvIGluc3BlY3QgbGl2ZSByZWdpc3RyYXRpb25z" + + "LCBzdGF0ZWQgdGhhdCBuYW1lZC1jbHVzdGVyIHBsYW4tb25seSBkb2VzIG5vdCBxdWVyeSBJQ01T" + + "IGFuZCBjYW5ub3QgcHJlZGljdCBjb25kaXRpb25hbCBjb250cm9sLXBsYW5lIHJlbW92YWwsIHdh" + + "cm5lZCB3aGVuIHRoZSB0YXJnZXQgd2FzIHRoZSBsYXN0IHJlZ2lzdGVyZWQgY2x1c3RlciwgYW5k" + + "IGdvdCBleHBsaWNpdCBjb25maXJtYXRpb24iLAogICAgICAiVGhlIENMSSBmbG93IHVzZWQgLS1j" + + "b25maWcsIGJvdGggc3RhY2sgcGF0aHMsIC0tZW52LCAtLXBsYWluLCBib3RoIGNvbnRleHRzLCBh" + + "bmQgLS1pY21zLXVybCBmb3IgZG93biAtLXBsYW4tb25seSBhbmQgdGhlbiBkb3duIiwKICAgICAg" + + "IlRoZSBhZ2VudCBzdGF0ZWQgdGhhdCBkb3duIHVucmVnaXN0ZXJzIGVhY2ggY29tcHV0ZSBjbHVz" + + "dGVyIGFuZCByZW1vdmVzIHRoZSBjb250cm9sIHBsYW5lIG9ubHkgYWZ0ZXIgbm8gcmVnaXN0cmF0" + + "aW9ucyByZW1haW4iCiAgICBdCiAgfSwKICB7CiAgICAiaWQiOiAiUzEzLXZhbHVlcy1wcmVjZWRl" + + "bmNlIiwKICAgICJxdWVzdGlvbiI6ICJJIGFkZGVkIGEgdmFsdWUgdG8gbXkgZW52aXJvbm1lbnQg" + + "WUFNTCBidXQgaXQncyBiZWluZyBzaWxlbnRseSBpZ25vcmVkLiBIb3cgZG8gaGVsbWZpbGUgdmFs" + + "dWVzIHdvcmsgaW4gTlZDRj8iLAogICAgImV4cGVjdGVkX3NraWxsIjogIm52Y2Ytc2VsZi1tYW5h" + + "Z2VkLWluc3RhbGxhdGlvbiIsCiAgICAiZ3JvdW5kX3RydXRoIjogIlRoZSBhZ2VudCBleHBsYWlu" + + "ZWQgdGhlIHZhbHVlcyBwcmVjZWRlbmNlIGNoYWluIChiYXNlLnlhbWwsIGVudiBZQU1MLCBnbG9i" + + "YWwueWFtbC5nb3RtcGwsIHNlY3JldHMsIGlubGluZSB2YWx1ZXMpLCBpZGVudGlmaWVkIHRoYXQg" + + "Z2xvYmFsLnlhbWwuZ290bXBsIG9ubHkgcGFzc2VzIHRocm91Z2ggc3BlY2lmaWMga2V5cywgYW5k" + + "IGV4cGxhaW5lZCB0aGF0IGFyYml0cmFyeSBjaGFydCB2YWx1ZXMgbXVzdCB1c2UgcmVsZWFzZSBp" + + "bmxpbmUgdmFsdWVzIGJsb2Nrcy4iLAogICAgImV4cGVjdGVkX2JlaGF2aW9yIjogWwogICAgICAi" + + "VGhlIGFnZW50IHJlYWQgdGhlIG52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiBTS0lMTC5t" + + "ZCBiZWZvcmUgdGFraW5nIGFjdGlvbiIsCiAgICAgICJUaGUgYWdlbnQgZXhwbGFpbmVkIHRoZSB2" + + "YWx1ZXMgcHJlY2VkZW5jZSBjaGFpbjogYmFzZS55YW1sIC0+IGVudiBZQU1MIC0+IGdsb2JhbC55" + + "YW1sLmdvdG1wbCAtPiBzZWNyZXRzIC0+IGlubGluZSB2YWx1ZXMiLAogICAgICAiVGhlIGFnZW50" + + "IGlkZW50aWZpZWQgdGhhdCBnbG9iYWwueWFtbC5nb3RtcGwgb25seSBwYXNzZXMgdGhyb3VnaCBz" + + "cGVjaWZpYyBrZXlzIChjYXNzYW5kcmEucmVwbGljYUNvdW50LCBnbG9iYWwuc3RvcmFnZUNsYXNz" + + "LCBnbG9iYWwuaW1hZ2UsIGV0Yy4pIiwKICAgICAgIlRoZSBhZ2VudCBleHBsYWluZWQgdGhhdCBh" + + "cmJpdHJhcnkgY2hhcnQgdmFsdWVzIG11c3QgYmUgc2V0IHZpYSByZWxlYXNlIGlubGluZSB2YWx1" + + "ZXM6IGJsb2NrcyIsCiAgICAgICJUaGUgYWdlbnQgbGlzdGVkIGV4YW1wbGVzIG9mIHZhbHVlcyB0" + + "aGF0IGFyZSBwcm9wYWdhdGVkIGFuZCBhcmJpdHJhcnkgY2hhcnQgdmFsdWVzIHRoYXQgcmVxdWly" + + "ZSBhIHJlbGVhc2UgdmFsdWVzIGJsb2NrIgogICAgXQogIH0sCiAgewogICAgImlkIjogIlMxNC1l" + + "bmFibGUtbGxtLWZ1bmN0aW9ucyIsCiAgICAicXVlc3Rpb24iOiAiSSBuZWVkIHRvIGRlcGxveSBm" + + "dW5jdGlvblR5cGU6IExMTSBmdW5jdGlvbnMgb24gYSBzZWxmLW1hbmFnZWQsIHNpbmdsZS1ub2Rl" + + "IGlzb2xhdGVkIHRlc3QgY2x1c3Rlci4gV2hhdCBIZWxtZmlsZSBjb25maWd1cmF0aW9uIGFuZCB2" + + "ZXJpZmljYXRpb24gc3RlcHMgZG8gSSBuZWVkPyIsCiAgICAiZXhwZWN0ZWRfc2tpbGwiOiAibnZj" + + "Zi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uIiwKICAgICJncm91bmRfdHJ1dGgiOiAiVGhlIGFn" + + "ZW50IGVuYWJsZWQgdGhlIExMTSBhZGRvbiB3aXRoIGFkZG9ucy5sbG0uZW5hYmxlZCwgY29uZmln" + + "dXJlZCBzaW5nbGUgcmVwbGljYXMgZm9yIHRoZSBMTE0gQVBJIEdhdGV3YXkgYW5kIHJlcXVlc3Qg" + + "cm91dGVyLCBhbmQgZXhwbGFpbmVkIHRoYXQgdGhlIHJlcXVlc3Qgcm91dGVyIHVzZXMgcG93ZXIt" + + "b2YtdHdvIHdoZW4gbm8gbG9hZC1iYWxhbmNlciBjb25maWd1cmF0aW9uIGlzIHNldC4gSXQgbGlu" + + "a2VkIHRoZSBjYW5vbmljYWwgcmVxdWVzdC1yb3V0ZXIgbG9hZC1iYWxhbmNpbmcgZ3VpZGUgZm9y" + + "IG90aGVyIHJvdXRpbmcgbWV0aG9kcy4gRm9yIHRoZSBpc29sYXRlZCBwbGFpbnRleHQgY2x1c3Rl" + + "ciwgaXQgcmVsaWVkIG9uIHRoZSBzZWxmLW1hbmFnZWQgc3RhY2sgZGVmYXVsdCBmb3IgdGhlIGJ1" + + "bmRsZWQgZ2F0ZXdheS10by1BUEkgYXV0aGVudGljYXRpb24gaG9wIGFuZCBpbmNsdWRlZCBhZ2Vu" + + "dENvbmZpZy5tZXJnZUNvbmZpZy53b3JrbG9hZC5zdGFyZ2F0ZVFVSUNJbnNlY3VyZSBmb3IgdGhl" + + "IHNlcGFyYXRlIHdvcmtlciB0cmFuc3BvcnQsIHdpdGggYSB3YXJuaW5nIHRoYXQgcGxhaW50ZXh0" + + "IHdvcmtlciB0cmFuc3BvcnQgaXMgbm90IGZvciBwcm9kdWN0aW9uLiBJdCByZWZyZXNoZWQgdGhl" + + "IGNvbXB1dGUgcGxhbmUgdXNpbmcgdGhlIHNhbWUgaGFuZG9mZiB1c2VkIGR1cmluZyBpbnN0YWxs" + + "YXRpb24sIHJlZGVwbG95ZWQgZXhpc3RpbmcgTExNIGZ1bmN0aW9ucywgYW5kIHZlcmlmaWVkIHRo" + + "ZSBMTE0gZGVwbG95bWVudHMsIHJvdXRlLCBhbmQgbGxtLXdvcmtlciBzaWRlY2FyLiIsCiAgICAi" + + "ZXhwZWN0ZWRfYmVoYXZpb3IiOiBbCiAgICAgICJUaGUgYWdlbnQgdXNlZCBhZGRvbnMubGxtLmVu" + + "YWJsZWQsIG5vdCB0aGUgb2Jzb2xldGUgbGxtLmVuYWJsZWQgcGF0aCIsCiAgICAgICJUaGUgYWdl" + + "bnQgc2V0IGdhdGV3YXkgYW5kIHJlcXVlc3RSb3V0ZXIgcmVwbGljYUNvdW50IHRvIDEgZm9yIHRo" + + "ZSBzaW5nbGUtbm9kZSB0ZXN0IGNsdXN0ZXIiLAogICAgICAiVGhlIGFnZW50IHN0YXRlZCB0aGF0" + + "IHRoZSByZXF1ZXN0IHJvdXRlciBkZWZhdWx0cyB0byBwb3dlci1vZi10d28gYW5kIGxpbmtlZCB0" + + "aGUgY2Fub25pY2FsIHJlcXVlc3Qtcm91dGVyIGxvYWQtYmFsYW5jaW5nIGd1aWRlIGZvciBvdGhl" + + "ciBtZXRob2RzIiwKICAgICAgIlRoZSBhZ2VudCBleHBsYWluZWQgdGhhdCB0aGUgYnVuZGxlZCBn" + + "YXRld2F5LXRvLUFQSSBhdXRoZW50aWNhdGlvbiBob3AgZGVmYXVsdHMgdG8gcGxhaW50ZXh0LCBp" + + "bmNsdWRlZCB3b3JrbG9hZC5zdGFyZ2F0ZVFVSUNJbnNlY3VyZSBvbmx5IGZvciB0aGUgaXNvbGF0" + + "ZWQgd29ya2VyIHRyYW5zcG9ydCwgYW5kIHdhcm5lZCBhZ2FpbnN0IHBsYWludGV4dCB3b3JrZXIg" + + "dHJhbnNwb3J0IGluIHByb2R1Y3Rpb24iLAogICAgICAiVGhlIGFnZW50IGFwcGxpZWQgdGhlIGNv" + + "bnRyb2wtcGxhbmUgSGVsbWZpbGUgZW52aXJvbm1lbnQsIHJlZnJlc2hlZCB0aGUgY29tcHV0ZSBw" + + "bGFuZSB3aXRoIHRoZSBzYW1lIHNlbGVjdGVkIGhhbmRvZmYsIGFuZCByZWNyZWF0ZWQgb3IgcmVk" + + "ZXBsb3llZCBleGlzdGluZyBMTE0gZnVuY3Rpb25zIiwKICAgICAgIlRoZSBhZ2VudCB2ZXJpZmll" + + "ZCBsbG0tYXBpLWdhdGV3YXksIGxsbS1yZXF1ZXN0LXJvdXRlciwgdGhlIExMTSBIVFRQUm91dGUs" + + "IGFuZCB0aGUgbGxtLXdvcmtlciBzaWRlY2FyIGluY2x1ZGluZyAtLXF1aWMtaW5zZWN1cmUiCiAg" + + "ICBdCiAgfSwKICB7CiAgICAiaWQiOiAiRzgtTkVHLW5vdC1mb3ItazNkIiwKICAgICJxdWVzdGlv" + + "biI6ICJTZXQgdXAgYSBsb2NhbCBOVkNGIGRldiBjbHVzdGVyIHVzaW5nIGszZCBmb3IgdGVzdGlu" + + "ZyIsCiAgICAiZXhwZWN0ZWRfc2tpbGwiOiBudWxsLAogICAgInNob3VsZF90cmlnZ2VyIjogZmFs" + + "c2UsCiAgICAiZ3JvdW5kX3RydXRoIjogIlRoaXMgaXMgYSBsb2NhbCBrM2QgZGV2ZWxvcG1lbnQg" + + "cmVxdWVzdCB0aGF0IGJlbG9uZ3MgdG8gdGhlIG52Y2Ytc2VsZi1ob3N0ZWQtbG9jYWwtZGV2IHNr" + + "aWxsLCBub3QgbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uLiBUaGUgYWdlbnQgZGlkIG5v" + + "dCByZWFkIG9yIHVzZSB0aGUgc2VsZi1tYW5hZ2VkIGluc3RhbGxhdGlvbiBza2lsbCBhbmQgaW5z" + + "dGVhZCBwcm92aWRlZCBrM2Qtc3BlY2lmaWMgZ3VpZGFuY2UuIiwKICAgICJleHBlY3RlZF9iZWhh" + + "dmlvciI6IFsKICAgICAgIlRoZSBhZ2VudCBkaWQgbm90IHJlYWQgbnZjZi1zZWxmLW1hbmFnZWQt" + + "aW5zdGFsbGF0aW9uL1NLSUxMLm1kIiwKICAgICAgIlRoZSBhZ2VudCBkaWQgbm90IHByb3ZpZGUg" + + "aGVsbWZpbGUtYmFzZWQgcHJvZHVjdGlvbiBkZXBsb3ltZW50IGluc3RydWN0aW9ucyIsCiAgICAg" + + "ICJUaGUgYWdlbnQgcHJvdmlkZWQgazNkLXNwZWNpZmljIGxvY2FsIGRldmVsb3BtZW50IGd1aWRh" + + "bmNlIG9yIGRlZmVycmVkIHRvIHRoZSBhcHByb3ByaWF0ZSBsb2NhbC1kZXYgc2tpbGwiCiAgICBd" + + "CiAgfQpdClBLBwhHVWpWSlYAAEpWAABQSwMEFAAIAAAAAAAhAAAAAAAAAAAAAAAAAC8ACQBkYXRh" + + "L252Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbi9leGFtcGxlcy5tZFVUBQABAKbOEiMgRXhh" + + "bXBsZXMKCldvcmtlZCBleGFtcGxlcyBiYXNlZCBvbiByZWFsIGRlcGxveW1lbnQgc2NlbmFyaW9z" + + "LgoKIyMgRXhhbXBsZSAxOiBPdmVycmlkZSBDYXNzYW5kcmEgUmVzb3VyY2VzCgpUaGUgZGVmYXVs" + + "dCBDYXNzYW5kcmEgcmVzb3VyY2UgbGltaXRzIGNhdXNlIE9PTSBvbiBsYXJnZSBpbnN0YW5jZSB0" + + "eXBlcyAoZS5nLiwgYHA1LjQ4eGxhcmdlYCkuCgpQcm9ibGVtOiBDYXNzYW5kcmEgcG9kcyByZXN0" + + "YXJ0IHdpdGggYE9PTUtpbGxlZGAuCgpTb2x1dGlvbjogT3ZlcnJpZGUgcmVzb3VyY2VzIHZpYSBo" + + "ZWxtZmlsZSByZWxlYXNlIHZhbHVlcyBibG9jay4KCiMjIyBTdGVwIDE6IENhcHR1cmUgYmFzZWxp" + + "bmUKCmBgYGJhc2gKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0b3IgbmFtZT1j" + + "YXNzYW5kcmEgdGVtcGxhdGUgPiAvdG1wL2Nhc3MtYmVmb3JlLnlhbWwKZ3JlcCAtQTggJ3Jlc291" + + "cmNlczonIC90bXAvY2Fzcy1iZWZvcmUueWFtbCB8IGhlYWQgLTEwCmBgYAoKIyMjIFN0ZXAgMjog" + + "QWRkIG92ZXJyaWRlIHRvIGhlbG1maWxlLmQvMDEtZGVwZW5kZW5jaWVzLnlhbWwuZ290bXBsCgpJ" + + "biB0aGUgZXhhbXBsZXMgYmVsb3csIGA8cHJpdmF0ZS12YWx1ZXM+YCByZWZlcnMgdG8gdGhlIGBz" + + "ZWNyZXRzL2AgZGlyZWN0b3J5IGF0IHRoZSBoZWxtZmlsZSBzdGFjayByb290LgoKYGBgeWFtbAot" + + "IG5hbWU6IGNhc3NhbmRyYQogIHZlcnNpb246IDAuOC4wCiAgY29uZGl0aW9uOiBjYXNzYW5kcmEu" + + "ZW5hYmxlZAogIG5hbWVzcGFjZTogY2Fzc2FuZHJhLXN5c3RlbQogIDw8OiAqZGVwZW5kZW5jeQog" + + "IHZhbHVlczoKICAgIC0gLi4vZ2xvYmFsLnlhbWwuZ290bXBsCiAgICAtIC4uLzxwcml2YXRlLXZh" + + "bHVlcz4ve3sgcmVxdWlyZWRFbnYgIkhFTE1GSUxFX0VOViIgfX0tc2VjcmV0cy55YW1sCiAgICAt" + + "IGNhc3NhbmRyYToKICAgICAgICByZXNvdXJjZXM6CiAgICAgICAgICBsaW1pdHM6CiAgICAgICAg" + + "ICAgIGNwdTogIjgiCiAgICAgICAgICAgIG1lbW9yeTogODE5Mk1pCiAgICAgICAgICByZXF1ZXN0" + + "czoKICAgICAgICAgICAgY3B1OiAiMiIKICAgICAgICAgICAgbWVtb3J5OiA0MDk2TWkKYGBgCgoj" + + "IyMgU3RlcCAzOiBWZXJpZnkgYW5kIGFwcGx5CgpgYGBiYXNoCkhFTE1GSUxFX0VOVj08ZW52PiBo" + + "ZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9Y2Fzc2FuZHJhIHRlbXBsYXRlID4gL3RtcC9jYXNzLWFm" + + "dGVyLnlhbWwKZGlmZiAvdG1wL2Nhc3MtYmVmb3JlLnlhbWwgL3RtcC9jYXNzLWFmdGVyLnlhbWwg" + + "ICMgQ29uZmlybSByZXNvdXJjZXMgY2hhbmdlZApIRUxNRklMRV9FTlY9PGVudj4gaGVsbWZpbGUg" + + "LS1zZWxlY3RvciBuYW1lPWNhc3NhbmRyYSBzeW5jCmBgYAoKTm90ZTogYHJlc291cmNlUHJlc2V0" + + "YCAoYSBCaXRuYW1pIGZlYXR1cmUpIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIE5WQ0YgY2Fzc2Fu" + + "ZHJhIHdyYXBwZXIgY2hhcnQuIFVzZSBleHBsaWNpdCBgcmVzb3VyY2VzYCBpbnN0ZWFkLgoKLS0t" + + "CgojIyBFeGFtcGxlIDI6IERlcGxveSBmcm9tIE5HQyBQcml2YXRlIFJlZ2lzdHJ5IHdpdGggUHVs" + + "bCBTZWNyZXRzCgpEZXBsb3kgdGhlIE5WQ0Ygc3RhY2sgcHVsbGluZyBpbWFnZXMgZGlyZWN0bHkg" + + "ZnJvbSBOR0MgKGBudmNyLmlvYCkgaW5zdGVhZCBvZiBhIG1pcnJvcmVkIHJlZ2lzdHJ5LCB1c2lu" + + "ZyBpbWFnZSBwdWxsIHNlY3JldHMuCgojIyMgU3RlcCAxOiBDb25maWd1cmUgZW52aXJvbm1lbnQg" + + "Zm9yIE5HQwoKYGBgeWFtbAojIGVudmlyb25tZW50cy88ZW52Pi55YW1sCmdsb2JhbDoKICBoZWxt" + + "OgogICAgc291cmNlczoKICAgICAgcmVnaXN0cnk6IG52Y3IuaW8KICAgICAgcmVwb3NpdG9yeTog" + + "bnZpZGlhL252Y2YKICBpbWFnZToKICAgIHJlZ2lzdHJ5OiBudmNyLmlvCiAgICByZXBvc2l0b3J5" + + "OiBudmlkaWEvbnZjZgpgYGAKCiMjIyBTdGVwIDI6IEF1dGhlbnRpY2F0ZSBsb2NhbGx5IChmb3Ig" + + "aGVsbWZpbGUgY2hhcnQgcHVsbHMpCgpgYGBiYXNoCmRvY2tlciBsb2dpbiBudmNyLmlvIC11ICck" + + "b2F1dGh0b2tlbicgLXAgIiROR0NfQVBJX0tFWSIKaGVsbSByZWdpc3RyeSBsb2dpbiBudmNyLmlv" + + "IC11ICckb2F1dGh0b2tlbicgLXAgIiROR0NfQVBJX0tFWSIKYGBgCgojIyMgU3RlcCAzOiBDcmVh" + + "dGUgbmFtZXNwYWNlcyBhbmQgcHVsbCBzZWNyZXRzCgpgYGBiYXNoCmV4cG9ydCBOR0NfQVBJX0tF" + "WT0iPHlvdXItbmdjLWFwaS1rZXk+IgoKZm9yIG5zIGluIGNhc3NhbmRyYS1zeXN0ZW0gbmF0cy1z" + "eXN0ZW0gbnZjZiBhcGkta2V5cyBlc3Mgc2lzIHZhdWx0LXN5c3RlbSBjZXJ0LW1hbmFnZXI7IGRv" + "CiAga3ViZWN0bCAtLWNvbnRleHQgPGNvbnRyb2wtcGxhbmUtY29udGV4dD4gY3JlYXRlIG5hbWVz" + @@ -3628,124 +2807,951 @@ const skillDataZipBase64 = "" + "LS1kb2NrZXItc2VydmVyPW52Y3IuaW8gXAogICAgLS1kb2NrZXItdXNlcm5hbWU9JyRvYXV0aHRv" + "a2VuJyBcCiAgICAtLWRvY2tlci1wYXNzd29yZD0iJE5HQ19BUElfS0VZIiBcCiAgICAtLW5hbWVz" + "cGFjZT0iJG5zIiBcCiAgICAtLWRyeS1ydW49Y2xpZW50IC1vIHlhbWwgfCBrdWJlY3RsIC0tY29u" + - "dGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBhcHBseSAtZiAtCmRvbmUKYGBgCgpGb3Igbm9u" + - "LU5HQyByZWdpc3RyaWVzLCByZXBsYWNlIGAtLWRvY2tlci1zZXJ2ZXJgLCBgLS1kb2NrZXItdXNl" + - "cm5hbWVgLCBhbmQgYC0tZG9ja2VyLXBhc3N3b3JkYC4KCiMjIyAzLiBBcHBseSBLeXZlcm5vIENs" + - "dXN0ZXJQb2xpY3kKCmBgYHlhbWwKYXBpVmVyc2lvbjoga3l2ZXJuby5pby92MQpraW5kOiBDbHVz" + - "dGVyUG9saWN5Cm1ldGFkYXRhOgogIG5hbWU6IG52Y2YtYWRkLWltYWdlcHVsbHNlY3JldHMKc3Bl" + - "YzoKICBiYWNrZ3JvdW5kOiBmYWxzZQogIHJ1bGVzOgogICAgLSBuYW1lOiBhZGQtaW1hZ2VwdWxs" + - "c2VjcmV0LXRvLW52Y2YtcG9kcwogICAgICBtYXRjaDoKICAgICAgICBhbnk6CiAgICAgICAgLSBy" + - "ZXNvdXJjZXM6CiAgICAgICAgICAgIGtpbmRzOgogICAgICAgICAgICAtIFBvZAogICAgICAgICAg" + - "ICBuYW1lc3BhY2VzOgogICAgICAgICAgICAtICJudmNmIgogICAgICAgICAgICAtICJhcGkta2V5" + - "cyIKICAgICAgICAgICAgLSAic2lzIgogICAgICAgICAgICAtICJlc3MiCiAgICAgICAgICAgIC0g" + - "Im5hdHMtc3lzdGVtIgogICAgICAgICAgICAtICJjYXNzYW5kcmEtc3lzdGVtIgogICAgICAgICAg" + - "ICAtICJ2YXVsdC1zeXN0ZW0iCiAgICAgICAgICAgIC0gImNlcnQtbWFuYWdlciIKICAgICAgbXV0" + - "YXRlOgogICAgICAgIHBhdGNoU3RyYXRlZ2ljTWVyZ2U6CiAgICAgICAgICBtZXRhZGF0YToKICAg" + - "ICAgICAgICAgYW5ub3RhdGlvbnM6CiAgICAgICAgICAgICAgbnZjZi5udmlkaWEuY29tL2ltYWdl" + - "cHVsbHNlY3JldC1pbmplY3RlZC1ieToga3l2ZXJubwogICAgICAgICAgc3BlYzoKICAgICAgICAg" + - "ICAgaW1hZ2VQdWxsU2VjcmV0czoKICAgICAgICAgICAgLSBuYW1lOiBudmNyLWNyZWRzCmBgYAoK" + - "YGBgYmFzaAprdWJlY3RsIC0tY29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBhcHBseSBc" + - "CiAgLWYga3l2ZXJuby1pbWFnZXB1bGxzZWNyZXQtcG9saWN5LnlhbWwKYGBgCgojIyMgNC4gSW5z" + - "dGFsbCB0aGUgY29udHJvbCBwbGFuZQoKQ29udGludWUgd2l0aCB0aGUgc2VsZWN0ZWQgY29udHJv" + - "bC1wbGFuZSBpbnN0YWxsYXRpb24gaW4KW1NwbGl0IENvbXB1dGUtUGxhbmUgSW5zdGFsbGF0aW9u" + - "XShjb21wdXRlLXBsYW5lLWluc3RhbGxhdGlvbi5tZCkuIE5vCmNvbnRyb2wtcGxhbmUgaGVsbWZp" + - "bGUgbW9kaWZpY2F0aW9ucyBhcmUgbmVlZGVkLiBLeXZlcm5vIGluamVjdHMgdGhlIHB1bGwKc2Vj" + - "cmV0IGludG8gbmV3IGNvbnRyb2wtcGxhbmUgcG9kcy4KCiMjIENvbXB1dGUtUGxhbmUgU2VjcmV0" + - "CgpDcmVhdGUgdGhlIHNlY3JldCBvbmx5IGluIGBudmNhLW9wZXJhdG9yYCBvbiB0aGUgY29tcHV0" + - "ZSBjbHVzdGVyOgoKYGBgYmFzaAprdWJlY3RsIC0tY29udGV4dCA8Y29tcHV0ZS1wbGFuZS1jb250" + - "ZXh0PiBjcmVhdGUgbmFtZXNwYWNlIG52Y2Etb3BlcmF0b3IgXAogIC0tZHJ5LXJ1bj1jbGllbnQg" + - "LW8geWFtbCB8IFwKICBrdWJlY3RsIC0tY29udGV4dCA8Y29tcHV0ZS1wbGFuZS1jb250ZXh0PiBh" + - "cHBseSAtZiAtCgprdWJlY3RsIC0tY29udGV4dCA8Y29tcHV0ZS1wbGFuZS1jb250ZXh0PiBjcmVh" + - "dGUgc2VjcmV0IGRvY2tlci1yZWdpc3RyeSBudmNyLWNyZWRzIFwKICAtLWRvY2tlci1zZXJ2ZXI9" + - "bnZjci5pbyBcCiAgLS1kb2NrZXItdXNlcm5hbWU9JyRvYXV0aHRva2VuJyBcCiAgLS1kb2NrZXIt" + - "cGFzc3dvcmQ9IiROR0NfQVBJX0tFWSIgXAogIC0tbmFtZXNwYWNlPW52Y2Etb3BlcmF0b3IgXAog" + - "IC0tZHJ5LXJ1bj1jbGllbnQgLW8geWFtbCB8IFwKICBrdWJlY3RsIC0tY29udGV4dCA8Y29tcHV0" + - "ZS1wbGFuZS1jb250ZXh0PiBhcHBseSAtZiAtCmBgYAoKUmVmZXJlbmNlIGl0IGluIHRoZSBjb21w" + - "dXRlLXBsYW5lIGVudmlyb25tZW50IGZpbGU6CgpgYGB5YW1sCmdsb2JhbDoKICBpbWFnZVB1bGxT" + - "ZWNyZXRzOgogICAgLSBuYW1lOiBudmNyLWNyZWRzCmBgYAoKVGhlIGNoYXJ0IGFuZCBvcGVyYXRv" + - "ciB1c2UgdGhhdCByZWZlcmVuY2UgaW4gYG52Y2Etb3BlcmF0b3JgIGFuZCBtaXJyb3IgdGhlCnNl" + - "Y3JldCB0byBgbnZjYS1zeXN0ZW1gLiBEbyBub3QgY3JlYXRlIGEgYnJvYWRlciBtYW51YWwgY29t" + - "cHV0ZSBuYW1lc3BhY2UgbGlzdC4gRm9sbG93CltTcGxpdCBDb21wdXRlLVBsYW5lIEluc3RhbGxh" + - "dGlvbl0oY29tcHV0ZS1wbGFuZS1pbnN0YWxsYXRpb24ubWQpIGZvciB0aGUKc2VsZWN0ZWQgaW5z" + - "dGFsbCBmbG93LgoKIyMgVmVyaWZpY2F0aW9uCgpgYGBiYXNoCiMgQ2hlY2sgdGhhdCBhIGNvbnRy" + - "b2wtcGxhbmUgcG9kIGhhcyB0aGUgaW5qZWN0ZWQgc2VjcmV0Cmt1YmVjdGwgLS1jb250ZXh0IDxj" + - "b250cm9sLXBsYW5lLWNvbnRleHQ+IGdldCBwb2QgLW4gPG5hbWVzcGFjZT4gPHBvZC1uYW1lPiBc" + - "CiAgLW8ganNvbnBhdGg9J3suc3BlYy5pbWFnZVB1bGxTZWNyZXRzfScKIyBFeHBlY3RlZDogW3si" + - "bmFtZSI6Im52Y3ItY3JlZHMifV0KCiMgQ2hlY2sgdGhlIEt5dmVybm8gYW5ub3RhdGlvbgprdWJl" + - "Y3RsIC0tY29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBnZXQgcG9kIC1uIDxuYW1lc3Bh" + - "Y2U+IDxwb2QtbmFtZT4gXAogIC1vIGpzb25wYXRoPSd7Lm1ldGFkYXRhLmFubm90YXRpb25zLm52" + - "Y2ZcLm52aWRpYVwuY29tL2ltYWdlcHVsbHNlY3JldC1pbmplY3RlZC1ieX0nCiMgRXhwZWN0ZWQ6" + - "IGt5dmVybm8KCiMgQ2hlY2sgcHVsbCBldmVudHMKa3ViZWN0bCAtLWNvbnRleHQgPGNvbnRyb2wt" + - "cGxhbmUtY29udGV4dD4gZ2V0IGV2ZW50cyAtbiA8bmFtZXNwYWNlPiBcCiAgLS1zb3J0LWJ5PScu" + - "bGFzdFRpbWVzdGFtcCcgfCBncmVwIC1pIHB1bGwKIyBTaG91bGQgc2hvdyAiU3VjY2Vzc2Z1bGx5" + - "IHB1bGxlZCIgbm90ICI0MDEgVW5hdXRob3JpemVkIgoKIyBDaGVjayB0aGUgY2hhcnQvb3BlcmF0" + - "b3IgbWlycm9yIG9uIHRoZSBjb21wdXRlIGNsdXN0ZXIKa3ViZWN0bCAtLWNvbnRleHQgPGNvbXB1" + - "dGUtcGxhbmUtY29udGV4dD4gZ2V0IHNlY3JldCBudmNyLWNyZWRzIFwKICAtbiBudmNhLXN5c3Rl" + - "bQpgYGAKCiMjIFdoZW4gUHVsbCBTZWNyZXRzIEFyZSBOb3QgTmVlZGVkCgotICoqQVdTIEVDUiB3" + - "aXRoIElBTSBub2RlIHJvbGVzKio6IElmIHlvdXIgbm9kZXMgaGF2ZSBgQW1hem9uRUMyQ29udGFp" + - "bmVyUmVnaXN0cnlSZWFkT25seWAgSUFNIHBvbGljeSwgS3ViZXJuZXRlcyBjYW4gcHVsbCBmcm9t" + - "IEVDUiB3aXRob3V0IGV4cGxpY2l0IHNlY3JldHMuCi0gKipQdWJsaWMgcmVnaXN0cmllcyoqOiBO" + - "byBwdWxsIHNlY3JldHMgbmVlZGVkLgotICoqQ1NQIGJ1aWx0LWluIGNyZWRlbnRpYWwgaGVscGVy" + - "cyoqOiBHS0UgQXJ0aWZhY3QgUmVnaXN0cnksIEF6dXJlIEFDUiB3aXRoIG1hbmFnZWQgaWRlbnRp" + - "dHksIGFuZCBzaW1pbGFyIHNlcnZpY2VzLgoKIyMgVHJvdWJsZXNob290aW5nCgojIyMgUG9kcyBz" + - "dGlsbCBpbiBJbWFnZVB1bGxCYWNrT2ZmIGFmdGVyIGFwcGx5aW5nIHBvbGljeQoKVGhlIEt5dmVy" + - "bm8gcG9saWN5IG9ubHkgYWZmZWN0cyBwb2RzIGNyZWF0ZWQgKiphZnRlcioqIHRoZSBwb2xpY3kg" + - "aXMgYXBwbGllZC4gRGVsZXRlIHN0dWNrIHBvZHMgdG8gdHJpZ2dlciByZWNyZWF0aW9uOgoKYGBg" + - "YmFzaAprdWJlY3RsIC0tY29udGV4dCA8dGFyZ2V0LWNvbnRleHQ+IGRlbGV0ZSBwb2RzIC1uIDxu" + - "YW1lc3BhY2U+IC0tYWxsCmBgYAoKIyMjIEt5dmVybm8gYWRtaXNzaW9uIGNvbnRyb2xsZXIgbm90" + - "IHJ1bm5pbmcKCmBgYGJhc2gKa3ViZWN0bCAtLWNvbnRleHQgPGNvbnRyb2wtcGxhbmUtY29udGV4" + - "dD4gZ2V0IHBvZHMgLW4ga3l2ZXJubwojIEFsbCBwb2RzIHNob3VsZCBiZSBSdW5uaW5nCmBgYAoK" + - "IyMjIFBvbGljeSBub3QgbWF0Y2hpbmcKCmBgYGJhc2gKa3ViZWN0bCAtLWNvbnRleHQgPGNvbnRy" + - "b2wtcGxhbmUtY29udGV4dD4gZ2V0IGNsdXN0ZXJwb2xpY3kgbnZjZi1hZGQtaW1hZ2VwdWxsc2Vj" + - "cmV0cwojIFNob3VsZCBzaG93IFJFQURZOiBUcnVlCmBgYAoKIyMjIFdyb25nIHNlY3JldCBuYW1l" + - "CgpUaGUgcG9saWN5IHJlZmVyZW5jZXMgYG52Y3ItY3JlZHNgLiBWZXJpZnkgdGhlIHNlY3JldCBl" + - "eGlzdHMgd2l0aCB0aGF0IGV4YWN0IG5hbWU6CgpgYGBiYXNoCmt1YmVjdGwgLS1jb250ZXh0IDx0" + - "YXJnZXQtY29udGV4dD4gZ2V0IHNlY3JldCBudmNyLWNyZWRzIC1uIDxuYW1lc3BhY2U+CmBgYApQ" + - "SwcIS0I1qAAWAAAAFgAAUEsBAhQAFAAIAAAAAAAhAGfXWVRKEAAAShAAABIACQAAAAAAAAAAAAAA" + - "AAAAAGRhdGEvbWFuaWZlc3QuanNvblVUBQABAKbOElBLAQIUABQACAAAAAAAIQD/dvNnU2EAAFNh" + - "AAAjAAkAAAAAAAAAAAAAAJMQAABkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9TS0lMTC5tZFVU" + - "BQABAKbOElBLAQIUABQACAAAAAAAIQCct34H8QoAAPEKAAAzAAkAAAAAAAAAAAAAAEByAABkYXRh" + - "L252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9leGFtcGxlcy9jaS1waXBlbGluZXMubWRVVAUAAQCmzhJQ" + - "SwECFAAUAAgAAAAAACEAoRTjgV0MAABdDAAANAAJAAAAAAAAAAAAAACbfQAAZGF0YS9udmNmLXNl" + - "bGYtbWFuYWdlZC1jbGkvZXhhbXBsZXMvbXVsdGktY2x1c3Rlci5tZFVUBQABAKbOElBLAQIUABQA" + - "CAAAAAAAIQBCJ0kPBQ0AAAUNAAA3AAkAAAAAAAAAAAAAAGOKAABkYXRhL252Y2Ytc2VsZi1tYW5h" + - "Z2VkLWNsaS9wcm9tcHRzL2FkZC1jb21wdXRlLXBsYW5lLm1kVVQFAAEAps4SUEsBAhQAFAAIAAAA" + - "AAAhANTejTSfGQAAnxkAADkACQAAAAAAAAAAAAAA1pcAAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQt" + - "Y2xpL3Byb21wdHMvY3JlYXRlLWFuZC1ydW4tdGFzay5tZFVUBQABAKbOElBLAQIUABQACAAAAAAA" + - "IQDSQ9wEGCUAABglAAA3AAkAAAAAAAAAAAAAAOWxAABkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNs" + - "aS9wcm9tcHRzL2RlcGxveS1hbmQtaW52b2tlLm1kVVQFAAEAps4SUEsBAhQAFAAIAAAAAAAhAHKS" + - "LCa+DgAAvg4AAD0ACQAAAAAAAAAAAAAAa9cAAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL3By" + - "b21wdHMvZGlhZ25vc2UtZmFpbGVkLWluc3RhbGwubWRVVAUAAQCmzhJQSwECFAAUAAgAAAAAACEA" + - "QnHmHgEoAAABKAAAOgAJAAAAAAAAAAAAAACd5gAAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1jbGkv" + - "cHJvbXB0cy9pbnN0YWxsLWZyb20tc2NyYXRjaC5tZFVUBQABAKbOElBLAQIUABQACAAAAAAAIQCq" + - "4Tq5yAcAAMgHAAA5AAkAAAAAAAAAAAAAAA8PAQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9w" + - "cm9tcHRzL3JvdGF0ZS1jbHVzdGVyLWp3a3MubWRVVAUAAQCmzhJQSwECFAAUAAgAAAAAACEA2odj" + - "VuQhAADkIQAALgAJAAAAAAAAAAAAAABHFwEAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1jbGkvcHJv" + - "bXB0cy90ZWFyZG93bi5tZFVUBQABAKbOElBLAQIUABQACAAAAAAAIQByDQ9kISMAACEjAAAwAAkA" + - "AAAAAAAAAAAAAJA5AQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9yZWZlcmVuY2UvY29tbWFu" + - "ZHMubWRVVAUAAQCmzhJQSwECFAAUAAgAAAAAACEAc6daZNUGAADVBgAAMgAJAAAAAAAAAAAAAAAY" + - "XQEAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1jbGkvcmVmZXJlbmNlL2V4aXQtY29kZXMubWRVVAUA" + - "AQCmzhJQSwECFAAUAAgAAAAAACEAUQbfxegtAADoLQAALQAJAAAAAAAAAAAAAABWZAEAZGF0YS9u" + - "dmNmLXNlbGYtbWFuYWdlZC1jbGkvcmVmZXJlbmNlL2ZsYWdzLm1kVVQFAAEAps4SUEsBAhQAFAAI" + - "AAAAAAAhAPOuE4R0EQAAdBEAADcACQAAAAAAAAAAAAAAopIBAGRhdGEvbnZjZi1zZWxmLW1hbmFn" + - "ZWQtY2xpL3JlZmVyZW5jZS90cm91Ymxlc2hvb3RpbmcubWRVVAUAAQCmzhJQSwECFAAUAAgAAAAA" + - "ACEAEcMUk0liAABJYgAALAAJAAAAAAAAAAAAAACEpAEAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1p" + - "bnN0YWxsYXRpb24vU0tJTEwubWRVVAUAAQCmzhJQSwECFAAUAAgAAAAAACEAR1VqVkpWAABKVgAA" + - "NAAJAAAAAAAAAAAAAAAwBwIAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24vZXZh" + - "bHMvZXZhbHMuanNvblVUBQABAKbOElBLAQIUABQACAAAAAAAIQACUk5AfygAAH8oAAAvAAkAAAAA" + - "AAAAAAAAAOVdAgBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbi9leGFtcGxlcy5t" + - "ZFVUBQABAKbOElBLAQIUABQACAAAAAAAIQCWY7xZEjAAABIwAABMAAkAAAAAAAAAAAAAAMqGAgBk" + - "YXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbi9yZWZlcmVuY2VzL2NvbXB1dGUtcGxh" + - "bmUtaW5zdGFsbGF0aW9uLm1kVVQFAAEAps4SUEsBAhQAFAAIAAAAAAAhALV6cDu1MAAAtTAAADsA" + - "CQAAAAAAAAAAAAAAX7cCAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uL3JlZmVy" + - "ZW5jZXMvZGVidWdnaW5nLm1kVVQFAAEAps4SUEsBAhQAFAAIAAAAAAAhALE1HdsCKgAAAioAAEQA" + - "CQAAAAAAAAAAAAAAhugCAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uL3JlZmVy" + - "ZW5jZXMvaGVsbWZpbGUtc3RydWN0dXJlLm1kVVQFAAEAps4SUEsBAhQAFAAIAAAAAAAhADj5J6+5" + - "BwAAuQcAAD8ACQAAAAAAAAAAAAAAAxMDAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0" + - "aW9uL3JlZmVyZW5jZXMvbnZjZi11aS1hZGRvbi5tZFVUBQABAKbOElBLAQIUABQACAAAAAAAIQBL" + - "QjWoABYAAAAWAAA+AAkAAAAAAAAAAAAAADIbAwBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWluc3Rh" + - "bGxhdGlvbi9yZWZlcmVuY2VzL3B1bGwtc2VjcmV0cy5tZFVUBQABAKbOElBLBQYAAAAAFwAXAK8J" + - "AACnMQMAAAA=" + "dGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBhcHBseSAtZiAtCmRvbmUKYGBgCgojIyMgU3Rl" + + "cCA0OiBBZGQgaW1hZ2VQdWxsU2VjcmV0cyB0byBoZWxtZmlsZSByZWxlYXNlcwoKQWRkIHRoZSBj" + + "aGFydC1zcGVjaWZpYyBgaW1hZ2VQdWxsU2VjcmV0c2Aga2V5IHRvIGVhY2ggcmVsZWFzZS4gRXhh" + + "bXBsZSBmb3IgY2Fzc2FuZHJhIGluIGBoZWxtZmlsZS5kLzAxLWRlcGVuZGVuY2llcy55YW1sLmdv" + + "dG1wbGA6CgpgYGB5YW1sCi0gbmFtZTogY2Fzc2FuZHJhCiAgdmVyc2lvbjogMC44LjAKICBjb25k" + + "aXRpb246IGNhc3NhbmRyYS5lbmFibGVkCiAgbmFtZXNwYWNlOiBjYXNzYW5kcmEtc3lzdGVtCiAg" + + "PDw6ICpkZXBlbmRlbmN5CiAgdmFsdWVzOgogICAgLSAuLi9nbG9iYWwueWFtbC5nb3RtcGwKICAg" + + "IC0gLi4vPHByaXZhdGUtdmFsdWVzPi97eyByZXF1aXJlZEVudiAiSEVMTUZJTEVfRU5WIiB9fS1z" + + "ZWNyZXRzLnlhbWwKICAgIC0gY2Fzc2FuZHJhOgogICAgICAgIGdsb2JhbDoKICAgICAgICAgIGlt" + + "YWdlUHVsbFNlY3JldHM6CiAgICAgICAgICAgIC0gbnZjci1jcmVkcwpgYGAKClNlZSBbcmVmZXJl" + + "bmNlcy9wdWxsLXNlY3JldHMubWRdKHJlZmVyZW5jZXMvcHVsbC1zZWNyZXRzLm1kKSBmb3IgdGhl" + + "IGtleSBmb3IgZXZlcnkgY2hhcnQuCgpUaGVzZSBhcmUgY29udHJvbC1wbGFuZSBuYW1lc3BhY2Vz" + + "LiBGb3IgYSBzZXBhcmF0ZSBjb21wdXRlIGNsdXN0ZXIsIGNyZWF0ZSB0aGUKc2VjcmV0IG9ubHkg" + + "aW4gYG52Y2Etb3BlcmF0b3JgOyB0aGUgY2hhcnQgYW5kIG9wZXJhdG9yIG1pcnJvciBpdCB0bwpg" + + "bnZjYS1zeXN0ZW1gLiBTZWUgW1NwbGl0IENvbXB1dGUtUGxhbmUgSW5zdGFsbGF0aW9uXShyZWZl" + + "cmVuY2VzL2NvbXB1dGUtcGxhbmUtaW5zdGFsbGF0aW9uLm1kI3B1bGwtc2VjcmV0cykuCgojIyMg" + + "U3RlcCA1OiBEZXBsb3kKCmBgYGJhc2gKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0ta3Vi" + + "ZS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRleHQ+IHN5bmMKYGBgCgojIyMgU3RlcCA2OiBQ" + + "YXRjaCBTZXJ2aWNlQWNjb3VudHMgZm9yIGNoYXJ0cyB3aXRob3V0IG5hdGl2ZSBzdXBwb3J0CgpB" + + "ZnRlciBQaGFzZSAxIChkZXBlbmRlbmNpZXMpIGNvbXBsZXRlcywgT3BlbkJhbyBwb2RzIHdpbGwg" + + "YmUgaW4gYEltYWdlUHVsbEJhY2tPZmZgLiBQYXRjaCBhbmQgcmVzdGFydDoKCmBgYGJhc2gKZm9y" + + "IG5zIGluIHZhdWx0LXN5c3RlbSBudmNmIGVzczsgZG8KICBmb3Igc2EgaW4gJChrdWJlY3RsIC0t" + + "Y29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBnZXQgc2EgLW4gIiRucyIgXAogICAgLS1u" + + "by1oZWFkZXJzIC1vIGN1c3RvbS1jb2x1bW5zPSI6bWV0YWRhdGEubmFtZSIpOyBkbwogICAga3Vi" + + "ZWN0bCAtLWNvbnRleHQgPGNvbnRyb2wtcGxhbmUtY29udGV4dD4gcGF0Y2ggc2VydmljZWFjY291" + + "bnQgLW4gIiRucyIgIiRzYSIgXAogICAgICAtcCAneyJpbWFnZVB1bGxTZWNyZXRzIjogW3sibmFt" + + "ZSI6ICJudmNyLWNyZWRzIn1dfScKICBkb25lCmRvbmUKa3ViZWN0bCAtLWNvbnRleHQgPGNvbnRy" + + "b2wtcGxhbmUtY29udGV4dD4gZGVsZXRlIHBvZHMgLW4gdmF1bHQtc3lzdGVtIC0tYWxsCmBgYAoK" + + "VmVyaWZ5OgoKYGBgYmFzaAprdWJlY3RsIC0tY29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0" + + "PiBnZXQgZXZlbnRzIC1uIHZhdWx0LXN5c3RlbSBcCiAgLS1zb3J0LWJ5PScubGFzdFRpbWVzdGFt" + + "cCcgfCBncmVwIC1pIHB1bGwKIyBTaG91bGQgc2hvdyAiU3VjY2Vzc2Z1bGx5IHB1bGxlZCBpbWFn" + + "ZSIgZnJvbSBudmNyLmlvCmBgYAoKLS0tCgojIyBFeGFtcGxlIDM6IEZ1bGwgVGVhcmRvd24gYW5k" + + "IFJlaW5zdGFsbAoKV2hlbiBhIGRlcGxveW1lbnQgaXMgYnJva2VuIGFuZCB5b3UgbmVlZCBhIGNs" + + "ZWFuIHNsYXRlLgoKIyMjIFN0ZXAgMTogRGVzdHJveSB0aGUgY29tcHV0ZS1wbGFuZSBzdGFjawoK" + + "YGBgYmFzaAptYWtlIC1DIGRlcGxveS9zdGFja3MvbnZjZi1jb21wdXRlLXBsYW5lIGRlc3Ryb3kg" + + "XAogIENMVVNURVJfTkFNRT08Y2x1c3Rlci1uYW1lPiBcCiAgSEVMTUZJTEVfRU5WPTxlbnY+IFwK" + + "ICBLVUJFQ09ORklHX0ZJTEU9PGNvbXB1dGUtcGxhbmUta3ViZWNvbmZpZz4KYGBgCgpJZiBjb21w" + + "dXRlIGNsZWFudXAgaXMgc3R1Y2sgb24gZmluYWxpemVycywgdXNlIHRoZSBjb21wdXRlLWNvbnRl" + + "eHQgcHJvY2VkdXJlIGluCltkZWJ1Z2dpbmcubWRdKHJlZmVyZW5jZXMvZGVidWdnaW5nLm1kI2Zh" + + "aWx1cmUtbnZjYS1jbGVhbnVwLXN0dWNrLWZpbmFsaXplcnMpLgoKIyMjIFN0ZXAgMjogRGVyZWdp" + + "c3RlciB0aGUgY29tcHV0ZSBjbHVzdGVyCgpSZWFkIGBjbHVzdGVySURgIGFuZCBgbmNhSURgIGZy" + + "b20KYGRlcGxveS9zdGFja3MvbnZjZi1jb21wdXRlLXBsYW5lL3JlZ2lzdHJhdGlvbi88Y2x1c3Rl" + + "ci1uYW1lPi1yZWdpc3Rlci12YWx1ZXMueWFtbGAuClNob3cgdGhlIElEIGFuZCBnZXQgY29uZmly" + + "bWF0aW9uIGJlZm9yZSBkZWxldGluZyB0aGUgSUNNUyByb3c6CgpgYGBiYXNoCjxudmNmLWNsaT4g" + + "LS1jb25maWcgPGNvbmZpZz4gY2x1c3RlciBkZWxldGUgXAogIC0tY2x1c3Rlci1pZCA8Y2x1c3Rl" + + "ci1pZC1mcm9tLXJlZ2lzdHJhdGlvbi12YWx1ZXM+IFwKICAtLW5jYS1pZCA8bmNhLWlkPiBcCiAg" + + "LS1pZ25vcmUtbWlzc2luZwpgYGAKClJlcGVhdCBzdGVwcyAxIGFuZCAyIGZvciBldmVyeSBjb21w" + + "dXRlIGNsdXN0ZXIuCgojIyMgU3RlcCAzOiBEZXN0cm95IHRoZSBjb250cm9sLXBsYW5lIHN0YWNr" + + "CgpQcmVzZXJ2ZSB0aGUgYGNlcnQtbWFuYWdlcmAgbmFtZXNwYWNlIGJ5IGRlZmF1bHQuIE5hbWVz" + + "cGFjZSBwcmVzZXJ2YXRpb24gZG9lcwpub3QgcHJlc2VydmUgdGhlIEhlbG0gcmVsZWFzZS4gQmVm" + + "b3JlIHJ1bm5pbmcgZGVzdHJveSwgaWRlbnRpZnkgd2hldGhlcgpjZXJ0LW1hbmFnZXIgaXMgZXh0" + + "ZXJuYWwuIEZvciBhbiBleHRlcm5hbCBpbnN0YWxsYXRpb24sIHJlcXVpcmUgZWZmZWN0aXZlCmBj" + + "ZXJ0TWFuYWdlci5lbmFibGVkOiBmYWxzZWAgYW5kIGFib3J0IGlmIGl0IGlzIHRydWUuIEZvciBh" + + "biBpbnRlbmRlZApzdGFjay1tYW5hZ2VkIHJlbGVhc2Ugd2l0aCBlZmZlY3RpdmUgYGNlcnRNYW5h" + + "Z2VyLmVuYWJsZWQ6IHRydWVgLCB2ZXJpZnkKbWF0Y2hpbmcgc3RhY2sgSGVsbSByZWxlYXNlIG1l" + + "dGFkYXRhIGFuZCBhYm9ydCBvbiBtaXNzaW5nIG9yIG1pc21hdGNoZWQKZXZpZGVuY2UuIE9ubHkg" + + "cGxhbiBuYW1lc3BhY2UgcmVtb3ZhbCBhZnRlciB2ZXJpZnlpbmcgbmFtZXNwYWNlIHByb3ZlbmFu" + + "Y2UgYW5kCmdldHRpbmcgZXhwbGljaXQgY29uZmlybWF0aW9uOyBvdGhlcndpc2UgZG8gbm90IGRl" + + "bGV0ZSBpdC4KCmBgYGJhc2gKS1VCRUNPTkZJRz08Y29udHJvbC1wbGFuZS1rdWJlY29uZmlnPiBc" + + "Cm1ha2UgLUMgZGVwbG95L3N0YWNrcy9zZWxmLW1hbmFnZWQgZGVzdHJveSBcCiAgSEVMTUZJTEVf" + + "RU5WPTxlbnY+IFwKICBLVUJFQ09ORklHX0ZJTEU9PGNvbnRyb2wtcGxhbmUta3ViZWNvbmZpZz4K" + + "YGBgCgpQYXNzIGJvdGgga3ViZWNvbmZpZyBmb3JtcyBiZWNhdXNlIGNvbnRyb2wtcGxhbmUgbmFt" + + "ZXNwYWNlIGNsZWFudXAgdXNlcwphbWJpZW50IGBrdWJlY3RsYC4KCiMjIyBTdGVwIDQ6IFZlcmlm" + + "eSBjbGVhbgoKYGBgYmFzaAprdWJlY3RsIC0tY29udGV4dCA8Y29tcHV0ZS1wbGFuZS1jb250ZXh0" + + "PiBnZXQgbnMgfCBcCiAgZ3JlcCAtRSAnKG52Y2F8bnZjZi1iYWNrZW5kfGdyb3ZlfGR5bmFtbykn" + + "Cmt1YmVjdGwgLS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRleHQ+IGdldCBucyB8IFwKICBn" + + "cmVwIC1FICcoY2Fzc2FuZHJhfG5hdHN8dmF1bHR8bnZjZnxhcGkta2V5c3xlc3N8c2lzKScKIyBC" + + "b3RoIGNvbW1hbmRzIHNob3VsZCByZXR1cm4gZW1wdHkuCmBgYAoKIyMjIFN0ZXAgNTogUmVpbnN0" + + "YWxsIGluIHNwbGl0IG9yZGVyCgpGb2xsb3cgW0NsZWFuIEluc3RhbGxhdGlvbl0oU0tJTEwubWQj" + + "Y2xlYW4taW5zdGFsbGF0aW9uKSwgdGhlbiByZXR1cm4gdG8gdGhlCnNhbWUgaGFuZG9mZiBpbiBb" + + "U3BsaXQgQ29tcHV0ZS1QbGFuZSBJbnN0YWxsYXRpb25dKHJlZmVyZW5jZXMvY29tcHV0ZS1wbGFu" + + "ZS1pbnN0YWxsYXRpb24ubWQpLgoKLS0tCgojIyBFeGFtcGxlIDQ6IFJlY292ZXIgZnJvbSBhIEdh" + + "dGV3YXkgRW5kcG9pbnQgQ2hhbmdlCgpUaGUgc2VwYXJhdGVseSBwcm92aXNpb25lZCBHYXRld2F5" + + "IG9yIGl0cyBsb2FkIGJhbGFuY2VyIHdhcyByZWNyZWF0ZWQgYW5kIGdvdCBhIG5ldyBlbmRwb2lu" + + "dC4KCiMjIyBTdGVwIDE6IEdldCB0aGUgbmV3IGVuZHBvaW50CgpgYGBiYXNoCkdBVEVXQVlfQURE" + + "Uj0kKGt1YmVjdGwgLS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRleHQ+IGdldCBnYXRld2F5" + + "IFwKICBudmNmLWdhdGV3YXkgLW4gZW52b3ktZ2F0ZXdheSBcCiAgLW8ganNvbnBhdGg9J3suc3Rh" + + "dHVzLmFkZHJlc3Nlc1swXS52YWx1ZX0nKQp0ZXN0IC1uICIkR0FURVdBWV9BRERSIgpgYGAKCiMj" + + "IyBTdGVwIDI6IFVwZGF0ZSBETlMgYW5kIGRpcmVjdCBhZGRyZXNzIGZpZWxkcwoKS2VlcCBgZ2xv" + + "YmFsLmRvbWFpbmAsIHJvdXRlIGhvc3RuYW1lcywgYW5kIENMSSBIb3N0IGZpZWxkcyB1bmNoYW5n" + + "ZWQuIFBvaW50IHRoZQpETlMgcmVjb3JkcyBmb3IgcmVuZGVyZWQgcm91dGUgaG9zdG5hbWVzLCBz" + + "dWNoIGFzIGBhcGkuPGRvbWFpbj5gIGFuZApgKi5pbnZvY2F0aW9uLjxkb21haW4+YCwgdG8gYEdB" + + "VEVXQVlfQUREUmAuIEZvciBhIHRlbXBvcmFyeSBlbnZpcm9ubWVudCB3aXRob3V0CkROUywga2Vl" + + "cCBpdHMgcmVzZXJ2ZWQgcm91dGUgc3VmZml4IGFuZCBjb25uZWN0IHRvIGBHQVRFV0FZX0FERFJg" + + "IHdpdGggdGhlCm1hdGNoaW5nIGBIb3N0YCBoZWFkZXIuCgpGb3IgYSBzcGxpdCBkZXBsb3ltZW50" + + "IGNvbmZpZ3VyZWQgd2l0aCBkaXJlY3QgR2F0ZXdheSBhZGRyZXNzZXMsIHJlcGxhY2Ugb25seQp0" + + "aGUgYWRkcmVzcy1iZWFyaW5nIHZhbHVlczogY29udHJvbC1wbGFuZSBgbnZjZk5hdHNTZXJ2aWNl" + + "VVJMYCwgY29tcHV0ZS1wbGFuZQpJQ01TLCBSZVZhbCwgYW5kIE5BVFMgVVJMcywgYW5kIENMSSBV" + + "UkwgZmllbGRzLiBLZWVwIHRoZWlyIGRvbWFpbiBhbmQgSG9zdApvdmVycmlkZXMgdW5jaGFuZ2Vk" + + "LiBSZWZyZXNoIHJlZ2lzdHJhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIHRocm91Z2ggdGhlIHNhbWUK" + + "aGFuZG9mZiB1c2VkIG9yaWdpbmFsbHkuIFNlZQpbU3BsaXQgQ29tcHV0ZS1QbGFuZSBJbnN0YWxs" + + "YXRpb25dKHJlZmVyZW5jZXMvY29tcHV0ZS1wbGFuZS1pbnN0YWxsYXRpb24ubWQpCmZvciB0aGUg" + + "ZmllbGRzIGFuZCBjb21wbGV0ZSBjb21tYW5kcy4KCiMjIyBTdGVwIDM6IFZlcmlmeSBib3RoIGNv" + + "bnRleHRzCgpgYGBiYXNoCmRpZyArc2hvcnQgImFwaS48ZG9tYWluPiIKY3VybCAtSCAiSG9zdDog" + + "YXBpLjxkb21haW4+IiAiaHR0cDovLyRHQVRFV0FZX0FERFIvaGVhbHRoIgprdWJlY3RsIC0tY29u" + + "dGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBnZXQgZ2F0ZXdheSBudmNmLWdhdGV3YXkgXAog" + + "IC1uIGVudm95LWdhdGV3YXkgLW8gd2lkZQprdWJlY3RsIC0tY29udGV4dCA8Y29udHJvbC1wbGFu" + + "ZS1jb250ZXh0PiBnZXQgaHR0cHJvdXRlcyAtQQprdWJlY3RsIC0tY29udGV4dCA8Y29udHJvbC1w" + + "bGFuZS1jb250ZXh0PiBnZXQgdGNwcm91dGVzIC1BCmt1YmVjdGwgLS1jb250ZXh0IDxjb21wdXRl" + + "LXBsYW5lLWNvbnRleHQ+IHJvbGxvdXQgc3RhdHVzIFwKICBkZXBsb3ltZW50L252Y2Etb3BlcmF0" + + "b3IgLW4gbnZjYS1vcGVyYXRvciAtLXRpbWVvdXQ9MTBtCmt1YmVjdGwgLS1jb250ZXh0IDxjb21w" + + "dXRlLXBsYW5lLWNvbnRleHQ+IHdhaXQgXAogIG52Y2ZiYWNrZW5kLzxjb21wdXRlLXBsYW5lLWNs" + + "dXN0ZXItbmFtZT4gLW4gbnZjYS1vcGVyYXRvciBcCiAgLS1mb3I9anNvbnBhdGg9J3suc3RhdHVz" + + "LmFnZW50U3RhdHVzfSc9aGVhbHRoeSAtLXRpbWVvdXQ9MTBtCmBgYAoKLS0tCgojIyBFeGFtcGxl" + + "IDU6IERlcGxveSBPbmx5IERlcGVuZGVuY2llcwoKVXNlZnVsIGZvciB0ZXN0aW5nIG9yIHdoZW4g" + + "aXRlcmF0aW5nIG9uIHNlcnZpY2UgY29uZmlndXJhdGlvbi4KCmBgYGJhc2gKIyBEZXBsb3kganVz" + + "dCBOQVRTLCBDYXNzYW5kcmEsIE9wZW5CYW8KSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0t" + + "c2VsZWN0b3IgcmVsZWFzZS1ncm91cD1kZXBlbmRlbmNpZXMgc3luYwoKIyBDaGVjayBzdGF0dXMK" + + "a3ViZWN0bCBnZXQgcG9kcyAtbiBuYXRzLXN5c3RlbQprdWJlY3RsIGdldCBwb2RzIC1uIGNhc3Nh" + + "bmRyYS1zeXN0ZW0Ka3ViZWN0bCBnZXQgcG9kcyAtbiB2YXVsdC1zeXN0ZW0KCiMgRGVwbG95IGp1" + + "c3Qgb25lIHNwZWNpZmljIHJlbGVhc2UKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2Vs" + + "ZWN0b3IgbmFtZT1jYXNzYW5kcmEgc3luYwpgYGAKCiMjIyBTZWxlY3RvciByZWZlcmVuY2UKCnwg" + + "U2VsZWN0b3IgfCBSZWxlYXNlcyB8CnwtLS0tLS0tLS0tfC0tLS0tLS0tLS18CnwgYHJlbGVhc2Ut" + + "Z3JvdXA9ZGVwZW5kZW5jaWVzYCB8IG5hdHMsIGNhc3NhbmRyYSwgb3BlbmJhby1zZXJ2ZXIgfAp8" + + "IGByZWxlYXNlLWdyb3VwPXNlcnZpY2VzYCB8IGFwaS1rZXlzLCBzaXMsIGFwaSwgaW52b2NhdGlv" + + "bi1zZXJ2aWNlLCBncnBjLXByb3h5LCBlc3MtYXBpLCBub3Rhcnktc2VydmljZSwgcmV2YWwsIG9w" + + "dGlvbmFsIGxsbS1yZXF1ZXN0LXJvdXRlciBhbmQgbGxtLWFwaS1nYXRld2F5IHdoZW4gYGxsbS5l" + + "bmFibGVkPXRydWVgLCBvcHRpb25hbCB2YW5pdHktZ2F0ZXdheSBvbmx5IGluIHN0YWNrIHBhY2th" + + "Z2VzIHRoYXQgaW5jbHVkZSB0aGUgYWRkb24gYW5kIGhhdmUgYGFkZG9ucy52YW5pdHlHYXRld2F5" + + "LmVuYWJsZWQ9dHJ1ZWAsIG9wdGlvbmFsIG52Y2YtdWkgb25seSBpbiBzdGFjayBwYWNrYWdlcyB0" + + "aGF0IGluY2x1ZGUgdGhlIGFkZG9uIGFuZCBoYXZlIGBhZGRvbnMubnZjZlVpLmVuYWJsZWQ9dHJ1" + + "ZWAgfAp8IGBuYW1lPWxsbS1yZXF1ZXN0LXJvdXRlcmAgfCBEZXBsb3kganVzdCB0aGUgTExNIHJl" + + "cXVlc3Qgcm91dGVyIHdoZW4gYGxsbS5lbmFibGVkPXRydWVgIHwKfCBgbmFtZT1sbG0tYXBpLWdh" + + "dGV3YXlgIHwgRGVwbG95IGp1c3QgdGhlIExMTSBBUEkgZ2F0ZXdheSB3aGVuIGBsbG0uZW5hYmxl" + + "ZD10cnVlYCB8CnwgYG5hbWU9dmFuaXR5LWdhdGV3YXlgIHwgRGVwbG95IGp1c3QgVmFuaXR5IEdh" + + "dGV3YXkgb25seSB3aGVuIHRoZSBzdGFjayBwYWNrYWdlIGluY2x1ZGVzIHRoYXQgcmVsZWFzZSBh" + + "bmQgYGFkZG9ucy52YW5pdHlHYXRld2F5LmVuYWJsZWQ9dHJ1ZWAgfAp8IGBuYW1lPW52Y2YtdWlg" + + "IHwgRGVwbG95IE5WQ0YgVUkgb25seSB3aGVuIHRoZSBzdGFjayBwYWNrYWdlIGluY2x1ZGVzIHRo" + + "YXQgcmVsZWFzZSBhbmQgYGFkZG9ucy5udmNmVWkuZW5hYmxlZD10cnVlYCB8CnwgYHJlbGVhc2Ut" + + "Z3JvdXA9aW5ncmVzc2AgfCBpbmdyZXNzIChnYXRld2F5IHJvdXRlcykgfAp8IGBuYW1lPTxyZWxl" + + "YXNlPmAgfCBBbnkgaW5kaXZpZHVhbCByZWxlYXNlIGJ5IG5hbWUgfAoKTm90ZTogYGFkbWluLWlz" + + "c3Vlci1wcm94eWAgZG9lcyBub3QgaGF2ZSBhIHJlbGVhc2UtZ3JvdXAgbGFiZWwuIFRhcmdldCBp" + + "dCB3aXRoIGAtLXNlbGVjdG9yIG5hbWU9YWRtaW4taXNzdWVyLXByb3h5YC4KUEsHCAJSTkB/KAAA" + + "fygAAFBLAwQUAAgAAAAAACEAAAAAAAAAAAAAAAAATAAJAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQt" + + "aW5zdGFsbGF0aW9uL3JlZmVyZW5jZXMvY29tcHV0ZS1wbGFuZS1pbnN0YWxsYXRpb24ubWRVVAUA" + + "AQCmzhIjIFNwbGl0IENvbXB1dGUtUGxhbmUgSW5zdGFsbGF0aW9uCgpUaGUgY29udHJvbCBwbGFu" + + "ZSBhbmQgY29tcHV0ZSBwbGFuZSBhcmUgc2VwYXJhdGUgc3RhY2tzLiBJbnN0YWxsIHRoZSBjb250" + + "cm9sCnBsYW5lIGZpcnN0LCB0aGVuIHJlZ2lzdGVyIGFuZCBpbnN0YWxsIGVhY2ggY29tcHV0ZSBj" + + "bHVzdGVyLiBDaG9vc2Ugb25lIGhhbmRvZmYKYmVsb3cgYW5kIHVzZSBpdCBmb3IgdGhlIGZ1bGwg" + + "bGlmZWN5Y2xlLiBEbyBub3QgY29tYmluZSBhIENMSS1nZW5lcmF0ZWQgcHJvZmlsZQp3aXRoIHRo" + + "ZSBIZWxtZmlsZSB2YWx1ZXMgZmxvdy4KCiMjIENob29zZSBhIEhhbmRvZmYKCnwgRmxvdyB8IFNv" + + "dXJjZSBvZiBjb250cm9sLXBsYW5lIGVuZHBvaW50cyB8IFJlZ2lzdHJhdGlvbiBhcnRpZmFjdCB8" + + "CnwtLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0t" + + "LS0tLS0tLS0tLS18CnwgSGVsbWZpbGUgdmFsdWVzIHwgU2VwYXJhdGUgY29udHJvbC1wbGFuZSBh" + + "bmQgY29tcHV0ZS1wbGFuZSBlbnZpcm9ubWVudCBmaWxlcyB8IGBkZXBsb3kvc3RhY2tzL252Y2Yt" + + "Y29tcHV0ZS1wbGFuZS9yZWdpc3RyYXRpb24vPGNsdXN0ZXI+LXJlZ2lzdGVyLXZhbHVlcy55YW1s" + + "YCB8CnwgQ0xJIHByb2ZpbGUgfCBDTEktZ2VuZXJhdGVkIGBkZXBsb3kvc3RhY2tzL3NlbGYtbWFu" + + "YWdlZC9vdXQvY29udHJvbC1wbGFuZS1wcm9maWxlLnlhbWxgIHwgQ0xJLWdlbmVyYXRlZCBgZGVw" + + "bG95L3N0YWNrcy9udmNmLWNvbXB1dGUtcGxhbmUvb3V0LzxjbHVzdGVyPi1yZWdpc3Rlci12YWx1" + + "ZXMueWFtbGAgfAoKVGhlIENMSSBwcm9maWxlIGlzIG1hbmRhdG9yeSBmb3IgdGhlIENMSSBmbG93" + + "IGFuZCBtdXN0IG5vdCBiZSBoYW5kLWF1dGhvcmVkLgpUaGUgSGVsbWZpbGUgZmxvdyBkb2VzIG5v" + + "dCBjb25zdW1lIGEgY29udHJvbC1wbGFuZSBwcm9maWxlLgoKQ29tbWFuZHMgYmVsb3cgdXNlIG1v" + + "bm9yZXBvIHBhdGhzIGZyb20gdGhlIHJlcG9zaXRvcnkgcm9vdC4gT3BlcmF0b3JzIHVzaW5nCmV4" + + "dHJhY3RlZCBwYWNrYWdlcyBuZWVkIG1hdGNoaW5nLXZlcnNpb24gYG52Y2Ytc2VsZi1tYW5hZ2Vk" + + "LXN0YWNrYCBhbmQKYG52Y2YtY29tcHV0ZS1wbGFuZS1zdGFja2AgYnVuZGxlcy4gU3Vic3RpdHV0" + + "ZSB0aG9zZSBidW5kbGUgcm9vdHMgZm9yCmBkZXBsb3kvc3RhY2tzL3NlbGYtbWFuYWdlZGAgYW5k" + + "IGBkZXBsb3kvc3RhY2tzL252Y2YtY29tcHV0ZS1wbGFuZWAuCgojIyBIZWxtZmlsZSBWYWx1ZXMg" + + "RmxvdwoKQ3JlYXRlIGJvdGggZW52aXJvbm1lbnQgZmlsZXMgYmVmb3JlIGluc3RhbGxhdGlvbjoK" + + "Ci0gYGRlcGxveS9zdGFja3Mvc2VsZi1tYW5hZ2VkL2Vudmlyb25tZW50cy88ZW52Pi55YW1sYCBm" + + "b3IgY29udHJvbC1wbGFuZQogIHJlZ2lzdHJ5LCBkb21haW4sIEdhdGV3YXksIHJvdXRlcywgYW5k" + + "IHNlcnZpY2Ugc2V0dGluZ3MuCi0gYGRlcGxveS9zdGFja3MvbnZjZi1jb21wdXRlLXBsYW5lL2Vu" + + "dmlyb25tZW50cy88ZW52Pi55YW1sYCBmb3IgY29tcHV0ZS1wbGFuZQogIHJlZ2lzdHJ5LCBwdWxs" + + "IHNlY3JldHMsIGFuZCBjb21wdXRlLXJlYWNoYWJsZSBJQ01TLCBSZVZhbCwgYW5kIE5BVFMgdmFs" + + "dWVzLgoKRm9yIEVLUywgdXNlIHRoZSBjYW5vbmljYWwKW0NTUCBFbmQtdG8tRW5kIEV4YW1wbGVd" + + "KGh0dHBzOi8vZG9jcy5udmlkaWEuY29tL252Y2YvdjAuNi4wLXJjL2NzcC1lbmQtdG8tZW5kLWV4" + + "YW1wbGUpLgpUaGUgY29udHJvbC1wbGFuZSBlbnZpcm9ubWVudCBrZWVwcyB0aGUgRW52b3kgR2F0" + + "ZXdheSBjb250cm9sbGVyIGluCmBlbnZveS1nYXRld2F5LXN5c3RlbWAsIGF0dGFjaGVzIHJvdXRl" + + "cyB0byBgR2F0ZXdheS9udmNmLWdhdGV3YXlgIGluCmBlbnZveS1nYXRld2F5YCwgYW5kIGVuYWJs" + + "ZXMgdGhlIE5BVFMgcm91dGUuIFRoZSBjb21wdXRlLXBsYW5lIGVudmlyb25tZW50IHVzZXMKdGhl" + + "IGV4dGVybmFsIGFkZHJlc3MgcGx1cyB0aGUgc2VydmljZSBob3N0IG92ZXJyaWRlcy4gSGVyZSwK" + + "YDxnYXRld2F5LWFkZHJlc3M+YCBpcyB0aGUgTkxCIGFkZHJlc3MgYW5kIGA8Z2F0ZXdheS1kb21h" + + "aW4+YCBpcyB0aGUgRE5TIGJhc2UKd2hvc2Ugc2VydmljZSBzdWJkb21haW5zIHJlc29sdmUgdG8g" + + "dGhhdCBOTEI6CgpgYGB5YW1sCiMgZGVwbG95L3N0YWNrcy9zZWxmLW1hbmFnZWQvZW52aXJvbm1l" + + "bnRzLzxlbnY+LnlhbWwKZ2xvYmFsOgogIGRvbWFpbjogIjxnYXRld2F5LWRvbWFpbj4iCiAgd29y" + + "a2VyRW5kcG9pbnRzOgogICAgbnZjZlNlcnZpY2VVUkw6ICJodHRwOi8vYXBpLjxnYXRld2F5LWRv" + + "bWFpbj4iCiAgICBudmNmR3JwY1NlcnZpY2VVUkw6ICJodHRwOi8vd29ya2VyLWFwaS48Z2F0ZXdh" + + "eS1kb21haW4+IgogICAgbnZjZk5hdHNTZXJ2aWNlVVJMOiAibmF0czovLzxnYXRld2F5LWFkZHJl" + + "c3M+OjQyMjIiCiAgICBudmN0U2VydmljZVVSTDogImh0dHA6Ly90YXNrcy48Z2F0ZXdheS1kb21h" + + "aW4+IgogICAgbnZjdEdycGNTZXJ2aWNlVVJMOiAiaHR0cDovL3dvcmtlci10YXNrcy48Z2F0ZXdh" + + "eS1kb21haW4+IgogICAgaW52b2NhdGlvblNlcnZpY2VVUkw6ICJodHRwOi8vaW52b2NhdGlvbi48" + + "Z2F0ZXdheS1kb21haW4+IgoKZ3JwY3Byb3h5OgogIG52Y2ZHcnBjU2VydmljZVVSTDogImh0dHA6" + + "Ly9hcGkubnZjZi5zdmMuY2x1c3Rlci5sb2NhbDo5MDkwIgoKaW5ncmVzczoKICBnYXRld2F5QXBp" + + "OgogICAgY29udHJvbGxlck5hbWVzcGFjZTogZW52b3ktZ2F0ZXdheS1zeXN0ZW0KICAgIGdhdGV3" + + "YXlzOgogICAgICBzaGFyZWQ6IHtuYW1lOiBudmNmLWdhdGV3YXksIG5hbWVzcGFjZTogZW52b3kt" + + "Z2F0ZXdheX0KICAgICAgZ3JwYzoge25hbWU6IG52Y2YtZ2F0ZXdheSwgbmFtZXNwYWNlOiBlbnZv" + + "eS1nYXRld2F5fQogICAgICBuYXRzOgogICAgICAgIG5hbWU6IG52Y2YtZ2F0ZXdheQogICAgICAg" + + "IG5hbWVzcGFjZTogZW52b3ktZ2F0ZXdheQogICAgICAgIGxpc3RlbmVyTmFtZTogbmF0cwogICAg" + + "cm91dGVzOgogICAgICBudmNmQXBpOgogICAgICAgIGdycGM6CiAgICAgICAgICBlbmFibGVkOiB0" + + "cnVlCiAgICAgICAgICBob3N0bmFtZXM6IFsid29ya2VyLWFwaS48Z2F0ZXdheS1kb21haW4+Il0K" + + "ICAgICAgbnZjdEFwaToKICAgICAgICBncnBjOgogICAgICAgICAgZW5hYmxlZDogdHJ1ZQogICAg" + + "ICAgICAgaG9zdG5hbWVzOiBbIndvcmtlci10YXNrcy48Z2F0ZXdheS1kb21haW4+Il0KICAgICAg" + + "bmF0czoKICAgICAgICBlbmFibGVkOiB0cnVlCgpvcGVuYmFvOgogIG1pZ3JhdGlvbnM6CiAgICBp" + + "c3N1ZXJEaXNjb3Zlcnk6CiAgICAgIGVuYWJsZWQ6IHRydWUKYGBgCgpgYGB5YW1sCiMgZGVwbG95" + + "L3N0YWNrcy9udmNmLWNvbXB1dGUtcGxhbmUvZW52aXJvbm1lbnRzLzxlbnY+LnlhbWwKZ2xvYmFs" + + "OgogIG52Y2FPcGVyYXRvcjoKICAgIHNlbGZNYW5hZ2VkOgogICAgICBpY21zU2VydmljZVVSTDog" + + "Imh0dHA6Ly88Z2F0ZXdheS1hZGRyZXNzPiIKICAgICAgaWNtc1NlcnZpY2VIb3N0SGVhZGVyT3Zl" + + "cnJpZGU6ICJzaXMuPGdhdGV3YXktZG9tYWluPiIKICAgICAgcmV2YWxTZXJ2aWNlVVJMOiAiaHR0" + + "cDovLzxnYXRld2F5LWFkZHJlc3M+IgogICAgICByZXZhbFNlcnZpY2VIb3N0SGVhZGVyT3ZlcnJp" + + "ZGU6ICJyZXZhbC48Z2F0ZXdheS1kb21haW4+IgogICAgICBuYXRzVVJMOiAibmF0czovLzxnYXRl" + + "d2F5LWFkZHJlc3M+OjQyMjIiCiAgICAgIG5hdHNIb3N0T3ZlcnJpZGU6ICJuYXRzLjxnYXRld2F5" + + "LWRvbWFpbj4iCmBgYAoKUHJldmlldyBhbmQgaW5zdGFsbCB0aGUgY29udHJvbCBwbGFuZSBhZ2Fp" + + "bnN0IGl0cyBjb250ZXh0OgoKYGBgYmFzaAptYWtlIC1DIGRlcGxveS9zdGFja3Mvc2VsZi1tYW5h" + + "Z2VkIHRlbXBsYXRlIFwKICBIRUxNRklMRV9FTlY9PGVudj4gXAogIEtVQkVDT05GSUdfRklMRT08" + + "Y29udHJvbC1wbGFuZS1rdWJlY29uZmlnPgoKbWFrZSAtQyBkZXBsb3kvc3RhY2tzL3NlbGYtbWFu" + + "YWdlZCBpbnN0YWxsIFwKICBIRUxNRklMRV9FTlY9PGVudj4gXAogIEtVQkVDT05GSUdfRklMRT08" + + "Y29udHJvbC1wbGFuZS1rdWJlY29uZmlnPgpgYGAKCkJlZm9yZSByZWdpc3RlcmluZyB0aHJvdWdo" + + "IGEgYmFyZSBHYXRld2F5IGFkZHJlc3MsIGNyZWF0ZSBvciB1cGRhdGUgdGhlIENMSQpjb25maWcg" + + "cGFzc2VkIGFzIGBOVkNGX0NMSV9DT05GSUdgOgoKYGBgeWFtbApiYXNlX2h0dHBfdXJsOiAiaHR0" + + "cDovLzxnYXRld2F5LWFkZHJlc3M+IgppbnZva2VfdXJsOiAiaHR0cDovLzxnYXRld2F5LWFkZHJl" + + "c3M+IgpiYXNlX2dycGNfdXJsOiAiPGdhdGV3YXktYWRkcmVzcz46MTAwODEiCmFwaV9rZXlzX3Nl" + + "cnZpY2VfdXJsOiAiaHR0cDovLzxnYXRld2F5LWFkZHJlc3M+IgppY21zX3VybDogImh0dHA6Ly88" + + "Z2F0ZXdheS1hZGRyZXNzPiIKYXBpX2hvc3Q6ICJhcGkuPGdhdGV3YXktZG9tYWluPiIKYXBpX2tl" + + "eXNfaG9zdDogImFwaS1rZXlzLjxnYXRld2F5LWRvbWFpbj4iCmludm9rZV9ob3N0OiAiaW52b2Nh" + + "dGlvbi48Z2F0ZXdheS1kb21haW4+IgppY21zX2hvc3Q6ICJzaXMuPGdhdGV3YXktZG9tYWluPiIK" + + "YGBgCgpIb3N0IGZpZWxkcyBjb250YWluIGhvc3RuYW1lcyBvbmx5LCB3aXRob3V0IGEgVVJMIHNj" + + "aGVtZS4gYElDTVNfVVJMYCBtYXBzIG9ubHkKdG8gdGhlIHJlZ2lzdHJhdGlvbiBjb21tYW5kJ3Mg" + + "YC0taWNtcy11cmxgOyBgaWNtc19ob3N0YCBpbiB0aGUgY29uZmlnIHN1cHBsaWVzCnRoZSBHYXRl" + + "d2F5IEhvc3QgaGVhZGVyLiBUaGVyZSBpcyBubyBgLS1pY21zLWhvc3RgIE1ha2Ugb3IgQ0xJIGZs" + + "YWcuCgpSZWdpc3RlciBmcm9tIHRoZSBjb21wdXRlIGNvbnRleHQsIHRoZW4gaW5zdGFsbCB0aGUg" + + "Y29tcHV0ZSBwbGFuZToKCmBgYGJhc2gKbWFrZSAtQyBkZXBsb3kvc3RhY2tzL252Y2YtY29tcHV0" + + "ZS1wbGFuZSByZWdpc3Rlci1jbHVzdGVyIFwKICBDTFVTVEVSX05BTUU9PGNsdXN0ZXItbmFtZT4g" + + "XAogIE5DQV9JRD08bmNhLWlkPiBcCiAgQ0xVU1RFUl9SRUdJT049PHJlZ2lvbj4gXAogIElDTVNf" + + "VVJMPWh0dHA6Ly88Z2F0ZXdheS1hZGRyZXNzPiBcCiAgS1VCRUNPTkZJR19GSUxFPTxjb21wdXRl" + + "LXBsYW5lLWt1YmVjb25maWc+IFwKICBOVkNGX0NMST08cGF0aC10by1udmNmLWNsaT4gXAogIE5W" + + "Q0ZfQ0xJX0NPTkZJRz08cGF0aC10by1udmNmLWNsaS1jb25maWc+CgptYWtlIC1DIGRlcGxveS9z" + + "dGFja3MvbnZjZi1jb21wdXRlLXBsYW5lIGluc3RhbGwgXAogIENMVVNURVJfTkFNRT08Y2x1c3Rl" + + "ci1uYW1lPiBcCiAgSEVMTUZJTEVfRU5WPTxlbnY+IFwKICBLVUJFQ09ORklHX0ZJTEU9PGNvbXB1" + + "dGUtcGxhbmUta3ViZWNvbmZpZz4KYGBgCgpSZWdpc3RyYXRpb24gZGlzY292ZXJzIHRoZSBPSURD" + + "IGlzc3VlciBhbmQgSldLUyBmcm9tIHRoZSBjb21wdXRlIGt1YmUgY29udGV4dC4KSW4gYSBtdWx0" + + "aS1jbHVzdGVyIGRlcGxveW1lbnQsIGBLVUJFQ09ORklHX0ZJTEVgIGlzIHJlcXVpcmVkIG9uIGJv" + + "dGgKY29tcHV0ZS1wbGFuZSBjb21tYW5kcy4gSW4gYSBzYW1lLWNsdXN0ZXIgZGVwbG95bWVudCBp" + + "dCBtYXkgYmUgb21pdHRlZCBvbmx5CndoZW4gdGhlIGFtYmllbnQgY29udGV4dCBpcyBhbHJlYWR5" + + "IHRoZSB0YXJnZXQgY2x1c3Rlci4KCiMjIENMSSBQcm9maWxlIEZsb3cKClJ1biB0aGUgQ0xJIGNv" + + "bnRyb2wtcGxhbmUgaW5zdGFsbCBmaXJzdC4gSXQgY3JlYXRlcyB0aGUgcHJvZmlsZSBjb25zdW1l" + + "ZCBieQpjb21wdXRlLXBsYW5lIHJlZ2lzdHJhdGlvbjoKCmBgYGJhc2gKbnZjZi1jbGkgLS1jb25m" + + "aWcgPGNvbmZpZz4gc2VsZi1ob3N0ZWQgXAogIC0tY29udHJvbC1wbGFuZS1zdGFjayBkZXBsb3kv" + + "c3RhY2tzL3NlbGYtbWFuYWdlZCBcCiAgLS1jb21wdXRlLXBsYW5lLXN0YWNrIGRlcGxveS9zdGFj" + + "a3MvbnZjZi1jb21wdXRlLXBsYW5lIFwKICAtLWVudiA8ZW52PiBcCiAgLS1wbGFpbiBcCiAgLS1j" + + "b250cm9sLXBsYW5lLWNvbnRleHQgPGNvbnRyb2wtcGxhbmUtY29udGV4dD4gXAogIC0tY29tcHV0" + + "ZS1wbGFuZS1jb250ZXh0IDxjb21wdXRlLXBsYW5lLWNvbnRleHQ+IFwKICBpbnN0YWxsIC0tY29u" + + "dHJvbC1wbGFuZSBcCiAgLS1jbHVzdGVyLW5hbWUgPGNvbnRyb2wtcGxhbmUtY2x1c3Rlci1uYW1l" + + "PiBcCiAgLS1yZWdpb24gPHJlZ2lvbj4gXAogIC0tbmNhLWlkIDxuY2EtaWQ+Cgp0ZXN0IC1zIGRl" + + "cGxveS9zdGFja3Mvc2VsZi1tYW5hZ2VkL291dC9jb250cm9sLXBsYW5lLXByb2ZpbGUueWFtbApg" + + "YGAKClVzZSB0aGUgZnVsbCBwZXJzaXN0ZW50IHByZWZpeCBmb3IgYm90aCBjb21wdXRlLXBsYW5l" + + "IGNvbW1hbmRzOgoKYGBgYmFzaApudmNmLWNsaSAtLWNvbmZpZyA8Y29uZmlnPiBzZWxmLWhvc3Rl" + + "ZCBcCiAgLS1jb250cm9sLXBsYW5lLXN0YWNrIGRlcGxveS9zdGFja3Mvc2VsZi1tYW5hZ2VkIFwK" + + "ICAtLWNvbXB1dGUtcGxhbmUtc3RhY2sgZGVwbG95L3N0YWNrcy9udmNmLWNvbXB1dGUtcGxhbmUg" + + "XAogIC0tZW52IDxlbnY+IFwKICAtLXBsYWluIFwKICBjb21wdXRlLXBsYW5lIHJlZ2lzdGVyIFwK" + + "ICAtLWNvbnRyb2wtcGxhbmUtcHJvZmlsZSBkZXBsb3kvc3RhY2tzL3NlbGYtbWFuYWdlZC9vdXQv" + + "Y29udHJvbC1wbGFuZS1wcm9maWxlLnlhbWwgXAogIC0tY2x1c3Rlci1uYW1lIDxjb21wdXRlLXBs" + + "YW5lLWNsdXN0ZXItbmFtZT4gXAogIC0ta3ViZS1jb250ZXh0IDxjb21wdXRlLXBsYW5lLWNvbnRl" + + "eHQ+IFwKICAtLXJlZ2lvbiA8cmVnaW9uPiBcCiAgLS1vdXRwdXQgZGVwbG95L3N0YWNrcy9udmNm" + + "LWNvbXB1dGUtcGxhbmUvb3V0Lzxjb21wdXRlLXBsYW5lLWNsdXN0ZXItbmFtZT4tcmVnaXN0ZXIt" + + "dmFsdWVzLnlhbWwKCm52Y2YtY2xpIC0tY29uZmlnIDxjb25maWc+IHNlbGYtaG9zdGVkIFwKICAt" + + "LWNvbnRyb2wtcGxhbmUtc3RhY2sgZGVwbG95L3N0YWNrcy9zZWxmLW1hbmFnZWQgXAogIC0tY29t" + + "cHV0ZS1wbGFuZS1zdGFjayBkZXBsb3kvc3RhY2tzL252Y2YtY29tcHV0ZS1wbGFuZSBcCiAgLS1l" + + "bnYgPGVudj4gXAogIC0tcGxhaW4gXAogIGNvbXB1dGUtcGxhbmUgaW5zdGFsbCBcCiAgLS12YWx1" + + "ZXMgZGVwbG95L3N0YWNrcy9udmNmLWNvbXB1dGUtcGxhbmUvb3V0Lzxjb21wdXRlLXBsYW5lLWNs" + + "dXN0ZXItbmFtZT4tcmVnaXN0ZXItdmFsdWVzLnlhbWwgXAogIC0ta3ViZS1jb250ZXh0IDxjb21w" + + "dXRlLXBsYW5lLWNvbnRleHQ+IFwKICAtLWNsdXN0ZXItbmFtZSA8Y29tcHV0ZS1wbGFuZS1jbHVz" + + "dGVyLW5hbWU+CmBgYAoKUmVnaXN0cmF0aW9uIHNlbGVjdHMgdGhlIHByb2ZpbGUncyBpbi1jbHVz" + + "dGVyIG9yIGNvbXB1dGUtcmVhY2hhYmxlIGVuZHBvaW50cwpmcm9tIHRoZSBjb21wdXRlIGNvbnRl" + + "eHQgYW5kIHByb2JlcyBpdHMgSldLUy4gRG8gbm90IHJlcGxhY2UgcHJvZmlsZSBlbmRwb2ludHMK" + + "d2l0aCBoYW5kLWF1dGhvcmVkIEhlbG1maWxlIGVuZHBvaW50IHZhbHVlcy4KCiMjIFB1bGwgU2Vj" + + "cmV0cwoKQ3JlYXRlIHRoZSBjb250cm9sLXBsYW5lIHNlY3JldCBpbiB0aGVzZSBuYW1lc3BhY2Vz" + + "IG9uIHRoZSBjb250cm9sLXBsYW5lCmNvbnRleHQ6CgpgYGB0ZXh0CmNhc3NhbmRyYS1zeXN0ZW0g" + + "bmF0cy1zeXN0ZW0gbnZjZiBhcGkta2V5cyBlc3Mgc2lzIHZhdWx0LXN5c3RlbSBjZXJ0LW1hbmFn" + + "ZXIKYGBgCgpPbiB0aGUgY29tcHV0ZSBjb250ZXh0LCBjcmVhdGUgdGhlIHNlY3JldCBvbmx5IGlu" + + "IGBudmNhLW9wZXJhdG9yYCBhbmQgcmVmZXJlbmNlCml0IHRocm91Z2ggYGdsb2JhbC5pbWFnZVB1" + + "bGxTZWNyZXRzYCBpbiB0aGUgY29tcHV0ZS1wbGFuZSBlbnZpcm9ubWVudC4gVGhlIGNoYXJ0CmFu" + + "ZCBvcGVyYXRvciB1c2UgaXQgaW4gYG52Y2Etb3BlcmF0b3JgIGFuZCBtaXJyb3IgaXQgdG8gYG52" + + "Y2Etc3lzdGVtYC4gRG8gbm90IGFkZAplaXRoZXIgbmFtZXNwYWNlIHRvIHRoZSBjb250cm9sLXBs" + + "YW5lIGxpc3QuIEZvciBjb21tYW5kcyBhbmQgcG9saWN5IGV4YW1wbGVzLApzZWUgW3B1bGwtc2Vj" + + "cmV0cy5tZF0ocHVsbC1zZWNyZXRzLm1kKS4KCiMjIFZlcmlmaWNhdGlvbgoKVXNlIHRoZSBleHBs" + + "aWNpdCBHYXRld2F5IG5hbWUgYW5kIG5hbWVzcGFjZToKCmBgYGJhc2gKa3ViZWN0bCAtLWNvbnRl" + + "eHQgPGNvbnRyb2wtcGxhbmUtY29udGV4dD4gZ2V0IGdhdGV3YXkgbnZjZi1nYXRld2F5IFwKICAt" + + "biBlbnZveS1nYXRld2F5IC1vIHdpZGUKa3ViZWN0bCAtLWNvbnRleHQgPGNvbnRyb2wtcGxhbmUt" + + "Y29udGV4dD4gZ2V0IHRjcHJvdXRlIC1uIGVudm95LWdhdGV3YXkKa3ViZWN0bCAtLWNvbnRleHQg" + + "PGNvbXB1dGUtcGxhbmUtY29udGV4dD4gcm9sbG91dCBzdGF0dXMgXAogIGRlcGxveW1lbnQvbnZj" + + "YS1vcGVyYXRvciAtbiBudmNhLW9wZXJhdG9yIC0tdGltZW91dD0xMG0Ka3ViZWN0bCAtLWNvbnRl" + + "eHQgPGNvbXB1dGUtcGxhbmUtY29udGV4dD4gd2FpdCBcCiAgbnZjZmJhY2tlbmQvPGNvbXB1dGUt" + + "cGxhbmUtY2x1c3Rlci1uYW1lPiAtbiBudmNhLW9wZXJhdG9yIFwKICAtLWZvcj1qc29ucGF0aD0n" + + "ey5zdGF0dXMuYWdlbnRTdGF0dXN9Jz1oZWFsdGh5IC0tdGltZW91dD0xMG0Ka3ViZWN0bCAtLWNv" + + "bnRleHQgPGNvbXB1dGUtcGxhbmUtY29udGV4dD4gZ2V0IHNlY3JldCA8cHVsbC1zZWNyZXQ+IC1u" + + "IG52Y2Etc3lzdGVtCmBgYAoKIyMgVGVhcmRvd24KCkRlc3Ryb3kgYW5kIGRlcmVnaXN0ZXIgZXZl" + + "cnkgY29tcHV0ZSBwbGFuZSBiZWZvcmUgdGhlIGNvbnRyb2wgcGxhbmUuIEJvdGgKaGFuZG9mZnMg" + + "Y2FuIGRlc3Ryb3kgdGhlIGNvbnRyb2wgcGxhbmUsIHNvIGFwcGx5IHRoaXMgcHJlZmxpZ2h0IGJl" + + "Zm9yZSBlaXRoZXIKb25lLiBQcmVzZXJ2ZSB0aGUgYGNlcnQtbWFuYWdlcmAgbmFtZXNwYWNlIGJ5" + + "IGRlZmF1bHQuIE5hbWVzcGFjZSBwcmVzZXJ2YXRpb24KZG9lcyBub3QgcHJlc2VydmUgdGhlIEhl" + + "bG0gcmVsZWFzZS4gSWRlbnRpZnkgd2hldGhlciBjZXJ0LW1hbmFnZXIgaXMgZXh0ZXJuYWwuCkZv" + + "ciBhbiBleHRlcm5hbCBpbnN0YWxsYXRpb24sIHJlcXVpcmUgZWZmZWN0aXZlIGBjZXJ0TWFuYWdl" + + "ci5lbmFibGVkOiBmYWxzZWAKYW5kIGFib3J0IGlmIGl0IGlzIHRydWUuIEZvciBhbiBpbnRlbmRl" + + "ZCBzdGFjay1tYW5hZ2VkIHJlbGVhc2Ugd2l0aCBlZmZlY3RpdmUKYGNlcnRNYW5hZ2VyLmVuYWJs" + + "ZWQ6IHRydWVgLCB2ZXJpZnkgbWF0Y2hpbmcgc3RhY2sgSGVsbSByZWxlYXNlIG1ldGFkYXRhIGFu" + + "ZAphYm9ydCBvbiBtaXNzaW5nIG9yIG1pc21hdGNoZWQgZXZpZGVuY2UuIE9ubHkgcGxhbiBuYW1l" + + "c3BhY2UgcmVtb3ZhbCBhZnRlcgp2ZXJpZnlpbmcgbmFtZXNwYWNlIHByb3ZlbmFuY2UgYW5kIGdl" + + "dHRpbmcgZXhwbGljaXQgY29uZmlybWF0aW9uOyBvdGhlcndpc2UKZG8gbm90IGRlbGV0ZSBpdC4K" + + "CkZvciB0aGUgSGVsbWZpbGUgdmFsdWVzIGZsb3csIHJldGFpbiBlYWNoIHJlZ2lzdHJhdGlvbiB2" + + "YWx1ZXMgZmlsZSB1bnRpbApjbGVhbnVwIGlzIHZlcmlmaWVkOgoKYGBgYmFzaAptYWtlIC1DIGRl" + + "cGxveS9zdGFja3MvbnZjZi1jb21wdXRlLXBsYW5lIGRlc3Ryb3kgXAogIENMVVNURVJfTkFNRT08" + + "Y2x1c3Rlci1uYW1lPiBcCiAgSEVMTUZJTEVfRU5WPTxlbnY+IFwKICBLVUJFQ09ORklHX0ZJTEU9" + + "PGNvbXB1dGUtcGxhbmUta3ViZWNvbmZpZz4KCjxudmNmLWNsaT4gLS1jb25maWcgPGNvbmZpZz4g" + + "Y2x1c3RlciBkZWxldGUgXAogIC0tY2x1c3Rlci1pZCA8Y2x1c3Rlci1pZC1mcm9tLXJlZ2lzdHJh" + + "dGlvbi12YWx1ZXM+IFwKICAtLW5jYS1pZCA8bmNhLWlkPiBcCiAgLS1pZ25vcmUtbWlzc2luZwpg" + + "YGAKClJlYWQgYGNsdXN0ZXJJRGAgYW5kIGBuY2FJRGAgZnJvbQpgZGVwbG95L3N0YWNrcy9udmNm" + + "LWNvbXB1dGUtcGxhbmUvcmVnaXN0cmF0aW9uLzxjbHVzdGVyLW5hbWU+LXJlZ2lzdGVyLXZhbHVl" + + "cy55YW1sYC4KU2hvdyB0aGUgZXhhY3QgY2x1c3RlciBJRCBhbmQgZ2V0IGNvbmZpcm1hdGlvbiBi" + + "ZWZvcmUgYGNsdXN0ZXIgZGVsZXRlYC4gUmVwZWF0CmNvbXB1dGUgZGVzdHJveSBhbmQgZGVyZWdp" + + "c3RyYXRpb24gZm9yIGV2ZXJ5IGNvbXB1dGUgY2x1c3RlciwgdGhlbiBkZXN0cm95IHRoZQpjb250" + + "cm9sIHBsYW5lLgoKYGBgYmFzaApLVUJFQ09ORklHPTxjb250cm9sLXBsYW5lLWt1YmVjb25maWc+" + + "IFwKbWFrZSAtQyBkZXBsb3kvc3RhY2tzL3NlbGYtbWFuYWdlZCBkZXN0cm95IFwKICBIRUxNRklM" + + "RV9FTlY9PGVudj4gXAogIEtVQkVDT05GSUdfRklMRT08Y29udHJvbC1wbGFuZS1rdWJlY29uZmln" + + "PgpgYGAKCkJvdGggYEtVQkVDT05GSUdgIGFuZCBgS1VCRUNPTkZJR19GSUxFYCBhcmUgcmVxdWly" + + "ZWQgb24gdGhlIGNvbnRyb2wtcGxhbmUKZGVzdHJveSBiZWNhdXNlIGl0cyBuYW1lc3BhY2UgY2xl" + + "YW51cCB1c2VzIGFtYmllbnQgYGt1YmVjdGxgLgoKRm9yIHRoZSBDTEkgcHJvZmlsZSBmbG93LCBr" + + "ZWVwCmBkZXBsb3kvc3RhY2tzL252Y2YtY29tcHV0ZS1wbGFuZS9vdXQvPGNsdXN0ZXItbmFtZT4t" + + "cmVnaXN0ZXItdmFsdWVzLnlhbWxgCnVudGlsIHRlYXJkb3duIGNvbXBsZXRlcyBiZWNhdXNlIGBk" + + "b3duYCByZWFkcyBpdHMgY2x1c3RlciBJRC4gRmlyc3QgcXVlcnkgdGhlCmxpdmUgcmVnaXN0cmF0" + + "aW9uIHNldCB3aXRoIHRoZSBzYW1lIGNvbXBsZXRlIHBlcnNpc3RlbnQgcHJlZml4OgoKYGBgYmFz" + + "aApudmNmLWNsaSAtLWNvbmZpZyA8Y29uZmlnPiBzZWxmLWhvc3RlZCBcCiAgLS1jb250cm9sLXBs" + + "YW5lLXN0YWNrIGRlcGxveS9zdGFja3Mvc2VsZi1tYW5hZ2VkIFwKICAtLWNvbXB1dGUtcGxhbmUt" + + "c3RhY2sgZGVwbG95L3N0YWNrcy9udmNmLWNvbXB1dGUtcGxhbmUgXAogIC0tZW52IDxlbnY+IFwK" + + "ICAtLXBsYWluIFwKICAtLWNvbnRyb2wtcGxhbmUtY29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250" + + "ZXh0PiBcCiAgLS1jb21wdXRlLXBsYW5lLWNvbnRleHQgPGNvbXB1dGUtcGxhbmUtY29udGV4dD4g" + + "XAogIC0taWNtcy11cmwgPGNvbXB1dGUtcmVhY2hhYmxlLWljbXMtdXJsPiBcCiAgc3RhdHVzIFwK" + + "ICAtLWNsdXN0ZXItbmFtZSA8Y29tcHV0ZS1wbGFuZS1jbHVzdGVyLW5hbWU+IFwKICAtLW5jYS1p" + + "ZCA8bmNhLWlkPgpgYGAKClNob3cgdGhlIHJlZ2lzdGVyZWQgY29tcHV0ZS1wbGFuZSBsaXN0LiBO" + + "YW1lZC1jbHVzdGVyIGBkb3duIC0tcGxhbi1vbmx5YCBkb2VzCm5vdCBxdWVyeSBJQ01TLCBzbyBp" + + "dCBwcmV2aWV3cyBvbmx5IHRoYXQgY29tcHV0ZSBwbGFuZSBhbmQgY2Fubm90IHNob3cgdGhlCmNv" + + "bmRpdGlvbmFsIGNvbnRyb2wtcGxhbmUgcmVtb3ZhbC4gSWYgdGhlIHRhcmdldCBpcyB0aGUgbGFz" + + "dCByZWdpc3RlcmVkCmNsdXN0ZXIsIHJlYWwgYGRvd25gIGFsc28gZGVzdHJveXMgdGhlIGNvbnRy" + + "b2wgcGxhbmUuIEdldCBleHBsaWNpdCBjb25maXJtYXRpb24KZm9yIGJvdGggcmVtb3ZhbHMgYmVm" + + "b3JlIGNvbnRpbnVpbmcuIFRoZW4gcHJldmlldyBhbmQgZXhlY3V0ZSB3aXRoIHRoZSBzYW1lCnBy" + + "ZWZpeDoKCmBgYGJhc2gKbnZjZi1jbGkgLS1jb25maWcgPGNvbmZpZz4gc2VsZi1ob3N0ZWQgXAog" + + "IC0tY29udHJvbC1wbGFuZS1zdGFjayBkZXBsb3kvc3RhY2tzL3NlbGYtbWFuYWdlZCBcCiAgLS1j" + + "b21wdXRlLXBsYW5lLXN0YWNrIGRlcGxveS9zdGFja3MvbnZjZi1jb21wdXRlLXBsYW5lIFwKICAt" + + "LWVudiA8ZW52PiBcCiAgLS1wbGFpbiBcCiAgLS1jb250cm9sLXBsYW5lLWNvbnRleHQgPGNvbnRy" + + "b2wtcGxhbmUtY29udGV4dD4gXAogIC0tY29tcHV0ZS1wbGFuZS1jb250ZXh0IDxjb21wdXRlLXBs" + + "YW5lLWNvbnRleHQ+IFwKICAtLWljbXMtdXJsIDxjb21wdXRlLXJlYWNoYWJsZS1pY21zLXVybD4g" + + "XAogIGRvd24gLS1wbGFuLW9ubHkgXAogIC0tY2x1c3Rlci1uYW1lIDxjb21wdXRlLXBsYW5lLWNs" + + "dXN0ZXItbmFtZT4gXAogIC0tbmNhLWlkIDxuY2EtaWQ+CgpudmNmLWNsaSAtLWNvbmZpZyA8Y29u" + + "ZmlnPiBzZWxmLWhvc3RlZCBcCiAgLS1jb250cm9sLXBsYW5lLXN0YWNrIGRlcGxveS9zdGFja3Mv" + + "c2VsZi1tYW5hZ2VkIFwKICAtLWNvbXB1dGUtcGxhbmUtc3RhY2sgZGVwbG95L3N0YWNrcy9udmNm" + + "LWNvbXB1dGUtcGxhbmUgXAogIC0tZW52IDxlbnY+IFwKICAtLXBsYWluIFwKICAtLWNvbnRyb2wt" + + "cGxhbmUtY29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBcCiAgLS1jb21wdXRlLXBsYW5l" + + "LWNvbnRleHQgPGNvbXB1dGUtcGxhbmUtY29udGV4dD4gXAogIC0taWNtcy11cmwgPGNvbXB1dGUt" + + "cmVhY2hhYmxlLWljbXMtdXJsPiBcCiAgZG93biBcCiAgLS1jbHVzdGVyLW5hbWUgPGNvbXB1dGUt" + + "cGxhbmUtY2x1c3Rlci1uYW1lPiBcCiAgLS1uY2EtaWQgPG5jYS1pZD4KYGBgCgpSZXBlYXQgYGRv" + + "d25gIGZvciBlYWNoIGNvbXB1dGUgY2x1c3Rlci4gRWFjaCBydW4gZGVzdHJveXMgdGhhdCBjb21w" + + "dXRlIHBsYW5lIGFuZAp1bnJlZ2lzdGVycyBpdHMgSUNNUyByb3cuIEl0IHJlbW92ZXMgdGhlIGNv" + + "bnRyb2wgcGxhbmUgb25seSBhZnRlciBubyBjbHVzdGVyCnJlZ2lzdHJhdGlvbnMgcmVtYWluLgpQ" + + "SwcIlmO8WRIwAAASMAAAUEsDBBQACAAAAAAAIQAAAAAAAAAAAAAAAAA7AAkAZGF0YS9udmNmLXNl" + + "bGYtbWFuYWdlZC1pbnN0YWxsYXRpb24vcmVmZXJlbmNlcy9kZWJ1Z2dpbmcubWRVVAUAAQCmzhIj" + + "IERlYnVnZ2luZyBSZWZlcmVuY2UKClJlY2lwZXMgZm9yIGRpYWdub3NpbmcgYW5kIGZpeGluZyBj" + + "b21tb24gTlZDRiBzZWxmLW1hbmFnZWQgc3RhY2sgZmFpbHVyZXMuCgojIyBRdWljayBTdGF0dXMg" + + "Q29tbWFuZHMKCmBgYGJhc2gKIyBBbGwgcG9kcyBhY3Jvc3MgYWxsIG5hbWVzcGFjZXMKa3ViZWN0" + + "bCBnZXQgcG9kcyAtQSAtbyB3aWRlCgojIFBvZHMgaW4gYSBzcGVjaWZpYyBuYW1lc3BhY2UKa3Vi" + + "ZWN0bCBnZXQgcG9kcyAtbiA8bmFtZXNwYWNlPgoKIyBBbGwgaGVsbSByZWxlYXNlcwpoZWxtIGxp" + + "c3QgLUEKCiMgUmVjZW50IGV2ZW50cyAobW9zdCB1c2VmdWwgZm9yIGRpYWdub3NpbmcgZmFpbHVy" + + "ZXMpCmt1YmVjdGwgZ2V0IGV2ZW50cyAtbiA8bmFtZXNwYWNlPiAtLXNvcnQtYnk9Jy5sYXN0VGlt" + + "ZXN0YW1wJwoKIyBEZXNjcmliZSBhIHNwZWNpZmljIHBvZCAoc2hvd3MgZXZlbnRzLCBjb25kaXRp" + + "b25zLCB2b2x1bWVzKQprdWJlY3RsIGRlc2NyaWJlIHBvZCAtbiA8bmFtZXNwYWNlPiA8cG9kLW5h" + + "bWU+CmBgYAoKIyMgRmFpbHVyZTogSW1hZ2VQdWxsQmFja09mZgoKIyMjIFN5bXB0b21zCgpgYGB0" + + "ZXh0Ck5BTUUgICAgICAgICAgIFJFQURZICAgU1RBVFVTICAgICAgICAgICAgIFJFU1RBUlRTICAg" + + "QUdFCmNhc3NhbmRyYS0wICAgIDAvMSAgICAgSW1hZ2VQdWxsQmFja09mZiAgIDAgICAgICAgICAg" + + "NW0KYGBgCgpFdmVudHMgc2hvdzoKCmBgYHRleHQKRmFpbGVkIHRvIHB1bGwgaW1hZ2UgIm52Y3Iu" + + "aW8vLi4uL2ltYWdlOnRhZyI6IDQwMSBVbmF1dGhvcml6ZWQKYGBgCgojIyMgRGlhZ25vc2lzCgpg" + + "YGBiYXNoCiMgQ2hlY2sgd2hhdCBpbWFnZSBpcyBmYWlsaW5nCmt1YmVjdGwgZGVzY3JpYmUgcG9k" + + "IC1uIDxuYW1lc3BhY2U+IDxwb2QtbmFtZT4gfCBncmVwIC1BNSAiRXZlbnRzOiIKCiMgQ2hlY2sg" + + "aWYgcHVsbCBzZWNyZXQgZXhpc3RzIGluIHRoZSBuYW1lc3BhY2UKa3ViZWN0bCBnZXQgc2VjcmV0" + + "IG52Y3ItY3JlZHMgLW4gPG5hbWVzcGFjZT4KCiMgQ2hlY2sgaWYgdGhlIHBvZCBzcGVjIGhhcyBp" + + "bWFnZVB1bGxTZWNyZXRzCmt1YmVjdGwgZ2V0IHBvZCAtbiA8bmFtZXNwYWNlPiA8cG9kLW5hbWU+" + + "IC1vIGpzb25wYXRoPSd7LnNwZWMuaW1hZ2VQdWxsU2VjcmV0c30nCgojIENoZWNrIGlmIHRoZSBT" + + "ZXJ2aWNlQWNjb3VudCBoYXMgaW1hZ2VQdWxsU2VjcmV0cwprdWJlY3RsIGdldCBzYSA8c2EtbmFt" + + "ZT4gLW4gPG5hbWVzcGFjZT4gLW8ganNvbnBhdGg9J3suaW1hZ2VQdWxsU2VjcmV0c30nCmBgYAoK" + + "IyMjIEZpeGVzCgoxLiAqKlNlY3JldCBtaXNzaW5nIGluIG5hbWVzcGFjZSoqOiBDcmVhdGUgaXQK" + + "CiAgIGBgYGJhc2gKICAga3ViZWN0bCBjcmVhdGUgc2VjcmV0IGRvY2tlci1yZWdpc3RyeSBudmNy" + + "LWNyZWRzIFwKICAgICAtLWRvY2tlci1zZXJ2ZXI9bnZjci5pbyBcCiAgICAgLS1kb2NrZXItdXNl" + + "cm5hbWU9JyRvYXV0aHRva2VuJyBcCiAgICAgLS1kb2NrZXItcGFzc3dvcmQ9IiROR0NfQVBJX0tF" + + "WSIgXAogICAgIC0tbmFtZXNwYWNlPTxuYW1lc3BhY2U+IFwKICAgICAtLWRyeS1ydW49Y2xpZW50" + + "IC1vIHlhbWwgfCBrdWJlY3RsIGFwcGx5IC1mIC0KICAgYGBgCgoyLiAqKlNlY3JldCBleGlzdHMg" + + "YnV0IHBvZCBkb2Vzbid0IHJlZmVyZW5jZSBpdCoqOiBUaGUgY2hhcnQgbmVlZHMgYGltYWdlUHVs" + + "bFNlY3JldHNgIGNvbmZpZ3VyZWQgdmlhIGhlbG1maWxlIHZhbHVlcy4gU2VlIFtwdWxsLXNlY3Jl" + + "dHMubWRdKHB1bGwtc2VjcmV0cy5tZCkuCgozLiAqKkNoYXJ0IGRvZXNuJ3Qgc3VwcG9ydCBpbWFn" + + "ZVB1bGxTZWNyZXRzKiogKG9wZW5iYW8sIGludm9jYXRpb24tc2VydmljZSwgZXNzLWFwaSwgbm90" + + "YXJ5LXNlcnZpY2UpOiBQYXRjaCBTZXJ2aWNlQWNjb3VudHMgYW5kIHJlc3RhcnQgcG9kcy4gU2Vl" + + "IFtwdWxsLXNlY3JldHMubWRdKHB1bGwtc2VjcmV0cy5tZCkuCgo0LiAqKldyb25nIGNyZWRlbnRp" + + "YWxzIGluIHNlY3JldCoqOiBEZWxldGUgYW5kIHJlY3JlYXRlCgogICBgYGBiYXNoCiAgIGt1YmVj" + + "dGwgZGVsZXRlIHNlY3JldCBudmNyLWNyZWRzIC1uIDxuYW1lc3BhY2U+CiAgICMgUmVjcmVhdGUg" + + "d2l0aCBjb3JyZWN0IGNyZWRlbnRpYWxzCiAgIGBgYAoKIyMgRmFpbHVyZTogSW5pdDowLzEgU3R1" + + "Y2sgKFZhdWx0IEFnZW50KQoKIyMjIFN5bXB0b21zCgpTZXJ2aWNlIHBvZHMgc3R1Y2sgaW4gYElu" + + "aXQ6MC8xYCBmb3IgbWludXRlczoKCmBgYGJhc2gKTkFNRSAgICAgICAgICAgICAgICAgICAgICAg" + + "IFJFQURZICAgU1RBVFVTICAgICBSRVNUQVJUUyAgIEFHRQpudmNmLWFwaS03ZjRjNzZmNzg4LTQ0" + + "dmx0ICAwLzIgICAgIEluaXQ6MC8xICAgMCAgICAgICAgICAxMG0KYGBgCgojIyMgRGlhZ25vc2lz" + + "CgpUaGUgaW5pdCBjb250YWluZXIgaXMgdGhlIHZhdWx0LWFnZW50LWluaXQgaW5qZWN0b3Igd2Fp" + + "dGluZyBmb3IgT3BlbkJhby4KCmBgYGJhc2gKIyBDaGVjayBPcGVuQmFvIHBvZHMKa3ViZWN0bCBn" + + "ZXQgcG9kcyAtbiB2YXVsdC1zeXN0ZW0KCiMgQ2hlY2sgaWYgT3BlbkJhbyBtaWdyYXRpb24gam9i" + + "IHJhbgprdWJlY3RsIGdldCBqb2JzIC1uIHZhdWx0LXN5c3RlbQoKIyBDaGVjayBPcGVuQmFvIHBv" + + "ZCBsb2dzCmt1YmVjdGwgbG9ncyAtbiB2YXVsdC1zeXN0ZW0gb3BlbmJhby1zZXJ2ZXItMCAtYyBv" + + "cGVuYmFvCgojIENoZWNrIGluaXQgY29udGFpbmVyIGxvZ3Mgb24gdGhlIHN0dWNrIHBvZAprdWJl" + + "Y3RsIGxvZ3MgLW4gPG5hbWVzcGFjZT4gPHBvZC1uYW1lPiAtYyB2YXVsdC1hZ2VudC1pbml0CmBg" + + "YAoKIyMjIEZpeGVzCgoxLiAqKk9wZW5CYW8gcG9kcyBub3QgcnVubmluZyoqOiBDaGVjayB0aGVp" + + "ciBldmVudHMgZm9yIGltYWdlIHB1bGwgaXNzdWVzLCByZXNvdXJjZSBpc3N1ZXMsIGV0Yy4KCjIu" + + "ICoqT3BlbkJhbyBtaWdyYXRpb24gam9iIGRpZG4ndCBydW4qKjogVGhpcyBoYXBwZW5zIHdoZW4g" + + "YGhlbG1maWxlIHN5bmNgIHdhcyBpbnRlcnJ1cHRlZC4gRGVzdHJveSBhbmQgcmUtc3luYyBvcGVu" + + "YmFvOgoKICAgYGBgYmFzaAogICBIRUxNRklMRV9FTlY9PGVudj4gaGVsbWZpbGUgLS1zZWxlY3Rv" + + "ciBuYW1lPW9wZW5iYW8tc2VydmVyIGRlc3Ryb3kKICAga3ViZWN0bCBkZWxldGUgbmFtZXNwYWNl" + + "IHZhdWx0LXN5c3RlbQogICBrdWJlY3RsIGNyZWF0ZSBuYW1lc3BhY2UgdmF1bHQtc3lzdGVtCiAg" + + "ICMgUmUtY3JlYXRlIHB1bGwgc2VjcmV0IGlmIG5lZWRlZAogICBIRUxNRklMRV9FTlY9PGVudj4g" + + "aGVsbWZpbGUgLS1zZWxlY3RvciBuYW1lPW9wZW5iYW8tc2VydmVyIHN5bmMKICAgYGBgCgozLiAq" + + "Kk9wZW5CYW8gcG9kcyBydW5uaW5nIGJ1dCBub3QgaW5pdGlhbGl6ZWQqKjogQ2hlY2sgdW5zZWFs" + + "IHN0YXR1czoKCiAgIGBgYGJhc2gKICAga3ViZWN0bCBleGVjIC1uIHZhdWx0LXN5c3RlbSBvcGVu" + + "YmFvLXNlcnZlci0wIC1jIG9wZW5iYW8gLS0gYmFvIHN0YXR1cwogICBgYGAKCjQuICoqYHZhdWx0" + + "LWFnZW50LWluaXRgIGxvZ3MgYGF1dGgvand0L2xvZ2luYCAtPiBgNDAwIC4uLiBubyBrbm93biBr" + + "ZXkgc3VjY2Vzc2Z1bGx5IHZhbGlkYXRlZCB0aGUgdG9rZW4gc2lnbmF0dXJlYCoqCiAgIChjb21t" + + "b24gb24gQUtTLCBhbmQgb24gYW55IGNsdXN0ZXIgd2hvc2UgT0lEQyBpc3N1ZXIgcHVibGlzaGVz" + + "IGEgcm90YXRpbmcgbXVsdGkta2V5IEpXS1MpOgogICB0aGUgT3BlbkJhbyBgYXV0aC9qd3RgIG1l" + + "dGhvZCB3YXMgY29uZmlndXJlZCB3aXRoIGEgc2luZ2xlIHN0YXRpYyBtb3VudGVkIHB1YmxpYyBr" + + "ZXkKICAgKGBqd3RfdmFsaWRhdGlvbl9wdWJrZXlzYCkgaW5zdGVhZCBvZiB0aGUgaXNzdWVyJ3Mg" + + "bGl2ZSBKV0tTLCBzbyBpdCBjYW5ub3QgdmFsaWRhdGUgdGhlCiAgIGNsdXN0ZXItc2lnbmVkIFNl" + + "cnZpY2VBY2NvdW50IHRva2VucyB0aGUgdmF1bHQtYWdlbnRzIHByZXNlbnQuIEV2ZXJ5IHNlcnZp" + + "Y2UncwogICBgdmF1bHQtYWdlbnQtaW5pdGAgdGhlbiBsb29wcyBvbiB0aGF0IDQwMCBhbmQgdGhl" + + "IHBvZCBuZXZlciBsZWF2ZXMgYEluaXQ6MC8xYC4gVGhpcyBpcyB0aGUKICAgYmVoYXZpb3Igb2Yg" + + "dGhlIGJhc2UgZGVmYXVsdCBgb3BlbmJhby5taWdyYXRpb25zLmlzc3VlckRpc2NvdmVyeS5lbmFi" + + "bGVkOiBmYWxzZWA7IHRoZQogICBtaWdyYXRpb24gbG9nIHNob3dzIGBPSURDIGlzc3VlciBkaXNj" + + "b3ZlcnkgaXMgZGlzYWJsZWQuIFVzaW5nIFNlcnZpY2VBY2NvdW50IGlzc3VlciBhbmQKICAgbW91" + + "bnRlZCBwdWJsaWMga2V5IGZhbGxiYWNrYC4gRW5hYmxlIGlzc3VlciBkaXNjb3Zlcnkgc28gdGhl" + + "IG1pZ3JhdGlvbiB1c2VzIHRoZSBsaXZlIEpXS1MsCiAgIHRoZW4gcmUtcnVuIGl0OgoKICAgYGBg" + + "YmFzaAogICAjIEluIHlvdXIgZW52IHZhbHVlcyAoZS5nLiBlbnZpcm9ubWVudHMvPGVudj4ueWFt" + + "bCksIHNldDoKICAgIyAgIG9wZW5iYW86CiAgICMgICAgIG1pZ3JhdGlvbnM6CiAgICMgICAgICAg" + + "aXNzdWVyRGlzY292ZXJ5OgogICAjICAgICAgICAgZW5hYmxlZDogdHJ1ZQogICBrdWJlY3RsIGRl" + + "bGV0ZSBqb2IgLW4gdmF1bHQtc3lzdGVtIG9wZW5iYW8tc2VydmVyLW1pZ3JhdGlvbnMKICAgSEVM" + + "TUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0b3IgbmFtZT1vcGVuYmFvLXNlcnZlciBz" + + "eW5jCiAgIGBgYAoKICAgVGhlIG1pZ3JhdGlvbiBsb2cgc2hvdWxkIHRoZW4gc2hvdyBgUmVjZWl2" + + "ZWQgZGlzY292ZXJ5IGRvY3VtZW50IGZyb20KICAgLi4uLy53ZWxsLWtub3duL29wZW5pZC1jb25m" + + "aWd1cmF0aW9uYCBhbmQgYEZpbmFsIE9wZW5CYW8gSldUIEpXS1MgVVJMIHNldCB0bzoKICAgLi4u" + + "L29wZW5pZC92MS9qd2tzYCwgYW5kIHRoZSBzZXJ2aWNlIHBvZHMgYXV0aGVudGljYXRlIGFuZCBy" + + "ZWFjaCBSZWFkeSB3aXRoaW4gfjEgbWluLgogICBBS1MgY2x1c3RlcnMgd2l0aCB0aGUgY2x1c3Rl" + + "ciBPSURDIGlzc3VlciBlbmFibGVkICh0aGUgYGFrcy1jbHVzdGVyYCBkZWZhdWx0KSBhbHdheXMg" + + "bmVlZAogICB0aGlzIGJlY2F1c2UgdGhlIHN0YXRpYy1wdWJrZXkgZmFsbGJhY2sgY2Fubm90IG1h" + + "dGNoIHRoZSBpc3N1ZXIncyByb3RhdGluZyBzaWduaW5nIGtleXMuCgojIyBGYWlsdXJlOiBPT01L" + + "aWxsZWQgb24gQ2Fzc2FuZHJhCgojIyMgU3ltcHRvbXMKCmBgYHRleHQKTkFNRSAgICAgICAgICBS" + + "RUFEWSAgIFNUQVRVUyAgICBSRVNUQVJUUyAgIEFHRQpjYXNzYW5kcmEtMCAgIDAvMSAgICAgT09N" + + "S2lsbGVkICAzICAgICAgICAgMTBtCmBgYAoKIyMjIERpYWdub3NpcwoKYGBgYmFzaAprdWJlY3Rs" + + "IGRlc2NyaWJlIHBvZCAtbiBjYXNzYW5kcmEtc3lzdGVtIGNhc3NhbmRyYS0wIHwgZ3JlcCAtQTMg" + + "Ikxhc3QgU3RhdGUiCmBgYAoKIyMjIEZpeAoKT3ZlcnJpZGUgQ2Fzc2FuZHJhIHJlc291cmNlcyB2" + + "aWEgaGVsbWZpbGUgdmFsdWVzLiBTZWUgRXhhbXBsZSAxIGluCltleGFtcGxlcy5tZF0oLi4vZXhh" + + "bXBsZXMubWQpLgoKYGBgeWFtbAotIGNhc3NhbmRyYToKICAgIHJlc291cmNlczoKICAgICAgbGlt" + + "aXRzOgogICAgICAgIGNwdTogIjgiCiAgICAgICAgbWVtb3J5OiA4MTkyTWkKICAgICAgcmVxdWVz" + + "dHM6CiAgICAgICAgY3B1OiAiMiIKICAgICAgICBtZW1vcnk6IDQwOTZNaQpgYGAKCk5vdGU6IGBy" + + "ZXNvdXJjZVByZXNldGAgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgTlZDRiBjYXNzYW5kcmEgd3Jh" + + "cHBlciBjaGFydC4gVXNlIGV4cGxpY2l0IGByZXNvdXJjZXNgLgoKIyMgRmFpbHVyZTogUG9kcyBT" + + "dHVjayBpbiBQZW5kaW5nCgojIyMgU3ltcHRvbXMKCmBgYHRleHQKTkFNRSAgICAgICAgICBSRUFE" + + "WSAgIFNUQVRVUyAgICBSRVNUQVJUUyAgIEFHRQpjYXNzYW5kcmEtMCAgIDAvMSAgICAgUGVuZGlu" + + "ZyAgIDAgICAgICAgICAgMTBtCmBgYAoKIyMjIERpYWdub3NpcwoKYGBgYmFzaAojIENoZWNrIGV2" + + "ZW50cyBmb3Igc2NoZWR1bGluZyBmYWlsdXJlcwprdWJlY3RsIGRlc2NyaWJlIHBvZCAtbiA8bmFt" + + "ZXNwYWNlPiA8cG9kLW5hbWU+CgojIENvbW1vbiBjYXVzZXM6CiMgLSAiMC8xMiBub2RlcyBhcmUg" + + "YXZhaWxhYmxlOiAxMiBub2RlKHMpIGRpZG4ndCBtYXRjaCBQb2QncyBub2RlIGFmZmluaXR5Igoj" + + "IC0gIjAvMTIgbm9kZXMgYXJlIGF2YWlsYWJsZTogMTIgSW5zdWZmaWNpZW50IG1lbW9yeSIKIyAt" + + "ICJwZXJzaXN0ZW50dm9sdW1lY2xhaW0gbm90IGZvdW5kIgpgYGAKCiMjIyBGaXhlcwoKMS4gKipO" + + "b2RlIHNlbGVjdG9yIG1pc21hdGNoKio6IENoZWNrIGBub2RlU2VsZWN0b3JzYCBpbiBlbnZpcm9u" + + "bWVudCBmaWxlCgogICBgYGBiYXNoCiAgIGt1YmVjdGwgZ2V0IG5vZGVzIC0tc2hvdy1sYWJlbHMg" + + "fCBncmVwIG52Y2YKICAgYGBgCgoyLiAqKlN0b3JhZ2UgY2xhc3Mgbm90IGZvdW5kKio6IENoZWNr" + + "IHN0b3JhZ2UgY2xhc3MgZXhpc3RzCgogICBgYGBiYXNoCiAgIGt1YmVjdGwgZ2V0IHN0b3JhZ2Vj" + + "bGFzcwogICBgYGAKCjMuICoqSW5zdWZmaWNpZW50IHJlc291cmNlcyoqOiBDaGVjayBub2RlIGNh" + + "cGFjaXR5CgogICBgYGBiYXNoCiAgIGt1YmVjdGwgZGVzY3JpYmUgbm9kZSA8bm9kZS1uYW1lPiB8" + + "IGdyZXAgLUE1ICJBbGxvY2F0ZWQgcmVzb3VyY2VzIgogICBgYGAKCiMjIEZhaWx1cmU6IEhlbG0g" + + "UmVsZWFzZSBpbiBGYWlsZWQgU3RhdGUKCiMjIyBTeW1wdG9tcwoKYGBgYmFzaApoZWxtIGxpc3Qg" + + "LUEKIyBTaG93cyByZWxlYXNlIHdpdGggU1RBVFVTOiBmYWlsZWQKYGBgCgpSZS1ydW5uaW5nIGBo" + + "ZWxtZmlsZSBzeW5jYCBhcHBlYXJzIHRvIHN1Y2NlZWQgYnV0IHNlcnZpY2VzIGRvbid0IHdvcmsg" + + "KG1pZ3JhdGlvbnMgc2tpcHBlZCkuCgojIyMgRGlhZ25vc2lzCgpgYGBiYXNoCmhlbG0gaGlzdG9y" + + "eSA8cmVsZWFzZS1uYW1lPiAtbiA8bmFtZXNwYWNlPgpgYGAKCiMjIyBGaXgKCk11c3QgZGVzdHJv" + + "eSB0aGUgZmFpbGVkIHJlbGVhc2UgYW5kIHJlLXN5bmMgKG5vdCBqdXN0IGFwcGx5KToKCmBgYGJh" + + "c2gKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0b3IgbmFtZT08cmVsZWFzZT4g" + + "ZGVzdHJveQojIElmIG5hbWVzcGFjZSBuZWVkcyBjbGVhbnVwOgprdWJlY3RsIGRlbGV0ZSBuYW1l" + + "c3BhY2UgPG5hbWVzcGFjZT4Ka3ViZWN0bCBjcmVhdGUgbmFtZXNwYWNlIDxuYW1lc3BhY2U+CiMg" + + "UmUtY3JlYXRlIHB1bGwgc2VjcmV0IGlmIG5lZWRlZApIRUxNRklMRV9FTlY9PGVudj4gaGVsbWZp" + + "bGUgLS1zZWxlY3RvciBuYW1lPTxyZWxlYXNlPiBzeW5jCmBgYAoKIyMgRmFpbHVyZTogQWNjb3Vu" + + "dCBCb290c3RyYXAgSm9iIEZhaWxlZAoKIyMjIFN5bXB0b21zCgpTZXJ2aWNlcyBkZXBsb3kgYnV0" + + "IGZ1bmN0aW9ucyBjYW4ndCBiZSBjcmVhdGVkLiBFdmVudHMgc2hvdyBib290c3RyYXAgam9iIGZh" + + "aWx1cmUuCgojIyMgRGlhZ25vc2lzCgpgYGBiYXNoCiMgQ2hlY2sgYm9vdHN0cmFwIGpvYiBzdGF0" + + "dXMKa3ViZWN0bCBnZXQgam9icyAtbiBudmNmCgojIEdldCBsb2dzIChqb2IgYXV0by1kZWxldGVz" + + "IGFmdGVyIH41IG1pbnV0ZXMpCmt1YmVjdGwgbG9ncyBqb2IvbnZjZi1hcGktYWNjb3VudC1ib290" + + "c3RyYXAgLW4gbnZjZgoKIyBDaGVjayBBUEkgbG9ncwprdWJlY3RsIGxvZ3MgLW4gbnZjZiAtbCBh" + + "cHAua3ViZXJuZXRlcy5pby9uYW1lPW52Y2YtYXBpIC0tdGFpbD0xMDAKYGBgCgojIyMgQ29tbW9u" + + "IENhdXNlcwoKMS4gKipXcm9uZyBiYXNlNjQgY3JlZGVudGlhbHMqKjogQ3JlZGVudGlhbHMgaW4g" + + "YHNlY3JldHMvPGVudj4tc2VjcmV0cy55YW1sYCBtdXN0IGJlIGAkb2F1dGh0b2tlbjpBUElfS0VZ" + + "YCBiYXNlNjQtZW5jb2RlZCwgbm90IGp1c3QgdGhlIEFQSSBrZXkKCiAgIGBgYGJhc2gKICAgIyBW" + + "ZXJpZnkgeW91ciBlbmNvZGVkIGNyZWRlbnRpYWwKICAgZWNobyAnWU9VUl9CQVNFNjRfU1RSSU5H" + + "JyB8IGJhc2U2NCAtZAogICAjIFNob3VsZCBvdXRwdXQ6ICRvYXV0aHRva2VuOm52YXBpLXh4eHh4" + + "CiAgIGBgYAoKMi4gKipSZWdpc3RyeSB1bnJlYWNoYWJsZSoqOiBBUEkgY2FuJ3QgcmVhY2ggdGhl" + + "IHJlZ2lzdHJ5IHNwZWNpZmllZCBpbiBgYWNjb3VudEJvb3RzdHJhcC5yZWdpc3RyeUNyZWRlbnRp" + + "YWxzYAoKIyMjIEZpeAoKRml4IGNyZWRlbnRpYWxzIGluIHNlY3JldHMgZmlsZSwgdGhlbiByZWNv" + + "dmVyIHNlcnZpY2VzIHdpdGhvdXQgZGVzdHJveWluZyBkZXBlbmRlbmNpZXM6CgpgYGBiYXNoCkhF" + + "TE1GSUxFX0VOVj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIHJlbGVhc2UtZ3JvdXA9c2Vydmlj" + + "ZXMgZGVzdHJveQprdWJlY3RsIGRlbGV0ZSBuYW1lc3BhY2UgbnZjZiBhcGkta2V5cyBlc3Mgc2lz" + + "IC0taWdub3JlLW5vdC1mb3VuZAprdWJlY3RsIGNyZWF0ZSBuYW1lc3BhY2UgbnZjZiAmJiBrdWJl" + + "Y3RsIGNyZWF0ZSBuYW1lc3BhY2UgYXBpLWtleXMgJiYgXAogIGt1YmVjdGwgY3JlYXRlIG5hbWVz" + + "cGFjZSBlc3MgJiYga3ViZWN0bCBjcmVhdGUgbmFtZXNwYWNlIHNpcwojIFJlLWNyZWF0ZSBwdWxs" + + "IHNlY3JldHMgaWYgbmVlZGVkCkhFTE1GSUxFX0VOVj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9y" + + "IHJlbGVhc2UtZ3JvdXA9c2VydmljZXMgc3luYwpgYGAKCiMjIEZhaWx1cmU6IE5WQ0EgQ2xlYW51" + + "cCBTdHVjayAoRmluYWxpemVycykKCiMjIyBTeW1wdG9tcwoKQ29tcHV0ZS1wbGFuZSBjbGVhbnVw" + + "IGhhbmdzLiBOYW1lc3BhY2VzCnN0dWNrIGluIGBUZXJtaW5hdGluZ2A6CgpgYGBiYXNoCmt1YmVj" + + "dGwgZ2V0IG5zCiMgbnZjYS1vcGVyYXRvciAgICBUZXJtaW5hdGluZyAgIDEwbQojIG52Y2YtYmFj" + + "a2VuZCAgICAgVGVybWluYXRpbmcgICAxMG0KYGBgCgojIyMgRml4CgpSdW4gdGhpcyBvbmx5IGFn" + + "YWluc3QgdGhlIGNvbXB1dGUgY29udGV4dCwgYWZ0ZXIgdGhlIG5vcm1hbCBjb21wdXRlLXBsYW5l" + + "CnRlYXJkb3duIGhhcyBmYWlsZWQuIFJlbW92ZSBmaW5hbGl6ZXJzIGZyb20gTlZDRkJhY2tlbmQg" + + "Y3VzdG9tIHJlc291cmNlcyBhbmQKZm9yY2UtZGVsZXRlIHN0dWNrIG5hbWVzcGFjZXM6CgpgYGBi" + + "YXNoCmV4cG9ydCBDT01QVVRFX0NPTlRFWFQ9PGNvbXB1dGUtcGxhbmUtY29udGV4dD4KCiMgUmVt" + + "b3ZlIGZpbmFsaXplcnMgZnJvbSBOVkNGQmFja2VuZCByZXNvdXJjZXMKa3ViZWN0bCAtLWNvbnRl" + + "eHQgIiRDT01QVVRFX0NPTlRFWFQiIGdldCBudmNmYmFja2VuZHMgLUEgLW8ganNvbiB8IFwKICBq" + + "cSAnLml0ZW1zW10gfCAubWV0YWRhdGEubmFtZXNwYWNlICsgIi8iICsgLm1ldGFkYXRhLm5hbWUn" + + "IC1yIHwgXAogIHhhcmdzIC1Je30gc2ggLWMgJ2NvbnRleHQ9IiQxIjsgbnM9IiR7MiUlLyp9Ijsg" + + "bmFtZT0iJHsyIyMqL30iOyBrdWJlY3RsIC0tY29udGV4dCAiJGNvbnRleHQiIHBhdGNoIG52Y2Zi" + + "YWNrZW5kICIkbmFtZSIgLW4gIiRucyIgLS10eXBlPW1lcmdlIC1wICJ7XCJtZXRhZGF0YVwiOntc" + + "ImZpbmFsaXplcnNcIjpbXX19IicgXyAiJENPTVBVVEVfQ09OVEVYVCIge30KCiMgRm9yY2UtZGVs" + + "ZXRlIHN0dWNrIG5hbWVzcGFjZXMgYnkgY2xlYXJpbmcgdGhlaXIgZmluYWxpemVycwpmb3IgbnMg" + + "aW4gbnZjYS1vcGVyYXRvciBudmNmLWJhY2tlbmQ7IGRvCiAga3ViZWN0bCAtLWNvbnRleHQgIiRD" + + "T01QVVRFX0NPTlRFWFQiIGdldCBuYW1lc3BhY2UgIiRucyIgLW8ganNvbiAyPi9kZXYvbnVsbCB8" + + "IFwKICAgIGpxICcuc3BlYy5maW5hbGl6ZXJzID0gW10nIHwgXAogICAga3ViZWN0bCAtLWNvbnRl" + + "eHQgIiRDT01QVVRFX0NPTlRFWFQiIHJlcGxhY2UgXAogICAgICAtLXJhdyAiL2FwaS92MS9uYW1l" + + "c3BhY2VzLyRucy9maW5hbGl6ZSIgLWYgLSAyPi9kZXYvbnVsbApkb25lCmBgYAoKIyMgRmFpbHVy" + + "ZTogTlZDQSBPcGVyYXRvciBNaXNzaW5nIG9yIE5vdCBSZWFkeQoKIyMjIFN5bXB0b21zCgpBZnRl" + + "ciBjb21wdXRlLXBsYW5lIGluc3RhbGwgY29tcGxldGVzLCBubyBgbnZjYS1vcGVyYXRvcmAgRGVw" + + "bG95bWVudCBleGlzdHMsIG9yCml0IGV4aXN0cyBidXQgcG9kcyBhcmUgbm90IHJlYWR5OgoKYGBg" + + "YmFzaAprdWJlY3RsIC0tY29udGV4dCA8Y29tcHV0ZS1wbGFuZS1jb250ZXh0PiBnZXQgZGVwbG95" + + "bWVudCBudmNhLW9wZXJhdG9yIFwKICAtbiBudmNhLW9wZXJhdG9yCmt1YmVjdGwgLS1jb250ZXh0" + + "IDxjb21wdXRlLXBsYW5lLWNvbnRleHQ+IGdldCBwb2RzIC1uIG52Y2Etb3BlcmF0b3IKYGBgCgoj" + + "IyMgRGlhZ25vc2lzIGFuZCBGaXhlcwoKRmlyc3QgaWRlbnRpZnkgd2hldGhlciB0aGUgaW5zdGFs" + + "bGF0aW9uIHVzZWQgdGhlIEhlbG1maWxlIHZhbHVlcyBmbG93IG9yIHRoZQpDTEkgcHJvZmlsZSBm" + + "bG93LiBSZS1ydW4gb25seSB0aGF0IGZsb3cncyByZWdpc3RyYXRpb24gYW5kIGluc3RhbGxhdGlv" + + "biBzdGVwcwpmcm9tIFtTcGxpdCBDb21wdXRlLVBsYW5lIEluc3RhbGxhdGlvbl0oY29tcHV0ZS1w" + + "bGFuZS1pbnN0YWxsYXRpb24ubWQpLiBEbyBub3QKc3Vic3RpdHV0ZSBvbmUgaGFuZG9mZiBmb3Ig" + + "dGhlIG90aGVyLgoKSWYgaW5zdGFsbGF0aW9uIHN1Y2NlZWRzIGJ1dCBwb2RzIHN0aWxsIGZhaWws" + + "IGluc3BlY3QgdGhlIGNvbXB1dGUgY29udGV4dDoKCmBgYGJhc2gKa3ViZWN0bCAtLWNvbnRleHQg" + + "PGNvbXB1dGUtcGxhbmUtY29udGV4dD4gZGVzY3JpYmUgZGVwbG95IG52Y2Etb3BlcmF0b3IgXAog" + + "IC1uIG52Y2Etb3BlcmF0b3IKa3ViZWN0bCAtLWNvbnRleHQgPGNvbXB1dGUtcGxhbmUtY29udGV4" + + "dD4gbG9ncyBkZXBsb3ltZW50L252Y2Etb3BlcmF0b3IgXAogIC1uIG52Y2Etb3BlcmF0b3IgLS10" + + "YWlsPTIwMAprdWJlY3RsIC0tY29udGV4dCA8Y29tcHV0ZS1wbGFuZS1jb250ZXh0PiBnZXQgbnZj" + + "ZmJhY2tlbmQgLW4gbnZjYS1vcGVyYXRvcgpgYGAKCkZvciBwcml2YXRlIHJlZ2lzdHJ5IGZhaWx1" + + "cmVzLCB2ZXJpZnkgdGhhdCB0aGUgcHVsbCBzZWNyZXQgZXhpc3RzIGluCmBudmNhLW9wZXJhdG9y" + + "YC4gVGhlIGNoYXJ0IGFuZCBvcGVyYXRvciBtaXJyb3IgaXQgdG8gYG52Y2Etc3lzdGVtYDsgZG8g" + + "bm90IHVzZSBhCmJyb2FkZXIgbWFudWFsIG5hbWVzcGFjZSBsb29wLiBTZWUKW3B1bGwtc2VjcmV0" + + "cy5tZF0ocHVsbC1zZWNyZXRzLm1kI2NvbXB1dGUtcGxhbmUtc2VjcmV0KS4KCiMjIEZhaWx1cmU6" + + "IEdhdGV3YXkgRW5kcG9pbnQgQ2hhbmdlZAoKIyMjIFN5bXB0b21zCgpSZXF1ZXN0cyB0aHJvdWdo" + + "IHRoZSBjb25maWd1cmVkIHJvdXRlIGRvbWFpbiBmYWlsIGFmdGVyIHRoZSBHYXRld2F5IG9yIGl0" + + "cyBsb2FkIGJhbGFuY2VyIGlzIHJlcGxhY2VkLiBUaGUgR2F0ZXdheSByZXBvcnRzIGEgbmV3IGVu" + + "ZHBvaW50LgoKIyMjIERpYWdub3NpcwoKYGBgYmFzaApHQVRFV0FZX0FERFI9JChrdWJlY3RsIC0t" + + "Y29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBnZXQgZ2F0ZXdheSBcCiAgbnZjZi1nYXRl" + + "d2F5IC1uIGVudm95LWdhdGV3YXkgXAogIC1vIGpzb25wYXRoPSd7LnN0YXR1cy5hZGRyZXNzZXNb" + + "MF0udmFsdWV9JykKdGVzdCAtbiAiJEdBVEVXQVlfQUREUiIKZGlnICtzaG9ydCAiYXBpLjxkb21h" + + "aW4+IgpjdXJsIC1IICJIb3N0OiBhcGkuPGRvbWFpbj4iICJodHRwOi8vJEdBVEVXQVlfQUREUi9o" + + "ZWFsdGgiCgojIENoZWNrIGRpcmVjdCBhZGRyZXNzIGZpZWxkcyB1c2VkIGJ5IGEgc3BsaXQgZGVw" + + "bG95bWVudApncmVwIG52Y2ZOYXRzU2VydmljZVVSTCBkZXBsb3kvc3RhY2tzL3NlbGYtbWFuYWdl" + + "ZC9lbnZpcm9ubWVudHMvPGVudj4ueWFtbApncmVwIC1FICdpY21zU2VydmljZXxyZXZhbFNlcnZp" + + "Y2V8bmF0cycgXAogIGRlcGxveS9zdGFja3MvbnZjZi1jb21wdXRlLXBsYW5lL2Vudmlyb25tZW50" + + "cy88ZW52Pi55YW1sCmBgYAoKIyMjIEZpeAoKS2VlcCBgZ2xvYmFsLmRvbWFpbmAsIHJvdXRlIGhv" + + "c3RuYW1lcywgYW5kIEhvc3Qgb3ZlcnJpZGVzIHVuY2hhbmdlZC4gVXBkYXRlIEROUwpvciB0aGUg" + + "ZGlyZWN0IGNsaWVudCBkZXN0aW5hdGlvbi4gRm9yIHNwbGl0IGRlcGxveW1lbnRzLCB1cGRhdGUg" + + "b25seSBkaXJlY3QKR2F0ZXdheS1hZGRyZXNzIGZpZWxkcyBhbmQgcmVmcmVzaCByZWdpc3RyYXRp" + + "b24gYW5kIGluc3RhbGxhdGlvbiB0aHJvdWdoIHRoZQpzYW1lIHNlbGVjdGVkIGhhbmRvZmYuIFNl" + + "ZQpbRXhhbXBsZSA0XSguLi9leGFtcGxlcy5tZCNleGFtcGxlLTQtcmVjb3Zlci1mcm9tLWEtZ2F0" + + "ZXdheS1lbmRwb2ludC1jaGFuZ2UpLgoKIyMgVXNlZnVsIE5hbWVzcGFjZS10by1TZXJ2aWNlIE1h" + + "cHBpbmcKClF1aWNrIHJlZmVyZW5jZSBmb3Igd2hpY2ggc2VydmljZXMgcnVuIGluIHdoaWNoIG5h" + + "bWVzcGFjZToKCnwgTmFtZXNwYWNlIHwgU2VydmljZXMgfAp8LS0tLS0tLS0tLS18LS0tLS0tLS0t" + + "LXwKfCBuYXRzLXN5c3RlbSB8IG5hdHMgfAp8IGNhc3NhbmRyYS1zeXN0ZW0gfCBjYXNzYW5kcmEg" + + "fAp8IHZhdWx0LXN5c3RlbSB8IG9wZW5iYW8tc2VydmVyIHwKfCBudmNmIHwgYXBpLCBpbnZvY2F0" + + "aW9uLXNlcnZpY2UsIGdycGMtcHJveHksIG5vdGFyeS1zZXJ2aWNlLCByZXZhbCwgbGxtLXJlcXVl" + + "c3Qtcm91dGVyLCBsbG0tYXBpLWdhdGV3YXkgfAp8IGFwaS1rZXlzIHwgYXBpLWtleXMsIGFkbWlu" + + "LWlzc3Vlci1wcm94eSB8CnwgZXNzIHwgZXNzLWFwaSB8Cnwgc2lzIHwgc2lzIHwKfCBlbnZveS1n" + + "YXRld2F5LXN5c3RlbSB8IGVudm95IGdhdGV3YXkgKGluZ3Jlc3MgY29udHJvbGxlcikgfAp8IGVu" + + "dm95LWdhdGV3YXkgfCBnYXRld2F5IHJlc291cmNlICsgcm91dGVzIHwKUEsHCLV6cDu1MAAAtTAA" + + "AFBLAwQUAAgAAAAAACEAAAAAAAAAAAAAAAAARAAJAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtaW5z" + + "dGFsbGF0aW9uL3JlZmVyZW5jZXMvaGVsbWZpbGUtc3RydWN0dXJlLm1kVVQFAAEAps4SIyBIZWxt" + + "ZmlsZSBTdHJ1Y3R1cmUgUmVmZXJlbmNlCgojIyBEaXJlY3RvcnkgTGF5b3V0CgpgYGBiYXNoCm52" + + "Y2Ytc2VsZi1tYW5hZ2VkLXN0YWNrLwp8LS0gaGVsbWZpbGUuZC8KfCAgIHwtLSAwMS1kZXBlbmRl" + + "bmNpZXMueWFtbC5nb3RtcGwgICMgTkFUUywgQ2Fzc2FuZHJhLCBPcGVuQmFvCnwgICB8LS0gMDIt" + + "Y29yZS55YW1sLmdvdG1wbCAgICAgICAgICAjIE5WQ0Ygc2VydmljZXMgKyBpbmdyZXNzCnwgICBg" + + "LS0gMDMtb2JzZXJ2YWJpbGl0eS55YW1sLmdvdG1wbCAjIE9ic2VydmFiaWxpdHkgc3RhY2sgKG9w" + + "dGlvbmFsKQp8LS0gZW52aXJvbm1lbnRzLwp8ICAgfC0tIGJhc2UueWFtbCAgICAgICAgICAgICAg" + + "ICAgICAgIyBEZWZhdWx0IHZhbHVlcyAoYWxsIGVudmlyb25tZW50cykKfCAgIGAtLSA8ZW52LW5h" + + "bWU+LnlhbWwgICAgICAgICAgICAgICMgUGVyLWVudmlyb25tZW50IG92ZXJyaWRlcwp8LS0gc2Vj" + + "cmV0cy8KfCAgIGAtLSA8ZW52LW5hbWU+LXNlY3JldHMueWFtbCAgICAgICMgU2Vuc2l0aXZlIHZh" + + "bHVlcyAocmVnaXN0cnkgY3JlZHMsIHBhc3N3b3JkcykKYC0tIGdsb2JhbC55YW1sLmdvdG1wbCAg" + + "ICAgICAgICAgICAgICMgR28gdGVtcGxhdGUgdGhhdCBjb25zdHJ1Y3RzIHBlci1jaGFydCB2YWx1" + + "ZXMKCm52Y2YtY29tcHV0ZS1wbGFuZS1zdGFjay8KfC0tIGhlbG1maWxlLmQvCnwgICB8LS0gMDEt" + + "ZGVwZW5kZW5jaWVzLnlhbWwuZ290bXBsICAjIENvbXB1dGUgcGxhbmUgZGVwZW5kZW5jeSBjb21w" + + "b25lbnRzCnwgICBgLS0gMDItbnZjYS55YW1sLmdvdG1wbCAgICAgICAgICAjIG52Y2Etb3BlcmF0" + + "b3IgY2hhcnQgYW5kIG52Y2EgY29uZmlndXJhdGlvbgp8LS0gZW52aXJvbm1lbnRzLwp8ICAgfC0t" + + "IGJhc2UueWFtbCAgICAgICAgICAgICAgICAgICAgIyBEZWZhdWx0IHZhbHVlcyAoYWxsIGVudmly" + + "b25tZW50cykKfCAgIGAtLSA8ZW52LW5hbWU+LnlhbWwgICAgICAgICAgICAgICMgUGVyLWVudmly" + + "b25tZW50IG92ZXJyaWRlcwpgLS0gZ2xvYmFsLnlhbWwuZ290bXBsICAgICAgICAgICAgICAgIyBH" + + "byB0ZW1wbGF0ZSB0aGF0IGNvbnN0cnVjdHMgcGVyLWNoYXJ0IHZhbHVlcwpgYGAKClRoZXNlIHN0" + + "YWNrcyBoYXZlIHNlcGFyYXRlIGVudmlyb25tZW50cyBhbmQgY2x1c3RlciBjb250ZXh0cy4gVGhl" + + "IEhlbG1maWxlCnZhbHVlcyBmbG93IGF1dGhvcnMgYm90aCBlbnZpcm9ubWVudCBmaWxlcy4gVGhl" + + "IENMSSBwcm9maWxlIGZsb3cgaW5zdGVhZCB1c2VzCnRoZSBDTEktZ2VuZXJhdGVkIGNvbnRyb2wt" + + "cGxhbmUgcHJvZmlsZSBhcyBpdHMgZW5kcG9pbnQgc291cmNlLiBEbyBub3QgbWl4IHRoZQpoYW5k" + + "b2Zmcy4gU2VlIFtTcGxpdCBDb21wdXRlLVBsYW5lIEluc3RhbGxhdGlvbl0oY29tcHV0ZS1wbGFu" + + "ZS1pbnN0YWxsYXRpb24ubWQpLgoKIyMgR290bXBsIEZpbGVzIGFuZCBUaGVpciBSZWxlYXNlcwoK" + + "IyMjIDAxLWRlcGVuZGVuY2llcy55YW1sLmdvdG1wbAoKfCBSZWxlYXNlIHwgQ2hhcnQgfCBOYW1l" + + "c3BhY2UgfCBOb3RlcyB8CnwtLS0tLS0tLS18LS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tfAp8" + + "IG5hdHMgfCBoZWxtLW52Y2YtbmF0cyB8IG5hdHMtc3lzdGVtIHwgTWVzc2FnaW5nIHwKfCBvcGVu" + + "YmFvLXNlcnZlciB8IGhlbG0tbnZjZi1vcGVuYmFvLXNlcnZlciB8IHZhdWx0LXN5c3RlbSB8IFNl" + + "Y3JldHMgbWFuYWdlbWVudCwgZGVwZW5kcyBvbiBuYXRzIHwKfCBjYXNzYW5kcmEgfCBoZWxtLW52" + + "Y2YtY2Fzc2FuZHJhIHwgY2Fzc2FuZHJhLXN5c3RlbSB8IERhdGFiYXNlIHwKClVzZXMgYDw8OiAq" + + "ZGVwZW5kZW5jeWAgdGVtcGxhdGUgaW5oZXJpdGFuY2Ugd2l0aCBgcmVsZWFzZS1ncm91cDogZGVw" + + "ZW5kZW5jaWVzYCBsYWJlbC4KCiMjIyAwMi1jb3JlLnlhbWwuZ290bXBsCgp8IFJlbGVhc2UgfCBD" + + "aGFydCB8IE5hbWVzcGFjZSB8IExhYmVsIHwKfC0tLS0tLS0tLXwtLS0tLS0tfC0tLS0tLS0tLS0t" + + "fC0tLS0tLS18CnwgYXBpLWtleXMgfCBoZWxtLW52Y2YtYXBpLWtleXMgfCBhcGkta2V5cyB8IHNl" + + "cnZpY2VzIHwKfCBzaXMgfCBoZWxtLW52Y2Ytc2lzIHwgc2lzIHwgc2VydmljZXMgfAp8IGFwaSB8" + + "IGhlbG0tbnZjZi1hcGkgfCBudmNmIHwgc2VydmljZXMgfAp8IGludm9jYXRpb24tc2VydmljZSB8" + + "IGhlbG0tbnZjZi1pbnZvY2F0aW9uLXNlcnZpY2UgfCBudmNmIHwgc2VydmljZXMgfAp8IGdycGMt" + + "cHJveHkgfCBoZWxtLW52Y2YtZ3JwYy1wcm94eSB8IG52Y2YgfCBzZXJ2aWNlcyB8CnwgZXNzLWFw" + + "aSB8IGhlbG0tbnZjZi1lc3MtYXBpIHwgZXNzIHwgc2VydmljZXMgfAp8IG5vdGFyeS1zZXJ2aWNl" + + "IHwgaGVsbS1udmNmLW5vdGFyeS1zZXJ2aWNlIHwgbnZjZiB8IHNlcnZpY2VzIHwKfCByZXZhbCB8" + + "IGhlbG0tcmV2YWwgfCBudmNmIHwgc2VydmljZXMgfAp8IGxsbS1yZXF1ZXN0LXJvdXRlciB8IG52" + + "Y2YvaGVsbS1udmNmLWxsbS1yZXF1ZXN0LXJvdXRlciB8IG52Y2YgfCBzZXJ2aWNlcyB8CnwgbGxt" + + "LWFwaS1nYXRld2F5IHwgbnZjZi9oZWxtLW52Y2YtbGxtLWFwaS1nYXRld2F5IHwgbnZjZiB8IHNl" + + "cnZpY2VzIHwKfCBhZG1pbi1pc3N1ZXItcHJveHkgfCBoZWxtLWFkbWluLXRva2VuLWlzc3Vlci1w" + + "cm94eSB8IGFwaS1rZXlzIHwgKG5vIHJlbGVhc2UtZ3JvdXAgbGFiZWwpIHwKfCBpbmdyZXNzIHwg" + + "bnZjZi1nYXRld2F5LXJvdXRlcyB8IGVudm95LWdhdGV3YXktc3lzdGVtIHwgaW5ncmVzcyB8CgpN" + + "b3N0IHNlcnZpY2VzIHVzZSBgaW5oZXJpdDogW3t0ZW1wbGF0ZTogc2VydmljZX1dYC4gTExNIHJl" + + "bGVhc2VzIHVzZSBPQ0kgY2hhcnRzIGZyb20gdGhlIGBudmNmYCByZXBvc2l0b3J5IHdpdGggc3Rh" + + "bmRhbG9uZSBgdmFsdWVzOiBbLi4vZ2xvYmFsLnlhbWwuZ290bXBsXWAgYmxvY2tzOyB0aGV5IGFy" + + "ZSBnYXRlZCBvbiBgYWRkb25zLmxsbS5lbmFibGVkYC4gYGFkbWluLWlzc3Vlci1wcm94eWAgYW5k" + + "IGBpbmdyZXNzYCBoYXZlIHN0YW5kYWxvbmUgYHZhbHVlczpgIGJsb2Nrcy4KCiMjIyAwMy1vYnNl" + + "cnZhYmlsaXR5LnlhbWwuZ290bXBsCgp8IFJlbGVhc2UgfCBDaGFydCB8IE5hbWVzcGFjZSB8IExh" + + "YmVsIHwKfC0tLS0tLS0tLXwtLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS18CnwgKG9ic2VydmFi" + + "aWxpdHkgcmVsZWFzZXMpIHwgKHZhcmlvdXMpIHwgb2JzZXJ2YWJpbGl0eSB8IG9ic2VydmFiaWxp" + + "dHkgfAoKR2F0ZWQgb24gb2JzZXJ2YWJpbGl0eS1zcGVjaWZpYyBmbGFncyBpbiB0aGUgZW52aXJv" + + "bm1lbnQgZmlsZS4gU2tpcHBlZCBpZiBkaXNhYmxlZC4KCiMjIFRlbXBsYXRlIEluaGVyaXRhbmNl" + + "CgojIyMgYDw8OiAqZGVwZW5kZW5jeWAgKFlBTUwgbWVyZ2UpCgpVc2VkIGluIGAwMS1kZXBlbmRl" + + "bmNpZXMueWFtbC5nb3RtcGxgLiBNZXJnZXMgdGhlIHRlbXBsYXRlJ3MgcHJvcGVydGllcyBpbnRv" + + "IHRoZSByZWxlYXNlLgoKKipHb3RjaGEqKjogWUFNTCBtZXJnZSByZXBsYWNlcyBsaXN0cy4gSWYg" + + "eW91IGFkZCBhIGB2YWx1ZXM6YCBrZXkgdG8gdGhlIHJlbGVhc2UsIGl0ICoqcmVwbGFjZXMqKiB0" + + "aGUgdGVtcGxhdGUncyBgdmFsdWVzOmAgbGlzdCBlbnRpcmVseS4gWW91IG11c3QgcmUtaW5jbHVk" + + "ZSBhbGwgdGVtcGxhdGUgdmFsdWVzOgoKSW4gdGhlIHRlbXBsYXRlIGJlbG93LCBgPHByaXZhdGUt" + + "dmFsdWVzPmAgcmVmZXJzIHRvIHRoZSBgc2VjcmV0cy9gIGRpcmVjdG9yeSBhdCB0aGUgaGVsbWZp" + + "bGUgc3RhY2sgcm9vdC4KCmBgYHlhbWwKIyBUZW1wbGF0ZSBkZWZpbmVzOgp0ZW1wbGF0ZXM6CiAg" + + "ZGVwZW5kZW5jeTogJmRlcGVuZGVuY3kKICAgIGNoYXJ0OiBudmNmL2hlbG0tbnZjZi17eyAuUmVs" + + "ZWFzZS5OYW1lIH19CiAgICB2YWx1ZXM6CiAgICAgIC0gLi4vZ2xvYmFsLnlhbWwuZ290bXBsCiAg" + + "ICAgIC0gLi4vPHByaXZhdGUtdmFsdWVzPi97eyByZXF1aXJlZEVudiAiSEVMTUZJTEVfRU5WIiB9" + + "fS1zZWNyZXRzLnlhbWwKCiMgV2hlbiBvdmVycmlkaW5nLCBNVVNUIHJlLWluY2x1ZGUgYm90aDoK" + + "LSBuYW1lOiBjYXNzYW5kcmEKICA8PDogKmRlcGVuZGVuY3kKICB2YWx1ZXM6CiAgICAtIC4uL2ds" + + "b2JhbC55YW1sLmdvdG1wbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg" + + "ICAgICAjIE11c3QgcmUtaW5jbHVkZQogICAgLSAuLi88cHJpdmF0ZS12YWx1ZXM+L3t7IHJlcXVp" + + "cmVkRW52ICJIRUxNRklMRV9FTlYiIH19LXNlY3JldHMueWFtbCAgICMgTXVzdCByZS1pbmNsdWRl" + + "CiAgICAtIGNhc3NhbmRyYTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg" + + "ICAgICAgICAgICAgICAgICAgIyBZb3VyIG92ZXJyaWRlCiAgICAgICAgcmVzb3VyY2VzOgogICAg" + + "ICAgICAgbGltaXRzOgogICAgICAgICAgICBtZW1vcnk6IDgxOTJNaQpgYGAKCiMjIyBgaW5oZXJp" + + "dGAgKEhlbG1maWxlIG5hdGl2ZSkKClVzZWQgaW4gYDAyLWNvcmUueWFtbC5nb3RtcGxgLiBIZWxt" + + "ZmlsZSdzIG5hdGl2ZSBpbmhlcml0YW5jZSBtZWNoYW5pc20uCgpgYGB5YW1sCi0gbmFtZTogYXBp" + + "CiAgdmVyc2lvbjogMS42LjAKICBuYW1lc3BhY2U6IG52Y2YKICBpbmhlcml0OgogICAgLSB0ZW1w" + + "bGF0ZTogc2VydmljZQpgYGAKCldoZW4gYWRkaW5nIGB2YWx1ZXM6YCB0byBhbiBpbmhlcml0ZWQg" + + "cmVsZWFzZSwgeW91IGFsc28gbmVlZCB0byByZS1pbmNsdWRlIHRoZSB0ZW1wbGF0ZSdzIHZhbHVl" + + "cyBmaWxlcyBzaW5jZSBgdmFsdWVzYCBpcyBhIGxpc3QgdGhhdCBnZXRzIHJlcGxhY2VkLgoKIyMg" + + "VmFsdWVzIFByZWNlZGVuY2UKCkZyb20gbG93ZXN0IHRvIGhpZ2hlc3QgcHJpb3JpdHk6CgoxLiBg" + + "ZW52aXJvbm1lbnRzL2Jhc2UueWFtbGAgLS0gZGVmYXVsdHMgc2hhcmVkIGFjcm9zcyBhbGwgZW52" + + "aXJvbm1lbnRzCjIuIGBlbnZpcm9ubWVudHMvPGVudj4ueWFtbGAgLS0gcGVyLWVudmlyb25tZW50" + + "IG92ZXJyaWRlcwozLiBgZ2xvYmFsLnlhbWwuZ290bXBsYCAtLSBHbyB0ZW1wbGF0ZSBwcm9jZXNz" + + "aW5nIChjb25zdHJ1Y3RzIGNoYXJ0LXNwZWNpZmljIHN0cnVjdHVyZSkKNC4gYDxwcml2YXRlLXZh" + + "bHVlcz4vPGVudj4tc2VjcmV0cy55YW1sYCAtLSBzZW5zaXRpdmUgdmFsdWVzCjUuIElubGluZSBg" + + "dmFsdWVzOmAgYmxvY2tzIG9uIHJlbGVhc2VzIC0tIGhpZ2hlc3QgcHJlY2VkZW5jZQoKIyMgV2hh" + + "dCBnbG9iYWwueWFtbC5nb3RtcGwgUGFzc2VzIFRocm91Z2gKCmBnbG9iYWwueWFtbC5nb3RtcGxg" + + "IHJlYWRzIGZyb20gYC5WYWx1ZXNgICh0aGUgbWVyZ2VkIGVudmlyb25tZW50ICsgZW52LXNwZWNp" + + "ZmljIFlBTUwpIGFuZCBjb25zdHJ1Y3RzIGNoYXJ0LXNwZWNpZmljIHZhbHVlcy4gSXQgb25seSBw" + + "YXNzZXMgdGhyb3VnaCBrZXlzIGl0IGV4cGxpY2l0bHkgcmVmZXJlbmNlczoKCiMjIyBDYXNzYW5k" + + "cmEKCi0gYGNhc3NhbmRyYS5yZXBsaWNhQ291bnRgCi0gYGNhc3NhbmRyYS5pbWFnZS4qYCAocmVn" + + "aXN0cnksIHJlcG9zaXRvcnkpCi0gYGNhc3NhbmRyYS5taWdyYXRpb25zLmltYWdlLipgCi0gYGNh" + + "c3NhbmRyYS5wZXJzaXN0ZW5jZS5zaXplYAotIGBjYXNzYW5kcmEubm9kZVNlbGVjdG9yYCAoaWYg" + + "YGdsb2JhbC5ub2RlU2VsZWN0b3JzLmVuYWJsZWRgKQotIGBjYXNzYW5kcmEuZ2xvYmFsLmRlZmF1" + + "bHRTdG9yYWdlQ2xhc3NgCgojIyMgTkFUUwoKLSBgbmF0cy5jb250YWluZXIuaW1hZ2UuKmAKLSBg" + + "bmF0cy5yZWxvYWRlci5pbWFnZS4qYAotIGBuYXRzLm5hdHNCb3guY29udGFpbmVyLmltYWdlLipg" + + "Ci0gYG5hdHMuY29uZmlnLmpldHN0cmVhbS5maWxlU3RvcmUucHZjLnN0b3JhZ2VDbGFzc05hbWVg" + + "Ci0gYG5hdHMucG9kVGVtcGxhdGUubWVyZ2Uuc3BlYy5ub2RlU2VsZWN0b3JgIChpZiBlbmFibGVk" + + "KQoKIyMjIE9wZW5CYW8KCi0gYG9wZW5iYW8ubWlncmF0aW9ucy5pbWFnZS4qYCBhbmQgYG9wZW5i" + + "YW8ubWlncmF0aW9ucy5lbnZgCi0gYG9wZW5iYW8uaW5qZWN0b3IuaW1hZ2UuKmAKLSBgb3BlbmJh" + + "by5zZXJ2ZXIuaW1hZ2UuKmAKLSBgb3BlbmJhby5zZXJ2ZXIuZGF0YVN0b3JhZ2UuKmAKLSBOb2Rl" + + "IHNlbGVjdG9ycyAoaWYgZW5hYmxlZCkKCiMjIyBTZXJ2aWNlcyAoQVBJLCBTSVMsIGV0Yy4pCgot" + + "IGA8c2VydmljZT4uaW1hZ2UuKmAgKHJlZ2lzdHJ5LCByZXBvc2l0b3J5KQotIGA8c2VydmljZT4u" + + "bm9kZVNlbGVjdG9yYCAoaWYgZW5hYmxlZCkKLSBgPHNlcnZpY2U+LmVudi4qYCAob2JzZXJ2YWJp" + + "bGl0eSBzZXR0aW5ncykKCiMjIyBMTE0gRnVuY3Rpb24gRW5hYmxlbWVudAoKRW5hYmxlIHRoZSBM" + + "TE0gYWRkb24gYmVmb3JlIGNyZWF0aW5nIG9yIGludm9raW5nIGZ1bmN0aW9ucyB3aXRoCmBmdW5j" + + "dGlvblR5cGU6ICJMTE0iYC4gVGhlIGFkZG9uIGRlcGxveXMgYGxsbS1yZXF1ZXN0LXJvdXRlcmAg" + + "YW5kCmBsbG0tYXBpLWdhdGV3YXlgLCBhZGRzIHRoZSBgbGxtLmludm9jYXRpb24uPGRvbWFpbj5g" + + "IHJvdXRlIHdoZW4gR2F0ZXdheSBBUEkKaW5ncmVzcyBpcyBlbmFibGVkLCBhbmQgY29uZmlndXJl" + + "cyB3b3JrZXJzIHRvIHVzZSB0aGUgTExNIHNpZGVjYXIuIFRoZSBIZWxtZmlsZQpjb25kaXRpb24g" + + "aXMgYGFkZG9ucy5sbG0uZW5hYmxlZGAuIERvIG5vdCB1c2UgdGhlIG9ic29sZXRlIGBsbG0uZW5h" + + "YmxlZGAgcGF0aC4KCkZvciBhIHNpbmdsZS1ub2RlIGlzb2xhdGVkIHRlc3QgY2x1c3RlciwgYWRk" + + "IHRoaXMgY29uZmlndXJhdGlvbiB0bwpgZW52aXJvbm1lbnRzLzxlbnY+LnlhbWxgIGJlZm9yZSBh" + + "cHBseWluZyB0aGUgc3RhY2s6CgpgYGB5YW1sCmFkZG9uczoKICBsbG06CiAgICBlbmFibGVkOiB0" + + "cnVlCiAgICBnYXRld2F5OgogICAgICByZXBsaWNhQ291bnQ6IDEKICAgICAgbWV0cmljczoKICAg" + + "ICAgICBzZXJ2aWNlTW9uaXRvcjoKICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlCiAgICByZXF1ZXN0" + + "Um91dGVyOgogICAgICByZXBsaWNhQ291bnQ6IDEKICAgICAgbWV0cmljczoKICAgICAgICBzZXJ2" + + "aWNlTW9uaXRvcjoKICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlCgphZ2VudENvbmZpZzoKICBtZXJn" + + "ZUNvbmZpZzogfAogICAgY2x1c3RlcjoKICAgICAgdmFsaWRhdGlvblBvbGljeToKICAgICAgICBu" + + "YW1lOiBVbnJlc3RyaWN0ZWQKICAgIHdvcmtsb2FkOgogICAgICBzdGFyZ2F0ZVFVSUNJbnNlY3Vy" + + "ZTogdHJ1ZQpgYGAKClVzZSBgcmVwbGljYUNvdW50OiAxYCBvbmx5IGZvciBsb2NhbCBvciBzaW5n" + + "bGUtbm9kZSB0ZXN0IGNsdXN0ZXJzLiBUaGUgYnVuZGxlZApOVkNGIEFQSSBjdXJyZW50bHkgc2Vy" + + "dmVzIHBsYWludGV4dCBnUlBDIG9uIHBvcnQgOTA5MCwgc28gdGhlIHNlbGYtbWFuYWdlZCBzdGFj" + + "awpkZWZhdWx0cyB0aGUgTExNIEFQSSBHYXRld2F5IGF1dGhlbnRpY2F0aW9uIGhvcCB0byBwbGFp" + + "bnRleHQuIFNldApgYWRkb25zLmxsbS5nYXRld2F5LmF1dGguZ3JwY0luc2VjdXJlOiBmYWxzZWAg" + + "b25seSB3aXRoIGEgVExTLWNhcGFibGUgTlZDRiBBUEkuCgpXb3JrZXItdG8tcm91dGVyIHRyYW5z" + + "cG9ydCBpcyBzZXBhcmF0ZS4gRm9yIHNoYXJlZCBvciBwcm9kdWN0aW9uIGNsdXN0ZXJzLCB1c2UK" + + "dGhlIHJlcXVpcmVkIHJlcGxpY2EgY291bnQgYW5kIHRoZSBtYW5hZ2VkIFRMUyBjb25maWd1cmF0" + + "aW9uLiBUaGUKYHdvcmtsb2FkLnN0YXJnYXRlUVVJQ0luc2VjdXJlYCBzZXR0aW5nIGVuYWJsZXMg" + + "cGxhaW50ZXh0IHdvcmtlciB0cmFuc3BvcnQgYW5kCm11c3Qgbm90IGJlIHVzZWQgaW4gcHJvZHVj" + + "dGlvbi4KClRoZSByZXF1ZXN0IHJvdXRlciB1c2VzIGBwb3dlci1vZi10d29gIHdoZW4gbm8gbG9h" + + "ZC1iYWxhbmNlciBjb25maWd1cmF0aW9uIGlzCnNldC4gQ29uZmlndXJlIG90aGVyIHJvdXRpbmcg" + + "bWV0aG9kcyB3aXRoIHRoZQpbTExNIFJlcXVlc3QgUm91dGVyIExvYWQgQmFsYW5jaW5nXShodHRw" + + "czovL2dpdGh1Yi5jb20vTlZJRElBL252Y2YvYmxvYi9tYWluL2RvY3MvdXNlci9sbG0tcmVxdWVz" + + "dC1yb3V0ZXItbG9hZC1iYWxhbmNpbmcubWQpCmd1aWRlLgoKSWYgdGhlIHNpZGVjYXIgaW1hZ2Ug" + + "aXMgbWlycm9yZWQgb3V0c2lkZSB0aGUgc3RhY2sncyBkZWZhdWx0IGltYWdlIHJlZ2lzdHJ5IGFu" + + "ZApyZXBvc2l0b3J5LCBzZXQgdGhlIGdlbmVyYXRlZCB3b3JrZXIgc2lkZWNhciBpbWFnZSBleHBs" + + "aWNpdGx5OgoKYGBgeWFtbAphcGk6CiAgcmVtb3RlQ29uZmlnOgogICAgY29uZmlnRGF0YToKICAg" + + "ICAgbnZjZjoKICAgICAgICBzaWRlY2FyczoKICAgICAgICAgIGxsbS1yb3V0ZXItY2xpZW50LWlt" + + "YWdlOiA8cmVnaXN0cnk+LzxyZXBvc2l0b3J5Pi9weWxvbjowLjE0LjEKYGBgCgpUaGUgbGVnYWN5" + + "IGBhcGkuZW52Lk5WQ0ZfU0lERUNBUlNfTExNX1JPVVRFUl9DTElFTlRfSU1BR0VgIHBhdGggaXMg" + + "ZGVwcmVjYXRlZC4KVGhlIHN0YWNrIHRyYW5zbGF0ZXMgaXQgZm9yIG9uZSBjb21wYXRpYmlsaXR5" + + "IHdpbmRvdywgYnV0IG5ldyBjb25maWd1cmF0aW9ucwptdXN0IHVzZSB0aGUgcmVtb3RlLWNvbmZp" + + "ZyBwYXRoLiBDb25mbGljdGluZyB2YWx1ZXMgZmFpbCByZW5kZXJpbmcuCgpSZW5kZXIgYW5kIGFw" + + "cGx5IHRoZSB1cGRhdGVkIGNvbnRyb2wtcGxhbmUgZW52aXJvbm1lbnQsIHRoZW4gcmVmcmVzaCBl" + + "dmVyeQpyZWdpc3RlcmVkIGNvbXB1dGUgcGxhbmUgdXNpbmcgdGhlIHNhbWUgaGFuZG9mZiB1c2Vk" + + "IGZvciBpdHMgaW5zdGFsbGF0aW9uIHNvCk5WQ0EgcmVjZWl2ZXMgYGFnZW50Q29uZmlnLm1lcmdl" + + "Q29uZmlnYDoKCmBgYGJhc2gKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIHRlbXBsYXRlCkhF" + + "TE1GSUxFX0VOVj08ZW52PiBoZWxtZmlsZSBzeW5jCmBgYAoKVXNlIHRoZSBjb21wbGV0ZSBjb21w" + + "dXRlLXBsYW5lIGluc3RhbGwgY29tbWFuZCBmcm9tCltTcGxpdCBDb21wdXRlLVBsYW5lIEluc3Rh" + + "bGxhdGlvbl0oY29tcHV0ZS1wbGFuZS1pbnN0YWxsYXRpb24ubWQpLiBBCkNMSS1wcm9maWxlIGlu" + + "c3RhbGxhdGlvbiBtdXN0IHJlbWFpbiBwcm9maWxlLWRyaXZlbjsgYSBIZWxtZmlsZSBpbnN0YWxs" + + "YXRpb24KbXVzdCByZW1haW4gdmFsdWVzLWRyaXZlbi4KCkV4aXN0aW5nIExMTSBmdW5jdGlvbiB2" + + "ZXJzaW9ucyByZXRhaW4gdGhlIHdvcmtlci1zaWRlY2FyIGltYWdlIG1ldGFkYXRhCmNhcHR1cmVk" + + "IHdoZW4gdGhlIHZlcnNpb24gaXMgY3JlYXRlZC4gUmVwbGFjaW5nIHBvZHMgb3IgcmVkZXBsb3lp" + + "bmcgdGhlIHNhbWUKdmVyc2lvbiBkb2VzIG5vdCBhcHBseSBhIG5ldyBQeWxvbiBpbWFnZS4gQWZ0" + + "ZXIgdGhlIGNvbnRyb2wtcGxhbmUgdXBkYXRlLApjcmVhdGUgYW5kIGRlcGxveSBhIG5ldyBmdW5j" + + "dGlvbiB2ZXJzaW9uLiBWZXJpZnkgdGhlIGNvbnRyb2wgcGxhbmUsIHJvdXRlLCBhbmQKd29ya2Vy" + + "IHNpZGVjYXI6CgpgYGBiYXNoCmt1YmVjdGwgZ2V0IGRlcGxveSAtbiBudmNmIGxsbS1hcGktZ2F0" + + "ZXdheQprdWJlY3RsIGdldCBzdGF0ZWZ1bHNldCAtbiBudmNmIGxsbS1yZXF1ZXN0LXJvdXRlcgpr" + + "dWJlY3RsIGdldCBwb2RzIC1uIG52Y2YgfCBncmVwIC1FICdsbG0tYXBpLWdhdGV3YXl8bGxtLXJl" + + "cXVlc3Qtcm91dGVyJwprdWJlY3RsIGdldCBodHRwcm91dGUgLUEgfCBncmVwIGxsbQprdWJlY3Rs" + + "IC1uIG52Y2YtYmFja2VuZCBnZXQgcG9kIDxmdW5jdGlvbi1wb2Q+IFwKICAtbyBqc29ucGF0aD0n" + + "e3JhbmdlIC5zcGVjLmNvbnRhaW5lcnNbPyhALm5hbWU9PSJsbG0td29ya2VyIildLmFyZ3NbKl19" + + "ey59eyJcXG4ifXtlbmR9JwpgYGAKCkZvciBsb2NhbCBwbGFpbnRleHQgY2x1c3RlcnMsIHRoZSBg" + + "bGxtLXdvcmtlcmAgYXJncyBtdXN0IGluY2x1ZGUKYC0tcXVpYy1pbnNlY3VyZWAuCgpGb3IgbG9h" + + "ZC1iYWxhbmNlciBzY2hlbWEgYW5kIGFsZ29yaXRobSBiZWhhdmlvciwgc2VlIHRoZQpbU3Rhcmdh" + + "dGUgY29uZmlndXJhdGlvbiBndWlkZV0oaHR0cHM6Ly9naXRodWIuY29tL05WSURJQS9udmNmL2Js" + + "b2IvbWFpbi9zcmMvbGlicmFyaWVzL3J1c3Qvc3RhcmdhdGUvZG9jcy9sb2FkLWJhbGFuY2VyLWNv" + + "bmZpZ3VyYXRpb24ubWQpLgoKIyMgSGVsbWZpbGUgU2VsZWN0b3JzCgpUYXJnZXQgc3BlY2lmaWMg" + + "cmVsZWFzZXMgb3IgZ3JvdXBzOgoKYGBgYmFzaAojIEJ5IHJlbGVhc2UgZ3JvdXAKSEVMTUZJTEVf" + + "RU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0b3IgcmVsZWFzZS1ncm91cD1kZXBlbmRlbmNpZXMg" + + "c3luYwpIRUxNRklMRV9FTlY9PGVudj4gaGVsbWZpbGUgLS1zZWxlY3RvciByZWxlYXNlLWdyb3Vw" + + "PXNlcnZpY2VzIHN5bmMKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0b3IgcmVs" + + "ZWFzZS1ncm91cD1pbmdyZXNzIHN5bmMKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2Vs" + + "ZWN0b3IgcmVsZWFzZS1ncm91cD1vYnNlcnZhYmlsaXR5IHN5bmMKCiMgQnkgcmVsZWFzZSBuYW1l" + + "CkhFTE1GSUxFX0VOVj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9Y2Fzc2FuZHJhIHN5" + + "bmMKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0b3IgbmFtZT1hZG1pbi1pc3N1" + + "ZXItcHJveHkgc3luYwpIRUxNRklMRV9FTlY9PGVudj4gaGVsbWZpbGUgLS1zZWxlY3RvciBuYW1l" + + "PWxsbS1yZXF1ZXN0LXJvdXRlciBzeW5jCkhFTE1GSUxFX0VOVj08ZW52PiBoZWxtZmlsZSAtLXNl" + + "bGVjdG9yIG5hbWU9bGxtLWFwaS1nYXRld2F5IHN5bmMKCiMgVGVtcGxhdGUgb25seSAoZHJ5IHJ1" + + "bikKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0b3IgbmFtZT1jYXNzYW5kcmEg" + + "dGVtcGxhdGUKCiMgRGVzdHJveSBhIHNpbmdsZSByZWxlYXNlCkhFTE1GSUxFX0VOVj08ZW52PiBo" + + "ZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9Y2Fzc2FuZHJhIGRlc3Ryb3kKYGBgCgpOb3RlOiBgYWRt" + + "aW4taXNzdWVyLXByb3h5YCBoYXMgbm8gYHJlbGVhc2UtZ3JvdXBgIGxhYmVsLiBVc2UgYC0tc2Vs" + + "ZWN0b3IgbmFtZT1hZG1pbi1pc3N1ZXItcHJveHlgLgpQSwcIsTUd2wIqAAACKgAAUEsDBBQACAAA" + + "AAAAIQAAAAAAAAAAAAAAAAA/AAkAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24v" + + "cmVmZXJlbmNlcy9udmNmLXVpLWFkZG9uLm1kVVQFAAEAps4SIyBOVkNGIFVJIEFkZG9uCgpOVkNG" + + "IFVJIGlzIGFuIG9wdGlvbmFsLCBjdXN0b21lci1mYWNpbmcgTlZDRiBhZG1pbi1wYW5lbCBVSS4g" + + "SXQgaXMgZGlzYWJsZWQgYnkKZGVmYXVsdCBhbmQgYXZhaWxhYmxlIG9ubHkgaW4gc3RhY2sgcGFj" + + "a2FnZXMgdGhhdCBpbmNsdWRlIHRoZSBOVkNGIFVJIGFkZG9uLgoKIyMgV2hlbiB0byBlbmFibGUK" + + "CkVuYWJsZSBOVkNGIFVJIG9ubHkgd2hlbiB5b3UgbmVlZCB0aGUgYWRtaW4tcGFuZWwgVUkgYW5k" + + "IHlvdXIgZXh0cmFjdGVkIHN0YWNrCnBhY2thZ2UgaW5jbHVkZXMgdGhlIGFkZG9uLiBJZiB0aGUg" + + "cGFja2FnZSBkb2VzIG5vdCBjb250YWluIGEgYG52Y2YtdWlgIHJlbGVhc2UKYW5kIGBudmNmVWlg" + + "IHJvdXRlIHZhbHVlcywgc2tpcCB0aGUgYWRkb24gdW50aWwgeW91IHVzZSBhIHBhY2thZ2UgdGhh" + + "dCBpbmNsdWRlcwp0aGVtLgoKIyMgRW5hYmxlIHRoZSBhZGRvbgoKRW5hYmxlIGl0IGluIGBlbnZp" + + "cm9ubWVudHMvPGVudi1uYW1lPi55YW1sYDoKCmBgYHlhbWwKYWRkb25zOgogIG52Y2ZVaToKICAg" + + "IGVuYWJsZWQ6IHRydWUKYGBgCgojIyBDcmVhdGUgbmFtZXNwYWNlIGFuZCBpbWFnZSBwdWxsIHNl" + + "Y3JldAoKQ3JlYXRlIHRoZSBuYW1lc3BhY2UsIGFuZCBhbiBpbWFnZSBwdWxsIHNlY3JldCBvbmx5" + + "IGlmIHB1bGxpbmcgZnJvbSBhIHByaXZhdGUKcmVnaXN0cnk6CgpgYGBiYXNoCmt1YmVjdGwgY3Jl" + + "YXRlIG5hbWVzcGFjZSBudmNmLXVpIC0tZHJ5LXJ1bj1jbGllbnQgLW8geWFtbCB8IGt1YmVjdGwg" + + "YXBwbHkgLWYgLQoKIyBPbmx5IGlmIHB1bGxpbmcgZnJvbSBhIHByaXZhdGUgcmVnaXN0cnkgKGUu" + + "Zy4sIE5HQyBudmNyLmlvKQpleHBvcnQgTkdDX0FQSV9LRVk9Ijx5b3VyLWtleT4iCmt1YmVjdGwg" + + "Y3JlYXRlIHNlY3JldCBkb2NrZXItcmVnaXN0cnkgbnZjci1jcmVkcyBcCiAgLS1kb2NrZXItc2Vy" + + "dmVyPW52Y3IuaW8gXAogIC0tZG9ja2VyLXVzZXJuYW1lPSckb2F1dGh0b2tlbicgXAogIC0tZG9j" + + "a2VyLXBhc3N3b3JkPSIkTkdDX0FQSV9LRVkiIFwKICAtLW5hbWVzcGFjZT1udmNmLXVpIFwKICAt" + + "LWRyeS1ydW49Y2xpZW50IC1vIHlhbWwgfCBrdWJlY3RsIGFwcGx5IC1mIC0KYGBgCgpUaGUgZGVm" + + "YXVsdCByb3V0ZSBob3N0IGlzIGBudmNmLXVpLjxkb21haW4+YCBhbmQgdGhlIGJhY2tlbmQgaXMK" + + "YG52Y2YtdWkubnZjZi11aTo4MzAwYC4KCiMjIEFwcGx5IHRoZSBzZXJ2aWNlIGFuZCByb3V0ZQoK" + + "QWZ0ZXIgY29uZmlybWluZyB0aGUgcGFja2FnZSBpbmNsdWRlcyB0aGUgYG52Y2YtdWlgIHJlbGVh" + + "c2UsIHByZXZpZXcgYW5kIGFwcGx5CnRoZSBzZXJ2aWNlIGFuZCByb3V0ZToKCmBgYGJhc2gKSEVM" + + "TUZJTEVfRU5WPTxlbnYtbmFtZT4gaGVsbWZpbGUgLS1zZWxlY3RvciBuYW1lPW52Y2YtdWkgdGVt" + + "cGxhdGUKSEVMTUZJTEVfRU5WPTxlbnYtbmFtZT4gaGVsbWZpbGUgLS1zZWxlY3RvciBuYW1lPW52" + + "Y2YtdWkgc3luYwpIRUxNRklMRV9FTlY9PGVudi1uYW1lPiBoZWxtZmlsZSAtLXNlbGVjdG9yIHJl" + + "bGVhc2UtZ3JvdXA9aW5ncmVzcyBzeW5jCmBgYAoKIyMgVmVyaWZ5CgpWZXJpZnkgdGhlIHJvdXRl" + + "IG9ubHkgd2hlbiB0aGUgYWRkb24gaXMgcHJlc2VudCBhbmQgZW5hYmxlZDoKCmBgYGJhc2gKa3Vi" + + "ZWN0bCBnZXQgZGVwbG95LHN2YyAtbiBudmNmLXVpCmt1YmVjdGwgZ2V0IGh0dHByb3V0ZSAtQSB8" + + "IGdyZXAgLWkgbnZjZi11aQpjdXJsIC1pIC1IICJIb3N0OiBudmNmLXVpLjxkb21haW4+IiAiaHR0" + + "cDovLzxnYXRld2F5LWFkZHJlc3M+L3N0YXR1cyIKYGBgCgojIyBTZWN1cml0eQoKVGhlIE5WQ0Yg" + + "VUkgYWRtaW4gcGFuZWwgaXMgY3VycmVudGx5IHVuYXV0aGVudGljYXRlZC4gRG8gbm90IGV4cG9z" + + "ZSBpdCB0byB0aGUKcHVibGljIGludGVybmV0LiBSZXN0cmljdCBhY2Nlc3MgdG8gYSB0cnVzdGVk" + + "IG5ldHdvcmssIFZQTiwgb3IgYW4gYXV0aGVudGljYXRpbmcKcHJveHkgaW4gZnJvbnQgb2YgdGhl" + + "IGBudmNmLXVpYCByb3V0ZS4KUEsHCDj5J6+5BwAAuQcAAFBLAwQUAAgAAAAAACEAAAAAAAAAAAAA" + + "AAAAPgAJAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uL3JlZmVyZW5jZXMvcHVs" + + "bC1zZWNyZXRzLm1kVVQFAAEAps4SIyBJbWFnZSBQdWxsIFNlY3JldHMgUmVmZXJlbmNlCgojIyBP" + + "dmVydmlldwoKV2hlbiBwdWxsaW5nIE5WQ0YgaW1hZ2VzIGZyb20gYSBwcml2YXRlIHJlZ2lzdHJ5" + + "IChmb3IgZXhhbXBsZSwgTkdDCmBudmNyLmlvYCksIEt1YmVybmV0ZXMgbmVlZHMgYGltYWdlUHVs" + + "bFNlY3JldHNgIG9uIGV2ZXJ5IHBvZC4gQ29udHJvbC1wbGFuZSBhbmQKY29tcHV0ZS1wbGFuZSBj" + + "cmVkZW50aWFscyBhcmUgY29uZmlndXJlZCBpbiB0aGVpciBvd24gY2x1c3RlciBjb250ZXh0cy4g" + + "RG8gbm90CnVzZSBvbmUgbWl4ZWQgbmFtZXNwYWNlIGxpc3QuCgpUaGUgcmVjb21tZW5kZWQgY29u" + + "dHJvbC1wbGFuZSBhcHByb2FjaCB1c2VzIEt5dmVybm8gdG8gaW5qZWN0IHRoZSBzZWNyZXQgaW50" + + "bwpjb250cm9sLXBsYW5lIHBvZHMgYXQgYWRtaXNzaW9uIHRpbWUuIFRoZSBjb21wdXRlLXBsYW5l" + + "IGNoYXJ0IGFuZCBvcGVyYXRvciB1c2UKdGhlIHNlY3JldCBpbiBgbnZjYS1vcGVyYXRvcmAgYW5k" + + "IG1pcnJvciBpdCB0byBgbnZjYS1zeXN0ZW1gLgoKIyMgS3l2ZXJubyBBcHByb2FjaCAoUmVjb21t" + + "ZW5kZWQpCgojIyMgMS4gSW5zdGFsbCBLeXZlcm5vCgpgYGBiYXNoCmhlbG0gcmVwbyBhZGQga3l2" + + "ZXJubyBodHRwczovL2t5dmVybm8uZ2l0aHViLmlvL2t5dmVybm8vCmhlbG0gcmVwbyB1cGRhdGUK" + + "aGVsbSBpbnN0YWxsIGt5dmVybm8ga3l2ZXJuby9reXZlcm5vIC1uIGt5dmVybm8gLS1jcmVhdGUt" + + "bmFtZXNwYWNlIFwKICAtLWt1YmUtY29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PgpgYGAK" + + "CiMjIyAyLiBDcmVhdGUgY29udHJvbC1wbGFuZSBwdWxsIHNlY3JldHMKCmBgYGJhc2gKZXhwb3J0" + + "IE5HQ19BUElfS0VZPSI8eW91ci1uZ2MtYXBpLWtleT4iCgpmb3IgbnMgaW4gY2Fzc2FuZHJhLXN5" + + "c3RlbSBuYXRzLXN5c3RlbSBudmNmIGFwaS1rZXlzIGVzcyBzaXMgdmF1bHQtc3lzdGVtIGNlcnQt" + + "bWFuYWdlcjsgZG8KICBrdWJlY3RsIC0tY29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBj" + + "cmVhdGUgbmFtZXNwYWNlICIkbnMiIFwKICAgIC0tZHJ5LXJ1bj1jbGllbnQgLW8geWFtbCB8IGt1" + + "YmVjdGwgLS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRleHQ+IGFwcGx5IC1mIC0KZG9uZQoK" + + "Zm9yIG5zIGluIGNhc3NhbmRyYS1zeXN0ZW0gbmF0cy1zeXN0ZW0gbnZjZiBhcGkta2V5cyBlc3Mg" + + "c2lzIHZhdWx0LXN5c3RlbSBjZXJ0LW1hbmFnZXI7IGRvCiAga3ViZWN0bCAtLWNvbnRleHQgPGNv" + + "bnRyb2wtcGxhbmUtY29udGV4dD4gY3JlYXRlIHNlY3JldCBkb2NrZXItcmVnaXN0cnkgbnZjci1j" + + "cmVkcyBcCiAgICAtLWRvY2tlci1zZXJ2ZXI9bnZjci5pbyBcCiAgICAtLWRvY2tlci11c2VybmFt" + + "ZT0nJG9hdXRodG9rZW4nIFwKICAgIC0tZG9ja2VyLXBhc3N3b3JkPSIkTkdDX0FQSV9LRVkiIFwK" + + "ICAgIC0tbmFtZXNwYWNlPSIkbnMiIFwKICAgIC0tZHJ5LXJ1bj1jbGllbnQgLW8geWFtbCB8IGt1" + + "YmVjdGwgLS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRleHQ+IGFwcGx5IC1mIC0KZG9uZQpg" + + "YGAKCkZvciBub24tTkdDIHJlZ2lzdHJpZXMsIHJlcGxhY2UgYC0tZG9ja2VyLXNlcnZlcmAsIGAt" + + "LWRvY2tlci11c2VybmFtZWAsIGFuZCBgLS1kb2NrZXItcGFzc3dvcmRgLgoKIyMjIDMuIEFwcGx5" + + "IEt5dmVybm8gQ2x1c3RlclBvbGljeQoKYGBgeWFtbAphcGlWZXJzaW9uOiBreXZlcm5vLmlvL3Yx" + + "CmtpbmQ6IENsdXN0ZXJQb2xpY3kKbWV0YWRhdGE6CiAgbmFtZTogbnZjZi1hZGQtaW1hZ2VwdWxs" + + "c2VjcmV0cwpzcGVjOgogIGJhY2tncm91bmQ6IGZhbHNlCiAgcnVsZXM6CiAgICAtIG5hbWU6IGFk" + + "ZC1pbWFnZXB1bGxzZWNyZXQtdG8tbnZjZi1wb2RzCiAgICAgIG1hdGNoOgogICAgICAgIGFueToK" + + "ICAgICAgICAtIHJlc291cmNlczoKICAgICAgICAgICAga2luZHM6CiAgICAgICAgICAgIC0gUG9k" + + "CiAgICAgICAgICAgIG5hbWVzcGFjZXM6CiAgICAgICAgICAgIC0gIm52Y2YiCiAgICAgICAgICAg" + + "IC0gImFwaS1rZXlzIgogICAgICAgICAgICAtICJzaXMiCiAgICAgICAgICAgIC0gImVzcyIKICAg" + + "ICAgICAgICAgLSAibmF0cy1zeXN0ZW0iCiAgICAgICAgICAgIC0gImNhc3NhbmRyYS1zeXN0ZW0i" + + "CiAgICAgICAgICAgIC0gInZhdWx0LXN5c3RlbSIKICAgICAgICAgICAgLSAiY2VydC1tYW5hZ2Vy" + + "IgogICAgICBtdXRhdGU6CiAgICAgICAgcGF0Y2hTdHJhdGVnaWNNZXJnZToKICAgICAgICAgIG1l" + + "dGFkYXRhOgogICAgICAgICAgICBhbm5vdGF0aW9uczoKICAgICAgICAgICAgICBudmNmLm52aWRp" + + "YS5jb20vaW1hZ2VwdWxsc2VjcmV0LWluamVjdGVkLWJ5OiBreXZlcm5vCiAgICAgICAgICBzcGVj" + + "OgogICAgICAgICAgICBpbWFnZVB1bGxTZWNyZXRzOgogICAgICAgICAgICAtIG5hbWU6IG52Y3It" + + "Y3JlZHMKYGBgCgpgYGBiYXNoCmt1YmVjdGwgLS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRl" + + "eHQ+IGFwcGx5IFwKICAtZiBreXZlcm5vLWltYWdlcHVsbHNlY3JldC1wb2xpY3kueWFtbApgYGAK" + + "CiMjIyA0LiBJbnN0YWxsIHRoZSBjb250cm9sIHBsYW5lCgpDb250aW51ZSB3aXRoIHRoZSBzZWxl" + + "Y3RlZCBjb250cm9sLXBsYW5lIGluc3RhbGxhdGlvbiBpbgpbU3BsaXQgQ29tcHV0ZS1QbGFuZSBJ" + + "bnN0YWxsYXRpb25dKGNvbXB1dGUtcGxhbmUtaW5zdGFsbGF0aW9uLm1kKS4gTm8KY29udHJvbC1w" + + "bGFuZSBoZWxtZmlsZSBtb2RpZmljYXRpb25zIGFyZSBuZWVkZWQuIEt5dmVybm8gaW5qZWN0cyB0" + + "aGUgcHVsbApzZWNyZXQgaW50byBuZXcgY29udHJvbC1wbGFuZSBwb2RzLgoKIyMgQ29tcHV0ZS1Q" + + "bGFuZSBTZWNyZXQKCkNyZWF0ZSB0aGUgc2VjcmV0IG9ubHkgaW4gYG52Y2Etb3BlcmF0b3JgIG9u" + + "IHRoZSBjb21wdXRlIGNsdXN0ZXI6CgpgYGBiYXNoCmt1YmVjdGwgLS1jb250ZXh0IDxjb21wdXRl" + + "LXBsYW5lLWNvbnRleHQ+IGNyZWF0ZSBuYW1lc3BhY2UgbnZjYS1vcGVyYXRvciBcCiAgLS1kcnkt" + + "cnVuPWNsaWVudCAtbyB5YW1sIHwgXAogIGt1YmVjdGwgLS1jb250ZXh0IDxjb21wdXRlLXBsYW5l" + + "LWNvbnRleHQ+IGFwcGx5IC1mIC0KCmt1YmVjdGwgLS1jb250ZXh0IDxjb21wdXRlLXBsYW5lLWNv" + + "bnRleHQ+IGNyZWF0ZSBzZWNyZXQgZG9ja2VyLXJlZ2lzdHJ5IG52Y3ItY3JlZHMgXAogIC0tZG9j" + + "a2VyLXNlcnZlcj1udmNyLmlvIFwKICAtLWRvY2tlci11c2VybmFtZT0nJG9hdXRodG9rZW4nIFwK" + + "ICAtLWRvY2tlci1wYXNzd29yZD0iJE5HQ19BUElfS0VZIiBcCiAgLS1uYW1lc3BhY2U9bnZjYS1v" + + "cGVyYXRvciBcCiAgLS1kcnktcnVuPWNsaWVudCAtbyB5YW1sIHwgXAogIGt1YmVjdGwgLS1jb250" + + "ZXh0IDxjb21wdXRlLXBsYW5lLWNvbnRleHQ+IGFwcGx5IC1mIC0KYGBgCgpSZWZlcmVuY2UgaXQg" + + "aW4gdGhlIGNvbXB1dGUtcGxhbmUgZW52aXJvbm1lbnQgZmlsZToKCmBgYHlhbWwKZ2xvYmFsOgog" + + "IGltYWdlUHVsbFNlY3JldHM6CiAgICAtIG5hbWU6IG52Y3ItY3JlZHMKYGBgCgpUaGUgY2hhcnQg" + + "YW5kIG9wZXJhdG9yIHVzZSB0aGF0IHJlZmVyZW5jZSBpbiBgbnZjYS1vcGVyYXRvcmAgYW5kIG1p" + + "cnJvciB0aGUKc2VjcmV0IHRvIGBudmNhLXN5c3RlbWAuIERvIG5vdCBjcmVhdGUgYSBicm9hZGVy" + + "IG1hbnVhbCBjb21wdXRlIG5hbWVzcGFjZSBsaXN0LiBGb2xsb3cKW1NwbGl0IENvbXB1dGUtUGxh" + + "bmUgSW5zdGFsbGF0aW9uXShjb21wdXRlLXBsYW5lLWluc3RhbGxhdGlvbi5tZCkgZm9yIHRoZQpz" + + "ZWxlY3RlZCBpbnN0YWxsIGZsb3cuCgojIyBWZXJpZmljYXRpb24KCmBgYGJhc2gKIyBDaGVjayB0" + + "aGF0IGEgY29udHJvbC1wbGFuZSBwb2QgaGFzIHRoZSBpbmplY3RlZCBzZWNyZXQKa3ViZWN0bCAt" + + "LWNvbnRleHQgPGNvbnRyb2wtcGxhbmUtY29udGV4dD4gZ2V0IHBvZCAtbiA8bmFtZXNwYWNlPiA8" + + "cG9kLW5hbWU+IFwKICAtbyBqc29ucGF0aD0ney5zcGVjLmltYWdlUHVsbFNlY3JldHN9JwojIEV4" + + "cGVjdGVkOiBbeyJuYW1lIjoibnZjci1jcmVkcyJ9XQoKIyBDaGVjayB0aGUgS3l2ZXJubyBhbm5v" + + "dGF0aW9uCmt1YmVjdGwgLS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRleHQ+IGdldCBwb2Qg" + + "LW4gPG5hbWVzcGFjZT4gPHBvZC1uYW1lPiBcCiAgLW8ganNvbnBhdGg9J3subWV0YWRhdGEuYW5u" + + "b3RhdGlvbnMubnZjZlwubnZpZGlhXC5jb20vaW1hZ2VwdWxsc2VjcmV0LWluamVjdGVkLWJ5fScK" + + "IyBFeHBlY3RlZDoga3l2ZXJubwoKIyBDaGVjayBwdWxsIGV2ZW50cwprdWJlY3RsIC0tY29udGV4" + + "dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBnZXQgZXZlbnRzIC1uIDxuYW1lc3BhY2U+IFwKICAt" + + "LXNvcnQtYnk9Jy5sYXN0VGltZXN0YW1wJyB8IGdyZXAgLWkgcHVsbAojIFNob3VsZCBzaG93ICJT" + + "dWNjZXNzZnVsbHkgcHVsbGVkIiBub3QgIjQwMSBVbmF1dGhvcml6ZWQiCgojIENoZWNrIHRoZSBj" + + "aGFydC9vcGVyYXRvciBtaXJyb3Igb24gdGhlIGNvbXB1dGUgY2x1c3RlcgprdWJlY3RsIC0tY29u" + + "dGV4dCA8Y29tcHV0ZS1wbGFuZS1jb250ZXh0PiBnZXQgc2VjcmV0IG52Y3ItY3JlZHMgXAogIC1u" + + "IG52Y2Etc3lzdGVtCmBgYAoKIyMgV2hlbiBQdWxsIFNlY3JldHMgQXJlIE5vdCBOZWVkZWQKCi0g" + + "KipBV1MgRUNSIHdpdGggSUFNIG5vZGUgcm9sZXMqKjogSWYgeW91ciBub2RlcyBoYXZlIGBBbWF6" + + "b25FQzJDb250YWluZXJSZWdpc3RyeVJlYWRPbmx5YCBJQU0gcG9saWN5LCBLdWJlcm5ldGVzIGNh" + + "biBwdWxsIGZyb20gRUNSIHdpdGhvdXQgZXhwbGljaXQgc2VjcmV0cy4KLSAqKlB1YmxpYyByZWdp" + + "c3RyaWVzKio6IE5vIHB1bGwgc2VjcmV0cyBuZWVkZWQuCi0gKipDU1AgYnVpbHQtaW4gY3JlZGVu" + + "dGlhbCBoZWxwZXJzKio6IEdLRSBBcnRpZmFjdCBSZWdpc3RyeSwgQXp1cmUgQUNSIHdpdGggbWFu" + + "YWdlZCBpZGVudGl0eSwgYW5kIHNpbWlsYXIgc2VydmljZXMuCgojIyBUcm91Ymxlc2hvb3RpbmcK" + + "CiMjIyBQb2RzIHN0aWxsIGluIEltYWdlUHVsbEJhY2tPZmYgYWZ0ZXIgYXBwbHlpbmcgcG9saWN5" + + "CgpUaGUgS3l2ZXJubyBwb2xpY3kgb25seSBhZmZlY3RzIHBvZHMgY3JlYXRlZCAqKmFmdGVyKiog" + + "dGhlIHBvbGljeSBpcyBhcHBsaWVkLiBEZWxldGUgc3R1Y2sgcG9kcyB0byB0cmlnZ2VyIHJlY3Jl" + + "YXRpb246CgpgYGBiYXNoCmt1YmVjdGwgLS1jb250ZXh0IDx0YXJnZXQtY29udGV4dD4gZGVsZXRl" + + "IHBvZHMgLW4gPG5hbWVzcGFjZT4gLS1hbGwKYGBgCgojIyMgS3l2ZXJubyBhZG1pc3Npb24gY29u" + + "dHJvbGxlciBub3QgcnVubmluZwoKYGBgYmFzaAprdWJlY3RsIC0tY29udGV4dCA8Y29udHJvbC1w" + + "bGFuZS1jb250ZXh0PiBnZXQgcG9kcyAtbiBreXZlcm5vCiMgQWxsIHBvZHMgc2hvdWxkIGJlIFJ1" + + "bm5pbmcKYGBgCgojIyMgUG9saWN5IG5vdCBtYXRjaGluZwoKYGBgYmFzaAprdWJlY3RsIC0tY29u" + + "dGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBnZXQgY2x1c3RlcnBvbGljeSBudmNmLWFkZC1p" + + "bWFnZXB1bGxzZWNyZXRzCiMgU2hvdWxkIHNob3cgUkVBRFk6IFRydWUKYGBgCgojIyMgV3Jvbmcg" + + "c2VjcmV0IG5hbWUKClRoZSBwb2xpY3kgcmVmZXJlbmNlcyBgbnZjci1jcmVkc2AuIFZlcmlmeSB0" + + "aGUgc2VjcmV0IGV4aXN0cyB3aXRoIHRoYXQgZXhhY3QgbmFtZToKCmBgYGJhc2gKa3ViZWN0bCAt" + + "LWNvbnRleHQgPHRhcmdldC1jb250ZXh0PiBnZXQgc2VjcmV0IG52Y3ItY3JlZHMgLW4gPG5hbWVz" + + "cGFjZT4KYGBgClBLBwhLQjWoABYAAAAWAABQSwECFAAUAAgAAAAAACEATyM55UoQAABKEAAAEgAJ" + + "AAAAAAAAAAAAAAAAAAAAZGF0YS9tYW5pZmVzdC5qc29uVVQFAAEAps4SUEsBAhQAFAAIAAAAAAAh" + + "AP9282dTYQAAU2EAACMACQAAAAAAAAAAAAAAkxAAAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xp" + + "L1NLSUxMLm1kVVQFAAEAps4SUEsBAhQAFAAIAAAAAAAhAG3jewUjDAAAIwwAADMACQAAAAAAAAAA" + + "AAAAQHIAAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL2V4YW1wbGVzL2NpLXBpcGVsaW5lcy5t" + + "ZFVUBQABAKbOElBLAQIUABQACAAAAAAAIQChFOOBXQwAAF0MAAA0AAkAAAAAAAAAAAAAAM1+AABk" + + "YXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9leGFtcGxlcy9tdWx0aS1jbHVzdGVyLm1kVVQFAAEA" + + "ps4SUEsBAhQAFAAIAAAAAAAhAEInSQ8FDQAABQ0AADcACQAAAAAAAAAAAAAAlYsAAGRhdGEvbnZj" + + "Zi1zZWxmLW1hbmFnZWQtY2xpL3Byb21wdHMvYWRkLWNvbXB1dGUtcGxhbmUubWRVVAUAAQCmzhJQ" + + "SwECFAAUAAgAAAAAACEA1N6NNJ8ZAACfGQAAOQAJAAAAAAAAAAAAAAAImQAAZGF0YS9udmNmLXNl" + + "bGYtbWFuYWdlZC1jbGkvcHJvbXB0cy9jcmVhdGUtYW5kLXJ1bi10YXNrLm1kVVQFAAEAps4SUEsB" + + "AhQAFAAIAAAAAAAhANJD3AQYJQAAGCUAADcACQAAAAAAAAAAAAAAF7MAAGRhdGEvbnZjZi1zZWxm" + + "LW1hbmFnZWQtY2xpL3Byb21wdHMvZGVwbG95LWFuZC1pbnZva2UubWRVVAUAAQCmzhJQSwECFAAU" + + "AAgAAAAAACEAcpIsJr4OAAC+DgAAPQAJAAAAAAAAAAAAAACd2AAAZGF0YS9udmNmLXNlbGYtbWFu" + + "YWdlZC1jbGkvcHJvbXB0cy9kaWFnbm9zZS1mYWlsZWQtaW5zdGFsbC5tZFVUBQABAKbOElBLAQIU" + + "ABQACAAAAAAAIQBCceYeASgAAAEoAAA6AAkAAAAAAAAAAAAAAM/nAABkYXRhL252Y2Ytc2VsZi1t" + + "YW5hZ2VkLWNsaS9wcm9tcHRzL2luc3RhbGwtZnJvbS1zY3JhdGNoLm1kVVQFAAEAps4SUEsBAhQA" + + "FAAIAAAAAAAhAKrhOrnIBwAAyAcAADkACQAAAAAAAAAAAAAAQRABAGRhdGEvbnZjZi1zZWxmLW1h" + + "bmFnZWQtY2xpL3Byb21wdHMvcm90YXRlLWNsdXN0ZXItandrcy5tZFVUBQABAKbOElBLAQIUABQA" + + "CAAAAAAAIQDah2NW5CEAAOQhAAAuAAkAAAAAAAAAAAAAAHkYAQBkYXRhL252Y2Ytc2VsZi1tYW5h" + + "Z2VkLWNsaS9wcm9tcHRzL3RlYXJkb3duLm1kVVQFAAEAps4SUEsBAhQAFAAIAAAAAAAhAHIND2Qh" + + "IwAAISMAADAACQAAAAAAAAAAAAAAwjoBAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL3JlZmVy" + + "ZW5jZS9jb21tYW5kcy5tZFVUBQABAKbOElBLAQIUABQACAAAAAAAIQBzp1pk1QYAANUGAAAyAAkA" + + "AAAAAAAAAAAAAEpeAQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9yZWZlcmVuY2UvZXhpdC1j" + + "b2Rlcy5tZFVUBQABAKbOElBLAQIUABQACAAAAAAAIQCZ0OJQFy4AABcuAAAtAAkAAAAAAAAAAAAA" + + "AIhlAQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9yZWZlcmVuY2UvZmxhZ3MubWRVVAUAAQCm" + + "zhJQSwECFAAUAAgAAAAAACEA864ThHQRAAB0EQAANwAJAAAAAAAAAAAAAAADlAEAZGF0YS9udmNm" + + "LXNlbGYtbWFuYWdlZC1jbGkvcmVmZXJlbmNlL3Ryb3VibGVzaG9vdGluZy5tZFVUBQABAKbOElBL" + + "AQIUABQACAAAAAAAIQARwxSTSWIAAEliAAAsAAkAAAAAAAAAAAAAAOWlAQBkYXRhL252Y2Ytc2Vs" + + "Zi1tYW5hZ2VkLWluc3RhbGxhdGlvbi9TS0lMTC5tZFVUBQABAKbOElBLAQIUABQACAAAAAAAIQBH" + + "VWpWSlYAAEpWAAA0AAkAAAAAAAAAAAAAAJEIAgBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWluc3Rh" + + "bGxhdGlvbi9ldmFscy9ldmFscy5qc29uVVQFAAEAps4SUEsBAhQAFAAIAAAAAAAhAAJSTkB/KAAA" + + "fygAAC8ACQAAAAAAAAAAAAAARl8CAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9u" + + "L2V4YW1wbGVzLm1kVVQFAAEAps4SUEsBAhQAFAAIAAAAAAAhAJZjvFkSMAAAEjAAAEwACQAAAAAA" + + "AAAAAAAAK4gCAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uL3JlZmVyZW5jZXMv" + + "Y29tcHV0ZS1wbGFuZS1pbnN0YWxsYXRpb24ubWRVVAUAAQCmzhJQSwECFAAUAAgAAAAAACEAtXpw" + + "O7UwAAC1MAAAOwAJAAAAAAAAAAAAAADAuAIAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxs" + + "YXRpb24vcmVmZXJlbmNlcy9kZWJ1Z2dpbmcubWRVVAUAAQCmzhJQSwECFAAUAAgAAAAAACEAsTUd" + + "2wIqAAACKgAARAAJAAAAAAAAAAAAAADn6QIAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxs" + + "YXRpb24vcmVmZXJlbmNlcy9oZWxtZmlsZS1zdHJ1Y3R1cmUubWRVVAUAAQCmzhJQSwECFAAUAAgA" + + "AAAAACEAOPknr7kHAAC5BwAAPwAJAAAAAAAAAAAAAABkFAMAZGF0YS9udmNmLXNlbGYtbWFuYWdl" + + "ZC1pbnN0YWxsYXRpb24vcmVmZXJlbmNlcy9udmNmLXVpLWFkZG9uLm1kVVQFAAEAps4SUEsBAhQA" + + "FAAIAAAAAAAhAEtCNagAFgAAABYAAD4ACQAAAAAAAAAAAAAAkxwDAGRhdGEvbnZjZi1zZWxmLW1h" + + "bmFnZWQtaW5zdGFsbGF0aW9uL3JlZmVyZW5jZXMvcHVsbC1zZWNyZXRzLm1kVVQFAAEAps4SUEsF" + + "BgAAAAAXABcArwkAAAgzAwAAAA==" var ( skillDataOnce sync.Once diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go index 2d40c79803..f90b53a5cf 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go @@ -366,14 +366,14 @@ func sweepOrphanClusterValidatorRBAC(ctx context.Context, client kubernetes.Inte if l, err := client.RbacV1().ClusterRoleBindings().List(ctx, opts); err == nil { for i := range l.Items { if o := &l.Items[i]; reclaimable(o) { - _ = client.RbacV1().ClusterRoleBindings().Delete(ctx, o.Name, metav1.DeleteOptions{}) + _ = client.RbacV1().ClusterRoleBindings().Delete(ctx, o.Name, deleteExactly(o)) } } } if l, err := client.RbacV1().ClusterRoles().List(ctx, opts); err == nil { for i := range l.Items { if o := &l.Items[i]; reclaimable(o) { - _ = client.RbacV1().ClusterRoles().Delete(ctx, o.Name, metav1.DeleteOptions{}) + _ = client.RbacV1().ClusterRoles().Delete(ctx, o.Name, deleteExactly(o)) } } } @@ -381,7 +381,7 @@ func sweepOrphanClusterValidatorRBAC(ctx context.Context, client kubernetes.Inte if l, err := sa.List(ctx, opts); err == nil { for i := range l.Items { if o := &l.Items[i]; reclaimable(o) { - _ = sa.Delete(ctx, o.Name, metav1.DeleteOptions{}) + _ = sa.Delete(ctx, o.Name, deleteExactly(o)) } } } @@ -395,16 +395,16 @@ func sweepClusterValidatorRBAC(ctx context.Context, client kubernetes.Interface, // a colliding name would otherwise vanish with no diagnostic at all. if crb, err := client.RbacV1().ClusterRoleBindings().Get(ctx, name, metav1.GetOptions{}); err == nil && hasValidatorManagedLabels(crb.Labels) { - _ = client.RbacV1().ClusterRoleBindings().Delete(ctx, name, metav1.DeleteOptions{}) + _ = client.RbacV1().ClusterRoleBindings().Delete(ctx, name, deleteExactly(crb)) } if cr, err := client.RbacV1().ClusterRoles().Get(ctx, name, metav1.GetOptions{}); err == nil && hasValidatorManagedLabels(cr.Labels) { - _ = client.RbacV1().ClusterRoles().Delete(ctx, name, metav1.DeleteOptions{}) + _ = client.RbacV1().ClusterRoles().Delete(ctx, name, deleteExactly(cr)) } sa := client.CoreV1().ServiceAccounts(clusterValidatorNamespace) if acct, err := sa.Get(ctx, name, metav1.GetOptions{}); err == nil && hasValidatorManagedLabels(acct.Labels) { - _ = sa.Delete(ctx, name, metav1.DeleteOptions{}) + _ = sa.Delete(ctx, name, deleteExactly(acct)) } } @@ -426,7 +426,9 @@ func sweepPriorClusterValidatorJobs(ctx context.Context, client kubernetes.Inter if !strings.HasPrefix(l.Items[i].Name, clusterValidatorName) { continue } - _ = jobs.Delete(ctx, l.Items[i].Name, metav1.DeleteOptions{PropagationPolicy: &propagation}) + opts := deleteExactly(&l.Items[i]) + opts.PropagationPolicy = &propagation + _ = jobs.Delete(ctx, l.Items[i].Name, opts) } } @@ -450,7 +452,7 @@ func sweepManagedPullSecrets(ctx context.Context, client kubernetes.Interface, r if !strings.HasPrefix(l.Items[i].Name, validatorPullSecretName) { continue } - _ = secrets.Delete(ctx, l.Items[i].Name, metav1.DeleteOptions{}) + _ = secrets.Delete(ctx, l.Items[i].Name, deleteExactly(&l.Items[i])) } } diff --git a/src/clis/nvcf-cli/internal/selfhosted/preflight.go b/src/clis/nvcf-cli/internal/selfhosted/preflight.go index aa27e7c7fa..9da51e617c 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/preflight.go +++ b/src/clis/nvcf-cli/internal/selfhosted/preflight.go @@ -719,10 +719,12 @@ func staleNamespaceCheck(prober StaleNamespaceProber, kubeContext string, namesp } } // Every hint is pinned to the context that was actually probed. - // In split mode the two callers pass different contexts, so a bare - // kubectl command would run against whatever context happens to be - // current, and these hints delete namespaces. - kctl := "kubectl" + kubectlContextArg(kubeContext) + // In split mode the two callers pass different contexts, and with + // no context flag the probe followed the current-context at the + // time it ran. Either way the name is resolved and written into + // the command, because these hints delete namespaces and the + // current-context can change between reading this and pasting it. + kctl := "kubectl" + kubectlContextArg(effectiveKubeContext(kubeContext)) var hints []string if len(terminating) > 0 { // spec.finalizers is writable only through the /finalize @@ -735,10 +737,16 @@ func staleNamespaceCheck(prober StaleNamespaceProber, kubeContext string, namesp "jq '.spec.finalizers=[]' | %s replace --raw /api/v1/namespaces/%s/finalize -f -", ns, kctl, ns, kctl, ns)) } - hints = append(hints, - "if it stays Terminating, the deadlock is on objects inside it: "+ - kctl+" api-resources --verbs=list --namespaced -o name | "+ - "xargs -n1 "+kctl+" get -n --show-kind --ignore-not-found") + // One command per namespace with the real name substituted. A + // `` placeholder is not pasteable: the shell reads `<` and + // `>` as redirection, so the command fails before kubectl runs. + for _, ns := range terminating { + hints = append(hints, fmt.Sprintf( + "if %s stays Terminating, the deadlock is on objects inside it: "+ + "%s api-resources --verbs=list --namespaced -o name | "+ + "xargs -n1 %s get -n %s --show-kind --ignore-not-found", + ns, kctl, kctl, ns)) + } } if len(emptyShell) > 0 { hints = append(hints, diff --git a/src/clis/nvcf-cli/internal/selfhosted/pullsecret.go b/src/clis/nvcf-cli/internal/selfhosted/pullsecret.go index a846e4c1c1..e9c17d4f8d 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/pullsecret.go +++ b/src/clis/nvcf-cli/internal/selfhosted/pullsecret.go @@ -32,6 +32,19 @@ import ( "k8s.io/client-go/kubernetes" ) +// deleteExactly pins a delete to the object that was inspected. The ownership +// guards read an object and then delete it by name, and in that window another +// actor can relabel it, or delete and recreate it under the same name. Without +// preconditions the delete lands on whatever holds the name by then; with them +// the apiserver rejects it as a conflict instead. +func deleteExactly(o metav1.Object) metav1.DeleteOptions { + uid := o.GetUID() + rv := o.GetResourceVersion() + return metav1.DeleteOptions{ + Preconditions: &metav1.Preconditions{UID: &uid, ResourceVersion: &rv}, + } +} + const ( // Project-specific name so the auto-created / mirrored pull secret // can never collide with the conventional `nvcr-pull-secret` that @@ -284,7 +297,11 @@ func writeDockerConfigSecret(ctx context.Context, client kubernetes.Interface, n fmt.Sprintf("type=%s", current.Type)); err != nil { return err } - if err := secrets.Delete(ctx, name, metav1.DeleteOptions{}); err != nil && !apierrors.IsNotFound(err) { + // A conflict means the object changed between the ownership check and + // this delete, so the thing now holding the name was never vetted. + // Stop rather than fall through to Create, which would otherwise + // silently adopt or overwrite it. + if err := secrets.Delete(ctx, name, deleteExactly(current)); err != nil && !apierrors.IsNotFound(err) { return fmt.Errorf("delete incompatible secret type %s: %w", current.Type, err) } case !apierrors.IsNotFound(err): diff --git a/src/clis/nvcf-cli/internal/selfhosted/pullsecret_test.go b/src/clis/nvcf-cli/internal/selfhosted/pullsecret_test.go index 80cc3b3ae8..e60e908d0d 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/pullsecret_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/pullsecret_test.go @@ -21,6 +21,7 @@ import ( "context" "encoding/base64" "encoding/json" + "errors" "testing" "github.com/stretchr/testify/assert" @@ -30,6 +31,7 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/client-go/kubernetes/fake" ktesting "k8s.io/client-go/testing" ) @@ -557,3 +559,67 @@ func TestWriteDockerConfigSecret_RefusesUnmanagedAfterCreateRace(t *testing.T) { assert.Contains(t, err.Error(), "not managed by nvcf-cli") assert.False(t, updated, "no Update may be issued against an unmanaged secret") } + +// The ownership check reads the Secret and then deletes it by name. In that +// window another actor can delete and recreate it, so the delete has to name +// the exact object that was vetted rather than whatever holds the name by then. +func TestWriteDockerConfigSecret_TypeMismatchDeletePinsTheInspectedObject(t *testing.T) { + fresh := dockerConfigBlob(t, "private.registry.test", "$oauthtoken", "key") + existing := &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: "nvcr-pull-secret", + Namespace: "default", + Labels: clusterValidatorLabels(), + UID: "uid-1", + ResourceVersion: "42", + }, + Type: corev1.SecretTypeOpaque, + } + client := fake.NewSimpleClientset(existing) + + var opts metav1.DeleteOptions + client.PrependReactor("delete", "secrets", func(a ktesting.Action) (bool, runtime.Object, error) { + opts = a.(ktesting.DeleteActionImpl).DeleteOptions + return false, nil, nil + }) + + require.NoError(t, writeDockerConfigSecret(context.Background(), client, "default", + "nvcr-pull-secret", clusterValidatorControlPlaneRole, fresh)) + + require.NotNil(t, opts.Preconditions, "delete must carry preconditions") + require.NotNil(t, opts.Preconditions.UID) + require.NotNil(t, opts.Preconditions.ResourceVersion) + assert.Equal(t, existing.UID, *opts.Preconditions.UID) + assert.Equal(t, existing.ResourceVersion, *opts.Preconditions.ResourceVersion) +} + +// A conflict means the object changed after the ownership check, so the run +// must stop instead of creating over whatever now holds the name. +func TestWriteDockerConfigSecret_TypeMismatchStopsOnDeleteConflict(t *testing.T) { + fresh := dockerConfigBlob(t, "private.registry.test", "$oauthtoken", "key") + client := fake.NewSimpleClientset(&corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: "nvcr-pull-secret", + Namespace: "default", + Labels: clusterValidatorLabels(), + UID: "uid-1", + }, + Type: corev1.SecretTypeOpaque, + }) + client.PrependReactor("delete", "secrets", func(ktesting.Action) (bool, runtime.Object, error) { + return true, nil, apierrors.NewConflict( + schema.GroupResource{Resource: "secrets"}, "nvcr-pull-secret", + errors.New("UID precondition mismatch")) + }) + + created := false + client.PrependReactor("create", "secrets", func(ktesting.Action) (bool, runtime.Object, error) { + created = true + return false, nil, nil + }) + + err := writeDockerConfigSecret(context.Background(), client, "default", + "nvcr-pull-secret", clusterValidatorControlPlaneRole, fresh) + require.Error(t, err, "a changed object must abort the replace") + assert.False(t, created, "must not create over an object that was never vetted") +} diff --git a/src/clis/nvcf-cli/internal/selfhosted/register.go b/src/clis/nvcf-cli/internal/selfhosted/register.go index 14d18dfdb6..1e8f1bc6ae 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/register.go +++ b/src/clis/nvcf-cli/internal/selfhosted/register.go @@ -319,6 +319,33 @@ var loadKubeConfigFn = loadKubeConfig // When kctx is empty the kubeconfig's current-context is used, preserving // single-cluster behavior. The loading-rules chain follows the same priority // as kubectl: KUBECONFIG env var → ~/.kube/config. +// currentKubeContextNameFn is a seam: tests must not depend on the developer's +// kubeconfig, and hint output would otherwise vary by machine. +var currentKubeContextNameFn = currentKubeContextName + +// currentKubeContextName returns the kubeconfig's current-context, or "" when +// it cannot be read. Used to name the context in remediation hints when the +// caller did not pass one explicitly. Best-effort by design: a hint without +// the flag is still correct at the moment it is printed. +func currentKubeContextName() string { + raw, err := clientcmd.NewNonInteractiveDeferredLoadingClientConfig( + clientcmd.NewDefaultClientConfigLoadingRules(), &clientcmd.ConfigOverrides{}, + ).RawConfig() + if err != nil { + return "" + } + return raw.CurrentContext +} + +// effectiveKubeContext resolves the context a probe actually used, so a hint +// naming it stays correct after the current-context changes. +func effectiveKubeContext(kctx string) string { + if kctx != "" { + return kctx + } + return currentKubeContextNameFn() +} + func loadKubeConfig(kctx string) (*rest.Config, error) { loadingRules := clientcmd.NewDefaultClientConfigLoadingRules() overrides := &clientcmd.ConfigOverrides{} diff --git a/src/clis/nvcf-cli/internal/selfhosted/registry_cred.go b/src/clis/nvcf-cli/internal/selfhosted/registry_cred.go index 140fb9fdf9..354dd47d15 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/registry_cred.go +++ b/src/clis/nvcf-cli/internal/selfhosted/registry_cred.go @@ -37,6 +37,11 @@ const ( // contacted when the stack is not rewriting cert-manager images to // global.image.registry, which global.yaml.gotmpl does for all five of them. certManagerRegistry = "quay.io" + + // ngcRegistry is the default global.image.registry in the stack's + // environments/base.yaml, and the fallback when no source named a + // registry. See the tail of EnumerateRegistries. + ngcRegistry = "nvcr.io" ) // RegistryCredentialChecker probes whether credentials are present and valid @@ -252,7 +257,9 @@ func EnumerateRegistries(imageRef, stackValuesFile string, extras []string) []Re // Critical follows the same rule as every other source rather than being // forced true: an air-gapped install that side-loaded the image never // contacts this registry at pull time (ImagePullPolicy is IfNotPresent). + imageNamedRegistry := false if reg, repo, _, ok := parseImageRef(imageRef); ok && reg != "" { + imageNamedRegistry = true add(reg, repo, isNGCRegistry(reg)) } @@ -295,6 +302,24 @@ func EnumerateRegistries(imageRef, stackValuesFile string, extras []string) []Re add(reg, "", false) } + // Fallback for "no source named a registry at all": no validator image is + // configured and no stack values file resolved. That is the default + // configuration rather than an edge case, and without this the run reports + // on quay.io alone while the operator's NGC credentials go unchecked. + // environments/base.yaml sets global.image.registry to nvcr.io, so it is + // the right guess when there is nothing else to go on. + // + // Deliberately not triggered when the image or the stack named a non-NGC + // registry: that is a mirrored install, which has no reason to reach + // nvcr.io, and probing it there would add a failing round trip for the + // sites least able to make it. + // + // Non-critical, unlike an NGC registry a source actually named. A guess + // must not hard-fail the run, and this category has no opt-out flag. + if !imageNamedRegistry && stackRegistry == "" { + add(ngcRegistry, "", false) + } + return out } diff --git a/src/clis/nvcf-cli/internal/selfhosted/registry_cred_test.go b/src/clis/nvcf-cli/internal/selfhosted/registry_cred_test.go index bdafc6d6a3..a173aa284e 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/registry_cred_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/registry_cred_test.go @@ -23,6 +23,7 @@ import ( "net/http" "net/http/httptest" "os" + "path/filepath" "strings" "testing" @@ -335,3 +336,51 @@ func TestEnumerateRegistries_NonNGCImageRegistryIsNotCritical(t *testing.T) { } t.Fatal("mirror.company.internal not enumerated") } + +// With no validator image and no stack values file, nothing names a registry +// and the run would report on quay.io alone, leaving the operator's NGC +// credentials unchecked in what is the default configuration. +func TestEnumerateRegistries_FallsBackToNGCWhenNothingNamesARegistry(t *testing.T) { + got := EnumerateRegistries("", "", nil) + + var ngc *RegistryEntry + for i := range got { + if got[i].Registry == "nvcr.io" { + ngc = &got[i] + } + } + require.NotNil(t, ngc, "nvcr.io must be probed when no source names a registry") + assert.False(t, ngc.Critical, + "a guessed registry must not hard-fail the run; this category has no opt-out flag") +} + +// A mirrored install has no reason to reach nvcr.io, and probing it there adds +// a failing round trip for the sites least able to make it. +func TestEnumerateRegistries_NoNGCFallbackForAMirroredStack(t *testing.T) { + dir := t.TempDir() + values := filepath.Join(dir, "base.yaml") + require.NoError(t, os.WriteFile(values, + []byte("global:\n image:\n registry: harbor.example.com\n"), 0o600)) + + got := EnumerateRegistries("", values, nil) + for _, e := range got { + assert.NotEqual(t, "nvcr.io", e.Registry, + "a stack that named its own registry must not be probed against NGC") + } +} + +// The fallback must not shadow or duplicate an NGC registry a source named, +// which carries a repo hint and is critical. +func TestEnumerateRegistries_FallbackDoesNotDuplicateNamedNGC(t *testing.T) { + got := EnumerateRegistries("nvcr.io/nvidia/nvcf-byoc/cluster-validator:1.0.0", "", nil) + + n := 0 + for _, e := range got { + if e.Registry == "nvcr.io" { + n++ + assert.True(t, e.Critical, "an NGC registry named by the image stays critical") + assert.Equal(t, "nvidia/nvcf-byoc/cluster-validator", e.RepoHint) + } + } + assert.Equal(t, 1, n, "nvcr.io must appear exactly once") +} diff --git a/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go index 2f21a76048..e0271db531 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go @@ -171,7 +171,18 @@ func TestProbeStaleNamespaces_MixedNamespaces(t *testing.T) { // -- staleNamespaceCheck binaryCheckSpec -- +// pinCurrentKubeContext keeps hint assertions independent of the developer's +// kubeconfig: without it, a machine with a current-context makes every hint +// carry a --context flag the test did not ask for. +func pinCurrentKubeContext(t *testing.T, name string) { + t.Helper() + prev := currentKubeContextNameFn + currentKubeContextNameFn = func() string { return name } + t.Cleanup(func() { currentKubeContextNameFn = prev }) +} + func TestStaleNamespaceCheck_ProberErrorDegradestoWarning(t *testing.T) { + pinCurrentKubeContext(t, "") // A prober that cannot contact the cluster must not fail the overall check // at error severity - it would produce false failures on transient network // issues or misconfigured kubeconfigs. @@ -186,6 +197,7 @@ func TestStaleNamespaceCheck_ProberErrorDegradestoWarning(t *testing.T) { } func TestStaleNamespaceCheck_StaleIsError(t *testing.T) { + pinCurrentKubeContext(t, "") // A successfully detected stale namespace must fail at error severity so // anyFailed trips the non-zero exit code. prober := func(_ context.Context, _ string, _ []string) ([]StaleNamespace, error) { @@ -201,6 +213,7 @@ func TestStaleNamespaceCheck_StaleIsError(t *testing.T) { } func TestStaleNamespaceCheck_CleanPasses(t *testing.T) { + pinCurrentKubeContext(t, "") prober := func(_ context.Context, _ string, _ []string) ([]StaleNamespace, error) { return nil, nil } @@ -209,6 +222,7 @@ func TestStaleNamespaceCheck_CleanPasses(t *testing.T) { } func TestStaleNamespaceCheck_MessageNamesAllStaleNamespaces(t *testing.T) { + pinCurrentKubeContext(t, "") // The remediation command must name every stale namespace so the operator // can copy-paste it without having to cross-reference the check output. prober := func(_ context.Context, _ string, _ []string) ([]StaleNamespace, error) { @@ -281,6 +295,7 @@ func TestControlPlaneNamespaceList_ExcludesRuntimeOwnedNamespaces(t *testing.T) // kubectl command in a hint runs against whatever context is current, and // these hints delete namespaces. func TestStaleNamespaceCheck_HintsPinTheProbedContext(t *testing.T) { + pinCurrentKubeContext(t, "") prober := func(_ context.Context, _ string, _ []string) ([]StaleNamespace, error) { return []StaleNamespace{ {Name: "nvcf", Reason: "stuck Terminating"}, @@ -299,6 +314,7 @@ func TestStaleNamespaceCheck_HintsPinTheProbedContext(t *testing.T) { } func TestStaleNamespaceCheck_HintsQuoteTheContext(t *testing.T) { + pinCurrentKubeContext(t, "") prober := func(_ context.Context, _ string, _ []string) ([]StaleNamespace, error) { return []StaleNamespace{{Name: "nvcf", Reason: "no Helm release"}}, nil } @@ -306,3 +322,45 @@ func TestStaleNamespaceCheck_HintsQuoteTheContext(t *testing.T) { assert.Contains(t, r.Message, "--context 'my ctx' delete namespace nvcf", "a context name with a space must be quoted so the pasted command does not split it") } + +// TestStaleNamespaceCheck_HintsSubstituteTheNamespace guards against a bare +// `` placeholder in a pasteable command: the shell reads `<` and `>` as +// redirection, so the command fails before kubectl runs. +func TestStaleNamespaceCheck_HintsSubstituteTheNamespace(t *testing.T) { + pinCurrentKubeContext(t, "") + prober := func(_ context.Context, _ string, _ []string) ([]StaleNamespace, error) { + return []StaleNamespace{ + {Name: "nvcf", Reason: "stuck Terminating"}, + {Name: "sis", Reason: "stuck Terminating"}, + }, nil + } + r := staleNamespaceCheck(prober, "", []string{"nvcf", "sis"}).Run(context.Background()) + + assert.NotContains(t, r.Message, "", + "a shell-redirection placeholder must not appear in a copy-pasteable command") + assert.Contains(t, r.Message, "xargs -n1 kubectl get -n nvcf ") + assert.Contains(t, r.Message, "xargs -n1 kubectl get -n sis ") +} + +// TestStaleNamespaceCheck_HintsNameTheCurrentContext covers the single-cluster +// path. The probe followed the current-context, so the hint has to name it: +// the operator can switch context between reading this and pasting it, and +// these commands delete namespaces. +func TestStaleNamespaceCheck_HintsNameTheCurrentContext(t *testing.T) { + pinCurrentKubeContext(t, "k3d-local") + prober := func(_ context.Context, _ string, _ []string) ([]StaleNamespace, error) { + return []StaleNamespace{{Name: "nvcf", Reason: "no Helm release"}}, nil + } + r := staleNamespaceCheck(prober, "", []string{"nvcf"}).Run(context.Background()) + assert.Contains(t, r.Message, "kubectl --context k3d-local delete namespace nvcf") +} + +// An unreadable kubeconfig must not break the hint; it degrades to no flag. +func TestStaleNamespaceCheck_HintsOmitUnknownContext(t *testing.T) { + pinCurrentKubeContext(t, "") + prober := func(_ context.Context, _ string, _ []string) ([]StaleNamespace, error) { + return []StaleNamespace{{Name: "nvcf", Reason: "no Helm release"}}, nil + } + r := staleNamespaceCheck(prober, "", []string{"nvcf"}).Run(context.Background()) + assert.Contains(t, r.Message, "kubectl delete namespace nvcf") +} From 458b201686682996ac84c4b75978ce0301f37aeb Mon Sep 17 00:00:00 2001 From: rohithb Date: Wed, 16 Sep 2026 02:12:32 +0530 Subject: [PATCH 30/36] fix(nvcf-cli): probe the resolved kube context so stale-namespace hints match it --- .../examples/ci-pipelines.md | 5 +- .../agentskill/skilldata_generated.go | 6392 +++++++++-------- .../nvcf-cli/internal/selfhosted/preflight.go | 19 +- .../selfhosted/stale_namespace_test.go | 15 + 4 files changed, 3228 insertions(+), 3203 deletions(-) diff --git a/ai-tooling/user/skills/nvcf-self-managed-cli/examples/ci-pipelines.md b/ai-tooling/user/skills/nvcf-self-managed-cli/examples/ci-pipelines.md index f13e32d79a..ee36891ae5 100644 --- a/ai-tooling/user/skills/nvcf-self-managed-cli/examples/ci-pipelines.md +++ b/ai-tooling/user/skills/nvcf-self-managed-cli/examples/ci-pipelines.md @@ -12,9 +12,9 @@ deploy_nvcf: variables: KUBECONFIG: $KUBECONFIG_FILE script: - - nvcf-cli self-hosted check --pre --json 2>&1 >/dev/null | grep '^{' | jq -e '.event != "phase_failed"' || exit 2 + - nvcf-cli self-hosted check --pre --json 2>&1 >/dev/null | grep '^{' | jq -se 'length > 0 and all(.[]; .event != "phase_failed")' || exit 2 - nvcf-cli self-hosted up --cluster-name=$CLUSTER_NAME --token=$NVCF_ADMIN_JWT --non-interactive --json - - nvcf-cli self-hosted status --json 2>&1 >/dev/null | grep '^{' | jq -e '.verdict == "healthy"' + - nvcf-cli self-hosted status --json 2>&1 >/dev/null | grep '^{' | jq -se 'any(.[]; .verdict == "healthy")' ``` Notes: @@ -22,6 +22,7 @@ Notes: - `--non-interactive --token=$JWT` is required in CI; never use interactive `init`. - Always `--json` for machine-parsing. - `--json` writes JSONL to stderr, not stdout, so redirect with `2>&1 >/dev/null` before a parser. +- Slurp with `jq -s` before testing a condition. Without it `jq -e` takes its exit status from the last event alone, so a `phase_failed` followed by any other event still exits 0. - stderr also carries plain-text notices, so filter to JSON lines. Do not add `--show-logs` here: it appends a non-JSON transcript to the same stream. - Final status check gates downstream stages on `verdict == "healthy"`. diff --git a/src/clis/nvcf-cli/internal/agentskill/skilldata_generated.go b/src/clis/nvcf-cli/internal/agentskill/skilldata_generated.go index d51dddae64..fb4c37f925 100644 --- a/src/clis/nvcf-cli/internal/agentskill/skilldata_generated.go +++ b/src/clis/nvcf-cli/internal/agentskill/skilldata_generated.go @@ -31,14 +31,14 @@ import ( const skillDataZipBase64 = "" + "UEsDBBQACAAAAAAAIQAAAAAAAAAAAAAAAAASAAkAZGF0YS9tYW5pZmVzdC5qc29uVVQFAAEAps4S" + "ewogICJzY2hlbWFWZXJzaW9uIjogMSwKICAiZ2VuZXJhdGVkQXQiOiAiMTk3MC0wMS0wMVQwMDow" + - "MDowMFoiLAogICJ0b3RhbEZpbGVzIjogMjIsCiAgInRvdGFsQnl0ZXMiOiAyMDMwMjMsCiAgImZp" + + "MDowMFoiLAogICJ0b3RhbEZpbGVzIjogMjIsCiAgInRvdGFsQnl0ZXMiOiAyMDMyNDAsCiAgImZp" + "bGVzIjogWwogICAgewogICAgICAicGF0aCI6ICJudmNmLXNlbGYtbWFuYWdlZC1jbGkvU0tJTEwu" + "bWQiLAogICAgICAic2hhMjU2IjogImFhOWY3ZTI0NmYzODA0YjMzNDNiNjU2MWU1YmNmZTdiYjcy" + "YjI0MDIxOTMzZTA0OWY4NWUwMDI4OTAzYmJmYTQiLAogICAgICAic2l6ZSI6IDI0OTE1CiAgICB9" + "LAogICAgewogICAgICAicGF0aCI6ICJudmNmLXNlbGYtbWFuYWdlZC1jbGkvZXhhbXBsZXMvY2kt" + - "cGlwZWxpbmVzLm1kIiwKICAgICAgInNoYTI1NiI6ICI4NGVlNGE0MDc3MzRkYjkzZWRhMjg2OTBk" + - "NTk5OGU2ZWI0YjBlYTkwMTFlY2U4YWIxYWE2OWQyNzMzNjU2OTRmIiwKICAgICAgInNpemUiOiAz" + - "MTA3CiAgICB9LAogICAgewogICAgICAicGF0aCI6ICJudmNmLXNlbGYtbWFuYWdlZC1jbGkvZXhh" + + "cGlwZWxpbmVzLm1kIiwKICAgICAgInNoYTI1NiI6ICJkMzM5M2VmOTVhZWRiYWE1NzBiY2JiZjQ3" + + "MzVkM2ZhYjI1MzY0MDdlM2U1NjdlZmMzNzhhOWVkM2JiYTJmMWNjIiwKICAgICAgInNpemUiOiAz" + + "MzI0CiAgICB9LAogICAgewogICAgICAicGF0aCI6ICJudmNmLXNlbGYtbWFuYWdlZC1jbGkvZXhh" + "bXBsZXMvbXVsdGktY2x1c3Rlci5tZCIsCiAgICAgICJzaGEyNTYiOiAiNmRmMjg0NjBiNTgzNDNl" + "MjEwMjVhYTViZDc5ZjMzYjUxMmRjYTlmZjM5YjZhYjI2MDRmYzNmZWJiMDE1ODhiNCIsCiAgICAg" + "ICJzaXplIjogMzE2NQogICAgfSwKICAgIHsKICAgICAgInBhdGgiOiAibnZjZi1zZWxmLW1hbmFn" + @@ -103,7 +103,7 @@ const skillDataZipBase64 = "" + "aCI6ICJudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24vcmVmZXJlbmNlcy9wdWxsLXNlY3Jl" + "dHMubWQiLAogICAgICAic2hhMjU2IjogImVjMWYzZmZjZDE3ZTVmOTU4M2ZlZTM5NzQ0ZWU4OTdk" + "NDY2YmMzY2Y2Mzg5Mjk0MjY0ZDg5ZTdmOWVkMDFiODciLAogICAgICAic2l6ZSI6IDU2MzIKICAg" + - "IH0KICBdCn0KUEsHCE8jOeVKEAAAShAAAFBLAwQUAAgAAAAAACEAAAAAAAAAAAAAAAAAIwAJAGRh" + + "IH0KICBdCn0KUEsHCAICbAFKEAAAShAAAFBLAwQUAAgAAAAAACEAAAAAAAAAAAAAAAAAIwAJAGRh" + "dGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL1NLSUxMLm1kVVQFAAEAps4SLS0tCm5hbWU6IG52Y2Yt" + "c2VsZi1tYW5hZ2VkLWNsaQpkZXNjcmlwdGlvbjogfAogIEluc3RhbGwsIG9wZXJhdGUsIGFuZCB0" + "ZWFyIGRvd24gc2VsZi1ob3N0ZWQgTlZJRElBIENsb3VkIEZ1bmN0aW9ucyAoTlZDRikKICBkZXBs" + @@ -550,2252 +550,3083 @@ const skillDataZipBase64 = "" + "cGxlCmRlcGxveV9udmNmOgogIHN0YWdlOiBkZXBsb3kKICBpbWFnZTogbnZjci5pby8wNjUxMTU1" + "MjE1ODY0OTc5L25jcC1kZXYvbnZjZi1jbGk6MS40LjAKICB2YXJpYWJsZXM6CiAgICBLVUJFQ09O" + "RklHOiAkS1VCRUNPTkZJR19GSUxFCiAgc2NyaXB0OgogICAgLSBudmNmLWNsaSBzZWxmLWhvc3Rl" + - "ZCBjaGVjayAtLXByZSAtLWpzb24gMj4mMSA+L2Rldi9udWxsIHwgZ3JlcCAnXnsnIHwganEgLWUg" + - "Jy5ldmVudCAhPSAicGhhc2VfZmFpbGVkIicgfHwgZXhpdCAyCiAgICAtIG52Y2YtY2xpIHNlbGYt" + - "aG9zdGVkIHVwIC0tY2x1c3Rlci1uYW1lPSRDTFVTVEVSX05BTUUgLS10b2tlbj0kTlZDRl9BRE1J" + - "Tl9KV1QgLS1ub24taW50ZXJhY3RpdmUgLS1qc29uCiAgICAtIG52Y2YtY2xpIHNlbGYtaG9zdGVk" + - "IHN0YXR1cyAtLWpzb24gMj4mMSA+L2Rldi9udWxsIHwgZ3JlcCAnXnsnIHwganEgLWUgJy52ZXJk" + - "aWN0ID09ICJoZWFsdGh5IicKYGBgCgpOb3RlczoKCi0gYC0tbm9uLWludGVyYWN0aXZlIC0tdG9r" + - "ZW49JEpXVGAgaXMgcmVxdWlyZWQgaW4gQ0k7IG5ldmVyIHVzZSBpbnRlcmFjdGl2ZSBgaW5pdGAu" + - "Ci0gQWx3YXlzIGAtLWpzb25gIGZvciBtYWNoaW5lLXBhcnNpbmcuCi0gYC0tanNvbmAgd3JpdGVz" + - "IEpTT05MIHRvIHN0ZGVyciwgbm90IHN0ZG91dCwgc28gcmVkaXJlY3Qgd2l0aCBgMj4mMSA+L2Rl" + - "di9udWxsYCBiZWZvcmUgYSBwYXJzZXIuCi0gc3RkZXJyIGFsc28gY2FycmllcyBwbGFpbi10ZXh0" + - "IG5vdGljZXMsIHNvIGZpbHRlciB0byBKU09OIGxpbmVzLiBEbyBub3QgYWRkIGAtLXNob3ctbG9n" + - "c2AgaGVyZTogaXQgYXBwZW5kcyBhIG5vbi1KU09OIHRyYW5zY3JpcHQgdG8gdGhlIHNhbWUgc3Ry" + - "ZWFtLgotIEZpbmFsIHN0YXR1cyBjaGVjayBnYXRlcyBkb3duc3RyZWFtIHN0YWdlcyBvbiBgdmVy" + - "ZGljdCA9PSAiaGVhbHRoeSJgLgoKIyMgR2l0T3BzIChBcmdvIC8gRmx1eCkgcGF0dGVybgoKQ0kg" + - "ZG9lc24ndCBga3ViZWN0bCBhcHBseWAg4oCUIGluc3RlYWQsIHJlbmRlciBtYW5pZmVzdHMsIGNv" + - "bW1pdCB0aGVtLCBsZXQgdGhlIGNvbnRyb2xsZXIgYXBwbHkuCgpgYGB5YW1sCnJlbmRlcjoKICBz" + - "Y3JpcHQ6CiAgICAtIG52Y2YtY2xpIHNlbGYtaG9zdGVkIGluc3RhbGwgLS1jb250cm9sLXBsYW5l" + - "IC0tbm8tYXBwbHkgPiByZW5kZXJlZC9jb250cm9sLXBsYW5lLnlhbWwKICAgIC0gbnZjZi1jbGkg" + - "c2VsZi1ob3N0ZWQgaW5zdGFsbCAtLWNvbXB1dGUtcGxhbmUgLS1jbHVzdGVyLW5hbWU9JE5BTUUg" + - "LS1uby1hcHBseSA+IHJlbmRlcmVkL2NvbXB1dGUtcGxhbmUueWFtbAogICAgLSBnaXQgYWRkIHJl" + - "bmRlcmVkLyAmJiBnaXQgY29tbWl0IC1tICJkZXBsb3kgTlZDRiAkVEFHIiAmJiBnaXQgcHVzaApg" + - "YGAKClRoZW4gQXJnb0NEIG9yIEZsdXggd2F0Y2hlcyBgcmVuZGVyZWQvYCBhbmQgYXBwbGllcy4g" + - "VGhlIENMSSBuZXZlciB0b3VjaGVzIHRoZSBjbHVzdGVyIGRpcmVjdGx5LgoKRm9yIHRoZSByZWdp" + - "c3RlciBzdGVwICh3aGljaCBtdXRhdGVzIElDTVMsIG5vdCBqdXN0IEs4cyk6CgpgYGB5YW1sCnJl" + - "Z2lzdGVyOgogIHNjcmlwdDoKICAgIC0gbnZjZi1jbGkgY2x1c3RlciByZWdpc3RlciAtLW5hbWU9" + - "JE5BTUUgLS1uY2EtaWQ9JE5DQSAtLXJlZ2lvbj0kUkVHSU9OIC0taWdub3JlLWV4aXN0aW5nCmBg" + - "YAoKYC0taWdub3JlLWV4aXN0aW5nYCBpcyB0aGUgR2l0T3BzLWZyaWVuZGx5IGlkZW1wb3RlbnQg" + - "Y29udHJhY3QuCgojIyBNdWx0aS1jbHVzdGVyIHBpcGVsaW5lCgpXaGVuIHRoZSBwaXBlbGluZSBt" + - "YW5hZ2VzIG1hbnkgY29tcHV0ZSBjbHVzdGVycyBhZ2FpbnN0IG9uZSBjb250cm9sIHBsYW5lOgoK" + - "YGBgeWFtbApkZXBsb3lfY29tcHV0ZV9wbGFuZXM6CiAgcGFyYWxsZWw6CiAgICBtYXRyaXg6CiAg" + - "ICAgIC0gQ0xVU1RFUjogbmNwLWVhc3QtMQogICAgICAgIENPTlRFWFQ6IGFkbWluQGdwdS1lYXN0" + - "LTEKICAgICAgLSBDTFVTVEVSOiBuY3Atd2VzdC0xCiAgICAgICAgQ09OVEVYVDogYWRtaW5AZ3B1" + - "LXdlc3QtMQogICAgICAtIENMVVNURVI6IG5jcC1ldS0xCiAgICAgICAgQ09OVEVYVDogYWRtaW5A" + - "Z3B1LWV1LTEKICBzY3JpcHQ6CiAgICAtIG52Y2YtY2xpIHNlbGYtaG9zdGVkIHVwCiAgICAgICAg" + - "LS1jbHVzdGVyLW5hbWU9JENMVVNURVIKICAgICAgICAtLWNvbXB1dGUtcGxhbmUtY29udGV4dD0k" + - "Q09OVEVYVAogICAgICAgIC0taWNtcy11cmw9JElDTVNfUFVCTElDX1VSTAogICAgICAgIC0tdG9r" + - "ZW49JE5WQ0ZfQURNSU5fSldUCiAgICAgICAgLS1ub24taW50ZXJhY3RpdmUKICAgICAgICAtLWpz" + - "b24KYGBgCgpFYWNoIHBhcmFsbGVsIGpvYiByZWdpc3RlcnMgKyBpbnN0YWxscyBvbmUgY29tcHV0" + - "ZSBwbGFuZSBhZ2FpbnN0IHRoZSBzaGFyZWQgY29udHJvbCBwbGFuZS4gRmFpbHVyZXMgYXJlIGlz" + - "b2xhdGVkLgoKIyMgUGxhbi1vbmx5IHByZXZpZXcgaW4gUFJzCgpgYGB5YW1sCnByZXZpZXc6CiAg" + - "cnVsZXM6CiAgICAtIGlmOiAkQ0lfUElQRUxJTkVfU09VUkNFID09ICJtZXJnZV9yZXF1ZXN0X2V2" + - "ZW50IgogIHNjcmlwdDoKICAgIC0gfAogICAgICBudmNmLWNsaSBzZWxmLWhvc3RlZCB1cCBcCiAg" + - "ICAgICAgLS1jbHVzdGVyLW5hbWU9JENMVVNURVJfTkFNRSBcCiAgICAgICAgLS1wbGFuLW9ubHkg" + - "XAogICAgICAgIC0tanNvbiB8IHRlZSBwbGFuLmpzb25sCiAgICAtIGpxIC1zICcuWzBdJyBwbGFu" + - "Lmpzb25sID4gcGxhbi5qc29uCiAgICAtICdnaXRsYWItbXItY29tbWVudCAiIyMgTlZDRiBkZXBs" + - "b3kgcGxhblxuXG5cYFxgXGBqc29uXG4kKGNhdCBwbGFuLmpzb24pXG5cYFxgXGAiJwpgYGAKCmAt" + - "LXBsYW4tb25seWAgZXhpdHMgMCB3aXRob3V0IGNoYW5naW5nIGNsdXN0ZXIgc3RhdGU7IHRoZSBK" + - "U09OTCBvdXRwdXQgbGlzdHMgZWFjaCBwaGFzZSArIEVUQS4gUmVuZGVycyBuaWNlbHkgYXMgYW4g" + - "TVIgY29tbWVudC4KUEsHCG3jewUjDAAAIwwAAFBLAwQUAAgAAAAAACEAAAAAAAAAAAAAAAAANAAJ" + - "AGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL2V4YW1wbGVzL211bHRpLWNsdXN0ZXIubWRVVAUA" + - "AQCmzhIjIE11bHRpLWNsdXN0ZXIgcGF0dGVybnMKCkV4YW1wbGVzIG9mIHNwbGl0LWNsdXN0ZXIg" + - "KyBtYW55LWNvbXB1dGUtcGxhbmUgb3BlcmF0aW9uLgoKIyMgT25lIGNvbnRyb2wgcGxhbmUgKyBO" + - "IGNvbXB1dGUgcGxhbmVzCgpUaGUgY2Fub25pY2FsIG11bHRpLWNsdXN0ZXIgdG9wb2xvZ3kuIEVh" + - "Y2ggY29tcHV0ZSBwbGFuZSBpcyByZWdpc3RlcmVkIHNlcGFyYXRlbHk6CgpgYGBzaAojIDEuIEJy" + - "aW5nIHVwIHRoZSBjb250cm9sIHBsYW5lIChvbmUtdGltZSwgb24gdGhlIGNvbnRyb2wtcGxhbmUg" + - "Y2x1c3Rlcik6CktVQkVDT05GSUc9Y3AueWFtbCBudmNmLWNsaSBzZWxmLWhvc3RlZCBpbnN0YWxs" + - "IC0tY29udHJvbC1wbGFuZSB8IGt1YmVjdGwgYXBwbHkgLWYgLQpudmNmLWNsaSBzZWxmLWhvc3Rl" + - "ZCBjaGVjayAtLWNvbnRyb2wtcGxhbmUgLS13YWl0IDVtCgojIDIuIFJlZ2lzdGVyICsgaW5zdGFs" + - "bCBlYWNoIGNvbXB1dGUgcGxhbmU6CmZvciBDVFggaW4gYWRtaW5AZ3B1LWVhc3QtMSBhZG1pbkBn" + - "cHUtd2VzdC0xIGFkbWluQGdwdS1ldS0xOyBkbwogIE5BTUU9JChlY2hvICIkQ1RYIiB8IGN1dCAt" + - "ZEAgLWYyKQogIG52Y2YtY2xpIHNlbGYtaG9zdGVkIHVwIFwKICAgIC0tY2x1c3Rlci1uYW1lPSRO" + - "QU1FIFwKICAgIC0tY29tcHV0ZS1wbGFuZS1jb250ZXh0PSRDVFggXAogICAgLS1pY21zLXVybD1o" + - "dHRwczovL2ljbXMubnZjZi5leGFtcGxlLmNvbSBcCiAgICAtLXRva2VuPSROVkNGX0FETUlOX0pX" + - "VCBcCiAgICAtLW5vbi1pbnRlcmFjdGl2ZSBcCiAgICAtLWpzb24KZG9uZQoKIyAzLiBWZXJpZnkg" + - "YWxsIGNvbXB1dGUgcGxhbmVzIHJlZ2lzdGVyZWQ6Cm52Y2YtY2xpIGNsdXN0ZXIgbGlzdC1yZWdp" + - "c3RlcmVkIC0tbmNhLWlkPSROQ0FfSUQgLS1pY21zLXVybD0kSUNNUyAtLWpzb24gXAogIHwganEg" + - "Jy5jbHVzdGVyc1tdIHwge25hbWU6IC5jbHVzdGVyTmFtZSwgc3RhdHVzLCBudmNhVmVyc2lvbn0n" + - "CmBgYAoKIyMgQ29tcHV0ZS1wbGFuZS1vbmx5IG9wZXJhdG9yIHNjZW5hcmlvCgpUaGUgb3BlcmF0" + - "b3IgaGFzIGt1YmVjdGwgYWNjZXNzIHRvIE9ORSBjb21wdXRlIHBsYW5lIG9ubHkg4oCUIHRoZSBj" + - "b250cm9sIHBsYW5lIGlzIG9wZXJhdGVkIGJ5IHNvbWVvbmUgZWxzZSAoZS5nLiBZb3R0YSBydW5z" + - "IHRoZSBjb250cm9sIHBsYW5lIGZvciBhIGN1c3RvbWVyKS4KCmBgYHNoCiMgTWludCBhIHRva2Vu" + - "IHZpYSB0aGUgcHVibGljIGFwaSBnYXRld2F5ICh0aGUgY29udHJvbCBwbGFuZSdzIEFQSSBLZXlz" + - "CiMgc2VydmljZSBpcyByZWFjaGFibGUgdmlhIGFwaS5udmNmLmV4YW1wbGUuY29tIOKAlCBubyBr" + - "dWJlY3RsIGFjY2VzcyBuZWVkZWQpOgpudmNmLWNsaSBpbml0IC0tYXBpLXVybD1odHRwczovL2Fw" + - "aS5udmNmLmV4YW1wbGUuY29tCgojIFJ1biBwcmUtZmxpZ2h0IHNjb3BlZCB0byB0aGUgY29tcHV0" + - "ZSBwbGFuZSBvbmx5OgpudmNmLWNsaSBzZWxmLWhvc3RlZCBjaGVjayAtLXByZSBcCiAgLS1jb21w" + - "dXRlLXBsYW5lLWNvbnRleHQ9YWRtaW5AZ3B1MSBcCiAgLS1pY21zLXVybD1odHRwczovL2ljbXMu" + - "bnZjZi5leGFtcGxlLmNvbSBcCiAgLS1qc29uCgojIEJyaW5nIHVwIGp1c3QgdGhlIGNvbXB1dGUg" + - "cGxhbmU6Cm52Y2YtY2xpIHNlbGYtaG9zdGVkIHVwIFwKICAtLWNsdXN0ZXItbmFtZT1teS1jb21w" + - "dXRlLTEgXAogIC0tY29tcHV0ZS1wbGFuZS1jb250ZXh0PWFkbWluQGdwdTEgXAogIC0taWNtcy11" + - "cmw9aHR0cHM6Ly9pY21zLm52Y2YuZXhhbXBsZS5jb20gXAogIC0tdG9rZW49JEFETUlOX0pXVCBc" + - "CiAgLS1ub24taW50ZXJhY3RpdmUKCiMgU3RhdHVzIChjb21wdXRlLW9ubHkg4oCUIG9wZXJhdG9y" + - "IGNhbid0IHNlZSBjb250cm9sLXBsYW5lIGNvbXBvbmVudCBoZWFsdGgpOgpudmNmLWNsaSBzZWxm" + - "LWhvc3RlZCBzdGF0dXMgXAogIC0tY29tcHV0ZS1wbGFuZS1jb250ZXh0PWFkbWluQGdwdTEgXAog" + - "IC0taWNtcy11cmw9aHR0cHM6Ly9pY21zLm52Y2YuZXhhbXBsZS5jb20KYGBgCgojIyBGdW5jdGlv" + - "bnMgdGFyZ2V0aW5nIHNwZWNpZmljIGNvbXB1dGUgcGxhbmVzCgpXaGVuIHlvdSBoYXZlIG11bHRp" + - "cGxlIGNvbXB1dGUgcGxhbmVzIGFuZCB3YW50IGEgZnVuY3Rpb24gdG8gZGVwbG95IHRvIG9uZToK" + - "CmBgYGpzb24KewogICJmdW5jdGlvbklkIjogIjxmbl9pZD4iLAogICJ2ZXJzaW9uSWQiOiAiPHZl" + - "cl9pZD4iLAogICJkZXBsb3ltZW50U3BlY2lmaWNhdGlvbnMiOiBbewogICAgImdwdSI6ICJIMTAw" + - "IiwKICAgICJpbnN0YW5jZVR5cGUiOiAiTkNQLkdQVS5IMTAwXzF4IiwKICAgICJtaW5JbnN0YW5j" + - "ZXMiOiAxLAogICAgIm1heEluc3RhbmNlcyI6IDEsCiAgICAiY2x1c3RlcnMiOiBbImdwdS1lYXN0" + - "LTEiXQogIH1dCn0KYGBgCgpUaGUgYGNsdXN0ZXJzYCBhcnJheSAodXNpbmcgY2x1c3RlciBuYW1l" + - "cywgbm90IElEcykgbGltaXRzIHNjaGVkdWxpbmcgdG8gdGhvc2UgY29tcHV0ZSBwbGFuZXMuIE9t" + - "aXQgdG8gbGV0IElDTVMgY2hvb3NlIGFueSBjb21wdXRlIHBsYW5lIHdpdGggYSBtYXRjaGluZyBT" + - "S1UuCgojIyBTdGF0dXMgZmFuLW91dCBhY3Jvc3MgY29tcHV0ZSBwbGFuZXMKCmBgYHNoCiMgTGlz" + - "dCBhbGwgcmVnaXN0ZXJlZCBjb21wdXRlIHBsYW5lczoKbnZjZi1jbGkgY2x1c3RlciBsaXN0LXJl" + - "Z2lzdGVyZWQgLS1uY2EtaWQ9JE5DQV9JRCAtLWljbXMtdXJsPSRJQ01TIC0tanNvbiBcCiAgfCBq" + - "cSAtciAnLmNsdXN0ZXJzW10uY2x1c3Rlck5hbWUnID4gY2x1c3RlcnMudHh0CgojIFN0YXR1cyBz" + - "bmFwc2hvdCBwZXIgY29tcHV0ZSBwbGFuZSAoYXNzdW1pbmcgZWFjaCBjb250ZXh0IG5hbWUgbWF0" + - "Y2hlcyk6CndoaWxlIHJlYWQgTkFNRTsgZG8KICBlY2hvICI9PT0gJE5BTUUgPT09IgogIG52Y2Yt" + - "Y2xpIHNlbGYtaG9zdGVkIHN0YXR1cyBcCiAgICAtLWNsdXN0ZXItbmFtZT0kTkFNRSBcCiAgICAt" + - "LWNvbXB1dGUtcGxhbmUtY29udGV4dD1hZG1pbkAkTkFNRSBcCiAgICAtLWpzb24gfCBqcSAtYyAn" + - "e2NsdXN0ZXI6LmNsdXN0ZXIsIHZlcmRpY3Q6LnZlcmRpY3QsIHJlY29uY2lsZToucmVjb25jaWxl" + - "QWdlU2VjfScKZG9uZSA8IGNsdXN0ZXJzLnR4dApgYGAKCkEgZnV0dXJlIE0rMTEgbWlsZXN0b25l" + - "IHdpbGwgYWRkIG5hdGl2ZSBmYW4tb3V0IChgc3RhdHVzIC0tYWxsLWNvbXB1dGUtcGxhbmVzYCkg" + - "c28gdGhpcyBkb2Vzbid0IG5lZWQgYSBzaGVsbCBsb29wLgpQSwcIoRTjgV0MAABdDAAAUEsDBBQA" + - "CAAAAAAAIQAAAAAAAAAAAAAAAAA3AAkAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1jbGkvcHJvbXB0" + - "cy9hZGQtY29tcHV0ZS1wbGFuZS5tZFVUBQABAKbOEiMgQWRkIGEgY29tcHV0ZSBwbGFuZSB0byBh" + - "biBleGlzdGluZyBjb250cm9sIHBsYW5lCgpVc2VyIGhhcyBhIHdvcmtpbmcgTlZDRiBjb250cm9s" + - "IHBsYW5lIChydW5uaW5nIHNvbWV3aGVyZSkgYW5kIHdhbnRzIHRvIHJlZ2lzdGVyIGEgbmV3IEdQ" + - "VSBjbHVzdGVyIGFnYWluc3QgaXQuIFRoaXMgaXMgdGhlIG11bHRpLWNsdXN0ZXIgc2NhbGluZyBw" + - "YXRoOiBvbmUgY29udHJvbCBwbGFuZSDihpIgTiBjb21wdXRlIHBsYW5lcy4KCiMjIFByZXJlcXVp" + - "c2l0ZXMgdGhlIHVzZXIgbXVzdCBoYXZlCgotICoqa3ViZWN0bCBjb250ZXh0IGZvciB0aGUgbmV3" + - "IGNvbXB1dGUgcGxhbmUqKiBpbiB0aGVpciBgS1VCRUNPTkZJR2AuCi0gKipQdWJsaWMgSUNNUyBV" + - "UkwqKiBvZiB0aGUgZXhpc3RpbmcgY29udHJvbCBwbGFuZSAoZS5nLiBgaHR0cHM6Ly9pY21zLm52" + - "Y2YuZXhhbXBsZS5jb21gKS4KLSAqKkFkbWluIEpXVCoqIGZvciB0aGUgY29udHJvbCBwbGFuZSdz" + - "IGFjY291bnQsIE9SIGFiaWxpdHkgdG8gbWludCBvbmUgdmlhIGBudmNmLWNsaSBpbml0YCBhZ2Fp" + - "bnN0IHRoZSBjb250cm9sIHBsYW5lJ3MgcHVibGljIGFwaSBlbmRwb2ludC4gKEFkbWluIHRva2Vu" + - "cyBjb21lIGZyb20gdGhlIEFQSSBLZXlzIHNlcnZpY2UgdmlhIHRoZSBwdWJsaWMgYXBpIGdhdGV3" + - "YXkg4oCUIGt1YmVjdGwgYWNjZXNzIHRvIHRoZSBjb250cm9sIHBsYW5lIGlzIE5PVCByZXF1aXJl" + - "ZCB0byBvYnRhaW4gb25lLikKLSBBIHVuaXF1ZSBgLS1jbHVzdGVyLW5hbWVgIHRoYXQgZG9lc24n" + - "dCBjb2xsaWRlIHdpdGggYWxyZWFkeS1yZWdpc3RlcmVkIGNsdXN0ZXJzLiBVc2UgYG52Y2YtY2xp" + - "IGNsdXN0ZXIgbGlzdC1yZWdpc3RlcmVkIC0tbmNhLWlkPSROQ0FfSUQgLS1pY21zLXVybD0kSUNN" + - "U2AgdG8gY2hlY2suCgojIyBTdGVwcwoKMS4gKipBc2sgZm9yIGlucHV0czoqKgogICAtIGAtLWNs" + - "dXN0ZXItbmFtZT08dW5pcXVlPmAg4oCUIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgY29udHJv" + - "bCBwbGFuZSdzIE5DQSBzY29wZQogICAtIGAtLWNvbXB1dGUtcGxhbmUtY29udGV4dD08Y29udGV4" + - "dD5gIOKAlCB0aGUgbmV3IEdQVSBjbHVzdGVyJ3Mga3ViZWN0bCBjb250ZXh0CiAgIC0gYC0taWNt" + - "cy11cmw9PGh0dHBzOi8vaWNtcy5udmNmLmV4YW1wbGUuY29tPmAg4oCUIGNvbnRyb2wgcGxhbmUn" + - "cyBwdWJsaWMgSUNNUyBVUkwKICAgLSBHUFUgdHlwZT8gKGRlZmF1bHQgYEgxMDBgLCBidXQgYXNr" + - "KQoKMi4gKipQcmUtZmxpZ2h0IGp1c3QgdGhlIGNvbXB1dGUgcGxhbmU6KioKCiAgIGBgYHNoCiAg" + - "IG52Y2YtY2xpIHNlbGYtaG9zdGVkIGNoZWNrIC0tcHJlIFwKICAgICAtLWNvbXB1dGUtcGxhbmUt" + - "Y29udGV4dD0kQ1RYIFwKICAgICAtLWljbXMtdXJsPSRJQ01TIFwKICAgICAtLWpzb24gfCBqcSAt" + - "YyAuCiAgIGBgYAoKICAgVGhpcyB2YWxpZGF0ZXMgdGhlIEdQVSBvcGVyYXRvciBpcyBpbnN0YWxs" + - "ZWQsIEdQVSBub2RlIGxhYmVscyBhcmUgcHJlc2VudCwgYW5kIElDTVMgaXMgcmVhY2hhYmxlIHZp" + - "YSBIVFRQLiBBZGRyZXNzIGFueSBmYWlsdXJlcyBiZWZvcmUgcHJvY2VlZGluZy4KCjMuICoqUnVu" + - "IGBhZGQtY29tcHV0ZS1wbGFuZWA6KioKCiAgIGBgYHNoCiAgIG52Y2YtY2xpIHNlbGYtaG9zdGVk" + - "IGFkZC1jb21wdXRlLXBsYW5lIFwKICAgICAtLWNsdXN0ZXItbmFtZT0kTkFNRSBcCiAgICAgLS1j" + - "b21wdXRlLXBsYW5lLWNvbnRleHQ9JENUWCBcCiAgICAgLS1pY21zLXVybD0kSUNNUyBcCiAgICAg" + - "LS10b2tlbj0kSldUIFwKICAgICAtLW5vbi1pbnRlcmFjdGl2ZSBcCiAgICAgLS1qc29uCiAgIGBg" + - "YAoKICAgVGhpcyBpcyBhIHNlcGFyYXRlIHN1YmNvbW1hbmQgZnJvbSBgdXBgLiBJdCBydW5zIG9u" + - "bHkgdGhlIGNvbXB1dGUtcGxhbmUtcmVsZXZhbnQgcGhhc2VzOiAxIChjb21wdXRlLXBsYW5lIHBy" + - "ZWZsaWdodCksIDUgKHJlZ2lzdGVyKSwgNiAoY29tcHV0ZS1wbGFuZSBhcHBseSksIDggKGZpbmFs" + - "IGhlYWx0aCBvbiB0aGUgbmV3IGNvbXB1dGUgcGxhbmUpLiBJdCBkb2VzIE5PVCB0b3VjaCB0aGUg" + - "Y29udHJvbCBwbGFuZSBhbmQgZG9lcyBOT1QgYWNjZXB0IGAtLWNvbnRyb2wtcGxhbmUtY29udGV4" + - "dGAg4oCUIHRoZSBjb250cm9sIHBsYW5lIGlzIHJlYWNoZWQgb3ZlciBIVFRQUyBhdCBgLS1pY21z" + - "LXVybGAuIGAtLXRva2VuYCBpcyByZXF1aXJlZCBiZWNhdXNlIHRoZXJlJ3Mgbm8ga3ViZWN0bCBw" + - "YXRoIHRvIG1pbnQgb25lIGZyb20uCgo0LiAqKlZlcmlmeS4qKiBgbnZjZi1jbGkgc2VsZi1ob3N0" + - "ZWQgc3RhdHVzIC0tY2x1c3Rlci1uYW1lPSROQU1FIC0tanNvbiB8IGpxYCDigJQgZXhwZWN0IGB2" + - "ZXJkaWN0OiAiaGVhbHRoeSJgLiBUaGUgUmVnaXN0ZXJlZCBDb21wdXRlIFBsYW5lcyBwYW5lbCBm" + - "cm9tIElDTVMgc2hvdWxkIG5vdyBsaXN0IHRoZSBuZXcgY2x1c3Rlci4KCjUuICoqU21va2UuKiog" + - "W2RlcGxveS1hbmQtaW52b2tlLm1kXShkZXBsb3ktYW5kLWludm9rZS5tZCkg4oCUIGRlcGxveSBh" + - "IHNtYWxsIGZ1bmN0aW9uIHRvIHRoZSBuZXcgY29tcHV0ZSBwbGFuZSB0byBjb25maXJtIHNjaGVk" + - "dWxpbmcgd29ya3MuCgojIyBXaGF0IGlmIGEgY2x1c3RlciB3aXRoIHRoZSBzYW1lIG5hbWUgYWxy" + - "ZWFkeSBleGlzdHM/CgpgYWRkLWNvbXB1dGUtcGxhbmVgJ3MgcmVnaXN0ZXIgcGhhc2UgdXNlcyBg" + - "LS1pZ25vcmUtZXhpc3RpbmdgIHNlbWFudGljcyDigJQgaXQnbGwgbWF0Y2ggdGhlIGV4aXN0aW5n" + - "IElDTVMgcm93IGFuZCByZXVzZSBpdHMgY2x1c3RlcklkLiBUd28gc2NlbmFyaW9zOgoKLSAqKlJl" + - "LXJlZ2lzdGVyaW5nIHRoZSBzYW1lIGNsdXN0ZXIqKiAocmUtcnVubmluZyBvbiB0aGUgc2FtZSBj" + - "b21wdXRlIHBsYW5lIHRoYXQgd2FzIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCk6IGV4cGVjdGVkLCBu" + - "by1vcCBzZW1hbnRpY3MuCi0gKipEaWZmZXJlbnQgcGh5c2ljYWwgY2x1c3RlciBidXQgc2FtZSBu" + - "YW1lKio6IHRoZSBzZWNvbmQgYXR0ZW1wdCB3aWxsIHJldXNlIHRoZSBJQ01TIHJvdywgYnV0IHRo" + - "ZSBuZXcgY29tcHV0ZSBwbGFuZSdzIEpXS1Mgd2lsbCBiZSBzaWxlbnRseSAqcmVwbGFjZWQqIOKA" + - "lCB0aGUgb2xkIGNvbXB1dGUgcGxhbmUncyBOVkNBIGFnZW50IHdpbGwgc3RhcnQgZmFpbGluZyBQ" + - "U0FUIGF1dGguICoqQ29uZmlybSB3aXRoIHRoZSB1c2VyKiogdGhhdCB0aGV5IG1lYW50IHRvIG92" + - "ZXJ3cml0ZS4KCldoZW4gaW4gZG91YnQsIHJ1biBgbnZjZi1jbGkgY2x1c3RlciBsaXN0LXJlZ2lz" + - "dGVyZWQgLS1uY2EtaWQ9JE5DQV9JRCAtLWljbXMtdXJsPSRJQ01TYCBmaXJzdCBhbmQgYXNrIHRo" + - "ZSB1c2VyIGJlZm9yZSBwcm9jZWVkaW5nIHdpdGggYSBuYW1lIHRoYXQgYWxyZWFkeSBleGlzdHMu" + - "ClBLBwhCJ0kPBQ0AAAUNAABQSwMEFAAIAAAAAAAhAAAAAAAAAAAAAAAAADkACQBkYXRhL252Y2Yt" + - "c2VsZi1tYW5hZ2VkLWNsaS9wcm9tcHRzL2NyZWF0ZS1hbmQtcnVuLXRhc2subWRVVAUAAQCmzhIj" + - "IENyZWF0ZSBhbmQgcnVuIGEgdGFzawoKU3RhbmRhcmQgZmxvdzogbWludCBBUEkga2V5cyAtPiB0" + - "YXNrIENSRUFURSAtPiBtb25pdG9yIC0+IHJldHJpZXZlIHJlc3VsdHMgLT4gY2xlYW51cC4KCiMj" + - "IDEuIE1pbnQgQVBJIGtleXMKClRoZSBhZG1pbiB0b2tlbiBmcm9tIGBpbml0YCBkb2VzIG5vdCBj" + - "YXJyeSB0YXNrIGludm9jYXRpb24gc2NvcGUuIEdlbmVyYXRlIEFQSSBrZXlzOgoKYGBgc2gKbnZj" + - "Zi1jbGkgYXBpLWtleSBnZW5lcmF0ZSAtLWRlc2NyaXB0aW9uPSJ0YXNrIHNtb2tlIHRlc3QiIC0t" + - "ZXhwaXJlcy1pbj04aAojIC0+IGZ1bmN0aW9uIGtleTogbnZhcGktLi4uCiMgLT4gdGFzayBrZXk6" + - "IG52YXBpLS4uLgpgYGAKCkJvdGgga2V5cyBhcmUgc2F2ZWQgdG8gQ0xJIHN0YXRlLiBUbyBtaW50" + - "IG9ubHkgdGhlIHRhc2sga2V5OgoKYGBgc2gKbnZjZi1jbGkgYXBpLWtleSBnZW5lcmF0ZSAtLWZv" + - "ciB0YXNrIC0tZGVzY3JpcHRpb249InRhc2sgc21va2UgdGVzdCIgLS1leHBpcmVzLWluPThoCmBg" + - "YAoKVG8gdmFsaWRhdGUgZWFjaCBrZXkgaW1tZWRpYXRlbHkgYWZ0ZXIgbWludGluZzoKCmBgYHNo" + - "Cm52Y2YtY2xpIGFwaS1rZXkgZ2VuZXJhdGUgLS1kZXNjcmlwdGlvbj0idGFzayBzbW9rZSB0ZXN0" + - "IiAtLWV4cGlyZXMtaW49OGggLS12YWxpZGF0ZQojIC0+IGZ1bmN0aW9uIEFQSSBrZXkgdmFsaWRh" + - "dGlvbiBwYXNzZWQhCiMgLT4gdGFzayBBUEkga2V5IHZhbGlkYXRpb24gcGFzc2VkIQpgYGAKCk5l" + - "dmVyIGVjaG8gdGhlIGtleSB2YWx1ZSAobnZhcGktLi4uKSBpbnRvIGNoYXQgb3IgbG9ncy4gUmVw" + - "b3J0IG9ubHkgdGhhdCB0aGUga2V5IHdhcyBtaW50ZWQsIGl0cyBkZXNjcmlwdGlvbiwgYW5kIGl0" + - "cyBleHBpcnkg4oCUIG5ldmVyIHRoZSB2YWx1ZSBpdHNlbGYuCgojIyMgRnJlc2ggc2Vzc2lvbiBw" + - "cmUtZmxpZ2h0CgpCZWZvcmUgcnVubmluZyBhbnkgYHRhc2tgIGNvbW1hbmQgaW4gYSBmcmVzaCBh" + - "Z2VudCBzZXNzaW9uLCB2ZXJpZnkgY3JlZGVudGlhbHM6CgoxLiBDaGVjayB3aGV0aGVyIGBOVkNG" + - "X0FQSV9LRVlgIGlzIHNldDoKCiAgIGBgYHNoCiAgIHByaW50ZW52IE5WQ0ZfQVBJX0tFWSA+IC9k" + - "ZXYvbnVsbCAyPiYxICYmIGVjaG8gc2V0IHx8IGVjaG8gdW5zZXQKICAgYGBgCgoyLiBJZiB1bnNl" + - "dCwgcmVhZCB0aGUgc3RvcmVkIGtleSBleHBpcnkgd2l0aG91dCBwcmludGluZyB0aGUgdmFsdWU6" + - "CgogICBgYGBzaAogICBweXRob24zIC1jICJpbXBvcnQganNvbixwYXRobGliOyBzPWpzb24ubG9h" + - "ZHMocGF0aGxpYi5QYXRoKCd+Ly5udmNmLWNsaS5zdGF0ZScpLmV4cGFuZHVzZXIoKS5yZWFkX3Rl" + - "eHQoKSk7IHByaW50KHMuZ2V0KCdudmN0QXBpS2V5RXhwaXJhdGlvbicsJ21pc3NpbmcnKSkiCiAg" + - "IGBgYAoKMy4gSWYgdGhlIGV4cGlyeSBpcyBpbiB0aGUgcGFzdCBvciBtaXNzaW5nLCByZWdlbmVy" + - "YXRlOgoKICAgYGBgc2gKICAgbnZjZi1jbGkgcmVmcmVzaAogICBudmNmLWNsaSBhcGkta2V5IGdl" + - "bmVyYXRlIC0tZm9yIHRhc2sgLS1kZXNjcmlwdGlvbj0idGFzay1rZXkiIC0tZXhwaXJlcy1pbj0y" + - "NGggLS12YWxpZGF0ZQogICBgYGAKCjQuIEluamVjdCB0aGUgc3RvcmVkIGtleSBpbnRvIHRoZSBz" + - "dWJwcm9jZXNzIGVudiB3aXRob3V0IGxvZ2dpbmcgdGhlIHZhbHVlLiBVc2UgYSBzaGVsbCBzdWJz" + - "aGVsbCBvciBlbnYgcHJlZml4IOKAlCBuZXZlciBwcmludCB0aGUga2V5IGludG8gY2hhdC4KCkVy" + - "cm9yIGNsYXNzaWZpY2F0aW9uOgoKLSAibWlzc2luZyBhdXRoZW50aWNhdGlvbiBjcmVkZW50aWFs" + - "cyIgb3IgZXhpdCAyOiBrZXkgbm90IGluamVjdGVkOyByZXBlYXQgcHJlLWZsaWdodC4KLSBIVFRQ" + - "IDQwMzoga2V5IGV4cGlyZWQgb3Igd3JvbmcgYXVkaWVuY2U7IHJlZ2VuZXJhdGUuCi0gRW1wdHkg" + - "dGFzayBsaXN0OiB2YWxpZDsgbm8gdGFza3MgZXhpc3QgeWV0LgoKIyMgMi4gVGFzayBDUkVBVEU6" + - "IGNvbnRhaW5lcgoKRGVmaW5lIHRoZSB0YXNrIGluIGEgSlNPTiBmaWxlLiBNaW5pbXVtIHZpYWJs" + - "ZSBjb250YWluZXIgdGFzazoKCmBgYGpzb24KewogICJuYW1lIjogInNtb2tlLWNvbnRhaW5lci10" + - "YXNrIiwKICAiZ3B1U3BlY2lmaWNhdGlvbiI6IHsKICAgICJncHUiOiAiSDEwMCIsCiAgICAiaW5z" + - "dGFuY2VUeXBlIjogIk5DUC5HUFUuSDEwMF8xeCIsCiAgICAiYmFja2VuZCI6ICJuY3AtbG9jYWwi" + - "CiAgfSwKICAiY29udGFpbmVySW1hZ2UiOiAibnZjci5pby9udmlkaWEvbmVtbzpsYXRlc3QiLAog" + - "ICJjb250YWluZXJBcmdzIjogInB5dGhvbiAtYyBcInByaW50KCdoZWxsbyBmcm9tIHRhc2snKVwi" + - "IiwKICAicmVzdWx0SGFuZGxpbmdTdHJhdGVneSI6ICJOT05FIgp9CmBgYAoKYGBgc2gKbnZjZi1j" + - "bGkgdGFzayBjcmVhdGUgLS1pbnB1dC1maWxlPXRhc2stY29udGFpbmVyLmpzb24KIyAtPiBUYXNr" + - "IElEOiA8dGFza19pZD4KYGBgCgpDYXB0dXJlIHRoZSB0YXNrIElEIGZyb20gdGhlIG91dHB1dC4g" + - "U3RhdGUgcGVyc2lzdGVuY2UgY2FuIGZhaWwgc2lsZW50bHksIHNvIHBhc3MKYDx0YXNrSWQ+YCBl" + - "eHBsaWNpdGx5IG9uIHN1YnNlcXVlbnQgY29tbWFuZHMgcmF0aGVyIHRoYW4gcmVseWluZyBvbiBz" + - "YXZlZCBzdGF0ZS4KCkVxdWl2YWxlbnQgQ0xJIGZsYWdzIGZvcm0gZm9yIHF1aWNrIGFkLWhvYyBy" + - "dW5zOgoKYGBgc2gKbnZjZi1jbGkgdGFzayBjcmVhdGUgXAogIC0tbmFtZT1zbW9rZS1jb250YWlu" + - "ZXItdGFzayBcCiAgLS1ncHU9SDEwMCBcCiAgLS1pbnN0YW5jZS10eXBlPU5DUC5HUFUuSDEwMF8x" + - "eCBcCiAgLS1iYWNrZW5kPW5jcC1sb2NhbCBcCiAgLS1pbWFnZT1udmNyLmlvL252aWRpYS9uZW1v" + - "OmxhdGVzdCBcCiAgLS1jb250YWluZXItYXJncz0icHl0aG9uIC1jICdwcmludChoZWxsbyBmcm9t" + - "IHRhc2spJyIgXAogIC0tcmVzdWx0LXN0cmF0ZWd5PU5PTkUKYGBgCgpUbyB0YXJnZXQgYSBzcGVj" + - "aWZpYyBjb21wdXRlIGNsdXN0ZXI6CgpgYGBzaApudmNmLWNsaSB0YXNrIGNyZWF0ZSAtLWlucHV0" + - "LWZpbGU9dGFzay1jb250YWluZXIuanNvbiAtLWNsdXN0ZXJzPW15LWNsdXN0ZXIKYGBgCgpUbyBp" + - "bmplY3QgZW52aXJvbm1lbnQgdmFyaWFibGVzIG9yIHNlY3JldHMsIGVpdGhlciBwYXNzIGZsYWdz" + - "OgoKYGBgc2gKbnZjZi1jbGkgdGFzayBjcmVhdGUgLS1pbnB1dC1maWxlPXRhc2stY29udGFpbmVy" + - "Lmpzb24gXAogIC0tY29udGFpbmVyLWVudiBNWV9FTlY9dmFsdWUgXAogIC0tc2VjcmV0cyBNWV9T" + - "RUNSRVQ9czNjcjN0CmBgYAoKb3Igc2V0IHRoZW0gaW4gdGhlIEpTT04gZmlsZToKCmBgYGpzb24K" + - "ewogICJjb250YWluZXJFbnZpcm9ubWVudCI6IFsKICAgIHsia2V5IjogIk1ZX0VOViIsICJ2YWx1" + - "ZSI6ICJ2YWx1ZSJ9CiAgXSwKICAic2VjcmV0cyI6IFsKICAgIHsibmFtZSI6ICJNWV9TRUNSRVQi" + - "LCAidmFsdWUiOiAiczNjcjN0In0KICBdCn0KYGBgCgpTZWNyZXRzIGFyZSBlbmNyeXB0ZWQgYXQg" + - "cmVzdCBhbmQgbm90IHJldHVybmVkIGluIGxpc3Qgb3IgZ2V0IHJlc3BvbnNlcyBieSBkZWZhdWx0" + - "OyBkbyBub3QgbG9nIHRoZW0uCgojIyAzLiBUYXNrIENSRUFURTogSGVsbQoKRm9yIEhlbG0tdHlw" + - "ZSB0YXNrcywgcmVwbGFjZSBgY29udGFpbmVySW1hZ2VgIHdpdGggYGhlbG1DaGFydGA6CgpgYGBq" + - "c29uCnsKICAibmFtZSI6ICJzbW9rZS1oZWxtLXRhc2siLAogICJncHVTcGVjaWZpY2F0aW9uIjog" + - "ewogICAgImdwdSI6ICJIMTAwIiwKICAgICJpbnN0YW5jZVR5cGUiOiAiTkNQLkdQVS5IMTAwXzF4" + - "IiwKICAgICJiYWNrZW5kIjogIm5jcC1sb2NhbCIKICB9LAogICJoZWxtQ2hhcnQiOiAiaHR0cHM6" + - "Ly9oZWxtLm5nYy5udmlkaWEuY29tLzxvcmc+L2NoYXJ0cy9leGFtcGxlLXRhc2stMC4xLjAudGd6" + - "IiwKICAicmVzdWx0SGFuZGxpbmdTdHJhdGVneSI6ICJOT05FIgp9CmBgYAoKYGBgc2gKbnZjZi1j" + - "bGkgdGFzayBjcmVhdGUgLS1pbnB1dC1maWxlPXRhc2staGVsbS5qc29uCiMgLT4gVGFzayBJRDog" + - "PHRhc2tfaWQ+CmBgYAoKYGhlbG1DaGFydGAgYW5kIGBjb250YWluZXJJbWFnZWAgYXJlIG11dHVh" + - "bGx5IGV4Y2x1c2l2ZS4KCiMjIDNiLiBVcGRhdGUgc2VjcmV0cyBvbiBhIHJ1bm5pbmcgdGFzawoK" + - "YGBgc2gKbnZjZi1jbGkgdGFzayB1cGRhdGUtc2VjcmV0cyA8dGFza19pZD4gLS1zZWNyZXRzIE5B" + - "TUU9dmFsdWUKYGBgCgpgdXBkYXRlLXNlY3JldHNgIG1lcmdlcyBzZWNyZXRzIGJ5IG5hbWU6IHN1" + - "cHBsaWVkIHNlY3JldHMgYXJlIGFkZGVkIG9yIHVwZGF0ZWQsIGFuZCBleGlzdGluZyBzZWNyZXRz" + - "IG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVxdWVzdCBhcmUgcHJlc2VydmVkLiBEbyBub3QgZWNobyBz" + - "ZWNyZXQgdmFsdWVzIGludG8gY2hhdC4KCiMjIDQuIE1vbml0b3IKClBvbGwgdGFzayBzdGF0ZToK" + - "CmBgYHNoCm52Y2YtY2xpIHRhc2sgZ2V0IDx0YXNrX2lkPgojIC0+IGlkOiA8dGFza19pZD4KIyAt" + - "PiBzdGF0dXM6IFJVTk5JTkcKYGBgCgpPciB1c2UgdGhlIHRhc2sgSUQgc2F2ZWQgdG8gc3RhdGUg" + - "ZnJvbSB0aGUgbW9zdCByZWNlbnQgYHRhc2sgY3JlYXRlYDoKCmBgYHNoCm52Y2YtY2xpIHRhc2sg" + - "Z2V0CmBgYAoKU3RhdHVzIHZhbHVlczogYFFVRVVFRGAsIGBMQVVOQ0hFRGAsIGBSVU5OSU5HYCwg" + - "YENPTVBMRVRFRGAsIGBFUlJPUkVEYCwgYENBTkNFTEVEYCwgYEVYQ0VFREVEX01BWF9SVU5USU1F" + - "X0RVUkFUSU9OYCwgYEVYQ0VFREVEX01BWF9RVUVVRURfRFVSQVRJT05gLgoKSW5zcGVjdCBsaWZl" + - "Y3ljbGUgZXZlbnRzIGZvciBwcm9ncmVzcyBkZXRhaWxzIG9yIGZhaWx1cmUgY29udGV4dDoKCmBg" + - "YHNoCm52Y2YtY2xpIHRhc2sgZXZlbnRzIDx0YXNrX2lkPgpgYGAKCklmIHRoZSB0YXNrIGlzIHN0" + - "dWNrIGluIGBRVUVVRURgLCBjaGVjayB0aGF0IGEgY29tcHV0ZSBjbHVzdGVyIHdpdGggYSBtYXRj" + - "aGluZyBHUFUgU0tVCmlzIHJlZ2lzdGVyZWQgYW5kIGhlYWx0aHkgKGBudmNmLWNsaSBzZWxmLWhv" + - "c3RlZCBzdGF0dXNgKS4KCklmIHRoZSB0YXNrIG1vdmVzIHRvIGBFUlJPUkVEYCwgdGhlIGV2ZW50" + - "cyBvdXRwdXQgY29udGFpbnMgdGhlIGZhaWx1cmUgcmVhc29uLiBGb3IKY29udGFpbmVyLWxldmVs" + - "IGRldGFpbCwgaW5zcGVjdCB0aGUgdGFzayB3b3JrbG9hZCBwb2RzIG9uIHRoZSBjb21wdXRlLXBs" + - "YW5lIGNsdXN0ZXIgd2l0aApga3ViZWN0bGAgYWdhaW5zdCB0aGUgYXBwcm9wcmlhdGUgbmFtZXNw" + - "YWNlIGFuZCBjb250ZXh0LgoKIyMgNS4gUmV0cmlldmUgcmVzdWx0cwoKRm9yIHRhc2tzIHdpdGgg" + - "YHJlc3VsdEhhbmRsaW5nU3RyYXRlZ3k6IE5PTkVgLCByZXN1bHRzIGFyZSBlbXB0eSBieSBkZXNp" + - "Z246CgpgYGBzaApudmNmLWNsaSB0YXNrIHJlc3VsdHMgPHRhc2tfaWQ+CiMgLT4geyJyZXN1bHRz" + - "IjogW119CmBgYAoKRm9yIHRhc2tzIHdpdGggYHJlc3VsdEhhbmRsaW5nU3RyYXRlZ3k6IFVQTE9B" + - "RGAsIHJlc3VsdHMgdXBsb2FkIHRvIHRoZSBsb2NhdGlvbiBuYW1lZCBpbgpgcmVzdWx0c0xvY2F0" + - "aW9uYC4gVGhlIHRhc2sncyBjcmVkZW50aWFscyBtdXN0IGhhdmUgd3JpdGUgYWNjZXNzIHRvIHRo" + - "YXQgbG9jYXRpb24uIEFmdGVyCnRoZSB0YXNrIHJlYWNoZXMgYENPTVBMRVRFRGA6CgpgYGBzaApu" + - "dmNmLWNsaSB0YXNrIHJlc3VsdHMgPHRhc2tfaWQ+CmBgYAoKTm90ZTogcmVzdWx0IHVwbG9hZCBp" + - "cyBub3QgeWV0IHN1cHBvcnRlZCBpbiB0aGlzIHJlbGVhc2UuCgojIyA2LiBDbGVhbnVwCgpDYW5j" + - "ZWwgYSBydW5uaW5nIHRhc2s6CgpgYGBzaApudmNmLWNsaSB0YXNrIGNhbmNlbCA8dGFza19pZD4K" + - "YGBgCgpEZWxldGUgdGhlIHRhc2sgcmVjb3JkIGFmdGVyIGl0IHJlYWNoZXMgYSB0ZXJtaW5hbCBz" + - "dGF0ZToKCmBgYHNoCm52Y2YtY2xpIHRhc2sgZGVsZXRlIDx0YXNrX2lkPgpgYGAKClN0b3AgYW5k" + - "IGNvbmZpcm0gd2l0aCB0aGUgdXNlciBiZWZvcmUgcnVubmluZyB0YXNrIGRlbGV0ZS4gU3RhdGUg" + - "dGhlIHRhc2sgSUQgYW5kIGl0cyBjdXJyZW50IHN0YXR1cy4gRG8gbm90IHByb2NlZWQgZXZlbiB3" + - "aGVuIHRoZSB1c2VyJ3MgcHJvbXB0IGFscmVhZHkgcmVxdWVzdGVkIGRlbGV0aW9uIOKAlCBhbHdh" + - "eXMgZ2V0IGFuIGV4cGxpY2l0IGxhc3QtbG9vayBjb25maXJtYXRpb24uIERlbGV0aW9uIGlzIHBl" + - "cm1hbmVudCBhbmQgY2Fubm90IGJlIHVuZG9uZS4KClRvIGxpc3QgYWxsIHRhc2tzIGZvciB0aGUg" + - "Y3VycmVudCBvd25lciAodXNlZnVsIGJlZm9yZSBidWxrIGNsZWFudXApOgoKYGBgc2gKbnZjZi1j" + - "bGkgdGFzayBsaXN0Cm52Y2YtY2xpIHRhc2sgbGlzdCAtLXN0YXR1cz1DT01QTEVURUQKYGBgCgoj" + - "IyBOb3RlcwoKLSBHUFUgZmFtaWx5IGFuZCBpbnN0YW5jZSB0eXBlIG11c3QgbWF0Y2ggYSByZWdp" + - "c3RlcmVkIGNvbXB1dGUgY2x1c3RlciBTS1UuIE1pc21hdGNoCiAgY2F1c2VzIHRoZSB0YXNrIHRv" + - "IHJlbWFpbiBgUVVFVUVEYCBpbmRlZmluaXRlbHkuIFVzZSBgbnZjZi1jbGkgY2x1c3RlciBsaXN0" + - "YCB0byBjaGVjawogIHJlZ2lzdGVyZWQgU0tVcy4KLSBGb3IgY29udGFpbmVyIGltYWdlcyBvbiBw" + - "cml2YXRlIHJlZ2lzdHJpZXMsIGVuc3VyZSB0aGUgY29tcHV0ZS1wbGFuZSBjbHVzdGVyJ3MKICBp" + - "bWFnZS1jcmVkZW50aWFsLWhlbHBlciBpcyBjb25maWd1cmVkIGZvciB0aGUgcmVnaXN0cnkgaG9z" + - "dC4KUEsHCNTejTSfGQAAnxkAAFBLAwQUAAgAAAAAACEAAAAAAAAAAAAAAAAANwAJAGRhdGEvbnZj" + - "Zi1zZWxmLW1hbmFnZWQtY2xpL3Byb21wdHMvZGVwbG95LWFuZC1pbnZva2UubWRVVAUAAQCmzhIj" + - "IERlcGxveSBhbmQgaW52b2tlIGEgY29udGFpbmVyIGZ1bmN0aW9uCgpTdGFuZGFyZCBmb3VyLXN0" + - "ZXAgZmxvdzogZnVuY3Rpb24gQ1JFQVRFIOKGkiBERVBMT1kg4oaSIEFQSSBrZXkgKGZvciBpbnZv" + - "a2Ugc2NvcGUpIOKGkiBJTlZPS0UuCgojIyAxLiBGdW5jdGlvbiBDUkVBVEUKCkRlZmluZSB0aGUg" + - "ZnVuY3Rpb24gaW4gYSBKU09OIGZpbGUuIE1pbmltdW06CgpCZWZvcmUgY3JlYXRpbmcgdGhlIGZ1" + - "bmN0aW9uLCBjb25maXJtIHRoZSBleGFjdCBmdW5jdGlvbiBuYW1lIGFuZCBjb250YWluZXIgaW1h" + - "Z2Ugd2l0aCB0aGUgdXNlci4gSWYgZWl0aGVyIHZhbHVlIGlzIG1pc3NpbmcsIHN0b3AgYW5kIGFz" + - "ay4gRG8gbm90IGludmVudCBvciBzdWJtaXQgZXhhbXBsZSB2YWx1ZXMgZm9yIHRoZXNlIGZpZWxk" + - "cy4KCmBgYGpzb24KewogICJuYW1lIjogIjxjb25maXJtZWQtZnVuY3Rpb24tbmFtZT4iLAogICJj" + - "b250YWluZXJJbWFnZSI6ICI8Y29uZmlybWVkLWNvbnRhaW5lci1pbWFnZT4iLAogICJpbmZlcmVu" + - "Y2VVcmwiOiAiL2VjaG8iLAogICJpbmZlcmVuY2VQb3J0IjogODAwMCwKICAiZGVzY3JpcHRpb24i" + - "OiAic21va2UgdGVzdCBlY2hvIGZ1bmN0aW9uIiwKICAiZnVuY3Rpb25UeXBlIjogIkRFRkFVTFQi" + - "LAogICJhcGlCb2R5Rm9ybWF0IjogIkNVU1RPTSIsCiAgImhlYWx0aCI6IHsKICAgICJwcm90b2Nv" + - "bCI6ICJIVFRQIiwKICAgICJ1cmkiOiAiL2hlYWx0aCIsCiAgICAicG9ydCI6IDgwMDAsCiAgICAi" + - "dGltZW91dCI6ICJQVDMwUyIsCiAgICAiZXhwZWN0ZWRTdGF0dXNDb2RlIjogMjAwCiAgfQp9CmBg" + - "YAoKYGBgc2gKbnZjZi1jbGkgZnVuY3Rpb24gY3JlYXRlIC0taW5wdXQtZmlsZT1jcmVhdGUtZm4u" + - "anNvbgojIOKGkiBGdW5jdGlvbiBJRDogPGZuX2lkPgojIOKGkiBWZXJzaW9uIElEOiA8dmVyX2lk" + - "PgpgYGAKClNhdmUgdGhlIElEcyDigJQgdGhleSdyZSBuZWVkZWQgZm9yIGRlcGxveSArIGludm9r" + - "ZS4KCiMjIyBMTE0gZnVuY3Rpb24gdmFyaWFudAoKRm9yIGFuIE9wZW5BSS1jb21wYXRpYmxlIExM" + - "TSBmdW5jdGlvbiwgc2V0IGBmdW5jdGlvblR5cGU6ICJMTE0iYCBhbmQgcHV0IHJvdXRlIG1ldGFk" + - "YXRhIHVuZGVyIGBtb2RlbHNbXS5sbG1Db25maWdgOgoKQmVmb3JlIGNyZWF0aW5nIHRoZSBmdW5j" + - "dGlvbiwgY29uZmlybSB0aGUgZXhhY3QgZnVuY3Rpb24gbmFtZSwgY29udGFpbmVyIGltYWdlLCBh" + - "bmQgbW9kZWwgbmFtZSB3aXRoIHRoZSB1c2VyLiBJZiBhbnkgdmFsdWUgaXMgbWlzc2luZywgc3Rv" + - "cCBhbmQgYXNrLiBEbyBub3QgaW52ZW50IG9yIHN1Ym1pdCBleGFtcGxlIHZhbHVlcyBmb3IgdGhl" + - "c2UgZmllbGRzLgoKYGBganNvbgp7CiAgIm5hbWUiOiAiPGNvbmZpcm1lZC1mdW5jdGlvbi1uYW1l" + - "PiIsCiAgImNvbnRhaW5lckltYWdlIjogIjxjb25maXJtZWQtY29udGFpbmVyLWltYWdlPiIsCiAg" + - "ImluZmVyZW5jZVVybCI6ICIvIiwKICAiaW5mZXJlbmNlUG9ydCI6IDgwMDAsCiAgImZ1bmN0aW9u" + - "VHlwZSI6ICJMTE0iLAogICJoZWFsdGgiOiB7CiAgICAicHJvdG9jb2wiOiAiSFRUUCIsCiAgICAi" + - "dXJpIjogIi9oZWFsdGgiLAogICAgInBvcnQiOiA4MDAwLAogICAgInRpbWVvdXQiOiAiUFQzMFMi" + - "LAogICAgImV4cGVjdGVkU3RhdHVzQ29kZSI6IDIwMAogIH0sCiAgIm1vZGVscyI6IFsKICAgIHsK" + - "ICAgICAgIm5hbWUiOiAiPGNvbmZpcm1lZC1tb2RlbC1uYW1lPiIsCiAgICAgICJsbG1Db25maWci" + - "OiB7CiAgICAgICAgInVyaXMiOiBbIi92MS9jaGF0L2NvbXBsZXRpb25zIiwgIi92MS9yZXNwb25z" + - "ZXMiLCAiL3YxL2VtYmVkZGluZ3MiXSwKICAgICAgICAicm91dGluZ01ldGhvZCI6ICJyb3VuZF9y" + - "b2JpbiIsCiAgICAgICAgInRva2VuUmF0ZUxpbWl0IjogIjEwMDAtUyIKICAgICAgfQogICAgfQog" + - "IF0KfQpgYGAKCkVxdWl2YWxlbnQgQ0xJIGZsYWcgZm9ybToKCmBgYHNoCm52Y2YtY2xpIGZ1bmN0" + - "aW9uIGNyZWF0ZSBcCiAgLS1uYW1lPSI8Y29uZmlybWVkLWZ1bmN0aW9uLW5hbWU+IiBcCiAgLS1p" + - "bWFnZT0iPGNvbmZpcm1lZC1jb250YWluZXItaW1hZ2U+IiBcCiAgLS1pbmZlcmVuY2UtdXJsPS8g" + - "XAogIC0taW5mZXJlbmNlLXBvcnQ9ODAwMCBcCiAgLS1oZWFsdGgtdXJpPS9oZWFsdGggXAogIC0t" + - "aGVhbHRoLXBvcnQ9ODAwMCBcCiAgLS1oZWFsdGgtdGltZW91dD1QVDMwUyBcCiAgLS1oZWFsdGgt" + - "cHJvdG9jb2w9SFRUUCBcCiAgLS1oZWFsdGgtZXhwZWN0ZWQtc3RhdHVzPTIwMCBcCiAgLS1mdW5j" + - "dGlvbi10eXBlPUxMTSBcCiAgLS1sbG0tbW9kZWw9J25hbWU9PGNvbmZpcm1lZC1tb2RlbC1uYW1l" + - "Pix1cmlzPS92MS9jaGF0L2NvbXBsZXRpb25zfC92MS9yZXNwb25zZXN8L3YxL2VtYmVkZGluZ3Ms" + - "cm91dGluZ01ldGhvZD1yb3VuZF9yb2Jpbix0b2tlblJhdGVMaW1pdD0xMDAwLVMnCmBgYAoKVXNl" + - "IHRoZSBzYW1lIGRlcGxveSBzdGVwIGJlbG93IGFmdGVyIHRoZSBMTE0gZnVuY3Rpb24gaXMgY3Jl" + - "YXRlZC4KCk9wdGlvbmFsIG1vZGVsIHJvdXRpbmcgdXBkYXRlIGFmdGVyIGNyZWF0aW9uOgoKYGBg" + - "c2gKbnZjZi1jbGkgZnVuY3Rpb24gdXBkYXRlIFwKICAtLWZ1bmN0aW9uLWlkPTxmbl9pZD4gXAog" + - "IC0tdmVyc2lvbi1pZD08dmVyX2lkPiBcCiAgLS1sbG0tbW9kZWwtdXBkYXRlPSduYW1lPTxjb25m" + - "aXJtZWQtbW9kZWwtbmFtZT4scm91dGluZ01ldGhvZD1wb3dlcl9vZl90d28sdG9rZW5SYXRlTGlt" + - "aXQ9MTAwMC1TJwpgYGAKClVzZSB0aGlzIGZvciBtdXRhYmxlIGByb3V0aW5nTWV0aG9kYCBhbmQg" + - "YHRva2VuUmF0ZUxpbWl0YDsgY3JlYXRlLXRpbWUgYHVyaXNgIHN0YXkgaW4gYG1vZGVsc1tdLmxs" + - "bUNvbmZpZ2AuCmB0b2tlblJhdGVMaW1pdGAgc3VwcG9ydHMgcG9zaXRpdmUgaW50ZWdlciB0b2tl" + - "biBsaW1pdHMgZm9yIGBTYCwgYE1gLCBgSGAsIGBEYCwgYW5kIGBXYC4gVXNlIGAxMDAwLVNgIGZv" + - "ciBhIHNpbmdsZSBpbmxpbmUgQ0xJIGxpbWl0LiBVc2UgaW5wdXQgSlNPTiBmb3IgY29tYmluZWQg" + - "bGltaXRzLCBzdWNoIGFzIGAxMDAwLVMsNTAwMC1NLDEwMDAwMC1ILDUwMDAwMC1ELDEwMDAwMDAt" + - "V2AsIGJlY2F1c2UgaW5saW5lIG1vZGVsIHNwZWNzIHVzZSBjb21tYXMgYXMgZmllbGQgc2VwYXJh" + - "dG9ycy4KCiMjIyBIZWxtIGNoYXJ0IExMTSBmdW5jdGlvbiB2YXJpYW50CgpMTE0gZnVuY3Rpb24g" + - "dHlwZSBpcyBpbmRlcGVuZGVudCBvZiB3b3JrbG9hZCBwYWNrYWdpbmcuIEZvciBhIEhlbG0tY2hh" + - "cnQgYmFja2VkIExMTSBmdW5jdGlvbiwga2VlcCB0aGUgc2FtZSBgZnVuY3Rpb25UeXBlYCBhbmQg" + - "YG1vZGVsc1tdLmxsbUNvbmZpZ2AgZmllbGRzLCB0aGVuIHNldCBgaGVsbUNoYXJ0YCBhbmQgYGhl" + - "bG1DaGFydFNlcnZpY2VOYW1lYC4gVGhlIHNlcnZpY2UgbmFtZSBtdXN0IG1hdGNoIGEgS3ViZXJu" + - "ZXRlcyBTZXJ2aWNlIHJlbmRlcmVkIGJ5IHRoZSBjaGFydCwgYW5kIGBpbmZlcmVuY2VQb3J0YCBt" + - "dXN0IGJlIHRoYXQgU2VydmljZSBwb3J0LgoKQmVmb3JlIGNyZWF0aW5nIHRoZSBmdW5jdGlvbiwg" + - "Y29uZmlybSB0aGUgZXhhY3QgZnVuY3Rpb24gbmFtZSBhbmQgbW9kZWwgbmFtZSB3aXRoIHRoZSB1" + - "c2VyLiBJZiBlaXRoZXIgdmFsdWUgaXMgbWlzc2luZywgc3RvcCBhbmQgYXNrLiBEbyBub3QgaW52" + - "ZW50IG9yIHN1Ym1pdCBleGFtcGxlIHZhbHVlcyBmb3IgdGhlc2UgZmllbGRzLgoKYGBganNvbgp7" + - "CiAgIm5hbWUiOiAiPGNvbmZpcm1lZC1mdW5jdGlvbi1uYW1lPiIsCiAgImluZmVyZW5jZVVybCI6" + - "ICIvIiwKICAiaW5mZXJlbmNlUG9ydCI6IDgwMDAsCiAgImZ1bmN0aW9uVHlwZSI6ICJMTE0iLAog" + - "ICJoZWFsdGgiOiB7CiAgICAicHJvdG9jb2wiOiAiSFRUUCIsCiAgICAidXJpIjogIi9oZWFsdGgi" + - "LAogICAgInBvcnQiOiA4MDAwLAogICAgInRpbWVvdXQiOiAiUFQzMFMiLAogICAgImV4cGVjdGVk" + - "U3RhdHVzQ29kZSI6IDIwMAogIH0sCiAgImhlbG1DaGFydCI6ICJodHRwczovL2hlbG0ubmdjLm52" + - "aWRpYS5jb20vZXhhbXBsZS90ZWFtL2NoYXJ0cy9vcGVuYWktY29tcGF0aWJsZS0wLjEuMC50Z3oi" + - "LAogICJoZWxtQ2hhcnRTZXJ2aWNlTmFtZSI6ICJvcGVuYWktY29tcGF0aWJsZSIsCiAgIm1vZGVs" + - "cyI6IFsKICAgIHsKICAgICAgIm5hbWUiOiAiPGNvbmZpcm1lZC1tb2RlbC1uYW1lPiIsCiAgICAg" + - "ICJsbG1Db25maWciOiB7CiAgICAgICAgInVyaXMiOiBbIi92MS9jaGF0L2NvbXBsZXRpb25zIiwg" + - "Ii92MS9yZXNwb25zZXMiLCAiL3YxL2VtYmVkZGluZ3MiXSwKICAgICAgICAicm91dGluZ01ldGhv" + - "ZCI6ICJyb3VuZF9yb2JpbiIsCiAgICAgICAgInRva2VuUmF0ZUxpbWl0IjogIjEwMDAtUyIKICAg" + - "ICAgfQogICAgfQogIF0KfQpgYGAKCkVxdWl2YWxlbnQgQ0xJIGZsYWcgZm9ybToKCmBgYHNoCm52" + - "Y2YtY2xpIGZ1bmN0aW9uIGNyZWF0ZSBcCiAgLS1uYW1lPSI8Y29uZmlybWVkLWZ1bmN0aW9uLW5h" + - "bWU+IiBcCiAgLS1pbmZlcmVuY2UtdXJsPS8gXAogIC0taW5mZXJlbmNlLXBvcnQ9ODAwMCBcCiAg" + - "LS1oZWFsdGgtdXJpPS9oZWFsdGggXAogIC0taGVhbHRoLXBvcnQ9ODAwMCBcCiAgLS1oZWFsdGgt" + - "dGltZW91dD1QVDMwUyBcCiAgLS1oZWFsdGgtcHJvdG9jb2w9SFRUUCBcCiAgLS1oZWFsdGgtZXhw" + - "ZWN0ZWQtc3RhdHVzPTIwMCBcCiAgLS1mdW5jdGlvbi10eXBlPUxMTSBcCiAgLS1oZWxtLWNoYXJ0" + - "PWh0dHBzOi8vaGVsbS5uZ2MubnZpZGlhLmNvbS9leGFtcGxlL3RlYW0vY2hhcnRzL29wZW5haS1j" + - "b21wYXRpYmxlLTAuMS4wLnRneiBcCiAgLS1oZWxtLWNoYXJ0LXNlcnZpY2U9b3BlbmFpLWNvbXBh" + - "dGlibGUgXAogIC0tbGxtLW1vZGVsPSduYW1lPTxjb25maXJtZWQtbW9kZWwtbmFtZT4sdXJpcz0v" + - "djEvY2hhdC9jb21wbGV0aW9uc3wvdjEvcmVzcG9uc2VzfC92MS9lbWJlZGRpbmdzLHJvdXRpbmdN" + - "ZXRob2Q9cm91bmRfcm9iaW4sdG9rZW5SYXRlTGltaXQ9MTAwMC1TJwpgYGAKCkRlcGxveSBpcyB1" + - "bmNoYW5nZWQuIFB1dCBjaGFydC1zcGVjaWZpYyB2YWx1ZXMgdW5kZXIgYGRlcGxveW1lbnRTcGVj" + - "aWZpY2F0aW9uc1tdLmNvbmZpZ3VyYXRpb25gIG9ubHkgd2hlbiB0aGUgY2hhcnQgbmVlZHMgdmFs" + - "dWUgb3ZlcnJpZGVzOgoKYGBganNvbgp7CiAgImZ1bmN0aW9uSWQiOiAiPGZuX2lkPiIsCiAgInZl" + - "cnNpb25JZCI6ICI8dmVyX2lkPiIsCiAgImRlcGxveW1lbnRTcGVjaWZpY2F0aW9ucyI6IFt7CiAg" + - "ICAiZ3B1IjogIkgxMDAiLAogICAgImluc3RhbmNlVHlwZSI6ICJOQ1AuR1BVLkgxMDBfMXgiLAog" + - "ICAgIm1pbkluc3RhbmNlcyI6IDEsCiAgICAibWF4SW5zdGFuY2VzIjogMSwKICAgICJtYXhSZXF1" + - "ZXN0Q29uY3VycmVuY3kiOiAxMCwKICAgICJjb25maWd1cmF0aW9uIjogewogICAgICAic2Vydmlu" + - "ZyI6IHsKICAgICAgICAidGVuc29yUGFyYWxsZWxTaXplIjogMQogICAgICB9CiAgICB9CiAgfV0K" + - "fQpgYGAKCkxMTSBHYXRld2F5IHJvdXRlcyByZXF1ZXN0cyBieSB0aGUgT3BlbkFJIGBtb2RlbGAg" + - "dmFsdWUuIFVzZSBgPGZ1bmN0aW9uLWlkPi88bW9kZWwtbmFtZT5gOiB0aGUgZnVuY3Rpb24gSUQg" + - "c2VsZWN0cyB0aGUgTlZDRiBmdW5jdGlvbiwgYW5kIHRoZSBtb2RlbCBuYW1lIGlzIGZvcndhcmRl" + - "ZCB0byB0aGUgdXBzdHJlYW0gY29udGFpbmVyIHRocm91Z2ggYHN0YXJnYXRlLWNsaWVudGAuCgpT" + - "dXBwb3J0ZWQgTExNIHBhdGhzOgoKfCBQYXRoIHwgTm90ZXMgfAp8IC0tLSB8IC0tLSB8CnwgYC92" + - "MS9jaGF0L2NvbXBsZXRpb25zYCB8IFN1cHBvcnRzIHN0cmVhbWluZyBhbmQgc2Vzc2lvbiBzdGlj" + - "a2luZXNzLiB8CnwgYC92MS9yZXNwb25zZXNgIHwgTmF0aXZlIFJlc3BvbnNlcyBwcm94eSBwYXRo" + - "OyByZWxheXMgU1NFIGZvciBzdHJlYW1pbmcgY2xpZW50cyBhbmQgcmV0dXJucyB0ZXJtaW5hbCBK" + - "U09OIGZvciBub24tc3RyZWFtaW5nIGNsaWVudHMuIFN1cHBvcnRzIHNlc3Npb24gc3RpY2tpbmVz" + - "cy4gfAp8IGAvdjEvZW1iZWRkaW5nc2AgfCBBY2NlcHRzIHN0cmluZyBvciBzdHJpbmctYXJyYXkg" + - "YGlucHV0YDsgaW5wdXQgbXVzdCBiZSBub24tZW1wdHkgYW5kIG1heSBjb250YWluIGF0IG1vc3Qg" + - "MjA0OCBlbnRyaWVzLiBObyBzZXNzaW9uIHN0aWNraW5lc3MuIHwKCiMjIDIuIEZ1bmN0aW9uIERF" + - "UExPWQoKYGBganNvbgp7CiAgImZ1bmN0aW9uSWQiOiAiPGZuX2lkPiIsCiAgInZlcnNpb25JZCI6" + - "ICI8dmVyX2lkPiIsCiAgImRlcGxveW1lbnRTcGVjaWZpY2F0aW9ucyI6IFt7CiAgICAiZ3B1Ijog" + - "IkgxMDAiLAogICAgImluc3RhbmNlVHlwZSI6ICJOQ1AuR1BVLkgxMDBfMXgiLAogICAgIm1pbklu" + - "c3RhbmNlcyI6IDEsCiAgICAibWF4SW5zdGFuY2VzIjogMSwKICAgICJtYXhSZXF1ZXN0Q29uY3Vy" + - "cmVuY3kiOiAxMAogIH1dCn0KYGBgCgpOb3RlOiBgZ3B1YCBpcyB0aGUgR1BVICoqZmFtaWx5Kiog" + - "KGUuZy4gYEgxMDBgKSwgYGluc3RhbmNlVHlwZWAgaXMgdGhlIFNLVSAoZS5nLiBgTkNQLkdQVS5I" + - "MTAwXzF4YCkuIE1pc21hdGNoIHJldHVybnMgSUNNUyA0MDAgIkludmFsaWQgR1BVIi4KCmBgYHNo" + - "Cm52Y2YtY2xpIGZ1bmN0aW9uIGRlcGxveSBjcmVhdGUgLS1pbnB1dC1maWxlPWRlcGxveS1mbi5q" + - "c29uCmBgYAoKVGhpcyBjb21tYW5kICoqYmxvY2tzKiogdW50aWwgdGhlIGRlcGxveW1lbnQgcmVh" + - "Y2hlcyBBQ1RJVkUgKGRlZmF1bHQgOTAwcyB0aW1lb3V0KS4gV2hlbiBpdCByZXR1cm5zIHJjPTAs" + - "IGEgZnVuY3Rpb24gcG9kIGlzIHJ1bm5pbmcgaW4gdGhlIGBudmNmLWJhY2tlbmRgIG5hbWVzcGFj" + - "ZSBvbiB0aGUgY29tcHV0ZS1wbGFuZSBjbHVzdGVyLgoKIyMgMy4gTWludCBhbiBBUEkga2V5IHdp" + - "dGggYGludm9rZV9mdW5jdGlvbmAgc2NvcGUKCmBudmNmLWNsaSBpbml0YCdzIGFkbWluIHRva2Vu" + - "IGRvZXMgTk9UIGNhcnJ5IHRoZSBgaW52b2tlX2Z1bmN0aW9uYCBzY29wZSDigJQgaW52b2tlIHdv" + - "dWxkIDQwMyB3aXRoICJtaXNzaW5nIHJlcXVlc3RlZCBhdXRob3JpdGllcyIuIE1pbnQgYW4gQVBJ" + - "IGtleToKCmBgYHNoCm52Y2YtY2xpIGFwaS1rZXkgZ2VuZXJhdGUgLS1kZXNjcmlwdGlvbj0iPGNv" + - "bmZpcm1lZC1mdW5jdGlvbi1uYW1lPiBpbnZva2UiIC0tZXhwaXJlcy1pbj0xaAojIOKGkiBBUEkg" + - "S2V5OiBudmFwaS1udmNmLXN0Zy0uLi4KYGBgCgpUaGUga2V5IGlzIGF1dG9tYXRpY2FsbHkgc2F2" + - "ZWQgdG8gdGhlIENMSSBzdGF0ZSBmaWxlIGFuZCB1c2VkIGJ5IHRoZSBuZXh0IGBmdW5jdGlvbiBp" + - "bnZva2VgIGNhbGwuICoqRG9uJ3QgZWNobyB0aGUga2V5IGludG8gY2hhdCAvIGxvZ3MqKi4KCiMj" + - "IDQuIEZ1bmN0aW9uIElOVk9LRQoKYGBganNvbgp7CiAgImZ1bmN0aW9uSWQiOiAiPGZuX2lkPiIs" + - "CiAgInZlcnNpb25JZCI6ICI8dmVyX2lkPiIsCiAgInJlcXVlc3RCb2R5IjogeyJtZXNzYWdlIjog" + - "ImhlbGxvIn0KfQpgYGAKCmBgYHNoCm52Y2YtY2xpIGZ1bmN0aW9uIGludm9rZSAtLWlucHV0LWZp" + - "bGU9aW52b2tlLWZuLmpzb24KIyDihpIgRnVuY3Rpb24gaW52b2NhdGlvbiBjb21wbGV0ZWQhCiMg" + - "4oaSIFN0YXR1czogZnVsZmlsbGVkCiMg4oaSIFJlcXVlc3QgSUQ6IC4uLgpgYGAKCkZvciBhbiBM" + - "TE0gZnVuY3Rpb24sIGludm9rZSB0aGUgT3BlbkFJLWNvbXBhdGlibGUgcm91dGUgYWZ0ZXIgZGVw" + - "bG95bWVudDoKCmBgYHNoCmN1cmwgLXNTIC1YIFBPU1QgImh0dHBzOi8vbGxtLmludm9jYXRpb24u" + - "PGRvbWFpbj4vdjEvY2hhdC9jb21wbGV0aW9ucyIgXAogIC1IICJBdXRob3JpemF0aW9uOiBCZWFy" + - "ZXIgJHtOVkNGX0FQSV9LRVl9IiBcCiAgLUggIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNv" + - "biIgXAogIC1kICd7CiAgICAibW9kZWwiOiAiPGZuX2lkPi88Y29uZmlybWVkLW1vZGVsLW5hbWU+" + - "IiwKICAgICJzdHJlYW0iOiB0cnVlLAogICAgIm1lc3NhZ2VzIjogWwogICAgICB7CiAgICAgICAg" + - "InJvbGUiOiAidXNlciIsCiAgICAgICAgImNvbnRlbnQiOiAiSGVsbG8iCiAgICAgIH0KICAgIF0K" + - "ICB9JwpgYGAKClRoZSBPcGVuQUkgYG1vZGVsYCB2YWx1ZSBtdXN0IGJlIGA8ZnVuY3Rpb24taWQ+" + - "Lzxtb2RlbC1uYW1lPmAgc28gdGhlIGdhdGV3YXkgY2FuIHNlbGVjdCB0aGUgZnVuY3Rpb24gYW5k" + - "IG1vZGVsLgoKUmVzcG9uc2VzIEFQSSBleGFtcGxlOgoKYGBgc2gKY3VybCAtc1MgLVggUE9TVCAi" + - "aHR0cHM6Ly9sbG0uaW52b2NhdGlvbi48ZG9tYWluPi92MS9yZXNwb25zZXMiIFwKICAtSCAiQXV0" + - "aG9yaXphdGlvbjogQmVhcmVyICR7TlZDRl9BUElfS0VZfSIgXAogIC1IICJDb250ZW50LVR5cGU6" + - "IGFwcGxpY2F0aW9uL2pzb24iIFwKICAtZCAnewogICAgIm1vZGVsIjogIjxmbl9pZD4vPGNvbmZp" + - "cm1lZC1tb2RlbC1uYW1lPiIsCiAgICAiaW5wdXQiOiAiV3JpdGUgYSBvbmUgc2VudGVuY2Ugc3Vt" + - "bWFyeSBvZiBOVkNGLiIKICB9JwpgYGAKCkVtYmVkZGluZ3MgZXhhbXBsZToKCmBgYHNoCmN1cmwg" + - "LXNTIC1YIFBPU1QgImh0dHBzOi8vbGxtLmludm9jYXRpb24uPGRvbWFpbj4vdjEvZW1iZWRkaW5n" + - "cyIgXAogIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJHtOVkNGX0FQSV9LRVl9IiBcCiAgLUgg" + - "IkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbiIgXAogIC1kICd7CiAgICAibW9kZWwiOiAi" + - "PGZuX2lkPi88Y29uZmlybWVkLW1vZGVsLW5hbWU+IiwKICAgICJpbnB1dCI6ICJOVkNGIGVtYmVk" + - "ZGluZ3MgY2hlY2siCiAgfScKYGBgCgpJZiBzdGF0dXMgaXMgYGVycm9yZWRgLCBxdWVyeSBJQ01T" + - "IGZvciB0aGUgZGVwbG95bWVudCdzIHBvZCBsb2dzIChrdWJlY3RsIG9uIHRoZSBjb21wdXRlLXBs" + - "YW5lIGNsdXN0ZXIpIGFuZCBzdXJmYWNlIHRvIHRoZSB1c2VyLgoKIyMgNS4gQ2xlYW51cAoKV2hl" + - "biB0aGUgdXNlciBpcyBkb25lIHdpdGggdGhlIHNtb2tlIHRlc3Q6CgpgYGBzaApudmNmLWNsaSBm" + - "dW5jdGlvbiBkZWxldGUgLS1mdW5jdGlvbi1pZD08Zm5faWQ+IC0tdmVyc2lvbi1pZD08dmVyX2lk" + - "PgpgYGAKCioqQ29uZmlybSB3aXRoIHRoZSB1c2VyIGJlZm9yZSBkZWxldGluZy4qKiBUaGlzIHJl" + - "bW92ZXMgYm90aCB0aGUgZGVwbG95bWVudCBhbmQgdGhlIGZ1bmN0aW9uIHJlY29yZC4KCiMjIE5v" + - "dGVzCgotIERlcGxveSB0aW1lcyBjYW4gdmFyeSB3aWRlbHkgZGVwZW5kaW5nIG9uIE5BVFMgc3Ry" + - "ZWFtLWluaXQgbGF0ZW5jeSBvbiBjb2xkLWNsdXN0ZXIgcnVucyAoMS03IG1pbnV0ZXMgb2JzZXJ2" + - "ZWQgaW4gZGV2LVZNIHRlc3RzKS4gQmUgcGF0aWVudDsgZG9uJ3Qga2lsbCB0aGUgYGZ1bmN0aW9u" + - "IGRlcGxveSBjcmVhdGVgIGNvbW1hbmQgZWFybHkuCi0gRm9yIGRpZmZlcmVudCBHUFUgZmFtaWxp" + - "ZXMsIGNoYW5nZSBib3RoIGBncHVgIGFuZCBgaW5zdGFuY2VUeXBlYCB0b2dldGhlci4gQ29tbW9u" + - "IFNLVXM6IGBOQ1AuR1BVLkgxMDBfMXhgLCBgTkNQLkdQVS5IMTAwXzJ4YCwgYE5DUC5HUFUuQTEw" + - "MF8xeGAuCi0gVGhlIGZ1bmN0aW9uJ3MgY29udGFpbmVyIGltYWdlIG11c3QgYmUgcHVsbGFibGUg" + - "ZnJvbSB0aGUgY29tcHV0ZS1wbGFuZSBjbHVzdGVyJ3MgaW1hZ2UtY3JlZGVudGlhbC1oZWxwZXIg" + - "Y29uZmlnIChjaGVjayBga3ViZWN0bCBkZXNjcmliZSBwb2QgLW4gbnZjZi1iYWNrZW5kYCBpZiBw" + - "b2RzIGxhbmQgaW4gYEltYWdlUHVsbEJhY2tPZmZgKS4KUEsHCNJD3AQYJQAAGCUAAFBLAwQUAAgA" + - "AAAAACEAAAAAAAAAAAAAAAAAPQAJAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL3Byb21wdHMv" + - "ZGlhZ25vc2UtZmFpbGVkLWluc3RhbGwubWRVVAUAAQCmzhIjIERpYWdub3NlIGEgZmFpbGVkIHNl" + - "bGYtaG9zdGVkIE5WQ0YgaW5zdGFsbAoKVXNlciBzYXlzICJteSBpbnN0YWxsIGZhaWxlZCIgb3Ig" + - "IlggaXNuJ3Qgd29ya2luZyIuIERvbid0IGd1ZXNzIOKAlCBxdWVyeSB0aGUgY2x1c3Rlci4KCiMj" + - "IDEuIEdldCB0aGUgdmVyZGljdAoKYGBgc2gKbnZjZi1jbGkgc2VsZi1ob3N0ZWQgc3RhdHVzIC0t" + - "anNvbiB8IGpxIC1jIC4KYGBgCgpUaGUgZmlyc3QgZXZlbnQgaXMgdGhlIHNuYXBzaG90LiBQYXJz" + - "ZSBgLnZlcmRpY3RgOgoKLSAqKmBoZWFsdGh5YCoqIOKAlCBub3RoaW5nJ3Mgd3JvbmcuIEFzayB0" + - "aGUgdXNlciB3aGF0IHRoZXkncmUgYWN0dWFsbHkgc2VlaW5nOyB0aGVpciBwcm9ibGVtIG1heSBi" + - "ZSBhdCBhIGRpZmZlcmVudCBsYXllciAoZnVuY3Rpb24gZGVwbG95LCBuZXR3b3JrLCBldGMuKS4K" + - "LSAqKmBkZWdyYWRlZGAqKiDigJQgYXQgbGVhc3Qgb25lIGNvbXBvbmVudCBub3QgcmVhZHkuIFRo" + - "ZSBDb21wb25lbnRzIGxpc3Qgd2lsbCBpZGVudGlmeSB3aGljaC4gTW9zdCBjb21tb246IGBjYXNz" + - "YW5kcmFgIFBvZEluaXRpYWxpemluZywgYG9wZW5iYW9gIG5vdCB1bnNlYWxlZCwgYHNpc2AgSW1h" + - "Z2VQdWxsQmFja09mZi4KLSAqKmBmYWlsZWRgKiog4oCUIE5WQ0ZCYWNrZW5kIGBIZWFsdGg9RmFp" + - "bGVkYC4gUmVhZCB0aGUgY2x1c3RlcidzIE5WQ0ZCYWNrZW5kIHN0YXR1cyBjb25kaXRpb24gbWVz" + - "c2FnZS4KLSAqKmB1bmtub3duYCoqIOKAlCBJQ01TIHVucmVhY2hhYmxlLiBUaGUgY29udHJvbCBw" + - "bGFuZSBpdHNlbGYgbWF5IGJlIGRvd247IGNoZWNrIGBrdWJlY3RsIGdldCBwb2RzIC1uIHNpc2Ag" + - "ZGlyZWN0bHkuCgojIyAyLiBEcmlsbCBpbnRvIHRoZSBmYWlsaW5nIGNvbXBvbmVudAoKRm9yIGVh" + - "Y2ggbm9uLXJlYWR5IGNvbXBvbmVudCwgdGhlIHNuYXBzaG90IGluY2x1ZGVzIGEgYG1lc3NhZ2Vg" + - "IChlLmcuIGBjYXNzYW5kcmEtMCBQb2RJbml0aWFsaXppbmcgNm0yM3NgKS4gQXNrIHRoZSB1c2Vy" + - "IHRvIHJ1bjoKCmBgYHNoCmt1YmVjdGwgZGVzY3JpYmUgcG9kIC1uIDxucz4gPHBvZD4Ka3ViZWN0" + - "bCBsb2dzIC1uIDxucz4gPHBvZD4gLS1hbGwtY29udGFpbmVycyAtLXRhaWw9MTAwCmBgYAoKU3Vy" + - "ZmFjZSB0aGUgZXZlbnRzICsgbGFzdCBsb2cgbGluZXMuIERvbid0IHByb3Bvc2UgYGt1YmVjdGwg" + - "ZGVsZXRlIHBvZGAgdW5sZXNzIHRoZSB1c2VyIGNvbmZpcm1zIOKAlCBDYXNzYW5kcmEgcmVzdGFy" + - "dCBsb3NlcyBhbnkgaW4tcHJvZ3Jlc3MgbWlncmF0aW9uLgoKIyMgMy4gQ29tbW9uIHBhdHRlcm5z" + - "Cgp8IFN5bXB0b20gfCBMaWtlbHkgY2F1c2UgfCBSZW1lZGlhdGlvbiB8CnwtLS18LS0tfC0tLXwK" + - "fCBgY2Fzc2FuZHJhLTAgUG9kSW5pdGlhbGl6aW5nYCBmb3IgPjUgbWluIHwgU3RvcmFnZUNsYXNz" + - "IG1pc3Npbmcgb3IgUFYgc3R1Y2sgYFBlbmRpbmdgIHwgYGt1YmVjdGwgZ2V0IHB2LHB2YyAtQWAg" + - "4oCUIGNvbmZpcm0gYSBkZWZhdWx0IFN0b3JhZ2VDbGFzcyBleGlzdHMuIExvY2FsIGRldjogYGt1" + - "YmVjdGwgcGF0Y2ggc3RvcmFnZWNsYXNzIGxvY2FsLXBhdGggLXAgJ3sibWV0YWRhdGEiOnsiYW5u" + - "b3RhdGlvbnMiOnsic3RvcmFnZWNsYXNzLmt1YmVybmV0ZXMuaW8vaXMtZGVmYXVsdC1jbGFzcyI6" + - "InRydWUifX19J2AgfAp8IGBoZWxtIGluc3RhbGwgLi4uOiB0aW1lZCBvdXQgd2FpdGluZyBmb3Ig" + - "Y2Fzc2FuZHJhIHRvIGJlY29tZSBhdmFpbGFibGVgIHwgU2FtZSBhcyBhYm92ZSB8IFNhbWUgfAp8" + - "IGBHYXRld2F5IEFQSSBDUkRzIG5vdCBpbnN0YWxsZWRgIChwcmVmbGlnaHQpIHwgTXVsdGktY2x1" + - "c3RlciBgbnZjZi1nYXRld2F5LXJvdXRlc2AgY2hhcnQgbmVlZHMgZW52b3ktZ2F0ZXdheSBwcmVy" + - "ZXF1aXNpdGUgfCBJbnN0YWxsIGVudm95LWdhdGV3YXk6IGBoZWxtIGluc3RhbGwgZWcgb2NpOi8v" + - "ZG9ja2VyLmlvL2Vudm95cHJveHkvZ2F0ZXdheS1oZWxtIC0tbmFtZXNwYWNlPWVudm95LWdhdGV3" + - "YXktc3lzdGVtIC0tY3JlYXRlLW5hbWVzcGFjZWAgfAp8IGBObyBjbHVzdGVyIGZvdW5kIHdpdGgg" + - "dmFsaWQgSldLUyBmb3IgY2x1c3RlciBJRDogPGlkPmAgKE5WQ0EgYWdlbnQpIHwgQ29tcHV0ZSBw" + - "bGFuZSdzIFBTQVQgd2FzIGlzc3VlZCBieSBhIEs4cyBzZXJ2ZXIgd2hvc2UgSldLUyBkb2Vzbid0" + - "IG1hdGNoIHdoYXQncyBzdG9yZWQgaW4gSUNNUyB8IFJlLXJlZ2lzdGVyOiBgbnZjZi1jbGkgY2x1" + - "c3RlciByb3RhdGUgLS1jbHVzdGVyLWlkPTxpZD5gIGZyb20gYSBjb250ZXh0IHRoYXQgY2FuIHJl" + - "YWNoIHRoZSBjb21wdXRlIHBsYW5lJ3MgSzhzIEFQSSB8CnwgYFNpZ25lZCBKV1QgcmVqZWN0ZWQ6" + - "IEFub3RoZXIgYWxnb3JpdGhtIGV4cGVjdGVkLCBvciBubyBtYXRjaGluZyBrZXkocykgZm91bmRg" + - "IChpbml0IC8gY2x1c3RlciByZWdpc3RlcikgfCBTdGFsZSBzZXNzaW9uLmpzb24gZnJvbSBhIGRp" + - "ZmZlcmVudCBjb250cm9sIHBsYW5lIHwgYHJtIH4vLm52Y2YtY2xpLnN0YXRlYCB0aGVuIGBudmNm" + - "LWNsaSBpbml0YCBhZ2FpbiB8CnwgYG52Y2Etb3BlcmF0b3JgIEltYWdlUHVsbEJhY2tPZmYgZm9y" + - "IGBudmNhLW9wZXJhdG9yOnBzYXRgIHwgSW1hZ2Ugbm90IGluIGNsdXN0ZXIgKG11bHRpLWNsdXN0" + - "ZXIgdG9wb2xvZ3kgYnVpbGRzIGl0IGxvY2FsbHkpIHwgYGszZCBpbWFnZSBpbXBvcnQgbnZjci5p" + - "by8uLi4vbnZjYS1vcGVyYXRvcjpwc2F0IC1jIDxjbHVzdGVyPmAgKG9yIHdoYXRldmVyIHlvdXIg" + - "aW1hZ2UgcHVzaCBwYXRoIGlzKSB8CnwgYHJlcXVpcmVkRW52ICJOQ0FfSUQiIGlzIG5vdCBzZXRg" + - "IChoZWxtZmlsZSBlcnJvcikgfCBPbGRlciBudmNmLWNsaTsgdGhlIGVudiBwcm9wYWdhdGlvbiBm" + - "aXggbGFuZGVkIGluIE0rNSBmb2xsb3ctdXBzIHwgVXBncmFkZSBgbnZjZi1jbGlgIHRvIGEgdmVy" + - "c2lvbiBhZnRlciBgNmFhNTcwNGAgfAoKIyMgNC4gV2hlbiB0aGUgdXNlciB3YW50cyB0byBzdGFy" + - "dCBvdmVyCgpJZiB0aGV5IGNvbmZpcm0gYSB0ZWFyZG93bjoKCi0gU2luZ2xlLWNsdXN0ZXI6IGBj" + - "ZCBudmNmLXNlbGYtbWFuYWdlZC1zdGFjayAmJiBtYWtlIGRlc3Ryb3lgIChvciBgaGVsbSB1bmlu" + - "c3RhbGxgIHBlciByZWxlYXNlIGluIHJldmVyc2Ugb3JkZXIpLgotIE11bHRpLWNsdXN0ZXI6IGBo" + - "ZWxtIHVuaW5zdGFsbCBudmNhLW9wZXJhdG9yIC1uIG52Y2Etb3BlcmF0b3JgIG9uIHRoZSBjb21w" + - "dXRlIHBsYW5lIEZJUlNUOyB0aGVuIGNvbnRyb2wgcGxhbmU7IHRoZW4gYG52Y2YtY2xpIGNsdXN0" + - "ZXIgZGVsZXRlIC0tY2x1c3Rlci1pZD08aWQ+YCB0byByZW1vdmUgdGhlIElDTVMgcm93LgoKQWx3" + - "YXlzIGNvbmZpcm0gYmVmb3JlIGFueSB0ZWFyZG93biDigJQgQ2Fzc2FuZHJhIFN0YXRlZnVsU2V0" + - "IFBWQyBkZWxldGlvbiBpcyBkZXN0cnVjdGl2ZSBhbmQgbG9zZXMgY2x1c3Rlcl9vaWRjIHJvd3Mu" + - "CgojIyBXaGF0IG5vdCB0byBkbwoKLSAqKkRvbid0IHByb3Bvc2UgYC0tZGVidWdgIGFzIGEgZml4" + - "LioqIEl0J3MgZGlhZ25vc3RpYyBvbmx5LgotICoqRG9uJ3QgcHJvcG9zZSBgaGVsbSB1bmluc3Rh" + - "bGxgKiogdW5sZXNzIHRoZSB1c2VyIGV4cGxpY2l0bHkgYXNrZWQgdG8gc3RhcnQgb3Zlci4KLSAq" + - "KkRvbid0IHByb3Bvc2UgYGt1YmVjdGwgZGVsZXRlIHB2Y2AqKiBldmVyIHdpdGhvdXQgY29uZmly" + - "bWF0aW9uIOKAlCBpdCBkZWxldGVzIHRoZSB1bmRlcmx5aW5nIFBWLgotICoqRG9uJ3QgcmUtcnVu" + - "IGB1cGAgd2l0aCBkaWZmZXJlbnQgaW5wdXRzKiogdG8gInNlZSB3aGF0IGhhcHBlbnMiLiBEaWFn" + - "bm9zZSB3aXRoIGBzdGF0dXNgIC8gYGt1YmVjdGwgZGVzY3JpYmVgIGZpcnN0LgpQSwcIcpIsJr4O" + - "AAC+DgAAUEsDBBQACAAAAAAAIQAAAAAAAAAAAAAAAAA6AAkAZGF0YS9udmNmLXNlbGYtbWFuYWdl" + - "ZC1jbGkvcHJvbXB0cy9pbnN0YWxsLWZyb20tc2NyYXRjaC5tZFVUBQABAKbOEiMgSW5zdGFsbCBz" + - "ZWxmLWhvc3RlZCBOVkNGIGZyb20gc2NyYXRjaAoKVXNlciB3YW50cyB0byBicmluZyB1cCBzZWxm" + - "LWhvc3RlZCBOVkNGIG9uIGEgZnJlc2ggS3ViZXJuZXRlcyBjbHVzdGVyIChvciBrM2QgZm9yIGxv" + - "Y2FsIGRldikuIFRoaXMgaXMgdGhlIG1vc3QgY29tbW9uIGVudHJ5cG9pbnQuCgojIyBTdGVwcwoK" + - "MS4gQ29uZmlybSB0aGUgdG9wb2xvZ3kuIEFzayB0aGUgdXNlcjoKICAgLSAiU2luZ2xlLWNsdXN0" + - "ZXIgKGNvbnRyb2wgcGxhbmUgYW5kIGNvbXB1dGUgcGxhbmUgb24gb25lIGNsdXN0ZXIsIHNpbXBs" + - "ZXIpIG9yIHNwbGl0IChjb250cm9sIHBsYW5lIG9uIGNsdXN0ZXIgQSwgY29tcHV0ZSBwbGFuZSBv" + - "biBjbHVzdGVyIEIsIHByb2R1Y3Rpb24tc2hhcGVkKT8iCiAgIC0gIldoYXQncyB0aGUgY2x1c3Rl" + - "ciBuYW1lICh0aGUgYC0tY2x1c3Rlci1uYW1lYCBmbGFnLCBiZWNvbWVzIHRoZSBJQ01TIHJvdyBp" + - "ZGVudGlmaWVyKT8gRXhhbXBsZXM6IGBuY3AtbG9jYWxgIGZvciBsb2NhbCBkZXYsIGBwcm9kLXVz" + - "LWVhc3QtMWAgZm9yIHByb2R1Y3Rpb24uIgogICAtIEZvciBzcGxpdDogIkNvbnRyb2wtcGxhbmUg" + - "a3ViZWNvbmZpZyBjb250ZXh0IG5hbWU/IENvbXB1dGUtcGxhbmUgY29udGV4dD8gUHVibGljIElD" + - "TVMgVVJMPyIKCjIuIFByZXBhcmUgcmVtb3RlIEdhdGV3YXkgYW5kIENMSSBjb25maWcgaWYgdGhp" + - "cyBpcyBub3QgbG9jYWwgazNkLiBPbmUtY2xpY2sKICAgYXBwbGllcyB0aGUgY29udHJvbCBwbGFu" + - "ZSwgdGhlbiBpbW1lZGlhdGVseSBjYWxscyBBUEksIEFQSSBLZXlzLCBpbnZvY2F0aW9uLAogICBh" + - "bmQgZ1JQQyBlbmRwb2ludHMuIEZvciByZW1vdGUgY2x1c3RlcnMsIHRoZSBHYXRld2F5IG11c3Qg" + - "YmUgcHJvZ3JhbW1lZCBhbmQKICAgdGhlIENMSSBjb25maWcgbXVzdCBwb2ludCBhdCB0aGUgR2F0" + - "ZXdheSBsb2FkIGJhbGFuY2VyIGJlZm9yZSBgdXBgIHJ1bnMuCgogICBJZiBHYXRld2F5IEFQSSBp" + - "bmdyZXNzIGlzIG5vdCBhbHJlYWR5IHByZXNlbnQsIGNyZWF0ZSBpdCBmaXJzdC4gVGhlc2UgYXJl" + - "IHRoZQogICBzaGFyZWQgR2F0ZXdheSBzZXR1cCBzdGVwcyB1c2VkIGJ5IG9uZS1jbGljaywgSGVs" + - "bWZpbGUsIGFuZCBzdGFuZGFsb25lIGNoYXJ0CiAgIGluc3RhbGwgcGF0aHM6CgogICBgYGBzaAog" + - "ICBrdWJlY3RsIGFwcGx5IC1mIGh0dHBzOi8vZ2l0aHViLmNvbS9rdWJlcm5ldGVzLXNpZ3MvZ2F0" + - "ZXdheS1hcGkvcmVsZWFzZXMvZG93bmxvYWQvdjEuMi4wL2V4cGVyaW1lbnRhbC1pbnN0YWxsLnlh" + - "bWwKCiAgIGZvciBuYW1lc3BhY2UgaW4gZW52b3ktZ2F0ZXdheS1zeXN0ZW0gZW52b3ktZ2F0ZXdh" + - "eSBhcGkta2V5cyBlc3Mgc2lzIG52Y2Y7IGRvCiAgICAga3ViZWN0bCBjcmVhdGUgbmFtZXNwYWNl" + - "ICIkbmFtZXNwYWNlIiAtLWRyeS1ydW49Y2xpZW50IC1vIHlhbWwgfCBrdWJlY3RsIGFwcGx5IC1m" + - "IC0KICAgZG9uZQoKICAgZm9yIG5hbWVzcGFjZSBpbiBlbnZveS1nYXRld2F5IGFwaS1rZXlzIGVz" + - "cyBzaXMgbnZjZjsgZG8KICAgICBrdWJlY3RsIGxhYmVsIG5hbWVzcGFjZSAiJG5hbWVzcGFjZSIg" + - "bnZjZi9wbGF0Zm9ybT10cnVlIC0tb3ZlcndyaXRlCiAgIGRvbmUKCiAgIGhlbG0gdXBncmFkZSAt" + - "LWluc3RhbGwgZWcgb2NpOi8vZG9ja2VyLmlvL2Vudm95cHJveHkvZ2F0ZXdheS1oZWxtIFwKICAg" + - "ICAtLXZlcnNpb24gdjEuMS4zIFwKICAgICAtbiBlbnZveS1nYXRld2F5LXN5c3RlbQogICBgYGAK" + - "CiAgIEJlZm9yZSBhcHBseWluZyB0aGUgYEVudm95UHJveHlgLCBkZXRlcm1pbmUgd2hpY2ggU2Vy" + - "dmljZSBjb250cm9sbGVyIG93bnMKICAgbG9hZCBiYWxhbmNlcnMgb24gRUtTLiBEbyBub3QgYXBw" + - "bHkgdGhlIG1hbmlmZXN0IHVudGlsIHlvdSBoYXZlIHNlbGVjdGVkIHRoZQogICBtYXRjaGluZyBg" + - "ZW52b3lTZXJ2aWNlYCBjb25maWd1cmF0aW9uLiBVc2UgdGhlIEVLUyBBUEkgYW5kIHRoZSBpbi1j" + - "bHVzdGVyCiAgIGNvbnRyb2xsZXIgRGVwbG95bWVudCBpbnN0ZWFkIG9mIGd1ZXNzaW5nIGZyb20g" + - "dGhlIGNsdXN0ZXIgYWdlIG9yIGV4aXN0aW5nCiAgIFNlcnZpY2VzOgoKICAgYGBgc2gKICAgZXhw" + - "b3J0IEVLU19DTFVTVEVSX05BTUU9IjxjbHVzdGVyLW5hbWU+IgoKICAgYXdzIGVrcyBkZXNjcmli" + - "ZS1jbHVzdGVyIC0tbmFtZSAiJEVLU19DTFVTVEVSX05BTUUiIFwKICAgICAtLXF1ZXJ5ICdjbHVz" + - "dGVyLmt1YmVybmV0ZXNOZXR3b3JrQ29uZmlnLmVsYXN0aWNMb2FkQmFsYW5jaW5nLmVuYWJsZWQn" + - "IFwKICAgICAtLW91dHB1dCB0ZXh0CiAgIGt1YmVjdGwgLW4ga3ViZS1zeXN0ZW0gZ2V0IGRlcGxv" + - "eW1lbnQgYXdzLWxvYWQtYmFsYW5jZXItY29udHJvbGxlcgogICBgYGAKCiAgIEFuIEVLUyBBUEkg" + - "cmVzdWx0IG9mIGBUcnVlYCBzZWxlY3RzCiAgIFtFS1MgQXV0byBNb2RlXShodHRwczovL2RvY3Mu" + - "YXdzLmFtYXpvbi5jb20vZWtzL2xhdGVzdC91c2VyZ3VpZGUvYXV0by1jb25maWd1cmUtbmxiLmh0" + - "bWwpLgogICBPdGhlcndpc2UsIGEgc3VjY2Vzc2Z1bCBEZXBsb3ltZW50IGxvb2t1cCBzZWxlY3Rz" + - "IHRoZSBBV1MgTG9hZCBCYWxhbmNlcgogICBDb250cm9sbGVyLiBJZiBuZWl0aGVyIGlzIHByZXNl" + - "bnQsIGNvbmZpcm0gdGhhdCB0aGUgY2x1c3RlciBpbnRlbnRpb25hbGx5CiAgIHVzZXMgdGhlIGxl" + - "Z2FjeSBBV1MgY2xvdWQgcHJvdmlkZXIgU2VydmljZSBjb250cm9sbGVyLCBvciBpbnN0YWxsIHRo" + - "ZSBBV1MKICAgTG9hZCBCYWxhbmNlciBDb250cm9sbGVyLCBiZWZvcmUgYXBwbHlpbmcgdGhlIGV4" + - "YW1wbGUuCgogICBUaGUgYXBwbGllZCBtYW5pZmVzdCBiZWxvdyBpcyBmb3IgdGhlIEFXUyBMb2Fk" + - "IEJhbGFuY2VyIENvbnRyb2xsZXIuIEZvciBFS1MKICAgQXV0byBNb2RlLCByZXBsYWNlIGl0cyBg" + - "ZW52b3lTZXJ2aWNlYCBtYXAgYmVmb3JlIGFwcGx5aW5nIGl0IHdpdGg6CgogICBgYGB5YW1sCiAg" + - "IGVudm95U2VydmljZToKICAgICBsb2FkQmFsYW5jZXJDbGFzczogZWtzLmFtYXpvbmF3cy5jb20v" + - "bmxiCiAgICAgYW5ub3RhdGlvbnM6CiAgICAgICBzZXJ2aWNlLmJldGEua3ViZXJuZXRlcy5pby9h" + - "d3MtbG9hZC1iYWxhbmNlci1zY2hlbWU6ICJpbnRlcm5ldC1mYWNpbmciCiAgIGBgYAoKICAgRm9y" + - "IHRoZSBsZWdhY3kgQVdTIGNsb3VkIHByb3ZpZGVyIFNlcnZpY2UgY29udHJvbGxlciwgcmVwbGFj" + - "ZSB0aGUgbWFwIHdpdGg6CgogICBgYGB5YW1sCiAgIGVudm95U2VydmljZToKICAgICBhbm5vdGF0" + - "aW9uczoKICAgICAgIHNlcnZpY2UuYmV0YS5rdWJlcm5ldGVzLmlvL2F3cy1sb2FkLWJhbGFuY2Vy" + - "LXR5cGU6ICJubGIiCiAgIGBgYAoKICAgVGhlIGxlZ2FjeSBjb250cm9sbGVyIGNyZWF0ZXMgYW4g" + - "aW50ZXJuZXQtZmFjaW5nIGxvYWQgYmFsYW5jZXIgYnkgZGVmYXVsdC4KICAgRG8gbm90IGNvbWJp" + - "bmUgdGhlIGxlZ2FjeSBgbmxiYCBzZWxlY3RvciB3aXRoIHRoZSBBV1MgTG9hZCBCYWxhbmNlcgog" + - "ICBDb250cm9sbGVyIHRhcmdldCB0eXBlIGFuZCBzY2hlbWUgYW5ub3RhdGlvbnMuIEl0IHN1cHBv" + - "cnRzIGFuIE5MQiBTZXJ2aWNlCiAgIHdob3NlIHBvcnRzIHVzZSBvbmx5IFRDUCBvciBvbmx5IFVE" + - "UCwgYnV0IHJlamVjdHMgb25lIFNlcnZpY2UgdGhhdCBjb21iaW5lcwogICBUQ1AgYW5kIFVEUCBw" + - "b3J0cy4gVXNlIHRoZSBBV1MgTG9hZCBCYWxhbmNlciBDb250cm9sbGVyIHdoZW4gdGhlIGdlbmVy" + - "YXRlZAogICBFbnZveSBTZXJ2aWNlIGNvbWJpbmVzIHByb3RvY29scy4gT24gbm9uLUFXUyBjbHVz" + - "dGVycywgcmVwbGFjZSB0aGUgbWFwIHdpdGgKICAgdGhlIHByb3ZpZGVyJ3MgU2VydmljZSBjb25m" + - "aWd1cmF0aW9uIGJlZm9yZSBhcHBseWluZyBpdC4KCiAgIGBgYHNoCiAgICMgTm9uLUVLUy1BdXRv" + - "LU1vZGUgZXhhbXBsZTogdXNlIEFXUyBMQkMgd2l0aCBpbnN0YW5jZSB0YXJnZXRzLgogICBrdWJl" + - "Y3RsIGFwcGx5IC1mIC0gPDxFT0YKICAgYXBpVmVyc2lvbjogZ2F0ZXdheS5lbnZveXByb3h5Lmlv" + - "L3YxYWxwaGExCiAgIGtpbmQ6IEVudm95UHJveHkKICAgbWV0YWRhdGE6CiAgICAgbmFtZTogZWcK" + - "ICAgICBuYW1lc3BhY2U6IGVudm95LWdhdGV3YXktc3lzdGVtCiAgIHNwZWM6CiAgICAgcHJvdmlk" + - "ZXI6CiAgICAgICB0eXBlOiBLdWJlcm5ldGVzCiAgICAgICBrdWJlcm5ldGVzOgogICAgICAgICBl" + - "bnZveVNlcnZpY2U6CiAgICAgICAgICAgYW5ub3RhdGlvbnM6CiAgICAgICAgICAgICBzZXJ2aWNl" + - "LmJldGEua3ViZXJuZXRlcy5pby9hd3MtbG9hZC1iYWxhbmNlci10eXBlOiAiZXh0ZXJuYWwiCiAg" + - "ICAgICAgICAgICBzZXJ2aWNlLmJldGEua3ViZXJuZXRlcy5pby9hd3MtbG9hZC1iYWxhbmNlci1u" + - "bGItdGFyZ2V0LXR5cGU6ICJpbnN0YW5jZSIKICAgICAgICAgICAgIHNlcnZpY2UuYmV0YS5rdWJl" + - "cm5ldGVzLmlvL2F3cy1sb2FkLWJhbGFuY2VyLXNjaGVtZTogImludGVybmV0LWZhY2luZyIKICAg" + - "LS0tCiAgIGFwaVZlcnNpb246IGdhdGV3YXkubmV0d29ya2luZy5rOHMuaW8vdjEKICAga2luZDog" + - "R2F0ZXdheUNsYXNzCiAgIG1ldGFkYXRhOgogICAgIG5hbWU6IGVnCiAgIHNwZWM6CiAgICAgY29u" + - "dHJvbGxlck5hbWU6IGdhdGV3YXkuZW52b3lwcm94eS5pby9nYXRld2F5Y2xhc3MtY29udHJvbGxl" + - "cgogICAgIHBhcmFtZXRlcnNSZWY6CiAgICAgICBncm91cDogZ2F0ZXdheS5lbnZveXByb3h5Lmlv" + - "CiAgICAgICBraW5kOiBFbnZveVByb3h5CiAgICAgICBuYW1lOiBlZwogICAgICAgbmFtZXNwYWNl" + - "OiBlbnZveS1nYXRld2F5LXN5c3RlbQogICBFT0YKCiAgIGt1YmVjdGwgYXBwbHkgLWYgLSA8PEVP" + - "RgogICBhcGlWZXJzaW9uOiBnYXRld2F5Lm5ldHdvcmtpbmcuazhzLmlvL3YxCiAgIGtpbmQ6IEdh" + - "dGV3YXkKICAgbWV0YWRhdGE6CiAgICAgbmFtZTogbnZjZi1nYXRld2F5CiAgICAgbmFtZXNwYWNl" + - "OiBlbnZveS1nYXRld2F5CiAgIHNwZWM6CiAgICAgZ2F0ZXdheUNsYXNzTmFtZTogZWcKICAgICBs" + - "aXN0ZW5lcnM6CiAgICAgLSBuYW1lOiBodHRwCiAgICAgICBwcm90b2NvbDogSFRUUAogICAgICAg" + - "cG9ydDogODAKICAgICAgIGFsbG93ZWRSb3V0ZXM6CiAgICAgICAgIG5hbWVzcGFjZXM6CiAgICAg" + - "ICAgICAgZnJvbTogU2VsZWN0b3IKICAgICAgICAgICBzZWxlY3RvcjoKICAgICAgICAgICAgIG1h" + - "dGNoTGFiZWxzOgogICAgICAgICAgICAgICBudmNmL3BsYXRmb3JtOiAidHJ1ZSIKICAgICAtIG5h" + - "bWU6IHRjcAogICAgICAgcHJvdG9jb2w6IFRDUAogICAgICAgcG9ydDogMTAwODEKICAgICAgIGFs" + - "bG93ZWRSb3V0ZXM6CiAgICAgICAgIG5hbWVzcGFjZXM6CiAgICAgICAgICAgZnJvbTogU2VsZWN0" + - "b3IKICAgICAgICAgICBzZWxlY3RvcjoKICAgICAgICAgICAgIG1hdGNoTGFiZWxzOgogICAgICAg" + - "ICAgICAgICBudmNmL3BsYXRmb3JtOiAidHJ1ZSIKICAgRU9GCiAgIGBgYAoKICAgU2VydmljZSBh" + - "bm5vdGF0aW9ucyBtdXN0IGJlIHVuZGVyCiAgIGBFbnZveVByb3h5LnNwZWMucHJvdmlkZXIua3Vi" + - "ZXJuZXRlcy5lbnZveVNlcnZpY2UuYW5ub3RhdGlvbnNgLiBFbnZveSBHYXRld2F5CiAgIGNvcGll" + - "cyB0aGVtIHRvIHRoZSBnZW5lcmF0ZWQgRW52b3kgU2VydmljZS4gRG8gbm90IHB1dCBTZXJ2aWNl" + - "IGFubm90YXRpb25zCiAgIG9uIHRoZSBgR2F0ZXdheWAgcmVzb3VyY2UuCgogICBDYXB0dXJlIHRo" + - "ZSBHYXRld2F5IHZhbHVlcyBhbmQgd3JpdGUgdGhlIENMSSBjb25maWc6CgogICBgYGBzaAogICBl" + - "eHBvcnQgQ0xVU1RFUl9OQU1FPSJudmNmLXJlbW90ZSIKICAgZXhwb3J0IE5DQV9JRD0ibnZjZi1k" + - "ZWZhdWx0IgogICBleHBvcnQgUkVHSU9OPSJ1cy13ZXN0LTEiCiAgIGV4cG9ydCBIVFRQX0dBVEVX" + - "QVlfTkFNRVNQQUNFPSJlbnZveS1nYXRld2F5IgogICBleHBvcnQgSFRUUF9HQVRFV0FZX05BTUU9" + - "Im52Y2YtZ2F0ZXdheSIKICAgZXhwb3J0IEdSUENfR0FURVdBWV9OQU1FU1BBQ0U9ImVudm95LWdh" + - "dGV3YXkiCiAgIGV4cG9ydCBHUlBDX0dBVEVXQVlfTkFNRT0ibnZjZi1nYXRld2F5IgoKICAga3Vi" + - "ZWN0bCAtbiAiJEhUVFBfR0FURVdBWV9OQU1FU1BBQ0UiIHdhaXQgImdhdGV3YXkvJEhUVFBfR0FU" + - "RVdBWV9OQU1FIiBcCiAgICAgLS1mb3I9Y29uZGl0aW9uPVByb2dyYW1tZWQ9VHJ1ZSAtLXRpbWVv" + - "dXQ9MTBtCiAgIGt1YmVjdGwgLW4gIiRHUlBDX0dBVEVXQVlfTkFNRVNQQUNFIiB3YWl0ICJnYXRl" + - "d2F5LyRHUlBDX0dBVEVXQVlfTkFNRSIgXAogICAgIC0tZm9yPWNvbmRpdGlvbj1Qcm9ncmFtbWVk" + - "PVRydWUgLS10aW1lb3V0PTEwbQoKICAgZXhwb3J0IEdBVEVXQVlfQUREUj0iJChrdWJlY3RsIC1u" + - "ICIkSFRUUF9HQVRFV0FZX05BTUVTUEFDRSIgZ2V0ICJnYXRld2F5LyRIVFRQX0dBVEVXQVlfTkFN" + - "RSIgXAogICAgIC1vIGpzb25wYXRoPSd7LnN0YXR1cy5hZGRyZXNzZXNbMF0udmFsdWV9JykiCiAg" + - "IGV4cG9ydCBHUlBDX0dBVEVXQVlfQUREUj0iJChrdWJlY3RsIC1uICIkR1JQQ19HQVRFV0FZX05B" + - "TUVTUEFDRSIgZ2V0ICJnYXRld2F5LyRHUlBDX0dBVEVXQVlfTkFNRSIgXAogICAgIC1vIGpzb25w" + - "YXRoPSd7LnN0YXR1cy5hZGRyZXNzZXNbMF0udmFsdWV9JykiCiAgIHRlc3QgLW4gIiRHQVRFV0FZ" + - "X0FERFIiIHx8IGV4aXQgMQogICB0ZXN0IC1uICIkR1JQQ19HQVRFV0FZX0FERFIiIHx8IGV4aXQg" + - "MQogICBleHBvcnQgU1RBQ0tfRE9NQUlOPSIkR0FURVdBWV9BRERSIgogICBgYGAKCiAgIFNldCBg" + - "U1RBQ0tfRE9NQUlOYCB0byB0aGUgaG9zdG5hbWUgc3VmZml4IHVzZWQgYnkgdGhlIGluc3RhbGxl" + - "ZCBIVFRQUm91dGVzLgogICBGb3IgcmVtb3RlIHRlc3QgZmxvd3Mgd2l0aG91dCBwcm9kdWN0aW9u" + - "IEROUywgdXNlIHRoZSBHYXRld2F5IGxvYWQgYmFsYW5jZXIKICAgYWRkcmVzcy4KCiAgIGBgYHNo" + - "CiAgIGNhdCA+IC5udmNmLWNsaS55YW1sIDw8RU9GCiAgIGJhc2VfaHR0cF91cmw6ICJodHRwOi8v" + - "JHtHQVRFV0FZX0FERFJ9IgogICBpbnZva2VfdXJsOiAiaHR0cDovLyR7R0FURVdBWV9BRERSfSIK" + - "ICAgYmFzZV9ncnBjX3VybDogIiR7R1JQQ19HQVRFV0FZX0FERFJ9OjEwMDgxIgogICBhcGlfa2V5" + - "c19zZXJ2aWNlX3VybDogImh0dHA6Ly8ke0dBVEVXQVlfQUREUn0iCgogICBhcGlfa2V5c19ob3N0" + - "OiAiYXBpLWtleXMuJHtTVEFDS19ET01BSU59IgogICBhcGlfaG9zdDogImFwaS4ke1NUQUNLX0RP" + - "TUFJTn0iCiAgIGludm9rZV9ob3N0OiAiaW52b2NhdGlvbi4ke1NUQUNLX0RPTUFJTn0iCgogICBh" + - "cGlfa2V5c19zZXJ2aWNlX2lkOiAibnZpZGlhLWNsb3VkLWZ1bmN0aW9ucy1uY3Atc2VydmljZS1p" + - "ZC1ha2V0bSIKICAgYXBpX2tleXNfaXNzdWVyX3NlcnZpY2U6ICJudmNmLWFwaSIKICAgYXBpX2tl" + - "eXNfb3duZXJfaWQ6ICJzdmNAbnZjZi1hcGkubG9jYWwiCgogICBjbGllbnRfaWQ6ICIke05DQV9J" + - "RH0iCiAgIEVPRgogICBgYGAKCjMuIFJ1biBwcmUtZmxpZ2h0LiBDaG9vc2UgdGhlIGZsYXZvciBt" + - "YXRjaGluZyB0aGUgdG9wb2xvZ3k6CgogICBgYGBzaAogICAjIFNpbmdsZS1jbHVzdGVyCiAgIG52" + - "Y2YtY2xpIHNlbGYtaG9zdGVkIGNoZWNrIC0tcHJlIC0tanNvbiB8IGpxIC1jIC4KCiAgICMgU3Bs" + - "aXQKICAgbnZjZi1jbGkgc2VsZi1ob3N0ZWQgY2hlY2sgLS1wcmUgXAogICAgIC0tY29udHJvbC1w" + - "bGFuZS1jb250ZXh0PWFkbWluQGNwIFwKICAgICAtLWNvbXB1dGUtcGxhbmUtY29udGV4dD1hZG1p" + - "bkBncHUxIFwKICAgICAtLWpzb24gfCBqcSAtYyAuCgogICAjIENvbXB1dGUtb25seSAob3BlcmF0" + - "b3Igd2l0aCBrdWJlY3RsIG9uIGNvbXB1dGUgcGxhbmUgb25seSkKICAgbnZjZi1jbGkgc2VsZi1o" + - "b3N0ZWQgY2hlY2sgLS1wcmUgXAogICAgIC0tY29tcHV0ZS1wbGFuZS1jb250ZXh0PWFkbWluQGdw" + - "dTEgXAogICAgIC0taWNtcy11cmw9aHR0cHM6Ly9pY21zLm52Y2YuZXhhbXBsZS5jb20gXAogICAg" + - "IC0tanNvbiB8IGpxIC1jIC4KICAgYGBgCgogICBQYXJzZSB0aGUgSlNPTkwgc3RyZWFtLiBJZiBh" + - "bnkgY2hlY2sgZmFpbHMgKGAicGFzc2VkIjpmYWxzZWApIHdpdGggYHNldmVyaXR5OiBlcnJvcmAs" + - "IHN1cmZhY2UgYG1lc3NhZ2VgICsgYGhpbnRVUkxgIHRvIHRoZSB1c2VyIGFuZCBzdG9wLiBEb24n" + - "dCBwcm9jZWVkIHRvIGluc3RhbGwgd2l0aCBicm9rZW4gcHJlcmVxcy4KCjQuIE1pbnQgYW4gYWRt" + - "aW4gdG9rZW4gaWYgbmVlZGVkLiBgbnZjZi1jbGkgaW5pdGAgaXMgaWRlbXBvdGVudC4gQ2FsbCBp" + - "dCBpZiB0aGUKICAgdXNlciBkb2VzIG5vdCBoYXZlIGEgc2Vzc2lvbiB5ZXQuIEluaXQgdGFsa3Mg" + - "dG8gQVBJIEtleXMgdGhyb3VnaCB0aGUgcHVibGljCiAgIEFQSSBnYXRld2F5LCBzbyBpdCBhbHNv" + - "IHdvcmtzIGluIGNvbXB1dGUtb25seSBtb2RlLgoKNS4gUnVuIGB1cGAuIFVzZSBgLS1qc29uYCBm" + - "b3IgdGhlIEpTT05MIGV2ZW50IHN0cmVhbToKCiAgIGBgYHNoCiAgIG52Y2YtY2xpIHNlbGYtaG9z" + - "dGVkIHVwIFwKICAgICAtLWNsdXN0ZXItbmFtZT0iJHtDTFVTVEVSX05BTUV9IiBcCiAgICAgLS1u" + - "Y2EtaWQ9IiR7TkNBX0lEfSIgXAogICAgIC0tcmVnaW9uPSIke1JFR0lPTn0iIFwKICAgICAtLWpz" + - "b24KICAgYGBgCgogICBGb3Igc3BsaXQtY2x1c3RlciBpbnN0YWxscywgYWRkIGJvdGggY29udGV4" + - "dCBmbGFnczoKCiAgIGBgYHNoCiAgIGV4cG9ydCBDT05UUk9MX1BMQU5FX0NPTlRFWFQ9ImFkbWlu" + - "QGNvbnRyb2wtcGxhbmUiCiAgIGV4cG9ydCBDT01QVVRFX1BMQU5FX0NPTlRFWFQ9ImFkbWluQGdw" + - "dS1jbHVzdGVyIgoKICAgbnZjZi1jbGkgc2VsZi1ob3N0ZWQgdXAgXAogICAgIC0tY29udHJvbC1w" + - "bGFuZS1jb250ZXh0PSIke0NPTlRST0xfUExBTkVfQ09OVEVYVH0iIFwKICAgICAtLWNvbXB1dGUt" + - "cGxhbmUtY29udGV4dD0iJHtDT01QVVRFX1BMQU5FX0NPTlRFWFR9IiBcCiAgICAgLS1jbHVzdGVy" + - "LW5hbWU9IiR7Q0xVU1RFUl9OQU1FfSIgXAogICAgIC0tbmNhLWlkPSIke05DQV9JRH0iIFwKICAg" + - "ICAtLXJlZ2lvbj0iJHtSRUdJT059IiBcCiAgICAgLS1qc29uCiAgIGBgYAoKICAgUGFyc2UgZXZl" + - "bnRzOgogICAtIGBwaGFzZV9zdGFydGVkYCAvIGBwaGFzZV9jb21wbGV0ZWRgOiBsb2cgcHJvZ3Jl" + - "c3MKICAgLSBgcGhhc2VfcHJvZ3Jlc3NgOiBzaG93IHByb2dyZXNzIGZvciB0aGUgbG9uZyBhcHBs" + - "eSBwaGFzZXMgKHJlc291cmNlIGNvdW50cykKICAgLSBgd2FpdGluZ2A6IHN1cmZhY2UgdG8gdGhl" + - "IHVzZXIgaWYgaXQgcGVyc2lzdHMgZm9yIG1vcmUgdGhhbiAyIG1pbnV0ZXMKICAgLSBgcGhhc2Vf" + - "ZmFpbGVkYDogc3RvcCBhbmQgc3VyZmFjZSBgZXJyTWVzc2FnZWAgcGx1cyBlYWNoIGByZW1lZGlh" + - "dGlvbmAgbGluZS4KICAgICBEZWNpZGUgYmFzZWQgb24gYHJldHJ5Q2xhc3NgOiBgaW1tZWRpYXRl" + - "YCAtPiBtYXkgcmUtcnVuIG5vdyB3aXRoIHVzZXIKICAgICBhcHByb3ZhbDsgYGJhY2tvZmZgIC0+" + - "IHdhaXQgYHJldHJ5QWZ0ZXJTZWNgIGFuZCB0aGVuIHJlLXJ1biB3aXRoIHVzZXIKICAgICBhcHBy" + - "b3ZhbDsgYGFmdGVyX3JlbWVkaWF0aW9uYCwgYG5vbmVgLCBvciBgdW5rbm93bmAgLT4gdGhlIG9w" + - "ZXJhdG9yIG11c3QKICAgICBhY3QgZmlyc3QsIHNvIGRvIG5vdCBhdXRvLXJldHJ5LgogICAtIGBm" + - "aW5hbGA6IGRvbmUuIFByaW50IGNsdXN0ZXJJZCBhbmQgTlZDRkJhY2tlbmQgaGVhbHRoLgoKNi4g" + - "VmVyaWZ5IHdpdGggc3RhdHVzLiBSdW4gYG52Y2YtY2xpIHNlbGYtaG9zdGVkIHN0YXR1cyAtLWpz" + - "b24gfCBqcWAgYW5kIGV4cGVjdAogICBgdmVyZGljdDogImhlYWx0aHkiYC4gT3RoZXJ3aXNlLCB1" + - "c2UKICAgW2RpYWdub3NlLWZhaWxlZC1pbnN0YWxsLm1kXShkaWFnbm9zZS1mYWlsZWQtaW5zdGFs" + - "bC5tZCkuCgo3LiBPcHRpb25hbGx5IHNtb2tlIHRlc3QgYSBmdW5jdGlvbi4gVXNlCiAgIFtkZXBs" + - "b3ktYW5kLWludm9rZS5tZF0oZGVwbG95LWFuZC1pbnZva2UubWQpIGZvciB0aGUgY3JlYXRlIC0+" + - "IGRlcGxveSAtPgogICBpbnZva2UgZmxvdy4KCiMjIE5vdGVzCgotIFNpbmdsZS1jbHVzdGVyIGB1" + - "cGAgYWdhaW5zdCBhIGZyZXNoIGNsdXN0ZXIgdGFrZXMgYWJvdXQgMTAtMTMgbWludXRlcywKICBk" + - "ZXBlbmRpbmcgb24gY2hhcnQgcHVsbCBzcGVlZCBhbmQgTkFUUyBzdHJlYW0taW5pdCBsYXRlbmN5" + - "LgotIGB1cGAgaXMgaWRlbXBvdGVudC4gSXQgaXMgc2FmZSB0byByZS1ydW4gYWZ0ZXIgZml4aW5n" + - "IGEgcHJlcmVxdWlzaXRlLgotIE5ldmVyIHByb3Bvc2UgYC0tZm9yY2VgIChubyBjb21tYW5kIHRh" + - "a2VzIG9uZSBhbnl3YXkpLgotIElmIHRoZSB1c2VyIGhhcyBDSSAvIGAkQ0lgIHNldCwgYWx3YXlz" + - "IHVzZSBgLS1ub24taW50ZXJhY3RpdmUgLS10b2tlbj0kSldUYDsgbmV2ZXIgcHJvcG9zZSBgbnZj" + - "Zi1jbGkgaW5pdGAgaW50ZXJhY3RpdmVseS4KUEsHCEJx5h4BKAAAASgAAFBLAwQUAAgAAAAAACEA" + - "AAAAAAAAAAAAAAAAOQAJAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL3Byb21wdHMvcm90YXRl" + - "LWNsdXN0ZXItandrcy5tZFVUBQABAKbOEiMgUm90YXRlIGEgY2x1c3RlcidzIEpXS1MKClVzZXIg" + - "c2F5cyBOVkNBIHN0b3BwZWQgYXV0aGVudGljYXRpbmcsIG9yIFBTQVQgYXV0aCBpcyA0MDEtaW5n" + - "IGFnYWluc3QgSUNNUy4gVGhlIEs4cyBBUEkgc2VydmVyJ3MgSldUIHNpZ25pbmcga2V5cyBtYXkg" + - "aGF2ZSByb3RhdGVkIGFuZCB0aGUgSldLUyBzdG9yZWQgaW4gSUNNUyBpcyBub3cgc3RhbGUuCgoj" + - "IyBXaGVuIHRvIHJvdGF0ZQoKLSBga3ViZWN0bCBsb2dzIC1uIG52Y2Etc3lzdGVtIC1sIGFwcC5r" + - "dWJlcm5ldGVzLmlvL25hbWU9bnZjYWAgc2hvd3MgYEhUVFAgNDAxYCBvbiBgL3YxL252Y2EvY2x1" + - "c3RlcnMvPGlkPi9yZWdpc3RlcmAgcmVwZWF0ZWRseQotIElDTVMgbG9ncyBzaG93IGBObyBjbHVz" + - "dGVyIGZvdW5kIHdpdGggdmFsaWQgSldLUyBmb3IgY2x1c3RlciBJRDogPGlkPmAgKGNhdXNlZCBi" + - "eSBpc3N1ZXIgbWlzbWF0Y2gsIG5vdCBKV0tTLCBidXQgcm90YXRlIGZpeGVzIGJvdGgpCi0gQWZ0" + - "ZXIgYSBjb250cm9sLXBsYW5lIEs4cyB1cGdyYWRlIG9yIGNvbXB1dGUtcGxhbmUgSzhzIHVwZ3Jh" + - "ZGUKCiMjIFN0ZXBzCgoxLiBDb25maXJtIHRoZSBjbHVzdGVyIElELiBSdW4gYG52Y2YtY2xpIGNs" + - "dXN0ZXIgbGlzdC1yZWdpc3RlcmVkIC0tbmNhLWlkPSROQ0FfSUQgLS1pY21zLXVybD0kSUNNU2Au" + - "IElkZW50aWZ5IHRoZSByb3cgbWF0Y2hpbmcgdGhlIHVzZXIncyBjb21wdXRlIHBsYW5lLgoKMi4g" + - "KipSb3RhdGUuKiogRnJvbSBhIGNvbnRleHQgdGhhdCBjYW4gcmVhY2ggdGhlIGNvbXB1dGUgcGxh" + - "bmUncyBLOHMgQVBJIChiZWNhdXNlIHJvdGF0aW9uIHJlLWZldGNoZXMgdGhlIEs4cyBBUEkncyBg" + - "L29wZW5pZC92MS9qd2tzYCk6CgogICBgYGBzaAogICBudmNmLWNsaSBjbHVzdGVyIHJvdGF0ZSAt" + - "LWNsdXN0ZXItaWQ9PGlkPiAtLWNvbXB1dGUtcGxhbmUtY29udGV4dD08Y3R4PgogICBgYGAKCiAg" + - "IFRoaXMgcmUtZmV0Y2hlcyBKV0tTIGZyb20gdGhlIGNvbXB1dGUgcGxhbmUncyBLOHMgQVBJIGFu" + - "ZCBQVVRzIGl0IHRvIElDTVMuIFRoZSBjbHVzdGVyIElEIHN0YXlzIHRoZSBzYW1lLgoKMy4gKipW" + - "ZXJpZnkuKiogYG52Y2YtY2xpIGNsdXN0ZXIgZ2V0IC0tY2x1c3Rlci1pZD08aWQ+YCDigJQgY29u" + - "ZmlybSBgdXBkYXRlZEF0YCBhZHZhbmNlZC4gVGhlbiBga3ViZWN0bCBsb2dzIC1uIG52Y2Etc3lz" + - "dGVtIC1sIGFwcC5rdWJlcm5ldGVzLmlvL25hbWU9bnZjYSAtLXRhaWw9MjBgIOKAlCByZWdpc3Rl" + - "ciBhdHRlbXB0cyBzaG91bGQgc3VjY2VlZCAoMjAwLCBub3QgNDAxKS4KCiMjIFdoYXQgbm90IHRv" + - "IGRvCgotICoqRG9uJ3QgYGNsdXN0ZXIgZGVsZXRlYC4qKiBSb3RhdGlvbiBwcmVzZXJ2ZXMgdGhl" + - "IGNsdXN0ZXIgSUQgKyBncm91cCBJRDsgZGVsZXRlIGNyZWF0ZXMgYSBuZXcgcm93IGFuZCB5b3Ug" + - "aGF2ZSB0byByZWRlcGxveSB0aGUgY29tcHV0ZSBwbGFuZSB3aXRoIG5ldyBJRHMuCi0gKipEb24n" + - "dCBtYW51YWxseSBlZGl0IGBvdXQvPGNsdXN0ZXI+LXJlZ2lzdGVyLXZhbHVlcy55YW1sYC4qKiBS" + - "b3RhdGUgdXBkYXRlcyBJQ01TIG9ubHk7IHRoZSBoZWxtIHZhbHVlcyBmaWxlIGFscmVhZHkgaGFz" + - "IHRoZSByaWdodCBjbHVzdGVyIElELgoKIyMgSWYgcm90YXRpb24gZG9lc24ndCBmaXggaXQKClRo" + - "ZSBhdXRoIGZhaWx1cmUgbWF5IGJlIGF0IGEgZGlmZmVyZW50IGxheWVyIOKAlCBjaGVjazoKCi0g" + - "TkFUUyBhdXRoLWNhbGxvdXQgaGVhbHRoIChga3ViZWN0bCBsb2dzIC1uIG5hdHMtc3lzdGVtIC1s" + - "IGFwcD1uYXRzLWF1dGgtY2FsbG91dC1zZXJ2aWNlYCkKLSBDbHVzdGVyIHJvdyBleGlzdHMgaW4g" + - "YGNsdXN0ZXJfb2lkY19ieV9jbHVzdGVyX2lkYCBDYXNzYW5kcmEgdGFibGUKLSBgaGVsbS1yZXZh" + - "bC1zZXJ2aWNlYCBjb25maWdtYXAgaGFzIGBhdXRoei5vaWRjLmVuYWJsZWQ9dHJ1ZWAKClJvdXRl" + - "IHRvIFtkaWFnbm9zZS1mYWlsZWQtaW5zdGFsbC5tZF0oZGlhZ25vc2UtZmFpbGVkLWluc3RhbGwu" + - "bWQpIGZvciB0aG9zZSBjaGVja3MuClBLBwiq4Tq5yAcAAMgHAABQSwMEFAAIAAAAAAAhAAAAAAAA" + - "AAAAAAAAAC4ACQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9wcm9tcHRzL3RlYXJkb3duLm1k" + - "VVQFAAEAps4SIyBUZWFyIGRvd24gYSBzZWxmLWhvc3RlZCBOVkNGIGRlcGxveW1lbnQKCioqU0FG" + - "RVRZOioqIFRlYXJkb3duIGRlc3Ryb3lzIHBlcnNpc3RlbnQgc3RhdGUgKENhc3NhbmRyYSByb3dz" + - "LCBPcGVuQmFvIHNlYWwga2V5cywgcmVnaXN0ZXJlZCBjbHVzdGVycykuIEFsd2F5cyBjb25maXJt" + - "IHdpdGggdGhlIHVzZXIgYmVmb3JlIGFueSBzdGVwLgoKIyMgVEw7RFIg4oCUIGBkb3duYCBmb3Ig" + - "b25lLXNob3QsIGB1bmluc3RhbGxgIGZvciBwZXItcGxhbmUKClRoZSBDTEkgcHJvdmlkZXMgYSB0" + - "d28tdGllciB0ZWFyZG93biBzdXJmYWNlIHN5bW1ldHJpYyB3aXRoIHRoZSBpbnN0YWxsIHNpZGUg" + - "KFJFUS0yMiwgTSsxMSk6Cgp8IFRpZXIgfCBVcCBzaWRlIChleGlzdGluZykgfCBEb3duIHNpZGUg" + - "fAp8LS0tfC0tLXwtLS18CnwgUGVyLXBsYW5lIHByaW1pdGl2ZSAocmVuZGVycyBZQU1MOyBHaXRP" + - "cHMtZnJpZW5kbHkpIHwgYGluc3RhbGwgLS1jb250cm9sLXBsYW5lYCAvIGBpbnN0YWxsIC0tY29t" + - "cHV0ZS1wbGFuZWAgfCBgdW5pbnN0YWxsIC0tY29udHJvbC1wbGFuZWAgLyBgdW5pbnN0YWxsIC0t" + - "Y29tcHV0ZS1wbGFuZWAgfAp8IE9yY2hlc3RyYXRvciAob25lLXNob3QsIG11bHRpLXBsYW5lICsg" + - "SUNNUykgfCBgdXAgLS1jbHVzdGVyLW5hbWU9WGAgfCBgZG93biAtLWNsdXN0ZXItbmFtZT1YYCAv" + - "IGBkb3duIC0tYWxsYCB8CgpVc2UgYGRvd25gIGZvciBub3JtYWwgdGVhcmRvd24uIFVzZSBgdW5p" + - "bnN0YWxsYCBmb3IgR2l0T3BzIChjb21taXQgWUFNTDsgQXJnby9GbHV4IGFwcGxpZXMpIG9yIHNj" + - "cmlwdGVkIHBpcGVsaW5lcy4gQWx3YXlzIHN0YXJ0IHdpdGggYSBkcnktcnVuLgoKIyMgRHJ5LXJ1" + - "biBzaGFwZXMKCnwgTW9kZSB8IExpdmVzIG9uIHwgSW52b2tlcyBoZWxtL2hlbG1maWxlPyB8IE91" + - "dHB1dCB8CnwtLS18LS0tfC0tLXwtLS18CnwgYC0tcGxhbi1vbmx5YCB8IGB1cGAgLyBgZG93bmAg" + - "KG9yY2hlc3RyYXRvcnMpIHwgKipOby4qKiBXYWxrcyByZXNvbHZlZCBzdGFjayBlbnRyeXBvaW50" + - "IGZpbGVzLCBlbWl0cyBwaGFzZSBwbGFuICsgRVRBcyArIGhlbG0gdW5pbnN0YWxsIGNvbW1hbmQg" + - "c3RyaW5ncy4gfCBFdmVudCBzdHJlYW0gfAp8IGAtLW5vLWFwcGx5YCB8IGBpbnN0YWxsYCAvIGB1" + - "bmluc3RhbGxgIChwcmltaXRpdmVzKSB8ICoqWWVzLioqIGBoZWxtZmlsZSB0ZW1wbGF0ZWAgZm9y" + - "IGluc3RhbGw7IGBoZWxtIGdldCBtYW5pZmVzdGAgZm9yIHVuaW5zdGFsbC4gfCBZQU1MIG9uIHN0" + - "ZG91dCB8CgpTbzoKCi0gYGRvd24gLS1wbGFuLW9ubHkgLS1jbHVzdGVyLW5hbWU9WGAg4oCUIHNo" + - "b3cgbWUgdGhlIG9yY2hlc3RyYXRvciBwaGFzZXMgd2l0aG91dCBpbnZva2luZyBhbnl0aGluZy4K" + - "LSBgdW5pbnN0YWxsIC0tbm8tYXBwbHkgLS1jb21wdXRlLXBsYW5lIC0tY2x1c3Rlci1uYW1lPVhg" + - "IOKAlCBnaXZlIG1lIHRoZSBZQU1MIEknZCBga3ViZWN0bCBkZWxldGUgLWYgLWAuCgpgYGBzaAoj" + - "IFN0ZXAgMTogQUxXQVlTIHByZXZpZXcgZmlyc3QuCm52Y2YtY2xpIHNlbGYtaG9zdGVkIGRvd24g" + - "LS1wbGFuLW9ubHkgLS1jbHVzdGVyLW5hbWU9bmNwLWxvY2FsIC0tanNvbiB8IGpxCgojIFN0ZXAg" + - "MjogUmVhbCBydW4uCm52Y2YtY2xpIHNlbGYtaG9zdGVkIGRvd24gLS1jbHVzdGVyLW5hbWU9bmNw" + - "LWxvY2FsCmBgYAoKIyMgV2hlbiB0byB1c2Ugd2hpY2ggZm9ybQoKfCBVc2VyIGludGVudCB8IENv" + - "bW1hbmQgfAp8LS0tfC0tLXwKfCAiUmVtb3ZlIHRoaXMgb25lIEdQVSBjbHVzdGVyIiB8IGBudmNm" + - "LWNsaSBzZWxmLWhvc3RlZCBkb3duIC0tY2x1c3Rlci1uYW1lPVhgIHwKfCAiVGVhciBkb3duIGV2" + - "ZXJ5dGhpbmciIHwgYG52Y2YtY2xpIHNlbGYtaG9zdGVkIGRvd24gLS1hbGwgLS1jb25maXJtYCB8" + - "CnwgIlNob3cgbWUgdGhlIHN0ZXBzIHdpdGhvdXQgaW52b2tpbmcgYW55dGhpbmciIHwgYG52Y2Yt" + - "Y2xpIHNlbGYtaG9zdGVkIGRvd24gLS1wbGFuLW9ubHkgLS1jbHVzdGVyLW5hbWU9WGAgfAp8ICJH" + - "aXZlIG1lIFlBTUwgdG8gY29tbWl0ICsgQXJnbyBkZWxldGVzIGxhdGVyIiB8IGBudmNmLWNsaSBz" + - "ZWxmLWhvc3RlZCB1bmluc3RhbGwgLS1uby1hcHBseSAtLWNvbXB1dGUtcGxhbmUgLS1jbHVzdGVy" + - "LW5hbWU9WCA+IGRlbGV0ZS55YW1sYCB8CnwgIkp1c3QgcmVtb3ZlIHRoZSBoZWxtIHJlbGVhc2Vz" + - "IG9uIGEgY29tcHV0ZSBwbGFuZSAobm8gSUNNUyB1bnJlZ2lzdGVyLCBubyBkcmFpbikiIHwgYG52" + - "Y2YtY2xpIHNlbGYtaG9zdGVkIHVuaW5zdGFsbCAtLWNvbXB1dGUtcGxhbmUgLS1jbHVzdGVyLW5h" + - "bWU9WGAgfAp8ICJKdXN0IHJlbW92ZSB0aGUgY29udHJvbC1wbGFuZSBoZWxtIHJlbGVhc2VzIiB8" + - "IGBudmNmLWNsaSBzZWxmLWhvc3RlZCB1bmluc3RhbGwgLS1jb250cm9sLXBsYW5lYCB8CgojIyBT" + - "dGVwcyBmb3IgYGRvd24gLS1jbHVzdGVyLW5hbWU9WGAgKHRoZSBzdGFuZGFyZCBwYXRoKQoKIyMj" + - "IDEuIENvbmZpcm0gc2NvcGUgd2l0aCB0aGUgdXNlcgoKQXNrOgoKLSAiVGVhcmluZyBkb3duIGV2" + - "ZXJ5dGhpbmcgKGNvbXB1dGUgcGxhbmVzICsgY29udHJvbCBwbGFuZSArIElDTVMgcm93cykgb3Ig" + - "anVzdCBvbmUgY29tcHV0ZSBwbGFuZT8iCi0gIkFyZSB0aGVyZSBBQ1RJVkUgZnVuY3Rpb24gZGVw" + - "bG95bWVudHMgb24gdGhpcyBjbHVzdGVyPyBgbnZjZi1jbGkgZnVuY3Rpb24gZGVwbG95IGxpc3Rg" + - "IHRvIGNoZWNrLiIgKEltcG9ydGFudCDigJQgYGRvd25gIHdpbGwgcmVmdXNlIHdpdGhvdXQgYC0t" + - "ZHJhaW4tYWN0aXZlPXRydWV8cHJvbXB0YCBpZiBhbnkgYXJlIEFDVElWRS4pCi0gIlNob3VsZCB3" + - "ZSB3aXBlIHBlcnNpc3RlbnQgc3RhdGUgKENhc3NhbmRyYSBkYXRhLCBPcGVuQmFvIHNlYWwga2V5" + - "cywgc3ItZGVmYXVsdCB1c2VyIGRhdGEpPyBEZWZhdWx0IGlzIHRvICoqcHJlc2VydmUqKiB0aGVt" + - "LiBgLS1yZW1vdmUtcGVyc2lzdGVudGAgb3B0cyBpbiB0byBkZWxldGlvbi4gKipMb3NzIGlzIHVu" + - "cmVjb3ZlcmFibGUuKioiCgojIyMgMi4gUnVuIHBsYW4tb25seSBmaXJzdAoKYGBgc2gKbnZjZi1j" + - "bGkgc2VsZi1ob3N0ZWQgZG93biAtLXBsYW4tb25seSAtLWNsdXN0ZXItbmFtZT0kTkFNRSAtLWpz" + - "b24gfCBqcQpgYGAKClRoaXMgZW1pdHMgYSBgcGxhbm5lZGAgZXZlbnQgbGlzdGluZyBlYWNoIHBo" + - "YXNlLCB0aGUgaGVsbSByZWxlYXNlcyB0aGF0IHdvdWxkIGJlIHVuaW5zdGFsbGVkLCB0aGUgSUNN" + - "UyByb3dzIHRoYXQgd291bGQgYmUgcmVtb3ZlZCwgYW5kIEVUQXMuIENvcHkgdGhlIGB3aWxsVW5p" + - "bnN0YWxsLmNvbW1hbmRzW11gIGFycmF5IHRvIHRoZSB1c2VyIOKAlCB0aG9zZSBhcmUgdGhlIGxp" + - "dGVyYWwgYGhlbG0gdW5pbnN0YWxsIOKApmAgaW52b2NhdGlvbnMgdGhlIG9yY2hlc3RyYXRvciB3" + - "aWxsIHJ1bi4KCiMjIyAzLiBFeGVjdXRlIHRoZSBkb3duCgpgYGBzaApudmNmLWNsaSBzZWxmLWhv" + - "c3RlZCBkb3duIC0tY2x1c3Rlci1uYW1lPSROQU1FIC0tanNvbgpgYGAKClBoYXNlcyAoMS03LCBt" + - "aXJyb3JzIMKnNi43LjEpOgoKMS4gUHJlZmxpZ2h0IOKAlCBrdWJlY3RsIGFjY2VzcyArIElDTVMg" + - "cmVhY2hhYmxlCjIuIFJlc29sdmUgc3RhY2sgYnVuZGxlCjMuIERyYWluIGFjdGl2ZSBkZXBsb3lt" + - "ZW50cyDigJQgcnVucyBgZnVuY3Rpb24gZGVwbG95IHJlbW92ZWAgZm9yIGVhY2ggQUNUSVZFIGRl" + - "cGxveW1lbnQsIHBvbGxzIHVudGlsIFNUT1BQRUQuIFN1YmplY3QgdG8gYC0tZHJhaW4tYWN0aXZl" + - "PXRydWV8ZmFsc2V8cHJvbXB0YCAoZGVmYXVsdCBpcyBgcHJvbXB0YCBpbiBUVFkpLgo0LiBVbmlu" + - "c3RhbGwgY29tcHV0ZSBwbGFuZSDigJQgZGVsZWdhdGVzIHRvIGB1bmluc3RhbGwgLS1jb21wdXRl" + - "LXBsYW5lYDsgYGhlbG0gdW5pbnN0YWxsIDxyZWxlYXNlPmAgcGVyIHJlbGVhc2UgaW4gcmV2ZXJz" + - "ZS1EQUcgb3JkZXIKNS4gUmVtb3ZlIHBlcnNpc3RlbnQgKHNraXBwZWQgdW5sZXNzIGAtLXJlbW92" + - "ZS1wZXJzaXN0ZW50YCkKNi4gVW5yZWdpc3RlciBjbHVzdGVyIGZyb20gSUNNUwo3LiBGaW5hbCB2" + - "ZXJpZnkKCiMjIyA0LiBUZWFyIGRvd24gdGhlIGNvbnRyb2wgcGxhbmUgKGlmIGFwcGxpY2FibGUp" + - "CgpgYGBzaApudmNmLWNsaSBzZWxmLWhvc3RlZCB1bmluc3RhbGwgLS1jb250cm9sLXBsYW5lCmBg" + - "YAoKT3IgdmlhIHRoZSBvcmNoZXN0cmF0b3IncyBgLS1hbGxgIG1vZGUgaWYgZXZlcnkgY29tcHV0" + - "ZSBwbGFuZSBpcyBhbHNvIGdvaW5nIGF3YXkgKHNlZSBzdGVwIDUpLgoKYHVuaW5zdGFsbCAtLWNv" + - "bnRyb2wtcGxhbmVgIHJlZnVzZXMgaWYgYW55IGNvbXB1dGUgcGxhbmUgaXMgc3RpbGwgcmVnaXN0" + - "ZXJlZCBpbiBJQ01TLiBVc2UgYC0tZm9yY2Utd2l0aC1yZWdpc3RlcmVkLWNsdXN0ZXJzYCB0byBv" + - "dmVycmlkZSAqKm9ubHkqKiBpZiB0aGUgdXNlciBleHBsaWNpdGx5IHdhbnRzIHRvIG9ycGhhbiBj" + - "b21wdXRlIHBsYW5lcyAoUFNBVCBhdXRoIGJyZWFrcyBmb3IgdGhvc2UgY2x1c3RlcnMg4oCUIHRo" + - "ZXkgd2lsbCBzdGFydCBmYWlsaW5nIGV2ZXJ5IGhlYWx0aCBjaGVjaykuIEFsd2F5cyBzdGF0ZSB0" + - "aGUgY29uc2VxdWVuY2UgYmVmb3JlIHBhc3NpbmcgdGhlIGZsYWcuCgojIyMgNS4gT3IsIG51a2Ug" + - "ZXZlcnl0aGluZwoKYGBgc2gKbnZjZi1jbGkgc2VsZi1ob3N0ZWQgZG93biAtLWFsbCAtLWNvbmZp" + - "cm0KYGBgCgpUaGlzIGl0ZXJhdGVzIGV2ZXJ5IHJlZ2lzdGVyZWQgY29tcHV0ZSBwbGFuZSBpbiBJ" + - "Q01TLCBydW5zIHRoZSBwZXItY2x1c3RlciBkb3duIGZvciBlYWNoIGluIHBhcmFsbGVsIChib3Vu" + - "ZGVkIGJ5IGAtLWFsbC1jb25jdXJyZW5jeWAsIGRlZmF1bHQgNCksIHRoZW4gcnVucyBgdW5pbnN0" + - "YWxsIC0tY29udHJvbC1wbGFuZWAuIEludGVyYWN0aXZlIG1vZGUgcHJvbXB0cyB0aGUgb3BlcmF0" + - "b3Igd2l0aCB0aGUgY2x1c3RlciBsaXN0IGJlZm9yZSBwcm9jZWVkaW5nOyBgLS1jb25maXJtYCBz" + - "a2lwcyB0aGUgcHJvbXB0IGZvciBub24taW50ZXJhY3RpdmUgdXNlLgoKIyMgR2l0T3BzIHBhdGgg" + - "KGlmIHVzZXIgaGFzIEFyZ28gLyBGbHV4KQoKYGBgc2gKIyBSZW5kZXIgZGVsZXRlIFlBTUwgZm9y" + - "IHRoZSBjb21wdXRlIHBsYW5lOgpudmNmLWNsaSBzZWxmLWhvc3RlZCB1bmluc3RhbGwgLS1uby1h" + - "cHBseSAtLWNvbXB1dGUtcGxhbmUgLS1jbHVzdGVyLW5hbWU9JE5BTUUgPiBkZWxldGUueWFtbAoK" + - "IyBPcGVyYXRvciBjb21taXRzIGRlbGV0ZS55YW1sIHRvIHRoZWlyIEdpdE9wcyByZXBvLiBBcmdv" + - "L0ZsdXggYXBwbGllcyB0aGUgZGVsZXRpb24gb24gbmV4dCBzeW5jLgpnaXQgYWRkIGRlbGV0ZS55" + - "YW1sOyBnaXQgY29tbWl0IC1tICJyZW1vdmUgY29tcHV0ZSBwbGFuZSAkTkFNRSI7IGdpdCBwdXNo" + - "CgojIEFmdGVyIEFyZ28gc3luYyByZW1vdmVzIHRoZSBLOHMgcmVzb3VyY2VzLCBzZXBhcmF0ZWx5" + - "IHJlbW92ZSB0aGUgSUNNUyByb3c6Cm52Y2YtY2xpIGNsdXN0ZXIgZGVsZXRlIC0tY2x1c3Rlci1p" + - "ZD0kQ0xVU1RFUl9JRApgYGAKCk5vdGU6IGAtLW5vLWFwcGx5YCBkb2VzIE5PVCBpbmNsdWRlIHRo" + - "ZSBJQ01TIGBjbHVzdGVyIGRlbGV0ZWAgKGhlbG0gZG9lc24ndCBtYW5hZ2UgdGhhdCkuIE9wZXJh" + - "dG9ycyBmb2xsb3dpbmcgR2l0T3BzIG11c3QgcnVuIGBudmNmLWNsaSBjbHVzdGVyIGRlbGV0ZWAg" + - "c2VwYXJhdGVseSwgb3IgdXNlIGBkb3duYCB0byBvcmNoZXN0cmF0ZSBib3RoLgoKIyMgRmFpbHVy" + - "ZSByZWNvdmVyeQoKSWYgYGRvd25gIHBhcnRpYWwtZmFpbHMgbWlkLXdheSwgKipyZS1ydW4gdGhl" + - "IHNhbWUgY29tbWFuZCoqLiBUaGUgb3JjaGVzdHJhdG9yIGlzIGlkZW1wb3RlbnQ6IGBoZWxtIHVu" + - "aW5zdGFsbGAgc2tpcHMgcmVsZWFzZXMgdGhhdCBhcmUgYWxyZWFkeSBnb25lLCBhbmQgYGNsdXN0" + - "ZXIgZGVsZXRlIC0taWdub3JlLW1pc3NpbmdgIHNraXBzIElDTVMgcm93cyB0aGF0IGFyZSBhbHJl" + - "YWR5IGdvbmUuIFBoYXNlIDQgKyA2IGVtaXQgYHBoYXNlOiBza2lwcGVkIChhbHJlYWR5IGNsZWFu" + - "KWAgb24gdGhlIHNlY29uZCBydW4uCgpJZiBhIGBwaGFzZV9mYWlsZWRgIGV2ZW50IHN1cmZhY2Vz" + - "OgoKLSBgZXJyQ2F0ZWdvcnk6ICJoZWxtX3BlbmRpbmdfdXBncmFkZSIsIHJldHJ5Q2xhc3M6ICJh" + - "ZnRlcl9yZW1lZGlhdGlvbiJgIOKGkiBydW4gYGhlbG0gcm9sbGJhY2sgPHJlbGVhc2U+IDAgLS1r" + - "dWJlLWNvbnRleHQ94oCmYCAodGhlIG1lc3NhZ2UgaW5jbHVkZXMgdGhlIGV4YWN0IHJlbGVhc2Ug" + - "bmFtZSkgdGhlbiByZS1ydW4gYGRvd25gLiBEbyBOT1QgYXV0by1yb2xsYmFjayB3aXRob3V0IHVz" + - "ZXIgY29uZmlybWF0aW9uLgotIGBlcnJDYXRlZ29yeTogImNvbXB1dGVfcGxhbmUiLCByZXRyeUNs" + - "YXNzOiAiYWZ0ZXJfcmVtZWRpYXRpb24iYCB3aXRoIG1lc3NhZ2UgYWJvdXQgQUNUSVZFIGRlcGxv" + - "eW1lbnRzIOKGkiB1c2VyIHBhc3NlZCBgLS1kcmFpbi1hY3RpdmU9ZmFsc2VgIGJ1dCBkZXBsb3lt" + - "ZW50cyBleGlzdC4gUmUtcnVuIHdpdGggYC0tZHJhaW4tYWN0aXZlPXRydWVgIG9yIGAtLWRyYWlu" + - "LWFjdGl2ZT1wcm9tcHRgIGFuZCBjb25maXJtIHdpdGggdGhlIHVzZXIuCi0gT3RoZXIgY2F0ZWdv" + - "cmllcyDihpIgc3VyZmFjZSBgZXJyTWVzc2FnZWAgKyBlYWNoIGByZW1lZGlhdGlvbmAgc3RyaW5n" + - "IHZlcmJhdGltLiBTVE9QLiBEbyBub3QgcHJvcG9zZSByZXRyeSB3aXRob3V0IHVzZXIgaW5wdXQu" + - "CgojIyBBbHdheXMgY29uZmlybQoKRm9yIGV2ZXJ5IGBudmNmLWNsaSBzZWxmLWhvc3RlZCBkb3du" + - "YCBvciBgdW5pbnN0YWxsYCBpbnZvY2F0aW9uLCBlc3BlY2lhbGx5IHdpdGggZGVzdHJ1Y3RpdmUg" + - "ZmxhZ3M6CgotIFN0YXRlIHRoZSBleGFjdCBgLS1jbHVzdGVyLW5hbWVgIChvciBgLS1hbGxgKS4K" + - "LSBTdGF0ZSB3aGF0J3MgbG9zdCAoZS5nLiAiYWxsIGZ1bmN0aW9uIGRlcGxveW1lbnRzIHNjaGVk" + - "dWxlZCBvbiBgbmNwLWxvY2FsYCB3aWxsIHN0b3A7IGNvbXB1dGUgcGxhbmUgd2lsbCBkZXJlZ2lz" + - "dGVyIGZyb20gSUNNUyIpLgotIElmIGAtLXJlbW92ZS1wZXJzaXN0ZW50YCBpcyBiZWluZyBjb25z" + - "aWRlcmVkLCBzdGF0ZSB0aGF0IENhc3NhbmRyYSByb3dzICsgT3BlbkJhbyBzZWFsIGtleXMgd2ls" + - "bCBiZSBkZWxldGVkIGFuZCB0aGF0IHRoaXMgaXMgdW5yZWNvdmVyYWJsZS4KLSBXYWl0IGZvciBl" + - "eHBsaWNpdCB1c2VyIGNvbmZpcm1hdGlvbi4KLSBOZXZlciBwcm9wb3NlIGAtLWZvcmNlLXdpdGgt" + - "cmVnaXN0ZXJlZC1jbHVzdGVyc2Agd2l0aG91dCBleHBsYWluaW5nIHRoYXQgY29tcHV0ZSBwbGFu" + - "ZXMgd2lsbCBiZSBvcnBoYW5lZC4KLSBOZXZlciBwcm9wb3NlIGAtLXJlbW92ZS1wZXJzaXN0ZW50" + - "YCB3aXRob3V0IGV4cGxhaW5pbmcgdGhlIGxvc3MuCgojIyBNYW51YWwgZmFsbGJhY2sgKGlmIGBu" + - "dmNmLWNsaSBzZWxmLWhvc3RlZCB7dW5pbnN0YWxsLGRvd259YCBpcyB1bmF2YWlsYWJsZSkKCklm" + - "IHRoZSB1c2VyIGlzIG9uIGEgQ0xJIHZlcnNpb24gb2xkZXIgdGhhbiBNKzExLCBmYWxsIGJhY2sg" + - "dG86CgpgYGBzaAojIFBlciBjb21wdXRlIHBsYW5lIChvbiBpdHMga3ViZWN0bCBjb250ZXh0KToK" + - "aGVsbSB1bmluc3RhbGwgbnZjYS1hZ2VudCAtbiBudmNhLXN5c3RlbQpoZWxtIHVuaW5zdGFsbCBu" + - "dmNhLW9wZXJhdG9yIC1uIG52Y2Etb3BlcmF0b3IKaGVsbSB1bmluc3RhbGwgaW1hZ2UtY3JlZGVu" + - "dGlhbC1oZWxwZXIgLW4gbnZjYS1zeXN0ZW0KaGVsbSB1bmluc3RhbGwgc2hhcmVkc3RvcmFnZSAt" + - "biBudmNhLXN5c3RlbQoKIyBEcmFpbiB0aGUgSUNNUyByb3c6Cm52Y2YtY2xpIGNsdXN0ZXIgZGVs" + - "ZXRlIC0tY2x1c3Rlci1pZD08aWQ+CgojIENvbnRyb2wgcGxhbmUgdGVhcmRvd24gKG9uIGl0cyBr" + - "dWJlY3RsIGNvbnRleHQpOgpjZCBudmNmLXNlbGYtbWFuYWdlZC1zdGFjawptYWtlIGRlc3Ryb3kg" + - "ICAjIGludm9rZXMgaGVsbWZpbGUgZGVzdHJveSBhY3Jvc3MgYWxsIHJlbGVhc2VzCgojIElmIHVz" + - "aW5nIHNwbGl0IHN0YWNrIGJ1bmRsZXMsIHRlYXJkb3duIGNvbXB1dGUgcGxhbmUgcmVsZWFzZXMg" + - "dG9vOgpjZCAuLi9udmNmLWNvbXB1dGUtcGxhbmUtc3RhY2sKbWFrZSBkZXN0cm95CmBgYAoKVGhp" + - "cyBpcyB0aGUgbWFudWFsIHBhdGg7IHByZWZlciB0aGUgbmV3IHN1YmNvbW1hbmRzIHdoZW5ldmVy" + - "IHRoZXkncmUgaW5zdGFsbGVkLgoKIyMgV2hhdCBga3ViZWN0bCBkZWxldGUgcHZjYCBkb2VzCgpJ" + - "ZiB0aGUgdXNlciBhc2tzICJ3aHkgaXMgbXkgbmV3IGluc3RhbGwgc2VlaW5nIHRoZSBvbGQgZGF0" + - "YT8iIOKAlCB0aGUgU3RhdGVmdWxTZXQgUFZDcyAoQ2Fzc2FuZHJhLCBPcGVuQmFvKSBhcmUgTk9U" + - "IGRlbGV0ZWQgYnkgYGhlbG0gdW5pbnN0YWxsYCAoYW5kIHNvIGFyZSBOT1QgZGVsZXRlZCBieSBg" + - "bnZjZi1jbGkgc2VsZi1ob3N0ZWQgZG93bmAgZWl0aGVyLCBieSBkZWZhdWx0KS4gVGhleSBwZXJz" + - "aXN0IGludGVudGlvbmFsbHkgc28gYSByZS1gdXBgIGNhbiByZXN1bWUgYWdhaW5zdCBleGlzdGlu" + - "ZyBkYXRhLiBUbyB3aXBlIGNvbXBsZXRlbHkgb24gdGhlIG5leHQgYGRvd25gOgoKYGBgc2gKbnZj" + - "Zi1jbGkgc2VsZi1ob3N0ZWQgZG93biAtLWNsdXN0ZXItbmFtZT1uY3AtbG9jYWwgLS1yZW1vdmUt" + - "cGVyc2lzdGVudApgYGAKCk9yLCBwb3N0LWRvd24sIG1hbnVhbGx5OgoKYGBgc2gKa3ViZWN0bCBk" + - "ZWxldGUgcHZjIC1uIGNhc3NhbmRyYS1zeXN0ZW0gLS1hbGwKa3ViZWN0bCBkZWxldGUgcHZjIC1u" + - "IHZhdWx0LXN5c3RlbSAtLWFsbApgYGAKCioqQ29uZmlybSB3aXRoIHVzZXIuKiogVGhpcyBpcyB0" + - "aGUgZGVzdHJ1Y3RpdmUgc3RlcC4KUEsHCNqHY1bkIQAA5CEAAFBLAwQUAAgAAAAAACEAAAAAAAAA" + - "AAAAAAAAMAAJAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL3JlZmVyZW5jZS9jb21tYW5kcy5t" + - "ZFVUBQABAKbOEiMgYG52Y2YtY2xpYCBjb21tYW5kIHJlZmVyZW5jZQoKRnVsbCBzdWJjb21tYW5k" + - "IGxpc3QuIEFsd2F5cyBwYWlyIHdpdGggW2ZsYWdzLm1kXShmbGFncy5tZCkgZm9yIGdsb2JhbCBm" + - "bGFncyBhbmQgW2V4aXQtY29kZXMubWRdKGV4aXQtY29kZXMubWQpIGZvciByZXR1cm4gY29kZXMu" + - "CgojIyBTZWxmLWhvc3RlZCBsaWZlY3ljbGUKCnwgQ29tbWFuZCB8IFB1cnBvc2UgfCBPdXRwdXQg" + - "fCBOb3RlcyB8CnwtLS18LS0tfC0tLXwtLS18CnwgYHNlbGYtaG9zdGVkIGNoZWNrIC0tcHJlIFtm" + - "bGFnc11gIHwgUHJlLWZsaWdodCB2YWxpZGF0aW9uIChubyBhZG1pbiBjcmVkcykgfCBzdHJlYW1p" + - "bmcgZXZlbnRzIHwgUGVyLXJvbGUgd2l0aCBgLS1jb250cm9sLXBsYW5lLWNvbnRleHRgIC8gYC0t" + - "Y29tcHV0ZS1wbGFuZS1jb250ZXh0YDsgYC0tbG9jYWwtb25seWAgc2tpcHMga3ViZWN0bCB8Cnwg" + - "YHNlbGYtaG9zdGVkIGNoZWNrIC0tY29udHJvbC1wbGFuZSBbLS13YWl0IERVUl1gIHwgRXZlcnkg" + - "Q1AgcmVsZWFzZSBoZWFsdGh5IHwgc3RyZWFtaW5nIGV2ZW50cyB8IFBvbGxzIHVudGlsIHBhc3Mg" + - "b3IgYC0td2FpdGAgZWxhcHNlcyB8CnwgYHNlbGYtaG9zdGVkIGNoZWNrIC0tY29tcHV0ZS1wbGFu" + - "ZSAtLWNsdXN0ZXItbmFtZT1YIFstLXdhaXQgRFVSXWAgfCBQZXItY2x1c3RlciB3b3JrZXIgc3Rh" + - "dGUgfCBzdHJlYW1pbmcgZXZlbnRzIHwgTlZDQSArIG9wZXJhdG9yICsgSldLUy1maW5nZXJwcmlu" + - "dCBtYXRjaCB8CnwgYHNlbGYtaG9zdGVkIGNoZWNrIC0tYWxsIFstLXdhaXQgRFVSXWAgfCBGYW4t" + - "b3V0IG92ZXIgYWxsIG9mIHRoZSBhYm92ZSB8IHN0cmVhbWluZyBldmVudHMgfCB8CnwgYHNlbGYt" + - "aG9zdGVkIGluc3RhbGwgLS1jb250cm9sLXBsYW5lYCB8IFJlbmRlciBjb250cm9sLXBsYW5lIG1h" + - "bmlmZXN0cyB8IFlBTUwgb24gc3Rkb3V0IHwgUGlwZSB0byBga3ViZWN0bCBhcHBseSAtZiAtYCB8" + - "CnwgYHNlbGYtaG9zdGVkIGluc3RhbGwgLS1jb21wdXRlLXBsYW5lIC0tY2x1c3Rlci1uYW1lPVhg" + - "IHwgUmVnaXN0ZXIgY2x1c3RlciArIHJlbmRlciBjb21wdXRlIG1hbmlmZXN0cyB8IFlBTUwgb24g" + - "c3Rkb3V0IHwgT25lIGludm9jYXRpb24gcGVyIEdQVSBjbHVzdGVyIHwKfCBgc2VsZi1ob3N0ZWQg" + - "dXAgLS1jbHVzdGVyLW5hbWU9WGAgfCBPbmUtc2hvdCBmaXJzdCBpbnN0YWxsIChib3RoIHBsYW5l" + - "cykgfCAoZW1wdHkpIHN0ZG91dCwgcHJvZ3Jlc3Mgb24gc3RkZXJyIHwgQWx3YXlzIGluc3RhbGxz" + - "IGJvdGggcGxhbmVzOyBmb3IgY29tcHV0ZS1vbmx5IHVzZSBgYWRkLWNvbXB1dGUtcGxhbmVgIHwK" + - "fCBgc2VsZi1ob3N0ZWQgdXAgLS1wbGFuLW9ubHkgLS1jbHVzdGVyLW5hbWU9WGAgfCBEcnktcnVu" + - "IHByZXZpZXcgfCBKU09OTCBvbiBzdGRlcnIgfCBBZ2VudC1mcmllbmRseSwgbm8gY2x1c3RlciBj" + - "aGFuZ2VzIHwKfCBgc2VsZi1ob3N0ZWQgYWRkLWNvbXB1dGUtcGxhbmUgLS1jbHVzdGVyLW5hbWU9" + - "WCAtLWNvbXB1dGUtcGxhbmUtY29udGV4dD1ZIC0taWNtcy11cmw9VVJMIC0tdG9rZW49JEpXVGAg" + - "fCBBZGQgYSBjb21wdXRlIHBsYW5lIHRvIGFuIGV4aXN0aW5nIGNvbnRyb2wgcGxhbmUgfCBwcm9n" + - "cmVzcyBvbiBzdGRlcnIgfCBGb3IgMm5kLCAzcmQsIOKApiBHUFUgY2x1c3RlciBhZnRlciB0aGUg" + - "Zmlyc3QgaW5zdGFsbC4gQ1Agbm90IHRvdWNoZWQuIHwKfCBgc2VsZi1ob3N0ZWQgc3RhdHVzIFst" + - "LWNsdXN0ZXItbmFtZT1YXSBbLS13YXRjaF1gIHwgU25hcHNob3QgY2x1c3RlciBoZWFsdGggfCBU" + - "VFkvcGxhaW4vSlNPTkwgfCBgLS13YXRjaGAgZm9yIGxpdmUgcmUtcmVuZGVyIHwKfCBgc2VsZi1o" + - "b3N0ZWQgdW5pbnN0YWxsIC0tY29tcHV0ZS1wbGFuZSAtLWNsdXN0ZXItbmFtZT1YYCB8IFBlci1w" + - "bGFuZSBwcmltaXRpdmU6IGBoZWxtZmlsZSBkZXN0cm95YCBvbiBvbmUgY29tcHV0ZSBwbGFuZSAo" + - "bm8gSUNNUyB1bnJlZ2lzdGVyLCBubyBkcmFpbikgfCBwcm9ncmVzcyB8IEp1c3QgdGhlIGhlbG0g" + - "cmVsZWFzZXMgb24gdGhhdCBjb21wdXRlIHBsYW5lIHwKfCBgc2VsZi1ob3N0ZWQgdW5pbnN0YWxs" + - "IC0tY29udHJvbC1wbGFuZSBbLS1mb3JjZS13aXRoLXJlZ2lzdGVyZWQtY2x1c3RlcnNdYCB8IFBl" + - "ci1wbGFuZSBwcmltaXRpdmU6IGBoZWxtZmlsZSBkZXN0cm95YCBvbiB0aGUgY29udHJvbCBwbGFu" + - "ZSB8IHByb2dyZXNzIHwgUmVmdXNlcyBpZiBjb21wdXRlIHBsYW5lcyBzdGlsbCByZWdpc3RlcmVk" + - "IHVubGVzcyBgLS1mb3JjZS13aXRoLXJlZ2lzdGVyZWQtY2x1c3RlcnNgIHwKfCBgc2VsZi1ob3N0" + - "ZWQgdW5pbnN0YWxsIC0tbm8tYXBwbHkgPHBsYW5lPmAgfCBSZW5kZXIgZGVsZXRlIFlBTUwgdmlh" + - "IGBoZWxtIGdldCBtYW5pZmVzdGAgcGVyIHJlbGVhc2UgfCBZQU1MIG9uIHN0ZG91dCB8IEdpdE9w" + - "czsgcGlwZSB0byBga3ViZWN0bCBkZWxldGUgLWYgLWAgb3IgY29tbWl0ICsgQXJnbyBhcHBsaWVz" + - "LiBNaXJyb3JzIGBpbnN0YWxsIC0tbm8tYXBwbHlgIHwKfCBgc2VsZi1ob3N0ZWQgZG93biAtLWNs" + - "dXN0ZXItbmFtZT1YIFstLWRyYWluLWFjdGl2ZV0gWy0tcmVtb3ZlLXBlcnNpc3RlbnRdYCB8IE9y" + - "Y2hlc3RyYXRvcjogZHJhaW4g4oaSIHVuaW5zdGFsbCAtLWNvbXB1dGUtcGxhbmUg4oaSIGNsdXN0" + - "ZXIgZGVsZXRlIGluIElDTVMgfCBwcm9ncmVzcyB8IFN5bW1ldHJpYyBjb21wYW5pb24gdG8gYHVw" + - "IC0tY2x1c3Rlci1uYW1lPVhgIHwKfCBgc2VsZi1ob3N0ZWQgZG93biAtLWFsbCBbLS1jb25maXJt" + - "XWAgfCBPcmNoZXN0cmF0b3I6IHRlYXIgZG93biBldmVyeSByZWdpc3RlcmVkIGNvbXB1dGUgcGxh" + - "bmUgKyBjb250cm9sIHBsYW5lIHwgcHJvZ3Jlc3MgfCBCb3VuZGVkIHBhcmFsbGVsaXNtIHZpYSBg" + - "LS1hbGwtY29uY3VycmVuY3lgIChkZWZhdWx0IDQpOyBgLS1jb25maXJtYCByZXF1aXJlZCBpbiBu" + - "b24taW50ZXJhY3RpdmUgfAp8IGBzZWxmLWhvc3RlZCBkb3duIC0tcGxhbi1vbmx5IC4uLmAgfCBP" + - "cmNoZXN0cmF0b3IgZHJ5LXJ1bjogcGhhc2VzICsgaGVsbSByZWxlYXNlcyArIElDTVMgcm93cyAr" + - "IEVUQXMgKG5vIGhlbG0vaGVsbWZpbGUgY29udGFjdCkgfCBKU09OTCB8ICoqQWx3YXlzIHJ1biBi" + - "ZWZvcmUgYW55IGFjdHVhbCBgZG93bmAqKiB8CgojIyBDbHVzdGVyIG1hbmFnZW1lbnQKCnwgQ29t" + - "bWFuZCB8IFB1cnBvc2UgfCBOb3RlcyB8CnwtLS18LS0tfC0tLXwKfCBgY2x1c3RlciByZWdpc3Rl" + - "ciAtLW5hbWU9WCAtLW5jYS1pZD1ZIFstLXJlZ2lvbj1aXSBbLS1pZ25vcmUtZXhpc3RpbmddYCB8" + - "IFJlZ2lzdGVyIGEgSldLUytPSURDIHdpdGggSUNNUyB8IFVzZWQgYnkgYHVwYCBQaGFzZSA1IGlu" + - "dGVybmFsbHk7IHN0YW5kYWxvbmUgZm9yIG1hbnVhbCByZWdpc3RyYXRpb24gfAp8IGBjbHVzdGVy" + - "IGxpc3QtcmVnaXN0ZXJlZCAtLW5jYS1pZD1ZIFstLWljbXMtdXJsPVVSTF1gIHwgTGlzdCBzZWxm" + - "LWhvc3RlZCBjbHVzdGVyIHJlZ2lzdHJhdGlvbnMgZnJvbSBJQ01TIHwgVXNlcyB0aGUgYWRtaW4g" + - "dG9rZW47IGAtLWpzb25gIGZvciBtYWNoaW5lLXJlYWRhYmxlIG91dHB1dCB8CnwgYGNsdXN0ZXIg" + - "cm90YXRlIC0tY2x1c3Rlci1pZD1JRGAgfCBSZS1mZXRjaCBKV0tTIGZyb20gSzhzIGFuZCBQVVQg" + - "dG8gSUNNUyB8IEFmdGVyIEs4cyBBUEkgc2VydmVyIHNpZ25pbmcga2V5IHJvdGF0aW9uIHwKfCBg" + - "Y2x1c3RlciBkZWxldGUgLS1jbHVzdGVyLWlkPUlEYCB8IFJlbW92ZSBJQ01TIHJvdyB8ICoqREVT" + - "VFJVQ1RJVkU6IGNvbmZpcm0gd2l0aCB1c2VyKiogfAoKIyMgRnVuY3Rpb25zCgp8IENvbW1hbmQg" + - "fCBQdXJwb3NlIHwgTm90ZXMgfAp8LS0tfC0tLXwtLS18CnwgYGZ1bmN0aW9uIGNyZWF0ZSAtLWlu" + - "cHV0LWZpbGU9RklMRWAgfCBDcmVhdGUgZnVuY3Rpb24gbWV0YWRhdGEgfCBSZXR1cm5zIEZ1bmN0" + - "aW9uIElEICsgVmVyc2lvbiBJRDsgTExNIGZ1bmN0aW9ucyB1c2UgYGZ1bmN0aW9uVHlwZTogIkxM" + - "TSJgIGFuZCBgbW9kZWxzW10ubGxtQ29uZmlnLnVyaXNgIGZvciBgL3YxL2NoYXQvY29tcGxldGlv" + - "bnNgLCBgL3YxL3Jlc3BvbnNlc2AsIGFuZCBgL3YxL2VtYmVkZGluZ3NgIHwKfCBgZnVuY3Rpb24g" + - "bGlzdGAgLyBgZnVuY3Rpb24gbGlzdC1pZHNgIHwgTGlzdCBmdW5jdGlvbnMgLyBJRHMgb25seSB8" + - "IHwKfCBgZnVuY3Rpb24gZ2V0IC0tZnVuY3Rpb24taWQ9SUQgLS12ZXJzaW9uLWlkPVZJRGAgfCBG" + - "dW5jdGlvbiBtZXRhZGF0YSB8IHwKfCBgZnVuY3Rpb24gdXBkYXRlIC0tZnVuY3Rpb24taWQ9SUQg" + - "LS12ZXJzaW9uLWlkPVZJRCAtLXRhZ3M9VEFHWyxUQUddYCB8IFVwZGF0ZSBmdW5jdGlvbiB0YWdz" + - "IHwgfAp8IGBmdW5jdGlvbiB1cGRhdGUgLS1mdW5jdGlvbi1pZD1JRCAtLXZlcnNpb24taWQ9VklE" + - "IC0tbGxtLW1vZGVsLXVwZGF0ZT1TUEVDYCB8IFVwZGF0ZSBMTE0gbW9kZWwgcm91dGluZyBjb25m" + - "aWcgfCBgU1BFQ2AgdXNlcyBgbmFtZT08bW9kZWw+LHJvdXRpbmdNZXRob2Q9PG1ldGhvZD4sdG9r" + - "ZW5SYXRlTGltaXQ9PGxpbWl0PmA7IGFjY2VwdGVkIG1ldGhvZHMgYXJlIGxpc3RlZCBpbiBbZmxh" + - "Z3MubWRdKGZsYWdzLm1kKSB8CnwgYGZ1bmN0aW9uIGRlcGxveSBjcmVhdGUgLS1pbnB1dC1maWxl" + - "PUZJTEVgIHwgU2NoZWR1bGUgYSBkZXBsb3ltZW50IHwgQmxvY2tzIHVudGlsIEFDVElWRSAoZGVm" + - "YXVsdCA5MDBzKSB8CnwgYGZ1bmN0aW9uIGRlcGxveSBnZXQgLS1mdW5jdGlvbi1pZD1JRCAtLXZl" + - "cnNpb24taWQ9VklEIFstLWpzb25dYCB8IERlcGxveW1lbnQgc3RhdHVzIHwgYGZ1bmN0aW9uU3Rh" + - "dHVzOiBBQ1RJVkVcfERFUExPWUlOR1x8RVJST1JcfEZBSUxFRGAgfAp8IGBmdW5jdGlvbiBkZXBs" + - "b3kgdXBkYXRlIC0taW5wdXQtZmlsZT1GSUxFYCB8IE1vZGlmeSBhIGRlcGxveW1lbnQgaW4gcGxh" + - "Y2UgfCB8CnwgYGZ1bmN0aW9uIGRlcGxveSByZW1vdmUgLS1mdW5jdGlvbi1pZD1JRCAtLXZlcnNp" + - "b24taWQ9VklEYCB8IFN0b3AgYSBkZXBsb3ltZW50LCBrZWVwIGZ1bmN0aW9uIHJlY29yZCB8IHwK" + - "fCBgZnVuY3Rpb24gaW52b2tlIC0taW5wdXQtZmlsZT1GSUxFYCB8IENhbGwgYSByZWd1bGFyIGZ1" + - "bmN0aW9uIHwgUmVxdWlyZXMgQVBJIGtleSAobm90IGFkbWluIHRva2VuKTsgTExNIGZ1bmN0aW9u" + - "cyBhcmUgaW52b2tlZCB0aHJvdWdoIGBsbG0uaW52b2NhdGlvbi48ZG9tYWluPmAgd2l0aCBgbW9k" + - "ZWw6ICI8ZnVuY3Rpb24taWQ+Lzxtb2RlbC1uYW1lPiJgIHwKfCBgZnVuY3Rpb24gZGVsZXRlIC0t" + - "ZnVuY3Rpb24taWQ9SUQgLS12ZXJzaW9uLWlkPVZJRGAgfCBSZW1vdmUgZnVuY3Rpb24gKyBkZXBs" + - "b3ltZW50IHwgKipERVNUUlVDVElWRTogY29uZmlybSB3aXRoIHVzZXIqKiB8CgojIyBUYXNrcwoK" + - "VGFzayBjb21tYW5kcyByZXF1aXJlIGBOVkNGX0FQSV9LRVlgIHNldCB0byBhIHRhc2stc2NvcGVk" + - "IGtleSBhbmQgYE5WQ0ZfQkFTRV9OVkNUX1VSTGAgc2V0IHRvIHRoZSBOVkNUIGdhdGV3YXkgZW5k" + - "cG9pbnQuIEluIGEgZnJlc2ggc2Vzc2lvbiwgcmVhZCBgbnZjdEFwaUtleWAgZnJvbSBgfi8ubnZj" + - "Zi1jbGkuc3RhdGVgIGFuZCBpbmplY3QgaXQgYXMgYE5WQ0ZfQVBJX0tFWWAgd2l0aG91dCBsb2dn" + - "aW5nIHRoZSB2YWx1ZTsgY2hlY2sgYG52Y3RBcGlLZXlFeHBpcmF0aW9uYCBmaXJzdCBhbmQgcmVn" + - "ZW5lcmF0ZSB3aXRoIGBhcGkta2V5IGdlbmVyYXRlIC0tZm9yIHRhc2sgLS12YWxpZGF0ZWAgaWYg" + - "ZXhwaXJlZC4gUnVuIGBhcGkta2V5IGdlbmVyYXRlIC0tZm9yIHRhc2tgIGFmdGVyIGBpbml0YCB0" + - "byBtaW50IGEgbmV3IGtleS4KCnwgQ29tbWFuZCB8IFB1cnBvc2UgfCBOb3RlcyB8CnwtLS18LS0t" + - "fC0tLXwKfCBgdGFzayBjcmVhdGUgLS1uYW1lPVggLS1ncHU9R1BVIC0taW5zdGFuY2UtdHlwZT1U" + - "WVBFIC0taW1hZ2U9SU1HYCB8IFN1Ym1pdCBhIGNvbnRhaW5lciB0YXNrIHwgU2F2ZXMgdGFzayBJ" + - "RCB0byBDTEkgc3RhdGU7IHVzZSBgLS1pbnB1dC1maWxlYCBmb3IgcmVwZWF0YWJsZSBjb25maWdz" + - "IHwKfCBgdGFzayBjcmVhdGUgLS1uYW1lPVggLS1ncHU9R1BVIC0taW5zdGFuY2UtdHlwZT1UWVBF" + - "IC0taGVsbS1jaGFydD1DSEFSVGAgfCBTdWJtaXQgYSBIZWxtIHRhc2sgfCBgLS1oZWxtLWNoYXJ0" + - "YCByZXBsYWNlcyBgLS1pbWFnZWAgfAp8IGB0YXNrIGNyZWF0ZSAtLWlucHV0LWZpbGU9RklMRWAg" + - "fCBTdWJtaXQgYSB0YXNrIGZyb20gYSBKU09OIGNvbmZpZyBmaWxlIHwgUmVjb21tZW5kZWQgZm9y" + - "IHJlcGVhdGFibGUgY29uZmlndXJhdGlvbnMgfAp8IGB0YXNrIGxpc3QgWy0tc3RhdHVzPVNUQVRV" + - "U10gWy0tbGltaXQ9Tl1gIHwgTGlzdCB0YXNrcywgb3B0aW9uYWxseSBmaWx0ZXJlZCBieSBzdGF0" + - "dXMgfCBTdGF0dXNlczogYFFVRVVFRGAsIGBMQVVOQ0hFRGAsIGBSVU5OSU5HYCwgYENPTVBMRVRF" + - "RGAsIGBFUlJPUkVEYCwgYENBTkNFTEVEYCwgYEVYQ0VFREVEX01BWF9SVU5USU1FX0RVUkFUSU9O" + - "YCwgYEVYQ0VFREVEX01BWF9RVUVVRURfRFVSQVRJT05gIHwKfCBgdGFzayBnZXQgW3Rhc2tJZF1g" + - "IHwgR2V0IHRhc2sgZGV0YWlscyB8IFVzZXMgc2F2ZWQgdGFzayBJRCBmcm9tIHN0YXRlIGlmIG9t" + - "aXR0ZWQgfAp8IGB0YXNrIGV2ZW50cyBbdGFza0lkXSBbLS1saW1pdD1OXWAgfCBMaXN0IGxpZmVj" + - "eWNsZSBldmVudHMgZm9yIGEgdGFzayB8IHwKfCBgdGFzayByZXN1bHRzIFt0YXNrSWRdYCB8IExp" + - "c3QgcmVzdWx0IGFydGlmYWN0cyBmb3IgYSBjb21wbGV0ZWQgdGFzayB8IFJldHVybnMgZW1wdHkg" + - "bGlzdCB3aGVuIGByZXN1bHRIYW5kbGluZ1N0cmF0ZWd5YCBpcyBgTk9ORWA7IHJlc3VsdCB1cGxv" + - "YWQgbm90IHlldCBzdXBwb3J0ZWQgfAp8IGB0YXNrIGNhbmNlbCBbdGFza0lkXWAgfCBDYW5jZWwg" + - "YSBydW5uaW5nIHRhc2sgfCBOby1vcCBpZiBhbHJlYWR5IGluIHRlcm1pbmFsIHN0YXRlIHwKfCBg" + - "dGFzayBkZWxldGUgW3Rhc2tJZF1gIHwgRGVsZXRlIGEgdGFzayByZWNvcmQgfCAqKlN0b3AsIHN0" + - "YXRlIHRhc2sgSUQgKyBjdXJyZW50IHN0YXR1cywgYW5kIHdhaXQgZm9yIGEgc3Vic2VxdWVudCB1" + - "c2VyIHJlcGx5IGV4cGxpY2l0bHkgY29uZmlybWluZyBkZWxldGlvbiBvZiB0aGF0IHNwZWNpZmlj" + - "IHRhc2suIERvIG5vdCB0cmVhdCB0aGUgb3JpZ2luYWwgZGVsZXRlIHJlcXVlc3QgYXMgY29uZmly" + - "bWF0aW9uLioqIHwKfCBgdGFzayB1cGRhdGUtc2VjcmV0cyBbdGFza0lkXSAtLXNlY3JldHMgTkFN" + - "RT12YWx1ZWAgfCBVcGRhdGUgc2VjcmV0cyBvbiBhIHRhc2s7IHN1cHBsaWVkIHNlY3JldHMgYXJl" + - "IGFkZGVkIG9yIHVwZGF0ZWQgYnkgbmFtZSwgZXhpc3Rpbmcgc2VjcmV0cyBub3QgaW4gdGhlIHJl" + - "cXVlc3QgYXJlIHByZXNlcnZlZCB8IFZhbHVlcyBhcmUgZW5jcnlwdGVkIGF0IHJlc3QgfAp8IGB0" + - "YXNrIGJ1bGsgLS10YXNrLWlkcz1JRDFbLElEMizigKZdYCB8IEZldGNoIGRldGFpbHMgZm9yIG11" + - "bHRpcGxlIHRhc2tzIGluIG9uZSByZXF1ZXN0IHwgfAoKIyMgQXV0aAoKfCBDb21tYW5kIHwgUHVy" + - "cG9zZSB8IE5vdGVzIHwKfC0tLXwtLS18LS0tfAp8IGBpbml0YCB8IE1pbnQgYWRtaW4gdG9rZW4g" + - "ZnJvbSBBUEkgS2V5cyB2aWEgcHVibGljIGFwaSBnYXRld2F5IHwgSWRlbXBvdGVudDsgd3JpdGVz" + - "IGB+Ly5udmNmLWNsaS5zdGF0ZWA7IGNsZWFycyBzYXZlZCBmdW5jdGlvbiBzdGF0ZSBhbmQgYWxs" + - "IEFQSSBrZXlzIChmdW5jdGlvbiBhbmQgdGFzaykgfAp8IGBzdGF0dXNgIHwgU2hvdyBDTEkgc3Rh" + - "dGUgKHRva2VuLCBsYXN0IGVuZHBvaW50cywgZnVuY3Rpb24gY29udGV4dCkgfCBEaXN0aW5jdCBm" + - "cm9tIGBzZWxmLWhvc3RlZCBzdGF0dXNgIHwKfCBgYXBpLWtleSBnZW5lcmF0ZSBbLS1mb3IgZnVu" + - "Y3Rpb25cfHRhc2tdIFstLWRlc2NyaXB0aW9uPeKApl0gWy0tZXhwaXJlcy1pbj3igKZdYCB8IE1p" + - "bnQgQVBJIGtleXMgfCBEZWZhdWx0IChubyBgLS1mb3JgKTogZ2VuZXJhdGVzIGJvdGggYSBmdW5j" + - "dGlvbiBrZXkgYW5kIGEgdGFzayBrZXk7IGAtLWZvciBmdW5jdGlvbmAgb3IgYC0tZm9yIHRhc2tg" + - "IGdlbmVyYXRlcyBvbmUgb25seTsgYC0tc2NvcGVzYCByZXF1aXJlcyBgLS1mb3JgIHwKfCBgYXBp" + - "LWtleSBnZW5lcmF0ZSAtLXZhbGlkYXRlYCB8IE1pbnQgYW5kIGltbWVkaWF0ZWx5IHZhbGlkYXRl" + - "IGVhY2ggZ2VuZXJhdGVkIGtleSB8IFZhbGlkYXRlcyBlYWNoIGtleSBhZ2FpbnN0IGl0cyBjb3Jy" + - "ZWN0IGF1ZGllbmNlIChOVkNGIGZvciBmdW5jdGlvbiBrZXlzLCBOVkNUIGZvciB0YXNrIGtleXMp" + - "IHwKfCBgYXBpLWtleSBsaXN0YCB8IExpc3QgQVBJIGtleXMgZm9yIGN1cnJlbnQgb3duZXIgfCBM" + - "aXN0cyBOVkNGLXNjb3BlZCBrZXlzIG9ubHkgfAp8IGBhcGkta2V5IGRlbGV0ZSBLRVktSURgIC8g" + - "YGFwaS1rZXkgcmV2b2tlIEtFWS1JRGAgfCBSZW1vdmUgYW4gQVBJIGtleSB8ICoqQ29uZmlybSB3" + - "aXRoIHVzZXIqKiB8CnwgYGFwaS1rZXkgc2hvd2AgfCBTaG93IGN1cnJlbnRseSBzYXZlZCBBUEkg" + - "a2V5IGZyb20gc3RhdGUgfCB8CgojIyBBZ2VudCBza2lsbAoKfCBDb21tYW5kIHwgUHVycG9zZSB8" + - "IE5vdGVzIHwKfC0tLXwtLS18LS0tfAp8IGBhZ2VudC1za2lsbCBpbnN0YWxsIFstLXRhcmdldD1E" + - "SVJdYCB8IEluc3RhbGwgYWxsIGJ1bmRsZWQgcHVibGljIHVzZXIgc2tpbGxzIGludG8gYH4vLmNs" + - "YXVkZS9za2lsbHMvYCBhbmQgYH4vLmFnZW50cy9za2lsbHMvYCB8IERlZmF1bHQ6IGJvdGggYmFz" + - "ZSBza2lsbHMgZGlyZWN0b3JpZXMgfAp8IGBhZ2VudC1za2lsbCB1bmluc3RhbGwgWy0tdGFyZ2V0" + - "PURJUl1gIHwgUmVtb3ZlIG9ubHkgYnVuZGxlZCBwdWJsaWMgdXNlciBza2lsbHMgZnJvbSB0aGUg" + - "dGFyZ2V0IGJhc2Ugc2tpbGxzIGRpcmVjdG9yaWVzIHwgSWRlbXBvdGVudDsgdW5yZWxhdGVkIHNr" + - "aWxscyByZW1haW4gfAp8IGBhZ2VudC1za2lsbCBzaG93IFstLWZpbGU9UkVMXWAgfCBQcmludCBi" + - "dW5kbGVkIGBudmNmLXNlbGYtbWFuYWdlZC1jbGkvU0tJTEwubWRgIG9yIGFub3RoZXIgZW1iZWRk" + - "ZWQgZmlsZSB8IEZvciBkZWJ1Z2dpbmcgfAp8IGBhZ2VudC1za2lsbCB2ZXJzaW9uYCB8IFByaW50" + - "IGJ1aWxkIFNIQSBhbmQgZW1iZWRkZWQgcHVibGljIHVzZXIgc2tpbGwgc3VtbWFyeSB8IHwKUEsH" + - "CHIND2QhIwAAISMAAFBLAwQUAAgAAAAAACEAAAAAAAAAAAAAAAAAMgAJAGRhdGEvbnZjZi1zZWxm" + - "LW1hbmFnZWQtY2xpL3JlZmVyZW5jZS9leGl0LWNvZGVzLm1kVVQFAAEAps4SIyBgbnZjZi1jbGlg" + - "IGV4aXQgY29kZXMKClN0YWJsZSBhY3Jvc3Mgc3ViY29tbWFuZHMuIFVzZSB0aGVzZSB0byBkcml2" + - "ZSBhZ2VudCByZXRyeSAvIHN1cmZhY2luZyBsb2dpYy4KCnwgQ29kZSB8IE1lYW5pbmcgfCBFeGFt" + - "cGxlIGNhdXNlcyB8CnwtLS18LS0tfC0tLXwKfCBgMGAgfCBTdWNjZXNzIHwgQWxsIGNoZWNrcyBw" + - "YXNzZWQ7IGluc3RhbGwgY29tcGxldGVkOyBkZXBsb3ltZW50IEFDVElWRSB8CnwgYDFgIHwgR2Vu" + - "ZXJpYyBlcnJvciB8IEhlbG0gcmVuZGVyIGZhaWxlZDsgbmV0d29yayB1bnJlYWNoYWJsZTsgZmls" + - "ZSBub3QgZm91bmQ7IFlBTUwgcGFyc2UgZXJyb3IgfAp8IGAyYCB8IFByZS1mbGlnaHQgY2hlY2sg" + - "ZmFpbGVkIHwgR2F0ZXdheSBBUEkgQ1JEcyBtaXNzaW5nOyBrdWJlY3RsIG5vdCBvbiBQQVRIOyBk" + - "ZWZhdWx0IFN0b3JhZ2VDbGFzcyBhYnNlbnQgfAp8IGAzYCB8IEFkbWluIGF1dGggZmFpbGVkIHwg" + - "Tm8gdG9rZW4gKyBgLS1ub24taW50ZXJhY3RpdmVgIHNldDsgSUNNUyByZWplY3RlZCBKV1Q7IGlu" + - "aXQgZW5kcG9pbnQgdW5yZWFjaGFibGUgfAp8IGA1YCB8IE1hbmlmZXN0IGFwcGx5IG9yIGAtLXdh" + - "aXRgIHRpbWVkIG91dCB8IEhlbG0gaW5zdGFsbCB0aW1lb3V0OyBjaGVjayBwb2xsZWQgYnV0IGRp" + - "ZG4ndCBwYXNzIGJlZm9yZSBkdXJhdGlvbiB8CnwgYDEzMGAgfCBDYW5jZWxsZWQgYnkgU0lHSU5U" + - "L1NJR1RFUk0gfCBVc2VyIEN0cmwtQzsgQ0kgYnVkZ2V0IGV4Y2VlZGVkOyBwb2QgZXZpY3RlZCB8" + - "CgojIyBIb3cgYW4gYWdlbnQgc2hvdWxkIHJlYWN0Cgp8IENvZGUgfCBBZ2VudCBiZWhhdmlvciB8" + - "CnwtLS18LS0tfAp8IGAwYCB8IENvbnRpbnVlIC8gcmVwb3J0IHN1Y2Nlc3MuIHwKfCBgMWAgfCBT" + - "dXJmYWNlIHN0ZGVyciB0byB1c2VyOyBhc2sgYmVmb3JlIGFueSByZXRyeS4gR2VuZXJpYyBlcnJv" + - "cnMgdXN1YWxseSBuZWVkIGEgaHVtYW4gdG8gcmVhZCB0aGUgbWVzc2FnZS4gfAp8IGAyYCB8IFN1" + - "cmZhY2UgZmFpbGVkIGNoZWNrcyArIHRoZWlyIGBoaW50VVJMYC4gRG9uJ3QgcHJvcG9zZSBgdXBg" + - "IHVudGlsIHRoZSB1c2VyIGZpeGVzIHByZXJlcXMuIHwKfCBgM2AgfCBTdWdnZXN0IGBudmNmLWNs" + - "aSBpbml0YCAoaW50ZXJhY3RpdmUpIE9SIGAtLXRva2VuPSRKV1RgIChDSSkuIERvbid0IGF1dG8t" + - "bWludCB3aXRob3V0IHVzZXIgT0suIHwKfCBgNWAgfCBBc2sgdXNlciBpZiB0aGV5IHdhbnQgdG8g" + - "d2FpdCBsb25nZXIsIGRpZyBpbnRvIHRoZSBzdGFsbGVkIGNvbXBvbmVudCwgb3IgY2FuY2VsLiB8" + - "CnwgYDEzMGAgfCBEb24ndCByZXRyeSBhdXRvbWF0aWNhbGx5OyB1c2VyIGV4cGxpY2l0bHkgY2Fu" + - "Y2VsbGVkLiBDb25maXJtIGJlZm9yZSByZS1ydW5uaW5nLiB8CgojIyBXaGVyZSB0byBmaW5kIG1v" + - "cmUgZGV0YWlsCgpFdmVyeSBub24temVybyBleGl0IGVtaXRzIGEgc3RydWN0dXJlZCBgcGhhc2Vf" + - "ZmFpbGVkYCBKU09OIGV2ZW50IHdpdGggYGVyckNhdGVnb3J5YCwgYGVyck1lc3NhZ2VgLCBgcmVt" + - "ZWRpYXRpb25gIChhcnJheSksIGByZXRyeUNsYXNzYCAoZW51bTogYG5vbmV8aW1tZWRpYXRlfGJh" + - "Y2tvZmZ8YWZ0ZXJfcmVtZWRpYXRpb258dW5rbm93bmApLCBgcmV0cnlBZnRlclNlY2AgKGludCwg" + - "b3B0aW9uYWwpLCBhbmQgYHJhd2AgKHN1YnByb2Nlc3MgKyBIVFRQICsgS3ViZXJuZXRlcyBzaWdu" + - "YWwpLiBBbHdheXMgY29uc3VtZSB0aGVzZSBpbiBgLS1qc29uYCBtb2RlIHJhdGhlciB0aGFuIHBh" + - "cnNpbmcgRW5nbGlzaCBmcm9tIHN0ZGVyci4KUEsHCHOnWmTVBgAA1QYAAFBLAwQUAAgAAAAAACEA" + - "AAAAAAAAAAAAAAAALQAJAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL3JlZmVyZW5jZS9mbGFn" + - "cy5tZFVUBQABAKbOEiMgYG52Y2YtY2xpYCBmbGFnIHJlZmVyZW5jZQoKIyMgR2xvYmFsIGZsYWdz" + - "IChldmVyeSBzdWJjb21tYW5kKQoKfCBGbGFnIHwgUHVycG9zZSB8IERlZmF1bHQgfAp8LS0tfC0t" + - "LXwtLS18CnwgYC0tY29uZmlnIEZJTEVgIHwgQ29uZmlnIGZpbGUgcGF0aCB8IGAkSE9NRS8ubnZj" + - "Zi1jbGkueWFtbGAgfAp8IGAtLWRlYnVnYCB8IFZlcmJvc2UgSFRUUCBsb2dnaW5nIG9uIHN0ZGVy" + - "ciB8IGBmYWxzZWAgfAp8IGAtLWpzb25gIHwgSlNPTkwgZXZlbnRzIG9uIHN0ZGVyciB8IGF1dG8g" + - "KG9mZiBpbiBUVFksIG9uIHVuZGVyIGAtLW5vbi1pbnRlcmFjdGl2ZWApIHwKCiMjIGBzZWxmLWhv" + - "c3RlZGAgcGFyZW50IChwZXJzaXN0ZW50IGFjcm9zcyBzdWJjb21tYW5kcykKCnwgRmxhZyB8IFB1" + - "cnBvc2UgfCBEZWZhdWx0IHwKfC0tLXwtLS18LS0tfAp8IGAtLWNvbnRyb2wtcGxhbmUtc3RhY2s9" + - "4oCmYCB8IENvbnRyb2wtcGxhbmUgYnVuZGxlIHNvdXJjZTogbG9jYWwgcGF0aCwgZ2l0IFVSTCwg" + - "b3IgYG9jaTovL2AgVVJMIHwgZW1iZWRkZWQgT0NJIFVSTCBwaW5uZWQgYnkgQ0xJIHZlcnNpb24g" + - "fAp8IGAtLWNvbXB1dGUtcGxhbmUtc3RhY2s94oCmYCB8IENvbXB1dGUtcGxhbmUgYnVuZGxlIHNv" + - "dXJjZTogbG9jYWwgcGF0aCwgZ2l0IFVSTCwgb3IgYG9jaTovL2AgVVJMIHwgZW1iZWRkZWQgT0NJ" + - "IFVSTCBwaW5uZWQgYnkgQ0xJIHZlcnNpb24gfAp8IGAtLWVudj1sb2NhbFx8cHJkXHzigKZgIHwg" + - "SGVsbWZpbGUgZW52aXJvbm1lbnQgbmFtZSB8IGBsb2NhbGAgZm9yIGRldiBidWlsZHMsIGBwcmRg" + - "IGZvciByZWxlYXNlcyB8CnwgYC0tbm9uLWludGVyYWN0aXZlYCB8IERpc2FibGUgYWxsIHN0ZGlu" + - "IHByb21wdHMgfCBgZmFsc2VgIHwKfCBgLS10b2tlbj0kSldUYCB8IEFkbWluIEpXVCwgb3ZlcnJp" + - "ZGVzIHN0b3JlZCBzZXNzaW9uIHwgLSB8CnwgYC0tbm8tYXBwbHlgIHwgYGluc3RhbGxgIG9ubHkg" + - "LSBlbWl0IFlBTUwsIGRvIG5vdCBrdWJlY3RsIGFwcGx5IHwgYGZhbHNlYCB8CnwgYC0tb3V0cHV0" + - "PXRleHRcfGpzb25gIHwgTGVnYWN5IGFsaWFzIGZvciBgLS1qc29uYCAoZGVwcmVjYXRlZCwgcmVt" + - "b3ZlZCBpbiBuZXh0IG1ham9yKSB8IGB0ZXh0YCB8CnwgYC0tcGxhaW5gIHwgRm9yY2UgcGxhaW4g" + - "c3RyZWFtaW5nIG91dHB1dCB8IGF1dG8tZGV0ZWN0IHwKfCBgLS13YWl0IERVUkFUSU9OYCB8IGBj" + - "aGVja2Agb25seTsgYmxvY2sgdW50aWwgcGFzcyB8IC0gfAp8IGAtLWNvbnRyb2wtcGxhbmUtY29u" + - "dGV4dCBDVFhgIHwga3ViZWN0bCBjb250ZXh0IGZvciBjb250cm9sIHBsYW5lIChSRVEtMjApIHwg" + - "Y3VycmVudCBjb250ZXh0IHwKfCBgLS1jb21wdXRlLXBsYW5lLWNvbnRleHQgQ1RYYCB8IGt1YmVj" + - "dGwgY29udGV4dCBmb3IgY29tcHV0ZSBwbGFuZSAoUkVRLTIwKSB8IGN1cnJlbnQgY29udGV4dCB8" + - "CnwgYC0taWNtcy11cmwgVVJMYCB8IFB1YmxpYyBJQ01TIFVSTDsgcmVxdWlyZWQgd2hlbiBjb250" + - "ZXh0cyBkaWZmZXIgfCBkZXJpdmVkIGZyb20gYGJhc2VfaHR0cF91cmxgIHwKfCBgLS1sb2NhbC1v" + - "bmx5YCB8IGBjaGVjayAtLXByZWAgb25seTsgc2tpcCBhbGwga3ViZWN0bCBjb250YWN0IHwgYGZh" + - "bHNlYCB8CgojIyBgY2hlY2tgLXNwZWNpZmljCgpBdCBsZWFzdCBvbmUgb2YgYC0tcHJlYCwgYC0t" + - "Y29udHJvbC1wbGFuZWAsIGAtLWNvbXB1dGUtcGxhbmVgLCBvciBgLS1hbGxgIGlzCnJlcXVpcmVk" + - "LiBFYWNoIHNlbGVjdHMgYSByb2xlOyBvbmx5IHRoZSBzZWxlY3RlZCByb2xlcyBjb250YWN0IGEg" + - "Y2x1c3Rlci4KCnwgRmxhZyB8IFB1cnBvc2UgfCBEZWZhdWx0IHwKfC0tLXwtLS18LS0tfAp8IGAt" + - "LXByZWAgfCBQcmUtZmxpZ2h0OiBsb2NhbC1ob3N0IHRvb2xzIHBsdXMgY2x1c3RlciByZWFkaW5l" + - "c3MgfCBgZmFsc2VgIHwKfCBgLS1jb250cm9sLXBsYW5lYCB8IENvbnRyb2wtcGxhbmUgY2hlY2tz" + - "IHwgYGZhbHNlYCB8CnwgYC0tY29tcHV0ZS1wbGFuZWAgfCBDb21wdXRlLXBsYW5lIGNoZWNrcyB8" + - "IGBmYWxzZWAgfAp8IGAtLWFsbGAgfCBFdmVyeSBjYXRlZ29yeSB8IGBmYWxzZWAgfAp8IGAtLWNs" + - "dXN0ZXItbmFtZSBOQU1FYCB8IENsdXN0ZXIgbmFtZSBmb3IgY29tcHV0ZS1wbGFuZSBjaGVja3Mg" + - "fCAtIHwKfCBgLS1za2lwLWlub3RpZnktY2hlY2tgIHwgU2tpcCB0aGUgcGVyLW5vZGUgaW5vdGlm" + - "eS1saW1pdHMgcHJvYmUuIE5lZWRlZCB3aGVuIHRoZSBrdWJlY29uZmlnIHVzZXIgY2Fubm90IGNy" + - "ZWF0ZSBwb2RzIGluIGBkZWZhdWx0YC4gRW52OiBgTlZDRl9DTElfU0VMRkhPU1RFRF9TS0lQX0lO" + - "T1RJRllgIHwgYGZhbHNlYCB8CgojIyMgQ2x1c3Rlci12YWxpZGF0b3IgZmxhZ3MKClRoZSB2YWxp" + - "ZGF0b3IgcnVucyBhcyBhIEpvYiBpbiB0aGUgY2x1c3RlciBiZWluZyBjaGVja2VkLiBUaGUgQ0xJ" + - "IGNyZWF0ZXMgYQpTZXJ2aWNlQWNjb3VudCwgQ2x1c3RlclJvbGUsIGFuZCBDbHVzdGVyUm9sZUJp" + - "bmRpbmcgZm9yIGl0IGFuZCByZW1vdmVzIHRoZW0KYWZ0ZXIgdGhlIHJ1biwgc28gdGhlIGt1YmVj" + - "b25maWcgY29udGV4dCBuZWVkcyBwZXJtaXNzaW9uIHRvIG1hbmFnZSB0aG9zZS4KCnwgRmxhZyB8" + - "IFB1cnBvc2UgfCBEZWZhdWx0IHwKfC0tLXwtLS18LS0tfAp8IGAtLWNsdXN0ZXItdmFsaWRhdG9y" + - "LWltYWdlIFJFRmAgfCBWYWxpZGF0b3IgaW1hZ2UuIFJlc29sdXRpb24gb3JkZXI6IGZsYWcsIGBO" + - "VkNGX0NMSV9DTFVTVEVSX1ZBTElEQVRPUl9JTUFHRWAsIGNvbmZpZyBrZXkgYGNsdXN0ZXJfdmFs" + - "aWRhdG9yX2ltYWdlYC4gQSByZWYgd2l0aCBubyB0YWcgZGlzY292ZXJzIHRoZSBsYXRlc3Qgc3Rh" + - "YmxlIHRhZyBmcm9tIHRoZSByZWdpc3RyeS4gVW5zZXQgZXZlcnl3aGVyZSBza2lwcyB0aGUgcHJv" + - "YmUgd2l0aCBhIHdhcm5pbmcgfCAtIHwKfCBgLS1jbHVzdGVyLXZhbGlkYXRvci1yZWdpc3RyaWVz" + - "IGhvc3Q6cG9ydCwuLi5gIHwgRXh0cmEgcmVnaXN0cmllcyB0aGUgY29udHJvbC1wbGFuZSB2YWxp" + - "ZGF0b3IgcHJvYmVzIGZvciByZWFjaGFiaWxpdHkuIGBudmNyLmlvYCBpcyBhbHdheXMgcHJvYmVk" + - "LiBSZXBlYXRhYmxlIG9yIGNvbW1hLXNlcGFyYXRlZC4gRW52OiBgTlZDRl9DTElfQ0xVU1RFUl9W" + - "QUxJREFUT1JfUkVHSVNUUklFU2A7IGNvbmZpZyBrZXkgYGNsdXN0ZXJfdmFsaWRhdG9yX3JlZ2lz" + - "dHJpZXNgIHwgYG52Y3IuaW9gIG9ubHkgfAp8IGAtLWNsdXN0ZXItdmFsaWRhdG9yLXB1bGwtc2Vj" + - "cmV0IE5BTUVgIHwgZG9ja2VyLXJlZ2lzdHJ5IFNlY3JldCBpbiBgZGVmYXVsdGAgdXNlZCB0byBw" + - "dWxsIHRoZSB2YWxpZGF0b3IgaW1hZ2UuIFdoZW4gZW1wdHksIHRoZSBDTEkgbG9va3MgZm9yIG9u" + - "ZSBpbiB0aGUgTlZDRiBuYW1lc3BhY2VzIGFuZCBmYWxscyBiYWNrIHRvIG1pbnRpbmcgb25lIGZy" + - "b20gYE5HQ19BUElfS0VZYCB8IGF1dG8tZGV0ZWN0IHwKfCBgLS1za2lwLWNsdXN0ZXItdmFsaWRh" + - "dGlvbmAgfCBTa2lwIHRoZSBpbi1jbHVzdGVyIHZhbGlkYXRvciBwcm9iZSBlbnRpcmVseS4gRW52" + - "OiBgTlZDRl9DTElfU0VMRkhPU1RFRF9TS0lQX0NMVVNURVJfVkFMSURBVElPTmAgfCBgZmFsc2Vg" + - "IHwKfCBgLS1uby1jbGVhbnVwYCB8IEtlZXAgdGhlIHZhbGlkYXRvciBKb2IgKGFuZCBpdHMgUkJB" + - "QykgYWZ0ZXIgdGhlIHJ1biBmb3IgZGVidWdnaW5nLiBUaGUgbmV4dCBydW4gc3RpbGwgc3dlZXBz" + - "IHByaW9yIEpvYnMgfCBgZmFsc2VgIHwKfCBgLS1zaG93LWxvZ3NgIHwgUHJpbnQgdGhlIHZhbGlk" + - "YXRvciB0cmFuc2NyaXB0IHRvIHN0ZGVyciBhZnRlciB0aGUgY2hlY2sgZXZlbnRzLiBUaGUgdHJh" + - "bnNjcmlwdCBpcyBub3QgSlNPTiwgYW5kIGAtLWpzb25gIGFsc28gd3JpdGVzIHRvIHN0ZGVyciwg" + - "c28gbGVhdmUgdGhpcyBvZmYgd2hlbiBhIHBhcnNlciBpcyByZWFkaW5nIHRoZSBzdHJlYW0gfCBg" + - "ZmFsc2VgIHwKCiMjIGB1cGAtc3BlY2lmaWMKCnwgRmxhZyB8IFB1cnBvc2UgfCBEZWZhdWx0IHwK" + - "fC0tLXwtLS18LS0tfAp8IGAtLWNsdXN0ZXItbmFtZSBOQU1FYCB8IElDTVMgY2x1c3RlciByb3cg" + - "aWRlbnRpZmllciAocmVxdWlyZWQpIHwgLSB8CnwgYC0tbmNhLWlkIElEYCB8IE5DQSBhY2NvdW50" + - "IElEIHwgYG52Y2YtZGVmYXVsdGAgfAp8IGAtLXJlZ2lvbiBSRUdJT05gIHwgQ2x1c3RlciByZWdp" + - "b24gfCBgdXMtd2VzdC0xYCB8CnwgYC0tcGxhbi1vbmx5YCB8IERyeS1ydW47IGVtaXQgcGhhc2Ug" + - "cGxhbiArIEVUQXMgd2l0aG91dCBjaGFuZ2VzIHwgYGZhbHNlYCB8CgojIyBgc3RhdHVzYC1zcGVj" + - "aWZpYwoKfCBGbGFnIHwgUHVycG9zZSB8IERlZmF1bHQgfAp8LS0tfC0tLXwtLS18CnwgYC0tY2x1" + - "c3Rlci1uYW1lIE5BTUVgIHwgTGltaXQgdG8gb25lIGNvbXB1dGUgcGxhbmUgfCAtIChjb250cm9s" + - "ICsgYWxsIGNsdXN0ZXJzKSB8CnwgYC0td2F0Y2hgIHwgTGl2ZSByZS1yZW5kZXIgfCBgZmFsc2Vg" + - "IHwKfCBgLS13YXRjaC1pbnRlcnZhbCBEVVJgIHwgYC0td2F0Y2hgIGNhZGVuY2UgfCBgNXNgIHwK" + - "fCBgLS1jb21wb25lbnQgTkFNRWAgfCBGaWx0ZXIgY29tcG9uZW50cyBwYW5lbCB8IGFsbCB8Cnwg" + - "YC0tbm8tZXZlbnRzYCB8IFNraXAgZXZlbnRzIHBhbmVsIHwgYGZhbHNlYCB8CgojIyBgY2x1c3Rl" + - "ciByZWdpc3RlcmAtc3BlY2lmaWMKCnwgRmxhZyB8IFB1cnBvc2UgfCBEZWZhdWx0IHwKfC0tLXwt" + - "LS18LS0tfAp8IGAtLW5hbWUgTkFNRWAgfCBDbHVzdGVyIG5hbWUgKHJlcXVpcmVkKSB8IC0gfAp8" + - "IGAtLW5jYS1pZCBJRGAgfCBOQ0EgSUQgKHJlcXVpcmVkKSB8IC0gfAp8IGAtLXJlZ2lvbiBSRUdJ" + - "T05gIHwgUmVnaW9uIHwgYHVzLXdlc3QtMWAgfAp8IGAtLWljbXMtdXJsIFVSTGAgfCBJQ01TIGVu" + - "ZHBvaW50IHwgZnJvbSBjb25maWcgfAp8IGAtLWlnbm9yZS1leGlzdGluZ2AgfCBNYXRjaC1vci1j" + - "cmVhdGUgaW5zdGVhZCBvZiBmYWlsLW9uLWV4aXN0cyB8IGBmYWxzZWAgfAoKIyMgYGFwaS1rZXkg" + - "Z2VuZXJhdGVgLXNwZWNpZmljCgp8IEZsYWcgfCBQdXJwb3NlIHwgRGVmYXVsdCB8CnwtLS18LS0t" + - "fC0tLXwKfCBgLS1mb3IgZnVuY3Rpb25cfHRhc2tgIHwgR2VuZXJhdGUgb25seSB0aGUgc3BlY2lm" + - "aWVkIGtleSB0eXBlIHwgKG9taXQgdG8gZ2VuZXJhdGUgYm90aCkgfAp8IGAtLWRlc2NyaXB0aW9u" + - "IFRFWFRgIHwgSHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIHRoZSBrZXkgfCBgR2VuZXJhdGVkIGJ5" + - "IG52Y2YtY2xpYCB8CnwgYC0tZXhwaXJlcy1pbiBEVVJBVElPTmAgfCBFeHBpcnkgb2Zmc2V0IChl" + - "LmcuIGAyNGhgLCBgN2RgKTsgcGFyc2VkIGFzIGV4dGVuZGVkIGR1cmF0aW9uIHwgYDI0aGAgfAp8" + - "IGAtLXNjb3BlcyBTQ09QRVssU0NPUEVdYCB8IE92ZXJyaWRlIGRlZmF1bHQgc2NvcGVzOyByZXF1" + - "aXJlcyBgLS1mb3JgIHwgKHNlcnZpY2UgZGVmYXVsdHMpIHwKfCBgLS12YWxpZGF0ZWAgfCBWYWxp" + - "ZGF0ZSBlYWNoIGdlbmVyYXRlZCBrZXkgaW1tZWRpYXRlbHkgYWZ0ZXIgbWludGluZyB8IGBmYWxz" + - "ZWAgfAoKRXh0ZW5kZWQgZHVyYXRpb24gdW5pdHM6IGBzYCAoc2Vjb25kcyksIGBtYCAobWludXRl" + - "cyksIGBoYCAoaG91cnMpLCBgZGAgKGRheXMpLCBgd2AgKHdlZWtzKS4KCiMjIGBmdW5jdGlvbiBj" + - "cmVhdGVgLXNwZWNpZmljCgpgLS1pbnB1dC1maWxlIEZJTEVgIGlzIHJlY29tbWVuZGVkIGZvciBy" + - "ZXBlYXRhYmxlIGZ1bmN0aW9uIGRlZmluaXRpb25zLiBGb3IgYWQtaG9jIGNyZWF0ZXM6Cgp8IEZs" + - "YWcgfCBQdXJwb3NlIHwgRGVmYXVsdCB8CnwtLS18LS0tfC0tLXwKfCBgLS1uYW1lIE5BTUVgIHwg" + - "RnVuY3Rpb24gbmFtZSB8IC0gfAp8IGAtLWltYWdlIElNQUdFYCB8IENvbnRhaW5lciBpbWFnZSB8" + - "IC0gfAp8IGAtLWluZmVyZW5jZS11cmwgVVJJYCB8IENvbnRhaW5lciBpbmZlcmVuY2UgZW5kcG9p" + - "bnQgfCAtIHwKfCBgLS1pbmZlcmVuY2UtcG9ydCBQT1JUYCB8IENvbnRhaW5lciBpbmZlcmVuY2Ug" + - "cG9ydCB8IC0gfAp8IGAtLWZ1bmN0aW9uLXR5cGUgREVGQVVMVFx8U1RSRUFNSU5HXHxMTE1gIHwg" + - "RnVuY3Rpb24gdHlwZSB8IGBERUZBVUxUYCB8CnwgYC0taGVsbS1jaGFydCBDSEFSVGAgfCBIZWxt" + - "IGNoYXJ0IFVSTCBvciBPQ0kgcmVmZXJlbmNlLiBDYW4gYmUgdXNlZCB3aXRoIGAtLWZ1bmN0aW9u" + - "LXR5cGU9TExNYCBmb3IgY2hhcnQtcGFja2FnZWQgTExNIHdvcmtsb2Fkcy4gfCAtIHwKfCBgLS1o" + - "ZWxtLWNoYXJ0LXNlcnZpY2UgTkFNRWAgfCBLdWJlcm5ldGVzIFNlcnZpY2UgbmFtZSBleHBvc2Vk" + - "IGJ5IHRoZSBjaGFydC4gUmVxdWlyZWQgd2hlbiBgLS1oZWxtLWNoYXJ0YCBpcyBzZXQuIHwgLSB8" + - "CnwgYC0tbW9kZWxzIE5BTUU6VkVSU0lPTjpVUklgIHwgU3RhbmRhcmQgbW9kZWwgYXJ0aWZhY3Q7" + - "IHJlcGVhdGFibGUgfCAtIHwKfCBgLS1sbG0tbW9kZWwgU1BFQ2AgfCBMTE0gbW9kZWwgY29uZmln" + - "OyBmb3JtYXQgYG5hbWU9PG1vZGVsPix1cmlzPTx1cmk+XHw8dXJpPixyb3V0aW5nTWV0aG9kPTxt" + - "ZXRob2Q+LHRva2VuUmF0ZUxpbWl0PTxsaW1pdD5gOyByZXBlYXRhYmxlLiBUb2tlbiBsaW1pdHMg" + - "dXNlIGA8dmFsdWU+LTx1bml0PmAgd2l0aCBgU2AsIGBNYCwgYEhgLCBgRGAsIG9yIGBXYCwgZm9y" + - "IGV4YW1wbGUgYDEwMDAtU2AuIFVzZSBpbnB1dCBKU09OIGZvciBjb21iaW5lZCB0b2tlbiBsaW1p" + - "dHMgYmVjYXVzZSBpbmxpbmUgc3BlY3MgdXNlIGNvbW1hcyBhcyBmaWVsZCBzZXBhcmF0b3JzLiB8" + - "IC0gfAp8IGAtLWxsbS1kZWZhdWx0LXByaW9yaXR5IFBSSU9SSVRZYCB8IEZ1bmN0aW9uLWxldmVs" + - "IGRlZmF1bHQgcmVxdWVzdCBwcmlvcml0eS4gTG93ZXIgdmFsdWVzIGhhdmUgaGlnaGVyIHByaW9y" + - "aXR5LiB8IC0gfAp8IGAtLWxsbS1wZXItYWNjb3VudC1wcmlvcml0eSBOQ0EtSUQ6UFJJT1JJVFlg" + - "IHwgUGVyLWFjY291bnQgcHJpb3JpdHkgb3ZlcnJpZGU7IHJlcGVhdGFibGU7IHN1cHBvcnRzIHVw" + - "IHRvIDY0IGRpc3RpbmN0IE5DQSBJRCBvdmVycmlkZXMuIFJlcXVpcmVzIGEgZGVmYXVsdCBwcmlv" + - "cml0eS4gfCAtIHwKCkluIEpTT04gYW5kIGlubGluZSBzcGVjcywgTExNIGZ1bmN0aW9ucyBzZXQg" + - "YGZ1bmN0aW9uVHlwZTogIkxMTSJgIGFuZCBtb2RlbCByb3V0aW5nIG1ldGFkYXRhIHVuZGVyIGBt" + - "b2RlbHNbXS5sbG1Db25maWdgLiBgbGxtQ29uZmlnLnVyaXNgIGRlY2xhcmVzIHRoZSBPcGVuQUkt" + - "Y29tcGF0aWJsZSB1cHN0cmVhbSBwYXRocyBleHBvc2VkIGJ5IHRoZSBtb2RlbC4gQ3VycmVudCBz" + - "dXBwb3J0ZWQgcGF0aHMgYXJlIGAvdjEvY2hhdC9jb21wbGV0aW9uc2AsIGAvdjEvcmVzcG9uc2Vz" + - "YCwgYW5kIGAvdjEvZW1iZWRkaW5nc2AuIGBsbG1Db25maWcucm91dGluZ01ldGhvZGAgYWNjZXB0" + - "cyBgcm91bmRfcm9iaW5gLCBgcG93ZXJfb2ZfdHdvYCwgYGdyb3FfbXVsdGlyZWdpb25gLCBgcHVs" + - "c2FyYCwgb3IgYHJhbmRvbWAuCmBsbG1Db25maWcudG9rZW5SYXRlTGltaXRgIGFjY2VwdHMgb25l" + - "IG9yIG1vcmUgY29tbWEtc2VwYXJhdGVkIHBvc2l0aXZlIGludGVnZXIgdG9rZW4gbGltaXRzIGlu" + - "IGA8dmFsdWU+LTx1bml0PmAgZm9ybWF0LiBTdXBwb3J0ZWQgdW5pdHMgYXJlIGBTYCAoc2Vjb25k" + - "cyksIGBNYCAobWludXRlcyksIGBIYCAoaG91cnMpLCBgRGAgKGRheXMpLCBhbmQgYFdgICh3ZWVr" + - "cykuIFVzZSBkaXN0aW5jdCB1bml0cyB3aGVuIGNvbWJpbmluZyBsaW1pdHMsIGZvciBleGFtcGxl" + - "IGAxMDAwLVMsNTAwMC1NLDEwMDAwMC1ILDUwMDAwMC1ELDEwMDAwMDAtV2AgaW4gaW5wdXQgSlNP" + - "Ti4KCkhlbG0gY2hhcnQgcGFja2FnaW5nIGlzIGluZGVwZW5kZW50IG9mIGBmdW5jdGlvblR5cGVg" + - "LiBGb3IgYSBIZWxtLWNoYXJ0IGJhY2tlZCBMTE0gZnVuY3Rpb24sIHNldCBgZnVuY3Rpb25UeXBl" + - "OiAiTExNImAsIGBoZWxtQ2hhcnRgLCBgaGVsbUNoYXJ0U2VydmljZU5hbWVgLCBhbmQgYG1vZGVs" + - "c1tdLmxsbUNvbmZpZ2AgaW4gdGhlIHNhbWUgY3JlYXRlIHJlcXVlc3QuIGBpbmZlcmVuY2VQb3J0" + - "YCBtdXN0IGJlIHRoZSBLdWJlcm5ldGVzIFNlcnZpY2UgcG9ydCBleHBvc2VkIGJ5IGBoZWxtQ2hh" + - "cnRTZXJ2aWNlTmFtZWAuCgpMTE0gaW52b2NhdGlvbiByZXF1ZXN0cyB1c2UgYG1vZGVsOiAiPGZ1" + - "bmN0aW9uLWlkPi88bW9kZWwtbmFtZT4iYC4gVGhlIGZ1bmN0aW9uIElEIHNlbGVjdHMgdGhlIE5W" + - "Q0YgZnVuY3Rpb24sIGFuZCB0aGUgbW9kZWwgbmFtZSBpcyBmb3J3YXJkZWQgdXBzdHJlYW0uIENo" + - "YXQgY29tcGxldGlvbnMgYW5kIFJlc3BvbnNlcyBBUEkgcmVxdWVzdHMgY2FuIHVzZSBgeC1tdWx0" + - "aS10dXJuLXNlc3Npb24taWRgIGZvciBzZXNzaW9uIHN0aWNraW5lc3M7IGVtYmVkZGluZ3MgcmVx" + - "dWVzdHMgZG8gbm90LgoKIyMgYGZ1bmN0aW9uIHVwZGF0ZWAtc3BlY2lmaWMKCnwgRmxhZyB8IFB1" + - "cnBvc2UgfCBEZWZhdWx0IHwKfC0tLXwtLS18LS0tfAp8IGAtLXRhZ3MgVEFHWyxUQUddYCB8IFJl" + - "cGxhY2UgZnVuY3Rpb24gdGFncyB8IC0gfAp8IGAtLWxsbS1tb2RlbC11cGRhdGUgU1BFQ2AgfCBM" + - "TE0gbW9kZWwgdXBkYXRlOyBmb3JtYXQgYG5hbWU9PG1vZGVsPixyb3V0aW5nTWV0aG9kPTxtZXRo" + - "b2Q+LHRva2VuUmF0ZUxpbWl0PTxsaW1pdD5gOyByZXBlYXRhYmxlLiBSb3V0aW5nIG1ldGhvZHMg" + - "bWF0Y2ggYC0tbGxtLW1vZGVsYC4gVG9rZW4gbGltaXQgZXhhbXBsZTogYDEwMDAtU2AuIFVzZSBp" + - "bnB1dCBKU09OIGZvciBjb21iaW5lZCB0b2tlbiBsaW1pdHMuIHwgLSB8CnwgYC0tbGxtLWRlZmF1" + - "bHQtcHJpb3JpdHkgUFJJT1JJVFlgIHwgUmVwbGFjZSB0aGUgZnVuY3Rpb24tbGV2ZWwgcHJpb3Jp" + - "dHkgY29uZmlndXJhdGlvbiB3aXRoIHRoaXMgZGVmYXVsdCBhbmQgYW55IHN1cHBsaWVkIHBlci1h" + - "Y2NvdW50IG92ZXJyaWRlcy4gfCAtIHwKfCBgLS1sbG0tcGVyLWFjY291bnQtcHJpb3JpdHkgTkNB" + - "LUlEOlBSSU9SSVRZYCB8IFBlci1hY2NvdW50IHByaW9yaXR5IG92ZXJyaWRlOyByZXBlYXRhYmxl" + - "OyBzdXBwb3J0cyB1cCB0byA2NCBkaXN0aW5jdCBOQ0EgSUQgb3ZlcnJpZGVzLiBSZXF1aXJlcyBh" + - "IGRlZmF1bHQgcHJpb3JpdHkuIHwgLSB8CgpJbiBKU09OLCBgZnVuY3Rpb24gdXBkYXRlYCBhY2Nl" + - "cHRzIGBtb2RlbFVwZGF0ZXNbXWAgZW50cmllcyB3aXRoIGBtb2RlbE5hbWVgIGFuZCBgbGxtQ29u" + - "ZmlnLnJvdXRpbmdNZXRob2RgIGFuZC9vciBgbGxtQ29uZmlnLnRva2VuUmF0ZUxpbWl0YC4gYHVy" + - "aXNgIGFyZSBjcmVhdGUtdGltZSBtb2RlbCBtZXRhZGF0YSBhbmQgYXJlIG5vdCBwYXJ0IG9mIG1v" + - "ZGVsIHVwZGF0ZXMuCgojIyBgZnVuY3Rpb24gZGVwbG95IGNyZWF0ZWAtc3BlY2lmaWMKCmAtLWlu" + - "cHV0LWZpbGUgRklMRWAgaXMgcmVjb21tZW5kZWQgKGZ1bGwgSlNPTiBzcGVjKS4gRm9yIGFkLWhv" + - "YyBvbmUtc2hvdCB1c2U6Cgp8IEZsYWcgfCBQdXJwb3NlIHwgRGVmYXVsdCB8CnwtLS18LS0tfC0t" + - "LXwKfCBgLS1mdW5jdGlvbi1pZCBJRGAgfCBGdW5jdGlvbiBJRCAocmVxdWlyZWQpIHwgLSB8Cnwg" + - "YC0tZ3B1IE5BTUVgIHwgR1BVIGZhbWlseSB8IGBIMTAwYCB8CnwgYC0taW5zdGFuY2UtdHlwZSBU" + - "WVBFYCB8IFNLVSB8IGBOQ1AuR1BVLkgxMDBfMXhgIHwKfCBgLS1taW4taW5zdGFuY2VzIE5gIHwg" + - "TWluIHJlcGxpY2FzIHwgYDFgIHwKfCBgLS1tYXgtaW5zdGFuY2VzIE5gIHwgTWF4IHJlcGxpY2Fz" + - "IHwgYDFgIHwKfCBgLS1tYXgtcmVxdWVzdC1jb25jdXJyZW5jeSBOYCB8IENvbmN1cnJlbmN5IHwg" + - "YDBgICh1bnNldDsgc2VydmVyIGRlZmF1bHQgYXBwbGllcykgfAp8IGAtLWNsdXN0ZXJzIE5BTUVb" + - "LE5BTUVdYCB8IFRhcmdldCBzcGVjaWZpYyBjb21wdXRlIGNsdXN0ZXJzIHwgKGFueSBtYXRjaGlu" + - "ZyBTS1UpIHwKCiMjIGB0YXNrIGNyZWF0ZWAtc3BlY2lmaWMKCmAtLWlucHV0LWZpbGUgRklMRWAg" + - "aXMgcmVjb21tZW5kZWQgZm9yIHJlcGVhdGFibGUgdGFzayBkZWZpbml0aW9ucy4gRm9yIGFkLWhv" + - "YyB1c2U6Cgp8IEZsYWcgfCBQdXJwb3NlIHwgTm90ZXMgfAp8LS0tfC0tLXwtLS18CnwgYC0tbmFt" + - "ZSBOQU1FYCB8IFRhc2sgbmFtZSAocmVxdWlyZWQpIHwgMS0xMjggY2hhcnMsIGBeW2EtejAtOUEt" + - "Wl1bYS16MC05QS1aXC1fXSokYCB8CnwgYC0tZ3B1IEdQVWAgfCBHUFUgbmFtZSAocmVxdWlyZWQg" + - "d2l0aG91dCBgLS1pbnB1dC1maWxlYCkgfCBFeGFtcGxlOiBgSDEwMGAgfAp8IGAtLWluc3RhbmNl" + - "LXR5cGUgVFlQRWAgfCBJbnN0YW5jZSB0eXBlIChyZXF1aXJlZCB3aXRob3V0IGAtLWlucHV0LWZp" + - "bGVgKSB8IEV4YW1wbGU6IGBOQ1AuR1BVLkgxMDBfMXhgIHwKfCBgLS1pbWFnZSBJTUFHRWAgfCBD" + - "b250YWluZXIgaW1hZ2UgfCBNdXR1YWxseSBleGNsdXNpdmUgd2l0aCBgLS1oZWxtLWNoYXJ0YCB8" + - "CnwgYC0taGVsbS1jaGFydCBDSEFSVGAgfCBIZWxtIGNoYXJ0IFVSTCBvciBPQ0kgcmVmZXJlbmNl" + - "IHwgTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYC0taW1hZ2VgIHwKfCBgLS1pbnB1dC1maWxlIEZJ" + - "TEVgIHwgSlNPTiB0YXNrIHNwZWMgZmlsZSB8IENMSSBmbGFncyBvdmVycmlkZSBKU09OIHZhbHVl" + - "cyB3aGVuIGJvdGggYXJlIHNldCB8CnwgYC0tYmFja2VuZCBCQUNLRU5EYCB8IEJhY2tlbmQgLyBD" + - "U1AgfCAtIHwKfCBgLS1jbHVzdGVycyBOQU1FWyxOQU1FXWAgfCBTcGVjaWZpYyBjbHVzdGVycyB3" + - "aXRoaW4gdGhlIGluc3RhbmNlIHwgQ29tbWEtc2VwYXJhdGVkIHwKfCBgLS1jb250YWluZXItYXJn" + - "cyBBUkdTYCB8IEFyZ3MgcGFzc2VkIHdoZW4gbGF1bmNoaW5nIHRoZSBjb250YWluZXIgfCBTaW5n" + - "bGUgc3RyaW5nLCBlLmcuIGAiLS1lcG9jaHMgMTAgLS1iYXRjaC1zaXplIDMyImAgfAp8IGAtLWNv" + - "bnRhaW5lci1lbnYgTkFNRT12YWx1ZWAgfCBDb250YWluZXIgZW52aXJvbm1lbnQgdmFyaWFibGU7" + - "IHJlcGVhdGFibGUgfCAtIHwKfCBgLS1zZWNyZXRzIE5BTUU9dmFsdWVgIHwgU2VjcmV0IGVudmly" + - "b25tZW50IHZhcmlhYmxlOyByZXBlYXRhYmxlOyBlbmNyeXB0ZWQgYXQgcmVzdCB8IC0gfAp8IGAt" + - "LW1heC1ydW50aW1lIERVUkFUSU9OYCB8IE1heCB3YWxsLWNsb2NrIHJ1biB0aW1lIChJU08gODYw" + - "MSwgZS5nLiBgUFQ0SGApIHwgTm8gZGVmYXVsdDsgb21pdCBmb3Igbm8gdGltZSBsaW1pdCB8Cnwg" + - "YC0tbWF4LXF1ZXVlZCBEVVJBVElPTmAgfCBNYXggdGltZSBpbiBxdWV1ZSBiZWZvcmUgY2FuY2Vs" + - "bGF0aW9uIChJU08gODYwMSkgfCBTZXJ2ZXIgZGVmYXVsdCBgUFQ3MkhgIHwKfCBgLS10ZXJtaW5h" + - "dGlvbi1ncmFjZSBEVVJBVElPTmAgfCBHcmFjZSBwZXJpb2QgYWZ0ZXIgc3RvcCBzaWduYWwgKElT" + - "TyA4NjAxKSB8IFNlcnZlciBkZWZhdWx0IGBQVDFIYCB8CnwgYC0tcmVzdWx0LXN0cmF0ZWd5IFVQ" + - "TE9BRFx8Tk9ORWAgfCBIb3cgdG8gaGFuZGxlIHRhc2sgb3V0cHV0IGFydGlmYWN0cyB8IC0gfAp8" + - "IGAtLXJlc3VsdHMtbG9jYXRpb24gTE9DQVRJT05gIHwgUmVzdWx0IHVwbG9hZCB0YXJnZXQsIGZv" + - "cm1hdCBgb3JnLW5hbWUvW3RlYW0tbmFtZS9dbW9kZWwtbmFtZWA7IHJlcXVpcmVkIHdoZW4gYC0t" + - "cmVzdWx0LXN0cmF0ZWd5PVVQTE9BRGAgfCAtIHwKfCBgLS1tb2RlbHMgTkFNRTpWRVJTSU9OOlVS" + - "SWAgfCBNb2RlbCBhcnRpZmFjdDsgcmVwZWF0YWJsZSB8IC0gfAp8IGAtLXJlc291cmNlcyBOQU1F" + - "OlZFUlNJT046VVJJYCB8IFJlc291cmNlIGFydGlmYWN0OyByZXBlYXRhYmxlIHwgLSB8CnwgYC0t" + - "dGFncyBUQUdbLFRBR11gIHwgVGFzayB0YWdzIHwgQ29tbWEtc2VwYXJhdGVkIHwKfCBgLS1kZXNj" + - "cmlwdGlvbiBURVhUYCB8IFRhc2sgZGVzY3JpcHRpb24gfCAtIHwKfCBgLS1sb2dzLXRlbGVtZXRy" + - "eS1pZCBVVUlEYCB8IExvZ3MgdGVsZW1ldHJ5IGVuZHBvaW50IElEIHwgLSB8CnwgYC0tbWV0cmlj" + - "cy10ZWxlbWV0cnktaWQgVVVJRGAgfCBNZXRyaWNzIHRlbGVtZXRyeSBlbmRwb2ludCBJRCB8IC0g" + - "fAp8IGAtLXRyYWNlcy10ZWxlbWV0cnktaWQgVVVJRGAgfCBUcmFjZXMgdGVsZW1ldHJ5IGVuZHBv" + - "aW50IElEIHwgLSB8ClBLBwiZ0OJQFy4AABcuAABQSwMEFAAIAAAAAAAhAAAAAAAAAAAAAAAAADcA" + - "CQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9yZWZlcmVuY2UvdHJvdWJsZXNob290aW5nLm1k" + - "VVQFAAEAps4SIyBUcm91Ymxlc2hvb3RpbmcKCktub3duIGVycm9ycyDihpIgZGlhZ25vc3RpYyBj" + - "b21tYW5kIOKGkiByZW1lZGlhdGlvbi4gS2VlcCBpbiBzeW5jIHdpdGggdGhlIHN0cnVjdHVyZWQg" + - "YHBoYXNlX2ZhaWxlZGAgZXZlbnRzIHRoZSBDTEkgZW1pdHMgKFJFUS0xNSkg4oCUIGV2ZXJ5IGVu" + - "dHJ5IGJlbG93IHNob3VsZCBtYXAgdG8gYW4gYGVyckNhdGVnb3J5YCBhbmQgYSBgcmVtZWRpYXRp" + - "b25gIGFycmF5LgoKIyMgUHJlLWZsaWdodAoKfCBTeW1wdG9tIHwgQ2F1c2UgfCBSZW1lZGlhdGlv" + - "biB8CnwtLS18LS0tfC0tLXwKfCBga3ViZWN0bCBub3Qgb24gUEFUSGAgfCBPcGVyYXRvcidzIGAk" + - "UEFUSGAgZG9lc24ndCBpbmNsdWRlIGt1YmVjdGwgfCBJbnN0YWxsIGt1YmVjdGwgMS4yOCs6IGh0" + - "dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL3Rhc2tzL3Rvb2xzL2luc3RhbGwta3ViZWN0bC8gfAp8" + - "IGBoZWxtZmlsZSBub3Qgb24gUEFUSGAgfCBTYW1lIHwgaHR0cHM6Ly9naXRodWIuY29tL2hlbG1m" + - "aWxlL2hlbG1maWxlI2luc3RhbGxhdGlvbiB8CnwgYGhlbG0gbm90IG9uIFBBVEhgIHwgU2FtZSB8" + - "IGh0dHBzOi8vaGVsbS5zaC9kb2NzL2ludHJvL2luc3RhbGwvIHwKfCBgR2F0ZXdheSBBUEkgQ1JE" + - "cyBub3QgaW5zdGFsbGVkYCB8IGVudm95LWdhdGV3YXkgcHJlcmVxIG1pc3NpbmcgfCBgaGVsbSBp" + - "bnN0YWxsIGVnIG9jaTovL2RvY2tlci5pby9lbnZveXByb3h5L2dhdGV3YXktaGVsbSAtLW5hbWVz" + - "cGFjZT1lbnZveS1nYXRld2F5LXN5c3RlbSAtLWNyZWF0ZS1uYW1lc3BhY2VgIHwKfCBgZGVmYXVs" + - "dCBTdG9yYWdlQ2xhc3Mgbm90IGF2YWlsYWJsZWAgfCBDbHVzdGVyIGhhcyBubyBkZWZhdWx0IFND" + - "IHwgQW5ub3RhdGUgb25lOiBga3ViZWN0bCBwYXRjaCBzYyA8bmFtZT4gLXAgJ3sibWV0YWRhdGEi" + - "OnsiYW5ub3RhdGlvbnMiOnsic3RvcmFnZWNsYXNzLmt1YmVybmV0ZXMuaW8vaXMtZGVmYXVsdC1j" + - "bGFzcyI6InRydWUifX19J2AgfAp8IGBHUFUgb3BlcmF0b3Igbm90IGluc3RhbGxlZGAgKGNvbXB1" + - "dGUtcGxhbmUpIHwgbnZpZGlhIEdQVSBvcGVyYXRvciBtaXNzaW5nIHwgSW5zdGFsbCBwZXIgaHR0" + - "cHM6Ly9kb2NzLm52aWRpYS5jb20vZGF0YWNlbnRlci9jbG91ZC1uYXRpdmUvZ3B1LW9wZXJhdG9y" + - "L2xhdGVzdC9pbnN0YWxsLWdwdS1vcGVyYXRvci5odG1sLCBPUiB1c2UgYGZha2UtZ3B1LW9wZXJh" + - "dG9yYCBmb3IgZGV2IHwKfCBgR1BVIG5vZGUgbGFiZWxzIG1pc3NpbmdgIChjb21wdXRlLXBsYW5l" + - "KSB8IE5vZGVzIG5lZWQgYG52aWRpYS5jb20vZ3B1LmZhbWlseWAgZXRjLiB8IFNldCBgLS1rM3Mt" + - "bm9kZS1sYWJlbCBudmlkaWEuY29tL2dwdS5mYW1pbHk9aG9wcGVyQGFnZW50Ok5gIGZvciBrM2Qg" + - "fAoKIyMgQXV0aAoKfCBTeW1wdG9tIHwgQ2F1c2UgfCBSZW1lZGlhdGlvbiB8CnwtLS18LS0tfC0t" + - "LXwKfCBgYWRtaW4gdG9rZW4gcmVxdWlyZWRgIChpbml0IG5vdCBydW4pIHwgTm8gYH4vLm52Y2Yt" + - "Y2xpLnN0YXRlYCBhbmQgYC0tdG9rZW5gIG5vdCBwYXNzZWQgfCBgbnZjZi1jbGkgaW5pdGAgKGlu" + - "dGVyYWN0aXZlKSBvciBgLS10b2tlbj0kSldUIC0tbm9uLWludGVyYWN0aXZlYCAoQ0kpIHwKfCBg" + - "U2lnbmVkIEpXVCByZWplY3RlZDogQW5vdGhlciBhbGdvcml0aG0gZXhwZWN0ZWQsIG9yIG5vIG1h" + - "dGNoaW5nIGtleShzKSBmb3VuZGAgfCBTdGFsZSBzZXNzaW9uLmpzb24gZnJvbSBhIGRpZmZlcmVu" + - "dCBjb250cm9sIHBsYW5lIHwgYHJtIH4vLm52Y2YtY2xpLnN0YXRlYCB0aGVuIGBudmNmLWNsaSBp" + - "bml0YCBhZ2FpbiB8CnwgYDQwMyBtaXNzaW5nIHJlcXVlc3RlZCBhdXRob3JpdGllc2AgKGZ1bmN0" + - "aW9uIGludm9rZSkgfCBBZG1pbiB0b2tlbiBkb2Vzbid0IGhhdmUgYGludm9rZV9mdW5jdGlvbmAg" + - "c2NvcGUgfCBgbnZjZi1jbGkgYXBpLWtleSBnZW5lcmF0ZSAtLWRlc2NyaXB0aW9uPeKApmAgdGhl" + - "biByZS1ydW4gaW52b2tlIHwKCiMjIEluc3RhbGwgLyBgdXBgCgp8IFN5bXB0b20gfCBDYXVzZSB8" + - "IFJlbWVkaWF0aW9uIHwKfC0tLXwtLS18LS0tfAp8IEhlbG0gYHRpbWVkIG91dCB3YWl0aW5nIGZv" + - "ciBjYXNzYW5kcmFgIHwgQ2Fzc2FuZHJhIFN0YXRlZnVsU2V0IFBWQyBzdHVjayBgUGVuZGluZ2Ag" + - "fCBDb25maXJtIGRlZmF1bHQgU3RvcmFnZUNsYXNzOyBjaGVjayBga3ViZWN0bCBnZXQgcHYscHZj" + - "IC1uIGNhc3NhbmRyYS1zeXN0ZW1gIHwKfCBgSW52YWxpZCBHUFUgJ05DUC5HUFUuSDEwMCcgc3Bl" + - "Y2lmaWVkYCAoZnVuY3Rpb24gZGVwbG95KSB8IFdyb25nIGZpZWxkIOKAlCBgZ3B1YCBpcyB0aGUg" + - "ZmFtaWx5LCBub3QgdGhlIFNLVSB8IFVzZSBgImdwdSI6ICJIMTAwImAsIGAiaW5zdGFuY2VUeXBl" + - "IjogIk5DUC5HUFUuSDEwMF8xeCJgIHwKfCBgcmVnaW9uIG11c3QgYmUgcHJvdmlkZWRgIChjbHVz" + - "dGVyIHJlZ2lzdGVyIC8gaW5zdGFsbCAtLWNvbXB1dGUtcGxhbmUpIHwgYC0tcmVnaW9uYCBlbXB0" + - "eSArIGBDTFVTVEVSX1JFR0lPTmAgZW52IGVtcHR5IHwgUGFzcyBgLS1yZWdpb249dXMtd2VzdC0x" + - "YCAob3IgYW55IG5vbi1lbXB0eSB2YWx1ZSkgfAp8IGByZXF1aXJlZEVudiAiTkNBX0lEIiBpcyBu" + - "b3Qgc2V0YCAoaGVsbWZpbGUgZXJyb3IgZHVyaW5nIGNvbXB1dGUtcGxhbmUgYXBwbHkpIHwgT2xk" + - "ZXIgbnZjZi1jbGkgYmVmb3JlIGNvbW1pdCBgNmFhNTcwNGA7IEV4dHJhRW52IG5vdCBwcm9wYWdh" + - "dGluZyBOQ0FfSUQgfCBVcGdyYWRlIGBudmNmLWNsaWAgdG8gYSByZWxlYXNlIGFmdGVyIGA2YWE1" + - "NzA0YCB8CnwgYG52Y2Etb3BlcmF0b3I6IEltYWdlUHVsbEJhY2tPZmZgIGZvciBgbnZjYS1vcGVy" + - "YXRvcjpwc2F0YCB8IEltYWdlIG5vdCBpbiBjbHVzdGVyIHJlZ2lzdHJ5OyBtdWx0aS1jbHVzdGVy" + - "IGJ1aWxkIGlzIGxvY2FsIHwgYGszZCBpbWFnZSBpbXBvcnQgbnZjci5pby8uLi4vbnZjYS1vcGVy" + - "YXRvcjpwc2F0IC1jIDxjbHVzdGVyPmAgfAoKIyMgQ29tcHV0ZS1wbGFuZSBydW50aW1lCgp8IFN5" + - "bXB0b20gfCBDYXVzZSB8IFJlbWVkaWF0aW9uIHwKfC0tLXwtLS18LS0tfAp8IE5WQ0EgYWdlbnQg" + - "Q3Jhc2hMb29wQmFja09mZiB3aXRoIGBIVFRQIDQwMWAgb24gYC92MS9udmNhL2NsdXN0ZXJzLy4u" + - "Li9yZWdpc3RlcmAgfCBTdGFsZSBgb3V0LzxjbHVzdGVyPi1yZWdpc3Rlci12YWx1ZXMueWFtbGAg" + - "ZnJvbSBwcmlvciByZWdpc3RlcjsgY2x1c3RlciBJRCBkb2Vzbid0IG1hdGNoIElDTVMgfCBEZWxl" + - "dGUgdGhlIHN0YWxlIGZpbGU7IHJlLXJ1biBgbnZjZi1jbGkgc2VsZi1ob3N0ZWQgdXBgIChpZGVt" + - "cG90ZW50IHJlZ2lzdGVyIHdyaXRlcyBhIGZyZXNoIGZpbGUpIHwKfCBgTm8gY2x1c3RlciBmb3Vu" + - "ZCB3aXRoIHZhbGlkIEpXS1MgZm9yIGNsdXN0ZXIgSUQ6IDxpZD5gIChJQ01TIGxvZykgfCBKV0tT" + - "IGluIElDTVMgZG9lc24ndCBtYXRjaCB3aGF0IGNvbXB1dGUtcGxhbmUgSzhzIGlzIGN1cnJlbnRs" + - "eSBzaWduaW5nIHwgYG52Y2YtY2xpIGNsdXN0ZXIgcm90YXRlIC0tY2x1c3Rlci1pZD08aWQ+YCB8" + - "CnwgRnVuY3Rpb24gcG9kIGBJbWFnZVB1bGxCYWNrT2ZmYCBpbiBgbnZjZi1iYWNrZW5kYCB8IElt" + - "YWdlLWNyZWRlbnRpYWwtaGVscGVyIGNvbmZpZyBtaXNzaW5nIG9yIHdyb25nIHwgYGt1YmVjdGwg" + - "ZGVzY3JpYmUgcG9kIC1uIG52Y2YtYmFja2VuZCA8cG9kPmA7IGNoZWNrIHRoZSBwdWxsIHNlY3Jl" + - "dCBjb25maWcgfAp8IEZ1bmN0aW9uIGRlcGxveSBzdHVjayBgREVQTE9ZSU5HYCBmb3IgPjUgbWlu" + - "IHwgTkFUUyBzdHJlYW0gaW5pdCBsYWcgKGNvbGQtY2x1c3Rlcikg4oCUIHdhaXQsIG9yIGNoZWNr" + - "IE5BVFMgYXV0aC1jYWxsb3V0IGhlYWx0aCB8IGBrdWJlY3RsIGxvZ3MgLW4gbmF0cy1zeXN0ZW0g" + - "LWwgYXBwLmt1YmVybmV0ZXMuaW8vbmFtZT1uYXRzLWF1dGgtY2FsbG91dC1zZXJ2aWNlYCB8Cgoj" + - "IyBUYXNrcwoKfCBTeW1wdG9tIHwgQ2F1c2UgfCBSZW1lZGlhdGlvbiB8CnwtLS18LS0tfC0tLXwK" + - "fCBgdGFzayBjcmVhdGVgIHJldHVybnMgYE1pc3NpbmcgPFRZUEU+IHJlZ2lzdHJ5IGNyZWRlbnRp" + - "YWwgZm9yIGhvc3RuYW1lYCwgb3Iga2VlcHMgdXNpbmcgYSBwcmV2aW91cyBjcmVkZW50aWFsIHZh" + - "bHVlLCBzaG9ydGx5IGFmdGVyIGByZWdpc3RyeS1jcmVkZW50aWFsIGFkZC91cGRhdGUvZGVsZXRl" + - "YCB3aGlsZSBgcmVnaXN0cnktY3JlZGVudGlhbCBsaXN0YC9gZ2V0YCBhbHJlYWR5IHNob3cgdGhl" + - "IG5ldyB2YWx1ZSB8IEV4cGVjdGVkIHByb3BhZ2F0aW9uIGRlbGF5OiBOVkNUIGNhY2hlcyB0aGUg" + - "YWNjb3VudCdzIHJlZ2lzdHJ5IGNyZWRlbnRpYWxzIHdpdGggYG52Y3QubnZjZi5jYWNoZS10dGxg" + - "IChkZWZhdWx0IGBQVDVNYCwgYWJvdXQgNSBtaW4pIGFuZCBhcHBsaWVzIHRoZSBjaGFuZ2Ugd2hl" + - "biB0aGF0IGNhY2hlZCBjb3B5IHJlZnJlc2hlcyB8IFdhaXQgdXAgdG8gYWJvdXQgNSBtaW4gYW5k" + - "IHJldHJ5LCBvciBga3ViZWN0bCAtbiBudmNmIHJvbGxvdXQgcmVzdGFydCBkZXBsb3ltZW50L252" + - "Y3QtYXBpYCB0byBhcHBseSBpbW1lZGlhdGVseSB8ClBLBwjzrhOEdBEAAHQRAABQSwMEFAAIAAAA" + - "AAAhAAAAAAAAAAAAAAAAACwACQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbi9T" + - "S0lMTC5tZFVUBQABAKbOEi0tLQpuYW1lOiBudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24K" + - "ZGVzY3JpcHRpb246ID4tCiAgSW5zdGFsbCBhbmQgb3BlcmF0ZSBOVkNGIHNlbGYtaG9zdGVkIGNv" + - "bnRyb2wtcGxhbmUgYW5kIHNlcGFyYXRlIGNvbXB1dGUtcGxhbmUKICBzdGFja3MuIENvdmVycyBI" + - "ZWxtZmlsZSB2YWx1ZXMgYW5kIENMSSBwcm9maWxlIGluc3RhbGxhdGlvbiBmbG93cywgdGVhcmRv" + - "d24sCiAgdmFsdWVzIG92ZXJyaWRlcywgcHVsbCBzZWNyZXRzLCBhbmQgdHJvdWJsZXNob290aW5n" + - "LiBVc2UgZm9yCiAgbnZjZi1zZWxmLW1hbmFnZWQtc3RhY2ssIG52Y2YtY29tcHV0ZS1wbGFuZS1z" + - "dGFjaywgc3BsaXQgY29tcHV0ZS1wbGFuZQogIGluc3RhbGxhdGlvbiwgY29udHJvbC1wbGFuZSBp" + - "bnN0YWxsYXRpb24sIENMSS1nZW5lcmF0ZWQgY29udHJvbC1wbGFuZQogIHByb2ZpbGVzLCBIZWxt" + - "ZmlsZSwgc2VsZi1tYW5hZ2VkLCBvciBzZWxmLWhvc3RlZCBkZXBsb3ltZW50cy4gRG8gTk9UIHVz" + - "ZSBmb3IKICBsb2NhbCBrM2QgZW52aXJvbm1lbnRzOyB1c2UgdGhlIGxvY2FsIGszZCBkZXZlbG9w" + - "bWVudCB3b3JrZmxvdyBpbnN0ZWFkLgpsaWNlbnNlOiBBcGFjaGUtMi4wCmNvbXBhdGliaWxpdHk6" + - "IFJlcXVpcmVzIGhlbG1maWxlID49IDEuMS4wIDwgMS4yLjAsIGhlbG0gPj0gMy4xMiwgaGVsbS1k" + - "aWZmIHBsdWdpbiwga3ViZWN0bCBtYXRjaGluZyBjbHVzdGVyIHZlcnNpb24KYXV0aG9yOiAibnZj" + - "Zi1jb3JlLWVuZyA8bnZjZi1jb3JlLWVuZ0BleGNoYW5nZS5udmlkaWEuY29tPiIKdmVyc2lvbjog" + - "IjEuMC4wIgp0YWdzOiBbbnZjZiwgc2VsZi1tYW5hZ2VkLCBoZWxtZmlsZSwgc2VsZi1ob3N0ZWQs" + - "IGNvbnRyb2wtcGxhbmUsIGNvbXB1dGUtcGxhbmUsIGNsaS1wcm9maWxlLCBpbnN0YWxsYXRpb24s" + - "IGRlcGxveW1lbnQsIHB1bGwtc2VjcmV0c10KdG9vbHM6IFtTaGVsbCwgUmVhZCwgRWRpdCwgR3Jl" + - "cCwgR2xvYl0KbWV0YWRhdGE6CiAgaW50ZXJuYWw6IGZhbHNlCiAgYXV0aG9yOiAibnZjZi1jb3Jl" + - "LWVuZyA8bnZjZi1jb3JlLWVuZ0BleGNoYW5nZS5udmlkaWEuY29tPiIKICB2ZXJzaW9uOiAiMS4w" + - "IgogIHRhZ3M6IFtudmNmLCBzZWxmLW1hbmFnZWQsIGhlbG1maWxlLCBzZWxmLWhvc3RlZCwgY29u" + - "dHJvbC1wbGFuZSwgY29tcHV0ZS1wbGFuZSwgY2xpLXByb2ZpbGUsIGluc3RhbGxhdGlvbiwgZGVw" + - "bG95bWVudCwgcHVsbC1zZWNyZXRzXQogIGxhbmd1YWdlczogW2Jhc2gsIHlhbWxdCiAgZnJhbWV3" + - "b3JrczogW2hlbG1maWxlLCBoZWxtLCBrdWJlY3RsXQogIGRvbWFpbjogY2xvdWQtaW5mcmFzdHJ1" + - "Y3R1cmUKLS0tCgojIE5WQ0YgU2VsZi1NYW5hZ2VkIFN0YWNrIE9wZXJhdGlvbnMKCk9wZXJhdGlv" + - "bmFsIGd1aWRlIGZvciBtYXRjaGluZyBOVkNGIGNvbnRyb2wtcGxhbmUgYW5kIGNvbXB1dGUtcGxh" + - "bmUgSGVsbWZpbGUgYnVuZGxlcy4KCiMjIEluc3RydWN0aW9ucwoKVXNlIHRoaXMgc2tpbGwgZm9y" + - "IGluc3RhbGwsIHVwZ3JhZGUsIG9yIHRlYXJkb3duIHdvcmsgaW4gbWF0Y2hpbmcgYG52Y2Ytc2Vs" + - "Zi1tYW5hZ2VkLXN0YWNrYCBhbmQgYG52Y2YtY29tcHV0ZS1wbGFuZS1zdGFja2AgYnVuZGxlczsg" + - "a2VlcCBIZWxtZmlsZSB2YWx1ZXMgYW5kIENMSSBwcm9maWxlIGhhbmRvZmZzIHNlcGFyYXRlLiBG" + - "b3IgYGZ1bmN0aW9uVHlwZTogIkxMTSJgLCByZWFkIFtMTE0gRnVuY3Rpb24gRW5hYmxlbWVudF0o" + - "cmVmZXJlbmNlcy9oZWxtZmlsZS1zdHJ1Y3R1cmUubWQjbGxtLWZ1bmN0aW9uLWVuYWJsZW1lbnQp" + - "LgoKIyMgUHJlcmVxdWlzaXRlcwoKQXNrIGZvciB0aGUgZXh0cmFjdGVkIGBudmNmLXNlbGYtbWFu" + - "YWdlZC1zdGFja2AgcGF0aC4gRm9yIHNwbGl0IGluc3RhbGxhdGlvbiwKYWxzbyByZXF1aXJlIHRo" + - "ZSBtYXRjaGluZy12ZXJzaW9uIGBudmNmLWNvbXB1dGUtcGxhbmUtc3RhY2tgIHBhdGguIFZlcmlm" + - "eSBib3RoOgoKYGBgYmFzaApscyA8Y29udHJvbC1wbGFuZS1zdGFjaz4vaGVsbWZpbGUuZC8gPGNv" + - "bnRyb2wtcGxhbmUtc3RhY2s+L2Vudmlyb25tZW50cy8gPGNvbnRyb2wtcGxhbmUtc3RhY2s+L3Nl" + - "Y3JldHMvIDxjb250cm9sLXBsYW5lLXN0YWNrPi9nbG9iYWwueWFtbC5nb3RtcGwKbHMgPGNvbXB1" + - "dGUtcGxhbmUtc3RhY2s+L2hlbG1maWxlLmQvIDxjb21wdXRlLXBsYW5lLXN0YWNrPi9lbnZpcm9u" + - "bWVudHMvIDxjb21wdXRlLXBsYW5lLXN0YWNrPi9nbG9iYWwueWFtbC5nb3RtcGwKYGBgCgpJZiBl" + - "aXRoZXIgZGlyZWN0b3J5IGlzIG1pc3NpbmcsIGRvd25sb2FkIG1hdGNoaW5nIGJ1bmRsZSB2ZXJz" + - "aW9ucyBmcm9tIE5HQzoKCmBgYGJhc2gKbmdjIHJlZ2lzdHJ5IHJlc291cmNlIGRvd25sb2FkLXZl" + - "cnNpb24gPG9yZz4vbnZjZi1zZWxmLW1hbmFnZWQtc3RhY2s6PHZlcnNpb24+Cm5nYyByZWdpc3Ry" + - "eSByZXNvdXJjZSBkb3dubG9hZC12ZXJzaW9uIDxvcmc+L252Y2YtY29tcHV0ZS1wbGFuZS1zdGFj" + - "azo8dmVyc2lvbj4KYGBgCgpDb250cm9sLXBsYW5lIGNvbW1hbmRzIGJlbG93IGFzc3VtZSB0aGUg" + - "Y29udHJvbC1wbGFuZSBidW5kbGUgcm9vdC4gU3BsaXQtZmxvdwpjb21tYW5kcyBhbmQgcm9vdCBz" + - "dWJzdGl0dXRpb24gYXJlIGluCltTcGxpdCBDb21wdXRlLVBsYW5lIEluc3RhbGxhdGlvbl0ocmVm" + - "ZXJlbmNlcy9jb21wdXRlLXBsYW5lLWluc3RhbGxhdGlvbi5tZCkuCgojIyBCZWZvcmUgWW91IFN0" + - "YXJ0CgpWZXJpZnkgdG9vbGluZyBhbmQgY29udGV4dCBiZWZvcmUgYW55IG9wZXJhdGlvbjoKCmBg" + - "YGJhc2gKaGVsbWZpbGUgLS12ZXJzaW9uICAgIyBNdXN0IGJlIDEuMS54ICgxLjIuMCByZW1vdmVk" + - "IHNlcXVlbnRpYWwgbW9kZSkKaGVsbSB2ZXJzaW9uICAgICAgICAgIyBNdXN0IGJlID49IDMuMTIK" + - "aGVsbSBwbHVnaW4gbGlzdCAgICAgIyBNdXN0IGluY2x1ZGUgaGVsbS1kaWZmID49IDMuMTEKa3Vi" + - "ZWN0bCB2ZXJzaW9uICAgICAgIyBDbGllbnQgbXVzdCBiZSB3aXRoaW4gMSBtaW5vciB2ZXJzaW9u" + - "IG9mIGNsdXN0ZXIKYGBgCgpDb250cm9sLXBsYW5lIGNvbW1hbmRzIHJ1biBmcm9tIHRoZSBleHRy" + - "YWN0ZWQgYG52Y2Ytc2VsZi1tYW5hZ2VkLXN0YWNrL2Agcm9vdDoKCmBgYGJhc2gKY2QgcGF0aC90" + - "by9udmNmLXNlbGYtbWFuYWdlZC1zdGFjawpscyBoZWxtZmlsZS5kLyBlbnZpcm9ubWVudHMvIHNl" + - "Y3JldHMvIGdsb2JhbC55YW1sLmdvdG1wbApgYGAKCklkZW50aWZ5IHRoZSBlbnZpcm9ubWVudCBm" + - "cm9tIGBlbnZpcm9ubWVudHMvPG5hbWU+LnlhbWxgIGFuZApgc2VjcmV0cy88bmFtZT4tc2VjcmV0" + - "cy55YW1sYDsgZm9yIEVLUywgdXNlIHRoZSBjYW5vbmljYWwKW0NTUCBFbmQtdG8tRW5kIEV4YW1w" + - "bGVdKGh0dHBzOi8vZG9jcy5udmlkaWEuY29tL252Y2YvdjAuNi4wLXJjL2NzcC1lbmQtdG8tZW5k" + - "LWV4YW1wbGUpLgoKIyMgSG93IFZhbHVlcyBGbG93CgpVbmRlcnN0YW5kaW5nIHZhbHVlIHByZWNl" + - "ZGVuY2UgcHJldmVudHMgdGhlIG1vc3QgY29tbW9uIGNvbmZpZ3VyYXRpb24gbWlzdGFrZXMuCgpg" + - "YGB0ZXh0CmVudmlyb25tZW50cy9iYXNlLnlhbWwgICAgICAgICAgKGRlZmF1bHRzKQogICAgLT4g" + - "bWVyZ2VkIHdpdGgKZW52aXJvbm1lbnRzLzxlbnY+LnlhbWwgICAgICAgICAoeW91ciBvdmVycmlk" + - "ZXMpCiAgICAtPiBjb25zdW1lZCBieQpnbG9iYWwueWFtbC5nb3RtcGwgICAgICAgICAgICAgIChH" + - "byB0ZW1wbGF0ZSwgY29uc3RydWN0cyBwZXItY2hhcnQgdmFsdWVzKQogICAgLT4gY29uc3VtZWQg" + - "YnkKc2VjcmV0cy88ZW52Pi1zZWNyZXRzLnlhbWwgICAgICAoc2Vuc2l0aXZlIHZhbHVlcykKICAg" + - "IC0+IG92ZXJyaWRkZW4gYnkKcmVsZWFzZSBpbmxpbmUgdmFsdWVzOiBibG9ja3MgICAoaGlnaGVz" + - "dCBwcmVjZWRlbmNlKQpgYGAKCkNyaXRpY2FsOiBgZ2xvYmFsLnlhbWwuZ290bXBsYCBvbmx5IHBh" + - "c3NlcyB0aHJvdWdoIHNwZWNpZmljIGtleXMgdG8gZWFjaCBjaGFydCAoaW1hZ2UgcmVnaXN0cmll" + - "cywgbm9kZSBzZWxlY3RvcnMsIHN0b3JhZ2UsIHJlcGxpY2EgY291bnRzKS4gU2V0dGluZyBhbiBh" + - "cmJpdHJhcnkgY2hhcnQgdmFsdWUgaW4gdGhlIGVudmlyb25tZW50IGZpbGUgd2lsbCBiZSBzaWxl" + - "bnRseSBpZ25vcmVkIGlmIGBnbG9iYWwueWFtbC5nb3RtcGxgIGRvZXMgbm90IHByb3BhZ2F0ZSBp" + - "dC4KClRvIG92ZXJyaWRlIGFyYml0cmFyeSBjaGFydCB2YWx1ZXMsIHVzZSBhIGhlbG1maWxlIHJl" + - "bGVhc2UgYHZhbHVlczpgIGJsb2NrLiBTZWUgW092ZXJyaWRpbmcgSGVsbSBDaGFydCBWYWx1ZXNd" + - "KCNvdmVycmlkaW5nLWhlbG0tY2hhcnQtdmFsdWVzKS4KCiMjIENsZWFuIEluc3RhbGxhdGlvbgoK" + - "IyMjIDEuIENyZWF0ZSBuYW1lc3BhY2VzIGFuZCBpbWFnZSBwdWxsIHNlY3JldHMgKGlmIHVzaW5n" + - "IGEgcHJpdmF0ZSByZWdpc3RyeSkKCmBgYGJhc2gKZm9yIG5zIGluIGNhc3NhbmRyYS1zeXN0ZW0g" + - "bmF0cy1zeXN0ZW0gbnZjZiBhcGkta2V5cyBlc3Mgc2lzIHZhdWx0LXN5c3RlbSBjZXJ0LW1hbmFn" + - "ZXI7IGRvCiAga3ViZWN0bCBjcmVhdGUgbmFtZXNwYWNlICIkbnMiIC0tZHJ5LXJ1bj1jbGllbnQg" + - "LW8geWFtbCB8IGt1YmVjdGwgYXBwbHkgLWYgLQpkb25lCgojIE9ubHkgaWYgcHVsbGluZyBmcm9t" + - "IGEgcHJpdmF0ZSByZWdpc3RyeSAoZS5nLiwgTkdDIG52Y3IuaW8pCmV4cG9ydCBOR0NfQVBJX0tF" + - "WT0iPHlvdXIta2V5PiIKZm9yIG5zIGluIGNhc3NhbmRyYS1zeXN0ZW0gbmF0cy1zeXN0ZW0gbnZj" + - "ZiBhcGkta2V5cyBlc3Mgc2lzIHZhdWx0LXN5c3RlbSBjZXJ0LW1hbmFnZXI7IGRvCiAga3ViZWN0" + - "bCBjcmVhdGUgc2VjcmV0IGRvY2tlci1yZWdpc3RyeSBudmNyLWNyZWRzIFwKICAgIC0tZG9ja2Vy" + - "LXNlcnZlcj1udmNyLmlvIFwKICAgIC0tZG9ja2VyLXVzZXJuYW1lPSckb2F1dGh0b2tlbicgXAog" + - "ICAgLS1kb2NrZXItcGFzc3dvcmQ9IiROR0NfQVBJX0tFWSIgXAogICAgLS1uYW1lc3BhY2U9IiRu" + - "cyIgXAogICAgLS1kcnktcnVuPWNsaWVudCAtbyB5YW1sIHwga3ViZWN0bCBhcHBseSAtZiAtCmRv" + - "bmUKYGBgCgpJZiB1c2luZyBwdWxsIHNlY3JldHMsIHlvdSBtdXN0IGFsc28gY29uZmlndXJlIGVh" + - "Y2ggaGVsbWZpbGUgcmVsZWFzZSB0byByZWZlcmVuY2UgdGhlbS4gU2VlIFtJbWFnZSBQdWxsIFNl" + - "Y3JldHNdKCNpbWFnZS1wdWxsLXNlY3JldHMpLgoKIyMjIDIuIEF1dGhlbnRpY2F0ZSBoZWxtIHRv" + - "IHlvdXIgY2hhcnQgcmVnaXN0cnkKCkJvdGggYGRvY2tlciBsb2dpbmAgQU5EIGBoZWxtIHJlZ2lz" + - "dHJ5IGxvZ2luYCBhcmUgcmVxdWlyZWQgZm9yIE5HQy4gSGVsbWZpbGUgdXNlcyBoZWxtIChub3Qg" + - "ZG9ja2VyKSB0byBwdWxsIE9DSSBjaGFydHMsIHNvIHRoZSBoZWxtIGNyZWRlbnRpYWwgc3RvcmUg" + - "bXVzdCBiZSBhdXRoZW50aWNhdGVkIHNlcGFyYXRlbHkuCgpgYGBiYXNoCiMgTkdDIC0tIGJvdGgg" + - "Y29tbWFuZHMgYXJlIHJlcXVpcmVkCmRvY2tlciBsb2dpbiBudmNyLmlvIC11ICckb2F1dGh0b2tl" + - "bicgLXAgIiROR0NfQVBJX0tFWSIKaGVsbSByZWdpc3RyeSBsb2dpbiBudmNyLmlvIC11ICckb2F1" + - "dGh0b2tlbicgLXAgIiROR0NfQVBJX0tFWSIKCiMgRUNSCmF3cyBlY3IgZ2V0LWxvZ2luLXBhc3N3" + - "b3JkIC0tcmVnaW9uIDxyZWdpb24+IHwgXAogIGhlbG0gcmVnaXN0cnkgbG9naW4gLS11c2VybmFt" + - "ZSBBV1MgLS1wYXNzd29yZC1zdGRpbiA8YWNjb3VudD4uZGtyLmVjci48cmVnaW9uPi5hbWF6b25h" + - "d3MuY29tCmBgYAoKPiBOb3RlOiBgaGVsbSByZWdpc3RyeSBsb2dpbmAga2VlcHMgb25seSB0aGUg" + - "bGFzdCBsb2dpbiBwZXIgaG9zdCAobXVsdGktb3JnIGdvdGNoYSkuCj4gVGhlIHN0YWNrIGFuZCB0" + - "aGUgY2FjaGVzIHNwYW4gc2V2ZXJhbCBOR0Mgb3JncyB0aGF0IG5lZWQgZGlmZmVyZW50IGtleXMs" + - "IGJ1dCB0aGV5IGFsbAo+IGxpdmUgdW5kZXIgdGhlIG9uZSBob3N0IGBudmNyLmlvYC4gQSBzZWNv" + - "bmQgYGhlbG0gcmVnaXN0cnkgbG9naW4gbnZjci5pb2AgKG9yCj4gYGRvY2tlciBsb2dpbmApIHdp" + - "dGggYSBkaWZmZXJlbnQga2V5IHNpbGVudGx5IG92ZXJ3cml0ZXMgdGhlIGZpcnN0LCBzbyBwdWxs" + - "cyBmb3IgdGhlCj4gZmlyc3Qgb3JnIHRoZW4gZmFpbCB3aXRoIGEgbWlzbGVhZGluZyBgNDAzIEFj" + - "Y2VzcyBEZW5pZWRgIChub3QgYSA0MDE6IHRoZSBhdXRoCj4gc3VjY2VlZGVkLCBpdCdzIHRoZSB3" + - "cm9uZy1vcmcga2V5KS4gSWYgeW91IHB1bGwgY2hhcnRzL2ltYWdlcyBmcm9tIG1vcmUgdGhhbiBv" + - "bmUgb3JnLAo+IGVpdGhlciByZS1ydW4gdGhlIGxvZ2luIHdpdGggdGhlIGNvcnJlY3Qga2V5IGlt" + - "bWVkaWF0ZWx5IGJlZm9yZSBlYWNoIHB1bGwsIG9yIHBhc3MKPiBgLS11c2VybmFtZSAnJG9hdXRo" + - "dG9rZW4nIC0tcGFzc3dvcmQgPGtleT5gIHBlciBgaGVsbSBwdWxsYCBpbnZvY2F0aW9uIGluc3Rl" + - "YWQgb2YgcmVseWluZwo+IG9uIHRoZSBzdG9yZWQgbG9naW4uIChQdWxsaW5nIGV2ZXJ5dGhpbmcg" + - "ZnJvbSBhIHNpbmdsZSByZWdpc3RyeSBtaXJyb3IgYXZvaWRzIHRoaXMKPiBlbnRpcmVseS4pCgoj" + - "IyMgMmIuIChSZWNvbW1lbmRlZCkgUHVsbCBmcm9tIGEgcmVnaXN0cnkgdGhlIGNsdXN0ZXIgYXV0" + - "aGVudGljYXRlcyB0byBhdXRvbWF0aWNhbGx5CgpJZiB5b3UgbWlycm9yIHRoZSBOVkNGIGltYWdl" + - "cyBpbnRvIGEgcmVnaXN0cnkgdGhhdCB0aGUgY2x1c3RlciBjYW4gcHVsbCBmcm9tIHdpdGhvdXQg" + - "YW4KZXhwbGljaXQgaW1hZ2UgcHVsbCBzZWNyZXQgKGZvciBleGFtcGxlLCBhIHJlZ2lzdHJ5IHdo" + - "ZXJlIHRoZSBub2RlIG9yIHdvcmtsb2FkIGlkZW50aXR5IGlzCmdyYW50ZWQgcHVsbCBhY2Nlc3Mg" + - "YXV0b21hdGljYWxseSksIHBvaW50IHRoZSBzdGFjayBhdCBpdCBhbmQgc2tpcCB0aGUgY3JlZGVu" + - "dGlhbCBzdGVwcwphYm92ZS4KCjEuIFBvaW50IHRoZSBzdGFjayBhdCB0aGUgbWlycm9yIGluIGBl" + - "bnZpcm9ubWVudHMvPGVudj4ueWFtbGA6CgogICBgYGB5YW1sCiAgIGdsb2JhbDoKICAgICBpbWFn" + - "ZToKICAgICAgIHJlZ2lzdHJ5OiA8eW91ci1yZWdpc3RyeT4gICAgICAgICAgICAjIGUuZy4gcmVn" + - "aXN0cnkuZXhhbXBsZS5jb20KICAgICAgIHJlcG9zaXRvcnk6IDxtaXJyb3Itc3ViLXBhdGg+CiAg" + - "ICAgaGVsbToKICAgICAgIHNvdXJjZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBv" + - "bmx5IGlmIHlvdSBhbHNvIG1pcnJvcmVkIHRoZSBoZWxtIGNoYXJ0cwogICAgICAgICByZWdpc3Ry" + - "eTogPHlvdXItcmVnaXN0cnk+CiAgICAgICAgIHJlcG9zaXRvcnk6IDxtaXJyb3Itc3ViLXBhdGg+" + - "CiAgIGBgYAoKICAgPiBUaGUgbWFuaWZlc3QgaGFzIGEgbWl4IG9mIE9DSSBhbmQgbm9uLU9DSSBh" + - "cnRpZmFjdHMsIHNvIGNvbnZlcnQgbm9uLU9DSSBjaGFydHMgYmVmb3JlCiAgID4gbWlycm9yaW5n" + - "LiBDb250YWluZXIgaW1hZ2VzIChgbnZjci5pby8uLi5gKSBhcmUgYWxyZWFkeSBPQ0kgYW5kIG1p" + - "cnJvciBhcy1pcy4gU29tZSBIZWxtCiAgID4gY2hhcnRzLCB0aG91Z2gsIGFyZSBwdWJsaXNoZWQg" + - "dG8gYW4gYGh0dHBzOi8vYCBIZWxtIHJlcG9zaXRvcnkgKGZvciBleGFtcGxlCiAgID4gYGhlbG0u" + - "bmdjLm52aWRpYS5jb21gKS4gVGhvc2UgYXJlIG5vdCBPQ0kgYW5kIGNhbm5vdCBiZSByZXNvbHZl" + - "ZCBieSBgZ2xvYmFsLmhlbG0uc291cmNlc2AKICAgPiAoT0NJKSBvciBtaXJyb3JlZCBkaXJlY3Rs" + - "eS4gQmVmb3JlIHBvaW50aW5nIHRoZSBzdGFjayBhdCB5b3VyIG1pcnJvciwgY29udmVydCBlYWNo" + - "CiAgID4gYGh0dHBzOi8vYCBjaGFydCB0byBPQ0k6IGBoZWxtIHJlcG8gYWRkYC9gaGVsbSBwdWxs" + - "YCB0aGUgYC50Z3pgLCB0aGVuCiAgID4gYGhlbG0gcHVzaCA8Y2hhcnQ+LnRneiBvY2k6Ly88eW91" + - "ci1yZWdpc3RyeT4vPG1pcnJvci1zdWItcGF0aD5gLiBPbmx5IE9DSSBjaGFydHMgY2FuIGxpdmUK" + - "ICAgPiB1bmRlciBgZ2xvYmFsLmhlbG0uc291cmNlc2AuCgoyLiBTa2lwIHRoZSBjcmVkZW50aWFs" + - "IHN0ZXBzIGFib3ZlLiBXaGVuIHRoZSBjbHVzdGVyIGF1dGhlbnRpY2F0ZXMgdG8gdGhlIHJlZ2lz" + - "dHJ5CiAgIGF1dG9tYXRpY2FsbHkgKHRoZSBub2RlIG9yIHdvcmtsb2FkIGlkZW50aXR5IGhhcyBw" + - "dWxsIGFjY2VzcyksIHRoZSBwdWxsIG5lZWRzIG5vCiAgIEt1YmVybmV0ZXMgc2VjcmV0LCBzbyB5" + - "b3UgZG8gbm90IG5lZWQ6IHRoZSBwZXItbmFtZXNwYWNlIGBudmNyLWNyZWRzYCBmcm9tIHN0ZXAg" + - "MQogICAoc3RpbGwgY3JlYXRlIHRoZSBuYW1lc3BhY2VzLCBqdXN0IG5vdCB0aGUgc2VjcmV0KSwg" + - "dGhlIGBnbG9iYWwuaW1hZ2VQdWxsU2VjcmV0c2AgZW50cnksCiAgIG9yIHRoZSBgZG9ja2VyIGxv" + - "Z2luYC9gaGVsbSByZWdpc3RyeSBsb2dpbiBudmNyLmlvYCBmcm9tIHN0ZXAgMi4KCiAgID4gT25l" + - "IHJlc2lkdWFsIGNyZWRlbnRpYWw6IG52Y2YtYXBpIHN0aWxsIHZhbGlkYXRlcyB0aGUgdXNlciBm" + - "dW5jdGlvbiBpbWFnZSBhdAogICA+IGBmdW5jdGlvbiBjcmVhdGVgIHZpYSB0aGUgYWNjb3VudCBy" + - "ZWdpc3RyeSBjcmVkZW50aWFsLCBzbyB0aGF0IGNyZWRlbnRpYWwgbXVzdCBwb2ludCBhdAogICA+" + - "IHdoaWNoZXZlciByZWdpc3RyeSBob2xkcyB0aGUgdXNlciBpbWFnZSAoc2V0IGl0IHRvIHlvdXIg" + - "bWlycm9yIGlmIHRoZSBpbWFnZSBpcyBtaXJyb3JlZAogICA+IHRoZXJlKS4KCiMjIyAzLiBTZXQg" + - "dGhlIHJvdXRlIGRvbWFpbgoKYGdsb2JhbC5kb21haW5gIHNldHMgdGhlIGhvc3RuYW1lIHN1ZmZp" + - "eCBmb3Igcm91dGVzIHN1Y2ggYXMgYGFwaS48ZG9tYWluPmAuIEl0IGRvZXMgbm90IGNvbmZpZ3Vy" + - "ZSB0aGUgR2F0ZXdheSBvciBpdHMgbG9hZCBiYWxhbmNlci4gUXVlcnkgdGhlIGV4YWN0IGV4aXN0" + - "aW5nIEdhdGV3YXk6CgpgYGBiYXNoCkdBVEVXQVlfQUREUkVTUz0kKGt1YmVjdGwgZ2V0IGdhdGV3" + - "YXkgPGdhdGV3YXktbmFtZT4gLW4gPGdhdGV3YXktbmFtZXNwYWNlPiAtbyBqc29ucGF0aD0ney5z" + - "dGF0dXMuYWRkcmVzc2VzWzBdLnZhbHVlfScpCnRlc3QgLW4gIiRHQVRFV0FZX0FERFJFU1MiCmBg" + - "YAoKVGhlIGFkZHJlc3MgbWF5IGJlIGEgaG9zdG5hbWUgb3IgSVAuIENsb3VkIHByb3ZpZGVyIGFu" + - "ZCBHYXRld2F5IGNvbmZpZ3VyYXRpb24gZGV0ZXJtaW5lIHRoZSBsb2FkIGJhbGFuY2VyIHR5cGUg" + - "YW5kIGFkZHJlc3MgZm9ybWF0LiBUaGUgc2VsZi1tYW5hZ2VkIHN0YWNrIGRvZXMgbm90IHNlbGVj" + - "dCBlaXRoZXIuCgpGb3IgdGVtcG9yYXJ5IHRlc3Rpbmcgd2l0aG91dCBETlMsIHVzZSBhIHN0YWJs" + - "ZSByZXNlcnZlZCBzdWZmaXggc3VjaCBhcyBgZ2xvYmFsLmRvbWFpbjogIm52Y2YudGVzdCJgLCBj" + - "b25uZWN0IHRvIGBHQVRFV0FZX0FERFJFU1NgLCBhbmQgc2VuZCBgSG9zdDogYXBpLm52Y2YudGVz" + - "dGAuIEZvciBwcm9kdWN0aW9uLCB1c2UgeW91ciBiYXNlIEROUyBkb21haW4gYW5kIHBvaW50IGl0" + - "cyByb3V0ZSByZWNvcmRzIHRvIGBHQVRFV0FZX0FERFJFU1NgLiBJZiB0aGUgZW5kcG9pbnQgbGF0" + - "ZXIgY2hhbmdlcywga2VlcCBgZ2xvYmFsLmRvbWFpbmAgc3RhYmxlIGFuZCB1cGRhdGUgb25seSBE" + - "TlMgb3IgdGhlIGNsaWVudCBkZXN0aW5hdGlvbi4gU2VlIEV4YW1wbGUgNCBpbiBbZXhhbXBsZXMu" + - "bWRdKGV4YW1wbGVzLm1kKS4KCiMjIyA0LiBQcmV2aWV3IGFuZCBkZXBsb3kKCmBgYGJhc2gKSEVM" + - "TUZJTEVfRU5WPTxlbnYtbmFtZT4gaGVsbWZpbGUgdGVtcGxhdGUgICAjIFByZXZpZXcgcmVuZGVy" + - "ZWQgbWFuaWZlc3RzCkhFTE1GSUxFX0VOVj08ZW52LW5hbWU+IGhlbG1maWxlIHN5bmMgICAgICAg" + - "IyBEZXBsb3kKYGBgCgo+IFNldCBCT1RIIENhc3NhbmRyYSBwYXNzd29yZHMgaW4gdGhlIHNlY3Jl" + - "dHMgZmlsZS4gVGhlIHNlY3JldHMgZmlsZSBkb2N1bWVudHMKPiBgREVGQVVMVF9DQVNTQU5EUkFf" + - "UEFTU1dPUkRgLCBidXQgdGhlIGNhc3NhbmRyYSBjaGFydCBoYXMgYSBzZWNvbmQgY3JlZGVudGlh" + - "bCwKPiBgY2Fzc2FuZHJhLnNlcnZpY2VSb2xlUGFzc3dvcmRgLCB0aGF0IGRlZmF1bHRzIHRvIGBj" + - "aEBuZzNtM2AuIElmIHlvdSBzZXQgb25seQo+IGBERUZBVUxUX0NBU1NBTkRSQV9QQVNTV09SRGAs" + - "IHRoZSBzZXJ2aWNlIHJvbGUga2VlcHMgdGhhdCBkZWZhdWx0IGFuZCBldmVyeSBEQi1iYWNrZWQK" + - "PiBzZXJ2aWNlIGNyYXNoLWxvb3BzIHdpdGggYEJhZCBjcmVkZW50aWFsc2Agb25jZSBpdCB0cmll" + - "cyB0byBhdXRoZW50aWNhdGUuIFNldAo+IGBjYXNzYW5kcmEuc2VydmljZVJvbGVQYXNzd29yZGAg" + - "dG8gdGhlIHNhbWUgdmFsdWUgYXMgYERFRkFVTFRfQ0FTU0FORFJBX1BBU1NXT1JEYC4KCiMjIyA1" + - "LiBEZXBsb3ltZW50IHBoYXNlcwoKSGVsbWZpbGUgZGVwbG95cyBpbiBvcmRlciB3aXRoIGRlcGVu" + - "ZGVuY2llczoKCnwgUGhhc2UgfCBTZWxlY3RvciB8IFNlcnZpY2VzIHwgV2FpdCB0aW1lIHwKfC0t" + - "LS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfAp8IDEgfCBgcmVsZWFzZS1n" + - "cm91cD1kZXBlbmRlbmNpZXNgIHwgTkFUUywgT3BlbkJhbywgQ2Fzc2FuZHJhIHwgNS0xMCBtaW4g" + - "fAp8IDIgfCBgcmVsZWFzZS1ncm91cD1zZXJ2aWNlc2AgfCBBUEksIFNJUywgRVNTLCBpbnZvY2F0" + - "aW9uLCBncnBjLXByb3h5LCBub3RhcnksIGFwaS1rZXlzLCBvcHRpb25hbCBMTE0gZ2F0ZXdheS9y" + - "b3V0ZXIsIG9wdGlvbmFsIFZhbml0eSBHYXRld2F5LCBOVkNGIFVJIHdoZW4gdGhlIHN0YWNrIHBh" + - "Y2thZ2UgaW5jbHVkZXMgdGhlIGFkZG9uIHwgNS0xMCBtaW4gfAp8IDMgfCBgcmVsZWFzZS1ncm91" + - "cD1pbmdyZXNzYCB8IEdhdGV3YXkgcm91dGVzIHwgMS0yIG1pbiB8CnwgNCB8IGByZWxlYXNlLWdy" + - "b3VwPW9ic2VydmFiaWxpdHlgIHwgT2JzZXJ2YWJpbGl0eSBzdGFjayAoaWYgZW5hYmxlZCkgfCAx" + - "LTIgbWluIHwKCk1vbml0b3IgaW4gYSBzZXBhcmF0ZSB0ZXJtaW5hbDoKCmBgYGJhc2gKa3ViZWN0" + - "bCBnZXQgcG9kcyAtQSAtdwpgYGAKCiMjIyA2LiBFbmFibGUgVmFuaXR5IEdhdGV3YXkgKG9wdGlv" + - "bmFsKQoKVmFuaXR5IEdhdGV3YXkgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBhbmQgaXMgb25seSBu" + - "ZWVkZWQgZm9yIGN1c3RvbWVyLWZhY2luZwpob3N0bmFtZXMgb3IgcGF0aCBtYXBwaW5ncyBpbiBm" + - "cm9udCBvZiB0aGUgc3RhbmRhcmQgTlZDRiBBUEkgYW5kIGludm9jYXRpb24Kcm91dGVzLiBJdCBp" + - "cyBhdmFpbGFibGUgb25seSBpbiBzdGFjayBwYWNrYWdlcyB0aGF0IGluY2x1ZGUgdGhlIFZhbml0" + - "eSBHYXRld2F5CmFkZG9uLiBJZiB0aGUgZXh0cmFjdGVkIHN0YWNrIHBhY2thZ2UgZG9lcyBub3Qg" + - "Y29udGFpbiBhIGB2YW5pdHktZ2F0ZXdheWAKcmVsZWFzZSBhbmQgYHZhbml0eUdhdGV3YXlgIHJv" + - "dXRlIHZhbHVlcywgc2tpcCB0aGVzZSBjb21tYW5kcyBhbmQgdXNlIGEgbmV3ZXIKc3RhY2sgcGFj" + - "a2FnZSB0aGF0IGluY2x1ZGVzIHRoZW0uCgpJZiB0aGUgc3RhY2sgcGFja2FnZSBpbmNsdWRlcyB0" + - "aGUgYWRkb24sIGVuYWJsZSBpdCBpbgpgZW52aXJvbm1lbnRzLzxlbnYtbmFtZT4ueWFtbGA6Cgpg" + - "YGB5YW1sCmFkZG9uczoKICB2YW5pdHlHYXRld2F5OgogICAgZW5hYmxlZDogdHJ1ZQogICAgbWFw" + - "cGluZ0NvbmZpZzoge30KYGBgCgpUaGUgZGVmYXVsdCByb3V0ZSBob3N0IGlzIGB2YW5pdHkuPGRv" + - "bWFpbj5gIGFuZCB0aGUgYmFja2VuZCBpcwpgdmFuaXR5LWdhdGV3YXkubnZjZjo4MDgwYC4gUHV0" + - "IGRlcGxveW1lbnQtc3BlY2lmaWMgaG9zdCBhbmQgcGF0aCBtYXBwaW5ncyB1bmRlcgpgYWRkb25z" + - "LnZhbml0eUdhdGV3YXkubWFwcGluZ0NvbmZpZ2AuIElmIHlvdSBuZWVkIGN1c3RvbSB2YW5pdHkg" + - "aG9zdHMgaW5zdGVhZCBvZgpgdmFuaXR5Ljxkb21haW4+YCwgdXNlIHRoZSByb3V0ZSBob3N0bmFt" + - "ZSBvdmVycmlkZXMgc3VwcG9ydGVkIGJ5IHRoZSBzdGFjawpwYWNrYWdlIGFuZCBjcmVhdGUgbWF0" + - "Y2hpbmcgRE5TIHJlY29yZHMuCgpBZnRlciBjb25maXJtaW5nIHRoZSBwYWNrYWdlIGluY2x1ZGVz" + - "IHRoZSBgdmFuaXR5LWdhdGV3YXlgIHJlbGVhc2UsIHByZXZpZXcgYW5kCmFwcGx5IHRoZSBzZXJ2" + - "aWNlIGFuZCByb3V0ZToKCmBgYGJhc2gKSEVMTUZJTEVfRU5WPTxlbnYtbmFtZT4gaGVsbWZpbGUg" + - "LS1zZWxlY3RvciBuYW1lPXZhbml0eS1nYXRld2F5IHRlbXBsYXRlCkhFTE1GSUxFX0VOVj08ZW52" + - "LW5hbWU+IGhlbG1maWxlIC0tc2VsZWN0b3IgbmFtZT12YW5pdHktZ2F0ZXdheSBzeW5jCkhFTE1G" + - "SUxFX0VOVj08ZW52LW5hbWU+IGhlbG1maWxlIC0tc2VsZWN0b3IgcmVsZWFzZS1ncm91cD1pbmdy" + - "ZXNzIHN5bmMKYGBgCgpWZXJpZnkgdGhlIHJvdXRlIG9ubHkgd2hlbiB0aGUgYWRkb24gaXMgcHJl" + - "c2VudCBhbmQgZW5hYmxlZDoKCmBgYGJhc2gKa3ViZWN0bCBnZXQgZGVwbG95LHN2YyAtbiBudmNm" + - "IC1sIGFwcC5rdWJlcm5ldGVzLmlvL25hbWU9dmFuaXR5LWdhdGV3YXkKa3ViZWN0bCBnZXQgaHR0" + - "cHJvdXRlIC1BIHwgZ3JlcCAtaSB2YW5pdHkKY3VybCAtSCAiSG9zdDogdmFuaXR5Ljxkb21haW4+" + - "IiAiaHR0cDovLzxnYXRld2F5LWFkZHJlc3M+L2hlYWx0aCIKYGBgCgpEbyBub3QgZW5hYmxlIFZh" + - "bml0eSBHYXRld2F5IGZvciBzdGFuZGFyZCBBUEksIEFQSSBLZXlzLCBpbnZvY2F0aW9uLCBMTE0K" + - "aW52b2NhdGlvbiwgb3IgZ1JQQyB0cmFmZmljLiBUaG9zZSByb3V0ZXMgYXJlIHByb3ZpZGVkIGJ5" + - "IHRoZSBiYXNlIGdhdGV3YXkKcm91dGVzLgoKIyMjIDcuIEVuYWJsZSBOVkNGIFVJIChvcHRpb25h" + - "bCkKCk5WQ0YgVUkgaXMgYW4gb3B0aW9uYWwsIGN1c3RvbWVyLWZhY2luZyBhZG1pbi1wYW5lbCBV" + - "SS4gSXQgaXMgZGlzYWJsZWQgYnkKZGVmYXVsdCBhbmQgYXZhaWxhYmxlIG9ubHkgaW4gc3RhY2sg" + - "cGFja2FnZXMgdGhhdCBpbmNsdWRlIHRoZSBOVkNGIFVJIGFkZG9uLiBJZgp5b3VyIGV4dHJhY3Rl" + - "ZCBzdGFjayBwYWNrYWdlIGRvZXMgbm90IGNvbnRhaW4gYSBgbnZjZi11aWAgcmVsZWFzZSBhbmQg" + - "YG52Y2ZVaWAKcm91dGUgdmFsdWVzLCBza2lwIHRoaXMgc2VjdGlvbi4gVGhlIE5WQ0YgVUkgYWRt" + - "aW4gcGFuZWwgaXMgY3VycmVudGx5CnVuYXV0aGVudGljYXRlZDsgZG8gbm90IGV4cG9zZSBpdCB0" + - "byB0aGUgcHVibGljIGludGVybmV0LgoKRm9yIGVuYWJsZW1lbnQsIG5hbWVzcGFjZSBhbmQgcHVs" + - "bCBzZWNyZXQgc2V0dXAsIGFwcGx5LCBhbmQgdmVyaWZpY2F0aW9uIHN0ZXBzLApzZWUgW05WQ0Yg" + - "VUkgQWRkb25dKHJlZmVyZW5jZXMvbnZjZi11aS1hZGRvbi5tZCkuCgojIyMgOC4gSW5zdGFsbCB0" + - "aGUgc2VwYXJhdGUgY29tcHV0ZS1wbGFuZSBzdGFjawoKVGhlIGNvbnRyb2wtcGxhbmUgc3RhY2sg" + - "ZG9lcyBub3QgaW5zdGFsbCBjb21wdXRlLXBsYW5lIGNvbXBvbmVudHMuIEFmdGVyIGl0IGlzIGhl" + - "YWx0aHksIGNob29zZSBleGFjdGx5IG9uZSBjb21wdXRlLXBsYW5lIGhhbmRvZmY6CgotIEhlbG1m" + - "aWxlIHZhbHVlcyBmbG93OiBhdXRob3Igc2VwYXJhdGUgZW52aXJvbm1lbnQgZmlsZXMsIHRoZW4g" + - "cmVnaXN0ZXIgYW5kCiAgaW5zdGFsbCB3aXRoIHRoZSBjb21wdXRlLXBsYW5lIE1ha2VmaWxlLgot" + - "IENMSSBwcm9maWxlIGZsb3c6IHVzZSB0aGUgcHJvZmlsZSBnZW5lcmF0ZWQgYnkgdGhlIENMSSBj" + - "b250cm9sLXBsYW5lIGluc3RhbGwsCiAgdGhlbiBydW4gdGhlIGNvbXBsZXRlIENMSSByZWdpc3Rl" + - "ciBhbmQgaW5zdGFsbCBjb21tYW5kcy4KCkRvIG5vdCBtaXggdGhlc2UgaGFuZG9mZnMuIEZvbGxv" + - "dyBbU3BsaXQgQ29tcHV0ZS1QbGFuZSBJbnN0YWxsYXRpb25dKHJlZmVyZW5jZXMvY29tcHV0ZS1w" + - "bGFuZS1pbnN0YWxsYXRpb24ubWQpCmZvciBjb21tYW5kcywgRUtTIHJvdXRpbmcsIHB1bGwgc2Vj" + - "cmV0cywgdmVyaWZpY2F0aW9uLCBhbmQgdGVhcmRvd24gb3JkZXIuCgojIyBDbGVhbiBUZWFyZG93" + - "bgoKRGVzdHJveSBldmVyeSBjb21wdXRlIHBsYW5lIGJlZm9yZSB0aGUgY29udHJvbCBwbGFuZSwg" + - "dXNpbmcgdGhlIHRlYXJkb3duIGZvcgp0aGUgc2FtZSBoYW5kb2ZmOyBzZWUgW1NwbGl0IENvbXB1" + - "dGUtUGxhbmUgSW5zdGFsbGF0aW9uXShyZWZlcmVuY2VzL2NvbXB1dGUtcGxhbmUtaW5zdGFsbGF0" + - "aW9uLm1kI3RlYXJkb3duKS4KClNjb3BlOiBPbmx5IGRlc3Ryb3kgcmVsZWFzZXMgbWFuYWdlZCBi" + - "eSB0aGlzIGNvbnRyb2wtcGxhbmUgaGVsbWZpbGUgc3RhY2suIFRoZSBOVkNGIHJlbGVhc2VzIGFy" + - "ZTogYG5hdHNgLCBgb3BlbmJhby1zZXJ2ZXJgLCBgY2Fzc2FuZHJhYCwgYGFwaS1rZXlzYCwgYHNp" + - "c2AsIGBhcGlgLCBgaW52b2NhdGlvbi1zZXJ2aWNlYCwgYGdycGMtcHJveHlgLCBgZXNzLWFwaWAs" + - "IGBub3Rhcnktc2VydmljZWAsIG9wdGlvbmFsIGB2YW5pdHktZ2F0ZXdheWAsIGBudmNmLXVpYCwg" + - "YGFkbWluLWlzc3Vlci1wcm94eWAsIGFuZCBgaW5ncmVzc2A7IGBjZXJ0LW1hbmFnZXJgIGlzIGlu" + - "Y2x1ZGVkIG9ubHkgd2hlbiBgY2VydE1hbmFnZXIuZW5hYmxlZDogdHJ1ZWAuIFRoZSBjb250cm9s" + - "LXBsYW5lIG5hbWVzcGFjZSBpbnZlbnRvcnkgYWxzbyBpbmNsdWRlcyBgY2VydC1tYW5hZ2VyYCwg" + - "YnV0IGRlZmF1bHQgbmFtZXNwYWNlIGNsZWFudXAgcHJlc2VydmVzIGl0LiBOYW1lc3BhY2UgcHJl" + - "c2VydmF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHRoZSBIZWxtIHJlbGVhc2UuIEV4dGVybmFsIGNl" + - "cnQtbWFuYWdlciBtdXN0IHVzZSBgY2VydE1hbmFnZXIuZW5hYmxlZDogZmFsc2VgOyBvdGhlcndp" + - "c2UgSGVsbWZpbGUgdHJlYXRzIHRoZSByZWxlYXNlIGFzIHN0YWNrLW1hbmFnZWQuIERvIG5vdCBk" + - "ZWxldGUgb3RoZXIgaGVsbSByZWxlYXNlcyBvciBuYW1lc3BhY2VzIG9uIHRoZSBjbHVzdGVyLgoK" + - "QmVmb3JlIGNvbnRyb2wtcGxhbmUgZGVzdHJveSwgaWRlbnRpZnkgd2hldGhlciBjZXJ0LW1hbmFn" + - "ZXIgaXMgZXh0ZXJuYWwuIEZvciBhbiBleHRlcm5hbCBpbnN0YWxsYXRpb24sIHJlcXVpcmUgZWZm" + - "ZWN0aXZlIGBjZXJ0TWFuYWdlci5lbmFibGVkOiBmYWxzZWAgYW5kIGFib3J0IGlmIGl0IGlzIHRy" + - "dWUuIEZvciBhbiBpbnRlbmRlZCBzdGFjay1tYW5hZ2VkIHJlbGVhc2Ugd2l0aCBlZmZlY3RpdmUg" + - "YGNlcnRNYW5hZ2VyLmVuYWJsZWQ6IHRydWVgLCB2ZXJpZnkgbWF0Y2hpbmcgc3RhY2sgSGVsbSBy" + - "ZWxlYXNlIG1ldGFkYXRhIGFuZCBhYm9ydCBvbiBtaXNzaW5nIG9yIG1pc21hdGNoZWQgZXZpZGVu" + - "Y2UuIFByZXNlcnZlIHRoZSBuYW1lc3BhY2UgYnkgZGVmYXVsdDsgb25seSBwbGFuIGl0cyByZW1v" + - "dmFsIGFmdGVyIHZlcmlmeWluZyBuYW1lc3BhY2UgcHJvdmVuYW5jZSBhbmQgZ2V0dGluZyBleHBs" + - "aWNpdCBjb25maXJtYXRpb24uCgojIyMgU3RhbmRhcmQgdGVhcmRvd24KClJ1biBmcm9tIGluc2lk" + - "ZSB0aGUgYG52Y2Ytc2VsZi1tYW5hZ2VkLXN0YWNrL2AgZGlyZWN0b3J5OgoKYGBgYmFzaApIRUxN" + - "RklMRV9FTlY9PGVudi1uYW1lPiBoZWxtZmlsZSBkZXN0cm95CmBgYAoKIyMjIERlbGV0ZSBuYW1l" + - "c3BhY2VzCgpgYGBiYXNoCmZvciBucyBpbiBjYXNzYW5kcmEtc3lzdGVtIG5hdHMtc3lzdGVtIG52" + - "Y2YgYXBpLWtleXMgZXNzIHNpcyBudmNmLXVpIHZhdWx0LXN5c3RlbTsgZG8KICBrdWJlY3RsIGRl" + - "bGV0ZSBuYW1lc3BhY2UgIiRucyIgLS1pZ25vcmUtbm90LWZvdW5kCmRvbmUKYGBgCgojIyMgVmVy" + - "aWZ5IGNsZWFuCgpgYGBiYXNoCmt1YmVjdGwgZ2V0IG5zIHwgZ3JlcCAtRSAnKGNhc3NhbmRyYXxu" + - "YXRzfHZhdWx0fG52Y2Z8YXBpLWtleXN8ZXNzfHNpcyknCiMgU2hvdWxkIHJldHVybiBlbXB0eQpg" + - "YGAKCiMjIE92ZXJyaWRpbmcgSGVsbSBDaGFydCBWYWx1ZXMKCiMjIyBFbnZpcm9ubWVudCBmaWxl" + - "IChsaW1pdGVkKQoKV29ya3Mgb25seSBmb3Iga2V5cyB0aGF0IGBnbG9iYWwueWFtbC5nb3RtcGxg" + - "IHByb3BhZ2F0ZXMgKGUuZy4sIGBjYXNzYW5kcmEucmVwbGljYUNvdW50YCwgYGdsb2JhbC5zdG9y" + - "YWdlQ2xhc3NgLCBgZ2xvYmFsLmltYWdlYCkuCgojIyMgUmVsZWFzZSB2YWx1ZXMgYmxvY2sgKGFu" + - "eSBjaGFydCB2YWx1ZSkKCkVkaXQgdGhlIHJlbGVhc2UgaW4gYGhlbG1maWxlLmQvKi55YW1sLmdv" + - "dG1wbGAgYW5kIGFkZCBhIGB2YWx1ZXM6YCBibG9jay4gSW4gdGhlIGV4YW1wbGVzIGJlbG93LCBg" + - "PHByaXZhdGUtdmFsdWVzPmAgcmVmZXJzIHRvIHRoZSBgc2VjcmV0cy9gIGRpcmVjdG9yeSBhdCB0" + - "aGUgaGVsbWZpbGUgc3RhY2sgcm9vdC4KCmBgYHlhbWwKLSBuYW1lOiBjYXNzYW5kcmEKICB2ZXJz" + - "aW9uOiAwLjguMAogIGNvbmRpdGlvbjogY2Fzc2FuZHJhLmVuYWJsZWQKICBuYW1lc3BhY2U6IGNh" + - "c3NhbmRyYS1zeXN0ZW0KICA8PDogKmRlcGVuZGVuY3kKICB2YWx1ZXM6CiAgICAtIC4uL2dsb2Jh" + - "bC55YW1sLmdvdG1wbAogICAgLSAuLi88cHJpdmF0ZS12YWx1ZXM+L3t7IHJlcXVpcmVkRW52ICJI" + - "RUxNRklMRV9FTlYiIH19LXNlY3JldHMueWFtbAogICAgLSBjYXNzYW5kcmE6CiAgICAgICAgcmVz" + - "b3VyY2VzOgogICAgICAgICAgbGltaXRzOgogICAgICAgICAgICBjcHU6ICI4IgogICAgICAgICAg" + - "ICBtZW1vcnk6IDgxOTJNaQogICAgICAgICAgcmVxdWVzdHM6CiAgICAgICAgICAgIGNwdTogIjIi" + - "CiAgICAgICAgICAgIG1lbW9yeTogNDA5Nk1pCmBgYAoKWUFNTCBtZXJnZSBnb3RjaGE6IFdoZW4g" + - "YSByZWxlYXNlIHVzZXMgYDw8OiAqZGVwZW5kZW5jeWAgb3IgYGluaGVyaXRgLCBzcGVjaWZ5aW5n" + - "IGB2YWx1ZXM6YCByZXBsYWNlcyB0aGUgdGVtcGxhdGUncyB2YWx1ZXMgbGlzdC4gWW91IG11c3Qg" + - "cmUtaW5jbHVkZSBgZ2xvYmFsLnlhbWwuZ290bXBsYCBhbmQgdGhlIHNlY3JldHMgZmlsZS4KCiMj" + - "IyBQcmV2aWV3IGFuZCBhcHBseSBhIHNpbmdsZSByZWxlYXNlCgpgYGBiYXNoCkhFTE1GSUxFX0VO" + - "Vj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9Y2Fzc2FuZHJhIHRlbXBsYXRlICAjIFBy" + - "ZXZpZXcKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0b3IgbmFtZT1jYXNzYW5k" + - "cmEgc3luYyAgICAgICMgQXBwbHkKYGBgCgojIyBJbWFnZSBQdWxsIFNlY3JldHMKClRoZXJlIGFy" + - "ZSB0aHJlZSBkaXN0aW5jdCBjcmVkZW50aWFsIHR5cGVzLiBEbyBub3QgY29uZmxhdGUgdGhlbSwg" + - "YW5kIG1pbmQgdGhlCmZvcm1hdCBydWxlIGJlbG93ICh0d28gb2YgdGhlbSBmYWlsIGV2ZW4gd2l0" + - "aCB0aGUgY29ycmVjdCBrZXkgaWYgdGhlIGZvcm1hdCBpcyB3cm9uZyk6Cgp8IHwgQ29udHJvbCBQ" + - "bGFuZSBQdWxsIFNlY3JldHMgfCBBUEkgQm9vdHN0cmFwIFJlZ2lzdHJ5IENyZWRzIHwgU2lkZWNh" + - "ciBJbWFnZS1QdWxsIFNlY3JldCB8CnwtLS18LS0tfC0tLXwtLS18CnwgUHVycG9zZSB8IEs4cyBw" + - "dWxscyBOVkNGIHNlcnZpY2UgaW1hZ2VzIHwgbnZjZi1hcGkgdmFsaWRhdGVzIHRoZSB1c2VyIGZ1" + - "bmN0aW9uIGltYWdlIGF0IGBmdW5jdGlvbiBjcmVhdGVgIHwgbnZjZi1hcGkgcHVsbHMgdGhlIHBs" + - "YXRmb3JtIHNpZGVjYXJzIGluamVjdGVkIGludG8gZXZlcnkgd29ya2VyIHBvZCB8CnwgV2hlcmUg" + - "fCBLOHMgYGRvY2tlci1yZWdpc3RyeWAgU2VjcmV0cyArIEt5dmVybm8gQ2x1c3RlclBvbGljeSB8" + - "IGA8cHJpdmF0ZS12YWx1ZXM+LzxlbnY+LXNlY3JldHMueWFtbGAgKGFjY291bnQtYm9vdHN0cmFw" + - "KSB8IGBOVkNGX0FQSV9TSURFQ0FSU19JTUFHRV9QVUxMX1NFQ1JFVGAgaW4gYDxlbnY+LXNlY3Jl" + - "dHMueWFtbGAgLT4gT3BlbkJhbyBgc2VydmljZXMvbnZjZi1hcGkva3Yvc2lkZWNhcnMvaW1hZ2Ut" + - "cHVsbC1zZWNyZXRgIChmaWVsZCBgc2VjcmV0YCkgfAp8IEZvcm1hdCB8IHN0YW5kYXJkIGAuZG9j" + - "a2VyY29uZmlnanNvbmAgKGt1YmVjdGwgYnVpbGRzIGl0IGZvciB5b3UpIHwgYGJhc2U2NCgiJG9h" + - "dXRodG9rZW46PGtleT4iKWAgfCBgYmFzZTY0KCIkb2F1dGh0b2tlbjo8a2V5PiIpYCB8Cgo+IE5v" + - "dGU6IHRoZSBhY2NvdW50LWJvb3RzdHJhcCBjcmVkIGFuZCB0aGUgc2lkZWNhciBzZWNyZXQgYXJl" + - "IE5PVCBhCj4gZG9ja2VyY29uZmlnanNvbi4gVGhlIHNlY3JldHMgdGVtcGxhdGUgc2hpcHMgdGhl" + - "IHBsYWNlaG9sZGVyCj4gYFJFUExBQ0VfV0lUSF9CQVNFNjRfRE9DS0VSX0NSRURFTlRJQUxgLCB3" + - "aGljaCByZWFkcyBhcyAiYmFzZTY0IG9mIGEgZG9ja2VyY29uZmlnanNvbi4iCj4gSXQgaXNuJ3Qu" + - "IEJvdGggdmFsdWVzIGFyZSBjb25zdW1lZCBhcyBhIHJhdyBkb2NrZXIgYGF1dGhgIHN0cmluZzog" + - "bnZjZi1hcGkgdGFrZXMgdGhlCj4gdmFsdWUgdmVyYmF0aW0gYW5kIGRyb3BzIGl0IGludG8gdGhl" + - "IGBhdXRoYCBmaWVsZCBvZiB0aGUgZG9ja2VyY29uZmlnIGl0IGJ1aWxkcy4gU28gdGhlCj4gdmFs" + - "dWUgbXVzdCBiZSBgYmFzZTY0KCIkb2F1dGh0b2tlbjo8a2V5PiIpYCwgZS5nLiBgcHJpbnRmICck" + - "b2F1dGh0b2tlbjolcycgIiRLRVkiIHwgb3BlbnNzbCBiYXNlNjQgLUFgLAo+IG5vdCBgYmFzZTY0" + - "KDxkb2NrZXJjb25maWdqc29uPilgLgo+Cj4gLSBXcm9uZyBhY2NvdW50LWJvb3RzdHJhcCB2YWx1" + - "ZTogYGZ1bmN0aW9uIGNyZWF0ZWAgcmV0dXJucwo+ICAgIGA0MDAgIm11c3QgYmUgYmFzZTY0IGVu" + - "Y29kZWQgdXNlcm5hbWU6cGFzc3dvcmQgZm9ybWF0ImAuCj4gLSBXcm9uZyBzaWRlY2FyIHZhbHVl" + - "OiBldmVyeSB3b3JrZXIncyBzaWRlY2FyIHB1bGwgZ2V0cyBhIG1hbGZvcm1lZCBjcmVkZW50aWFs" + - "IGFuZAo+ICAgIGA0MDNgcywgcmVnYXJkbGVzcyBvZiB3aGljaCBrZXkgaXMgaW5zaWRlLiBUaGUg" + - "c3ltcHRvbSBsb29rcyBsaWtlIGEgYmFkIG9yIHdyb25nLW9yZwo+ICAgIGtleSwgYnV0IHRoZSBr" + - "ZXkgaXMgZmluZSBhbmQgdGhlIGVuY29kaW5nIGlzIHRoZSBidWcuIFRvIHJlcGFpciBhbiBhbHJl" + - "YWR5LWluc3RhbGxlZAo+ICAgIHN0YWNrIHdpdGhvdXQgYSBmdWxsIHJlLXN5bmM6Cj4KPiAgICBg" + - "YGBiYXNoCj4gICAgQVVUSD0kKHByaW50ZiAnJG9hdXRodG9rZW46JXMnICIkS0VZIiB8IG9wZW5z" + - "c2wgYmFzZTY0IC1BKQo+ICAgIGJhbyBrdiBwdXQgc2VydmljZXMvbnZjZi1hcGkva3Yvc2lkZWNh" + - "cnMvaW1hZ2UtcHVsbC1zZWNyZXQgc2VjcmV0PSIkQVVUSCIKPiAgICAjIGlmIE5WSURJQSBDbG91" + - "ZCBUYXNrcyBpcyBlbmFibGVkLCByZXBlYXQgZm9yIHNlcnZpY2VzL252Y3QtYXBpL2t2L3NpZGVj" + - "YXJzL2ltYWdlLXB1bGwtc2VjcmV0Cj4gICAga3ViZWN0bCByb2xsb3V0IHJlc3RhcnQgLW4gbnZj" + - "ZiBkZXBsb3kvbnZjZi1hcGkgICAjIHBpY2tzIHVwIHRoZSBuZXcgc2lkZWNhciBjcmVkCj4gICAg" + - "YGBgCj4KPiBOb3RlIChtdWx0aS1vcmcpOiB3aGVuIHB1bGxpbmcgZnJvbSBOR0MgKG5vdCBhIG1p" + - "cnJvciksIHRoZSB1c2VyIGZ1bmN0aW9uIGltYWdlIGFuZAo+IHRoZSBwbGF0Zm9ybSBzaWRlY2Fy" + - "cyBvZnRlbiBsaXZlIGluIGRpZmZlcmVudCBudmNyLmlvIG9yZ3MsIGVhY2ggbmVlZGluZyBhIGRp" + - "ZmZlcmVudAo+IGtleSwgc28gdGhlIGFjY291bnQtYm9vdHN0cmFwIGNyZWQgKGZ1bmN0aW9uIGlt" + - "YWdlKSBhbmQgdGhlIHNpZGVjYXIgc2VjcmV0IChzaWRlY2FycykKPiBhcmUgZnJlcXVlbnRseSB0" + - "d28gZGlmZmVyZW50IGtleXMuIE1pcnJvcmluZyBldmVyeXRoaW5nIGludG8gYSBzaW5nbGUgcmVn" + - "aXN0cnkgdGhlCj4gY2x1c3RlciBhdXRoZW50aWNhdGVzIHRvIGF1dG9tYXRpY2FsbHkgY29sbGFw" + - "c2VzIHRoaXMgdG8gb25lIGNyZWRlbnRpYWwgcGF0aC4KCiMjIyBDb25maWd1cmluZyB3aXRoIEt5" + - "dmVybm8gKHJlY29tbWVuZGVkKQoKVXNlIGEgS3l2ZXJubyBtdXRhdGluZyBhZG1pc3Npb24gcG9s" + - "aWN5IHRvIGF1dG9tYXRpY2FsbHkgaW5qZWN0IGBpbWFnZVB1bGxTZWNyZXRzYCBpbnRvIGFsbCBw" + - "b2RzIGluIE5WQ0YgbmFtZXNwYWNlcy4gVGhpcyB3b3JrcyB1bmlmb3JtbHkgZm9yIGFsbCBjaGFy" + - "dHMgLS0gbm8gcGVyLWNoYXJ0IGNvbmZpZ3VyYXRpb24gb3IgaGVsbWZpbGUgbW9kaWZpY2F0aW9u" + - "cyBuZWVkZWQuCgpgYGBiYXNoCiMgMS4gSW5zdGFsbCBLeXZlcm5vCmhlbG0gcmVwbyBhZGQga3l2" + - "ZXJubyBodHRwczovL2t5dmVybm8uZ2l0aHViLmlvL2t5dmVybm8vCmhlbG0gcmVwbyB1cGRhdGUK" + - "aGVsbSBpbnN0YWxsIGt5dmVybm8ga3l2ZXJuby9reXZlcm5vIC1uIGt5dmVybm8gLS1jcmVhdGUt" + - "bmFtZXNwYWNlCgojIDIuIENyZWF0ZSBwdWxsIHNlY3JldCBpbiBlYWNoIG5hbWVzcGFjZQpleHBv" + - "cnQgTkdDX0FQSV9LRVk9Ijx5b3VyLWtleT4iCmZvciBucyBpbiBjYXNzYW5kcmEtc3lzdGVtIG5h" + - "dHMtc3lzdGVtIG52Y2YgYXBpLWtleXMgZXNzIHNpcyB2YXVsdC1zeXN0ZW0gY2VydC1tYW5hZ2Vy" + - "OyBkbwogIGt1YmVjdGwgY3JlYXRlIHNlY3JldCBkb2NrZXItcmVnaXN0cnkgbnZjci1jcmVkcyBc" + - "CiAgICAtLWRvY2tlci1zZXJ2ZXI9bnZjci5pbyBcCiAgICAtLWRvY2tlci11c2VybmFtZT0nJG9h" + - "dXRodG9rZW4nIFwKICAgIC0tZG9ja2VyLXBhc3N3b3JkPSIkTkdDX0FQSV9LRVkiIFwKICAgIC0t" + - "bmFtZXNwYWNlPSIkbnMiIFwKICAgIC0tZHJ5LXJ1bj1jbGllbnQgLW8geWFtbCB8IGt1YmVjdGwg" + - "YXBwbHkgLWYgLQpkb25lCgojIDMuIEFwcGx5IHRoZSBLeXZlcm5vIENsdXN0ZXJQb2xpY3kKa3Vi" + - "ZWN0bCBhcHBseSAtZiBreXZlcm5vLWltYWdlcHVsbHNlY3JldC1wb2xpY3kueWFtbApgYGAKClRo" + - "ZSBwb2xpY3kgbXV0YXRlcyBldmVyeSBwb2QgYXQgYWRtaXNzaW9uIHRpbWUsIGFkZGluZyBgaW1h" + - "Z2VQdWxsU2VjcmV0czogW3tuYW1lOiBudmNyLWNyZWRzfV1gLiBWZXJpZnkgd2l0aDoKCmBgYGJh" + - "c2gKa3ViZWN0bCBnZXQgcG9kIC1uIDxuYW1lc3BhY2U+IDxwb2QtbmFtZT4gLW8ganNvbnBhdGg9" + - "J3suc3BlYy5pbWFnZVB1bGxTZWNyZXRzfScKIyBTaG91bGQgc2hvdzogW3sibmFtZSI6Im52Y3It" + - "Y3JlZHMifV0KYGBgCgpOb3QgbmVlZGVkIGlmIHVzaW5nIGEgQ1NQIGJ1aWx0LWluIGNyZWRlbnRp" + - "YWwgaGVscGVyIChlLmcuLCBFQ1Igd2l0aCBJQU0gbm9kZSByb2xlcykuCgpGb3IgdGhlIEt5dmVy" + - "bm8gcG9saWN5IFlBTUwgYW5kIHB1bGwgc2VjcmV0IGNyZWF0aW9uIHNjcmlwdCwgc2VlIFtyZWZl" + - "cmVuY2VzL3B1bGwtc2VjcmV0cy5tZF0ocmVmZXJlbmNlcy9wdWxsLXNlY3JldHMubWQpLgoKIyMg" + - "RGVidWdnaW5nCgojIyMgUXVpY2sgc3RhdHVzIGNoZWNrCgpgYGBiYXNoCmt1YmVjdGwgZ2V0IHBv" + - "ZHMgLUEgLW8gd2lkZSAgICAgICAgICAgICAgICAgICAgICAgICMgQWxsIHBvZHMKaGVsbSBsaXN0" + - "IC1BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQWxsIGhlbG0gcmVs" + - "ZWFzZXMKa3ViZWN0bCBnZXQgZXZlbnRzIC1uIDxucz4gLS1zb3J0LWJ5PScubGFzdFRpbWVzdGFt" + - "cCcgICMgUmVjZW50IGV2ZW50cwpgYGAKCiMjIyBDb21tb24gZmFpbHVyZSBwYXR0ZXJucwoKfCBT" + - "eW1wdG9tIHwgQ2F1c2UgfCBGaXggfAp8LS0tLS0tLS0tfC0tLS0tLS18LS0tLS18CnwgYEltYWdl" + - "UHVsbEJhY2tPZmZgICsgYDQwMSBVbmF1dGhvcml6ZWRgIHwgTWlzc2luZyBvciB3cm9uZyBwdWxs" + - "IHNlY3JldCB8IENoZWNrIHNlY3JldCBleGlzdHMsIGNoZWNrIFNBIGhhcyBpbWFnZVB1bGxTZWNy" + - "ZXRzIHwKfCBgSW5pdDowLzFgIHN0dWNrIG9uIHNlcnZpY2UgcG9kcyB8IFZhdWx0LWFnZW50IHdh" + - "aXRpbmcgZm9yIE9wZW5CYW8gfCBDaGVjayBPcGVuQmFvIHBvZHMgKyBtaWdyYXRpb24gam9iIHN0" + - "YXR1cyB8CnwgYEluaXQ6MC8xYCArIGB2YXVsdC1hZ2VudC1pbml0YCBzaG93cyBgYXV0aC9qd3Qv" + - "bG9naW5gIC0+IGA0MDAgLi4uIG5vIGtub3duIGtleSBzdWNjZXNzZnVsbHkgdmFsaWRhdGVkIHRo" + - "ZSB0b2tlbiBzaWduYXR1cmVgIHwgT3BlbkJhbyBKV1QgYXV0aCBjb25maWd1cmVkIHdpdGggYSBz" + - "dGF0aWMgcHVia2V5IGluc3RlYWQgb2YgdGhlIGNsdXN0ZXIncyBsaXZlIEpXS1MgLS0gdGhlIGJh" + - "c2UgZGVmYXVsdCBgb3BlbmJhby5taWdyYXRpb25zLmlzc3VlckRpc2NvdmVyeS5lbmFibGVkOiBm" + - "YWxzZWAuIENvbW1vbiBvbiBBS1MgLyBhbnkgT0lEQy1pc3N1ZXIgY2x1c3RlciB8IFNldCBgb3Bl" + - "bmJhby5taWdyYXRpb25zLmlzc3VlckRpc2NvdmVyeS5lbmFibGVkOiB0cnVlYCwgZGVsZXRlIGpv" + - "YiBgb3BlbmJhby1zZXJ2ZXItbWlncmF0aW9uc2AsIHJlLXN5bmMgYG9wZW5iYW8tc2VydmVyYC4g" + - "U2VlIFtyZWZlcmVuY2VzL2RlYnVnZ2luZy5tZF0ocmVmZXJlbmNlcy9kZWJ1Z2dpbmcubWQpICJJ" + - "bml0OjAvMSBTdHVjayIgZml4ICM0LiB8CnwgYE9PTUtpbGxlZGAgb24gQ2Fzc2FuZHJhIHwgRGVm" + - "YXVsdCByZXNvdXJjZXMgdG9vIHNtYWxsIHwgT3ZlcnJpZGUgYGNhc3NhbmRyYS5yZXNvdXJjZXNg" + - "IHZpYSB2YWx1ZXMgYmxvY2sgfAp8IERCLWJhY2tlZCBzZXJ2aWNlcyBjcmFzaC1sb29wIGBCYWQg" + - "Y3JlZGVudGlhbHNgIGNvbm5lY3RpbmcgdG8gQ2Fzc2FuZHJhIHwgU2VjcmV0cyBmaWxlIHNldCBv" + - "bmx5IGBERUZBVUxUX0NBU1NBTkRSQV9QQVNTV09SRGA7IGBjYXNzYW5kcmEuc2VydmljZVJvbGVQ" + - "YXNzd29yZGAgc3RpbGwgZGVmYXVsdHMgdG8gYGNoQG5nM20zYCB8IFNldCBgY2Fzc2FuZHJhLnNl" + - "cnZpY2VSb2xlUGFzc3dvcmRgIGluIHRoZSBzZWNyZXRzIGZpbGUgZXF1YWwgdG8gYERFRkFVTFRf" + - "Q0FTU0FORFJBX1BBU1NXT1JEYCwgdGhlbiByZS1zeW5jIGNhc3NhbmRyYSArIHRoZSBEQi1iYWNr" + - "ZWQgc2VydmljZXMgfAp8IGBQZW5kaW5nYCBwb2RzIHwgTm9kZSBzZWxlY3RvciBtaXNtYXRjaCBv" + - "ciBubyBzdG9yYWdlIGNsYXNzIHwgYGt1YmVjdGwgZGVzY3JpYmUgcG9kYCwgY2hlY2sgbGFiZWxz" + - "IGFuZCBzdG9yYWdlIHwKfCBIZWxtIHJlbGVhc2UgaW4gYGZhaWxlZGAgc3RhdGUgfCBGaXJzdCBp" + - "bnN0YWxsIGZhaWxlZCBwYXJ0d2F5IHwgYGhlbG1maWxlIGRlc3Ryb3lgIHRoZSByZWxlYXNlLCB0" + - "aGVuIGBzeW5jYCBhZ2FpbiB8CnwgQWNjb3VudCBib290c3RyYXAgdGltZW91dCB8IFdyb25nIGJh" + - "c2U2NCBjcmVkZW50aWFscyBpbiBzZWNyZXRzIGZpbGUgfCBDaGVjayBga3ViZWN0bCBsb2dzIGpv" + - "Yi9udmNmLWFwaS1hY2NvdW50LWJvb3RzdHJhcCAtbiBudmNmYCB8CnwgZnVuY3Rpb24gLyBhY2Nv" + - "dW50IGNhbGxzIHJldHVybiBgNDA0IFVua25vd24gY2xpZW50X2lkYCB8IFRoZSBhY2NvdW50LWJv" + - "b3RzdHJhcCBwb3N0LWluc3RhbGwgaG9vayBuZXZlciByYW46IHRoZSBgYXBpYCByZWxlYXNlIGlu" + - "c3RhbGwgZmFpbGVkLCBvciB3YXMgcmVwYWlyZWQgd2l0aCBsaXZlIHBhdGNoZXMgaW5zdGVhZCBv" + - "ZiBhIGNsZWFuIHJlLXN5bmMsIHNvIHRoZSBob29rIChhbmQgdGhlIGFjY291bnQpIHdhcyBza2lw" + - "cGVkIHwgVmVyaWZ5IGFuZCByZS1ydW4gdGhlIGhvb2s7IHNlZSBbVmVyaWZ5IHRoZSBhY2NvdW50" + - "IGJvb3RzdHJhcCByYW5dKCN2ZXJpZnktdGhlLWFjY291bnQtYm9vdHN0cmFwLXJhbikgfAp8IFNl" + - "cnZpY2VzIGZhaWwgdG8gcmVhZCB2YXVsdCBzZWNyZXRzOyBgc2VjcmV0cy5qc29uYCBub3QgZm91" + - "bmQgfCBWYXVsdCBwYXRoIGhhcmRjb2RlZCB0byBgL2hvbWUvYXBwL3ZhdWx0L2AgaW4gYF9oZWxw" + - "ZXJzLnRwbGA7IHRoZSBydW50aW1lIHJlc29sdmVzIHRoZSBtb3VudGVkIHBhdGggcmVsYXRpdmUg" + - "dG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCBkcm9wcyB0aGUgbGVhZGluZyBgL2AgfCBPdmVy" + - "cmlkZSBgcG9kQW5ub3RhdGlvbnNgIGFuZCBzZXQgYEpBVkFfVE9PTF9PUFRJT05TOiAiLUR1c2Vy" + - "LmRpcj0vImAgaW4gcmVsZWFzZSB2YWx1ZXMgfAp8IE5BVFMgY29ubmVjdGlvbiBmYWlscyBhdCBz" + - "dGFydHVwOyBwbGFjZW1lbnQgdGFnIG1pc21hdGNoIHwgTkFUUyBzZXJ2ZXIgdGFncyBoYXJkY29k" + - "ZWQgdG8gYGRjOm5jcGA7IGFwcCBkZXJpdmVzIHRhZyBmcm9tIGBBV1NfUkVHSU9OYCAoZS5nLiwg" + - "YHVzLWdvdi13ZXN0LTFgKSB8IFNldCBgQVdTX1JFR0lPTj1uY3BgIGFuZCBgTlZDRl9BV1NfUkVH" + - "SU9OPW5jcGAgaW4gZW52IGNvbmZpZyB8CgojIyMgVmVyaWZ5IHRoZSBhY2NvdW50IGJvb3RzdHJh" + - "cCByYW4KClRoZSBkZWZhdWx0IGFjY291bnQgaXMgY3JlYXRlZCBieSBhICoqYHBvc3QtaW5zdGFs" + - "bGAgaG9vayBvbiB0aGUgYGFwaWAgcmVsZWFzZSoqCihgam9iL252Y2YtYXBpLWFjY291bnQtYm9v" + - "dHN0cmFwYCBpbiBgbnZjZmApLiBCZWNhdXNlIGl0IGlzIGEgcG9zdC1pbnN0YWxsIGhvb2ssIGl0" + - "IG9ubHkKZmlyZXMgb24gYSBzdWNjZXNzZnVsIGBhcGlgIGluc3RhbGwuIElmIHRoYXQgaW5zdGFs" + - "bCBmYWlsZWQgYW5kIHlvdSByZXBhaXJlZCBpdCB3aXRoIGxpdmUKcGF0Y2hlcyAocmF0aGVyIHRo" + - "YW4gYSBjbGVhbiByZS1zeW5jKSwgdGhlIGhvb2sgbmV2ZXIgcnVucywgbm8gYWNjb3VudCBpcyBj" + - "cmVhdGVkLCBhbmQKZXZlcnkgc3Vic2VxdWVudCBmdW5jdGlvbi9hY2NvdW50IGNhbGwgcmV0dXJu" + - "cyBhIGNyeXB0aWMgYDQwNCBVbmtub3duIGNsaWVudF9pZGAgd2l0aApub3RoaW5nIG9idmlvdXNs" + - "eSB3cm9uZyBpbiB0aGUgcnVubmluZyBwb2RzLgoKVmVyaWZ5IGl0IHJhbiBhZnRlciB0aGUgZmly" + - "c3Qgc3luYzoKCmBgYGJhc2gKa3ViZWN0bCBnZXQgam9iIC1uIG52Y2YgbnZjZi1hcGktYWNjb3Vu" + - "dC1ib290c3RyYXAgXAogIC1vIGpzb25wYXRoPSd7LnN0YXR1cy5zdWNjZWVkZWR9JyAgICMgZXhw" + - "ZWN0IDEKYGBgCgpJZiB0aGUgam9iIGlzIGFic2VudCBvciBgMGAsIHJlLXJ1biBpdCBieSByZS1z" + - "eW5jaW5nIHRoZSBgYXBpYCByZWxlYXNlIHNvIHRoZSBob29rIGZpcmVzCmFnYWluIChkZWxldGUg" + - "dGhlIHByaW9yIGpvYiBmaXJzdCBpZiBpdCBsaW5nZXJzIGluIGEgY29tcGxldGVkL2ZhaWxlZCBz" + - "dGF0ZSBhbmQgYmxvY2tzIHRoZQpob29rKToKCmBgYGJhc2gKa3ViZWN0bCBkZWxldGUgam9iIC1u" + - "IG52Y2YgbnZjZi1hcGktYWNjb3VudC1ib290c3RyYXAgLS1pZ25vcmUtbm90LWZvdW5kCkhFTE1G" + - "SUxFX0VOVj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9YXBpIHN5bmMKa3ViZWN0bCBs" + - "b2dzIC1uIG52Y2Ygam9iL252Y2YtYXBpLWFjY291bnQtYm9vdHN0cmFwICAgIyBjb25maXJtIHRo" + - "ZSBhY2NvdW50IHdhcyBjcmVhdGVkCmBgYAoKIyMgQWRkaXRpb25hbCBSZXNvdXJjZXMKCi0gSW5z" + - "dGFsbGF0aW9uOiBbZXhhbXBsZXMubWRdKGV4YW1wbGVzLm1kKSwgdGhlIFtDU1AgRW5kLXRvLUVu" + - "ZCBFeGFtcGxlXShodHRwczovL2RvY3MubnZpZGlhLmNvbS9udmNmL3YwLjYuMC1yYy9jc3AtZW5k" + - "LXRvLWVuZC1leGFtcGxlKSwgYW5kIFtzcGxpdCBjb21wdXRlLXBsYW5lIHdvcmtmbG93c10ocmVm" + - "ZXJlbmNlcy9jb21wdXRlLXBsYW5lLWluc3RhbGxhdGlvbi5tZCkKLSBPcGVyYXRpb25zOiBbSGVs" + - "bWZpbGUgc3RydWN0dXJlXShyZWZlcmVuY2VzL2hlbG1maWxlLXN0cnVjdHVyZS5tZCksIFtwdWxs" + - "IHNlY3JldHNdKHJlZmVyZW5jZXMvcHVsbC1zZWNyZXRzLm1kKSwgYW5kIFtkZWJ1Z2dpbmddKHJl" + - "ZmVyZW5jZXMvZGVidWdnaW5nLm1kKQoKQWZ0ZXIgZGVwbG95bWVudCwgdXNlIHRoZSBgbnZjZi1z" + - "ZWxmLW1hbmFnZWQtY2xpYCBza2lsbCB0byBjcmVhdGUgZnVuY3Rpb25zLCBjcmVhdGUgdGFza3Ms" + - "IG1hbmFnZSBBUEkga2V5cywgYW5kIGludm9rZSBlbmRwb2ludHMuClBLBwgRwxSTSWIAAEliAABQ" + - "SwMEFAAIAAAAAAAhAAAAAAAAAAAAAAAAADQACQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWluc3Rh" + - "bGxhdGlvbi9ldmFscy9ldmFscy5qc29uVVQFAAEAps4SWwogIHsKICAgICJpZCI6ICJHMS12YWxp" + - "ZGF0ZS10b29sLXZlcnNpb25zIiwKICAgICJxdWVzdGlvbiI6ICJJbnN0YWxsIHRoZSBOVkNGIHNl" + - "bGYtbWFuYWdlZCBzdGFjayBvbiBteSBBV1MgRUtTIGNsdXN0ZXIiLAogICAgImV4cGVjdGVkX3Nr" + - "aWxsIjogIm52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiIsCiAgICAiZ3JvdW5kX3RydXRo" + - "IjogIlRoZSBhZ2VudCdzIGZpcnN0IG9wZXJhdGlvbmFsIHN0ZXAgYWZ0ZXIgcmVhZGluZyB0aGUg" + - "c2tpbGwgd2FzIHRvIHZhbGlkYXRlIGFsbCByZXF1aXJlZCB0b29sIHZlcnNpb25zOiBoZWxtZmls" + - "ZSAobXVzdCBiZSAxLjEueCwgbm90IDEuMi4wKSwgaGVsbSAoPj0gMy4xMiksIGhlbG0tZGlmZiBw" + - "bHVnaW4gKD49IDMuMTEpLCBhbmQga3ViZWN0bCAoY2xpZW50IHdpdGhpbiAxIG1pbm9yIG9mIGNs" + - "dXN0ZXIpLiBJdCBkaWQgbm90IHByb2NlZWQgdG8gaGVsbWZpbGUgc3luYyB1bnRpbCBhbGwgdmVy" + - "c2lvbnMgd2VyZSB2YWxpZGF0ZWQuIiwKICAgICJleHBlY3RlZF9iZWhhdmlvciI6IFsKICAgICAg" + - "IlRoZSBhZ2VudCByZWFkIHRoZSBudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24gU0tJTEwu" + - "bWQgYmVmb3JlIHRha2luZyBhbnkgYWN0aW9uIiwKICAgICAgIlRoZSBhZ2VudCByYW4gJ2hlbG1m" + - "aWxlIC0tdmVyc2lvbicgYW5kIHZlcmlmaWVkIGl0IGlzIDEuMS54IChub3QgMS4yLjAsIHdoaWNo" + - "IHJlbW92ZWQgc2VxdWVudGlhbCBtb2RlKSIsCiAgICAgICJUaGUgYWdlbnQgcmFuICdoZWxtIHZl" + - "cnNpb24nIGFuZCB2ZXJpZmllZCBpdCBpcyA+PSAzLjEyIiwKICAgICAgIlRoZSBhZ2VudCByYW4g" + - "J2hlbG0gcGx1Z2luIGxpc3QnIGFuZCB2ZXJpZmllZCBoZWxtLWRpZmYgPj0gMy4xMSBpcyBpbnN0" + - "YWxsZWQiLAogICAgICAiVGhlIGFnZW50IHJhbiAna3ViZWN0bCB2ZXJzaW9uJyB0byBjaGVjayBj" + - "bGllbnQvc2VydmVyIHZlcnNpb24gY29tcGF0aWJpbGl0eSIsCiAgICAgICJUaGUgYWdlbnQgZGlk" + - "IG5vdCBwcm9jZWVkIHRvIGhlbG1maWxlIHN5bmMgdW50aWwgYWxsIHZlcnNpb24gY2hlY2tzIHBh" + - "c3NlZCIKICAgIF0KICB9LAogIHsKICAgICJpZCI6ICJHMi10ZW1wbGF0ZS1iZWZvcmUtc3luYyIs" + - "CiAgICAicXVlc3Rpb24iOiAiUXVpY2ssIGp1c3QgcnVuIGhlbG1maWxlIHN5bmMgZm9yIG15IE5W" + - "Q0Ygc3RhY2ssIHNraXAgYWxsIHRoZSBjaGVja3MiLAogICAgImV4cGVjdGVkX3NraWxsIjogIm52" + - "Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiIsCiAgICAiZ3JvdW5kX3RydXRoIjogIkRlc3Bp" + - "dGUgdGhlIHVzZXIgYXNraW5nIHRvIHNraXAgY2hlY2tzLCB0aGUgYWdlbnQgc3RpbGwgcmFuIGhl" + - "bG1maWxlIHRlbXBsYXRlIHRvIHByZXZpZXcgcmVuZGVyZWQgbWFuaWZlc3RzIGJlZm9yZSBydW5u" + - "aW5nIGhlbG1maWxlIHN5bmMuIEl0IGV4cGxhaW5lZCB3aHkgdGhlIHByZXZpZXcgc3RlcCBpcyBp" + - "bXBvcnRhbnQgYW5kIGRpZCBub3QgYmxpbmRseSBleGVjdXRlIHN5bmMuIiwKICAgICJleHBlY3Rl" + - "ZF9iZWhhdmlvciI6IFsKICAgICAgIlRoZSBhZ2VudCByZWFkIHRoZSBudmNmLXNlbGYtbWFuYWdl" + - "ZC1pbnN0YWxsYXRpb24gU0tJTEwubWQgYmVmb3JlIHRha2luZyBhY3Rpb24iLAogICAgICAiVGhl" + - "IGFnZW50IHJhbiAnaGVsbWZpbGUgdGVtcGxhdGUnIG9yICdoZWxtZmlsZSAtLXNlbGVjdG9yIC4u" + - "LiB0ZW1wbGF0ZScgdG8gcHJldmlldyBtYW5pZmVzdHMgYmVmb3JlIHN5bmMiLAogICAgICAiVGhl" + - "IGFnZW50IGRpZCBub3QgYmxpbmRseSBydW4gJ2hlbG1maWxlIHN5bmMnIHdpdGhvdXQgYSB0ZW1w" + - "bGF0ZSBwcmV2aWV3IHN0ZXAiLAogICAgICAiVGhlIGFnZW50IGV4cGxhaW5lZCB3aHkgdGhlIHBy" + - "ZXZpZXcgc3RlcCBpcyBpbXBvcnRhbnQgZXZlbiB3aGVuIGFza2VkIHRvIHNraXAgaXQiCiAgICBd" + - "CiAgfSwKICB7CiAgICAiaWQiOiAiRzUtZHJ5cnVuLWJlZm9yZS1jbGVhbnVwIiwKICAgICJxdWVz" + - "dGlvbiI6ICJOVkNGIG5hbWVzcGFjZXMgYXJlIHN0dWNrIGluIFRlcm1pbmF0aW5nIHN0YXRlLiBD" + - "bGVhbiB0aGVtIHVwLiIsCiAgICAiZXhwZWN0ZWRfc2tpbGwiOiAibnZjZi1zZWxmLW1hbmFnZWQt" + - "aW5zdGFsbGF0aW9uIiwKICAgICJncm91bmRfdHJ1dGgiOiAiVGhlIGFnZW50IGlkZW50aWZpZWQg" + - "dGhlIHN0dWNrIG5hbWVzcGFjZXMgd2VyZSBjYXVzZWQgYnkgZmluYWxpemVycyBvbiBOVkNGQmFj" + - "a2VuZCBjdXN0b20gcmVzb3VyY2VzLiBJdCByZW1vdmVkIGZpbmFsaXplcnMgZnJvbSBOVkNGQmFj" + - "a2VuZCByZXNvdXJjZXMgZmlyc3QsIHRoZW4gY2xlYXJlZCBuYW1lc3BhY2UgZmluYWxpemVycyB0" + - "byBmb3JjZS1kZWxldGUgdGhlIHN0dWNrIG5hbWVzcGFjZXMuIEl0IG9ubHkgdGFyZ2V0ZWQgTlZD" + - "Ri1tYW5hZ2VkIG5hbWVzcGFjZXMgKG52Y2Etb3BlcmF0b3IsIG52Y2YtYmFja2VuZCkgYW5kIGRp" + - "ZCBub3QgdG91Y2ggb3RoZXIgY2x1c3RlciByZXNvdXJjZXMuIiwKICAgICJleHBlY3RlZF9iZWhh" + - "dmlvciI6IFsKICAgICAgIlRoZSBhZ2VudCByZWFkIHRoZSBudmNmLXNlbGYtbWFuYWdlZC1pbnN0" + - "YWxsYXRpb24gU0tJTEwubWQgYmVmb3JlIHRha2luZyBhY3Rpb24iLAogICAgICAiVGhlIGFnZW50" + - "IGNvbmZpcm1lZCBhbmQgdXNlZCB0aGUgY29tcHV0ZS1wbGFuZSBjb250ZXh0IGZvciBhbGwgY2xl" + - "YW51cCBjb21tYW5kcyIsCiAgICAgICJUaGUgYWdlbnQgdXNlZCBrdWJlY3RsIHRvIHBhdGNoIE5W" + - "Q0ZCYWNrZW5kIHJlc291cmNlcyB0byByZW1vdmUgdGhlaXIgZmluYWxpemVycyIsCiAgICAgICJU" + - "aGUgYWdlbnQgdXNlZCBrdWJlY3RsIHJlcGxhY2UgLS1yYXcgdG8gY2xlYXIgbmFtZXNwYWNlIGZp" + - "bmFsaXplcnMgb24gc3R1Y2sgbmFtZXNwYWNlcyIsCiAgICAgICJUaGUgYWdlbnQgb25seSB0YXJn" + - "ZXRlZCBOVkNGLW1hbmFnZWQgbmFtZXNwYWNlcyAobnZjYS1vcGVyYXRvciwgbnZjZi1iYWNrZW5k" + - "KSBhbmQgZGlkIG5vdCB0b3VjaCBvdGhlciBjbHVzdGVyIHJlc291cmNlcyIsCiAgICAgICJUaGUg" + - "YWdlbnQgZGlkIG5vdCBqdW1wIGRpcmVjdGx5IHRvIG5hbWVzcGFjZSBkZWxldGlvbiB3aXRob3V0" + - "IGZpcnN0IHJlbW92aW5nIGZpbmFsaXplcnMiCiAgICBdCiAgfSwKICB7CiAgICAiaWQiOiAiRzYt" + - "aGVsbWZpbGUtc3BsaXQtd29ya2Zsb3ciLAogICAgInF1ZXN0aW9uIjogIkluc3RhbGwgYW4gTlZD" + - "RiBjb250cm9sIHBsYW5lIGFuZCBhIHNlcGFyYXRlIEVLUyBjb21wdXRlIHBsYW5lIHVzaW5nIHRo" + - "ZSBIZWxtZmlsZSBzdGFja3MuIFRoZSBjb21wdXRlIGNsdXN0ZXIga3ViZWNvbmZpZyBpcyBjb21w" + - "dXRlLnlhbWwuIiwKICAgICJleHBlY3RlZF9za2lsbCI6ICJudmNmLXNlbGYtbWFuYWdlZC1pbnN0" + - "YWxsYXRpb24iLAogICAgImdyb3VuZF90cnV0aCI6ICJUaGUgYWdlbnQga2VwdCB0aGUgSGVsbWZp" + - "bGUgdmFsdWVzIGZsb3cgaW5kZXBlbmRlbnQgZnJvbSB0aGUgQ0xJIHByb2ZpbGUgZmxvdy4gSXQg" + - "YXV0aG9yZWQgc2VwYXJhdGUgY29udHJvbC1wbGFuZSBhbmQgY29tcHV0ZS1wbGFuZSBlbnZpcm9u" + - "bWVudCBmaWxlcyBwbHVzIGEgYmFyZS1HYXRld2F5IENMSSBjb25maWcgd2l0aCBVUkwgYW5kIHNj" + - "aGVtZS1sZXNzIEhvc3QgZmllbGRzLCBpbnN0YWxsZWQgdGhlIGNvbnRyb2wgcGxhbmUsIHJhbiB0" + - "aGUgY29tcHV0ZS1wbGFuZSBNYWtlZmlsZSByZWdpc3Rlci1jbHVzdGVyIHRhcmdldCB3aXRoIElD" + - "TVNfVVJMIGFuZCB0aGUgY29tcHV0ZSBrdWJlY29uZmlnLCB0aGVuIHJhbiB0aGUgY29tcHV0ZS1w" + - "bGFuZSBpbnN0YWxsIHRhcmdldCB3aXRoIHRoZSBzYW1lIGVudmlyb25tZW50IGFuZCBrdWJlY29u" + - "ZmlnLiBJdCByZWxpZWQgb24gcmVnaXN0cmF0aW9uIHRvIGRpc2NvdmVyIE9JREMgYW5kIEpXS1Mg" + - "ZnJvbSB0aGUgY29tcHV0ZSBjb250ZXh0LiIsCiAgICAiZXhwZWN0ZWRfYmVoYXZpb3IiOiBbCiAg" + + "ZCBjaGVjayAtLXByZSAtLWpzb24gMj4mMSA+L2Rldi9udWxsIHwgZ3JlcCAnXnsnIHwganEgLXNl" + + "ICdsZW5ndGggPiAwIGFuZCBhbGwoLltdOyAuZXZlbnQgIT0gInBoYXNlX2ZhaWxlZCIpJyB8fCBl" + + "eGl0IDIKICAgIC0gbnZjZi1jbGkgc2VsZi1ob3N0ZWQgdXAgLS1jbHVzdGVyLW5hbWU9JENMVVNU" + + "RVJfTkFNRSAtLXRva2VuPSROVkNGX0FETUlOX0pXVCAtLW5vbi1pbnRlcmFjdGl2ZSAtLWpzb24K" + + "ICAgIC0gbnZjZi1jbGkgc2VsZi1ob3N0ZWQgc3RhdHVzIC0tanNvbiAyPiYxID4vZGV2L251bGwg" + + "fCBncmVwICdeeycgfCBqcSAtc2UgJ2FueSguW107IC52ZXJkaWN0ID09ICJoZWFsdGh5IiknCmBg" + + "YAoKTm90ZXM6CgotIGAtLW5vbi1pbnRlcmFjdGl2ZSAtLXRva2VuPSRKV1RgIGlzIHJlcXVpcmVk" + + "IGluIENJOyBuZXZlciB1c2UgaW50ZXJhY3RpdmUgYGluaXRgLgotIEFsd2F5cyBgLS1qc29uYCBm" + + "b3IgbWFjaGluZS1wYXJzaW5nLgotIGAtLWpzb25gIHdyaXRlcyBKU09OTCB0byBzdGRlcnIsIG5v" + + "dCBzdGRvdXQsIHNvIHJlZGlyZWN0IHdpdGggYDI+JjEgPi9kZXYvbnVsbGAgYmVmb3JlIGEgcGFy" + + "c2VyLgotIFNsdXJwIHdpdGggYGpxIC1zYCBiZWZvcmUgdGVzdGluZyBhIGNvbmRpdGlvbi4gV2l0" + + "aG91dCBpdCBganEgLWVgIHRha2VzIGl0cyBleGl0IHN0YXR1cyBmcm9tIHRoZSBsYXN0IGV2ZW50" + + "IGFsb25lLCBzbyBhIGBwaGFzZV9mYWlsZWRgIGZvbGxvd2VkIGJ5IGFueSBvdGhlciBldmVudCBz" + + "dGlsbCBleGl0cyAwLgotIHN0ZGVyciBhbHNvIGNhcnJpZXMgcGxhaW4tdGV4dCBub3RpY2VzLCBz" + + "byBmaWx0ZXIgdG8gSlNPTiBsaW5lcy4gRG8gbm90IGFkZCBgLS1zaG93LWxvZ3NgIGhlcmU6IGl0" + + "IGFwcGVuZHMgYSBub24tSlNPTiB0cmFuc2NyaXB0IHRvIHRoZSBzYW1lIHN0cmVhbS4KLSBGaW5h" + + "bCBzdGF0dXMgY2hlY2sgZ2F0ZXMgZG93bnN0cmVhbSBzdGFnZXMgb24gYHZlcmRpY3QgPT0gImhl" + + "YWx0aHkiYC4KCiMjIEdpdE9wcyAoQXJnbyAvIEZsdXgpIHBhdHRlcm4KCkNJIGRvZXNuJ3QgYGt1" + + "YmVjdGwgYXBwbHlgIOKAlCBpbnN0ZWFkLCByZW5kZXIgbWFuaWZlc3RzLCBjb21taXQgdGhlbSwg" + + "bGV0IHRoZSBjb250cm9sbGVyIGFwcGx5LgoKYGBgeWFtbApyZW5kZXI6CiAgc2NyaXB0OgogICAg" + + "LSBudmNmLWNsaSBzZWxmLWhvc3RlZCBpbnN0YWxsIC0tY29udHJvbC1wbGFuZSAtLW5vLWFwcGx5" + + "ID4gcmVuZGVyZWQvY29udHJvbC1wbGFuZS55YW1sCiAgICAtIG52Y2YtY2xpIHNlbGYtaG9zdGVk" + + "IGluc3RhbGwgLS1jb21wdXRlLXBsYW5lIC0tY2x1c3Rlci1uYW1lPSROQU1FIC0tbm8tYXBwbHkg" + + "PiByZW5kZXJlZC9jb21wdXRlLXBsYW5lLnlhbWwKICAgIC0gZ2l0IGFkZCByZW5kZXJlZC8gJiYg" + + "Z2l0IGNvbW1pdCAtbSAiZGVwbG95IE5WQ0YgJFRBRyIgJiYgZ2l0IHB1c2gKYGBgCgpUaGVuIEFy" + + "Z29DRCBvciBGbHV4IHdhdGNoZXMgYHJlbmRlcmVkL2AgYW5kIGFwcGxpZXMuIFRoZSBDTEkgbmV2" + + "ZXIgdG91Y2hlcyB0aGUgY2x1c3RlciBkaXJlY3RseS4KCkZvciB0aGUgcmVnaXN0ZXIgc3RlcCAo" + + "d2hpY2ggbXV0YXRlcyBJQ01TLCBub3QganVzdCBLOHMpOgoKYGBgeWFtbApyZWdpc3RlcjoKICBz" + + "Y3JpcHQ6CiAgICAtIG52Y2YtY2xpIGNsdXN0ZXIgcmVnaXN0ZXIgLS1uYW1lPSROQU1FIC0tbmNh" + + "LWlkPSROQ0EgLS1yZWdpb249JFJFR0lPTiAtLWlnbm9yZS1leGlzdGluZwpgYGAKCmAtLWlnbm9y" + + "ZS1leGlzdGluZ2AgaXMgdGhlIEdpdE9wcy1mcmllbmRseSBpZGVtcG90ZW50IGNvbnRyYWN0LgoK" + + "IyMgTXVsdGktY2x1c3RlciBwaXBlbGluZQoKV2hlbiB0aGUgcGlwZWxpbmUgbWFuYWdlcyBtYW55" + + "IGNvbXB1dGUgY2x1c3RlcnMgYWdhaW5zdCBvbmUgY29udHJvbCBwbGFuZToKCmBgYHlhbWwKZGVw" + + "bG95X2NvbXB1dGVfcGxhbmVzOgogIHBhcmFsbGVsOgogICAgbWF0cml4OgogICAgICAtIENMVVNU" + + "RVI6IG5jcC1lYXN0LTEKICAgICAgICBDT05URVhUOiBhZG1pbkBncHUtZWFzdC0xCiAgICAgIC0g" + + "Q0xVU1RFUjogbmNwLXdlc3QtMQogICAgICAgIENPTlRFWFQ6IGFkbWluQGdwdS13ZXN0LTEKICAg" + + "ICAgLSBDTFVTVEVSOiBuY3AtZXUtMQogICAgICAgIENPTlRFWFQ6IGFkbWluQGdwdS1ldS0xCiAg" + + "c2NyaXB0OgogICAgLSBudmNmLWNsaSBzZWxmLWhvc3RlZCB1cAogICAgICAgIC0tY2x1c3Rlci1u" + + "YW1lPSRDTFVTVEVSCiAgICAgICAgLS1jb21wdXRlLXBsYW5lLWNvbnRleHQ9JENPTlRFWFQKICAg" + + "ICAgICAtLWljbXMtdXJsPSRJQ01TX1BVQkxJQ19VUkwKICAgICAgICAtLXRva2VuPSROVkNGX0FE" + + "TUlOX0pXVAogICAgICAgIC0tbm9uLWludGVyYWN0aXZlCiAgICAgICAgLS1qc29uCmBgYAoKRWFj" + + "aCBwYXJhbGxlbCBqb2IgcmVnaXN0ZXJzICsgaW5zdGFsbHMgb25lIGNvbXB1dGUgcGxhbmUgYWdh" + + "aW5zdCB0aGUgc2hhcmVkIGNvbnRyb2wgcGxhbmUuIEZhaWx1cmVzIGFyZSBpc29sYXRlZC4KCiMj" + + "IFBsYW4tb25seSBwcmV2aWV3IGluIFBScwoKYGBgeWFtbApwcmV2aWV3OgogIHJ1bGVzOgogICAg" + + "LSBpZjogJENJX1BJUEVMSU5FX1NPVVJDRSA9PSAibWVyZ2VfcmVxdWVzdF9ldmVudCIKICBzY3Jp" + + "cHQ6CiAgICAtIHwKICAgICAgbnZjZi1jbGkgc2VsZi1ob3N0ZWQgdXAgXAogICAgICAgIC0tY2x1" + + "c3Rlci1uYW1lPSRDTFVTVEVSX05BTUUgXAogICAgICAgIC0tcGxhbi1vbmx5IFwKICAgICAgICAt" + + "LWpzb24gfCB0ZWUgcGxhbi5qc29ubAogICAgLSBqcSAtcyAnLlswXScgcGxhbi5qc29ubCA+IHBs" + + "YW4uanNvbgogICAgLSAnZ2l0bGFiLW1yLWNvbW1lbnQgIiMjIE5WQ0YgZGVwbG95IHBsYW5cblxu" + + "XGBcYFxganNvblxuJChjYXQgcGxhbi5qc29uKVxuXGBcYFxgIicKYGBgCgpgLS1wbGFuLW9ubHlg" + + "IGV4aXRzIDAgd2l0aG91dCBjaGFuZ2luZyBjbHVzdGVyIHN0YXRlOyB0aGUgSlNPTkwgb3V0cHV0" + + "IGxpc3RzIGVhY2ggcGhhc2UgKyBFVEEuIFJlbmRlcnMgbmljZWx5IGFzIGFuIE1SIGNvbW1lbnQu" + + "ClBLBwhn/RgP/AwAAPwMAABQSwMEFAAIAAAAAAAhAAAAAAAAAAAAAAAAADQACQBkYXRhL252Y2Yt" + + "c2VsZi1tYW5hZ2VkLWNsaS9leGFtcGxlcy9tdWx0aS1jbHVzdGVyLm1kVVQFAAEAps4SIyBNdWx0" + + "aS1jbHVzdGVyIHBhdHRlcm5zCgpFeGFtcGxlcyBvZiBzcGxpdC1jbHVzdGVyICsgbWFueS1jb21w" + + "dXRlLXBsYW5lIG9wZXJhdGlvbi4KCiMjIE9uZSBjb250cm9sIHBsYW5lICsgTiBjb21wdXRlIHBs" + + "YW5lcwoKVGhlIGNhbm9uaWNhbCBtdWx0aS1jbHVzdGVyIHRvcG9sb2d5LiBFYWNoIGNvbXB1dGUg" + + "cGxhbmUgaXMgcmVnaXN0ZXJlZCBzZXBhcmF0ZWx5OgoKYGBgc2gKIyAxLiBCcmluZyB1cCB0aGUg" + + "Y29udHJvbCBwbGFuZSAob25lLXRpbWUsIG9uIHRoZSBjb250cm9sLXBsYW5lIGNsdXN0ZXIpOgpL" + + "VUJFQ09ORklHPWNwLnlhbWwgbnZjZi1jbGkgc2VsZi1ob3N0ZWQgaW5zdGFsbCAtLWNvbnRyb2wt" + + "cGxhbmUgfCBrdWJlY3RsIGFwcGx5IC1mIC0KbnZjZi1jbGkgc2VsZi1ob3N0ZWQgY2hlY2sgLS1j" + + "b250cm9sLXBsYW5lIC0td2FpdCA1bQoKIyAyLiBSZWdpc3RlciArIGluc3RhbGwgZWFjaCBjb21w" + + "dXRlIHBsYW5lOgpmb3IgQ1RYIGluIGFkbWluQGdwdS1lYXN0LTEgYWRtaW5AZ3B1LXdlc3QtMSBh" + + "ZG1pbkBncHUtZXUtMTsgZG8KICBOQU1FPSQoZWNobyAiJENUWCIgfCBjdXQgLWRAIC1mMikKICBu" + + "dmNmLWNsaSBzZWxmLWhvc3RlZCB1cCBcCiAgICAtLWNsdXN0ZXItbmFtZT0kTkFNRSBcCiAgICAt" + + "LWNvbXB1dGUtcGxhbmUtY29udGV4dD0kQ1RYIFwKICAgIC0taWNtcy11cmw9aHR0cHM6Ly9pY21z" + + "Lm52Y2YuZXhhbXBsZS5jb20gXAogICAgLS10b2tlbj0kTlZDRl9BRE1JTl9KV1QgXAogICAgLS1u" + + "b24taW50ZXJhY3RpdmUgXAogICAgLS1qc29uCmRvbmUKCiMgMy4gVmVyaWZ5IGFsbCBjb21wdXRl" + + "IHBsYW5lcyByZWdpc3RlcmVkOgpudmNmLWNsaSBjbHVzdGVyIGxpc3QtcmVnaXN0ZXJlZCAtLW5j" + + "YS1pZD0kTkNBX0lEIC0taWNtcy11cmw9JElDTVMgLS1qc29uIFwKICB8IGpxICcuY2x1c3RlcnNb" + + "XSB8IHtuYW1lOiAuY2x1c3Rlck5hbWUsIHN0YXR1cywgbnZjYVZlcnNpb259JwpgYGAKCiMjIENv" + + "bXB1dGUtcGxhbmUtb25seSBvcGVyYXRvciBzY2VuYXJpbwoKVGhlIG9wZXJhdG9yIGhhcyBrdWJl" + + "Y3RsIGFjY2VzcyB0byBPTkUgY29tcHV0ZSBwbGFuZSBvbmx5IOKAlCB0aGUgY29udHJvbCBwbGFu" + + "ZSBpcyBvcGVyYXRlZCBieSBzb21lb25lIGVsc2UgKGUuZy4gWW90dGEgcnVucyB0aGUgY29udHJv" + + "bCBwbGFuZSBmb3IgYSBjdXN0b21lcikuCgpgYGBzaAojIE1pbnQgYSB0b2tlbiB2aWEgdGhlIHB1" + + "YmxpYyBhcGkgZ2F0ZXdheSAodGhlIGNvbnRyb2wgcGxhbmUncyBBUEkgS2V5cwojIHNlcnZpY2Ug" + + "aXMgcmVhY2hhYmxlIHZpYSBhcGkubnZjZi5leGFtcGxlLmNvbSDigJQgbm8ga3ViZWN0bCBhY2Nl" + + "c3MgbmVlZGVkKToKbnZjZi1jbGkgaW5pdCAtLWFwaS11cmw9aHR0cHM6Ly9hcGkubnZjZi5leGFt" + + "cGxlLmNvbQoKIyBSdW4gcHJlLWZsaWdodCBzY29wZWQgdG8gdGhlIGNvbXB1dGUgcGxhbmUgb25s" + + "eToKbnZjZi1jbGkgc2VsZi1ob3N0ZWQgY2hlY2sgLS1wcmUgXAogIC0tY29tcHV0ZS1wbGFuZS1j" + + "b250ZXh0PWFkbWluQGdwdTEgXAogIC0taWNtcy11cmw9aHR0cHM6Ly9pY21zLm52Y2YuZXhhbXBs" + + "ZS5jb20gXAogIC0tanNvbgoKIyBCcmluZyB1cCBqdXN0IHRoZSBjb21wdXRlIHBsYW5lOgpudmNm" + + "LWNsaSBzZWxmLWhvc3RlZCB1cCBcCiAgLS1jbHVzdGVyLW5hbWU9bXktY29tcHV0ZS0xIFwKICAt" + + "LWNvbXB1dGUtcGxhbmUtY29udGV4dD1hZG1pbkBncHUxIFwKICAtLWljbXMtdXJsPWh0dHBzOi8v" + + "aWNtcy5udmNmLmV4YW1wbGUuY29tIFwKICAtLXRva2VuPSRBRE1JTl9KV1QgXAogIC0tbm9uLWlu" + + "dGVyYWN0aXZlCgojIFN0YXR1cyAoY29tcHV0ZS1vbmx5IOKAlCBvcGVyYXRvciBjYW4ndCBzZWUg" + + "Y29udHJvbC1wbGFuZSBjb21wb25lbnQgaGVhbHRoKToKbnZjZi1jbGkgc2VsZi1ob3N0ZWQgc3Rh" + + "dHVzIFwKICAtLWNvbXB1dGUtcGxhbmUtY29udGV4dD1hZG1pbkBncHUxIFwKICAtLWljbXMtdXJs" + + "PWh0dHBzOi8vaWNtcy5udmNmLmV4YW1wbGUuY29tCmBgYAoKIyMgRnVuY3Rpb25zIHRhcmdldGlu" + + "ZyBzcGVjaWZpYyBjb21wdXRlIHBsYW5lcwoKV2hlbiB5b3UgaGF2ZSBtdWx0aXBsZSBjb21wdXRl" + + "IHBsYW5lcyBhbmQgd2FudCBhIGZ1bmN0aW9uIHRvIGRlcGxveSB0byBvbmU6CgpgYGBqc29uCnsK" + + "ICAiZnVuY3Rpb25JZCI6ICI8Zm5faWQ+IiwKICAidmVyc2lvbklkIjogIjx2ZXJfaWQ+IiwKICAi" + + "ZGVwbG95bWVudFNwZWNpZmljYXRpb25zIjogW3sKICAgICJncHUiOiAiSDEwMCIsCiAgICAiaW5z" + + "dGFuY2VUeXBlIjogIk5DUC5HUFUuSDEwMF8xeCIsCiAgICAibWluSW5zdGFuY2VzIjogMSwKICAg" + + "ICJtYXhJbnN0YW5jZXMiOiAxLAogICAgImNsdXN0ZXJzIjogWyJncHUtZWFzdC0xIl0KICB9XQp9" + + "CmBgYAoKVGhlIGBjbHVzdGVyc2AgYXJyYXkgKHVzaW5nIGNsdXN0ZXIgbmFtZXMsIG5vdCBJRHMp" + + "IGxpbWl0cyBzY2hlZHVsaW5nIHRvIHRob3NlIGNvbXB1dGUgcGxhbmVzLiBPbWl0IHRvIGxldCBJ" + + "Q01TIGNob29zZSBhbnkgY29tcHV0ZSBwbGFuZSB3aXRoIGEgbWF0Y2hpbmcgU0tVLgoKIyMgU3Rh" + + "dHVzIGZhbi1vdXQgYWNyb3NzIGNvbXB1dGUgcGxhbmVzCgpgYGBzaAojIExpc3QgYWxsIHJlZ2lz" + + "dGVyZWQgY29tcHV0ZSBwbGFuZXM6Cm52Y2YtY2xpIGNsdXN0ZXIgbGlzdC1yZWdpc3RlcmVkIC0t" + + "bmNhLWlkPSROQ0FfSUQgLS1pY21zLXVybD0kSUNNUyAtLWpzb24gXAogIHwganEgLXIgJy5jbHVz" + + "dGVyc1tdLmNsdXN0ZXJOYW1lJyA+IGNsdXN0ZXJzLnR4dAoKIyBTdGF0dXMgc25hcHNob3QgcGVy" + + "IGNvbXB1dGUgcGxhbmUgKGFzc3VtaW5nIGVhY2ggY29udGV4dCBuYW1lIG1hdGNoZXMpOgp3aGls" + + "ZSByZWFkIE5BTUU7IGRvCiAgZWNobyAiPT09ICROQU1FID09PSIKICBudmNmLWNsaSBzZWxmLWhv" + + "c3RlZCBzdGF0dXMgXAogICAgLS1jbHVzdGVyLW5hbWU9JE5BTUUgXAogICAgLS1jb21wdXRlLXBs" + + "YW5lLWNvbnRleHQ9YWRtaW5AJE5BTUUgXAogICAgLS1qc29uIHwganEgLWMgJ3tjbHVzdGVyOi5j" + + "bHVzdGVyLCB2ZXJkaWN0Oi52ZXJkaWN0LCByZWNvbmNpbGU6LnJlY29uY2lsZUFnZVNlY30nCmRv" + + "bmUgPCBjbHVzdGVycy50eHQKYGBgCgpBIGZ1dHVyZSBNKzExIG1pbGVzdG9uZSB3aWxsIGFkZCBu" + + "YXRpdmUgZmFuLW91dCAoYHN0YXR1cyAtLWFsbC1jb21wdXRlLXBsYW5lc2ApIHNvIHRoaXMgZG9l" + + "c24ndCBuZWVkIGEgc2hlbGwgbG9vcC4KUEsHCKEU44FdDAAAXQwAAFBLAwQUAAgAAAAAACEAAAAA" + + "AAAAAAAAAAAANwAJAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL3Byb21wdHMvYWRkLWNvbXB1" + + "dGUtcGxhbmUubWRVVAUAAQCmzhIjIEFkZCBhIGNvbXB1dGUgcGxhbmUgdG8gYW4gZXhpc3Rpbmcg" + + "Y29udHJvbCBwbGFuZQoKVXNlciBoYXMgYSB3b3JraW5nIE5WQ0YgY29udHJvbCBwbGFuZSAocnVu" + + "bmluZyBzb21ld2hlcmUpIGFuZCB3YW50cyB0byByZWdpc3RlciBhIG5ldyBHUFUgY2x1c3RlciBh" + + "Z2FpbnN0IGl0LiBUaGlzIGlzIHRoZSBtdWx0aS1jbHVzdGVyIHNjYWxpbmcgcGF0aDogb25lIGNv" + + "bnRyb2wgcGxhbmUg4oaSIE4gY29tcHV0ZSBwbGFuZXMuCgojIyBQcmVyZXF1aXNpdGVzIHRoZSB1" + + "c2VyIG11c3QgaGF2ZQoKLSAqKmt1YmVjdGwgY29udGV4dCBmb3IgdGhlIG5ldyBjb21wdXRlIHBs" + + "YW5lKiogaW4gdGhlaXIgYEtVQkVDT05GSUdgLgotICoqUHVibGljIElDTVMgVVJMKiogb2YgdGhl" + + "IGV4aXN0aW5nIGNvbnRyb2wgcGxhbmUgKGUuZy4gYGh0dHBzOi8vaWNtcy5udmNmLmV4YW1wbGUu" + + "Y29tYCkuCi0gKipBZG1pbiBKV1QqKiBmb3IgdGhlIGNvbnRyb2wgcGxhbmUncyBhY2NvdW50LCBP" + + "UiBhYmlsaXR5IHRvIG1pbnQgb25lIHZpYSBgbnZjZi1jbGkgaW5pdGAgYWdhaW5zdCB0aGUgY29u" + + "dHJvbCBwbGFuZSdzIHB1YmxpYyBhcGkgZW5kcG9pbnQuIChBZG1pbiB0b2tlbnMgY29tZSBmcm9t" + + "IHRoZSBBUEkgS2V5cyBzZXJ2aWNlIHZpYSB0aGUgcHVibGljIGFwaSBnYXRld2F5IOKAlCBrdWJl" + + "Y3RsIGFjY2VzcyB0byB0aGUgY29udHJvbCBwbGFuZSBpcyBOT1QgcmVxdWlyZWQgdG8gb2J0YWlu" + + "IG9uZS4pCi0gQSB1bmlxdWUgYC0tY2x1c3Rlci1uYW1lYCB0aGF0IGRvZXNuJ3QgY29sbGlkZSB3" + + "aXRoIGFscmVhZHktcmVnaXN0ZXJlZCBjbHVzdGVycy4gVXNlIGBudmNmLWNsaSBjbHVzdGVyIGxp" + + "c3QtcmVnaXN0ZXJlZCAtLW5jYS1pZD0kTkNBX0lEIC0taWNtcy11cmw9JElDTVNgIHRvIGNoZWNr" + + "LgoKIyMgU3RlcHMKCjEuICoqQXNrIGZvciBpbnB1dHM6KioKICAgLSBgLS1jbHVzdGVyLW5hbWU9" + + "PHVuaXF1ZT5gIOKAlCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGNvbnRyb2wgcGxhbmUncyBO" + + "Q0Egc2NvcGUKICAgLSBgLS1jb21wdXRlLXBsYW5lLWNvbnRleHQ9PGNvbnRleHQ+YCDigJQgdGhl" + + "IG5ldyBHUFUgY2x1c3RlcidzIGt1YmVjdGwgY29udGV4dAogICAtIGAtLWljbXMtdXJsPTxodHRw" + + "czovL2ljbXMubnZjZi5leGFtcGxlLmNvbT5gIOKAlCBjb250cm9sIHBsYW5lJ3MgcHVibGljIElD" + + "TVMgVVJMCiAgIC0gR1BVIHR5cGU/IChkZWZhdWx0IGBIMTAwYCwgYnV0IGFzaykKCjIuICoqUHJl" + + "LWZsaWdodCBqdXN0IHRoZSBjb21wdXRlIHBsYW5lOioqCgogICBgYGBzaAogICBudmNmLWNsaSBz" + + "ZWxmLWhvc3RlZCBjaGVjayAtLXByZSBcCiAgICAgLS1jb21wdXRlLXBsYW5lLWNvbnRleHQ9JENU" + + "WCBcCiAgICAgLS1pY21zLXVybD0kSUNNUyBcCiAgICAgLS1qc29uIHwganEgLWMgLgogICBgYGAK" + + "CiAgIFRoaXMgdmFsaWRhdGVzIHRoZSBHUFUgb3BlcmF0b3IgaXMgaW5zdGFsbGVkLCBHUFUgbm9k" + + "ZSBsYWJlbHMgYXJlIHByZXNlbnQsIGFuZCBJQ01TIGlzIHJlYWNoYWJsZSB2aWEgSFRUUC4gQWRk" + + "cmVzcyBhbnkgZmFpbHVyZXMgYmVmb3JlIHByb2NlZWRpbmcuCgozLiAqKlJ1biBgYWRkLWNvbXB1" + + "dGUtcGxhbmVgOioqCgogICBgYGBzaAogICBudmNmLWNsaSBzZWxmLWhvc3RlZCBhZGQtY29tcHV0" + + "ZS1wbGFuZSBcCiAgICAgLS1jbHVzdGVyLW5hbWU9JE5BTUUgXAogICAgIC0tY29tcHV0ZS1wbGFu" + + "ZS1jb250ZXh0PSRDVFggXAogICAgIC0taWNtcy11cmw9JElDTVMgXAogICAgIC0tdG9rZW49JEpX" + + "VCBcCiAgICAgLS1ub24taW50ZXJhY3RpdmUgXAogICAgIC0tanNvbgogICBgYGAKCiAgIFRoaXMg" + + "aXMgYSBzZXBhcmF0ZSBzdWJjb21tYW5kIGZyb20gYHVwYC4gSXQgcnVucyBvbmx5IHRoZSBjb21w" + + "dXRlLXBsYW5lLXJlbGV2YW50IHBoYXNlczogMSAoY29tcHV0ZS1wbGFuZSBwcmVmbGlnaHQpLCA1" + + "IChyZWdpc3RlciksIDYgKGNvbXB1dGUtcGxhbmUgYXBwbHkpLCA4IChmaW5hbCBoZWFsdGggb24g" + + "dGhlIG5ldyBjb21wdXRlIHBsYW5lKS4gSXQgZG9lcyBOT1QgdG91Y2ggdGhlIGNvbnRyb2wgcGxh" + + "bmUgYW5kIGRvZXMgTk9UIGFjY2VwdCBgLS1jb250cm9sLXBsYW5lLWNvbnRleHRgIOKAlCB0aGUg" + + "Y29udHJvbCBwbGFuZSBpcyByZWFjaGVkIG92ZXIgSFRUUFMgYXQgYC0taWNtcy11cmxgLiBgLS10" + + "b2tlbmAgaXMgcmVxdWlyZWQgYmVjYXVzZSB0aGVyZSdzIG5vIGt1YmVjdGwgcGF0aCB0byBtaW50" + + "IG9uZSBmcm9tLgoKNC4gKipWZXJpZnkuKiogYG52Y2YtY2xpIHNlbGYtaG9zdGVkIHN0YXR1cyAt" + + "LWNsdXN0ZXItbmFtZT0kTkFNRSAtLWpzb24gfCBqcWAg4oCUIGV4cGVjdCBgdmVyZGljdDogImhl" + + "YWx0aHkiYC4gVGhlIFJlZ2lzdGVyZWQgQ29tcHV0ZSBQbGFuZXMgcGFuZWwgZnJvbSBJQ01TIHNo" + + "b3VsZCBub3cgbGlzdCB0aGUgbmV3IGNsdXN0ZXIuCgo1LiAqKlNtb2tlLioqIFtkZXBsb3ktYW5k" + + "LWludm9rZS5tZF0oZGVwbG95LWFuZC1pbnZva2UubWQpIOKAlCBkZXBsb3kgYSBzbWFsbCBmdW5j" + + "dGlvbiB0byB0aGUgbmV3IGNvbXB1dGUgcGxhbmUgdG8gY29uZmlybSBzY2hlZHVsaW5nIHdvcmtz" + + "LgoKIyMgV2hhdCBpZiBhIGNsdXN0ZXIgd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3Rz" + + "PwoKYGFkZC1jb21wdXRlLXBsYW5lYCdzIHJlZ2lzdGVyIHBoYXNlIHVzZXMgYC0taWdub3JlLWV4" + + "aXN0aW5nYCBzZW1hbnRpY3Mg4oCUIGl0J2xsIG1hdGNoIHRoZSBleGlzdGluZyBJQ01TIHJvdyBh" + + "bmQgcmV1c2UgaXRzIGNsdXN0ZXJJZC4gVHdvIHNjZW5hcmlvczoKCi0gKipSZS1yZWdpc3Rlcmlu" + + "ZyB0aGUgc2FtZSBjbHVzdGVyKiogKHJlLXJ1bm5pbmcgb24gdGhlIHNhbWUgY29tcHV0ZSBwbGFu" + + "ZSB0aGF0IHdhcyBwcmV2aW91c2x5IHJlZ2lzdGVyZWQpOiBleHBlY3RlZCwgbm8tb3Agc2VtYW50" + + "aWNzLgotICoqRGlmZmVyZW50IHBoeXNpY2FsIGNsdXN0ZXIgYnV0IHNhbWUgbmFtZSoqOiB0aGUg" + + "c2Vjb25kIGF0dGVtcHQgd2lsbCByZXVzZSB0aGUgSUNNUyByb3csIGJ1dCB0aGUgbmV3IGNvbXB1" + + "dGUgcGxhbmUncyBKV0tTIHdpbGwgYmUgc2lsZW50bHkgKnJlcGxhY2VkKiDigJQgdGhlIG9sZCBj" + + "b21wdXRlIHBsYW5lJ3MgTlZDQSBhZ2VudCB3aWxsIHN0YXJ0IGZhaWxpbmcgUFNBVCBhdXRoLiAq" + + "KkNvbmZpcm0gd2l0aCB0aGUgdXNlcioqIHRoYXQgdGhleSBtZWFudCB0byBvdmVyd3JpdGUuCgpX" + + "aGVuIGluIGRvdWJ0LCBydW4gYG52Y2YtY2xpIGNsdXN0ZXIgbGlzdC1yZWdpc3RlcmVkIC0tbmNh" + + "LWlkPSROQ0FfSUQgLS1pY21zLXVybD0kSUNNU2AgZmlyc3QgYW5kIGFzayB0aGUgdXNlciBiZWZv" + + "cmUgcHJvY2VlZGluZyB3aXRoIGEgbmFtZSB0aGF0IGFscmVhZHkgZXhpc3RzLgpQSwcIQidJDwUN" + + "AAAFDQAAUEsDBBQACAAAAAAAIQAAAAAAAAAAAAAAAAA5AAkAZGF0YS9udmNmLXNlbGYtbWFuYWdl" + + "ZC1jbGkvcHJvbXB0cy9jcmVhdGUtYW5kLXJ1bi10YXNrLm1kVVQFAAEAps4SIyBDcmVhdGUgYW5k" + + "IHJ1biBhIHRhc2sKClN0YW5kYXJkIGZsb3c6IG1pbnQgQVBJIGtleXMgLT4gdGFzayBDUkVBVEUg" + + "LT4gbW9uaXRvciAtPiByZXRyaWV2ZSByZXN1bHRzIC0+IGNsZWFudXAuCgojIyAxLiBNaW50IEFQ" + + "SSBrZXlzCgpUaGUgYWRtaW4gdG9rZW4gZnJvbSBgaW5pdGAgZG9lcyBub3QgY2FycnkgdGFzayBp" + + "bnZvY2F0aW9uIHNjb3BlLiBHZW5lcmF0ZSBBUEkga2V5czoKCmBgYHNoCm52Y2YtY2xpIGFwaS1r" + + "ZXkgZ2VuZXJhdGUgLS1kZXNjcmlwdGlvbj0idGFzayBzbW9rZSB0ZXN0IiAtLWV4cGlyZXMtaW49" + + "OGgKIyAtPiBmdW5jdGlvbiBrZXk6IG52YXBpLS4uLgojIC0+IHRhc2sga2V5OiBudmFwaS0uLi4K" + + "YGBgCgpCb3RoIGtleXMgYXJlIHNhdmVkIHRvIENMSSBzdGF0ZS4gVG8gbWludCBvbmx5IHRoZSB0" + + "YXNrIGtleToKCmBgYHNoCm52Y2YtY2xpIGFwaS1rZXkgZ2VuZXJhdGUgLS1mb3IgdGFzayAtLWRl" + + "c2NyaXB0aW9uPSJ0YXNrIHNtb2tlIHRlc3QiIC0tZXhwaXJlcy1pbj04aApgYGAKClRvIHZhbGlk" + + "YXRlIGVhY2gga2V5IGltbWVkaWF0ZWx5IGFmdGVyIG1pbnRpbmc6CgpgYGBzaApudmNmLWNsaSBh" + + "cGkta2V5IGdlbmVyYXRlIC0tZGVzY3JpcHRpb249InRhc2sgc21va2UgdGVzdCIgLS1leHBpcmVz" + + "LWluPThoIC0tdmFsaWRhdGUKIyAtPiBmdW5jdGlvbiBBUEkga2V5IHZhbGlkYXRpb24gcGFzc2Vk" + + "IQojIC0+IHRhc2sgQVBJIGtleSB2YWxpZGF0aW9uIHBhc3NlZCEKYGBgCgpOZXZlciBlY2hvIHRo" + + "ZSBrZXkgdmFsdWUgKG52YXBpLS4uLikgaW50byBjaGF0IG9yIGxvZ3MuIFJlcG9ydCBvbmx5IHRo" + + "YXQgdGhlIGtleSB3YXMgbWludGVkLCBpdHMgZGVzY3JpcHRpb24sIGFuZCBpdHMgZXhwaXJ5IOKA" + + "lCBuZXZlciB0aGUgdmFsdWUgaXRzZWxmLgoKIyMjIEZyZXNoIHNlc3Npb24gcHJlLWZsaWdodAoK" + + "QmVmb3JlIHJ1bm5pbmcgYW55IGB0YXNrYCBjb21tYW5kIGluIGEgZnJlc2ggYWdlbnQgc2Vzc2lv" + + "biwgdmVyaWZ5IGNyZWRlbnRpYWxzOgoKMS4gQ2hlY2sgd2hldGhlciBgTlZDRl9BUElfS0VZYCBp" + + "cyBzZXQ6CgogICBgYGBzaAogICBwcmludGVudiBOVkNGX0FQSV9LRVkgPiAvZGV2L251bGwgMj4m" + + "MSAmJiBlY2hvIHNldCB8fCBlY2hvIHVuc2V0CiAgIGBgYAoKMi4gSWYgdW5zZXQsIHJlYWQgdGhl" + + "IHN0b3JlZCBrZXkgZXhwaXJ5IHdpdGhvdXQgcHJpbnRpbmcgdGhlIHZhbHVlOgoKICAgYGBgc2gK" + + "ICAgcHl0aG9uMyAtYyAiaW1wb3J0IGpzb24scGF0aGxpYjsgcz1qc29uLmxvYWRzKHBhdGhsaWIu" + + "UGF0aCgnfi8ubnZjZi1jbGkuc3RhdGUnKS5leHBhbmR1c2VyKCkucmVhZF90ZXh0KCkpOyBwcmlu" + + "dChzLmdldCgnbnZjdEFwaUtleUV4cGlyYXRpb24nLCdtaXNzaW5nJykpIgogICBgYGAKCjMuIElm" + + "IHRoZSBleHBpcnkgaXMgaW4gdGhlIHBhc3Qgb3IgbWlzc2luZywgcmVnZW5lcmF0ZToKCiAgIGBg" + + "YHNoCiAgIG52Y2YtY2xpIHJlZnJlc2gKICAgbnZjZi1jbGkgYXBpLWtleSBnZW5lcmF0ZSAtLWZv" + + "ciB0YXNrIC0tZGVzY3JpcHRpb249InRhc2sta2V5IiAtLWV4cGlyZXMtaW49MjRoIC0tdmFsaWRh" + + "dGUKICAgYGBgCgo0LiBJbmplY3QgdGhlIHN0b3JlZCBrZXkgaW50byB0aGUgc3VicHJvY2VzcyBl" + + "bnYgd2l0aG91dCBsb2dnaW5nIHRoZSB2YWx1ZS4gVXNlIGEgc2hlbGwgc3Vic2hlbGwgb3IgZW52" + + "IHByZWZpeCDigJQgbmV2ZXIgcHJpbnQgdGhlIGtleSBpbnRvIGNoYXQuCgpFcnJvciBjbGFzc2lm" + + "aWNhdGlvbjoKCi0gIm1pc3NpbmcgYXV0aGVudGljYXRpb24gY3JlZGVudGlhbHMiIG9yIGV4aXQg" + + "Mjoga2V5IG5vdCBpbmplY3RlZDsgcmVwZWF0IHByZS1mbGlnaHQuCi0gSFRUUCA0MDM6IGtleSBl" + + "eHBpcmVkIG9yIHdyb25nIGF1ZGllbmNlOyByZWdlbmVyYXRlLgotIEVtcHR5IHRhc2sgbGlzdDog" + + "dmFsaWQ7IG5vIHRhc2tzIGV4aXN0IHlldC4KCiMjIDIuIFRhc2sgQ1JFQVRFOiBjb250YWluZXIK" + + "CkRlZmluZSB0aGUgdGFzayBpbiBhIEpTT04gZmlsZS4gTWluaW11bSB2aWFibGUgY29udGFpbmVy" + + "IHRhc2s6CgpgYGBqc29uCnsKICAibmFtZSI6ICJzbW9rZS1jb250YWluZXItdGFzayIsCiAgImdw" + + "dVNwZWNpZmljYXRpb24iOiB7CiAgICAiZ3B1IjogIkgxMDAiLAogICAgImluc3RhbmNlVHlwZSI6" + + "ICJOQ1AuR1BVLkgxMDBfMXgiLAogICAgImJhY2tlbmQiOiAibmNwLWxvY2FsIgogIH0sCiAgImNv" + + "bnRhaW5lckltYWdlIjogIm52Y3IuaW8vbnZpZGlhL25lbW86bGF0ZXN0IiwKICAiY29udGFpbmVy" + + "QXJncyI6ICJweXRob24gLWMgXCJwcmludCgnaGVsbG8gZnJvbSB0YXNrJylcIiIsCiAgInJlc3Vs" + + "dEhhbmRsaW5nU3RyYXRlZ3kiOiAiTk9ORSIKfQpgYGAKCmBgYHNoCm52Y2YtY2xpIHRhc2sgY3Jl" + + "YXRlIC0taW5wdXQtZmlsZT10YXNrLWNvbnRhaW5lci5qc29uCiMgLT4gVGFzayBJRDogPHRhc2tf" + + "aWQ+CmBgYAoKQ2FwdHVyZSB0aGUgdGFzayBJRCBmcm9tIHRoZSBvdXRwdXQuIFN0YXRlIHBlcnNp" + + "c3RlbmNlIGNhbiBmYWlsIHNpbGVudGx5LCBzbyBwYXNzCmA8dGFza0lkPmAgZXhwbGljaXRseSBv" + + "biBzdWJzZXF1ZW50IGNvbW1hbmRzIHJhdGhlciB0aGFuIHJlbHlpbmcgb24gc2F2ZWQgc3RhdGUu" + + "CgpFcXVpdmFsZW50IENMSSBmbGFncyBmb3JtIGZvciBxdWljayBhZC1ob2MgcnVuczoKCmBgYHNo" + + "Cm52Y2YtY2xpIHRhc2sgY3JlYXRlIFwKICAtLW5hbWU9c21va2UtY29udGFpbmVyLXRhc2sgXAog" + + "IC0tZ3B1PUgxMDAgXAogIC0taW5zdGFuY2UtdHlwZT1OQ1AuR1BVLkgxMDBfMXggXAogIC0tYmFj" + + "a2VuZD1uY3AtbG9jYWwgXAogIC0taW1hZ2U9bnZjci5pby9udmlkaWEvbmVtbzpsYXRlc3QgXAog" + + "IC0tY29udGFpbmVyLWFyZ3M9InB5dGhvbiAtYyAncHJpbnQoaGVsbG8gZnJvbSB0YXNrKSciIFwK" + + "ICAtLXJlc3VsdC1zdHJhdGVneT1OT05FCmBgYAoKVG8gdGFyZ2V0IGEgc3BlY2lmaWMgY29tcHV0" + + "ZSBjbHVzdGVyOgoKYGBgc2gKbnZjZi1jbGkgdGFzayBjcmVhdGUgLS1pbnB1dC1maWxlPXRhc2st" + + "Y29udGFpbmVyLmpzb24gLS1jbHVzdGVycz1teS1jbHVzdGVyCmBgYAoKVG8gaW5qZWN0IGVudmly" + + "b25tZW50IHZhcmlhYmxlcyBvciBzZWNyZXRzLCBlaXRoZXIgcGFzcyBmbGFnczoKCmBgYHNoCm52" + + "Y2YtY2xpIHRhc2sgY3JlYXRlIC0taW5wdXQtZmlsZT10YXNrLWNvbnRhaW5lci5qc29uIFwKICAt" + + "LWNvbnRhaW5lci1lbnYgTVlfRU5WPXZhbHVlIFwKICAtLXNlY3JldHMgTVlfU0VDUkVUPXMzY3Iz" + + "dApgYGAKCm9yIHNldCB0aGVtIGluIHRoZSBKU09OIGZpbGU6CgpgYGBqc29uCnsKICAiY29udGFp" + + "bmVyRW52aXJvbm1lbnQiOiBbCiAgICB7ImtleSI6ICJNWV9FTlYiLCAidmFsdWUiOiAidmFsdWUi" + + "fQogIF0sCiAgInNlY3JldHMiOiBbCiAgICB7Im5hbWUiOiAiTVlfU0VDUkVUIiwgInZhbHVlIjog" + + "InMzY3IzdCJ9CiAgXQp9CmBgYAoKU2VjcmV0cyBhcmUgZW5jcnlwdGVkIGF0IHJlc3QgYW5kIG5v" + + "dCByZXR1cm5lZCBpbiBsaXN0IG9yIGdldCByZXNwb25zZXMgYnkgZGVmYXVsdDsgZG8gbm90IGxv" + + "ZyB0aGVtLgoKIyMgMy4gVGFzayBDUkVBVEU6IEhlbG0KCkZvciBIZWxtLXR5cGUgdGFza3MsIHJl" + + "cGxhY2UgYGNvbnRhaW5lckltYWdlYCB3aXRoIGBoZWxtQ2hhcnRgOgoKYGBganNvbgp7CiAgIm5h" + + "bWUiOiAic21va2UtaGVsbS10YXNrIiwKICAiZ3B1U3BlY2lmaWNhdGlvbiI6IHsKICAgICJncHUi" + + "OiAiSDEwMCIsCiAgICAiaW5zdGFuY2VUeXBlIjogIk5DUC5HUFUuSDEwMF8xeCIsCiAgICAiYmFj" + + "a2VuZCI6ICJuY3AtbG9jYWwiCiAgfSwKICAiaGVsbUNoYXJ0IjogImh0dHBzOi8vaGVsbS5uZ2Mu" + + "bnZpZGlhLmNvbS88b3JnPi9jaGFydHMvZXhhbXBsZS10YXNrLTAuMS4wLnRneiIsCiAgInJlc3Vs" + + "dEhhbmRsaW5nU3RyYXRlZ3kiOiAiTk9ORSIKfQpgYGAKCmBgYHNoCm52Y2YtY2xpIHRhc2sgY3Jl" + + "YXRlIC0taW5wdXQtZmlsZT10YXNrLWhlbG0uanNvbgojIC0+IFRhc2sgSUQ6IDx0YXNrX2lkPgpg" + + "YGAKCmBoZWxtQ2hhcnRgIGFuZCBgY29udGFpbmVySW1hZ2VgIGFyZSBtdXR1YWxseSBleGNsdXNp" + + "dmUuCgojIyAzYi4gVXBkYXRlIHNlY3JldHMgb24gYSBydW5uaW5nIHRhc2sKCmBgYHNoCm52Y2Yt" + + "Y2xpIHRhc2sgdXBkYXRlLXNlY3JldHMgPHRhc2tfaWQ+IC0tc2VjcmV0cyBOQU1FPXZhbHVlCmBg" + + "YAoKYHVwZGF0ZS1zZWNyZXRzYCBtZXJnZXMgc2VjcmV0cyBieSBuYW1lOiBzdXBwbGllZCBzZWNy" + + "ZXRzIGFyZSBhZGRlZCBvciB1cGRhdGVkLCBhbmQgZXhpc3Rpbmcgc2VjcmV0cyBub3QgaW5jbHVk" + + "ZWQgaW4gdGhlIHJlcXVlc3QgYXJlIHByZXNlcnZlZC4gRG8gbm90IGVjaG8gc2VjcmV0IHZhbHVl" + + "cyBpbnRvIGNoYXQuCgojIyA0LiBNb25pdG9yCgpQb2xsIHRhc2sgc3RhdGU6CgpgYGBzaApudmNm" + + "LWNsaSB0YXNrIGdldCA8dGFza19pZD4KIyAtPiBpZDogPHRhc2tfaWQ+CiMgLT4gc3RhdHVzOiBS" + + "VU5OSU5HCmBgYAoKT3IgdXNlIHRoZSB0YXNrIElEIHNhdmVkIHRvIHN0YXRlIGZyb20gdGhlIG1v" + + "c3QgcmVjZW50IGB0YXNrIGNyZWF0ZWA6CgpgYGBzaApudmNmLWNsaSB0YXNrIGdldApgYGAKClN0" + + "YXR1cyB2YWx1ZXM6IGBRVUVVRURgLCBgTEFVTkNIRURgLCBgUlVOTklOR2AsIGBDT01QTEVURURg" + + "LCBgRVJST1JFRGAsIGBDQU5DRUxFRGAsIGBFWENFRURFRF9NQVhfUlVOVElNRV9EVVJBVElPTmAs" + + "IGBFWENFRURFRF9NQVhfUVVFVUVEX0RVUkFUSU9OYC4KCkluc3BlY3QgbGlmZWN5Y2xlIGV2ZW50" + + "cyBmb3IgcHJvZ3Jlc3MgZGV0YWlscyBvciBmYWlsdXJlIGNvbnRleHQ6CgpgYGBzaApudmNmLWNs" + + "aSB0YXNrIGV2ZW50cyA8dGFza19pZD4KYGBgCgpJZiB0aGUgdGFzayBpcyBzdHVjayBpbiBgUVVF" + + "VUVEYCwgY2hlY2sgdGhhdCBhIGNvbXB1dGUgY2x1c3RlciB3aXRoIGEgbWF0Y2hpbmcgR1BVIFNL" + + "VQppcyByZWdpc3RlcmVkIGFuZCBoZWFsdGh5IChgbnZjZi1jbGkgc2VsZi1ob3N0ZWQgc3RhdHVz" + + "YCkuCgpJZiB0aGUgdGFzayBtb3ZlcyB0byBgRVJST1JFRGAsIHRoZSBldmVudHMgb3V0cHV0IGNv" + + "bnRhaW5zIHRoZSBmYWlsdXJlIHJlYXNvbi4gRm9yCmNvbnRhaW5lci1sZXZlbCBkZXRhaWwsIGlu" + + "c3BlY3QgdGhlIHRhc2sgd29ya2xvYWQgcG9kcyBvbiB0aGUgY29tcHV0ZS1wbGFuZSBjbHVzdGVy" + + "IHdpdGgKYGt1YmVjdGxgIGFnYWluc3QgdGhlIGFwcHJvcHJpYXRlIG5hbWVzcGFjZSBhbmQgY29u" + + "dGV4dC4KCiMjIDUuIFJldHJpZXZlIHJlc3VsdHMKCkZvciB0YXNrcyB3aXRoIGByZXN1bHRIYW5k" + + "bGluZ1N0cmF0ZWd5OiBOT05FYCwgcmVzdWx0cyBhcmUgZW1wdHkgYnkgZGVzaWduOgoKYGBgc2gK" + + "bnZjZi1jbGkgdGFzayByZXN1bHRzIDx0YXNrX2lkPgojIC0+IHsicmVzdWx0cyI6IFtdfQpgYGAK" + + "CkZvciB0YXNrcyB3aXRoIGByZXN1bHRIYW5kbGluZ1N0cmF0ZWd5OiBVUExPQURgLCByZXN1bHRz" + + "IHVwbG9hZCB0byB0aGUgbG9jYXRpb24gbmFtZWQgaW4KYHJlc3VsdHNMb2NhdGlvbmAuIFRoZSB0" + + "YXNrJ3MgY3JlZGVudGlhbHMgbXVzdCBoYXZlIHdyaXRlIGFjY2VzcyB0byB0aGF0IGxvY2F0aW9u" + + "LiBBZnRlcgp0aGUgdGFzayByZWFjaGVzIGBDT01QTEVURURgOgoKYGBgc2gKbnZjZi1jbGkgdGFz" + + "ayByZXN1bHRzIDx0YXNrX2lkPgpgYGAKCk5vdGU6IHJlc3VsdCB1cGxvYWQgaXMgbm90IHlldCBz" + + "dXBwb3J0ZWQgaW4gdGhpcyByZWxlYXNlLgoKIyMgNi4gQ2xlYW51cAoKQ2FuY2VsIGEgcnVubmlu" + + "ZyB0YXNrOgoKYGBgc2gKbnZjZi1jbGkgdGFzayBjYW5jZWwgPHRhc2tfaWQ+CmBgYAoKRGVsZXRl" + + "IHRoZSB0YXNrIHJlY29yZCBhZnRlciBpdCByZWFjaGVzIGEgdGVybWluYWwgc3RhdGU6CgpgYGBz" + + "aApudmNmLWNsaSB0YXNrIGRlbGV0ZSA8dGFza19pZD4KYGBgCgpTdG9wIGFuZCBjb25maXJtIHdp" + + "dGggdGhlIHVzZXIgYmVmb3JlIHJ1bm5pbmcgdGFzayBkZWxldGUuIFN0YXRlIHRoZSB0YXNrIElE" + + "IGFuZCBpdHMgY3VycmVudCBzdGF0dXMuIERvIG5vdCBwcm9jZWVkIGV2ZW4gd2hlbiB0aGUgdXNl" + + "cidzIHByb21wdCBhbHJlYWR5IHJlcXVlc3RlZCBkZWxldGlvbiDigJQgYWx3YXlzIGdldCBhbiBl" + + "eHBsaWNpdCBsYXN0LWxvb2sgY29uZmlybWF0aW9uLiBEZWxldGlvbiBpcyBwZXJtYW5lbnQgYW5k" + + "IGNhbm5vdCBiZSB1bmRvbmUuCgpUbyBsaXN0IGFsbCB0YXNrcyBmb3IgdGhlIGN1cnJlbnQgb3du" + + "ZXIgKHVzZWZ1bCBiZWZvcmUgYnVsayBjbGVhbnVwKToKCmBgYHNoCm52Y2YtY2xpIHRhc2sgbGlz" + + "dApudmNmLWNsaSB0YXNrIGxpc3QgLS1zdGF0dXM9Q09NUExFVEVECmBgYAoKIyMgTm90ZXMKCi0g" + + "R1BVIGZhbWlseSBhbmQgaW5zdGFuY2UgdHlwZSBtdXN0IG1hdGNoIGEgcmVnaXN0ZXJlZCBjb21w" + + "dXRlIGNsdXN0ZXIgU0tVLiBNaXNtYXRjaAogIGNhdXNlcyB0aGUgdGFzayB0byByZW1haW4gYFFV" + + "RVVFRGAgaW5kZWZpbml0ZWx5LiBVc2UgYG52Y2YtY2xpIGNsdXN0ZXIgbGlzdGAgdG8gY2hlY2sK" + + "ICByZWdpc3RlcmVkIFNLVXMuCi0gRm9yIGNvbnRhaW5lciBpbWFnZXMgb24gcHJpdmF0ZSByZWdp" + + "c3RyaWVzLCBlbnN1cmUgdGhlIGNvbXB1dGUtcGxhbmUgY2x1c3RlcidzCiAgaW1hZ2UtY3JlZGVu" + + "dGlhbC1oZWxwZXIgaXMgY29uZmlndXJlZCBmb3IgdGhlIHJlZ2lzdHJ5IGhvc3QuClBLBwjU3o00" + + "nxkAAJ8ZAABQSwMEFAAIAAAAAAAhAAAAAAAAAAAAAAAAADcACQBkYXRhL252Y2Ytc2VsZi1tYW5h" + + "Z2VkLWNsaS9wcm9tcHRzL2RlcGxveS1hbmQtaW52b2tlLm1kVVQFAAEAps4SIyBEZXBsb3kgYW5k" + + "IGludm9rZSBhIGNvbnRhaW5lciBmdW5jdGlvbgoKU3RhbmRhcmQgZm91ci1zdGVwIGZsb3c6IGZ1" + + "bmN0aW9uIENSRUFURSDihpIgREVQTE9ZIOKGkiBBUEkga2V5IChmb3IgaW52b2tlIHNjb3BlKSDi" + + "hpIgSU5WT0tFLgoKIyMgMS4gRnVuY3Rpb24gQ1JFQVRFCgpEZWZpbmUgdGhlIGZ1bmN0aW9uIGlu" + + "IGEgSlNPTiBmaWxlLiBNaW5pbXVtOgoKQmVmb3JlIGNyZWF0aW5nIHRoZSBmdW5jdGlvbiwgY29u" + + "ZmlybSB0aGUgZXhhY3QgZnVuY3Rpb24gbmFtZSBhbmQgY29udGFpbmVyIGltYWdlIHdpdGggdGhl" + + "IHVzZXIuIElmIGVpdGhlciB2YWx1ZSBpcyBtaXNzaW5nLCBzdG9wIGFuZCBhc2suIERvIG5vdCBp" + + "bnZlbnQgb3Igc3VibWl0IGV4YW1wbGUgdmFsdWVzIGZvciB0aGVzZSBmaWVsZHMuCgpgYGBqc29u" + + "CnsKICAibmFtZSI6ICI8Y29uZmlybWVkLWZ1bmN0aW9uLW5hbWU+IiwKICAiY29udGFpbmVySW1h" + + "Z2UiOiAiPGNvbmZpcm1lZC1jb250YWluZXItaW1hZ2U+IiwKICAiaW5mZXJlbmNlVXJsIjogIi9l" + + "Y2hvIiwKICAiaW5mZXJlbmNlUG9ydCI6IDgwMDAsCiAgImRlc2NyaXB0aW9uIjogInNtb2tlIHRl" + + "c3QgZWNobyBmdW5jdGlvbiIsCiAgImZ1bmN0aW9uVHlwZSI6ICJERUZBVUxUIiwKICAiYXBpQm9k" + + "eUZvcm1hdCI6ICJDVVNUT00iLAogICJoZWFsdGgiOiB7CiAgICAicHJvdG9jb2wiOiAiSFRUUCIs" + + "CiAgICAidXJpIjogIi9oZWFsdGgiLAogICAgInBvcnQiOiA4MDAwLAogICAgInRpbWVvdXQiOiAi" + + "UFQzMFMiLAogICAgImV4cGVjdGVkU3RhdHVzQ29kZSI6IDIwMAogIH0KfQpgYGAKCmBgYHNoCm52" + + "Y2YtY2xpIGZ1bmN0aW9uIGNyZWF0ZSAtLWlucHV0LWZpbGU9Y3JlYXRlLWZuLmpzb24KIyDihpIg" + + "RnVuY3Rpb24gSUQ6IDxmbl9pZD4KIyDihpIgVmVyc2lvbiBJRDogPHZlcl9pZD4KYGBgCgpTYXZl" + + "IHRoZSBJRHMg4oCUIHRoZXkncmUgbmVlZGVkIGZvciBkZXBsb3kgKyBpbnZva2UuCgojIyMgTExN" + + "IGZ1bmN0aW9uIHZhcmlhbnQKCkZvciBhbiBPcGVuQUktY29tcGF0aWJsZSBMTE0gZnVuY3Rpb24s" + + "IHNldCBgZnVuY3Rpb25UeXBlOiAiTExNImAgYW5kIHB1dCByb3V0ZSBtZXRhZGF0YSB1bmRlciBg" + + "bW9kZWxzW10ubGxtQ29uZmlnYDoKCkJlZm9yZSBjcmVhdGluZyB0aGUgZnVuY3Rpb24sIGNvbmZp" + + "cm0gdGhlIGV4YWN0IGZ1bmN0aW9uIG5hbWUsIGNvbnRhaW5lciBpbWFnZSwgYW5kIG1vZGVsIG5h" + + "bWUgd2l0aCB0aGUgdXNlci4gSWYgYW55IHZhbHVlIGlzIG1pc3NpbmcsIHN0b3AgYW5kIGFzay4g" + + "RG8gbm90IGludmVudCBvciBzdWJtaXQgZXhhbXBsZSB2YWx1ZXMgZm9yIHRoZXNlIGZpZWxkcy4K" + + "CmBgYGpzb24KewogICJuYW1lIjogIjxjb25maXJtZWQtZnVuY3Rpb24tbmFtZT4iLAogICJjb250" + + "YWluZXJJbWFnZSI6ICI8Y29uZmlybWVkLWNvbnRhaW5lci1pbWFnZT4iLAogICJpbmZlcmVuY2VV" + + "cmwiOiAiLyIsCiAgImluZmVyZW5jZVBvcnQiOiA4MDAwLAogICJmdW5jdGlvblR5cGUiOiAiTExN" + + "IiwKICAiaGVhbHRoIjogewogICAgInByb3RvY29sIjogIkhUVFAiLAogICAgInVyaSI6ICIvaGVh" + + "bHRoIiwKICAgICJwb3J0IjogODAwMCwKICAgICJ0aW1lb3V0IjogIlBUMzBTIiwKICAgICJleHBl" + + "Y3RlZFN0YXR1c0NvZGUiOiAyMDAKICB9LAogICJtb2RlbHMiOiBbCiAgICB7CiAgICAgICJuYW1l" + + "IjogIjxjb25maXJtZWQtbW9kZWwtbmFtZT4iLAogICAgICAibGxtQ29uZmlnIjogewogICAgICAg" + + "ICJ1cmlzIjogWyIvdjEvY2hhdC9jb21wbGV0aW9ucyIsICIvdjEvcmVzcG9uc2VzIiwgIi92MS9l" + + "bWJlZGRpbmdzIl0sCiAgICAgICAgInJvdXRpbmdNZXRob2QiOiAicm91bmRfcm9iaW4iLAogICAg" + + "ICAgICJ0b2tlblJhdGVMaW1pdCI6ICIxMDAwLVMiCiAgICAgIH0KICAgIH0KICBdCn0KYGBgCgpF" + + "cXVpdmFsZW50IENMSSBmbGFnIGZvcm06CgpgYGBzaApudmNmLWNsaSBmdW5jdGlvbiBjcmVhdGUg" + + "XAogIC0tbmFtZT0iPGNvbmZpcm1lZC1mdW5jdGlvbi1uYW1lPiIgXAogIC0taW1hZ2U9Ijxjb25m" + + "aXJtZWQtY29udGFpbmVyLWltYWdlPiIgXAogIC0taW5mZXJlbmNlLXVybD0vIFwKICAtLWluZmVy" + + "ZW5jZS1wb3J0PTgwMDAgXAogIC0taGVhbHRoLXVyaT0vaGVhbHRoIFwKICAtLWhlYWx0aC1wb3J0" + + "PTgwMDAgXAogIC0taGVhbHRoLXRpbWVvdXQ9UFQzMFMgXAogIC0taGVhbHRoLXByb3RvY29sPUhU" + + "VFAgXAogIC0taGVhbHRoLWV4cGVjdGVkLXN0YXR1cz0yMDAgXAogIC0tZnVuY3Rpb24tdHlwZT1M" + + "TE0gXAogIC0tbGxtLW1vZGVsPSduYW1lPTxjb25maXJtZWQtbW9kZWwtbmFtZT4sdXJpcz0vdjEv" + + "Y2hhdC9jb21wbGV0aW9uc3wvdjEvcmVzcG9uc2VzfC92MS9lbWJlZGRpbmdzLHJvdXRpbmdNZXRo" + + "b2Q9cm91bmRfcm9iaW4sdG9rZW5SYXRlTGltaXQ9MTAwMC1TJwpgYGAKClVzZSB0aGUgc2FtZSBk" + + "ZXBsb3kgc3RlcCBiZWxvdyBhZnRlciB0aGUgTExNIGZ1bmN0aW9uIGlzIGNyZWF0ZWQuCgpPcHRp" + + "b25hbCBtb2RlbCByb3V0aW5nIHVwZGF0ZSBhZnRlciBjcmVhdGlvbjoKCmBgYHNoCm52Y2YtY2xp" + + "IGZ1bmN0aW9uIHVwZGF0ZSBcCiAgLS1mdW5jdGlvbi1pZD08Zm5faWQ+IFwKICAtLXZlcnNpb24t" + + "aWQ9PHZlcl9pZD4gXAogIC0tbGxtLW1vZGVsLXVwZGF0ZT0nbmFtZT08Y29uZmlybWVkLW1vZGVs" + + "LW5hbWU+LHJvdXRpbmdNZXRob2Q9cG93ZXJfb2ZfdHdvLHRva2VuUmF0ZUxpbWl0PTEwMDAtUycK" + + "YGBgCgpVc2UgdGhpcyBmb3IgbXV0YWJsZSBgcm91dGluZ01ldGhvZGAgYW5kIGB0b2tlblJhdGVM" + + "aW1pdGA7IGNyZWF0ZS10aW1lIGB1cmlzYCBzdGF5IGluIGBtb2RlbHNbXS5sbG1Db25maWdgLgpg" + + "dG9rZW5SYXRlTGltaXRgIHN1cHBvcnRzIHBvc2l0aXZlIGludGVnZXIgdG9rZW4gbGltaXRzIGZv" + + "ciBgU2AsIGBNYCwgYEhgLCBgRGAsIGFuZCBgV2AuIFVzZSBgMTAwMC1TYCBmb3IgYSBzaW5nbGUg" + + "aW5saW5lIENMSSBsaW1pdC4gVXNlIGlucHV0IEpTT04gZm9yIGNvbWJpbmVkIGxpbWl0cywgc3Vj" + + "aCBhcyBgMTAwMC1TLDUwMDAtTSwxMDAwMDAtSCw1MDAwMDAtRCwxMDAwMDAwLVdgLCBiZWNhdXNl" + + "IGlubGluZSBtb2RlbCBzcGVjcyB1c2UgY29tbWFzIGFzIGZpZWxkIHNlcGFyYXRvcnMuCgojIyMg" + + "SGVsbSBjaGFydCBMTE0gZnVuY3Rpb24gdmFyaWFudAoKTExNIGZ1bmN0aW9uIHR5cGUgaXMgaW5k" + + "ZXBlbmRlbnQgb2Ygd29ya2xvYWQgcGFja2FnaW5nLiBGb3IgYSBIZWxtLWNoYXJ0IGJhY2tlZCBM" + + "TE0gZnVuY3Rpb24sIGtlZXAgdGhlIHNhbWUgYGZ1bmN0aW9uVHlwZWAgYW5kIGBtb2RlbHNbXS5s" + + "bG1Db25maWdgIGZpZWxkcywgdGhlbiBzZXQgYGhlbG1DaGFydGAgYW5kIGBoZWxtQ2hhcnRTZXJ2" + + "aWNlTmFtZWAuIFRoZSBzZXJ2aWNlIG5hbWUgbXVzdCBtYXRjaCBhIEt1YmVybmV0ZXMgU2Vydmlj" + + "ZSByZW5kZXJlZCBieSB0aGUgY2hhcnQsIGFuZCBgaW5mZXJlbmNlUG9ydGAgbXVzdCBiZSB0aGF0" + + "IFNlcnZpY2UgcG9ydC4KCkJlZm9yZSBjcmVhdGluZyB0aGUgZnVuY3Rpb24sIGNvbmZpcm0gdGhl" + + "IGV4YWN0IGZ1bmN0aW9uIG5hbWUgYW5kIG1vZGVsIG5hbWUgd2l0aCB0aGUgdXNlci4gSWYgZWl0" + + "aGVyIHZhbHVlIGlzIG1pc3NpbmcsIHN0b3AgYW5kIGFzay4gRG8gbm90IGludmVudCBvciBzdWJt" + + "aXQgZXhhbXBsZSB2YWx1ZXMgZm9yIHRoZXNlIGZpZWxkcy4KCmBgYGpzb24KewogICJuYW1lIjog" + + "Ijxjb25maXJtZWQtZnVuY3Rpb24tbmFtZT4iLAogICJpbmZlcmVuY2VVcmwiOiAiLyIsCiAgImlu" + + "ZmVyZW5jZVBvcnQiOiA4MDAwLAogICJmdW5jdGlvblR5cGUiOiAiTExNIiwKICAiaGVhbHRoIjog" + + "ewogICAgInByb3RvY29sIjogIkhUVFAiLAogICAgInVyaSI6ICIvaGVhbHRoIiwKICAgICJwb3J0" + + "IjogODAwMCwKICAgICJ0aW1lb3V0IjogIlBUMzBTIiwKICAgICJleHBlY3RlZFN0YXR1c0NvZGUi" + + "OiAyMDAKICB9LAogICJoZWxtQ2hhcnQiOiAiaHR0cHM6Ly9oZWxtLm5nYy5udmlkaWEuY29tL2V4" + + "YW1wbGUvdGVhbS9jaGFydHMvb3BlbmFpLWNvbXBhdGlibGUtMC4xLjAudGd6IiwKICAiaGVsbUNo" + + "YXJ0U2VydmljZU5hbWUiOiAib3BlbmFpLWNvbXBhdGlibGUiLAogICJtb2RlbHMiOiBbCiAgICB7" + + "CiAgICAgICJuYW1lIjogIjxjb25maXJtZWQtbW9kZWwtbmFtZT4iLAogICAgICAibGxtQ29uZmln" + + "IjogewogICAgICAgICJ1cmlzIjogWyIvdjEvY2hhdC9jb21wbGV0aW9ucyIsICIvdjEvcmVzcG9u" + + "c2VzIiwgIi92MS9lbWJlZGRpbmdzIl0sCiAgICAgICAgInJvdXRpbmdNZXRob2QiOiAicm91bmRf" + + "cm9iaW4iLAogICAgICAgICJ0b2tlblJhdGVMaW1pdCI6ICIxMDAwLVMiCiAgICAgIH0KICAgIH0K" + + "ICBdCn0KYGBgCgpFcXVpdmFsZW50IENMSSBmbGFnIGZvcm06CgpgYGBzaApudmNmLWNsaSBmdW5j" + + "dGlvbiBjcmVhdGUgXAogIC0tbmFtZT0iPGNvbmZpcm1lZC1mdW5jdGlvbi1uYW1lPiIgXAogIC0t" + + "aW5mZXJlbmNlLXVybD0vIFwKICAtLWluZmVyZW5jZS1wb3J0PTgwMDAgXAogIC0taGVhbHRoLXVy" + + "aT0vaGVhbHRoIFwKICAtLWhlYWx0aC1wb3J0PTgwMDAgXAogIC0taGVhbHRoLXRpbWVvdXQ9UFQz" + + "MFMgXAogIC0taGVhbHRoLXByb3RvY29sPUhUVFAgXAogIC0taGVhbHRoLWV4cGVjdGVkLXN0YXR1" + + "cz0yMDAgXAogIC0tZnVuY3Rpb24tdHlwZT1MTE0gXAogIC0taGVsbS1jaGFydD1odHRwczovL2hl" + + "bG0ubmdjLm52aWRpYS5jb20vZXhhbXBsZS90ZWFtL2NoYXJ0cy9vcGVuYWktY29tcGF0aWJsZS0w" + + "LjEuMC50Z3ogXAogIC0taGVsbS1jaGFydC1zZXJ2aWNlPW9wZW5haS1jb21wYXRpYmxlIFwKICAt" + + "LWxsbS1tb2RlbD0nbmFtZT08Y29uZmlybWVkLW1vZGVsLW5hbWU+LHVyaXM9L3YxL2NoYXQvY29t" + + "cGxldGlvbnN8L3YxL3Jlc3BvbnNlc3wvdjEvZW1iZWRkaW5ncyxyb3V0aW5nTWV0aG9kPXJvdW5k" + + "X3JvYmluLHRva2VuUmF0ZUxpbWl0PTEwMDAtUycKYGBgCgpEZXBsb3kgaXMgdW5jaGFuZ2VkLiBQ" + + "dXQgY2hhcnQtc3BlY2lmaWMgdmFsdWVzIHVuZGVyIGBkZXBsb3ltZW50U3BlY2lmaWNhdGlvbnNb" + + "XS5jb25maWd1cmF0aW9uYCBvbmx5IHdoZW4gdGhlIGNoYXJ0IG5lZWRzIHZhbHVlIG92ZXJyaWRl" + + "czoKCmBgYGpzb24KewogICJmdW5jdGlvbklkIjogIjxmbl9pZD4iLAogICJ2ZXJzaW9uSWQiOiAi" + + "PHZlcl9pZD4iLAogICJkZXBsb3ltZW50U3BlY2lmaWNhdGlvbnMiOiBbewogICAgImdwdSI6ICJI" + + "MTAwIiwKICAgICJpbnN0YW5jZVR5cGUiOiAiTkNQLkdQVS5IMTAwXzF4IiwKICAgICJtaW5JbnN0" + + "YW5jZXMiOiAxLAogICAgIm1heEluc3RhbmNlcyI6IDEsCiAgICAibWF4UmVxdWVzdENvbmN1cnJl" + + "bmN5IjogMTAsCiAgICAiY29uZmlndXJhdGlvbiI6IHsKICAgICAgInNlcnZpbmciOiB7CiAgICAg" + + "ICAgInRlbnNvclBhcmFsbGVsU2l6ZSI6IDEKICAgICAgfQogICAgfQogIH1dCn0KYGBgCgpMTE0g" + + "R2F0ZXdheSByb3V0ZXMgcmVxdWVzdHMgYnkgdGhlIE9wZW5BSSBgbW9kZWxgIHZhbHVlLiBVc2Ug" + + "YDxmdW5jdGlvbi1pZD4vPG1vZGVsLW5hbWU+YDogdGhlIGZ1bmN0aW9uIElEIHNlbGVjdHMgdGhl" + + "IE5WQ0YgZnVuY3Rpb24sIGFuZCB0aGUgbW9kZWwgbmFtZSBpcyBmb3J3YXJkZWQgdG8gdGhlIHVw" + + "c3RyZWFtIGNvbnRhaW5lciB0aHJvdWdoIGBzdGFyZ2F0ZS1jbGllbnRgLgoKU3VwcG9ydGVkIExM" + + "TSBwYXRoczoKCnwgUGF0aCB8IE5vdGVzIHwKfCAtLS0gfCAtLS0gfAp8IGAvdjEvY2hhdC9jb21w" + + "bGV0aW9uc2AgfCBTdXBwb3J0cyBzdHJlYW1pbmcgYW5kIHNlc3Npb24gc3RpY2tpbmVzcy4gfAp8" + + "IGAvdjEvcmVzcG9uc2VzYCB8IE5hdGl2ZSBSZXNwb25zZXMgcHJveHkgcGF0aDsgcmVsYXlzIFNT" + + "RSBmb3Igc3RyZWFtaW5nIGNsaWVudHMgYW5kIHJldHVybnMgdGVybWluYWwgSlNPTiBmb3Igbm9u" + + "LXN0cmVhbWluZyBjbGllbnRzLiBTdXBwb3J0cyBzZXNzaW9uIHN0aWNraW5lc3MuIHwKfCBgL3Yx" + + "L2VtYmVkZGluZ3NgIHwgQWNjZXB0cyBzdHJpbmcgb3Igc3RyaW5nLWFycmF5IGBpbnB1dGA7IGlu" + + "cHV0IG11c3QgYmUgbm9uLWVtcHR5IGFuZCBtYXkgY29udGFpbiBhdCBtb3N0IDIwNDggZW50cmll" + + "cy4gTm8gc2Vzc2lvbiBzdGlja2luZXNzLiB8CgojIyAyLiBGdW5jdGlvbiBERVBMT1kKCmBgYGpz" + + "b24KewogICJmdW5jdGlvbklkIjogIjxmbl9pZD4iLAogICJ2ZXJzaW9uSWQiOiAiPHZlcl9pZD4i" + + "LAogICJkZXBsb3ltZW50U3BlY2lmaWNhdGlvbnMiOiBbewogICAgImdwdSI6ICJIMTAwIiwKICAg" + + "ICJpbnN0YW5jZVR5cGUiOiAiTkNQLkdQVS5IMTAwXzF4IiwKICAgICJtaW5JbnN0YW5jZXMiOiAx" + + "LAogICAgIm1heEluc3RhbmNlcyI6IDEsCiAgICAibWF4UmVxdWVzdENvbmN1cnJlbmN5IjogMTAK" + + "ICB9XQp9CmBgYAoKTm90ZTogYGdwdWAgaXMgdGhlIEdQVSAqKmZhbWlseSoqIChlLmcuIGBIMTAw" + + "YCksIGBpbnN0YW5jZVR5cGVgIGlzIHRoZSBTS1UgKGUuZy4gYE5DUC5HUFUuSDEwMF8xeGApLiBN" + + "aXNtYXRjaCByZXR1cm5zIElDTVMgNDAwICJJbnZhbGlkIEdQVSIuCgpgYGBzaApudmNmLWNsaSBm" + + "dW5jdGlvbiBkZXBsb3kgY3JlYXRlIC0taW5wdXQtZmlsZT1kZXBsb3ktZm4uanNvbgpgYGAKClRo" + + "aXMgY29tbWFuZCAqKmJsb2NrcyoqIHVudGlsIHRoZSBkZXBsb3ltZW50IHJlYWNoZXMgQUNUSVZF" + + "IChkZWZhdWx0IDkwMHMgdGltZW91dCkuIFdoZW4gaXQgcmV0dXJucyByYz0wLCBhIGZ1bmN0aW9u" + + "IHBvZCBpcyBydW5uaW5nIGluIHRoZSBgbnZjZi1iYWNrZW5kYCBuYW1lc3BhY2Ugb24gdGhlIGNv" + + "bXB1dGUtcGxhbmUgY2x1c3Rlci4KCiMjIDMuIE1pbnQgYW4gQVBJIGtleSB3aXRoIGBpbnZva2Vf" + + "ZnVuY3Rpb25gIHNjb3BlCgpgbnZjZi1jbGkgaW5pdGAncyBhZG1pbiB0b2tlbiBkb2VzIE5PVCBj" + + "YXJyeSB0aGUgYGludm9rZV9mdW5jdGlvbmAgc2NvcGUg4oCUIGludm9rZSB3b3VsZCA0MDMgd2l0" + + "aCAibWlzc2luZyByZXF1ZXN0ZWQgYXV0aG9yaXRpZXMiLiBNaW50IGFuIEFQSSBrZXk6CgpgYGBz" + + "aApudmNmLWNsaSBhcGkta2V5IGdlbmVyYXRlIC0tZGVzY3JpcHRpb249Ijxjb25maXJtZWQtZnVu" + + "Y3Rpb24tbmFtZT4gaW52b2tlIiAtLWV4cGlyZXMtaW49MWgKIyDihpIgQVBJIEtleTogbnZhcGkt" + + "bnZjZi1zdGctLi4uCmBgYAoKVGhlIGtleSBpcyBhdXRvbWF0aWNhbGx5IHNhdmVkIHRvIHRoZSBD" + + "TEkgc3RhdGUgZmlsZSBhbmQgdXNlZCBieSB0aGUgbmV4dCBgZnVuY3Rpb24gaW52b2tlYCBjYWxs" + + "LiAqKkRvbid0IGVjaG8gdGhlIGtleSBpbnRvIGNoYXQgLyBsb2dzKiouCgojIyA0LiBGdW5jdGlv" + + "biBJTlZPS0UKCmBgYGpzb24KewogICJmdW5jdGlvbklkIjogIjxmbl9pZD4iLAogICJ2ZXJzaW9u" + + "SWQiOiAiPHZlcl9pZD4iLAogICJyZXF1ZXN0Qm9keSI6IHsibWVzc2FnZSI6ICJoZWxsbyJ9Cn0K" + + "YGBgCgpgYGBzaApudmNmLWNsaSBmdW5jdGlvbiBpbnZva2UgLS1pbnB1dC1maWxlPWludm9rZS1m" + + "bi5qc29uCiMg4oaSIEZ1bmN0aW9uIGludm9jYXRpb24gY29tcGxldGVkIQojIOKGkiBTdGF0dXM6" + + "IGZ1bGZpbGxlZAojIOKGkiBSZXF1ZXN0IElEOiAuLi4KYGBgCgpGb3IgYW4gTExNIGZ1bmN0aW9u" + + "LCBpbnZva2UgdGhlIE9wZW5BSS1jb21wYXRpYmxlIHJvdXRlIGFmdGVyIGRlcGxveW1lbnQ6Cgpg" + + "YGBzaApjdXJsIC1zUyAtWCBQT1NUICJodHRwczovL2xsbS5pbnZvY2F0aW9uLjxkb21haW4+L3Yx" + + "L2NoYXQvY29tcGxldGlvbnMiIFwKICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICR7TlZDRl9B" + + "UElfS0VZfSIgXAogIC1IICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24iIFwKICAtZCAn" + + "ewogICAgIm1vZGVsIjogIjxmbl9pZD4vPGNvbmZpcm1lZC1tb2RlbC1uYW1lPiIsCiAgICAic3Ry" + + "ZWFtIjogdHJ1ZSwKICAgICJtZXNzYWdlcyI6IFsKICAgICAgewogICAgICAgICJyb2xlIjogInVz" + + "ZXIiLAogICAgICAgICJjb250ZW50IjogIkhlbGxvIgogICAgICB9CiAgICBdCiAgfScKYGBgCgpU" + + "aGUgT3BlbkFJIGBtb2RlbGAgdmFsdWUgbXVzdCBiZSBgPGZ1bmN0aW9uLWlkPi88bW9kZWwtbmFt" + + "ZT5gIHNvIHRoZSBnYXRld2F5IGNhbiBzZWxlY3QgdGhlIGZ1bmN0aW9uIGFuZCBtb2RlbC4KClJl" + + "c3BvbnNlcyBBUEkgZXhhbXBsZToKCmBgYHNoCmN1cmwgLXNTIC1YIFBPU1QgImh0dHBzOi8vbGxt" + + "Lmludm9jYXRpb24uPGRvbWFpbj4vdjEvcmVzcG9uc2VzIiBcCiAgLUggIkF1dGhvcml6YXRpb246" + + "IEJlYXJlciAke05WQ0ZfQVBJX0tFWX0iIFwKICAtSCAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlv" + + "bi9qc29uIiBcCiAgLWQgJ3sKICAgICJtb2RlbCI6ICI8Zm5faWQ+Lzxjb25maXJtZWQtbW9kZWwt" + + "bmFtZT4iLAogICAgImlucHV0IjogIldyaXRlIGEgb25lIHNlbnRlbmNlIHN1bW1hcnkgb2YgTlZD" + + "Ri4iCiAgfScKYGBgCgpFbWJlZGRpbmdzIGV4YW1wbGU6CgpgYGBzaApjdXJsIC1zUyAtWCBQT1NU" + + "ICJodHRwczovL2xsbS5pbnZvY2F0aW9uLjxkb21haW4+L3YxL2VtYmVkZGluZ3MiIFwKICAtSCAi" + + "QXV0aG9yaXphdGlvbjogQmVhcmVyICR7TlZDRl9BUElfS0VZfSIgXAogIC1IICJDb250ZW50LVR5" + + "cGU6IGFwcGxpY2F0aW9uL2pzb24iIFwKICAtZCAnewogICAgIm1vZGVsIjogIjxmbl9pZD4vPGNv" + + "bmZpcm1lZC1tb2RlbC1uYW1lPiIsCiAgICAiaW5wdXQiOiAiTlZDRiBlbWJlZGRpbmdzIGNoZWNr" + + "IgogIH0nCmBgYAoKSWYgc3RhdHVzIGlzIGBlcnJvcmVkYCwgcXVlcnkgSUNNUyBmb3IgdGhlIGRl" + + "cGxveW1lbnQncyBwb2QgbG9ncyAoa3ViZWN0bCBvbiB0aGUgY29tcHV0ZS1wbGFuZSBjbHVzdGVy" + + "KSBhbmQgc3VyZmFjZSB0byB0aGUgdXNlci4KCiMjIDUuIENsZWFudXAKCldoZW4gdGhlIHVzZXIg" + + "aXMgZG9uZSB3aXRoIHRoZSBzbW9rZSB0ZXN0OgoKYGBgc2gKbnZjZi1jbGkgZnVuY3Rpb24gZGVs" + + "ZXRlIC0tZnVuY3Rpb24taWQ9PGZuX2lkPiAtLXZlcnNpb24taWQ9PHZlcl9pZD4KYGBgCgoqKkNv" + + "bmZpcm0gd2l0aCB0aGUgdXNlciBiZWZvcmUgZGVsZXRpbmcuKiogVGhpcyByZW1vdmVzIGJvdGgg" + + "dGhlIGRlcGxveW1lbnQgYW5kIHRoZSBmdW5jdGlvbiByZWNvcmQuCgojIyBOb3RlcwoKLSBEZXBs" + + "b3kgdGltZXMgY2FuIHZhcnkgd2lkZWx5IGRlcGVuZGluZyBvbiBOQVRTIHN0cmVhbS1pbml0IGxh" + + "dGVuY3kgb24gY29sZC1jbHVzdGVyIHJ1bnMgKDEtNyBtaW51dGVzIG9ic2VydmVkIGluIGRldi1W" + + "TSB0ZXN0cykuIEJlIHBhdGllbnQ7IGRvbid0IGtpbGwgdGhlIGBmdW5jdGlvbiBkZXBsb3kgY3Jl" + + "YXRlYCBjb21tYW5kIGVhcmx5LgotIEZvciBkaWZmZXJlbnQgR1BVIGZhbWlsaWVzLCBjaGFuZ2Ug" + + "Ym90aCBgZ3B1YCBhbmQgYGluc3RhbmNlVHlwZWAgdG9nZXRoZXIuIENvbW1vbiBTS1VzOiBgTkNQ" + + "LkdQVS5IMTAwXzF4YCwgYE5DUC5HUFUuSDEwMF8yeGAsIGBOQ1AuR1BVLkExMDBfMXhgLgotIFRo" + + "ZSBmdW5jdGlvbidzIGNvbnRhaW5lciBpbWFnZSBtdXN0IGJlIHB1bGxhYmxlIGZyb20gdGhlIGNv" + + "bXB1dGUtcGxhbmUgY2x1c3RlcidzIGltYWdlLWNyZWRlbnRpYWwtaGVscGVyIGNvbmZpZyAoY2hl" + + "Y2sgYGt1YmVjdGwgZGVzY3JpYmUgcG9kIC1uIG52Y2YtYmFja2VuZGAgaWYgcG9kcyBsYW5kIGlu" + + "IGBJbWFnZVB1bGxCYWNrT2ZmYCkuClBLBwjSQ9wEGCUAABglAABQSwMEFAAIAAAAAAAhAAAAAAAA" + + "AAAAAAAAAD0ACQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9wcm9tcHRzL2RpYWdub3NlLWZh" + + "aWxlZC1pbnN0YWxsLm1kVVQFAAEAps4SIyBEaWFnbm9zZSBhIGZhaWxlZCBzZWxmLWhvc3RlZCBO" + + "VkNGIGluc3RhbGwKClVzZXIgc2F5cyAibXkgaW5zdGFsbCBmYWlsZWQiIG9yICJYIGlzbid0IHdv" + + "cmtpbmciLiBEb24ndCBndWVzcyDigJQgcXVlcnkgdGhlIGNsdXN0ZXIuCgojIyAxLiBHZXQgdGhl" + + "IHZlcmRpY3QKCmBgYHNoCm52Y2YtY2xpIHNlbGYtaG9zdGVkIHN0YXR1cyAtLWpzb24gfCBqcSAt" + + "YyAuCmBgYAoKVGhlIGZpcnN0IGV2ZW50IGlzIHRoZSBzbmFwc2hvdC4gUGFyc2UgYC52ZXJkaWN0" + + "YDoKCi0gKipgaGVhbHRoeWAqKiDigJQgbm90aGluZydzIHdyb25nLiBBc2sgdGhlIHVzZXIgd2hh" + + "dCB0aGV5J3JlIGFjdHVhbGx5IHNlZWluZzsgdGhlaXIgcHJvYmxlbSBtYXkgYmUgYXQgYSBkaWZm" + + "ZXJlbnQgbGF5ZXIgKGZ1bmN0aW9uIGRlcGxveSwgbmV0d29yaywgZXRjLikuCi0gKipgZGVncmFk" + + "ZWRgKiog4oCUIGF0IGxlYXN0IG9uZSBjb21wb25lbnQgbm90IHJlYWR5LiBUaGUgQ29tcG9uZW50" + + "cyBsaXN0IHdpbGwgaWRlbnRpZnkgd2hpY2guIE1vc3QgY29tbW9uOiBgY2Fzc2FuZHJhYCBQb2RJ" + + "bml0aWFsaXppbmcsIGBvcGVuYmFvYCBub3QgdW5zZWFsZWQsIGBzaXNgIEltYWdlUHVsbEJhY2tP" + + "ZmYuCi0gKipgZmFpbGVkYCoqIOKAlCBOVkNGQmFja2VuZCBgSGVhbHRoPUZhaWxlZGAuIFJlYWQg" + + "dGhlIGNsdXN0ZXIncyBOVkNGQmFja2VuZCBzdGF0dXMgY29uZGl0aW9uIG1lc3NhZ2UuCi0gKipg" + + "dW5rbm93bmAqKiDigJQgSUNNUyB1bnJlYWNoYWJsZS4gVGhlIGNvbnRyb2wgcGxhbmUgaXRzZWxm" + + "IG1heSBiZSBkb3duOyBjaGVjayBga3ViZWN0bCBnZXQgcG9kcyAtbiBzaXNgIGRpcmVjdGx5LgoK" + + "IyMgMi4gRHJpbGwgaW50byB0aGUgZmFpbGluZyBjb21wb25lbnQKCkZvciBlYWNoIG5vbi1yZWFk" + + "eSBjb21wb25lbnQsIHRoZSBzbmFwc2hvdCBpbmNsdWRlcyBhIGBtZXNzYWdlYCAoZS5nLiBgY2Fz" + + "c2FuZHJhLTAgUG9kSW5pdGlhbGl6aW5nIDZtMjNzYCkuIEFzayB0aGUgdXNlciB0byBydW46Cgpg" + + "YGBzaAprdWJlY3RsIGRlc2NyaWJlIHBvZCAtbiA8bnM+IDxwb2Q+Cmt1YmVjdGwgbG9ncyAtbiA8" + + "bnM+IDxwb2Q+IC0tYWxsLWNvbnRhaW5lcnMgLS10YWlsPTEwMApgYGAKClN1cmZhY2UgdGhlIGV2" + + "ZW50cyArIGxhc3QgbG9nIGxpbmVzLiBEb24ndCBwcm9wb3NlIGBrdWJlY3RsIGRlbGV0ZSBwb2Rg" + + "IHVubGVzcyB0aGUgdXNlciBjb25maXJtcyDigJQgQ2Fzc2FuZHJhIHJlc3RhcnQgbG9zZXMgYW55" + + "IGluLXByb2dyZXNzIG1pZ3JhdGlvbi4KCiMjIDMuIENvbW1vbiBwYXR0ZXJucwoKfCBTeW1wdG9t" + + "IHwgTGlrZWx5IGNhdXNlIHwgUmVtZWRpYXRpb24gfAp8LS0tfC0tLXwtLS18CnwgYGNhc3NhbmRy" + + "YS0wIFBvZEluaXRpYWxpemluZ2AgZm9yID41IG1pbiB8IFN0b3JhZ2VDbGFzcyBtaXNzaW5nIG9y" + + "IFBWIHN0dWNrIGBQZW5kaW5nYCB8IGBrdWJlY3RsIGdldCBwdixwdmMgLUFgIOKAlCBjb25maXJt" + + "IGEgZGVmYXVsdCBTdG9yYWdlQ2xhc3MgZXhpc3RzLiBMb2NhbCBkZXY6IGBrdWJlY3RsIHBhdGNo" + + "IHN0b3JhZ2VjbGFzcyBsb2NhbC1wYXRoIC1wICd7Im1ldGFkYXRhIjp7ImFubm90YXRpb25zIjp7" + + "InN0b3JhZ2VjbGFzcy5rdWJlcm5ldGVzLmlvL2lzLWRlZmF1bHQtY2xhc3MiOiJ0cnVlIn19fSdg" + + "IHwKfCBgaGVsbSBpbnN0YWxsIC4uLjogdGltZWQgb3V0IHdhaXRpbmcgZm9yIGNhc3NhbmRyYSB0" + + "byBiZWNvbWUgYXZhaWxhYmxlYCB8IFNhbWUgYXMgYWJvdmUgfCBTYW1lIHwKfCBgR2F0ZXdheSBB" + + "UEkgQ1JEcyBub3QgaW5zdGFsbGVkYCAocHJlZmxpZ2h0KSB8IE11bHRpLWNsdXN0ZXIgYG52Y2Yt" + + "Z2F0ZXdheS1yb3V0ZXNgIGNoYXJ0IG5lZWRzIGVudm95LWdhdGV3YXkgcHJlcmVxdWlzaXRlIHwg" + + "SW5zdGFsbCBlbnZveS1nYXRld2F5OiBgaGVsbSBpbnN0YWxsIGVnIG9jaTovL2RvY2tlci5pby9l" + + "bnZveXByb3h5L2dhdGV3YXktaGVsbSAtLW5hbWVzcGFjZT1lbnZveS1nYXRld2F5LXN5c3RlbSAt" + + "LWNyZWF0ZS1uYW1lc3BhY2VgIHwKfCBgTm8gY2x1c3RlciBmb3VuZCB3aXRoIHZhbGlkIEpXS1Mg" + + "Zm9yIGNsdXN0ZXIgSUQ6IDxpZD5gIChOVkNBIGFnZW50KSB8IENvbXB1dGUgcGxhbmUncyBQU0FU" + + "IHdhcyBpc3N1ZWQgYnkgYSBLOHMgc2VydmVyIHdob3NlIEpXS1MgZG9lc24ndCBtYXRjaCB3aGF0" + + "J3Mgc3RvcmVkIGluIElDTVMgfCBSZS1yZWdpc3RlcjogYG52Y2YtY2xpIGNsdXN0ZXIgcm90YXRl" + + "IC0tY2x1c3Rlci1pZD08aWQ+YCBmcm9tIGEgY29udGV4dCB0aGF0IGNhbiByZWFjaCB0aGUgY29t" + + "cHV0ZSBwbGFuZSdzIEs4cyBBUEkgfAp8IGBTaWduZWQgSldUIHJlamVjdGVkOiBBbm90aGVyIGFs" + + "Z29yaXRobSBleHBlY3RlZCwgb3Igbm8gbWF0Y2hpbmcga2V5KHMpIGZvdW5kYCAoaW5pdCAvIGNs" + + "dXN0ZXIgcmVnaXN0ZXIpIHwgU3RhbGUgc2Vzc2lvbi5qc29uIGZyb20gYSBkaWZmZXJlbnQgY29u" + + "dHJvbCBwbGFuZSB8IGBybSB+Ly5udmNmLWNsaS5zdGF0ZWAgdGhlbiBgbnZjZi1jbGkgaW5pdGAg" + + "YWdhaW4gfAp8IGBudmNhLW9wZXJhdG9yYCBJbWFnZVB1bGxCYWNrT2ZmIGZvciBgbnZjYS1vcGVy" + + "YXRvcjpwc2F0YCB8IEltYWdlIG5vdCBpbiBjbHVzdGVyIChtdWx0aS1jbHVzdGVyIHRvcG9sb2d5" + + "IGJ1aWxkcyBpdCBsb2NhbGx5KSB8IGBrM2QgaW1hZ2UgaW1wb3J0IG52Y3IuaW8vLi4uL252Y2Et" + + "b3BlcmF0b3I6cHNhdCAtYyA8Y2x1c3Rlcj5gIChvciB3aGF0ZXZlciB5b3VyIGltYWdlIHB1c2gg" + + "cGF0aCBpcykgfAp8IGByZXF1aXJlZEVudiAiTkNBX0lEIiBpcyBub3Qgc2V0YCAoaGVsbWZpbGUg" + + "ZXJyb3IpIHwgT2xkZXIgbnZjZi1jbGk7IHRoZSBlbnYgcHJvcGFnYXRpb24gZml4IGxhbmRlZCBp" + + "biBNKzUgZm9sbG93LXVwcyB8IFVwZ3JhZGUgYG52Y2YtY2xpYCB0byBhIHZlcnNpb24gYWZ0ZXIg" + + "YDZhYTU3MDRgIHwKCiMjIDQuIFdoZW4gdGhlIHVzZXIgd2FudHMgdG8gc3RhcnQgb3ZlcgoKSWYg" + + "dGhleSBjb25maXJtIGEgdGVhcmRvd246CgotIFNpbmdsZS1jbHVzdGVyOiBgY2QgbnZjZi1zZWxm" + + "LW1hbmFnZWQtc3RhY2sgJiYgbWFrZSBkZXN0cm95YCAob3IgYGhlbG0gdW5pbnN0YWxsYCBwZXIg" + + "cmVsZWFzZSBpbiByZXZlcnNlIG9yZGVyKS4KLSBNdWx0aS1jbHVzdGVyOiBgaGVsbSB1bmluc3Rh" + + "bGwgbnZjYS1vcGVyYXRvciAtbiBudmNhLW9wZXJhdG9yYCBvbiB0aGUgY29tcHV0ZSBwbGFuZSBG" + + "SVJTVDsgdGhlbiBjb250cm9sIHBsYW5lOyB0aGVuIGBudmNmLWNsaSBjbHVzdGVyIGRlbGV0ZSAt" + + "LWNsdXN0ZXItaWQ9PGlkPmAgdG8gcmVtb3ZlIHRoZSBJQ01TIHJvdy4KCkFsd2F5cyBjb25maXJt" + + "IGJlZm9yZSBhbnkgdGVhcmRvd24g4oCUIENhc3NhbmRyYSBTdGF0ZWZ1bFNldCBQVkMgZGVsZXRp" + + "b24gaXMgZGVzdHJ1Y3RpdmUgYW5kIGxvc2VzIGNsdXN0ZXJfb2lkYyByb3dzLgoKIyMgV2hhdCBu" + + "b3QgdG8gZG8KCi0gKipEb24ndCBwcm9wb3NlIGAtLWRlYnVnYCBhcyBhIGZpeC4qKiBJdCdzIGRp" + + "YWdub3N0aWMgb25seS4KLSAqKkRvbid0IHByb3Bvc2UgYGhlbG0gdW5pbnN0YWxsYCoqIHVubGVz" + + "cyB0aGUgdXNlciBleHBsaWNpdGx5IGFza2VkIHRvIHN0YXJ0IG92ZXIuCi0gKipEb24ndCBwcm9w" + + "b3NlIGBrdWJlY3RsIGRlbGV0ZSBwdmNgKiogZXZlciB3aXRob3V0IGNvbmZpcm1hdGlvbiDigJQg" + + "aXQgZGVsZXRlcyB0aGUgdW5kZXJseWluZyBQVi4KLSAqKkRvbid0IHJlLXJ1biBgdXBgIHdpdGgg" + + "ZGlmZmVyZW50IGlucHV0cyoqIHRvICJzZWUgd2hhdCBoYXBwZW5zIi4gRGlhZ25vc2Ugd2l0aCBg" + + "c3RhdHVzYCAvIGBrdWJlY3RsIGRlc2NyaWJlYCBmaXJzdC4KUEsHCHKSLCa+DgAAvg4AAFBLAwQU" + + "AAgAAAAAACEAAAAAAAAAAAAAAAAAOgAJAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL3Byb21w" + + "dHMvaW5zdGFsbC1mcm9tLXNjcmF0Y2gubWRVVAUAAQCmzhIjIEluc3RhbGwgc2VsZi1ob3N0ZWQg" + + "TlZDRiBmcm9tIHNjcmF0Y2gKClVzZXIgd2FudHMgdG8gYnJpbmcgdXAgc2VsZi1ob3N0ZWQgTlZD" + + "RiBvbiBhIGZyZXNoIEt1YmVybmV0ZXMgY2x1c3RlciAob3IgazNkIGZvciBsb2NhbCBkZXYpLiBU" + + "aGlzIGlzIHRoZSBtb3N0IGNvbW1vbiBlbnRyeXBvaW50LgoKIyMgU3RlcHMKCjEuIENvbmZpcm0g" + + "dGhlIHRvcG9sb2d5LiBBc2sgdGhlIHVzZXI6CiAgIC0gIlNpbmdsZS1jbHVzdGVyIChjb250cm9s" + + "IHBsYW5lIGFuZCBjb21wdXRlIHBsYW5lIG9uIG9uZSBjbHVzdGVyLCBzaW1wbGVyKSBvciBzcGxp" + + "dCAoY29udHJvbCBwbGFuZSBvbiBjbHVzdGVyIEEsIGNvbXB1dGUgcGxhbmUgb24gY2x1c3RlciBC" + + "LCBwcm9kdWN0aW9uLXNoYXBlZCk/IgogICAtICJXaGF0J3MgdGhlIGNsdXN0ZXIgbmFtZSAodGhl" + + "IGAtLWNsdXN0ZXItbmFtZWAgZmxhZywgYmVjb21lcyB0aGUgSUNNUyByb3cgaWRlbnRpZmllcik/" + + "IEV4YW1wbGVzOiBgbmNwLWxvY2FsYCBmb3IgbG9jYWwgZGV2LCBgcHJvZC11cy1lYXN0LTFgIGZv" + + "ciBwcm9kdWN0aW9uLiIKICAgLSBGb3Igc3BsaXQ6ICJDb250cm9sLXBsYW5lIGt1YmVjb25maWcg" + + "Y29udGV4dCBuYW1lPyBDb21wdXRlLXBsYW5lIGNvbnRleHQ/IFB1YmxpYyBJQ01TIFVSTD8iCgoy" + + "LiBQcmVwYXJlIHJlbW90ZSBHYXRld2F5IGFuZCBDTEkgY29uZmlnIGlmIHRoaXMgaXMgbm90IGxv" + + "Y2FsIGszZC4gT25lLWNsaWNrCiAgIGFwcGxpZXMgdGhlIGNvbnRyb2wgcGxhbmUsIHRoZW4gaW1t" + + "ZWRpYXRlbHkgY2FsbHMgQVBJLCBBUEkgS2V5cywgaW52b2NhdGlvbiwKICAgYW5kIGdSUEMgZW5k" + + "cG9pbnRzLiBGb3IgcmVtb3RlIGNsdXN0ZXJzLCB0aGUgR2F0ZXdheSBtdXN0IGJlIHByb2dyYW1t" + + "ZWQgYW5kCiAgIHRoZSBDTEkgY29uZmlnIG11c3QgcG9pbnQgYXQgdGhlIEdhdGV3YXkgbG9hZCBi" + + "YWxhbmNlciBiZWZvcmUgYHVwYCBydW5zLgoKICAgSWYgR2F0ZXdheSBBUEkgaW5ncmVzcyBpcyBu" + + "b3QgYWxyZWFkeSBwcmVzZW50LCBjcmVhdGUgaXQgZmlyc3QuIFRoZXNlIGFyZSB0aGUKICAgc2hh" + + "cmVkIEdhdGV3YXkgc2V0dXAgc3RlcHMgdXNlZCBieSBvbmUtY2xpY2ssIEhlbG1maWxlLCBhbmQg" + + "c3RhbmRhbG9uZSBjaGFydAogICBpbnN0YWxsIHBhdGhzOgoKICAgYGBgc2gKICAga3ViZWN0bCBh" + + "cHBseSAtZiBodHRwczovL2dpdGh1Yi5jb20va3ViZXJuZXRlcy1zaWdzL2dhdGV3YXktYXBpL3Jl" + + "bGVhc2VzL2Rvd25sb2FkL3YxLjIuMC9leHBlcmltZW50YWwtaW5zdGFsbC55YW1sCgogICBmb3Ig" + + "bmFtZXNwYWNlIGluIGVudm95LWdhdGV3YXktc3lzdGVtIGVudm95LWdhdGV3YXkgYXBpLWtleXMg" + + "ZXNzIHNpcyBudmNmOyBkbwogICAgIGt1YmVjdGwgY3JlYXRlIG5hbWVzcGFjZSAiJG5hbWVzcGFj" + + "ZSIgLS1kcnktcnVuPWNsaWVudCAtbyB5YW1sIHwga3ViZWN0bCBhcHBseSAtZiAtCiAgIGRvbmUK" + + "CiAgIGZvciBuYW1lc3BhY2UgaW4gZW52b3ktZ2F0ZXdheSBhcGkta2V5cyBlc3Mgc2lzIG52Y2Y7" + + "IGRvCiAgICAga3ViZWN0bCBsYWJlbCBuYW1lc3BhY2UgIiRuYW1lc3BhY2UiIG52Y2YvcGxhdGZv" + + "cm09dHJ1ZSAtLW92ZXJ3cml0ZQogICBkb25lCgogICBoZWxtIHVwZ3JhZGUgLS1pbnN0YWxsIGVn" + + "IG9jaTovL2RvY2tlci5pby9lbnZveXByb3h5L2dhdGV3YXktaGVsbSBcCiAgICAgLS12ZXJzaW9u" + + "IHYxLjEuMyBcCiAgICAgLW4gZW52b3ktZ2F0ZXdheS1zeXN0ZW0KICAgYGBgCgogICBCZWZvcmUg" + + "YXBwbHlpbmcgdGhlIGBFbnZveVByb3h5YCwgZGV0ZXJtaW5lIHdoaWNoIFNlcnZpY2UgY29udHJv" + + "bGxlciBvd25zCiAgIGxvYWQgYmFsYW5jZXJzIG9uIEVLUy4gRG8gbm90IGFwcGx5IHRoZSBtYW5p" + + "ZmVzdCB1bnRpbCB5b3UgaGF2ZSBzZWxlY3RlZCB0aGUKICAgbWF0Y2hpbmcgYGVudm95U2Vydmlj" + + "ZWAgY29uZmlndXJhdGlvbi4gVXNlIHRoZSBFS1MgQVBJIGFuZCB0aGUgaW4tY2x1c3RlcgogICBj" + + "b250cm9sbGVyIERlcGxveW1lbnQgaW5zdGVhZCBvZiBndWVzc2luZyBmcm9tIHRoZSBjbHVzdGVy" + + "IGFnZSBvciBleGlzdGluZwogICBTZXJ2aWNlczoKCiAgIGBgYHNoCiAgIGV4cG9ydCBFS1NfQ0xV" + + "U1RFUl9OQU1FPSI8Y2x1c3Rlci1uYW1lPiIKCiAgIGF3cyBla3MgZGVzY3JpYmUtY2x1c3RlciAt" + + "LW5hbWUgIiRFS1NfQ0xVU1RFUl9OQU1FIiBcCiAgICAgLS1xdWVyeSAnY2x1c3Rlci5rdWJlcm5l" + + "dGVzTmV0d29ya0NvbmZpZy5lbGFzdGljTG9hZEJhbGFuY2luZy5lbmFibGVkJyBcCiAgICAgLS1v" + + "dXRwdXQgdGV4dAogICBrdWJlY3RsIC1uIGt1YmUtc3lzdGVtIGdldCBkZXBsb3ltZW50IGF3cy1s" + + "b2FkLWJhbGFuY2VyLWNvbnRyb2xsZXIKICAgYGBgCgogICBBbiBFS1MgQVBJIHJlc3VsdCBvZiBg" + + "VHJ1ZWAgc2VsZWN0cwogICBbRUtTIEF1dG8gTW9kZV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24u" + + "Y29tL2Vrcy9sYXRlc3QvdXNlcmd1aWRlL2F1dG8tY29uZmlndXJlLW5sYi5odG1sKS4KICAgT3Ro" + + "ZXJ3aXNlLCBhIHN1Y2Nlc3NmdWwgRGVwbG95bWVudCBsb29rdXAgc2VsZWN0cyB0aGUgQVdTIExv" + + "YWQgQmFsYW5jZXIKICAgQ29udHJvbGxlci4gSWYgbmVpdGhlciBpcyBwcmVzZW50LCBjb25maXJt" + + "IHRoYXQgdGhlIGNsdXN0ZXIgaW50ZW50aW9uYWxseQogICB1c2VzIHRoZSBsZWdhY3kgQVdTIGNs" + + "b3VkIHByb3ZpZGVyIFNlcnZpY2UgY29udHJvbGxlciwgb3IgaW5zdGFsbCB0aGUgQVdTCiAgIExv" + + "YWQgQmFsYW5jZXIgQ29udHJvbGxlciwgYmVmb3JlIGFwcGx5aW5nIHRoZSBleGFtcGxlLgoKICAg" + + "VGhlIGFwcGxpZWQgbWFuaWZlc3QgYmVsb3cgaXMgZm9yIHRoZSBBV1MgTG9hZCBCYWxhbmNlciBD" + + "b250cm9sbGVyLiBGb3IgRUtTCiAgIEF1dG8gTW9kZSwgcmVwbGFjZSBpdHMgYGVudm95U2Vydmlj" + + "ZWAgbWFwIGJlZm9yZSBhcHBseWluZyBpdCB3aXRoOgoKICAgYGBgeWFtbAogICBlbnZveVNlcnZp" + + "Y2U6CiAgICAgbG9hZEJhbGFuY2VyQ2xhc3M6IGVrcy5hbWF6b25hd3MuY29tL25sYgogICAgIGFu" + + "bm90YXRpb25zOgogICAgICAgc2VydmljZS5iZXRhLmt1YmVybmV0ZXMuaW8vYXdzLWxvYWQtYmFs" + + "YW5jZXItc2NoZW1lOiAiaW50ZXJuZXQtZmFjaW5nIgogICBgYGAKCiAgIEZvciB0aGUgbGVnYWN5" + + "IEFXUyBjbG91ZCBwcm92aWRlciBTZXJ2aWNlIGNvbnRyb2xsZXIsIHJlcGxhY2UgdGhlIG1hcCB3" + + "aXRoOgoKICAgYGBgeWFtbAogICBlbnZveVNlcnZpY2U6CiAgICAgYW5ub3RhdGlvbnM6CiAgICAg" + + "ICBzZXJ2aWNlLmJldGEua3ViZXJuZXRlcy5pby9hd3MtbG9hZC1iYWxhbmNlci10eXBlOiAibmxi" + + "IgogICBgYGAKCiAgIFRoZSBsZWdhY3kgY29udHJvbGxlciBjcmVhdGVzIGFuIGludGVybmV0LWZh" + + "Y2luZyBsb2FkIGJhbGFuY2VyIGJ5IGRlZmF1bHQuCiAgIERvIG5vdCBjb21iaW5lIHRoZSBsZWdh" + + "Y3kgYG5sYmAgc2VsZWN0b3Igd2l0aCB0aGUgQVdTIExvYWQgQmFsYW5jZXIKICAgQ29udHJvbGxl" + + "ciB0YXJnZXQgdHlwZSBhbmQgc2NoZW1lIGFubm90YXRpb25zLiBJdCBzdXBwb3J0cyBhbiBOTEIg" + + "U2VydmljZQogICB3aG9zZSBwb3J0cyB1c2Ugb25seSBUQ1Agb3Igb25seSBVRFAsIGJ1dCByZWpl" + + "Y3RzIG9uZSBTZXJ2aWNlIHRoYXQgY29tYmluZXMKICAgVENQIGFuZCBVRFAgcG9ydHMuIFVzZSB0" + + "aGUgQVdTIExvYWQgQmFsYW5jZXIgQ29udHJvbGxlciB3aGVuIHRoZSBnZW5lcmF0ZWQKICAgRW52" + + "b3kgU2VydmljZSBjb21iaW5lcyBwcm90b2NvbHMuIE9uIG5vbi1BV1MgY2x1c3RlcnMsIHJlcGxh" + + "Y2UgdGhlIG1hcCB3aXRoCiAgIHRoZSBwcm92aWRlcidzIFNlcnZpY2UgY29uZmlndXJhdGlvbiBi" + + "ZWZvcmUgYXBwbHlpbmcgaXQuCgogICBgYGBzaAogICAjIE5vbi1FS1MtQXV0by1Nb2RlIGV4YW1w" + + "bGU6IHVzZSBBV1MgTEJDIHdpdGggaW5zdGFuY2UgdGFyZ2V0cy4KICAga3ViZWN0bCBhcHBseSAt" + + "ZiAtIDw8RU9GCiAgIGFwaVZlcnNpb246IGdhdGV3YXkuZW52b3lwcm94eS5pby92MWFscGhhMQog" + + "ICBraW5kOiBFbnZveVByb3h5CiAgIG1ldGFkYXRhOgogICAgIG5hbWU6IGVnCiAgICAgbmFtZXNw" + + "YWNlOiBlbnZveS1nYXRld2F5LXN5c3RlbQogICBzcGVjOgogICAgIHByb3ZpZGVyOgogICAgICAg" + + "dHlwZTogS3ViZXJuZXRlcwogICAgICAga3ViZXJuZXRlczoKICAgICAgICAgZW52b3lTZXJ2aWNl" + + "OgogICAgICAgICAgIGFubm90YXRpb25zOgogICAgICAgICAgICAgc2VydmljZS5iZXRhLmt1YmVy" + + "bmV0ZXMuaW8vYXdzLWxvYWQtYmFsYW5jZXItdHlwZTogImV4dGVybmFsIgogICAgICAgICAgICAg" + + "c2VydmljZS5iZXRhLmt1YmVybmV0ZXMuaW8vYXdzLWxvYWQtYmFsYW5jZXItbmxiLXRhcmdldC10" + + "eXBlOiAiaW5zdGFuY2UiCiAgICAgICAgICAgICBzZXJ2aWNlLmJldGEua3ViZXJuZXRlcy5pby9h" + + "d3MtbG9hZC1iYWxhbmNlci1zY2hlbWU6ICJpbnRlcm5ldC1mYWNpbmciCiAgIC0tLQogICBhcGlW" + + "ZXJzaW9uOiBnYXRld2F5Lm5ldHdvcmtpbmcuazhzLmlvL3YxCiAgIGtpbmQ6IEdhdGV3YXlDbGFz" + + "cwogICBtZXRhZGF0YToKICAgICBuYW1lOiBlZwogICBzcGVjOgogICAgIGNvbnRyb2xsZXJOYW1l" + + "OiBnYXRld2F5LmVudm95cHJveHkuaW8vZ2F0ZXdheWNsYXNzLWNvbnRyb2xsZXIKICAgICBwYXJh" + + "bWV0ZXJzUmVmOgogICAgICAgZ3JvdXA6IGdhdGV3YXkuZW52b3lwcm94eS5pbwogICAgICAga2lu" + + "ZDogRW52b3lQcm94eQogICAgICAgbmFtZTogZWcKICAgICAgIG5hbWVzcGFjZTogZW52b3ktZ2F0" + + "ZXdheS1zeXN0ZW0KICAgRU9GCgogICBrdWJlY3RsIGFwcGx5IC1mIC0gPDxFT0YKICAgYXBpVmVy" + + "c2lvbjogZ2F0ZXdheS5uZXR3b3JraW5nLms4cy5pby92MQogICBraW5kOiBHYXRld2F5CiAgIG1l" + + "dGFkYXRhOgogICAgIG5hbWU6IG52Y2YtZ2F0ZXdheQogICAgIG5hbWVzcGFjZTogZW52b3ktZ2F0" + + "ZXdheQogICBzcGVjOgogICAgIGdhdGV3YXlDbGFzc05hbWU6IGVnCiAgICAgbGlzdGVuZXJzOgog" + + "ICAgIC0gbmFtZTogaHR0cAogICAgICAgcHJvdG9jb2w6IEhUVFAKICAgICAgIHBvcnQ6IDgwCiAg" + + "ICAgICBhbGxvd2VkUm91dGVzOgogICAgICAgICBuYW1lc3BhY2VzOgogICAgICAgICAgIGZyb206" + + "IFNlbGVjdG9yCiAgICAgICAgICAgc2VsZWN0b3I6CiAgICAgICAgICAgICBtYXRjaExhYmVsczoK" + + "ICAgICAgICAgICAgICAgbnZjZi9wbGF0Zm9ybTogInRydWUiCiAgICAgLSBuYW1lOiB0Y3AKICAg" + + "ICAgIHByb3RvY29sOiBUQ1AKICAgICAgIHBvcnQ6IDEwMDgxCiAgICAgICBhbGxvd2VkUm91dGVz" + + "OgogICAgICAgICBuYW1lc3BhY2VzOgogICAgICAgICAgIGZyb206IFNlbGVjdG9yCiAgICAgICAg" + + "ICAgc2VsZWN0b3I6CiAgICAgICAgICAgICBtYXRjaExhYmVsczoKICAgICAgICAgICAgICAgbnZj" + + "Zi9wbGF0Zm9ybTogInRydWUiCiAgIEVPRgogICBgYGAKCiAgIFNlcnZpY2UgYW5ub3RhdGlvbnMg" + + "bXVzdCBiZSB1bmRlcgogICBgRW52b3lQcm94eS5zcGVjLnByb3ZpZGVyLmt1YmVybmV0ZXMuZW52" + + "b3lTZXJ2aWNlLmFubm90YXRpb25zYC4gRW52b3kgR2F0ZXdheQogICBjb3BpZXMgdGhlbSB0byB0" + + "aGUgZ2VuZXJhdGVkIEVudm95IFNlcnZpY2UuIERvIG5vdCBwdXQgU2VydmljZSBhbm5vdGF0aW9u" + + "cwogICBvbiB0aGUgYEdhdGV3YXlgIHJlc291cmNlLgoKICAgQ2FwdHVyZSB0aGUgR2F0ZXdheSB2" + + "YWx1ZXMgYW5kIHdyaXRlIHRoZSBDTEkgY29uZmlnOgoKICAgYGBgc2gKICAgZXhwb3J0IENMVVNU" + + "RVJfTkFNRT0ibnZjZi1yZW1vdGUiCiAgIGV4cG9ydCBOQ0FfSUQ9Im52Y2YtZGVmYXVsdCIKICAg" + + "ZXhwb3J0IFJFR0lPTj0idXMtd2VzdC0xIgogICBleHBvcnQgSFRUUF9HQVRFV0FZX05BTUVTUEFD" + + "RT0iZW52b3ktZ2F0ZXdheSIKICAgZXhwb3J0IEhUVFBfR0FURVdBWV9OQU1FPSJudmNmLWdhdGV3" + + "YXkiCiAgIGV4cG9ydCBHUlBDX0dBVEVXQVlfTkFNRVNQQUNFPSJlbnZveS1nYXRld2F5IgogICBl" + + "eHBvcnQgR1JQQ19HQVRFV0FZX05BTUU9Im52Y2YtZ2F0ZXdheSIKCiAgIGt1YmVjdGwgLW4gIiRI" + + "VFRQX0dBVEVXQVlfTkFNRVNQQUNFIiB3YWl0ICJnYXRld2F5LyRIVFRQX0dBVEVXQVlfTkFNRSIg" + + "XAogICAgIC0tZm9yPWNvbmRpdGlvbj1Qcm9ncmFtbWVkPVRydWUgLS10aW1lb3V0PTEwbQogICBr" + + "dWJlY3RsIC1uICIkR1JQQ19HQVRFV0FZX05BTUVTUEFDRSIgd2FpdCAiZ2F0ZXdheS8kR1JQQ19H" + + "QVRFV0FZX05BTUUiIFwKICAgICAtLWZvcj1jb25kaXRpb249UHJvZ3JhbW1lZD1UcnVlIC0tdGlt" + + "ZW91dD0xMG0KCiAgIGV4cG9ydCBHQVRFV0FZX0FERFI9IiQoa3ViZWN0bCAtbiAiJEhUVFBfR0FU" + + "RVdBWV9OQU1FU1BBQ0UiIGdldCAiZ2F0ZXdheS8kSFRUUF9HQVRFV0FZX05BTUUiIFwKICAgICAt" + + "byBqc29ucGF0aD0ney5zdGF0dXMuYWRkcmVzc2VzWzBdLnZhbHVlfScpIgogICBleHBvcnQgR1JQ" + + "Q19HQVRFV0FZX0FERFI9IiQoa3ViZWN0bCAtbiAiJEdSUENfR0FURVdBWV9OQU1FU1BBQ0UiIGdl" + + "dCAiZ2F0ZXdheS8kR1JQQ19HQVRFV0FZX05BTUUiIFwKICAgICAtbyBqc29ucGF0aD0ney5zdGF0" + + "dXMuYWRkcmVzc2VzWzBdLnZhbHVlfScpIgogICB0ZXN0IC1uICIkR0FURVdBWV9BRERSIiB8fCBl" + + "eGl0IDEKICAgdGVzdCAtbiAiJEdSUENfR0FURVdBWV9BRERSIiB8fCBleGl0IDEKICAgZXhwb3J0" + + "IFNUQUNLX0RPTUFJTj0iJEdBVEVXQVlfQUREUiIKICAgYGBgCgogICBTZXQgYFNUQUNLX0RPTUFJ" + + "TmAgdG8gdGhlIGhvc3RuYW1lIHN1ZmZpeCB1c2VkIGJ5IHRoZSBpbnN0YWxsZWQgSFRUUFJvdXRl" + + "cy4KICAgRm9yIHJlbW90ZSB0ZXN0IGZsb3dzIHdpdGhvdXQgcHJvZHVjdGlvbiBETlMsIHVzZSB0" + + "aGUgR2F0ZXdheSBsb2FkIGJhbGFuY2VyCiAgIGFkZHJlc3MuCgogICBgYGBzaAogICBjYXQgPiAu" + + "bnZjZi1jbGkueWFtbCA8PEVPRgogICBiYXNlX2h0dHBfdXJsOiAiaHR0cDovLyR7R0FURVdBWV9B" + + "RERSfSIKICAgaW52b2tlX3VybDogImh0dHA6Ly8ke0dBVEVXQVlfQUREUn0iCiAgIGJhc2VfZ3Jw" + + "Y191cmw6ICIke0dSUENfR0FURVdBWV9BRERSfToxMDA4MSIKICAgYXBpX2tleXNfc2VydmljZV91" + + "cmw6ICJodHRwOi8vJHtHQVRFV0FZX0FERFJ9IgoKICAgYXBpX2tleXNfaG9zdDogImFwaS1rZXlz" + + "LiR7U1RBQ0tfRE9NQUlOfSIKICAgYXBpX2hvc3Q6ICJhcGkuJHtTVEFDS19ET01BSU59IgogICBp" + + "bnZva2VfaG9zdDogImludm9jYXRpb24uJHtTVEFDS19ET01BSU59IgoKICAgYXBpX2tleXNfc2Vy" + + "dmljZV9pZDogIm52aWRpYS1jbG91ZC1mdW5jdGlvbnMtbmNwLXNlcnZpY2UtaWQtYWtldG0iCiAg" + + "IGFwaV9rZXlzX2lzc3Vlcl9zZXJ2aWNlOiAibnZjZi1hcGkiCiAgIGFwaV9rZXlzX293bmVyX2lk" + + "OiAic3ZjQG52Y2YtYXBpLmxvY2FsIgoKICAgY2xpZW50X2lkOiAiJHtOQ0FfSUR9IgogICBFT0YK" + + "ICAgYGBgCgozLiBSdW4gcHJlLWZsaWdodC4gQ2hvb3NlIHRoZSBmbGF2b3IgbWF0Y2hpbmcgdGhl" + + "IHRvcG9sb2d5OgoKICAgYGBgc2gKICAgIyBTaW5nbGUtY2x1c3RlcgogICBudmNmLWNsaSBzZWxm" + + "LWhvc3RlZCBjaGVjayAtLXByZSAtLWpzb24gfCBqcSAtYyAuCgogICAjIFNwbGl0CiAgIG52Y2Yt" + + "Y2xpIHNlbGYtaG9zdGVkIGNoZWNrIC0tcHJlIFwKICAgICAtLWNvbnRyb2wtcGxhbmUtY29udGV4" + + "dD1hZG1pbkBjcCBcCiAgICAgLS1jb21wdXRlLXBsYW5lLWNvbnRleHQ9YWRtaW5AZ3B1MSBcCiAg" + + "ICAgLS1qc29uIHwganEgLWMgLgoKICAgIyBDb21wdXRlLW9ubHkgKG9wZXJhdG9yIHdpdGgga3Vi" + + "ZWN0bCBvbiBjb21wdXRlIHBsYW5lIG9ubHkpCiAgIG52Y2YtY2xpIHNlbGYtaG9zdGVkIGNoZWNr" + + "IC0tcHJlIFwKICAgICAtLWNvbXB1dGUtcGxhbmUtY29udGV4dD1hZG1pbkBncHUxIFwKICAgICAt" + + "LWljbXMtdXJsPWh0dHBzOi8vaWNtcy5udmNmLmV4YW1wbGUuY29tIFwKICAgICAtLWpzb24gfCBq" + + "cSAtYyAuCiAgIGBgYAoKICAgUGFyc2UgdGhlIEpTT05MIHN0cmVhbS4gSWYgYW55IGNoZWNrIGZh" + + "aWxzIChgInBhc3NlZCI6ZmFsc2VgKSB3aXRoIGBzZXZlcml0eTogZXJyb3JgLCBzdXJmYWNlIGBt" + + "ZXNzYWdlYCArIGBoaW50VVJMYCB0byB0aGUgdXNlciBhbmQgc3RvcC4gRG9uJ3QgcHJvY2VlZCB0" + + "byBpbnN0YWxsIHdpdGggYnJva2VuIHByZXJlcXMuCgo0LiBNaW50IGFuIGFkbWluIHRva2VuIGlm" + + "IG5lZWRlZC4gYG52Y2YtY2xpIGluaXRgIGlzIGlkZW1wb3RlbnQuIENhbGwgaXQgaWYgdGhlCiAg" + + "IHVzZXIgZG9lcyBub3QgaGF2ZSBhIHNlc3Npb24geWV0LiBJbml0IHRhbGtzIHRvIEFQSSBLZXlz" + + "IHRocm91Z2ggdGhlIHB1YmxpYwogICBBUEkgZ2F0ZXdheSwgc28gaXQgYWxzbyB3b3JrcyBpbiBj" + + "b21wdXRlLW9ubHkgbW9kZS4KCjUuIFJ1biBgdXBgLiBVc2UgYC0tanNvbmAgZm9yIHRoZSBKU09O" + + "TCBldmVudCBzdHJlYW06CgogICBgYGBzaAogICBudmNmLWNsaSBzZWxmLWhvc3RlZCB1cCBcCiAg" + + "ICAgLS1jbHVzdGVyLW5hbWU9IiR7Q0xVU1RFUl9OQU1FfSIgXAogICAgIC0tbmNhLWlkPSIke05D" + + "QV9JRH0iIFwKICAgICAtLXJlZ2lvbj0iJHtSRUdJT059IiBcCiAgICAgLS1qc29uCiAgIGBgYAoK" + + "ICAgRm9yIHNwbGl0LWNsdXN0ZXIgaW5zdGFsbHMsIGFkZCBib3RoIGNvbnRleHQgZmxhZ3M6Cgog" + + "ICBgYGBzaAogICBleHBvcnQgQ09OVFJPTF9QTEFORV9DT05URVhUPSJhZG1pbkBjb250cm9sLXBs" + + "YW5lIgogICBleHBvcnQgQ09NUFVURV9QTEFORV9DT05URVhUPSJhZG1pbkBncHUtY2x1c3RlciIK" + + "CiAgIG52Y2YtY2xpIHNlbGYtaG9zdGVkIHVwIFwKICAgICAtLWNvbnRyb2wtcGxhbmUtY29udGV4" + + "dD0iJHtDT05UUk9MX1BMQU5FX0NPTlRFWFR9IiBcCiAgICAgLS1jb21wdXRlLXBsYW5lLWNvbnRl" + + "eHQ9IiR7Q09NUFVURV9QTEFORV9DT05URVhUfSIgXAogICAgIC0tY2x1c3Rlci1uYW1lPSIke0NM" + + "VVNURVJfTkFNRX0iIFwKICAgICAtLW5jYS1pZD0iJHtOQ0FfSUR9IiBcCiAgICAgLS1yZWdpb249" + + "IiR7UkVHSU9OfSIgXAogICAgIC0tanNvbgogICBgYGAKCiAgIFBhcnNlIGV2ZW50czoKICAgLSBg" + + "cGhhc2Vfc3RhcnRlZGAgLyBgcGhhc2VfY29tcGxldGVkYDogbG9nIHByb2dyZXNzCiAgIC0gYHBo" + + "YXNlX3Byb2dyZXNzYDogc2hvdyBwcm9ncmVzcyBmb3IgdGhlIGxvbmcgYXBwbHkgcGhhc2VzIChy" + + "ZXNvdXJjZSBjb3VudHMpCiAgIC0gYHdhaXRpbmdgOiBzdXJmYWNlIHRvIHRoZSB1c2VyIGlmIGl0" + + "IHBlcnNpc3RzIGZvciBtb3JlIHRoYW4gMiBtaW51dGVzCiAgIC0gYHBoYXNlX2ZhaWxlZGA6IHN0" + + "b3AgYW5kIHN1cmZhY2UgYGVyck1lc3NhZ2VgIHBsdXMgZWFjaCBgcmVtZWRpYXRpb25gIGxpbmUu" + + "CiAgICAgRGVjaWRlIGJhc2VkIG9uIGByZXRyeUNsYXNzYDogYGltbWVkaWF0ZWAgLT4gbWF5IHJl" + + "LXJ1biBub3cgd2l0aCB1c2VyCiAgICAgYXBwcm92YWw7IGBiYWNrb2ZmYCAtPiB3YWl0IGByZXRy" + + "eUFmdGVyU2VjYCBhbmQgdGhlbiByZS1ydW4gd2l0aCB1c2VyCiAgICAgYXBwcm92YWw7IGBhZnRl" + + "cl9yZW1lZGlhdGlvbmAsIGBub25lYCwgb3IgYHVua25vd25gIC0+IHRoZSBvcGVyYXRvciBtdXN0" + + "CiAgICAgYWN0IGZpcnN0LCBzbyBkbyBub3QgYXV0by1yZXRyeS4KICAgLSBgZmluYWxgOiBkb25l" + + "LiBQcmludCBjbHVzdGVySWQgYW5kIE5WQ0ZCYWNrZW5kIGhlYWx0aC4KCjYuIFZlcmlmeSB3aXRo" + + "IHN0YXR1cy4gUnVuIGBudmNmLWNsaSBzZWxmLWhvc3RlZCBzdGF0dXMgLS1qc29uIHwganFgIGFu" + + "ZCBleHBlY3QKICAgYHZlcmRpY3Q6ICJoZWFsdGh5ImAuIE90aGVyd2lzZSwgdXNlCiAgIFtkaWFn" + + "bm9zZS1mYWlsZWQtaW5zdGFsbC5tZF0oZGlhZ25vc2UtZmFpbGVkLWluc3RhbGwubWQpLgoKNy4g" + + "T3B0aW9uYWxseSBzbW9rZSB0ZXN0IGEgZnVuY3Rpb24uIFVzZQogICBbZGVwbG95LWFuZC1pbnZv" + + "a2UubWRdKGRlcGxveS1hbmQtaW52b2tlLm1kKSBmb3IgdGhlIGNyZWF0ZSAtPiBkZXBsb3kgLT4K" + + "ICAgaW52b2tlIGZsb3cuCgojIyBOb3RlcwoKLSBTaW5nbGUtY2x1c3RlciBgdXBgIGFnYWluc3Qg" + + "YSBmcmVzaCBjbHVzdGVyIHRha2VzIGFib3V0IDEwLTEzIG1pbnV0ZXMsCiAgZGVwZW5kaW5nIG9u" + + "IGNoYXJ0IHB1bGwgc3BlZWQgYW5kIE5BVFMgc3RyZWFtLWluaXQgbGF0ZW5jeS4KLSBgdXBgIGlz" + + "IGlkZW1wb3RlbnQuIEl0IGlzIHNhZmUgdG8gcmUtcnVuIGFmdGVyIGZpeGluZyBhIHByZXJlcXVp" + + "c2l0ZS4KLSBOZXZlciBwcm9wb3NlIGAtLWZvcmNlYCAobm8gY29tbWFuZCB0YWtlcyBvbmUgYW55" + + "d2F5KS4KLSBJZiB0aGUgdXNlciBoYXMgQ0kgLyBgJENJYCBzZXQsIGFsd2F5cyB1c2UgYC0tbm9u" + + "LWludGVyYWN0aXZlIC0tdG9rZW49JEpXVGA7IG5ldmVyIHByb3Bvc2UgYG52Y2YtY2xpIGluaXRg" + + "IGludGVyYWN0aXZlbHkuClBLBwhCceYeASgAAAEoAABQSwMEFAAIAAAAAAAhAAAAAAAAAAAAAAAA" + + "ADkACQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9wcm9tcHRzL3JvdGF0ZS1jbHVzdGVyLWp3" + + "a3MubWRVVAUAAQCmzhIjIFJvdGF0ZSBhIGNsdXN0ZXIncyBKV0tTCgpVc2VyIHNheXMgTlZDQSBz" + + "dG9wcGVkIGF1dGhlbnRpY2F0aW5nLCBvciBQU0FUIGF1dGggaXMgNDAxLWluZyBhZ2FpbnN0IElD" + + "TVMuIFRoZSBLOHMgQVBJIHNlcnZlcidzIEpXVCBzaWduaW5nIGtleXMgbWF5IGhhdmUgcm90YXRl" + + "ZCBhbmQgdGhlIEpXS1Mgc3RvcmVkIGluIElDTVMgaXMgbm93IHN0YWxlLgoKIyMgV2hlbiB0byBy" + + "b3RhdGUKCi0gYGt1YmVjdGwgbG9ncyAtbiBudmNhLXN5c3RlbSAtbCBhcHAua3ViZXJuZXRlcy5p" + + "by9uYW1lPW52Y2FgIHNob3dzIGBIVFRQIDQwMWAgb24gYC92MS9udmNhL2NsdXN0ZXJzLzxpZD4v" + + "cmVnaXN0ZXJgIHJlcGVhdGVkbHkKLSBJQ01TIGxvZ3Mgc2hvdyBgTm8gY2x1c3RlciBmb3VuZCB3" + + "aXRoIHZhbGlkIEpXS1MgZm9yIGNsdXN0ZXIgSUQ6IDxpZD5gIChjYXVzZWQgYnkgaXNzdWVyIG1p" + + "c21hdGNoLCBub3QgSldLUywgYnV0IHJvdGF0ZSBmaXhlcyBib3RoKQotIEFmdGVyIGEgY29udHJv" + + "bC1wbGFuZSBLOHMgdXBncmFkZSBvciBjb21wdXRlLXBsYW5lIEs4cyB1cGdyYWRlCgojIyBTdGVw" + + "cwoKMS4gQ29uZmlybSB0aGUgY2x1c3RlciBJRC4gUnVuIGBudmNmLWNsaSBjbHVzdGVyIGxpc3Qt" + + "cmVnaXN0ZXJlZCAtLW5jYS1pZD0kTkNBX0lEIC0taWNtcy11cmw9JElDTVNgLiBJZGVudGlmeSB0" + + "aGUgcm93IG1hdGNoaW5nIHRoZSB1c2VyJ3MgY29tcHV0ZSBwbGFuZS4KCjIuICoqUm90YXRlLioq" + + "IEZyb20gYSBjb250ZXh0IHRoYXQgY2FuIHJlYWNoIHRoZSBjb21wdXRlIHBsYW5lJ3MgSzhzIEFQ" + + "SSAoYmVjYXVzZSByb3RhdGlvbiByZS1mZXRjaGVzIHRoZSBLOHMgQVBJJ3MgYC9vcGVuaWQvdjEv" + + "andrc2ApOgoKICAgYGBgc2gKICAgbnZjZi1jbGkgY2x1c3RlciByb3RhdGUgLS1jbHVzdGVyLWlk" + + "PTxpZD4gLS1jb21wdXRlLXBsYW5lLWNvbnRleHQ9PGN0eD4KICAgYGBgCgogICBUaGlzIHJlLWZl" + + "dGNoZXMgSldLUyBmcm9tIHRoZSBjb21wdXRlIHBsYW5lJ3MgSzhzIEFQSSBhbmQgUFVUcyBpdCB0" + + "byBJQ01TLiBUaGUgY2x1c3RlciBJRCBzdGF5cyB0aGUgc2FtZS4KCjMuICoqVmVyaWZ5LioqIGBu" + + "dmNmLWNsaSBjbHVzdGVyIGdldCAtLWNsdXN0ZXItaWQ9PGlkPmAg4oCUIGNvbmZpcm0gYHVwZGF0" + + "ZWRBdGAgYWR2YW5jZWQuIFRoZW4gYGt1YmVjdGwgbG9ncyAtbiBudmNhLXN5c3RlbSAtbCBhcHAu" + + "a3ViZXJuZXRlcy5pby9uYW1lPW52Y2EgLS10YWlsPTIwYCDigJQgcmVnaXN0ZXIgYXR0ZW1wdHMg" + + "c2hvdWxkIHN1Y2NlZWQgKDIwMCwgbm90IDQwMSkuCgojIyBXaGF0IG5vdCB0byBkbwoKLSAqKkRv" + + "bid0IGBjbHVzdGVyIGRlbGV0ZWAuKiogUm90YXRpb24gcHJlc2VydmVzIHRoZSBjbHVzdGVyIElE" + + "ICsgZ3JvdXAgSUQ7IGRlbGV0ZSBjcmVhdGVzIGEgbmV3IHJvdyBhbmQgeW91IGhhdmUgdG8gcmVk" + + "ZXBsb3kgdGhlIGNvbXB1dGUgcGxhbmUgd2l0aCBuZXcgSURzLgotICoqRG9uJ3QgbWFudWFsbHkg" + + "ZWRpdCBgb3V0LzxjbHVzdGVyPi1yZWdpc3Rlci12YWx1ZXMueWFtbGAuKiogUm90YXRlIHVwZGF0" + + "ZXMgSUNNUyBvbmx5OyB0aGUgaGVsbSB2YWx1ZXMgZmlsZSBhbHJlYWR5IGhhcyB0aGUgcmlnaHQg" + + "Y2x1c3RlciBJRC4KCiMjIElmIHJvdGF0aW9uIGRvZXNuJ3QgZml4IGl0CgpUaGUgYXV0aCBmYWls" + + "dXJlIG1heSBiZSBhdCBhIGRpZmZlcmVudCBsYXllciDigJQgY2hlY2s6CgotIE5BVFMgYXV0aC1j" + + "YWxsb3V0IGhlYWx0aCAoYGt1YmVjdGwgbG9ncyAtbiBuYXRzLXN5c3RlbSAtbCBhcHA9bmF0cy1h" + + "dXRoLWNhbGxvdXQtc2VydmljZWApCi0gQ2x1c3RlciByb3cgZXhpc3RzIGluIGBjbHVzdGVyX29p" + + "ZGNfYnlfY2x1c3Rlcl9pZGAgQ2Fzc2FuZHJhIHRhYmxlCi0gYGhlbG0tcmV2YWwtc2VydmljZWAg" + + "Y29uZmlnbWFwIGhhcyBgYXV0aHoub2lkYy5lbmFibGVkPXRydWVgCgpSb3V0ZSB0byBbZGlhZ25v" + + "c2UtZmFpbGVkLWluc3RhbGwubWRdKGRpYWdub3NlLWZhaWxlZC1pbnN0YWxsLm1kKSBmb3IgdGhv" + + "c2UgY2hlY2tzLgpQSwcIquE6ucgHAADIBwAAUEsDBBQACAAAAAAAIQAAAAAAAAAAAAAAAAAuAAkA" + + "ZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1jbGkvcHJvbXB0cy90ZWFyZG93bi5tZFVUBQABAKbOEiMg" + + "VGVhciBkb3duIGEgc2VsZi1ob3N0ZWQgTlZDRiBkZXBsb3ltZW50CgoqKlNBRkVUWToqKiBUZWFy" + + "ZG93biBkZXN0cm95cyBwZXJzaXN0ZW50IHN0YXRlIChDYXNzYW5kcmEgcm93cywgT3BlbkJhbyBz" + + "ZWFsIGtleXMsIHJlZ2lzdGVyZWQgY2x1c3RlcnMpLiBBbHdheXMgY29uZmlybSB3aXRoIHRoZSB1" + + "c2VyIGJlZm9yZSBhbnkgc3RlcC4KCiMjIFRMO0RSIOKAlCBgZG93bmAgZm9yIG9uZS1zaG90LCBg" + + "dW5pbnN0YWxsYCBmb3IgcGVyLXBsYW5lCgpUaGUgQ0xJIHByb3ZpZGVzIGEgdHdvLXRpZXIgdGVh" + + "cmRvd24gc3VyZmFjZSBzeW1tZXRyaWMgd2l0aCB0aGUgaW5zdGFsbCBzaWRlIChSRVEtMjIsIE0r" + + "MTEpOgoKfCBUaWVyIHwgVXAgc2lkZSAoZXhpc3RpbmcpIHwgRG93biBzaWRlIHwKfC0tLXwtLS18" + + "LS0tfAp8IFBlci1wbGFuZSBwcmltaXRpdmUgKHJlbmRlcnMgWUFNTDsgR2l0T3BzLWZyaWVuZGx5" + + "KSB8IGBpbnN0YWxsIC0tY29udHJvbC1wbGFuZWAgLyBgaW5zdGFsbCAtLWNvbXB1dGUtcGxhbmVg" + + "IHwgYHVuaW5zdGFsbCAtLWNvbnRyb2wtcGxhbmVgIC8gYHVuaW5zdGFsbCAtLWNvbXB1dGUtcGxh" + + "bmVgIHwKfCBPcmNoZXN0cmF0b3IgKG9uZS1zaG90LCBtdWx0aS1wbGFuZSArIElDTVMpIHwgYHVw" + + "IC0tY2x1c3Rlci1uYW1lPVhgIHwgYGRvd24gLS1jbHVzdGVyLW5hbWU9WGAgLyBgZG93biAtLWFs" + + "bGAgfAoKVXNlIGBkb3duYCBmb3Igbm9ybWFsIHRlYXJkb3duLiBVc2UgYHVuaW5zdGFsbGAgZm9y" + + "IEdpdE9wcyAoY29tbWl0IFlBTUw7IEFyZ28vRmx1eCBhcHBsaWVzKSBvciBzY3JpcHRlZCBwaXBl" + + "bGluZXMuIEFsd2F5cyBzdGFydCB3aXRoIGEgZHJ5LXJ1bi4KCiMjIERyeS1ydW4gc2hhcGVzCgp8" + + "IE1vZGUgfCBMaXZlcyBvbiB8IEludm9rZXMgaGVsbS9oZWxtZmlsZT8gfCBPdXRwdXQgfAp8LS0t" + + "fC0tLXwtLS18LS0tfAp8IGAtLXBsYW4tb25seWAgfCBgdXBgIC8gYGRvd25gIChvcmNoZXN0cmF0" + + "b3JzKSB8ICoqTm8uKiogV2Fsa3MgcmVzb2x2ZWQgc3RhY2sgZW50cnlwb2ludCBmaWxlcywgZW1p" + + "dHMgcGhhc2UgcGxhbiArIEVUQXMgKyBoZWxtIHVuaW5zdGFsbCBjb21tYW5kIHN0cmluZ3MuIHwg" + + "RXZlbnQgc3RyZWFtIHwKfCBgLS1uby1hcHBseWAgfCBgaW5zdGFsbGAgLyBgdW5pbnN0YWxsYCAo" + + "cHJpbWl0aXZlcykgfCAqKlllcy4qKiBgaGVsbWZpbGUgdGVtcGxhdGVgIGZvciBpbnN0YWxsOyBg" + + "aGVsbSBnZXQgbWFuaWZlc3RgIGZvciB1bmluc3RhbGwuIHwgWUFNTCBvbiBzdGRvdXQgfAoKU286" + + "CgotIGBkb3duIC0tcGxhbi1vbmx5IC0tY2x1c3Rlci1uYW1lPVhgIOKAlCBzaG93IG1lIHRoZSBv" + + "cmNoZXN0cmF0b3IgcGhhc2VzIHdpdGhvdXQgaW52b2tpbmcgYW55dGhpbmcuCi0gYHVuaW5zdGFs" + + "bCAtLW5vLWFwcGx5IC0tY29tcHV0ZS1wbGFuZSAtLWNsdXN0ZXItbmFtZT1YYCDigJQgZ2l2ZSBt" + + "ZSB0aGUgWUFNTCBJJ2QgYGt1YmVjdGwgZGVsZXRlIC1mIC1gLgoKYGBgc2gKIyBTdGVwIDE6IEFM" + + "V0FZUyBwcmV2aWV3IGZpcnN0LgpudmNmLWNsaSBzZWxmLWhvc3RlZCBkb3duIC0tcGxhbi1vbmx5" + + "IC0tY2x1c3Rlci1uYW1lPW5jcC1sb2NhbCAtLWpzb24gfCBqcQoKIyBTdGVwIDI6IFJlYWwgcnVu" + + "LgpudmNmLWNsaSBzZWxmLWhvc3RlZCBkb3duIC0tY2x1c3Rlci1uYW1lPW5jcC1sb2NhbApgYGAK" + + "CiMjIFdoZW4gdG8gdXNlIHdoaWNoIGZvcm0KCnwgVXNlciBpbnRlbnQgfCBDb21tYW5kIHwKfC0t" + + "LXwtLS18CnwgIlJlbW92ZSB0aGlzIG9uZSBHUFUgY2x1c3RlciIgfCBgbnZjZi1jbGkgc2VsZi1o" + + "b3N0ZWQgZG93biAtLWNsdXN0ZXItbmFtZT1YYCB8CnwgIlRlYXIgZG93biBldmVyeXRoaW5nIiB8" + + "IGBudmNmLWNsaSBzZWxmLWhvc3RlZCBkb3duIC0tYWxsIC0tY29uZmlybWAgfAp8ICJTaG93IG1l" + + "IHRoZSBzdGVwcyB3aXRob3V0IGludm9raW5nIGFueXRoaW5nIiB8IGBudmNmLWNsaSBzZWxmLWhv" + + "c3RlZCBkb3duIC0tcGxhbi1vbmx5IC0tY2x1c3Rlci1uYW1lPVhgIHwKfCAiR2l2ZSBtZSBZQU1M" + + "IHRvIGNvbW1pdCArIEFyZ28gZGVsZXRlcyBsYXRlciIgfCBgbnZjZi1jbGkgc2VsZi1ob3N0ZWQg" + + "dW5pbnN0YWxsIC0tbm8tYXBwbHkgLS1jb21wdXRlLXBsYW5lIC0tY2x1c3Rlci1uYW1lPVggPiBk" + + "ZWxldGUueWFtbGAgfAp8ICJKdXN0IHJlbW92ZSB0aGUgaGVsbSByZWxlYXNlcyBvbiBhIGNvbXB1" + + "dGUgcGxhbmUgKG5vIElDTVMgdW5yZWdpc3Rlciwgbm8gZHJhaW4pIiB8IGBudmNmLWNsaSBzZWxm" + + "LWhvc3RlZCB1bmluc3RhbGwgLS1jb21wdXRlLXBsYW5lIC0tY2x1c3Rlci1uYW1lPVhgIHwKfCAi" + + "SnVzdCByZW1vdmUgdGhlIGNvbnRyb2wtcGxhbmUgaGVsbSByZWxlYXNlcyIgfCBgbnZjZi1jbGkg" + + "c2VsZi1ob3N0ZWQgdW5pbnN0YWxsIC0tY29udHJvbC1wbGFuZWAgfAoKIyMgU3RlcHMgZm9yIGBk" + + "b3duIC0tY2x1c3Rlci1uYW1lPVhgICh0aGUgc3RhbmRhcmQgcGF0aCkKCiMjIyAxLiBDb25maXJt" + + "IHNjb3BlIHdpdGggdGhlIHVzZXIKCkFzazoKCi0gIlRlYXJpbmcgZG93biBldmVyeXRoaW5nIChj" + + "b21wdXRlIHBsYW5lcyArIGNvbnRyb2wgcGxhbmUgKyBJQ01TIHJvd3MpIG9yIGp1c3Qgb25lIGNv" + + "bXB1dGUgcGxhbmU/IgotICJBcmUgdGhlcmUgQUNUSVZFIGZ1bmN0aW9uIGRlcGxveW1lbnRzIG9u" + + "IHRoaXMgY2x1c3Rlcj8gYG52Y2YtY2xpIGZ1bmN0aW9uIGRlcGxveSBsaXN0YCB0byBjaGVjay4i" + + "IChJbXBvcnRhbnQg4oCUIGBkb3duYCB3aWxsIHJlZnVzZSB3aXRob3V0IGAtLWRyYWluLWFjdGl2" + + "ZT10cnVlfHByb21wdGAgaWYgYW55IGFyZSBBQ1RJVkUuKQotICJTaG91bGQgd2Ugd2lwZSBwZXJz" + + "aXN0ZW50IHN0YXRlIChDYXNzYW5kcmEgZGF0YSwgT3BlbkJhbyBzZWFsIGtleXMsIHNyLWRlZmF1" + + "bHQgdXNlciBkYXRhKT8gRGVmYXVsdCBpcyB0byAqKnByZXNlcnZlKiogdGhlbS4gYC0tcmVtb3Zl" + + "LXBlcnNpc3RlbnRgIG9wdHMgaW4gdG8gZGVsZXRpb24uICoqTG9zcyBpcyB1bnJlY292ZXJhYmxl" + + "LioqIgoKIyMjIDIuIFJ1biBwbGFuLW9ubHkgZmlyc3QKCmBgYHNoCm52Y2YtY2xpIHNlbGYtaG9z" + + "dGVkIGRvd24gLS1wbGFuLW9ubHkgLS1jbHVzdGVyLW5hbWU9JE5BTUUgLS1qc29uIHwganEKYGBg" + + "CgpUaGlzIGVtaXRzIGEgYHBsYW5uZWRgIGV2ZW50IGxpc3RpbmcgZWFjaCBwaGFzZSwgdGhlIGhl" + + "bG0gcmVsZWFzZXMgdGhhdCB3b3VsZCBiZSB1bmluc3RhbGxlZCwgdGhlIElDTVMgcm93cyB0aGF0" + + "IHdvdWxkIGJlIHJlbW92ZWQsIGFuZCBFVEFzLiBDb3B5IHRoZSBgd2lsbFVuaW5zdGFsbC5jb21t" + + "YW5kc1tdYCBhcnJheSB0byB0aGUgdXNlciDigJQgdGhvc2UgYXJlIHRoZSBsaXRlcmFsIGBoZWxt" + + "IHVuaW5zdGFsbCDigKZgIGludm9jYXRpb25zIHRoZSBvcmNoZXN0cmF0b3Igd2lsbCBydW4uCgoj" + + "IyMgMy4gRXhlY3V0ZSB0aGUgZG93bgoKYGBgc2gKbnZjZi1jbGkgc2VsZi1ob3N0ZWQgZG93biAt" + + "LWNsdXN0ZXItbmFtZT0kTkFNRSAtLWpzb24KYGBgCgpQaGFzZXMgKDEtNywgbWlycm9ycyDCpzYu" + + "Ny4xKToKCjEuIFByZWZsaWdodCDigJQga3ViZWN0bCBhY2Nlc3MgKyBJQ01TIHJlYWNoYWJsZQoy" + + "LiBSZXNvbHZlIHN0YWNrIGJ1bmRsZQozLiBEcmFpbiBhY3RpdmUgZGVwbG95bWVudHMg4oCUIHJ1" + + "bnMgYGZ1bmN0aW9uIGRlcGxveSByZW1vdmVgIGZvciBlYWNoIEFDVElWRSBkZXBsb3ltZW50LCBw" + + "b2xscyB1bnRpbCBTVE9QUEVELiBTdWJqZWN0IHRvIGAtLWRyYWluLWFjdGl2ZT10cnVlfGZhbHNl" + + "fHByb21wdGAgKGRlZmF1bHQgaXMgYHByb21wdGAgaW4gVFRZKS4KNC4gVW5pbnN0YWxsIGNvbXB1" + + "dGUgcGxhbmUg4oCUIGRlbGVnYXRlcyB0byBgdW5pbnN0YWxsIC0tY29tcHV0ZS1wbGFuZWA7IGBo" + + "ZWxtIHVuaW5zdGFsbCA8cmVsZWFzZT5gIHBlciByZWxlYXNlIGluIHJldmVyc2UtREFHIG9yZGVy" + + "CjUuIFJlbW92ZSBwZXJzaXN0ZW50IChza2lwcGVkIHVubGVzcyBgLS1yZW1vdmUtcGVyc2lzdGVu" + + "dGApCjYuIFVucmVnaXN0ZXIgY2x1c3RlciBmcm9tIElDTVMKNy4gRmluYWwgdmVyaWZ5CgojIyMg" + + "NC4gVGVhciBkb3duIHRoZSBjb250cm9sIHBsYW5lIChpZiBhcHBsaWNhYmxlKQoKYGBgc2gKbnZj" + + "Zi1jbGkgc2VsZi1ob3N0ZWQgdW5pbnN0YWxsIC0tY29udHJvbC1wbGFuZQpgYGAKCk9yIHZpYSB0" + + "aGUgb3JjaGVzdHJhdG9yJ3MgYC0tYWxsYCBtb2RlIGlmIGV2ZXJ5IGNvbXB1dGUgcGxhbmUgaXMg" + + "YWxzbyBnb2luZyBhd2F5IChzZWUgc3RlcCA1KS4KCmB1bmluc3RhbGwgLS1jb250cm9sLXBsYW5l" + + "YCByZWZ1c2VzIGlmIGFueSBjb21wdXRlIHBsYW5lIGlzIHN0aWxsIHJlZ2lzdGVyZWQgaW4gSUNN" + + "Uy4gVXNlIGAtLWZvcmNlLXdpdGgtcmVnaXN0ZXJlZC1jbHVzdGVyc2AgdG8gb3ZlcnJpZGUgKipv" + + "bmx5KiogaWYgdGhlIHVzZXIgZXhwbGljaXRseSB3YW50cyB0byBvcnBoYW4gY29tcHV0ZSBwbGFu" + + "ZXMgKFBTQVQgYXV0aCBicmVha3MgZm9yIHRob3NlIGNsdXN0ZXJzIOKAlCB0aGV5IHdpbGwgc3Rh" + + "cnQgZmFpbGluZyBldmVyeSBoZWFsdGggY2hlY2spLiBBbHdheXMgc3RhdGUgdGhlIGNvbnNlcXVl" + + "bmNlIGJlZm9yZSBwYXNzaW5nIHRoZSBmbGFnLgoKIyMjIDUuIE9yLCBudWtlIGV2ZXJ5dGhpbmcK" + + "CmBgYHNoCm52Y2YtY2xpIHNlbGYtaG9zdGVkIGRvd24gLS1hbGwgLS1jb25maXJtCmBgYAoKVGhp" + + "cyBpdGVyYXRlcyBldmVyeSByZWdpc3RlcmVkIGNvbXB1dGUgcGxhbmUgaW4gSUNNUywgcnVucyB0" + + "aGUgcGVyLWNsdXN0ZXIgZG93biBmb3IgZWFjaCBpbiBwYXJhbGxlbCAoYm91bmRlZCBieSBgLS1h" + + "bGwtY29uY3VycmVuY3lgLCBkZWZhdWx0IDQpLCB0aGVuIHJ1bnMgYHVuaW5zdGFsbCAtLWNvbnRy" + + "b2wtcGxhbmVgLiBJbnRlcmFjdGl2ZSBtb2RlIHByb21wdHMgdGhlIG9wZXJhdG9yIHdpdGggdGhl" + + "IGNsdXN0ZXIgbGlzdCBiZWZvcmUgcHJvY2VlZGluZzsgYC0tY29uZmlybWAgc2tpcHMgdGhlIHBy" + + "b21wdCBmb3Igbm9uLWludGVyYWN0aXZlIHVzZS4KCiMjIEdpdE9wcyBwYXRoIChpZiB1c2VyIGhh" + + "cyBBcmdvIC8gRmx1eCkKCmBgYHNoCiMgUmVuZGVyIGRlbGV0ZSBZQU1MIGZvciB0aGUgY29tcHV0" + + "ZSBwbGFuZToKbnZjZi1jbGkgc2VsZi1ob3N0ZWQgdW5pbnN0YWxsIC0tbm8tYXBwbHkgLS1jb21w" + + "dXRlLXBsYW5lIC0tY2x1c3Rlci1uYW1lPSROQU1FID4gZGVsZXRlLnlhbWwKCiMgT3BlcmF0b3Ig" + + "Y29tbWl0cyBkZWxldGUueWFtbCB0byB0aGVpciBHaXRPcHMgcmVwby4gQXJnby9GbHV4IGFwcGxp" + + "ZXMgdGhlIGRlbGV0aW9uIG9uIG5leHQgc3luYy4KZ2l0IGFkZCBkZWxldGUueWFtbDsgZ2l0IGNv" + + "bW1pdCAtbSAicmVtb3ZlIGNvbXB1dGUgcGxhbmUgJE5BTUUiOyBnaXQgcHVzaAoKIyBBZnRlciBB" + + "cmdvIHN5bmMgcmVtb3ZlcyB0aGUgSzhzIHJlc291cmNlcywgc2VwYXJhdGVseSByZW1vdmUgdGhl" + + "IElDTVMgcm93OgpudmNmLWNsaSBjbHVzdGVyIGRlbGV0ZSAtLWNsdXN0ZXItaWQ9JENMVVNURVJf" + + "SUQKYGBgCgpOb3RlOiBgLS1uby1hcHBseWAgZG9lcyBOT1QgaW5jbHVkZSB0aGUgSUNNUyBgY2x1" + + "c3RlciBkZWxldGVgIChoZWxtIGRvZXNuJ3QgbWFuYWdlIHRoYXQpLiBPcGVyYXRvcnMgZm9sbG93" + + "aW5nIEdpdE9wcyBtdXN0IHJ1biBgbnZjZi1jbGkgY2x1c3RlciBkZWxldGVgIHNlcGFyYXRlbHks" + + "IG9yIHVzZSBgZG93bmAgdG8gb3JjaGVzdHJhdGUgYm90aC4KCiMjIEZhaWx1cmUgcmVjb3ZlcnkK" + + "CklmIGBkb3duYCBwYXJ0aWFsLWZhaWxzIG1pZC13YXksICoqcmUtcnVuIHRoZSBzYW1lIGNvbW1h" + + "bmQqKi4gVGhlIG9yY2hlc3RyYXRvciBpcyBpZGVtcG90ZW50OiBgaGVsbSB1bmluc3RhbGxgIHNr" + + "aXBzIHJlbGVhc2VzIHRoYXQgYXJlIGFscmVhZHkgZ29uZSwgYW5kIGBjbHVzdGVyIGRlbGV0ZSAt" + + "LWlnbm9yZS1taXNzaW5nYCBza2lwcyBJQ01TIHJvd3MgdGhhdCBhcmUgYWxyZWFkeSBnb25lLiBQ" + + "aGFzZSA0ICsgNiBlbWl0IGBwaGFzZTogc2tpcHBlZCAoYWxyZWFkeSBjbGVhbilgIG9uIHRoZSBz" + + "ZWNvbmQgcnVuLgoKSWYgYSBgcGhhc2VfZmFpbGVkYCBldmVudCBzdXJmYWNlczoKCi0gYGVyckNh" + + "dGVnb3J5OiAiaGVsbV9wZW5kaW5nX3VwZ3JhZGUiLCByZXRyeUNsYXNzOiAiYWZ0ZXJfcmVtZWRp" + + "YXRpb24iYCDihpIgcnVuIGBoZWxtIHJvbGxiYWNrIDxyZWxlYXNlPiAwIC0ta3ViZS1jb250ZXh0" + + "PeKApmAgKHRoZSBtZXNzYWdlIGluY2x1ZGVzIHRoZSBleGFjdCByZWxlYXNlIG5hbWUpIHRoZW4g" + + "cmUtcnVuIGBkb3duYC4gRG8gTk9UIGF1dG8tcm9sbGJhY2sgd2l0aG91dCB1c2VyIGNvbmZpcm1h" + + "dGlvbi4KLSBgZXJyQ2F0ZWdvcnk6ICJjb21wdXRlX3BsYW5lIiwgcmV0cnlDbGFzczogImFmdGVy" + + "X3JlbWVkaWF0aW9uImAgd2l0aCBtZXNzYWdlIGFib3V0IEFDVElWRSBkZXBsb3ltZW50cyDihpIg" + + "dXNlciBwYXNzZWQgYC0tZHJhaW4tYWN0aXZlPWZhbHNlYCBidXQgZGVwbG95bWVudHMgZXhpc3Qu" + + "IFJlLXJ1biB3aXRoIGAtLWRyYWluLWFjdGl2ZT10cnVlYCBvciBgLS1kcmFpbi1hY3RpdmU9cHJv" + + "bXB0YCBhbmQgY29uZmlybSB3aXRoIHRoZSB1c2VyLgotIE90aGVyIGNhdGVnb3JpZXMg4oaSIHN1" + + "cmZhY2UgYGVyck1lc3NhZ2VgICsgZWFjaCBgcmVtZWRpYXRpb25gIHN0cmluZyB2ZXJiYXRpbS4g" + + "U1RPUC4gRG8gbm90IHByb3Bvc2UgcmV0cnkgd2l0aG91dCB1c2VyIGlucHV0LgoKIyMgQWx3YXlz" + + "IGNvbmZpcm0KCkZvciBldmVyeSBgbnZjZi1jbGkgc2VsZi1ob3N0ZWQgZG93bmAgb3IgYHVuaW5z" + + "dGFsbGAgaW52b2NhdGlvbiwgZXNwZWNpYWxseSB3aXRoIGRlc3RydWN0aXZlIGZsYWdzOgoKLSBT" + + "dGF0ZSB0aGUgZXhhY3QgYC0tY2x1c3Rlci1uYW1lYCAob3IgYC0tYWxsYCkuCi0gU3RhdGUgd2hh" + + "dCdzIGxvc3QgKGUuZy4gImFsbCBmdW5jdGlvbiBkZXBsb3ltZW50cyBzY2hlZHVsZWQgb24gYG5j" + + "cC1sb2NhbGAgd2lsbCBzdG9wOyBjb21wdXRlIHBsYW5lIHdpbGwgZGVyZWdpc3RlciBmcm9tIElD" + + "TVMiKS4KLSBJZiBgLS1yZW1vdmUtcGVyc2lzdGVudGAgaXMgYmVpbmcgY29uc2lkZXJlZCwgc3Rh" + + "dGUgdGhhdCBDYXNzYW5kcmEgcm93cyArIE9wZW5CYW8gc2VhbCBrZXlzIHdpbGwgYmUgZGVsZXRl" + + "ZCBhbmQgdGhhdCB0aGlzIGlzIHVucmVjb3ZlcmFibGUuCi0gV2FpdCBmb3IgZXhwbGljaXQgdXNl" + + "ciBjb25maXJtYXRpb24uCi0gTmV2ZXIgcHJvcG9zZSBgLS1mb3JjZS13aXRoLXJlZ2lzdGVyZWQt" + + "Y2x1c3RlcnNgIHdpdGhvdXQgZXhwbGFpbmluZyB0aGF0IGNvbXB1dGUgcGxhbmVzIHdpbGwgYmUg" + + "b3JwaGFuZWQuCi0gTmV2ZXIgcHJvcG9zZSBgLS1yZW1vdmUtcGVyc2lzdGVudGAgd2l0aG91dCBl" + + "eHBsYWluaW5nIHRoZSBsb3NzLgoKIyMgTWFudWFsIGZhbGxiYWNrIChpZiBgbnZjZi1jbGkgc2Vs" + + "Zi1ob3N0ZWQge3VuaW5zdGFsbCxkb3dufWAgaXMgdW5hdmFpbGFibGUpCgpJZiB0aGUgdXNlciBp" + + "cyBvbiBhIENMSSB2ZXJzaW9uIG9sZGVyIHRoYW4gTSsxMSwgZmFsbCBiYWNrIHRvOgoKYGBgc2gK" + + "IyBQZXIgY29tcHV0ZSBwbGFuZSAob24gaXRzIGt1YmVjdGwgY29udGV4dCk6CmhlbG0gdW5pbnN0" + + "YWxsIG52Y2EtYWdlbnQgLW4gbnZjYS1zeXN0ZW0KaGVsbSB1bmluc3RhbGwgbnZjYS1vcGVyYXRv" + + "ciAtbiBudmNhLW9wZXJhdG9yCmhlbG0gdW5pbnN0YWxsIGltYWdlLWNyZWRlbnRpYWwtaGVscGVy" + + "IC1uIG52Y2Etc3lzdGVtCmhlbG0gdW5pbnN0YWxsIHNoYXJlZHN0b3JhZ2UgLW4gbnZjYS1zeXN0" + + "ZW0KCiMgRHJhaW4gdGhlIElDTVMgcm93OgpudmNmLWNsaSBjbHVzdGVyIGRlbGV0ZSAtLWNsdXN0" + + "ZXItaWQ9PGlkPgoKIyBDb250cm9sIHBsYW5lIHRlYXJkb3duIChvbiBpdHMga3ViZWN0bCBjb250" + + "ZXh0KToKY2QgbnZjZi1zZWxmLW1hbmFnZWQtc3RhY2sKbWFrZSBkZXN0cm95ICAgIyBpbnZva2Vz" + + "IGhlbG1maWxlIGRlc3Ryb3kgYWNyb3NzIGFsbCByZWxlYXNlcwoKIyBJZiB1c2luZyBzcGxpdCBz" + + "dGFjayBidW5kbGVzLCB0ZWFyZG93biBjb21wdXRlIHBsYW5lIHJlbGVhc2VzIHRvbzoKY2QgLi4v" + + "bnZjZi1jb21wdXRlLXBsYW5lLXN0YWNrCm1ha2UgZGVzdHJveQpgYGAKClRoaXMgaXMgdGhlIG1h" + + "bnVhbCBwYXRoOyBwcmVmZXIgdGhlIG5ldyBzdWJjb21tYW5kcyB3aGVuZXZlciB0aGV5J3JlIGlu" + + "c3RhbGxlZC4KCiMjIFdoYXQgYGt1YmVjdGwgZGVsZXRlIHB2Y2AgZG9lcwoKSWYgdGhlIHVzZXIg" + + "YXNrcyAid2h5IGlzIG15IG5ldyBpbnN0YWxsIHNlZWluZyB0aGUgb2xkIGRhdGE/IiDigJQgdGhl" + + "IFN0YXRlZnVsU2V0IFBWQ3MgKENhc3NhbmRyYSwgT3BlbkJhbykgYXJlIE5PVCBkZWxldGVkIGJ5" + + "IGBoZWxtIHVuaW5zdGFsbGAgKGFuZCBzbyBhcmUgTk9UIGRlbGV0ZWQgYnkgYG52Y2YtY2xpIHNl" + + "bGYtaG9zdGVkIGRvd25gIGVpdGhlciwgYnkgZGVmYXVsdCkuIFRoZXkgcGVyc2lzdCBpbnRlbnRp" + + "b25hbGx5IHNvIGEgcmUtYHVwYCBjYW4gcmVzdW1lIGFnYWluc3QgZXhpc3RpbmcgZGF0YS4gVG8g" + + "d2lwZSBjb21wbGV0ZWx5IG9uIHRoZSBuZXh0IGBkb3duYDoKCmBgYHNoCm52Y2YtY2xpIHNlbGYt" + + "aG9zdGVkIGRvd24gLS1jbHVzdGVyLW5hbWU9bmNwLWxvY2FsIC0tcmVtb3ZlLXBlcnNpc3RlbnQK" + + "YGBgCgpPciwgcG9zdC1kb3duLCBtYW51YWxseToKCmBgYHNoCmt1YmVjdGwgZGVsZXRlIHB2YyAt" + + "biBjYXNzYW5kcmEtc3lzdGVtIC0tYWxsCmt1YmVjdGwgZGVsZXRlIHB2YyAtbiB2YXVsdC1zeXN0" + + "ZW0gLS1hbGwKYGBgCgoqKkNvbmZpcm0gd2l0aCB1c2VyLioqIFRoaXMgaXMgdGhlIGRlc3RydWN0" + + "aXZlIHN0ZXAuClBLBwjah2NW5CEAAOQhAABQSwMEFAAIAAAAAAAhAAAAAAAAAAAAAAAAADAACQBk" + + "YXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9yZWZlcmVuY2UvY29tbWFuZHMubWRVVAUAAQCmzhIj" + + "IGBudmNmLWNsaWAgY29tbWFuZCByZWZlcmVuY2UKCkZ1bGwgc3ViY29tbWFuZCBsaXN0LiBBbHdh" + + "eXMgcGFpciB3aXRoIFtmbGFncy5tZF0oZmxhZ3MubWQpIGZvciBnbG9iYWwgZmxhZ3MgYW5kIFtl" + + "eGl0LWNvZGVzLm1kXShleGl0LWNvZGVzLm1kKSBmb3IgcmV0dXJuIGNvZGVzLgoKIyMgU2VsZi1o" + + "b3N0ZWQgbGlmZWN5Y2xlCgp8IENvbW1hbmQgfCBQdXJwb3NlIHwgT3V0cHV0IHwgTm90ZXMgfAp8" + + "LS0tfC0tLXwtLS18LS0tfAp8IGBzZWxmLWhvc3RlZCBjaGVjayAtLXByZSBbZmxhZ3NdYCB8IFBy" + + "ZS1mbGlnaHQgdmFsaWRhdGlvbiAobm8gYWRtaW4gY3JlZHMpIHwgc3RyZWFtaW5nIGV2ZW50cyB8" + + "IFBlci1yb2xlIHdpdGggYC0tY29udHJvbC1wbGFuZS1jb250ZXh0YCAvIGAtLWNvbXB1dGUtcGxh" + + "bmUtY29udGV4dGA7IGAtLWxvY2FsLW9ubHlgIHNraXBzIGt1YmVjdGwgfAp8IGBzZWxmLWhvc3Rl" + + "ZCBjaGVjayAtLWNvbnRyb2wtcGxhbmUgWy0td2FpdCBEVVJdYCB8IEV2ZXJ5IENQIHJlbGVhc2Ug" + + "aGVhbHRoeSB8IHN0cmVhbWluZyBldmVudHMgfCBQb2xscyB1bnRpbCBwYXNzIG9yIGAtLXdhaXRg" + + "IGVsYXBzZXMgfAp8IGBzZWxmLWhvc3RlZCBjaGVjayAtLWNvbXB1dGUtcGxhbmUgLS1jbHVzdGVy" + + "LW5hbWU9WCBbLS13YWl0IERVUl1gIHwgUGVyLWNsdXN0ZXIgd29ya2VyIHN0YXRlIHwgc3RyZWFt" + + "aW5nIGV2ZW50cyB8IE5WQ0EgKyBvcGVyYXRvciArIEpXS1MtZmluZ2VycHJpbnQgbWF0Y2ggfAp8" + + "IGBzZWxmLWhvc3RlZCBjaGVjayAtLWFsbCBbLS13YWl0IERVUl1gIHwgRmFuLW91dCBvdmVyIGFs" + + "bCBvZiB0aGUgYWJvdmUgfCBzdHJlYW1pbmcgZXZlbnRzIHwgfAp8IGBzZWxmLWhvc3RlZCBpbnN0" + + "YWxsIC0tY29udHJvbC1wbGFuZWAgfCBSZW5kZXIgY29udHJvbC1wbGFuZSBtYW5pZmVzdHMgfCBZ" + + "QU1MIG9uIHN0ZG91dCB8IFBpcGUgdG8gYGt1YmVjdGwgYXBwbHkgLWYgLWAgfAp8IGBzZWxmLWhv" + + "c3RlZCBpbnN0YWxsIC0tY29tcHV0ZS1wbGFuZSAtLWNsdXN0ZXItbmFtZT1YYCB8IFJlZ2lzdGVy" + + "IGNsdXN0ZXIgKyByZW5kZXIgY29tcHV0ZSBtYW5pZmVzdHMgfCBZQU1MIG9uIHN0ZG91dCB8IE9u" + + "ZSBpbnZvY2F0aW9uIHBlciBHUFUgY2x1c3RlciB8CnwgYHNlbGYtaG9zdGVkIHVwIC0tY2x1c3Rl" + + "ci1uYW1lPVhgIHwgT25lLXNob3QgZmlyc3QgaW5zdGFsbCAoYm90aCBwbGFuZXMpIHwgKGVtcHR5" + + "KSBzdGRvdXQsIHByb2dyZXNzIG9uIHN0ZGVyciB8IEFsd2F5cyBpbnN0YWxscyBib3RoIHBsYW5l" + + "czsgZm9yIGNvbXB1dGUtb25seSB1c2UgYGFkZC1jb21wdXRlLXBsYW5lYCB8CnwgYHNlbGYtaG9z" + + "dGVkIHVwIC0tcGxhbi1vbmx5IC0tY2x1c3Rlci1uYW1lPVhgIHwgRHJ5LXJ1biBwcmV2aWV3IHwg" + + "SlNPTkwgb24gc3RkZXJyIHwgQWdlbnQtZnJpZW5kbHksIG5vIGNsdXN0ZXIgY2hhbmdlcyB8Cnwg" + + "YHNlbGYtaG9zdGVkIGFkZC1jb21wdXRlLXBsYW5lIC0tY2x1c3Rlci1uYW1lPVggLS1jb21wdXRl" + + "LXBsYW5lLWNvbnRleHQ9WSAtLWljbXMtdXJsPVVSTCAtLXRva2VuPSRKV1RgIHwgQWRkIGEgY29t" + + "cHV0ZSBwbGFuZSB0byBhbiBleGlzdGluZyBjb250cm9sIHBsYW5lIHwgcHJvZ3Jlc3Mgb24gc3Rk" + + "ZXJyIHwgRm9yIDJuZCwgM3JkLCDigKYgR1BVIGNsdXN0ZXIgYWZ0ZXIgdGhlIGZpcnN0IGluc3Rh" + + "bGwuIENQIG5vdCB0b3VjaGVkLiB8CnwgYHNlbGYtaG9zdGVkIHN0YXR1cyBbLS1jbHVzdGVyLW5h" + + "bWU9WF0gWy0td2F0Y2hdYCB8IFNuYXBzaG90IGNsdXN0ZXIgaGVhbHRoIHwgVFRZL3BsYWluL0pT" + + "T05MIHwgYC0td2F0Y2hgIGZvciBsaXZlIHJlLXJlbmRlciB8CnwgYHNlbGYtaG9zdGVkIHVuaW5z" + + "dGFsbCAtLWNvbXB1dGUtcGxhbmUgLS1jbHVzdGVyLW5hbWU9WGAgfCBQZXItcGxhbmUgcHJpbWl0" + + "aXZlOiBgaGVsbWZpbGUgZGVzdHJveWAgb24gb25lIGNvbXB1dGUgcGxhbmUgKG5vIElDTVMgdW5y" + + "ZWdpc3Rlciwgbm8gZHJhaW4pIHwgcHJvZ3Jlc3MgfCBKdXN0IHRoZSBoZWxtIHJlbGVhc2VzIG9u" + + "IHRoYXQgY29tcHV0ZSBwbGFuZSB8CnwgYHNlbGYtaG9zdGVkIHVuaW5zdGFsbCAtLWNvbnRyb2wt" + + "cGxhbmUgWy0tZm9yY2Utd2l0aC1yZWdpc3RlcmVkLWNsdXN0ZXJzXWAgfCBQZXItcGxhbmUgcHJp" + + "bWl0aXZlOiBgaGVsbWZpbGUgZGVzdHJveWAgb24gdGhlIGNvbnRyb2wgcGxhbmUgfCBwcm9ncmVz" + + "cyB8IFJlZnVzZXMgaWYgY29tcHV0ZSBwbGFuZXMgc3RpbGwgcmVnaXN0ZXJlZCB1bmxlc3MgYC0t" + + "Zm9yY2Utd2l0aC1yZWdpc3RlcmVkLWNsdXN0ZXJzYCB8CnwgYHNlbGYtaG9zdGVkIHVuaW5zdGFs" + + "bCAtLW5vLWFwcGx5IDxwbGFuZT5gIHwgUmVuZGVyIGRlbGV0ZSBZQU1MIHZpYSBgaGVsbSBnZXQg" + + "bWFuaWZlc3RgIHBlciByZWxlYXNlIHwgWUFNTCBvbiBzdGRvdXQgfCBHaXRPcHM7IHBpcGUgdG8g" + + "YGt1YmVjdGwgZGVsZXRlIC1mIC1gIG9yIGNvbW1pdCArIEFyZ28gYXBwbGllcy4gTWlycm9ycyBg" + + "aW5zdGFsbCAtLW5vLWFwcGx5YCB8CnwgYHNlbGYtaG9zdGVkIGRvd24gLS1jbHVzdGVyLW5hbWU9" + + "WCBbLS1kcmFpbi1hY3RpdmVdIFstLXJlbW92ZS1wZXJzaXN0ZW50XWAgfCBPcmNoZXN0cmF0b3I6" + + "IGRyYWluIOKGkiB1bmluc3RhbGwgLS1jb21wdXRlLXBsYW5lIOKGkiBjbHVzdGVyIGRlbGV0ZSBp" + + "biBJQ01TIHwgcHJvZ3Jlc3MgfCBTeW1tZXRyaWMgY29tcGFuaW9uIHRvIGB1cCAtLWNsdXN0ZXIt" + + "bmFtZT1YYCB8CnwgYHNlbGYtaG9zdGVkIGRvd24gLS1hbGwgWy0tY29uZmlybV1gIHwgT3JjaGVz" + + "dHJhdG9yOiB0ZWFyIGRvd24gZXZlcnkgcmVnaXN0ZXJlZCBjb21wdXRlIHBsYW5lICsgY29udHJv" + + "bCBwbGFuZSB8IHByb2dyZXNzIHwgQm91bmRlZCBwYXJhbGxlbGlzbSB2aWEgYC0tYWxsLWNvbmN1" + + "cnJlbmN5YCAoZGVmYXVsdCA0KTsgYC0tY29uZmlybWAgcmVxdWlyZWQgaW4gbm9uLWludGVyYWN0" + + "aXZlIHwKfCBgc2VsZi1ob3N0ZWQgZG93biAtLXBsYW4tb25seSAuLi5gIHwgT3JjaGVzdHJhdG9y" + + "IGRyeS1ydW46IHBoYXNlcyArIGhlbG0gcmVsZWFzZXMgKyBJQ01TIHJvd3MgKyBFVEFzIChubyBo" + + "ZWxtL2hlbG1maWxlIGNvbnRhY3QpIHwgSlNPTkwgfCAqKkFsd2F5cyBydW4gYmVmb3JlIGFueSBh" + + "Y3R1YWwgYGRvd25gKiogfAoKIyMgQ2x1c3RlciBtYW5hZ2VtZW50Cgp8IENvbW1hbmQgfCBQdXJw" + + "b3NlIHwgTm90ZXMgfAp8LS0tfC0tLXwtLS18CnwgYGNsdXN0ZXIgcmVnaXN0ZXIgLS1uYW1lPVgg" + + "LS1uY2EtaWQ9WSBbLS1yZWdpb249Wl0gWy0taWdub3JlLWV4aXN0aW5nXWAgfCBSZWdpc3RlciBh" + + "IEpXS1MrT0lEQyB3aXRoIElDTVMgfCBVc2VkIGJ5IGB1cGAgUGhhc2UgNSBpbnRlcm5hbGx5OyBz" + + "dGFuZGFsb25lIGZvciBtYW51YWwgcmVnaXN0cmF0aW9uIHwKfCBgY2x1c3RlciBsaXN0LXJlZ2lz" + + "dGVyZWQgLS1uY2EtaWQ9WSBbLS1pY21zLXVybD1VUkxdYCB8IExpc3Qgc2VsZi1ob3N0ZWQgY2x1" + + "c3RlciByZWdpc3RyYXRpb25zIGZyb20gSUNNUyB8IFVzZXMgdGhlIGFkbWluIHRva2VuOyBgLS1q" + + "c29uYCBmb3IgbWFjaGluZS1yZWFkYWJsZSBvdXRwdXQgfAp8IGBjbHVzdGVyIHJvdGF0ZSAtLWNs" + + "dXN0ZXItaWQ9SURgIHwgUmUtZmV0Y2ggSldLUyBmcm9tIEs4cyBhbmQgUFVUIHRvIElDTVMgfCBB" + + "ZnRlciBLOHMgQVBJIHNlcnZlciBzaWduaW5nIGtleSByb3RhdGlvbiB8CnwgYGNsdXN0ZXIgZGVs" + + "ZXRlIC0tY2x1c3Rlci1pZD1JRGAgfCBSZW1vdmUgSUNNUyByb3cgfCAqKkRFU1RSVUNUSVZFOiBj" + + "b25maXJtIHdpdGggdXNlcioqIHwKCiMjIEZ1bmN0aW9ucwoKfCBDb21tYW5kIHwgUHVycG9zZSB8" + + "IE5vdGVzIHwKfC0tLXwtLS18LS0tfAp8IGBmdW5jdGlvbiBjcmVhdGUgLS1pbnB1dC1maWxlPUZJ" + + "TEVgIHwgQ3JlYXRlIGZ1bmN0aW9uIG1ldGFkYXRhIHwgUmV0dXJucyBGdW5jdGlvbiBJRCArIFZl" + + "cnNpb24gSUQ7IExMTSBmdW5jdGlvbnMgdXNlIGBmdW5jdGlvblR5cGU6ICJMTE0iYCBhbmQgYG1v" + + "ZGVsc1tdLmxsbUNvbmZpZy51cmlzYCBmb3IgYC92MS9jaGF0L2NvbXBsZXRpb25zYCwgYC92MS9y" + + "ZXNwb25zZXNgLCBhbmQgYC92MS9lbWJlZGRpbmdzYCB8CnwgYGZ1bmN0aW9uIGxpc3RgIC8gYGZ1" + + "bmN0aW9uIGxpc3QtaWRzYCB8IExpc3QgZnVuY3Rpb25zIC8gSURzIG9ubHkgfCB8CnwgYGZ1bmN0" + + "aW9uIGdldCAtLWZ1bmN0aW9uLWlkPUlEIC0tdmVyc2lvbi1pZD1WSURgIHwgRnVuY3Rpb24gbWV0" + + "YWRhdGEgfCB8CnwgYGZ1bmN0aW9uIHVwZGF0ZSAtLWZ1bmN0aW9uLWlkPUlEIC0tdmVyc2lvbi1p" + + "ZD1WSUQgLS10YWdzPVRBR1ssVEFHXWAgfCBVcGRhdGUgZnVuY3Rpb24gdGFncyB8IHwKfCBgZnVu" + + "Y3Rpb24gdXBkYXRlIC0tZnVuY3Rpb24taWQ9SUQgLS12ZXJzaW9uLWlkPVZJRCAtLWxsbS1tb2Rl" + + "bC11cGRhdGU9U1BFQ2AgfCBVcGRhdGUgTExNIG1vZGVsIHJvdXRpbmcgY29uZmlnIHwgYFNQRUNg" + + "IHVzZXMgYG5hbWU9PG1vZGVsPixyb3V0aW5nTWV0aG9kPTxtZXRob2Q+LHRva2VuUmF0ZUxpbWl0" + + "PTxsaW1pdD5gOyBhY2NlcHRlZCBtZXRob2RzIGFyZSBsaXN0ZWQgaW4gW2ZsYWdzLm1kXShmbGFn" + + "cy5tZCkgfAp8IGBmdW5jdGlvbiBkZXBsb3kgY3JlYXRlIC0taW5wdXQtZmlsZT1GSUxFYCB8IFNj" + + "aGVkdWxlIGEgZGVwbG95bWVudCB8IEJsb2NrcyB1bnRpbCBBQ1RJVkUgKGRlZmF1bHQgOTAwcykg" + + "fAp8IGBmdW5jdGlvbiBkZXBsb3kgZ2V0IC0tZnVuY3Rpb24taWQ9SUQgLS12ZXJzaW9uLWlkPVZJ" + + "RCBbLS1qc29uXWAgfCBEZXBsb3ltZW50IHN0YXR1cyB8IGBmdW5jdGlvblN0YXR1czogQUNUSVZF" + + "XHxERVBMT1lJTkdcfEVSUk9SXHxGQUlMRURgIHwKfCBgZnVuY3Rpb24gZGVwbG95IHVwZGF0ZSAt" + + "LWlucHV0LWZpbGU9RklMRWAgfCBNb2RpZnkgYSBkZXBsb3ltZW50IGluIHBsYWNlIHwgfAp8IGBm" + + "dW5jdGlvbiBkZXBsb3kgcmVtb3ZlIC0tZnVuY3Rpb24taWQ9SUQgLS12ZXJzaW9uLWlkPVZJRGAg" + + "fCBTdG9wIGEgZGVwbG95bWVudCwga2VlcCBmdW5jdGlvbiByZWNvcmQgfCB8CnwgYGZ1bmN0aW9u" + + "IGludm9rZSAtLWlucHV0LWZpbGU9RklMRWAgfCBDYWxsIGEgcmVndWxhciBmdW5jdGlvbiB8IFJl" + + "cXVpcmVzIEFQSSBrZXkgKG5vdCBhZG1pbiB0b2tlbik7IExMTSBmdW5jdGlvbnMgYXJlIGludm9r" + + "ZWQgdGhyb3VnaCBgbGxtLmludm9jYXRpb24uPGRvbWFpbj5gIHdpdGggYG1vZGVsOiAiPGZ1bmN0" + + "aW9uLWlkPi88bW9kZWwtbmFtZT4iYCB8CnwgYGZ1bmN0aW9uIGRlbGV0ZSAtLWZ1bmN0aW9uLWlk" + + "PUlEIC0tdmVyc2lvbi1pZD1WSURgIHwgUmVtb3ZlIGZ1bmN0aW9uICsgZGVwbG95bWVudCB8ICoq" + + "REVTVFJVQ1RJVkU6IGNvbmZpcm0gd2l0aCB1c2VyKiogfAoKIyMgVGFza3MKClRhc2sgY29tbWFu" + + "ZHMgcmVxdWlyZSBgTlZDRl9BUElfS0VZYCBzZXQgdG8gYSB0YXNrLXNjb3BlZCBrZXkgYW5kIGBO" + + "VkNGX0JBU0VfTlZDVF9VUkxgIHNldCB0byB0aGUgTlZDVCBnYXRld2F5IGVuZHBvaW50LiBJbiBh" + + "IGZyZXNoIHNlc3Npb24sIHJlYWQgYG52Y3RBcGlLZXlgIGZyb20gYH4vLm52Y2YtY2xpLnN0YXRl" + + "YCBhbmQgaW5qZWN0IGl0IGFzIGBOVkNGX0FQSV9LRVlgIHdpdGhvdXQgbG9nZ2luZyB0aGUgdmFs" + + "dWU7IGNoZWNrIGBudmN0QXBpS2V5RXhwaXJhdGlvbmAgZmlyc3QgYW5kIHJlZ2VuZXJhdGUgd2l0" + + "aCBgYXBpLWtleSBnZW5lcmF0ZSAtLWZvciB0YXNrIC0tdmFsaWRhdGVgIGlmIGV4cGlyZWQuIFJ1" + + "biBgYXBpLWtleSBnZW5lcmF0ZSAtLWZvciB0YXNrYCBhZnRlciBgaW5pdGAgdG8gbWludCBhIG5l" + + "dyBrZXkuCgp8IENvbW1hbmQgfCBQdXJwb3NlIHwgTm90ZXMgfAp8LS0tfC0tLXwtLS18CnwgYHRh" + + "c2sgY3JlYXRlIC0tbmFtZT1YIC0tZ3B1PUdQVSAtLWluc3RhbmNlLXR5cGU9VFlQRSAtLWltYWdl" + + "PUlNR2AgfCBTdWJtaXQgYSBjb250YWluZXIgdGFzayB8IFNhdmVzIHRhc2sgSUQgdG8gQ0xJIHN0" + + "YXRlOyB1c2UgYC0taW5wdXQtZmlsZWAgZm9yIHJlcGVhdGFibGUgY29uZmlncyB8CnwgYHRhc2sg" + + "Y3JlYXRlIC0tbmFtZT1YIC0tZ3B1PUdQVSAtLWluc3RhbmNlLXR5cGU9VFlQRSAtLWhlbG0tY2hh" + + "cnQ9Q0hBUlRgIHwgU3VibWl0IGEgSGVsbSB0YXNrIHwgYC0taGVsbS1jaGFydGAgcmVwbGFjZXMg" + + "YC0taW1hZ2VgIHwKfCBgdGFzayBjcmVhdGUgLS1pbnB1dC1maWxlPUZJTEVgIHwgU3VibWl0IGEg" + + "dGFzayBmcm9tIGEgSlNPTiBjb25maWcgZmlsZSB8IFJlY29tbWVuZGVkIGZvciByZXBlYXRhYmxl" + + "IGNvbmZpZ3VyYXRpb25zIHwKfCBgdGFzayBsaXN0IFstLXN0YXR1cz1TVEFUVVNdIFstLWxpbWl0" + + "PU5dYCB8IExpc3QgdGFza3MsIG9wdGlvbmFsbHkgZmlsdGVyZWQgYnkgc3RhdHVzIHwgU3RhdHVz" + + "ZXM6IGBRVUVVRURgLCBgTEFVTkNIRURgLCBgUlVOTklOR2AsIGBDT01QTEVURURgLCBgRVJST1JF" + + "RGAsIGBDQU5DRUxFRGAsIGBFWENFRURFRF9NQVhfUlVOVElNRV9EVVJBVElPTmAsIGBFWENFRURF" + + "RF9NQVhfUVVFVUVEX0RVUkFUSU9OYCB8CnwgYHRhc2sgZ2V0IFt0YXNrSWRdYCB8IEdldCB0YXNr" + + "IGRldGFpbHMgfCBVc2VzIHNhdmVkIHRhc2sgSUQgZnJvbSBzdGF0ZSBpZiBvbWl0dGVkIHwKfCBg" + + "dGFzayBldmVudHMgW3Rhc2tJZF0gWy0tbGltaXQ9Tl1gIHwgTGlzdCBsaWZlY3ljbGUgZXZlbnRz" + + "IGZvciBhIHRhc2sgfCB8CnwgYHRhc2sgcmVzdWx0cyBbdGFza0lkXWAgfCBMaXN0IHJlc3VsdCBh" + + "cnRpZmFjdHMgZm9yIGEgY29tcGxldGVkIHRhc2sgfCBSZXR1cm5zIGVtcHR5IGxpc3Qgd2hlbiBg" + + "cmVzdWx0SGFuZGxpbmdTdHJhdGVneWAgaXMgYE5PTkVgOyByZXN1bHQgdXBsb2FkIG5vdCB5ZXQg" + + "c3VwcG9ydGVkIHwKfCBgdGFzayBjYW5jZWwgW3Rhc2tJZF1gIHwgQ2FuY2VsIGEgcnVubmluZyB0" + + "YXNrIHwgTm8tb3AgaWYgYWxyZWFkeSBpbiB0ZXJtaW5hbCBzdGF0ZSB8CnwgYHRhc2sgZGVsZXRl" + + "IFt0YXNrSWRdYCB8IERlbGV0ZSBhIHRhc2sgcmVjb3JkIHwgKipTdG9wLCBzdGF0ZSB0YXNrIElE" + + "ICsgY3VycmVudCBzdGF0dXMsIGFuZCB3YWl0IGZvciBhIHN1YnNlcXVlbnQgdXNlciByZXBseSBl" + + "eHBsaWNpdGx5IGNvbmZpcm1pbmcgZGVsZXRpb24gb2YgdGhhdCBzcGVjaWZpYyB0YXNrLiBEbyBu" + + "b3QgdHJlYXQgdGhlIG9yaWdpbmFsIGRlbGV0ZSByZXF1ZXN0IGFzIGNvbmZpcm1hdGlvbi4qKiB8" + + "CnwgYHRhc2sgdXBkYXRlLXNlY3JldHMgW3Rhc2tJZF0gLS1zZWNyZXRzIE5BTUU9dmFsdWVgIHwg" + + "VXBkYXRlIHNlY3JldHMgb24gYSB0YXNrOyBzdXBwbGllZCBzZWNyZXRzIGFyZSBhZGRlZCBvciB1" + + "cGRhdGVkIGJ5IG5hbWUsIGV4aXN0aW5nIHNlY3JldHMgbm90IGluIHRoZSByZXF1ZXN0IGFyZSBw" + + "cmVzZXJ2ZWQgfCBWYWx1ZXMgYXJlIGVuY3J5cHRlZCBhdCByZXN0IHwKfCBgdGFzayBidWxrIC0t" + + "dGFzay1pZHM9SUQxWyxJRDIs4oCmXWAgfCBGZXRjaCBkZXRhaWxzIGZvciBtdWx0aXBsZSB0YXNr" + + "cyBpbiBvbmUgcmVxdWVzdCB8IHwKCiMjIEF1dGgKCnwgQ29tbWFuZCB8IFB1cnBvc2UgfCBOb3Rl" + + "cyB8CnwtLS18LS0tfC0tLXwKfCBgaW5pdGAgfCBNaW50IGFkbWluIHRva2VuIGZyb20gQVBJIEtl" + + "eXMgdmlhIHB1YmxpYyBhcGkgZ2F0ZXdheSB8IElkZW1wb3RlbnQ7IHdyaXRlcyBgfi8ubnZjZi1j" + + "bGkuc3RhdGVgOyBjbGVhcnMgc2F2ZWQgZnVuY3Rpb24gc3RhdGUgYW5kIGFsbCBBUEkga2V5cyAo" + + "ZnVuY3Rpb24gYW5kIHRhc2spIHwKfCBgc3RhdHVzYCB8IFNob3cgQ0xJIHN0YXRlICh0b2tlbiwg" + + "bGFzdCBlbmRwb2ludHMsIGZ1bmN0aW9uIGNvbnRleHQpIHwgRGlzdGluY3QgZnJvbSBgc2VsZi1o" + + "b3N0ZWQgc3RhdHVzYCB8CnwgYGFwaS1rZXkgZ2VuZXJhdGUgWy0tZm9yIGZ1bmN0aW9uXHx0YXNr" + + "XSBbLS1kZXNjcmlwdGlvbj3igKZdIFstLWV4cGlyZXMtaW494oCmXWAgfCBNaW50IEFQSSBrZXlz" + + "IHwgRGVmYXVsdCAobm8gYC0tZm9yYCk6IGdlbmVyYXRlcyBib3RoIGEgZnVuY3Rpb24ga2V5IGFu" + + "ZCBhIHRhc2sga2V5OyBgLS1mb3IgZnVuY3Rpb25gIG9yIGAtLWZvciB0YXNrYCBnZW5lcmF0ZXMg" + + "b25lIG9ubHk7IGAtLXNjb3Blc2AgcmVxdWlyZXMgYC0tZm9yYCB8CnwgYGFwaS1rZXkgZ2VuZXJh" + + "dGUgLS12YWxpZGF0ZWAgfCBNaW50IGFuZCBpbW1lZGlhdGVseSB2YWxpZGF0ZSBlYWNoIGdlbmVy" + + "YXRlZCBrZXkgfCBWYWxpZGF0ZXMgZWFjaCBrZXkgYWdhaW5zdCBpdHMgY29ycmVjdCBhdWRpZW5j" + + "ZSAoTlZDRiBmb3IgZnVuY3Rpb24ga2V5cywgTlZDVCBmb3IgdGFzayBrZXlzKSB8CnwgYGFwaS1r" + + "ZXkgbGlzdGAgfCBMaXN0IEFQSSBrZXlzIGZvciBjdXJyZW50IG93bmVyIHwgTGlzdHMgTlZDRi1z" + + "Y29wZWQga2V5cyBvbmx5IHwKfCBgYXBpLWtleSBkZWxldGUgS0VZLUlEYCAvIGBhcGkta2V5IHJl" + + "dm9rZSBLRVktSURgIHwgUmVtb3ZlIGFuIEFQSSBrZXkgfCAqKkNvbmZpcm0gd2l0aCB1c2VyKiog" + + "fAp8IGBhcGkta2V5IHNob3dgIHwgU2hvdyBjdXJyZW50bHkgc2F2ZWQgQVBJIGtleSBmcm9tIHN0" + + "YXRlIHwgfAoKIyMgQWdlbnQgc2tpbGwKCnwgQ29tbWFuZCB8IFB1cnBvc2UgfCBOb3RlcyB8Cnwt" + + "LS18LS0tfC0tLXwKfCBgYWdlbnQtc2tpbGwgaW5zdGFsbCBbLS10YXJnZXQ9RElSXWAgfCBJbnN0" + + "YWxsIGFsbCBidW5kbGVkIHB1YmxpYyB1c2VyIHNraWxscyBpbnRvIGB+Ly5jbGF1ZGUvc2tpbGxz" + + "L2AgYW5kIGB+Ly5hZ2VudHMvc2tpbGxzL2AgfCBEZWZhdWx0OiBib3RoIGJhc2Ugc2tpbGxzIGRp" + + "cmVjdG9yaWVzIHwKfCBgYWdlbnQtc2tpbGwgdW5pbnN0YWxsIFstLXRhcmdldD1ESVJdYCB8IFJl" + + "bW92ZSBvbmx5IGJ1bmRsZWQgcHVibGljIHVzZXIgc2tpbGxzIGZyb20gdGhlIHRhcmdldCBiYXNl" + + "IHNraWxscyBkaXJlY3RvcmllcyB8IElkZW1wb3RlbnQ7IHVucmVsYXRlZCBza2lsbHMgcmVtYWlu" + + "IHwKfCBgYWdlbnQtc2tpbGwgc2hvdyBbLS1maWxlPVJFTF1gIHwgUHJpbnQgYnVuZGxlZCBgbnZj" + + "Zi1zZWxmLW1hbmFnZWQtY2xpL1NLSUxMLm1kYCBvciBhbm90aGVyIGVtYmVkZGVkIGZpbGUgfCBG" + + "b3IgZGVidWdnaW5nIHwKfCBgYWdlbnQtc2tpbGwgdmVyc2lvbmAgfCBQcmludCBidWlsZCBTSEEg" + + "YW5kIGVtYmVkZGVkIHB1YmxpYyB1c2VyIHNraWxsIHN1bW1hcnkgfCB8ClBLBwhyDQ9kISMAACEj" + + "AABQSwMEFAAIAAAAAAAhAAAAAAAAAAAAAAAAADIACQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNs" + + "aS9yZWZlcmVuY2UvZXhpdC1jb2Rlcy5tZFVUBQABAKbOEiMgYG52Y2YtY2xpYCBleGl0IGNvZGVz" + + "CgpTdGFibGUgYWNyb3NzIHN1YmNvbW1hbmRzLiBVc2UgdGhlc2UgdG8gZHJpdmUgYWdlbnQgcmV0" + + "cnkgLyBzdXJmYWNpbmcgbG9naWMuCgp8IENvZGUgfCBNZWFuaW5nIHwgRXhhbXBsZSBjYXVzZXMg" + + "fAp8LS0tfC0tLXwtLS18CnwgYDBgIHwgU3VjY2VzcyB8IEFsbCBjaGVja3MgcGFzc2VkOyBpbnN0" + + "YWxsIGNvbXBsZXRlZDsgZGVwbG95bWVudCBBQ1RJVkUgfAp8IGAxYCB8IEdlbmVyaWMgZXJyb3Ig" + + "fCBIZWxtIHJlbmRlciBmYWlsZWQ7IG5ldHdvcmsgdW5yZWFjaGFibGU7IGZpbGUgbm90IGZvdW5k" + + "OyBZQU1MIHBhcnNlIGVycm9yIHwKfCBgMmAgfCBQcmUtZmxpZ2h0IGNoZWNrIGZhaWxlZCB8IEdh" + + "dGV3YXkgQVBJIENSRHMgbWlzc2luZzsga3ViZWN0bCBub3Qgb24gUEFUSDsgZGVmYXVsdCBTdG9y" + + "YWdlQ2xhc3MgYWJzZW50IHwKfCBgM2AgfCBBZG1pbiBhdXRoIGZhaWxlZCB8IE5vIHRva2VuICsg" + + "YC0tbm9uLWludGVyYWN0aXZlYCBzZXQ7IElDTVMgcmVqZWN0ZWQgSldUOyBpbml0IGVuZHBvaW50" + + "IHVucmVhY2hhYmxlIHwKfCBgNWAgfCBNYW5pZmVzdCBhcHBseSBvciBgLS13YWl0YCB0aW1lZCBv" + + "dXQgfCBIZWxtIGluc3RhbGwgdGltZW91dDsgY2hlY2sgcG9sbGVkIGJ1dCBkaWRuJ3QgcGFzcyBi" + + "ZWZvcmUgZHVyYXRpb24gfAp8IGAxMzBgIHwgQ2FuY2VsbGVkIGJ5IFNJR0lOVC9TSUdURVJNIHwg" + + "VXNlciBDdHJsLUM7IENJIGJ1ZGdldCBleGNlZWRlZDsgcG9kIGV2aWN0ZWQgfAoKIyMgSG93IGFu" + + "IGFnZW50IHNob3VsZCByZWFjdAoKfCBDb2RlIHwgQWdlbnQgYmVoYXZpb3IgfAp8LS0tfC0tLXwK" + + "fCBgMGAgfCBDb250aW51ZSAvIHJlcG9ydCBzdWNjZXNzLiB8CnwgYDFgIHwgU3VyZmFjZSBzdGRl" + + "cnIgdG8gdXNlcjsgYXNrIGJlZm9yZSBhbnkgcmV0cnkuIEdlbmVyaWMgZXJyb3JzIHVzdWFsbHkg" + + "bmVlZCBhIGh1bWFuIHRvIHJlYWQgdGhlIG1lc3NhZ2UuIHwKfCBgMmAgfCBTdXJmYWNlIGZhaWxl" + + "ZCBjaGVja3MgKyB0aGVpciBgaGludFVSTGAuIERvbid0IHByb3Bvc2UgYHVwYCB1bnRpbCB0aGUg" + + "dXNlciBmaXhlcyBwcmVyZXFzLiB8CnwgYDNgIHwgU3VnZ2VzdCBgbnZjZi1jbGkgaW5pdGAgKGlu" + + "dGVyYWN0aXZlKSBPUiBgLS10b2tlbj0kSldUYCAoQ0kpLiBEb24ndCBhdXRvLW1pbnQgd2l0aG91" + + "dCB1c2VyIE9LLiB8CnwgYDVgIHwgQXNrIHVzZXIgaWYgdGhleSB3YW50IHRvIHdhaXQgbG9uZ2Vy" + + "LCBkaWcgaW50byB0aGUgc3RhbGxlZCBjb21wb25lbnQsIG9yIGNhbmNlbC4gfAp8IGAxMzBgIHwg" + + "RG9uJ3QgcmV0cnkgYXV0b21hdGljYWxseTsgdXNlciBleHBsaWNpdGx5IGNhbmNlbGxlZC4gQ29u" + + "ZmlybSBiZWZvcmUgcmUtcnVubmluZy4gfAoKIyMgV2hlcmUgdG8gZmluZCBtb3JlIGRldGFpbAoK" + + "RXZlcnkgbm9uLXplcm8gZXhpdCBlbWl0cyBhIHN0cnVjdHVyZWQgYHBoYXNlX2ZhaWxlZGAgSlNP" + + "TiBldmVudCB3aXRoIGBlcnJDYXRlZ29yeWAsIGBlcnJNZXNzYWdlYCwgYHJlbWVkaWF0aW9uYCAo" + + "YXJyYXkpLCBgcmV0cnlDbGFzc2AgKGVudW06IGBub25lfGltbWVkaWF0ZXxiYWNrb2ZmfGFmdGVy" + + "X3JlbWVkaWF0aW9ufHVua25vd25gKSwgYHJldHJ5QWZ0ZXJTZWNgIChpbnQsIG9wdGlvbmFsKSwg" + + "YW5kIGByYXdgIChzdWJwcm9jZXNzICsgSFRUUCArIEt1YmVybmV0ZXMgc2lnbmFsKS4gQWx3YXlz" + + "IGNvbnN1bWUgdGhlc2UgaW4gYC0tanNvbmAgbW9kZSByYXRoZXIgdGhhbiBwYXJzaW5nIEVuZ2xp" + + "c2ggZnJvbSBzdGRlcnIuClBLBwhzp1pk1QYAANUGAABQSwMEFAAIAAAAAAAhAAAAAAAAAAAAAAAA" + + "AC0ACQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9yZWZlcmVuY2UvZmxhZ3MubWRVVAUAAQCm" + + "zhIjIGBudmNmLWNsaWAgZmxhZyByZWZlcmVuY2UKCiMjIEdsb2JhbCBmbGFncyAoZXZlcnkgc3Vi" + + "Y29tbWFuZCkKCnwgRmxhZyB8IFB1cnBvc2UgfCBEZWZhdWx0IHwKfC0tLXwtLS18LS0tfAp8IGAt" + + "LWNvbmZpZyBGSUxFYCB8IENvbmZpZyBmaWxlIHBhdGggfCBgJEhPTUUvLm52Y2YtY2xpLnlhbWxg" + + "IHwKfCBgLS1kZWJ1Z2AgfCBWZXJib3NlIEhUVFAgbG9nZ2luZyBvbiBzdGRlcnIgfCBgZmFsc2Vg" + + "IHwKfCBgLS1qc29uYCB8IEpTT05MIGV2ZW50cyBvbiBzdGRlcnIgfCBhdXRvIChvZmYgaW4gVFRZ" + + "LCBvbiB1bmRlciBgLS1ub24taW50ZXJhY3RpdmVgKSB8CgojIyBgc2VsZi1ob3N0ZWRgIHBhcmVu" + + "dCAocGVyc2lzdGVudCBhY3Jvc3Mgc3ViY29tbWFuZHMpCgp8IEZsYWcgfCBQdXJwb3NlIHwgRGVm" + + "YXVsdCB8CnwtLS18LS0tfC0tLXwKfCBgLS1jb250cm9sLXBsYW5lLXN0YWNrPeKApmAgfCBDb250" + + "cm9sLXBsYW5lIGJ1bmRsZSBzb3VyY2U6IGxvY2FsIHBhdGgsIGdpdCBVUkwsIG9yIGBvY2k6Ly9g" + + "IFVSTCB8IGVtYmVkZGVkIE9DSSBVUkwgcGlubmVkIGJ5IENMSSB2ZXJzaW9uIHwKfCBgLS1jb21w" + + "dXRlLXBsYW5lLXN0YWNrPeKApmAgfCBDb21wdXRlLXBsYW5lIGJ1bmRsZSBzb3VyY2U6IGxvY2Fs" + + "IHBhdGgsIGdpdCBVUkwsIG9yIGBvY2k6Ly9gIFVSTCB8IGVtYmVkZGVkIE9DSSBVUkwgcGlubmVk" + + "IGJ5IENMSSB2ZXJzaW9uIHwKfCBgLS1lbnY9bG9jYWxcfHByZFx84oCmYCB8IEhlbG1maWxlIGVu" + + "dmlyb25tZW50IG5hbWUgfCBgbG9jYWxgIGZvciBkZXYgYnVpbGRzLCBgcHJkYCBmb3IgcmVsZWFz" + + "ZXMgfAp8IGAtLW5vbi1pbnRlcmFjdGl2ZWAgfCBEaXNhYmxlIGFsbCBzdGRpbiBwcm9tcHRzIHwg" + + "YGZhbHNlYCB8CnwgYC0tdG9rZW49JEpXVGAgfCBBZG1pbiBKV1QsIG92ZXJyaWRlcyBzdG9yZWQg" + + "c2Vzc2lvbiB8IC0gfAp8IGAtLW5vLWFwcGx5YCB8IGBpbnN0YWxsYCBvbmx5IC0gZW1pdCBZQU1M" + + "LCBkbyBub3Qga3ViZWN0bCBhcHBseSB8IGBmYWxzZWAgfAp8IGAtLW91dHB1dD10ZXh0XHxqc29u" + + "YCB8IExlZ2FjeSBhbGlhcyBmb3IgYC0tanNvbmAgKGRlcHJlY2F0ZWQsIHJlbW92ZWQgaW4gbmV4" + + "dCBtYWpvcikgfCBgdGV4dGAgfAp8IGAtLXBsYWluYCB8IEZvcmNlIHBsYWluIHN0cmVhbWluZyBv" + + "dXRwdXQgfCBhdXRvLWRldGVjdCB8CnwgYC0td2FpdCBEVVJBVElPTmAgfCBgY2hlY2tgIG9ubHk7" + + "IGJsb2NrIHVudGlsIHBhc3MgfCAtIHwKfCBgLS1jb250cm9sLXBsYW5lLWNvbnRleHQgQ1RYYCB8" + + "IGt1YmVjdGwgY29udGV4dCBmb3IgY29udHJvbCBwbGFuZSAoUkVRLTIwKSB8IGN1cnJlbnQgY29u" + + "dGV4dCB8CnwgYC0tY29tcHV0ZS1wbGFuZS1jb250ZXh0IENUWGAgfCBrdWJlY3RsIGNvbnRleHQg" + + "Zm9yIGNvbXB1dGUgcGxhbmUgKFJFUS0yMCkgfCBjdXJyZW50IGNvbnRleHQgfAp8IGAtLWljbXMt" + + "dXJsIFVSTGAgfCBQdWJsaWMgSUNNUyBVUkw7IHJlcXVpcmVkIHdoZW4gY29udGV4dHMgZGlmZmVy" + + "IHwgZGVyaXZlZCBmcm9tIGBiYXNlX2h0dHBfdXJsYCB8CnwgYC0tbG9jYWwtb25seWAgfCBgY2hl" + + "Y2sgLS1wcmVgIG9ubHk7IHNraXAgYWxsIGt1YmVjdGwgY29udGFjdCB8IGBmYWxzZWAgfAoKIyMg" + + "YGNoZWNrYC1zcGVjaWZpYwoKQXQgbGVhc3Qgb25lIG9mIGAtLXByZWAsIGAtLWNvbnRyb2wtcGxh" + + "bmVgLCBgLS1jb21wdXRlLXBsYW5lYCwgb3IgYC0tYWxsYCBpcwpyZXF1aXJlZC4gRWFjaCBzZWxl" + + "Y3RzIGEgcm9sZTsgb25seSB0aGUgc2VsZWN0ZWQgcm9sZXMgY29udGFjdCBhIGNsdXN0ZXIuCgp8" + + "IEZsYWcgfCBQdXJwb3NlIHwgRGVmYXVsdCB8CnwtLS18LS0tfC0tLXwKfCBgLS1wcmVgIHwgUHJl" + + "LWZsaWdodDogbG9jYWwtaG9zdCB0b29scyBwbHVzIGNsdXN0ZXIgcmVhZGluZXNzIHwgYGZhbHNl" + + "YCB8CnwgYC0tY29udHJvbC1wbGFuZWAgfCBDb250cm9sLXBsYW5lIGNoZWNrcyB8IGBmYWxzZWAg" + + "fAp8IGAtLWNvbXB1dGUtcGxhbmVgIHwgQ29tcHV0ZS1wbGFuZSBjaGVja3MgfCBgZmFsc2VgIHwK" + + "fCBgLS1hbGxgIHwgRXZlcnkgY2F0ZWdvcnkgfCBgZmFsc2VgIHwKfCBgLS1jbHVzdGVyLW5hbWUg" + + "TkFNRWAgfCBDbHVzdGVyIG5hbWUgZm9yIGNvbXB1dGUtcGxhbmUgY2hlY2tzIHwgLSB8CnwgYC0t" + + "c2tpcC1pbm90aWZ5LWNoZWNrYCB8IFNraXAgdGhlIHBlci1ub2RlIGlub3RpZnktbGltaXRzIHBy" + + "b2JlLiBOZWVkZWQgd2hlbiB0aGUga3ViZWNvbmZpZyB1c2VyIGNhbm5vdCBjcmVhdGUgcG9kcyBp" + + "biBgZGVmYXVsdGAuIEVudjogYE5WQ0ZfQ0xJX1NFTEZIT1NURURfU0tJUF9JTk9USUZZYCB8IGBm" + + "YWxzZWAgfAoKIyMjIENsdXN0ZXItdmFsaWRhdG9yIGZsYWdzCgpUaGUgdmFsaWRhdG9yIHJ1bnMg" + + "YXMgYSBKb2IgaW4gdGhlIGNsdXN0ZXIgYmVpbmcgY2hlY2tlZC4gVGhlIENMSSBjcmVhdGVzIGEK" + + "U2VydmljZUFjY291bnQsIENsdXN0ZXJSb2xlLCBhbmQgQ2x1c3RlclJvbGVCaW5kaW5nIGZvciBp" + + "dCBhbmQgcmVtb3ZlcyB0aGVtCmFmdGVyIHRoZSBydW4sIHNvIHRoZSBrdWJlY29uZmlnIGNvbnRl" + + "eHQgbmVlZHMgcGVybWlzc2lvbiB0byBtYW5hZ2UgdGhvc2UuCgp8IEZsYWcgfCBQdXJwb3NlIHwg" + + "RGVmYXVsdCB8CnwtLS18LS0tfC0tLXwKfCBgLS1jbHVzdGVyLXZhbGlkYXRvci1pbWFnZSBSRUZg" + + "IHwgVmFsaWRhdG9yIGltYWdlLiBSZXNvbHV0aW9uIG9yZGVyOiBmbGFnLCBgTlZDRl9DTElfQ0xV" + + "U1RFUl9WQUxJREFUT1JfSU1BR0VgLCBjb25maWcga2V5IGBjbHVzdGVyX3ZhbGlkYXRvcl9pbWFn" + + "ZWAuIEEgcmVmIHdpdGggbm8gdGFnIGRpc2NvdmVycyB0aGUgbGF0ZXN0IHN0YWJsZSB0YWcgZnJv" + + "bSB0aGUgcmVnaXN0cnkuIFVuc2V0IGV2ZXJ5d2hlcmUgc2tpcHMgdGhlIHByb2JlIHdpdGggYSB3" + + "YXJuaW5nIHwgLSB8CnwgYC0tY2x1c3Rlci12YWxpZGF0b3ItcmVnaXN0cmllcyBob3N0OnBvcnQs" + + "Li4uYCB8IEV4dHJhIHJlZ2lzdHJpZXMgdGhlIGNvbnRyb2wtcGxhbmUgdmFsaWRhdG9yIHByb2Jl" + + "cyBmb3IgcmVhY2hhYmlsaXR5LiBgbnZjci5pb2AgaXMgYWx3YXlzIHByb2JlZC4gUmVwZWF0YWJs" + + "ZSBvciBjb21tYS1zZXBhcmF0ZWQuIEVudjogYE5WQ0ZfQ0xJX0NMVVNURVJfVkFMSURBVE9SX1JF" + + "R0lTVFJJRVNgOyBjb25maWcga2V5IGBjbHVzdGVyX3ZhbGlkYXRvcl9yZWdpc3RyaWVzYCB8IGBu" + + "dmNyLmlvYCBvbmx5IHwKfCBgLS1jbHVzdGVyLXZhbGlkYXRvci1wdWxsLXNlY3JldCBOQU1FYCB8" + + "IGRvY2tlci1yZWdpc3RyeSBTZWNyZXQgaW4gYGRlZmF1bHRgIHVzZWQgdG8gcHVsbCB0aGUgdmFs" + + "aWRhdG9yIGltYWdlLiBXaGVuIGVtcHR5LCB0aGUgQ0xJIGxvb2tzIGZvciBvbmUgaW4gdGhlIE5W" + + "Q0YgbmFtZXNwYWNlcyBhbmQgZmFsbHMgYmFjayB0byBtaW50aW5nIG9uZSBmcm9tIGBOR0NfQVBJ" + + "X0tFWWAgfCBhdXRvLWRldGVjdCB8CnwgYC0tc2tpcC1jbHVzdGVyLXZhbGlkYXRpb25gIHwgU2tp" + + "cCB0aGUgaW4tY2x1c3RlciB2YWxpZGF0b3IgcHJvYmUgZW50aXJlbHkuIEVudjogYE5WQ0ZfQ0xJ" + + "X1NFTEZIT1NURURfU0tJUF9DTFVTVEVSX1ZBTElEQVRJT05gIHwgYGZhbHNlYCB8CnwgYC0tbm8t" + + "Y2xlYW51cGAgfCBLZWVwIHRoZSB2YWxpZGF0b3IgSm9iIChhbmQgaXRzIFJCQUMpIGFmdGVyIHRo" + + "ZSBydW4gZm9yIGRlYnVnZ2luZy4gVGhlIG5leHQgcnVuIHN0aWxsIHN3ZWVwcyBwcmlvciBKb2Jz" + + "IHwgYGZhbHNlYCB8CnwgYC0tc2hvdy1sb2dzYCB8IFByaW50IHRoZSB2YWxpZGF0b3IgdHJhbnNj" + + "cmlwdCB0byBzdGRlcnIgYWZ0ZXIgdGhlIGNoZWNrIGV2ZW50cy4gVGhlIHRyYW5zY3JpcHQgaXMg" + + "bm90IEpTT04sIGFuZCBgLS1qc29uYCBhbHNvIHdyaXRlcyB0byBzdGRlcnIsIHNvIGxlYXZlIHRo" + + "aXMgb2ZmIHdoZW4gYSBwYXJzZXIgaXMgcmVhZGluZyB0aGUgc3RyZWFtIHwgYGZhbHNlYCB8Cgoj" + + "IyBgdXBgLXNwZWNpZmljCgp8IEZsYWcgfCBQdXJwb3NlIHwgRGVmYXVsdCB8CnwtLS18LS0tfC0t" + + "LXwKfCBgLS1jbHVzdGVyLW5hbWUgTkFNRWAgfCBJQ01TIGNsdXN0ZXIgcm93IGlkZW50aWZpZXIg" + + "KHJlcXVpcmVkKSB8IC0gfAp8IGAtLW5jYS1pZCBJRGAgfCBOQ0EgYWNjb3VudCBJRCB8IGBudmNm" + + "LWRlZmF1bHRgIHwKfCBgLS1yZWdpb24gUkVHSU9OYCB8IENsdXN0ZXIgcmVnaW9uIHwgYHVzLXdl" + + "c3QtMWAgfAp8IGAtLXBsYW4tb25seWAgfCBEcnktcnVuOyBlbWl0IHBoYXNlIHBsYW4gKyBFVEFz" + + "IHdpdGhvdXQgY2hhbmdlcyB8IGBmYWxzZWAgfAoKIyMgYHN0YXR1c2Atc3BlY2lmaWMKCnwgRmxh" + + "ZyB8IFB1cnBvc2UgfCBEZWZhdWx0IHwKfC0tLXwtLS18LS0tfAp8IGAtLWNsdXN0ZXItbmFtZSBO" + + "QU1FYCB8IExpbWl0IHRvIG9uZSBjb21wdXRlIHBsYW5lIHwgLSAoY29udHJvbCArIGFsbCBjbHVz" + + "dGVycykgfAp8IGAtLXdhdGNoYCB8IExpdmUgcmUtcmVuZGVyIHwgYGZhbHNlYCB8CnwgYC0td2F0" + + "Y2gtaW50ZXJ2YWwgRFVSYCB8IGAtLXdhdGNoYCBjYWRlbmNlIHwgYDVzYCB8CnwgYC0tY29tcG9u" + + "ZW50IE5BTUVgIHwgRmlsdGVyIGNvbXBvbmVudHMgcGFuZWwgfCBhbGwgfAp8IGAtLW5vLWV2ZW50" + + "c2AgfCBTa2lwIGV2ZW50cyBwYW5lbCB8IGBmYWxzZWAgfAoKIyMgYGNsdXN0ZXIgcmVnaXN0ZXJg" + + "LXNwZWNpZmljCgp8IEZsYWcgfCBQdXJwb3NlIHwgRGVmYXVsdCB8CnwtLS18LS0tfC0tLXwKfCBg" + + "LS1uYW1lIE5BTUVgIHwgQ2x1c3RlciBuYW1lIChyZXF1aXJlZCkgfCAtIHwKfCBgLS1uY2EtaWQg" + + "SURgIHwgTkNBIElEIChyZXF1aXJlZCkgfCAtIHwKfCBgLS1yZWdpb24gUkVHSU9OYCB8IFJlZ2lv" + + "biB8IGB1cy13ZXN0LTFgIHwKfCBgLS1pY21zLXVybCBVUkxgIHwgSUNNUyBlbmRwb2ludCB8IGZy" + + "b20gY29uZmlnIHwKfCBgLS1pZ25vcmUtZXhpc3RpbmdgIHwgTWF0Y2gtb3ItY3JlYXRlIGluc3Rl" + + "YWQgb2YgZmFpbC1vbi1leGlzdHMgfCBgZmFsc2VgIHwKCiMjIGBhcGkta2V5IGdlbmVyYXRlYC1z" + + "cGVjaWZpYwoKfCBGbGFnIHwgUHVycG9zZSB8IERlZmF1bHQgfAp8LS0tfC0tLXwtLS18CnwgYC0t" + + "Zm9yIGZ1bmN0aW9uXHx0YXNrYCB8IEdlbmVyYXRlIG9ubHkgdGhlIHNwZWNpZmllZCBrZXkgdHlw" + + "ZSB8IChvbWl0IHRvIGdlbmVyYXRlIGJvdGgpIHwKfCBgLS1kZXNjcmlwdGlvbiBURVhUYCB8IEh1" + + "bWFuLXJlYWRhYmxlIGxhYmVsIGZvciB0aGUga2V5IHwgYEdlbmVyYXRlZCBieSBudmNmLWNsaWAg" + + "fAp8IGAtLWV4cGlyZXMtaW4gRFVSQVRJT05gIHwgRXhwaXJ5IG9mZnNldCAoZS5nLiBgMjRoYCwg" + + "YDdkYCk7IHBhcnNlZCBhcyBleHRlbmRlZCBkdXJhdGlvbiB8IGAyNGhgIHwKfCBgLS1zY29wZXMg" + + "U0NPUEVbLFNDT1BFXWAgfCBPdmVycmlkZSBkZWZhdWx0IHNjb3BlczsgcmVxdWlyZXMgYC0tZm9y" + + "YCB8IChzZXJ2aWNlIGRlZmF1bHRzKSB8CnwgYC0tdmFsaWRhdGVgIHwgVmFsaWRhdGUgZWFjaCBn" + + "ZW5lcmF0ZWQga2V5IGltbWVkaWF0ZWx5IGFmdGVyIG1pbnRpbmcgfCBgZmFsc2VgIHwKCkV4dGVu" + + "ZGVkIGR1cmF0aW9uIHVuaXRzOiBgc2AgKHNlY29uZHMpLCBgbWAgKG1pbnV0ZXMpLCBgaGAgKGhv" + + "dXJzKSwgYGRgIChkYXlzKSwgYHdgICh3ZWVrcykuCgojIyBgZnVuY3Rpb24gY3JlYXRlYC1zcGVj" + + "aWZpYwoKYC0taW5wdXQtZmlsZSBGSUxFYCBpcyByZWNvbW1lbmRlZCBmb3IgcmVwZWF0YWJsZSBm" + + "dW5jdGlvbiBkZWZpbml0aW9ucy4gRm9yIGFkLWhvYyBjcmVhdGVzOgoKfCBGbGFnIHwgUHVycG9z" + + "ZSB8IERlZmF1bHQgfAp8LS0tfC0tLXwtLS18CnwgYC0tbmFtZSBOQU1FYCB8IEZ1bmN0aW9uIG5h" + + "bWUgfCAtIHwKfCBgLS1pbWFnZSBJTUFHRWAgfCBDb250YWluZXIgaW1hZ2UgfCAtIHwKfCBgLS1p" + + "bmZlcmVuY2UtdXJsIFVSSWAgfCBDb250YWluZXIgaW5mZXJlbmNlIGVuZHBvaW50IHwgLSB8Cnwg" + + "YC0taW5mZXJlbmNlLXBvcnQgUE9SVGAgfCBDb250YWluZXIgaW5mZXJlbmNlIHBvcnQgfCAtIHwK" + + "fCBgLS1mdW5jdGlvbi10eXBlIERFRkFVTFRcfFNUUkVBTUlOR1x8TExNYCB8IEZ1bmN0aW9uIHR5" + + "cGUgfCBgREVGQVVMVGAgfAp8IGAtLWhlbG0tY2hhcnQgQ0hBUlRgIHwgSGVsbSBjaGFydCBVUkwg" + + "b3IgT0NJIHJlZmVyZW5jZS4gQ2FuIGJlIHVzZWQgd2l0aCBgLS1mdW5jdGlvbi10eXBlPUxMTWAg" + + "Zm9yIGNoYXJ0LXBhY2thZ2VkIExMTSB3b3JrbG9hZHMuIHwgLSB8CnwgYC0taGVsbS1jaGFydC1z" + + "ZXJ2aWNlIE5BTUVgIHwgS3ViZXJuZXRlcyBTZXJ2aWNlIG5hbWUgZXhwb3NlZCBieSB0aGUgY2hh" + + "cnQuIFJlcXVpcmVkIHdoZW4gYC0taGVsbS1jaGFydGAgaXMgc2V0LiB8IC0gfAp8IGAtLW1vZGVs" + + "cyBOQU1FOlZFUlNJT046VVJJYCB8IFN0YW5kYXJkIG1vZGVsIGFydGlmYWN0OyByZXBlYXRhYmxl" + + "IHwgLSB8CnwgYC0tbGxtLW1vZGVsIFNQRUNgIHwgTExNIG1vZGVsIGNvbmZpZzsgZm9ybWF0IGBu" + + "YW1lPTxtb2RlbD4sdXJpcz08dXJpPlx8PHVyaT4scm91dGluZ01ldGhvZD08bWV0aG9kPix0b2tl" + + "blJhdGVMaW1pdD08bGltaXQ+YDsgcmVwZWF0YWJsZS4gVG9rZW4gbGltaXRzIHVzZSBgPHZhbHVl" + + "Pi08dW5pdD5gIHdpdGggYFNgLCBgTWAsIGBIYCwgYERgLCBvciBgV2AsIGZvciBleGFtcGxlIGAx" + + "MDAwLVNgLiBVc2UgaW5wdXQgSlNPTiBmb3IgY29tYmluZWQgdG9rZW4gbGltaXRzIGJlY2F1c2Ug" + + "aW5saW5lIHNwZWNzIHVzZSBjb21tYXMgYXMgZmllbGQgc2VwYXJhdG9ycy4gfCAtIHwKfCBgLS1s" + + "bG0tZGVmYXVsdC1wcmlvcml0eSBQUklPUklUWWAgfCBGdW5jdGlvbi1sZXZlbCBkZWZhdWx0IHJl" + + "cXVlc3QgcHJpb3JpdHkuIExvd2VyIHZhbHVlcyBoYXZlIGhpZ2hlciBwcmlvcml0eS4gfCAtIHwK" + + "fCBgLS1sbG0tcGVyLWFjY291bnQtcHJpb3JpdHkgTkNBLUlEOlBSSU9SSVRZYCB8IFBlci1hY2Nv" + + "dW50IHByaW9yaXR5IG92ZXJyaWRlOyByZXBlYXRhYmxlOyBzdXBwb3J0cyB1cCB0byA2NCBkaXN0" + + "aW5jdCBOQ0EgSUQgb3ZlcnJpZGVzLiBSZXF1aXJlcyBhIGRlZmF1bHQgcHJpb3JpdHkuIHwgLSB8" + + "CgpJbiBKU09OIGFuZCBpbmxpbmUgc3BlY3MsIExMTSBmdW5jdGlvbnMgc2V0IGBmdW5jdGlvblR5" + + "cGU6ICJMTE0iYCBhbmQgbW9kZWwgcm91dGluZyBtZXRhZGF0YSB1bmRlciBgbW9kZWxzW10ubGxt" + + "Q29uZmlnYC4gYGxsbUNvbmZpZy51cmlzYCBkZWNsYXJlcyB0aGUgT3BlbkFJLWNvbXBhdGlibGUg" + + "dXBzdHJlYW0gcGF0aHMgZXhwb3NlZCBieSB0aGUgbW9kZWwuIEN1cnJlbnQgc3VwcG9ydGVkIHBh" + + "dGhzIGFyZSBgL3YxL2NoYXQvY29tcGxldGlvbnNgLCBgL3YxL3Jlc3BvbnNlc2AsIGFuZCBgL3Yx" + + "L2VtYmVkZGluZ3NgLiBgbGxtQ29uZmlnLnJvdXRpbmdNZXRob2RgIGFjY2VwdHMgYHJvdW5kX3Jv" + + "YmluYCwgYHBvd2VyX29mX3R3b2AsIGBncm9xX211bHRpcmVnaW9uYCwgYHB1bHNhcmAsIG9yIGBy" + + "YW5kb21gLgpgbGxtQ29uZmlnLnRva2VuUmF0ZUxpbWl0YCBhY2NlcHRzIG9uZSBvciBtb3JlIGNv" + + "bW1hLXNlcGFyYXRlZCBwb3NpdGl2ZSBpbnRlZ2VyIHRva2VuIGxpbWl0cyBpbiBgPHZhbHVlPi08" + + "dW5pdD5gIGZvcm1hdC4gU3VwcG9ydGVkIHVuaXRzIGFyZSBgU2AgKHNlY29uZHMpLCBgTWAgKG1p" + + "bnV0ZXMpLCBgSGAgKGhvdXJzKSwgYERgIChkYXlzKSwgYW5kIGBXYCAod2Vla3MpLiBVc2UgZGlz" + + "dGluY3QgdW5pdHMgd2hlbiBjb21iaW5pbmcgbGltaXRzLCBmb3IgZXhhbXBsZSBgMTAwMC1TLDUw" + + "MDAtTSwxMDAwMDAtSCw1MDAwMDAtRCwxMDAwMDAwLVdgIGluIGlucHV0IEpTT04uCgpIZWxtIGNo" + + "YXJ0IHBhY2thZ2luZyBpcyBpbmRlcGVuZGVudCBvZiBgZnVuY3Rpb25UeXBlYC4gRm9yIGEgSGVs" + + "bS1jaGFydCBiYWNrZWQgTExNIGZ1bmN0aW9uLCBzZXQgYGZ1bmN0aW9uVHlwZTogIkxMTSJgLCBg" + + "aGVsbUNoYXJ0YCwgYGhlbG1DaGFydFNlcnZpY2VOYW1lYCwgYW5kIGBtb2RlbHNbXS5sbG1Db25m" + + "aWdgIGluIHRoZSBzYW1lIGNyZWF0ZSByZXF1ZXN0LiBgaW5mZXJlbmNlUG9ydGAgbXVzdCBiZSB0" + + "aGUgS3ViZXJuZXRlcyBTZXJ2aWNlIHBvcnQgZXhwb3NlZCBieSBgaGVsbUNoYXJ0U2VydmljZU5h" + + "bWVgLgoKTExNIGludm9jYXRpb24gcmVxdWVzdHMgdXNlIGBtb2RlbDogIjxmdW5jdGlvbi1pZD4v" + + "PG1vZGVsLW5hbWU+ImAuIFRoZSBmdW5jdGlvbiBJRCBzZWxlY3RzIHRoZSBOVkNGIGZ1bmN0aW9u" + + "LCBhbmQgdGhlIG1vZGVsIG5hbWUgaXMgZm9yd2FyZGVkIHVwc3RyZWFtLiBDaGF0IGNvbXBsZXRp" + + "b25zIGFuZCBSZXNwb25zZXMgQVBJIHJlcXVlc3RzIGNhbiB1c2UgYHgtbXVsdGktdHVybi1zZXNz" + + "aW9uLWlkYCBmb3Igc2Vzc2lvbiBzdGlja2luZXNzOyBlbWJlZGRpbmdzIHJlcXVlc3RzIGRvIG5v" + + "dC4KCiMjIGBmdW5jdGlvbiB1cGRhdGVgLXNwZWNpZmljCgp8IEZsYWcgfCBQdXJwb3NlIHwgRGVm" + + "YXVsdCB8CnwtLS18LS0tfC0tLXwKfCBgLS10YWdzIFRBR1ssVEFHXWAgfCBSZXBsYWNlIGZ1bmN0" + + "aW9uIHRhZ3MgfCAtIHwKfCBgLS1sbG0tbW9kZWwtdXBkYXRlIFNQRUNgIHwgTExNIG1vZGVsIHVw" + + "ZGF0ZTsgZm9ybWF0IGBuYW1lPTxtb2RlbD4scm91dGluZ01ldGhvZD08bWV0aG9kPix0b2tlblJh" + + "dGVMaW1pdD08bGltaXQ+YDsgcmVwZWF0YWJsZS4gUm91dGluZyBtZXRob2RzIG1hdGNoIGAtLWxs" + + "bS1tb2RlbGAuIFRva2VuIGxpbWl0IGV4YW1wbGU6IGAxMDAwLVNgLiBVc2UgaW5wdXQgSlNPTiBm" + + "b3IgY29tYmluZWQgdG9rZW4gbGltaXRzLiB8IC0gfAp8IGAtLWxsbS1kZWZhdWx0LXByaW9yaXR5" + + "IFBSSU9SSVRZYCB8IFJlcGxhY2UgdGhlIGZ1bmN0aW9uLWxldmVsIHByaW9yaXR5IGNvbmZpZ3Vy" + + "YXRpb24gd2l0aCB0aGlzIGRlZmF1bHQgYW5kIGFueSBzdXBwbGllZCBwZXItYWNjb3VudCBvdmVy" + + "cmlkZXMuIHwgLSB8CnwgYC0tbGxtLXBlci1hY2NvdW50LXByaW9yaXR5IE5DQS1JRDpQUklPUklU" + + "WWAgfCBQZXItYWNjb3VudCBwcmlvcml0eSBvdmVycmlkZTsgcmVwZWF0YWJsZTsgc3VwcG9ydHMg" + + "dXAgdG8gNjQgZGlzdGluY3QgTkNBIElEIG92ZXJyaWRlcy4gUmVxdWlyZXMgYSBkZWZhdWx0IHBy" + + "aW9yaXR5LiB8IC0gfAoKSW4gSlNPTiwgYGZ1bmN0aW9uIHVwZGF0ZWAgYWNjZXB0cyBgbW9kZWxV" + + "cGRhdGVzW11gIGVudHJpZXMgd2l0aCBgbW9kZWxOYW1lYCBhbmQgYGxsbUNvbmZpZy5yb3V0aW5n" + + "TWV0aG9kYCBhbmQvb3IgYGxsbUNvbmZpZy50b2tlblJhdGVMaW1pdGAuIGB1cmlzYCBhcmUgY3Jl" + + "YXRlLXRpbWUgbW9kZWwgbWV0YWRhdGEgYW5kIGFyZSBub3QgcGFydCBvZiBtb2RlbCB1cGRhdGVz" + + "LgoKIyMgYGZ1bmN0aW9uIGRlcGxveSBjcmVhdGVgLXNwZWNpZmljCgpgLS1pbnB1dC1maWxlIEZJ" + + "TEVgIGlzIHJlY29tbWVuZGVkIChmdWxsIEpTT04gc3BlYykuIEZvciBhZC1ob2Mgb25lLXNob3Qg" + + "dXNlOgoKfCBGbGFnIHwgUHVycG9zZSB8IERlZmF1bHQgfAp8LS0tfC0tLXwtLS18CnwgYC0tZnVu" + + "Y3Rpb24taWQgSURgIHwgRnVuY3Rpb24gSUQgKHJlcXVpcmVkKSB8IC0gfAp8IGAtLWdwdSBOQU1F" + + "YCB8IEdQVSBmYW1pbHkgfCBgSDEwMGAgfAp8IGAtLWluc3RhbmNlLXR5cGUgVFlQRWAgfCBTS1Ug" + + "fCBgTkNQLkdQVS5IMTAwXzF4YCB8CnwgYC0tbWluLWluc3RhbmNlcyBOYCB8IE1pbiByZXBsaWNh" + + "cyB8IGAxYCB8CnwgYC0tbWF4LWluc3RhbmNlcyBOYCB8IE1heCByZXBsaWNhcyB8IGAxYCB8Cnwg" + + "YC0tbWF4LXJlcXVlc3QtY29uY3VycmVuY3kgTmAgfCBDb25jdXJyZW5jeSB8IGAwYCAodW5zZXQ7" + + "IHNlcnZlciBkZWZhdWx0IGFwcGxpZXMpIHwKfCBgLS1jbHVzdGVycyBOQU1FWyxOQU1FXWAgfCBU" + + "YXJnZXQgc3BlY2lmaWMgY29tcHV0ZSBjbHVzdGVycyB8IChhbnkgbWF0Y2hpbmcgU0tVKSB8Cgoj" + + "IyBgdGFzayBjcmVhdGVgLXNwZWNpZmljCgpgLS1pbnB1dC1maWxlIEZJTEVgIGlzIHJlY29tbWVu" + + "ZGVkIGZvciByZXBlYXRhYmxlIHRhc2sgZGVmaW5pdGlvbnMuIEZvciBhZC1ob2MgdXNlOgoKfCBG" + + "bGFnIHwgUHVycG9zZSB8IE5vdGVzIHwKfC0tLXwtLS18LS0tfAp8IGAtLW5hbWUgTkFNRWAgfCBU" + + "YXNrIG5hbWUgKHJlcXVpcmVkKSB8IDEtMTI4IGNoYXJzLCBgXlthLXowLTlBLVpdW2EtejAtOUEt" + + "WlwtX10qJGAgfAp8IGAtLWdwdSBHUFVgIHwgR1BVIG5hbWUgKHJlcXVpcmVkIHdpdGhvdXQgYC0t" + + "aW5wdXQtZmlsZWApIHwgRXhhbXBsZTogYEgxMDBgIHwKfCBgLS1pbnN0YW5jZS10eXBlIFRZUEVg" + + "IHwgSW5zdGFuY2UgdHlwZSAocmVxdWlyZWQgd2l0aG91dCBgLS1pbnB1dC1maWxlYCkgfCBFeGFt" + + "cGxlOiBgTkNQLkdQVS5IMTAwXzF4YCB8CnwgYC0taW1hZ2UgSU1BR0VgIHwgQ29udGFpbmVyIGlt" + + "YWdlIHwgTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYC0taGVsbS1jaGFydGAgfAp8IGAtLWhlbG0t" + + "Y2hhcnQgQ0hBUlRgIHwgSGVsbSBjaGFydCBVUkwgb3IgT0NJIHJlZmVyZW5jZSB8IE11dHVhbGx5" + + "IGV4Y2x1c2l2ZSB3aXRoIGAtLWltYWdlYCB8CnwgYC0taW5wdXQtZmlsZSBGSUxFYCB8IEpTT04g" + + "dGFzayBzcGVjIGZpbGUgfCBDTEkgZmxhZ3Mgb3ZlcnJpZGUgSlNPTiB2YWx1ZXMgd2hlbiBib3Ro" + + "IGFyZSBzZXQgfAp8IGAtLWJhY2tlbmQgQkFDS0VORGAgfCBCYWNrZW5kIC8gQ1NQIHwgLSB8Cnwg" + + "YC0tY2x1c3RlcnMgTkFNRVssTkFNRV1gIHwgU3BlY2lmaWMgY2x1c3RlcnMgd2l0aGluIHRoZSBp" + + "bnN0YW5jZSB8IENvbW1hLXNlcGFyYXRlZCB8CnwgYC0tY29udGFpbmVyLWFyZ3MgQVJHU2AgfCBB" + + "cmdzIHBhc3NlZCB3aGVuIGxhdW5jaGluZyB0aGUgY29udGFpbmVyIHwgU2luZ2xlIHN0cmluZywg" + + "ZS5nLiBgIi0tZXBvY2hzIDEwIC0tYmF0Y2gtc2l6ZSAzMiJgIHwKfCBgLS1jb250YWluZXItZW52" + + "IE5BTUU9dmFsdWVgIHwgQ29udGFpbmVyIGVudmlyb25tZW50IHZhcmlhYmxlOyByZXBlYXRhYmxl" + + "IHwgLSB8CnwgYC0tc2VjcmV0cyBOQU1FPXZhbHVlYCB8IFNlY3JldCBlbnZpcm9ubWVudCB2YXJp" + + "YWJsZTsgcmVwZWF0YWJsZTsgZW5jcnlwdGVkIGF0IHJlc3QgfCAtIHwKfCBgLS1tYXgtcnVudGlt" + + "ZSBEVVJBVElPTmAgfCBNYXggd2FsbC1jbG9jayBydW4gdGltZSAoSVNPIDg2MDEsIGUuZy4gYFBU" + + "NEhgKSB8IE5vIGRlZmF1bHQ7IG9taXQgZm9yIG5vIHRpbWUgbGltaXQgfAp8IGAtLW1heC1xdWV1" + + "ZWQgRFVSQVRJT05gIHwgTWF4IHRpbWUgaW4gcXVldWUgYmVmb3JlIGNhbmNlbGxhdGlvbiAoSVNP" + + "IDg2MDEpIHwgU2VydmVyIGRlZmF1bHQgYFBUNzJIYCB8CnwgYC0tdGVybWluYXRpb24tZ3JhY2Ug" + + "RFVSQVRJT05gIHwgR3JhY2UgcGVyaW9kIGFmdGVyIHN0b3Agc2lnbmFsIChJU08gODYwMSkgfCBT" + + "ZXJ2ZXIgZGVmYXVsdCBgUFQxSGAgfAp8IGAtLXJlc3VsdC1zdHJhdGVneSBVUExPQURcfE5PTkVg" + + "IHwgSG93IHRvIGhhbmRsZSB0YXNrIG91dHB1dCBhcnRpZmFjdHMgfCAtIHwKfCBgLS1yZXN1bHRz" + + "LWxvY2F0aW9uIExPQ0FUSU9OYCB8IFJlc3VsdCB1cGxvYWQgdGFyZ2V0LCBmb3JtYXQgYG9yZy1u" + + "YW1lL1t0ZWFtLW5hbWUvXW1vZGVsLW5hbWVgOyByZXF1aXJlZCB3aGVuIGAtLXJlc3VsdC1zdHJh" + + "dGVneT1VUExPQURgIHwgLSB8CnwgYC0tbW9kZWxzIE5BTUU6VkVSU0lPTjpVUklgIHwgTW9kZWwg" + + "YXJ0aWZhY3Q7IHJlcGVhdGFibGUgfCAtIHwKfCBgLS1yZXNvdXJjZXMgTkFNRTpWRVJTSU9OOlVS" + + "SWAgfCBSZXNvdXJjZSBhcnRpZmFjdDsgcmVwZWF0YWJsZSB8IC0gfAp8IGAtLXRhZ3MgVEFHWyxU" + + "QUddYCB8IFRhc2sgdGFncyB8IENvbW1hLXNlcGFyYXRlZCB8CnwgYC0tZGVzY3JpcHRpb24gVEVY" + + "VGAgfCBUYXNrIGRlc2NyaXB0aW9uIHwgLSB8CnwgYC0tbG9ncy10ZWxlbWV0cnktaWQgVVVJRGAg" + + "fCBMb2dzIHRlbGVtZXRyeSBlbmRwb2ludCBJRCB8IC0gfAp8IGAtLW1ldHJpY3MtdGVsZW1ldHJ5" + + "LWlkIFVVSURgIHwgTWV0cmljcyB0ZWxlbWV0cnkgZW5kcG9pbnQgSUQgfCAtIHwKfCBgLS10cmFj" + + "ZXMtdGVsZW1ldHJ5LWlkIFVVSURgIHwgVHJhY2VzIHRlbGVtZXRyeSBlbmRwb2ludCBJRCB8IC0g" + + "fApQSwcImdDiUBcuAAAXLgAAUEsDBBQACAAAAAAAIQAAAAAAAAAAAAAAAAA3AAkAZGF0YS9udmNm" + + "LXNlbGYtbWFuYWdlZC1jbGkvcmVmZXJlbmNlL3Ryb3VibGVzaG9vdGluZy5tZFVUBQABAKbOEiMg" + + "VHJvdWJsZXNob290aW5nCgpLbm93biBlcnJvcnMg4oaSIGRpYWdub3N0aWMgY29tbWFuZCDihpIg" + + "cmVtZWRpYXRpb24uIEtlZXAgaW4gc3luYyB3aXRoIHRoZSBzdHJ1Y3R1cmVkIGBwaGFzZV9mYWls" + + "ZWRgIGV2ZW50cyB0aGUgQ0xJIGVtaXRzIChSRVEtMTUpIOKAlCBldmVyeSBlbnRyeSBiZWxvdyBz" + + "aG91bGQgbWFwIHRvIGFuIGBlcnJDYXRlZ29yeWAgYW5kIGEgYHJlbWVkaWF0aW9uYCBhcnJheS4K" + + "CiMjIFByZS1mbGlnaHQKCnwgU3ltcHRvbSB8IENhdXNlIHwgUmVtZWRpYXRpb24gfAp8LS0tfC0t" + + "LXwtLS18CnwgYGt1YmVjdGwgbm90IG9uIFBBVEhgIHwgT3BlcmF0b3IncyBgJFBBVEhgIGRvZXNu" + + "J3QgaW5jbHVkZSBrdWJlY3RsIHwgSW5zdGFsbCBrdWJlY3RsIDEuMjgrOiBodHRwczovL2t1YmVy" + + "bmV0ZXMuaW8vZG9jcy90YXNrcy90b29scy9pbnN0YWxsLWt1YmVjdGwvIHwKfCBgaGVsbWZpbGUg" + + "bm90IG9uIFBBVEhgIHwgU2FtZSB8IGh0dHBzOi8vZ2l0aHViLmNvbS9oZWxtZmlsZS9oZWxtZmls" + + "ZSNpbnN0YWxsYXRpb24gfAp8IGBoZWxtIG5vdCBvbiBQQVRIYCB8IFNhbWUgfCBodHRwczovL2hl" + + "bG0uc2gvZG9jcy9pbnRyby9pbnN0YWxsLyB8CnwgYEdhdGV3YXkgQVBJIENSRHMgbm90IGluc3Rh" + + "bGxlZGAgfCBlbnZveS1nYXRld2F5IHByZXJlcSBtaXNzaW5nIHwgYGhlbG0gaW5zdGFsbCBlZyBv" + + "Y2k6Ly9kb2NrZXIuaW8vZW52b3lwcm94eS9nYXRld2F5LWhlbG0gLS1uYW1lc3BhY2U9ZW52b3kt" + + "Z2F0ZXdheS1zeXN0ZW0gLS1jcmVhdGUtbmFtZXNwYWNlYCB8CnwgYGRlZmF1bHQgU3RvcmFnZUNs" + + "YXNzIG5vdCBhdmFpbGFibGVgIHwgQ2x1c3RlciBoYXMgbm8gZGVmYXVsdCBTQyB8IEFubm90YXRl" + + "IG9uZTogYGt1YmVjdGwgcGF0Y2ggc2MgPG5hbWU+IC1wICd7Im1ldGFkYXRhIjp7ImFubm90YXRp" + + "b25zIjp7InN0b3JhZ2VjbGFzcy5rdWJlcm5ldGVzLmlvL2lzLWRlZmF1bHQtY2xhc3MiOiJ0cnVl" + + "In19fSdgIHwKfCBgR1BVIG9wZXJhdG9yIG5vdCBpbnN0YWxsZWRgIChjb21wdXRlLXBsYW5lKSB8" + + "IG52aWRpYSBHUFUgb3BlcmF0b3IgbWlzc2luZyB8IEluc3RhbGwgcGVyIGh0dHBzOi8vZG9jcy5u" + + "dmlkaWEuY29tL2RhdGFjZW50ZXIvY2xvdWQtbmF0aXZlL2dwdS1vcGVyYXRvci9sYXRlc3QvaW5z" + + "dGFsbC1ncHUtb3BlcmF0b3IuaHRtbCwgT1IgdXNlIGBmYWtlLWdwdS1vcGVyYXRvcmAgZm9yIGRl" + + "diB8CnwgYEdQVSBub2RlIGxhYmVscyBtaXNzaW5nYCAoY29tcHV0ZS1wbGFuZSkgfCBOb2RlcyBu" + + "ZWVkIGBudmlkaWEuY29tL2dwdS5mYW1pbHlgIGV0Yy4gfCBTZXQgYC0tazNzLW5vZGUtbGFiZWwg" + + "bnZpZGlhLmNvbS9ncHUuZmFtaWx5PWhvcHBlckBhZ2VudDpOYCBmb3IgazNkIHwKCiMjIEF1dGgK" + + "CnwgU3ltcHRvbSB8IENhdXNlIHwgUmVtZWRpYXRpb24gfAp8LS0tfC0tLXwtLS18CnwgYGFkbWlu" + + "IHRva2VuIHJlcXVpcmVkYCAoaW5pdCBub3QgcnVuKSB8IE5vIGB+Ly5udmNmLWNsaS5zdGF0ZWAg" + + "YW5kIGAtLXRva2VuYCBub3QgcGFzc2VkIHwgYG52Y2YtY2xpIGluaXRgIChpbnRlcmFjdGl2ZSkg" + + "b3IgYC0tdG9rZW49JEpXVCAtLW5vbi1pbnRlcmFjdGl2ZWAgKENJKSB8CnwgYFNpZ25lZCBKV1Qg" + + "cmVqZWN0ZWQ6IEFub3RoZXIgYWxnb3JpdGhtIGV4cGVjdGVkLCBvciBubyBtYXRjaGluZyBrZXko" + + "cykgZm91bmRgIHwgU3RhbGUgc2Vzc2lvbi5qc29uIGZyb20gYSBkaWZmZXJlbnQgY29udHJvbCBw" + + "bGFuZSB8IGBybSB+Ly5udmNmLWNsaS5zdGF0ZWAgdGhlbiBgbnZjZi1jbGkgaW5pdGAgYWdhaW4g" + + "fAp8IGA0MDMgbWlzc2luZyByZXF1ZXN0ZWQgYXV0aG9yaXRpZXNgIChmdW5jdGlvbiBpbnZva2Up" + + "IHwgQWRtaW4gdG9rZW4gZG9lc24ndCBoYXZlIGBpbnZva2VfZnVuY3Rpb25gIHNjb3BlIHwgYG52" + + "Y2YtY2xpIGFwaS1rZXkgZ2VuZXJhdGUgLS1kZXNjcmlwdGlvbj3igKZgIHRoZW4gcmUtcnVuIGlu" + + "dm9rZSB8CgojIyBJbnN0YWxsIC8gYHVwYAoKfCBTeW1wdG9tIHwgQ2F1c2UgfCBSZW1lZGlhdGlv" + + "biB8CnwtLS18LS0tfC0tLXwKfCBIZWxtIGB0aW1lZCBvdXQgd2FpdGluZyBmb3IgY2Fzc2FuZHJh" + + "YCB8IENhc3NhbmRyYSBTdGF0ZWZ1bFNldCBQVkMgc3R1Y2sgYFBlbmRpbmdgIHwgQ29uZmlybSBk" + + "ZWZhdWx0IFN0b3JhZ2VDbGFzczsgY2hlY2sgYGt1YmVjdGwgZ2V0IHB2LHB2YyAtbiBjYXNzYW5k" + + "cmEtc3lzdGVtYCB8CnwgYEludmFsaWQgR1BVICdOQ1AuR1BVLkgxMDAnIHNwZWNpZmllZGAgKGZ1" + + "bmN0aW9uIGRlcGxveSkgfCBXcm9uZyBmaWVsZCDigJQgYGdwdWAgaXMgdGhlIGZhbWlseSwgbm90" + + "IHRoZSBTS1UgfCBVc2UgYCJncHUiOiAiSDEwMCJgLCBgImluc3RhbmNlVHlwZSI6ICJOQ1AuR1BV" + + "LkgxMDBfMXgiYCB8CnwgYHJlZ2lvbiBtdXN0IGJlIHByb3ZpZGVkYCAoY2x1c3RlciByZWdpc3Rl" + + "ciAvIGluc3RhbGwgLS1jb21wdXRlLXBsYW5lKSB8IGAtLXJlZ2lvbmAgZW1wdHkgKyBgQ0xVU1RF" + + "Ul9SRUdJT05gIGVudiBlbXB0eSB8IFBhc3MgYC0tcmVnaW9uPXVzLXdlc3QtMWAgKG9yIGFueSBu" + + "b24tZW1wdHkgdmFsdWUpIHwKfCBgcmVxdWlyZWRFbnYgIk5DQV9JRCIgaXMgbm90IHNldGAgKGhl" + + "bG1maWxlIGVycm9yIGR1cmluZyBjb21wdXRlLXBsYW5lIGFwcGx5KSB8IE9sZGVyIG52Y2YtY2xp" + + "IGJlZm9yZSBjb21taXQgYDZhYTU3MDRgOyBFeHRyYUVudiBub3QgcHJvcGFnYXRpbmcgTkNBX0lE" + + "IHwgVXBncmFkZSBgbnZjZi1jbGlgIHRvIGEgcmVsZWFzZSBhZnRlciBgNmFhNTcwNGAgfAp8IGBu" + + "dmNhLW9wZXJhdG9yOiBJbWFnZVB1bGxCYWNrT2ZmYCBmb3IgYG52Y2Etb3BlcmF0b3I6cHNhdGAg" + + "fCBJbWFnZSBub3QgaW4gY2x1c3RlciByZWdpc3RyeTsgbXVsdGktY2x1c3RlciBidWlsZCBpcyBs" + + "b2NhbCB8IGBrM2QgaW1hZ2UgaW1wb3J0IG52Y3IuaW8vLi4uL252Y2Etb3BlcmF0b3I6cHNhdCAt" + + "YyA8Y2x1c3Rlcj5gIHwKCiMjIENvbXB1dGUtcGxhbmUgcnVudGltZQoKfCBTeW1wdG9tIHwgQ2F1" + + "c2UgfCBSZW1lZGlhdGlvbiB8CnwtLS18LS0tfC0tLXwKfCBOVkNBIGFnZW50IENyYXNoTG9vcEJh" + + "Y2tPZmYgd2l0aCBgSFRUUCA0MDFgIG9uIGAvdjEvbnZjYS9jbHVzdGVycy8uLi4vcmVnaXN0ZXJg" + + "IHwgU3RhbGUgYG91dC88Y2x1c3Rlcj4tcmVnaXN0ZXItdmFsdWVzLnlhbWxgIGZyb20gcHJpb3Ig" + + "cmVnaXN0ZXI7IGNsdXN0ZXIgSUQgZG9lc24ndCBtYXRjaCBJQ01TIHwgRGVsZXRlIHRoZSBzdGFs" + + "ZSBmaWxlOyByZS1ydW4gYG52Y2YtY2xpIHNlbGYtaG9zdGVkIHVwYCAoaWRlbXBvdGVudCByZWdp" + + "c3RlciB3cml0ZXMgYSBmcmVzaCBmaWxlKSB8CnwgYE5vIGNsdXN0ZXIgZm91bmQgd2l0aCB2YWxp" + + "ZCBKV0tTIGZvciBjbHVzdGVyIElEOiA8aWQ+YCAoSUNNUyBsb2cpIHwgSldLUyBpbiBJQ01TIGRv" + + "ZXNuJ3QgbWF0Y2ggd2hhdCBjb21wdXRlLXBsYW5lIEs4cyBpcyBjdXJyZW50bHkgc2lnbmluZyB8" + + "IGBudmNmLWNsaSBjbHVzdGVyIHJvdGF0ZSAtLWNsdXN0ZXItaWQ9PGlkPmAgfAp8IEZ1bmN0aW9u" + + "IHBvZCBgSW1hZ2VQdWxsQmFja09mZmAgaW4gYG52Y2YtYmFja2VuZGAgfCBJbWFnZS1jcmVkZW50" + + "aWFsLWhlbHBlciBjb25maWcgbWlzc2luZyBvciB3cm9uZyB8IGBrdWJlY3RsIGRlc2NyaWJlIHBv" + + "ZCAtbiBudmNmLWJhY2tlbmQgPHBvZD5gOyBjaGVjayB0aGUgcHVsbCBzZWNyZXQgY29uZmlnIHwK" + + "fCBGdW5jdGlvbiBkZXBsb3kgc3R1Y2sgYERFUExPWUlOR2AgZm9yID41IG1pbiB8IE5BVFMgc3Ry" + + "ZWFtIGluaXQgbGFnIChjb2xkLWNsdXN0ZXIpIOKAlCB3YWl0LCBvciBjaGVjayBOQVRTIGF1dGgt" + + "Y2FsbG91dCBoZWFsdGggfCBga3ViZWN0bCBsb2dzIC1uIG5hdHMtc3lzdGVtIC1sIGFwcC5rdWJl" + + "cm5ldGVzLmlvL25hbWU9bmF0cy1hdXRoLWNhbGxvdXQtc2VydmljZWAgfAoKIyMgVGFza3MKCnwg" + + "U3ltcHRvbSB8IENhdXNlIHwgUmVtZWRpYXRpb24gfAp8LS0tfC0tLXwtLS18CnwgYHRhc2sgY3Jl" + + "YXRlYCByZXR1cm5zIGBNaXNzaW5nIDxUWVBFPiByZWdpc3RyeSBjcmVkZW50aWFsIGZvciBob3N0" + + "bmFtZWAsIG9yIGtlZXBzIHVzaW5nIGEgcHJldmlvdXMgY3JlZGVudGlhbCB2YWx1ZSwgc2hvcnRs" + + "eSBhZnRlciBgcmVnaXN0cnktY3JlZGVudGlhbCBhZGQvdXBkYXRlL2RlbGV0ZWAgd2hpbGUgYHJl" + + "Z2lzdHJ5LWNyZWRlbnRpYWwgbGlzdGAvYGdldGAgYWxyZWFkeSBzaG93IHRoZSBuZXcgdmFsdWUg" + + "fCBFeHBlY3RlZCBwcm9wYWdhdGlvbiBkZWxheTogTlZDVCBjYWNoZXMgdGhlIGFjY291bnQncyBy" + + "ZWdpc3RyeSBjcmVkZW50aWFscyB3aXRoIGBudmN0Lm52Y2YuY2FjaGUtdHRsYCAoZGVmYXVsdCBg" + + "UFQ1TWAsIGFib3V0IDUgbWluKSBhbmQgYXBwbGllcyB0aGUgY2hhbmdlIHdoZW4gdGhhdCBjYWNo" + + "ZWQgY29weSByZWZyZXNoZXMgfCBXYWl0IHVwIHRvIGFib3V0IDUgbWluIGFuZCByZXRyeSwgb3Ig" + + "YGt1YmVjdGwgLW4gbnZjZiByb2xsb3V0IHJlc3RhcnQgZGVwbG95bWVudC9udmN0LWFwaWAgdG8g" + + "YXBwbHkgaW1tZWRpYXRlbHkgfApQSwcI864ThHQRAAB0EQAAUEsDBBQACAAAAAAAIQAAAAAAAAAA" + + "AAAAAAAsAAkAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24vU0tJTEwubWRVVAUA" + + "AQCmzhItLS0KbmFtZTogbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uCmRlc2NyaXB0aW9u" + + "OiA+LQogIEluc3RhbGwgYW5kIG9wZXJhdGUgTlZDRiBzZWxmLWhvc3RlZCBjb250cm9sLXBsYW5l" + + "IGFuZCBzZXBhcmF0ZSBjb21wdXRlLXBsYW5lCiAgc3RhY2tzLiBDb3ZlcnMgSGVsbWZpbGUgdmFs" + + "dWVzIGFuZCBDTEkgcHJvZmlsZSBpbnN0YWxsYXRpb24gZmxvd3MsIHRlYXJkb3duLAogIHZhbHVl" + + "cyBvdmVycmlkZXMsIHB1bGwgc2VjcmV0cywgYW5kIHRyb3VibGVzaG9vdGluZy4gVXNlIGZvcgog" + + "IG52Y2Ytc2VsZi1tYW5hZ2VkLXN0YWNrLCBudmNmLWNvbXB1dGUtcGxhbmUtc3RhY2ssIHNwbGl0" + + "IGNvbXB1dGUtcGxhbmUKICBpbnN0YWxsYXRpb24sIGNvbnRyb2wtcGxhbmUgaW5zdGFsbGF0aW9u" + + "LCBDTEktZ2VuZXJhdGVkIGNvbnRyb2wtcGxhbmUKICBwcm9maWxlcywgSGVsbWZpbGUsIHNlbGYt" + + "bWFuYWdlZCwgb3Igc2VsZi1ob3N0ZWQgZGVwbG95bWVudHMuIERvIE5PVCB1c2UgZm9yCiAgbG9j" + + "YWwgazNkIGVudmlyb25tZW50czsgdXNlIHRoZSBsb2NhbCBrM2QgZGV2ZWxvcG1lbnQgd29ya2Zs" + + "b3cgaW5zdGVhZC4KbGljZW5zZTogQXBhY2hlLTIuMApjb21wYXRpYmlsaXR5OiBSZXF1aXJlcyBo" + + "ZWxtZmlsZSA+PSAxLjEuMCA8IDEuMi4wLCBoZWxtID49IDMuMTIsIGhlbG0tZGlmZiBwbHVnaW4s" + + "IGt1YmVjdGwgbWF0Y2hpbmcgY2x1c3RlciB2ZXJzaW9uCmF1dGhvcjogIm52Y2YtY29yZS1lbmcg" + + "PG52Y2YtY29yZS1lbmdAZXhjaGFuZ2UubnZpZGlhLmNvbT4iCnZlcnNpb246ICIxLjAuMCIKdGFn" + + "czogW252Y2YsIHNlbGYtbWFuYWdlZCwgaGVsbWZpbGUsIHNlbGYtaG9zdGVkLCBjb250cm9sLXBs" + + "YW5lLCBjb21wdXRlLXBsYW5lLCBjbGktcHJvZmlsZSwgaW5zdGFsbGF0aW9uLCBkZXBsb3ltZW50" + + "LCBwdWxsLXNlY3JldHNdCnRvb2xzOiBbU2hlbGwsIFJlYWQsIEVkaXQsIEdyZXAsIEdsb2JdCm1l" + + "dGFkYXRhOgogIGludGVybmFsOiBmYWxzZQogIGF1dGhvcjogIm52Y2YtY29yZS1lbmcgPG52Y2Yt" + + "Y29yZS1lbmdAZXhjaGFuZ2UubnZpZGlhLmNvbT4iCiAgdmVyc2lvbjogIjEuMCIKICB0YWdzOiBb" + + "bnZjZiwgc2VsZi1tYW5hZ2VkLCBoZWxtZmlsZSwgc2VsZi1ob3N0ZWQsIGNvbnRyb2wtcGxhbmUs" + + "IGNvbXB1dGUtcGxhbmUsIGNsaS1wcm9maWxlLCBpbnN0YWxsYXRpb24sIGRlcGxveW1lbnQsIHB1" + + "bGwtc2VjcmV0c10KICBsYW5ndWFnZXM6IFtiYXNoLCB5YW1sXQogIGZyYW1ld29ya3M6IFtoZWxt" + + "ZmlsZSwgaGVsbSwga3ViZWN0bF0KICBkb21haW46IGNsb3VkLWluZnJhc3RydWN0dXJlCi0tLQoK" + + "IyBOVkNGIFNlbGYtTWFuYWdlZCBTdGFjayBPcGVyYXRpb25zCgpPcGVyYXRpb25hbCBndWlkZSBm" + + "b3IgbWF0Y2hpbmcgTlZDRiBjb250cm9sLXBsYW5lIGFuZCBjb21wdXRlLXBsYW5lIEhlbG1maWxl" + + "IGJ1bmRsZXMuCgojIyBJbnN0cnVjdGlvbnMKClVzZSB0aGlzIHNraWxsIGZvciBpbnN0YWxsLCB1" + + "cGdyYWRlLCBvciB0ZWFyZG93biB3b3JrIGluIG1hdGNoaW5nIGBudmNmLXNlbGYtbWFuYWdlZC1z" + + "dGFja2AgYW5kIGBudmNmLWNvbXB1dGUtcGxhbmUtc3RhY2tgIGJ1bmRsZXM7IGtlZXAgSGVsbWZp" + + "bGUgdmFsdWVzIGFuZCBDTEkgcHJvZmlsZSBoYW5kb2ZmcyBzZXBhcmF0ZS4gRm9yIGBmdW5jdGlv" + + "blR5cGU6ICJMTE0iYCwgcmVhZCBbTExNIEZ1bmN0aW9uIEVuYWJsZW1lbnRdKHJlZmVyZW5jZXMv" + + "aGVsbWZpbGUtc3RydWN0dXJlLm1kI2xsbS1mdW5jdGlvbi1lbmFibGVtZW50KS4KCiMjIFByZXJl" + + "cXVpc2l0ZXMKCkFzayBmb3IgdGhlIGV4dHJhY3RlZCBgbnZjZi1zZWxmLW1hbmFnZWQtc3RhY2tg" + + "IHBhdGguIEZvciBzcGxpdCBpbnN0YWxsYXRpb24sCmFsc28gcmVxdWlyZSB0aGUgbWF0Y2hpbmct" + + "dmVyc2lvbiBgbnZjZi1jb21wdXRlLXBsYW5lLXN0YWNrYCBwYXRoLiBWZXJpZnkgYm90aDoKCmBg" + + "YGJhc2gKbHMgPGNvbnRyb2wtcGxhbmUtc3RhY2s+L2hlbG1maWxlLmQvIDxjb250cm9sLXBsYW5l" + + "LXN0YWNrPi9lbnZpcm9ubWVudHMvIDxjb250cm9sLXBsYW5lLXN0YWNrPi9zZWNyZXRzLyA8Y29u" + + "dHJvbC1wbGFuZS1zdGFjaz4vZ2xvYmFsLnlhbWwuZ290bXBsCmxzIDxjb21wdXRlLXBsYW5lLXN0" + + "YWNrPi9oZWxtZmlsZS5kLyA8Y29tcHV0ZS1wbGFuZS1zdGFjaz4vZW52aXJvbm1lbnRzLyA8Y29t" + + "cHV0ZS1wbGFuZS1zdGFjaz4vZ2xvYmFsLnlhbWwuZ290bXBsCmBgYAoKSWYgZWl0aGVyIGRpcmVj" + + "dG9yeSBpcyBtaXNzaW5nLCBkb3dubG9hZCBtYXRjaGluZyBidW5kbGUgdmVyc2lvbnMgZnJvbSBO" + + "R0M6CgpgYGBiYXNoCm5nYyByZWdpc3RyeSByZXNvdXJjZSBkb3dubG9hZC12ZXJzaW9uIDxvcmc+" + + "L252Y2Ytc2VsZi1tYW5hZ2VkLXN0YWNrOjx2ZXJzaW9uPgpuZ2MgcmVnaXN0cnkgcmVzb3VyY2Ug" + + "ZG93bmxvYWQtdmVyc2lvbiA8b3JnPi9udmNmLWNvbXB1dGUtcGxhbmUtc3RhY2s6PHZlcnNpb24+" + + "CmBgYAoKQ29udHJvbC1wbGFuZSBjb21tYW5kcyBiZWxvdyBhc3N1bWUgdGhlIGNvbnRyb2wtcGxh" + + "bmUgYnVuZGxlIHJvb3QuIFNwbGl0LWZsb3cKY29tbWFuZHMgYW5kIHJvb3Qgc3Vic3RpdHV0aW9u" + + "IGFyZSBpbgpbU3BsaXQgQ29tcHV0ZS1QbGFuZSBJbnN0YWxsYXRpb25dKHJlZmVyZW5jZXMvY29t" + + "cHV0ZS1wbGFuZS1pbnN0YWxsYXRpb24ubWQpLgoKIyMgQmVmb3JlIFlvdSBTdGFydAoKVmVyaWZ5" + + "IHRvb2xpbmcgYW5kIGNvbnRleHQgYmVmb3JlIGFueSBvcGVyYXRpb246CgpgYGBiYXNoCmhlbG1m" + + "aWxlIC0tdmVyc2lvbiAgICMgTXVzdCBiZSAxLjEueCAoMS4yLjAgcmVtb3ZlZCBzZXF1ZW50aWFs" + + "IG1vZGUpCmhlbG0gdmVyc2lvbiAgICAgICAgICMgTXVzdCBiZSA+PSAzLjEyCmhlbG0gcGx1Z2lu" + + "IGxpc3QgICAgICMgTXVzdCBpbmNsdWRlIGhlbG0tZGlmZiA+PSAzLjExCmt1YmVjdGwgdmVyc2lv" + + "biAgICAgICMgQ2xpZW50IG11c3QgYmUgd2l0aGluIDEgbWlub3IgdmVyc2lvbiBvZiBjbHVzdGVy" + + "CmBgYAoKQ29udHJvbC1wbGFuZSBjb21tYW5kcyBydW4gZnJvbSB0aGUgZXh0cmFjdGVkIGBudmNm" + + "LXNlbGYtbWFuYWdlZC1zdGFjay9gIHJvb3Q6CgpgYGBiYXNoCmNkIHBhdGgvdG8vbnZjZi1zZWxm" + + "LW1hbmFnZWQtc3RhY2sKbHMgaGVsbWZpbGUuZC8gZW52aXJvbm1lbnRzLyBzZWNyZXRzLyBnbG9i" + + "YWwueWFtbC5nb3RtcGwKYGBgCgpJZGVudGlmeSB0aGUgZW52aXJvbm1lbnQgZnJvbSBgZW52aXJv" + + "bm1lbnRzLzxuYW1lPi55YW1sYCBhbmQKYHNlY3JldHMvPG5hbWU+LXNlY3JldHMueWFtbGA7IGZv" + + "ciBFS1MsIHVzZSB0aGUgY2Fub25pY2FsCltDU1AgRW5kLXRvLUVuZCBFeGFtcGxlXShodHRwczov" + + "L2RvY3MubnZpZGlhLmNvbS9udmNmL3YwLjYuMC1yYy9jc3AtZW5kLXRvLWVuZC1leGFtcGxlKS4K" + + "CiMjIEhvdyBWYWx1ZXMgRmxvdwoKVW5kZXJzdGFuZGluZyB2YWx1ZSBwcmVjZWRlbmNlIHByZXZl" + + "bnRzIHRoZSBtb3N0IGNvbW1vbiBjb25maWd1cmF0aW9uIG1pc3Rha2VzLgoKYGBgdGV4dAplbnZp" + + "cm9ubWVudHMvYmFzZS55YW1sICAgICAgICAgIChkZWZhdWx0cykKICAgIC0+IG1lcmdlZCB3aXRo" + + "CmVudmlyb25tZW50cy88ZW52Pi55YW1sICAgICAgICAgKHlvdXIgb3ZlcnJpZGVzKQogICAgLT4g" + + "Y29uc3VtZWQgYnkKZ2xvYmFsLnlhbWwuZ290bXBsICAgICAgICAgICAgICAoR28gdGVtcGxhdGUs" + + "IGNvbnN0cnVjdHMgcGVyLWNoYXJ0IHZhbHVlcykKICAgIC0+IGNvbnN1bWVkIGJ5CnNlY3JldHMv" + + "PGVudj4tc2VjcmV0cy55YW1sICAgICAgKHNlbnNpdGl2ZSB2YWx1ZXMpCiAgICAtPiBvdmVycmlk" + + "ZGVuIGJ5CnJlbGVhc2UgaW5saW5lIHZhbHVlczogYmxvY2tzICAgKGhpZ2hlc3QgcHJlY2VkZW5j" + + "ZSkKYGBgCgpDcml0aWNhbDogYGdsb2JhbC55YW1sLmdvdG1wbGAgb25seSBwYXNzZXMgdGhyb3Vn" + + "aCBzcGVjaWZpYyBrZXlzIHRvIGVhY2ggY2hhcnQgKGltYWdlIHJlZ2lzdHJpZXMsIG5vZGUgc2Vs" + + "ZWN0b3JzLCBzdG9yYWdlLCByZXBsaWNhIGNvdW50cykuIFNldHRpbmcgYW4gYXJiaXRyYXJ5IGNo" + + "YXJ0IHZhbHVlIGluIHRoZSBlbnZpcm9ubWVudCBmaWxlIHdpbGwgYmUgc2lsZW50bHkgaWdub3Jl" + + "ZCBpZiBgZ2xvYmFsLnlhbWwuZ290bXBsYCBkb2VzIG5vdCBwcm9wYWdhdGUgaXQuCgpUbyBvdmVy" + + "cmlkZSBhcmJpdHJhcnkgY2hhcnQgdmFsdWVzLCB1c2UgYSBoZWxtZmlsZSByZWxlYXNlIGB2YWx1" + + "ZXM6YCBibG9jay4gU2VlIFtPdmVycmlkaW5nIEhlbG0gQ2hhcnQgVmFsdWVzXSgjb3ZlcnJpZGlu" + + "Zy1oZWxtLWNoYXJ0LXZhbHVlcykuCgojIyBDbGVhbiBJbnN0YWxsYXRpb24KCiMjIyAxLiBDcmVh" + + "dGUgbmFtZXNwYWNlcyBhbmQgaW1hZ2UgcHVsbCBzZWNyZXRzIChpZiB1c2luZyBhIHByaXZhdGUg" + + "cmVnaXN0cnkpCgpgYGBiYXNoCmZvciBucyBpbiBjYXNzYW5kcmEtc3lzdGVtIG5hdHMtc3lzdGVt" + + "IG52Y2YgYXBpLWtleXMgZXNzIHNpcyB2YXVsdC1zeXN0ZW0gY2VydC1tYW5hZ2VyOyBkbwogIGt1" + + "YmVjdGwgY3JlYXRlIG5hbWVzcGFjZSAiJG5zIiAtLWRyeS1ydW49Y2xpZW50IC1vIHlhbWwgfCBr" + + "dWJlY3RsIGFwcGx5IC1mIC0KZG9uZQoKIyBPbmx5IGlmIHB1bGxpbmcgZnJvbSBhIHByaXZhdGUg" + + "cmVnaXN0cnkgKGUuZy4sIE5HQyBudmNyLmlvKQpleHBvcnQgTkdDX0FQSV9LRVk9Ijx5b3VyLWtl" + + "eT4iCmZvciBucyBpbiBjYXNzYW5kcmEtc3lzdGVtIG5hdHMtc3lzdGVtIG52Y2YgYXBpLWtleXMg" + + "ZXNzIHNpcyB2YXVsdC1zeXN0ZW0gY2VydC1tYW5hZ2VyOyBkbwogIGt1YmVjdGwgY3JlYXRlIHNl" + + "Y3JldCBkb2NrZXItcmVnaXN0cnkgbnZjci1jcmVkcyBcCiAgICAtLWRvY2tlci1zZXJ2ZXI9bnZj" + + "ci5pbyBcCiAgICAtLWRvY2tlci11c2VybmFtZT0nJG9hdXRodG9rZW4nIFwKICAgIC0tZG9ja2Vy" + + "LXBhc3N3b3JkPSIkTkdDX0FQSV9LRVkiIFwKICAgIC0tbmFtZXNwYWNlPSIkbnMiIFwKICAgIC0t" + + "ZHJ5LXJ1bj1jbGllbnQgLW8geWFtbCB8IGt1YmVjdGwgYXBwbHkgLWYgLQpkb25lCmBgYAoKSWYg" + + "dXNpbmcgcHVsbCBzZWNyZXRzLCB5b3UgbXVzdCBhbHNvIGNvbmZpZ3VyZSBlYWNoIGhlbG1maWxl" + + "IHJlbGVhc2UgdG8gcmVmZXJlbmNlIHRoZW0uIFNlZSBbSW1hZ2UgUHVsbCBTZWNyZXRzXSgjaW1h" + + "Z2UtcHVsbC1zZWNyZXRzKS4KCiMjIyAyLiBBdXRoZW50aWNhdGUgaGVsbSB0byB5b3VyIGNoYXJ0" + + "IHJlZ2lzdHJ5CgpCb3RoIGBkb2NrZXIgbG9naW5gIEFORCBgaGVsbSByZWdpc3RyeSBsb2dpbmAg" + + "YXJlIHJlcXVpcmVkIGZvciBOR0MuIEhlbG1maWxlIHVzZXMgaGVsbSAobm90IGRvY2tlcikgdG8g" + + "cHVsbCBPQ0kgY2hhcnRzLCBzbyB0aGUgaGVsbSBjcmVkZW50aWFsIHN0b3JlIG11c3QgYmUgYXV0" + + "aGVudGljYXRlZCBzZXBhcmF0ZWx5LgoKYGBgYmFzaAojIE5HQyAtLSBib3RoIGNvbW1hbmRzIGFy" + + "ZSByZXF1aXJlZApkb2NrZXIgbG9naW4gbnZjci5pbyAtdSAnJG9hdXRodG9rZW4nIC1wICIkTkdD" + + "X0FQSV9LRVkiCmhlbG0gcmVnaXN0cnkgbG9naW4gbnZjci5pbyAtdSAnJG9hdXRodG9rZW4nIC1w" + + "ICIkTkdDX0FQSV9LRVkiCgojIEVDUgphd3MgZWNyIGdldC1sb2dpbi1wYXNzd29yZCAtLXJlZ2lv" + + "biA8cmVnaW9uPiB8IFwKICBoZWxtIHJlZ2lzdHJ5IGxvZ2luIC0tdXNlcm5hbWUgQVdTIC0tcGFz" + + "c3dvcmQtc3RkaW4gPGFjY291bnQ+LmRrci5lY3IuPHJlZ2lvbj4uYW1hem9uYXdzLmNvbQpgYGAK" + + "Cj4gTm90ZTogYGhlbG0gcmVnaXN0cnkgbG9naW5gIGtlZXBzIG9ubHkgdGhlIGxhc3QgbG9naW4g" + + "cGVyIGhvc3QgKG11bHRpLW9yZyBnb3RjaGEpLgo+IFRoZSBzdGFjayBhbmQgdGhlIGNhY2hlcyBz" + + "cGFuIHNldmVyYWwgTkdDIG9yZ3MgdGhhdCBuZWVkIGRpZmZlcmVudCBrZXlzLCBidXQgdGhleSBh" + + "bGwKPiBsaXZlIHVuZGVyIHRoZSBvbmUgaG9zdCBgbnZjci5pb2AuIEEgc2Vjb25kIGBoZWxtIHJl" + + "Z2lzdHJ5IGxvZ2luIG52Y3IuaW9gIChvcgo+IGBkb2NrZXIgbG9naW5gKSB3aXRoIGEgZGlmZmVy" + + "ZW50IGtleSBzaWxlbnRseSBvdmVyd3JpdGVzIHRoZSBmaXJzdCwgc28gcHVsbHMgZm9yIHRoZQo+" + + "IGZpcnN0IG9yZyB0aGVuIGZhaWwgd2l0aCBhIG1pc2xlYWRpbmcgYDQwMyBBY2Nlc3MgRGVuaWVk" + + "YCAobm90IGEgNDAxOiB0aGUgYXV0aAo+IHN1Y2NlZWRlZCwgaXQncyB0aGUgd3Jvbmctb3JnIGtl" + + "eSkuIElmIHlvdSBwdWxsIGNoYXJ0cy9pbWFnZXMgZnJvbSBtb3JlIHRoYW4gb25lIG9yZywKPiBl" + + "aXRoZXIgcmUtcnVuIHRoZSBsb2dpbiB3aXRoIHRoZSBjb3JyZWN0IGtleSBpbW1lZGlhdGVseSBi" + + "ZWZvcmUgZWFjaCBwdWxsLCBvciBwYXNzCj4gYC0tdXNlcm5hbWUgJyRvYXV0aHRva2VuJyAtLXBh" + + "c3N3b3JkIDxrZXk+YCBwZXIgYGhlbG0gcHVsbGAgaW52b2NhdGlvbiBpbnN0ZWFkIG9mIHJlbHlp" + + "bmcKPiBvbiB0aGUgc3RvcmVkIGxvZ2luLiAoUHVsbGluZyBldmVyeXRoaW5nIGZyb20gYSBzaW5n" + + "bGUgcmVnaXN0cnkgbWlycm9yIGF2b2lkcyB0aGlzCj4gZW50aXJlbHkuKQoKIyMjIDJiLiAoUmVj" + + "b21tZW5kZWQpIFB1bGwgZnJvbSBhIHJlZ2lzdHJ5IHRoZSBjbHVzdGVyIGF1dGhlbnRpY2F0ZXMg" + + "dG8gYXV0b21hdGljYWxseQoKSWYgeW91IG1pcnJvciB0aGUgTlZDRiBpbWFnZXMgaW50byBhIHJl" + + "Z2lzdHJ5IHRoYXQgdGhlIGNsdXN0ZXIgY2FuIHB1bGwgZnJvbSB3aXRob3V0IGFuCmV4cGxpY2l0" + + "IGltYWdlIHB1bGwgc2VjcmV0IChmb3IgZXhhbXBsZSwgYSByZWdpc3RyeSB3aGVyZSB0aGUgbm9k" + + "ZSBvciB3b3JrbG9hZCBpZGVudGl0eSBpcwpncmFudGVkIHB1bGwgYWNjZXNzIGF1dG9tYXRpY2Fs" + + "bHkpLCBwb2ludCB0aGUgc3RhY2sgYXQgaXQgYW5kIHNraXAgdGhlIGNyZWRlbnRpYWwgc3RlcHMK" + + "YWJvdmUuCgoxLiBQb2ludCB0aGUgc3RhY2sgYXQgdGhlIG1pcnJvciBpbiBgZW52aXJvbm1lbnRz" + + "LzxlbnY+LnlhbWxgOgoKICAgYGBgeWFtbAogICBnbG9iYWw6CiAgICAgaW1hZ2U6CiAgICAgICBy" + + "ZWdpc3RyeTogPHlvdXItcmVnaXN0cnk+ICAgICAgICAgICAgIyBlLmcuIHJlZ2lzdHJ5LmV4YW1w" + + "bGUuY29tCiAgICAgICByZXBvc2l0b3J5OiA8bWlycm9yLXN1Yi1wYXRoPgogICAgIGhlbG06CiAg" + + "ICAgICBzb3VyY2VzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb25seSBpZiB5b3Ug" + + "YWxzbyBtaXJyb3JlZCB0aGUgaGVsbSBjaGFydHMKICAgICAgICAgcmVnaXN0cnk6IDx5b3VyLXJl" + + "Z2lzdHJ5PgogICAgICAgICByZXBvc2l0b3J5OiA8bWlycm9yLXN1Yi1wYXRoPgogICBgYGAKCiAg" + + "ID4gVGhlIG1hbmlmZXN0IGhhcyBhIG1peCBvZiBPQ0kgYW5kIG5vbi1PQ0kgYXJ0aWZhY3RzLCBz" + + "byBjb252ZXJ0IG5vbi1PQ0kgY2hhcnRzIGJlZm9yZQogICA+IG1pcnJvcmluZy4gQ29udGFpbmVy" + + "IGltYWdlcyAoYG52Y3IuaW8vLi4uYCkgYXJlIGFscmVhZHkgT0NJIGFuZCBtaXJyb3IgYXMtaXMu" + + "IFNvbWUgSGVsbQogICA+IGNoYXJ0cywgdGhvdWdoLCBhcmUgcHVibGlzaGVkIHRvIGFuIGBodHRw" + + "czovL2AgSGVsbSByZXBvc2l0b3J5IChmb3IgZXhhbXBsZQogICA+IGBoZWxtLm5nYy5udmlkaWEu" + + "Y29tYCkuIFRob3NlIGFyZSBub3QgT0NJIGFuZCBjYW5ub3QgYmUgcmVzb2x2ZWQgYnkgYGdsb2Jh" + + "bC5oZWxtLnNvdXJjZXNgCiAgID4gKE9DSSkgb3IgbWlycm9yZWQgZGlyZWN0bHkuIEJlZm9yZSBw" + + "b2ludGluZyB0aGUgc3RhY2sgYXQgeW91ciBtaXJyb3IsIGNvbnZlcnQgZWFjaAogICA+IGBodHRw" + + "czovL2AgY2hhcnQgdG8gT0NJOiBgaGVsbSByZXBvIGFkZGAvYGhlbG0gcHVsbGAgdGhlIGAudGd6" + + "YCwgdGhlbgogICA+IGBoZWxtIHB1c2ggPGNoYXJ0Pi50Z3ogb2NpOi8vPHlvdXItcmVnaXN0cnk+" + + "LzxtaXJyb3Itc3ViLXBhdGg+YC4gT25seSBPQ0kgY2hhcnRzIGNhbiBsaXZlCiAgID4gdW5kZXIg" + + "YGdsb2JhbC5oZWxtLnNvdXJjZXNgLgoKMi4gU2tpcCB0aGUgY3JlZGVudGlhbCBzdGVwcyBhYm92" + + "ZS4gV2hlbiB0aGUgY2x1c3RlciBhdXRoZW50aWNhdGVzIHRvIHRoZSByZWdpc3RyeQogICBhdXRv" + + "bWF0aWNhbGx5ICh0aGUgbm9kZSBvciB3b3JrbG9hZCBpZGVudGl0eSBoYXMgcHVsbCBhY2Nlc3Mp" + + "LCB0aGUgcHVsbCBuZWVkcyBubwogICBLdWJlcm5ldGVzIHNlY3JldCwgc28geW91IGRvIG5vdCBu" + + "ZWVkOiB0aGUgcGVyLW5hbWVzcGFjZSBgbnZjci1jcmVkc2AgZnJvbSBzdGVwIDEKICAgKHN0aWxs" + + "IGNyZWF0ZSB0aGUgbmFtZXNwYWNlcywganVzdCBub3QgdGhlIHNlY3JldCksIHRoZSBgZ2xvYmFs" + + "LmltYWdlUHVsbFNlY3JldHNgIGVudHJ5LAogICBvciB0aGUgYGRvY2tlciBsb2dpbmAvYGhlbG0g" + + "cmVnaXN0cnkgbG9naW4gbnZjci5pb2AgZnJvbSBzdGVwIDIuCgogICA+IE9uZSByZXNpZHVhbCBj" + + "cmVkZW50aWFsOiBudmNmLWFwaSBzdGlsbCB2YWxpZGF0ZXMgdGhlIHVzZXIgZnVuY3Rpb24gaW1h" + + "Z2UgYXQKICAgPiBgZnVuY3Rpb24gY3JlYXRlYCB2aWEgdGhlIGFjY291bnQgcmVnaXN0cnkgY3Jl" + + "ZGVudGlhbCwgc28gdGhhdCBjcmVkZW50aWFsIG11c3QgcG9pbnQgYXQKICAgPiB3aGljaGV2ZXIg" + + "cmVnaXN0cnkgaG9sZHMgdGhlIHVzZXIgaW1hZ2UgKHNldCBpdCB0byB5b3VyIG1pcnJvciBpZiB0" + + "aGUgaW1hZ2UgaXMgbWlycm9yZWQKICAgPiB0aGVyZSkuCgojIyMgMy4gU2V0IHRoZSByb3V0ZSBk" + + "b21haW4KCmBnbG9iYWwuZG9tYWluYCBzZXRzIHRoZSBob3N0bmFtZSBzdWZmaXggZm9yIHJvdXRl" + + "cyBzdWNoIGFzIGBhcGkuPGRvbWFpbj5gLiBJdCBkb2VzIG5vdCBjb25maWd1cmUgdGhlIEdhdGV3" + + "YXkgb3IgaXRzIGxvYWQgYmFsYW5jZXIuIFF1ZXJ5IHRoZSBleGFjdCBleGlzdGluZyBHYXRld2F5" + + "OgoKYGBgYmFzaApHQVRFV0FZX0FERFJFU1M9JChrdWJlY3RsIGdldCBnYXRld2F5IDxnYXRld2F5" + + "LW5hbWU+IC1uIDxnYXRld2F5LW5hbWVzcGFjZT4gLW8ganNvbnBhdGg9J3suc3RhdHVzLmFkZHJl" + + "c3Nlc1swXS52YWx1ZX0nKQp0ZXN0IC1uICIkR0FURVdBWV9BRERSRVNTIgpgYGAKClRoZSBhZGRy" + + "ZXNzIG1heSBiZSBhIGhvc3RuYW1lIG9yIElQLiBDbG91ZCBwcm92aWRlciBhbmQgR2F0ZXdheSBj" + + "b25maWd1cmF0aW9uIGRldGVybWluZSB0aGUgbG9hZCBiYWxhbmNlciB0eXBlIGFuZCBhZGRyZXNz" + + "IGZvcm1hdC4gVGhlIHNlbGYtbWFuYWdlZCBzdGFjayBkb2VzIG5vdCBzZWxlY3QgZWl0aGVyLgoK" + + "Rm9yIHRlbXBvcmFyeSB0ZXN0aW5nIHdpdGhvdXQgRE5TLCB1c2UgYSBzdGFibGUgcmVzZXJ2ZWQg" + + "c3VmZml4IHN1Y2ggYXMgYGdsb2JhbC5kb21haW46ICJudmNmLnRlc3QiYCwgY29ubmVjdCB0byBg" + + "R0FURVdBWV9BRERSRVNTYCwgYW5kIHNlbmQgYEhvc3Q6IGFwaS5udmNmLnRlc3RgLiBGb3IgcHJv" + + "ZHVjdGlvbiwgdXNlIHlvdXIgYmFzZSBETlMgZG9tYWluIGFuZCBwb2ludCBpdHMgcm91dGUgcmVj" + + "b3JkcyB0byBgR0FURVdBWV9BRERSRVNTYC4gSWYgdGhlIGVuZHBvaW50IGxhdGVyIGNoYW5nZXMs" + + "IGtlZXAgYGdsb2JhbC5kb21haW5gIHN0YWJsZSBhbmQgdXBkYXRlIG9ubHkgRE5TIG9yIHRoZSBj" + + "bGllbnQgZGVzdGluYXRpb24uIFNlZSBFeGFtcGxlIDQgaW4gW2V4YW1wbGVzLm1kXShleGFtcGxl" + + "cy5tZCkuCgojIyMgNC4gUHJldmlldyBhbmQgZGVwbG95CgpgYGBiYXNoCkhFTE1GSUxFX0VOVj08" + + "ZW52LW5hbWU+IGhlbG1maWxlIHRlbXBsYXRlICAgIyBQcmV2aWV3IHJlbmRlcmVkIG1hbmlmZXN0" + + "cwpIRUxNRklMRV9FTlY9PGVudi1uYW1lPiBoZWxtZmlsZSBzeW5jICAgICAgICMgRGVwbG95CmBg" + + "YAoKPiBTZXQgQk9USCBDYXNzYW5kcmEgcGFzc3dvcmRzIGluIHRoZSBzZWNyZXRzIGZpbGUuIFRo" + + "ZSBzZWNyZXRzIGZpbGUgZG9jdW1lbnRzCj4gYERFRkFVTFRfQ0FTU0FORFJBX1BBU1NXT1JEYCwg" + + "YnV0IHRoZSBjYXNzYW5kcmEgY2hhcnQgaGFzIGEgc2Vjb25kIGNyZWRlbnRpYWwsCj4gYGNhc3Nh" + + "bmRyYS5zZXJ2aWNlUm9sZVBhc3N3b3JkYCwgdGhhdCBkZWZhdWx0cyB0byBgY2hAbmczbTNgLiBJ" + + "ZiB5b3Ugc2V0IG9ubHkKPiBgREVGQVVMVF9DQVNTQU5EUkFfUEFTU1dPUkRgLCB0aGUgc2Vydmlj" + + "ZSByb2xlIGtlZXBzIHRoYXQgZGVmYXVsdCBhbmQgZXZlcnkgREItYmFja2VkCj4gc2VydmljZSBj" + + "cmFzaC1sb29wcyB3aXRoIGBCYWQgY3JlZGVudGlhbHNgIG9uY2UgaXQgdHJpZXMgdG8gYXV0aGVu" + + "dGljYXRlLiBTZXQKPiBgY2Fzc2FuZHJhLnNlcnZpY2VSb2xlUGFzc3dvcmRgIHRvIHRoZSBzYW1l" + + "IHZhbHVlIGFzIGBERUZBVUxUX0NBU1NBTkRSQV9QQVNTV09SRGAuCgojIyMgNS4gRGVwbG95bWVu" + + "dCBwaGFzZXMKCkhlbG1maWxlIGRlcGxveXMgaW4gb3JkZXIgd2l0aCBkZXBlbmRlbmNpZXM6Cgp8" + + "IFBoYXNlIHwgU2VsZWN0b3IgfCBTZXJ2aWNlcyB8IFdhaXQgdGltZSB8CnwtLS0tLS0tfC0tLS0t" + + "LS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwKfCAxIHwgYHJlbGVhc2UtZ3JvdXA9ZGVwZW5k" + + "ZW5jaWVzYCB8IE5BVFMsIE9wZW5CYW8sIENhc3NhbmRyYSB8IDUtMTAgbWluIHwKfCAyIHwgYHJl" + + "bGVhc2UtZ3JvdXA9c2VydmljZXNgIHwgQVBJLCBTSVMsIEVTUywgaW52b2NhdGlvbiwgZ3JwYy1w" + + "cm94eSwgbm90YXJ5LCBhcGkta2V5cywgb3B0aW9uYWwgTExNIGdhdGV3YXkvcm91dGVyLCBvcHRp" + + "b25hbCBWYW5pdHkgR2F0ZXdheSwgTlZDRiBVSSB3aGVuIHRoZSBzdGFjayBwYWNrYWdlIGluY2x1" + + "ZGVzIHRoZSBhZGRvbiB8IDUtMTAgbWluIHwKfCAzIHwgYHJlbGVhc2UtZ3JvdXA9aW5ncmVzc2Ag" + + "fCBHYXRld2F5IHJvdXRlcyB8IDEtMiBtaW4gfAp8IDQgfCBgcmVsZWFzZS1ncm91cD1vYnNlcnZh" + + "YmlsaXR5YCB8IE9ic2VydmFiaWxpdHkgc3RhY2sgKGlmIGVuYWJsZWQpIHwgMS0yIG1pbiB8CgpN" + + "b25pdG9yIGluIGEgc2VwYXJhdGUgdGVybWluYWw6CgpgYGBiYXNoCmt1YmVjdGwgZ2V0IHBvZHMg" + + "LUEgLXcKYGBgCgojIyMgNi4gRW5hYmxlIFZhbml0eSBHYXRld2F5IChvcHRpb25hbCkKClZhbml0" + + "eSBHYXRld2F5IGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgYW5kIGlzIG9ubHkgbmVlZGVkIGZvciBj" + + "dXN0b21lci1mYWNpbmcKaG9zdG5hbWVzIG9yIHBhdGggbWFwcGluZ3MgaW4gZnJvbnQgb2YgdGhl" + + "IHN0YW5kYXJkIE5WQ0YgQVBJIGFuZCBpbnZvY2F0aW9uCnJvdXRlcy4gSXQgaXMgYXZhaWxhYmxl" + + "IG9ubHkgaW4gc3RhY2sgcGFja2FnZXMgdGhhdCBpbmNsdWRlIHRoZSBWYW5pdHkgR2F0ZXdheQph" + + "ZGRvbi4gSWYgdGhlIGV4dHJhY3RlZCBzdGFjayBwYWNrYWdlIGRvZXMgbm90IGNvbnRhaW4gYSBg" + + "dmFuaXR5LWdhdGV3YXlgCnJlbGVhc2UgYW5kIGB2YW5pdHlHYXRld2F5YCByb3V0ZSB2YWx1ZXMs" + + "IHNraXAgdGhlc2UgY29tbWFuZHMgYW5kIHVzZSBhIG5ld2VyCnN0YWNrIHBhY2thZ2UgdGhhdCBp" + + "bmNsdWRlcyB0aGVtLgoKSWYgdGhlIHN0YWNrIHBhY2thZ2UgaW5jbHVkZXMgdGhlIGFkZG9uLCBl" + + "bmFibGUgaXQgaW4KYGVudmlyb25tZW50cy88ZW52LW5hbWU+LnlhbWxgOgoKYGBgeWFtbAphZGRv" + + "bnM6CiAgdmFuaXR5R2F0ZXdheToKICAgIGVuYWJsZWQ6IHRydWUKICAgIG1hcHBpbmdDb25maWc6" + + "IHt9CmBgYAoKVGhlIGRlZmF1bHQgcm91dGUgaG9zdCBpcyBgdmFuaXR5Ljxkb21haW4+YCBhbmQg" + + "dGhlIGJhY2tlbmQgaXMKYHZhbml0eS1nYXRld2F5Lm52Y2Y6ODA4MGAuIFB1dCBkZXBsb3ltZW50" + + "LXNwZWNpZmljIGhvc3QgYW5kIHBhdGggbWFwcGluZ3MgdW5kZXIKYGFkZG9ucy52YW5pdHlHYXRl" + + "d2F5Lm1hcHBpbmdDb25maWdgLiBJZiB5b3UgbmVlZCBjdXN0b20gdmFuaXR5IGhvc3RzIGluc3Rl" + + "YWQgb2YKYHZhbml0eS48ZG9tYWluPmAsIHVzZSB0aGUgcm91dGUgaG9zdG5hbWUgb3ZlcnJpZGVz" + + "IHN1cHBvcnRlZCBieSB0aGUgc3RhY2sKcGFja2FnZSBhbmQgY3JlYXRlIG1hdGNoaW5nIEROUyBy" + + "ZWNvcmRzLgoKQWZ0ZXIgY29uZmlybWluZyB0aGUgcGFja2FnZSBpbmNsdWRlcyB0aGUgYHZhbml0" + + "eS1nYXRld2F5YCByZWxlYXNlLCBwcmV2aWV3IGFuZAphcHBseSB0aGUgc2VydmljZSBhbmQgcm91" + + "dGU6CgpgYGBiYXNoCkhFTE1GSUxFX0VOVj08ZW52LW5hbWU+IGhlbG1maWxlIC0tc2VsZWN0b3Ig" + + "bmFtZT12YW5pdHktZ2F0ZXdheSB0ZW1wbGF0ZQpIRUxNRklMRV9FTlY9PGVudi1uYW1lPiBoZWxt" + + "ZmlsZSAtLXNlbGVjdG9yIG5hbWU9dmFuaXR5LWdhdGV3YXkgc3luYwpIRUxNRklMRV9FTlY9PGVu" + + "di1uYW1lPiBoZWxtZmlsZSAtLXNlbGVjdG9yIHJlbGVhc2UtZ3JvdXA9aW5ncmVzcyBzeW5jCmBg" + + "YAoKVmVyaWZ5IHRoZSByb3V0ZSBvbmx5IHdoZW4gdGhlIGFkZG9uIGlzIHByZXNlbnQgYW5kIGVu" + + "YWJsZWQ6CgpgYGBiYXNoCmt1YmVjdGwgZ2V0IGRlcGxveSxzdmMgLW4gbnZjZiAtbCBhcHAua3Vi" + + "ZXJuZXRlcy5pby9uYW1lPXZhbml0eS1nYXRld2F5Cmt1YmVjdGwgZ2V0IGh0dHByb3V0ZSAtQSB8" + + "IGdyZXAgLWkgdmFuaXR5CmN1cmwgLUggIkhvc3Q6IHZhbml0eS48ZG9tYWluPiIgImh0dHA6Ly88" + + "Z2F0ZXdheS1hZGRyZXNzPi9oZWFsdGgiCmBgYAoKRG8gbm90IGVuYWJsZSBWYW5pdHkgR2F0ZXdh" + + "eSBmb3Igc3RhbmRhcmQgQVBJLCBBUEkgS2V5cywgaW52b2NhdGlvbiwgTExNCmludm9jYXRpb24s" + + "IG9yIGdSUEMgdHJhZmZpYy4gVGhvc2Ugcm91dGVzIGFyZSBwcm92aWRlZCBieSB0aGUgYmFzZSBn" + + "YXRld2F5CnJvdXRlcy4KCiMjIyA3LiBFbmFibGUgTlZDRiBVSSAob3B0aW9uYWwpCgpOVkNGIFVJ" + + "IGlzIGFuIG9wdGlvbmFsLCBjdXN0b21lci1mYWNpbmcgYWRtaW4tcGFuZWwgVUkuIEl0IGlzIGRp" + + "c2FibGVkIGJ5CmRlZmF1bHQgYW5kIGF2YWlsYWJsZSBvbmx5IGluIHN0YWNrIHBhY2thZ2VzIHRo" + + "YXQgaW5jbHVkZSB0aGUgTlZDRiBVSSBhZGRvbi4gSWYKeW91ciBleHRyYWN0ZWQgc3RhY2sgcGFj" + + "a2FnZSBkb2VzIG5vdCBjb250YWluIGEgYG52Y2YtdWlgIHJlbGVhc2UgYW5kIGBudmNmVWlgCnJv" + + "dXRlIHZhbHVlcywgc2tpcCB0aGlzIHNlY3Rpb24uIFRoZSBOVkNGIFVJIGFkbWluIHBhbmVsIGlz" + + "IGN1cnJlbnRseQp1bmF1dGhlbnRpY2F0ZWQ7IGRvIG5vdCBleHBvc2UgaXQgdG8gdGhlIHB1Ymxp" + + "YyBpbnRlcm5ldC4KCkZvciBlbmFibGVtZW50LCBuYW1lc3BhY2UgYW5kIHB1bGwgc2VjcmV0IHNl" + + "dHVwLCBhcHBseSwgYW5kIHZlcmlmaWNhdGlvbiBzdGVwcywKc2VlIFtOVkNGIFVJIEFkZG9uXShy" + + "ZWZlcmVuY2VzL252Y2YtdWktYWRkb24ubWQpLgoKIyMjIDguIEluc3RhbGwgdGhlIHNlcGFyYXRl" + + "IGNvbXB1dGUtcGxhbmUgc3RhY2sKClRoZSBjb250cm9sLXBsYW5lIHN0YWNrIGRvZXMgbm90IGlu" + + "c3RhbGwgY29tcHV0ZS1wbGFuZSBjb21wb25lbnRzLiBBZnRlciBpdCBpcyBoZWFsdGh5LCBjaG9v" + + "c2UgZXhhY3RseSBvbmUgY29tcHV0ZS1wbGFuZSBoYW5kb2ZmOgoKLSBIZWxtZmlsZSB2YWx1ZXMg" + + "ZmxvdzogYXV0aG9yIHNlcGFyYXRlIGVudmlyb25tZW50IGZpbGVzLCB0aGVuIHJlZ2lzdGVyIGFu" + + "ZAogIGluc3RhbGwgd2l0aCB0aGUgY29tcHV0ZS1wbGFuZSBNYWtlZmlsZS4KLSBDTEkgcHJvZmls" + + "ZSBmbG93OiB1c2UgdGhlIHByb2ZpbGUgZ2VuZXJhdGVkIGJ5IHRoZSBDTEkgY29udHJvbC1wbGFu" + + "ZSBpbnN0YWxsLAogIHRoZW4gcnVuIHRoZSBjb21wbGV0ZSBDTEkgcmVnaXN0ZXIgYW5kIGluc3Rh" + + "bGwgY29tbWFuZHMuCgpEbyBub3QgbWl4IHRoZXNlIGhhbmRvZmZzLiBGb2xsb3cgW1NwbGl0IENv" + + "bXB1dGUtUGxhbmUgSW5zdGFsbGF0aW9uXShyZWZlcmVuY2VzL2NvbXB1dGUtcGxhbmUtaW5zdGFs" + + "bGF0aW9uLm1kKQpmb3IgY29tbWFuZHMsIEVLUyByb3V0aW5nLCBwdWxsIHNlY3JldHMsIHZlcmlm" + + "aWNhdGlvbiwgYW5kIHRlYXJkb3duIG9yZGVyLgoKIyMgQ2xlYW4gVGVhcmRvd24KCkRlc3Ryb3kg" + + "ZXZlcnkgY29tcHV0ZSBwbGFuZSBiZWZvcmUgdGhlIGNvbnRyb2wgcGxhbmUsIHVzaW5nIHRoZSB0" + + "ZWFyZG93biBmb3IKdGhlIHNhbWUgaGFuZG9mZjsgc2VlIFtTcGxpdCBDb21wdXRlLVBsYW5lIElu" + + "c3RhbGxhdGlvbl0ocmVmZXJlbmNlcy9jb21wdXRlLXBsYW5lLWluc3RhbGxhdGlvbi5tZCN0ZWFy" + + "ZG93bikuCgpTY29wZTogT25seSBkZXN0cm95IHJlbGVhc2VzIG1hbmFnZWQgYnkgdGhpcyBjb250" + + "cm9sLXBsYW5lIGhlbG1maWxlIHN0YWNrLiBUaGUgTlZDRiByZWxlYXNlcyBhcmU6IGBuYXRzYCwg" + + "YG9wZW5iYW8tc2VydmVyYCwgYGNhc3NhbmRyYWAsIGBhcGkta2V5c2AsIGBzaXNgLCBgYXBpYCwg" + + "YGludm9jYXRpb24tc2VydmljZWAsIGBncnBjLXByb3h5YCwgYGVzcy1hcGlgLCBgbm90YXJ5LXNl" + + "cnZpY2VgLCBvcHRpb25hbCBgdmFuaXR5LWdhdGV3YXlgLCBgbnZjZi11aWAsIGBhZG1pbi1pc3N1" + + "ZXItcHJveHlgLCBhbmQgYGluZ3Jlc3NgOyBgY2VydC1tYW5hZ2VyYCBpcyBpbmNsdWRlZCBvbmx5" + + "IHdoZW4gYGNlcnRNYW5hZ2VyLmVuYWJsZWQ6IHRydWVgLiBUaGUgY29udHJvbC1wbGFuZSBuYW1l" + + "c3BhY2UgaW52ZW50b3J5IGFsc28gaW5jbHVkZXMgYGNlcnQtbWFuYWdlcmAsIGJ1dCBkZWZhdWx0" + + "IG5hbWVzcGFjZSBjbGVhbnVwIHByZXNlcnZlcyBpdC4gTmFtZXNwYWNlIHByZXNlcnZhdGlvbiBk" + + "b2VzIG5vdCBwcmVzZXJ2ZSB0aGUgSGVsbSByZWxlYXNlLiBFeHRlcm5hbCBjZXJ0LW1hbmFnZXIg" + + "bXVzdCB1c2UgYGNlcnRNYW5hZ2VyLmVuYWJsZWQ6IGZhbHNlYDsgb3RoZXJ3aXNlIEhlbG1maWxl" + + "IHRyZWF0cyB0aGUgcmVsZWFzZSBhcyBzdGFjay1tYW5hZ2VkLiBEbyBub3QgZGVsZXRlIG90aGVy" + + "IGhlbG0gcmVsZWFzZXMgb3IgbmFtZXNwYWNlcyBvbiB0aGUgY2x1c3Rlci4KCkJlZm9yZSBjb250" + + "cm9sLXBsYW5lIGRlc3Ryb3ksIGlkZW50aWZ5IHdoZXRoZXIgY2VydC1tYW5hZ2VyIGlzIGV4dGVy" + + "bmFsLiBGb3IgYW4gZXh0ZXJuYWwgaW5zdGFsbGF0aW9uLCByZXF1aXJlIGVmZmVjdGl2ZSBgY2Vy" + + "dE1hbmFnZXIuZW5hYmxlZDogZmFsc2VgIGFuZCBhYm9ydCBpZiBpdCBpcyB0cnVlLiBGb3IgYW4g" + + "aW50ZW5kZWQgc3RhY2stbWFuYWdlZCByZWxlYXNlIHdpdGggZWZmZWN0aXZlIGBjZXJ0TWFuYWdl" + + "ci5lbmFibGVkOiB0cnVlYCwgdmVyaWZ5IG1hdGNoaW5nIHN0YWNrIEhlbG0gcmVsZWFzZSBtZXRh" + + "ZGF0YSBhbmQgYWJvcnQgb24gbWlzc2luZyBvciBtaXNtYXRjaGVkIGV2aWRlbmNlLiBQcmVzZXJ2" + + "ZSB0aGUgbmFtZXNwYWNlIGJ5IGRlZmF1bHQ7IG9ubHkgcGxhbiBpdHMgcmVtb3ZhbCBhZnRlciB2" + + "ZXJpZnlpbmcgbmFtZXNwYWNlIHByb3ZlbmFuY2UgYW5kIGdldHRpbmcgZXhwbGljaXQgY29uZmly" + + "bWF0aW9uLgoKIyMjIFN0YW5kYXJkIHRlYXJkb3duCgpSdW4gZnJvbSBpbnNpZGUgdGhlIGBudmNm" + + "LXNlbGYtbWFuYWdlZC1zdGFjay9gIGRpcmVjdG9yeToKCmBgYGJhc2gKSEVMTUZJTEVfRU5WPTxl" + + "bnYtbmFtZT4gaGVsbWZpbGUgZGVzdHJveQpgYGAKCiMjIyBEZWxldGUgbmFtZXNwYWNlcwoKYGBg" + + "YmFzaApmb3IgbnMgaW4gY2Fzc2FuZHJhLXN5c3RlbSBuYXRzLXN5c3RlbSBudmNmIGFwaS1rZXlz" + + "IGVzcyBzaXMgbnZjZi11aSB2YXVsdC1zeXN0ZW07IGRvCiAga3ViZWN0bCBkZWxldGUgbmFtZXNw" + + "YWNlICIkbnMiIC0taWdub3JlLW5vdC1mb3VuZApkb25lCmBgYAoKIyMjIFZlcmlmeSBjbGVhbgoK" + + "YGBgYmFzaAprdWJlY3RsIGdldCBucyB8IGdyZXAgLUUgJyhjYXNzYW5kcmF8bmF0c3x2YXVsdHxu" + + "dmNmfGFwaS1rZXlzfGVzc3xzaXMpJwojIFNob3VsZCByZXR1cm4gZW1wdHkKYGBgCgojIyBPdmVy" + + "cmlkaW5nIEhlbG0gQ2hhcnQgVmFsdWVzCgojIyMgRW52aXJvbm1lbnQgZmlsZSAobGltaXRlZCkK" + + "CldvcmtzIG9ubHkgZm9yIGtleXMgdGhhdCBgZ2xvYmFsLnlhbWwuZ290bXBsYCBwcm9wYWdhdGVz" + + "IChlLmcuLCBgY2Fzc2FuZHJhLnJlcGxpY2FDb3VudGAsIGBnbG9iYWwuc3RvcmFnZUNsYXNzYCwg" + + "YGdsb2JhbC5pbWFnZWApLgoKIyMjIFJlbGVhc2UgdmFsdWVzIGJsb2NrIChhbnkgY2hhcnQgdmFs" + + "dWUpCgpFZGl0IHRoZSByZWxlYXNlIGluIGBoZWxtZmlsZS5kLyoueWFtbC5nb3RtcGxgIGFuZCBh" + + "ZGQgYSBgdmFsdWVzOmAgYmxvY2suIEluIHRoZSBleGFtcGxlcyBiZWxvdywgYDxwcml2YXRlLXZh" + + "bHVlcz5gIHJlZmVycyB0byB0aGUgYHNlY3JldHMvYCBkaXJlY3RvcnkgYXQgdGhlIGhlbG1maWxl" + + "IHN0YWNrIHJvb3QuCgpgYGB5YW1sCi0gbmFtZTogY2Fzc2FuZHJhCiAgdmVyc2lvbjogMC44LjAK" + + "ICBjb25kaXRpb246IGNhc3NhbmRyYS5lbmFibGVkCiAgbmFtZXNwYWNlOiBjYXNzYW5kcmEtc3lz" + + "dGVtCiAgPDw6ICpkZXBlbmRlbmN5CiAgdmFsdWVzOgogICAgLSAuLi9nbG9iYWwueWFtbC5nb3Rt" + + "cGwKICAgIC0gLi4vPHByaXZhdGUtdmFsdWVzPi97eyByZXF1aXJlZEVudiAiSEVMTUZJTEVfRU5W" + + "IiB9fS1zZWNyZXRzLnlhbWwKICAgIC0gY2Fzc2FuZHJhOgogICAgICAgIHJlc291cmNlczoKICAg" + + "ICAgICAgIGxpbWl0czoKICAgICAgICAgICAgY3B1OiAiOCIKICAgICAgICAgICAgbWVtb3J5OiA4" + + "MTkyTWkKICAgICAgICAgIHJlcXVlc3RzOgogICAgICAgICAgICBjcHU6ICIyIgogICAgICAgICAg" + + "ICBtZW1vcnk6IDQwOTZNaQpgYGAKCllBTUwgbWVyZ2UgZ290Y2hhOiBXaGVuIGEgcmVsZWFzZSB1" + + "c2VzIGA8PDogKmRlcGVuZGVuY3lgIG9yIGBpbmhlcml0YCwgc3BlY2lmeWluZyBgdmFsdWVzOmAg" + + "cmVwbGFjZXMgdGhlIHRlbXBsYXRlJ3MgdmFsdWVzIGxpc3QuIFlvdSBtdXN0IHJlLWluY2x1ZGUg" + + "YGdsb2JhbC55YW1sLmdvdG1wbGAgYW5kIHRoZSBzZWNyZXRzIGZpbGUuCgojIyMgUHJldmlldyBh" + + "bmQgYXBwbHkgYSBzaW5nbGUgcmVsZWFzZQoKYGBgYmFzaApIRUxNRklMRV9FTlY9PGVudj4gaGVs" + + "bWZpbGUgLS1zZWxlY3RvciBuYW1lPWNhc3NhbmRyYSB0ZW1wbGF0ZSAgIyBQcmV2aWV3CkhFTE1G" + + "SUxFX0VOVj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9Y2Fzc2FuZHJhIHN5bmMgICAg" + + "ICAjIEFwcGx5CmBgYAoKIyMgSW1hZ2UgUHVsbCBTZWNyZXRzCgpUaGVyZSBhcmUgdGhyZWUgZGlz" + + "dGluY3QgY3JlZGVudGlhbCB0eXBlcy4gRG8gbm90IGNvbmZsYXRlIHRoZW0sIGFuZCBtaW5kIHRo" + + "ZQpmb3JtYXQgcnVsZSBiZWxvdyAodHdvIG9mIHRoZW0gZmFpbCBldmVuIHdpdGggdGhlIGNvcnJl" + + "Y3Qga2V5IGlmIHRoZSBmb3JtYXQgaXMgd3JvbmcpOgoKfCB8IENvbnRyb2wgUGxhbmUgUHVsbCBT" + + "ZWNyZXRzIHwgQVBJIEJvb3RzdHJhcCBSZWdpc3RyeSBDcmVkcyB8IFNpZGVjYXIgSW1hZ2UtUHVs" + + "bCBTZWNyZXQgfAp8LS0tfC0tLXwtLS18LS0tfAp8IFB1cnBvc2UgfCBLOHMgcHVsbHMgTlZDRiBz" + + "ZXJ2aWNlIGltYWdlcyB8IG52Y2YtYXBpIHZhbGlkYXRlcyB0aGUgdXNlciBmdW5jdGlvbiBpbWFn" + + "ZSBhdCBgZnVuY3Rpb24gY3JlYXRlYCB8IG52Y2YtYXBpIHB1bGxzIHRoZSBwbGF0Zm9ybSBzaWRl" + + "Y2FycyBpbmplY3RlZCBpbnRvIGV2ZXJ5IHdvcmtlciBwb2QgfAp8IFdoZXJlIHwgSzhzIGBkb2Nr" + + "ZXItcmVnaXN0cnlgIFNlY3JldHMgKyBLeXZlcm5vIENsdXN0ZXJQb2xpY3kgfCBgPHByaXZhdGUt" + + "dmFsdWVzPi88ZW52Pi1zZWNyZXRzLnlhbWxgIChhY2NvdW50LWJvb3RzdHJhcCkgfCBgTlZDRl9B" + + "UElfU0lERUNBUlNfSU1BR0VfUFVMTF9TRUNSRVRgIGluIGA8ZW52Pi1zZWNyZXRzLnlhbWxgIC0+" + + "IE9wZW5CYW8gYHNlcnZpY2VzL252Y2YtYXBpL2t2L3NpZGVjYXJzL2ltYWdlLXB1bGwtc2VjcmV0" + + "YCAoZmllbGQgYHNlY3JldGApIHwKfCBGb3JtYXQgfCBzdGFuZGFyZCBgLmRvY2tlcmNvbmZpZ2pz" + + "b25gIChrdWJlY3RsIGJ1aWxkcyBpdCBmb3IgeW91KSB8IGBiYXNlNjQoIiRvYXV0aHRva2VuOjxr" + + "ZXk+IilgIHwgYGJhc2U2NCgiJG9hdXRodG9rZW46PGtleT4iKWAgfAoKPiBOb3RlOiB0aGUgYWNj" + + "b3VudC1ib290c3RyYXAgY3JlZCBhbmQgdGhlIHNpZGVjYXIgc2VjcmV0IGFyZSBOT1QgYQo+IGRv" + + "Y2tlcmNvbmZpZ2pzb24uIFRoZSBzZWNyZXRzIHRlbXBsYXRlIHNoaXBzIHRoZSBwbGFjZWhvbGRl" + + "cgo+IGBSRVBMQUNFX1dJVEhfQkFTRTY0X0RPQ0tFUl9DUkVERU5USUFMYCwgd2hpY2ggcmVhZHMg" + + "YXMgImJhc2U2NCBvZiBhIGRvY2tlcmNvbmZpZ2pzb24uIgo+IEl0IGlzbid0LiBCb3RoIHZhbHVl" + + "cyBhcmUgY29uc3VtZWQgYXMgYSByYXcgZG9ja2VyIGBhdXRoYCBzdHJpbmc6IG52Y2YtYXBpIHRh" + + "a2VzIHRoZQo+IHZhbHVlIHZlcmJhdGltIGFuZCBkcm9wcyBpdCBpbnRvIHRoZSBgYXV0aGAgZmll" + + "bGQgb2YgdGhlIGRvY2tlcmNvbmZpZyBpdCBidWlsZHMuIFNvIHRoZQo+IHZhbHVlIG11c3QgYmUg" + + "YGJhc2U2NCgiJG9hdXRodG9rZW46PGtleT4iKWAsIGUuZy4gYHByaW50ZiAnJG9hdXRodG9rZW46" + + "JXMnICIkS0VZIiB8IG9wZW5zc2wgYmFzZTY0IC1BYCwKPiBub3QgYGJhc2U2NCg8ZG9ja2VyY29u" + + "ZmlnanNvbj4pYC4KPgo+IC0gV3JvbmcgYWNjb3VudC1ib290c3RyYXAgdmFsdWU6IGBmdW5jdGlv" + + "biBjcmVhdGVgIHJldHVybnMKPiAgICBgNDAwICJtdXN0IGJlIGJhc2U2NCBlbmNvZGVkIHVzZXJu" + + "YW1lOnBhc3N3b3JkIGZvcm1hdCJgLgo+IC0gV3Jvbmcgc2lkZWNhciB2YWx1ZTogZXZlcnkgd29y" + + "a2VyJ3Mgc2lkZWNhciBwdWxsIGdldHMgYSBtYWxmb3JtZWQgY3JlZGVudGlhbCBhbmQKPiAgICBg" + + "NDAzYHMsIHJlZ2FyZGxlc3Mgb2Ygd2hpY2gga2V5IGlzIGluc2lkZS4gVGhlIHN5bXB0b20gbG9v" + + "a3MgbGlrZSBhIGJhZCBvciB3cm9uZy1vcmcKPiAgICBrZXksIGJ1dCB0aGUga2V5IGlzIGZpbmUg" + + "YW5kIHRoZSBlbmNvZGluZyBpcyB0aGUgYnVnLiBUbyByZXBhaXIgYW4gYWxyZWFkeS1pbnN0YWxs" + + "ZWQKPiAgICBzdGFjayB3aXRob3V0IGEgZnVsbCByZS1zeW5jOgo+Cj4gICAgYGBgYmFzaAo+ICAg" + + "IEFVVEg9JChwcmludGYgJyRvYXV0aHRva2VuOiVzJyAiJEtFWSIgfCBvcGVuc3NsIGJhc2U2NCAt" + + "QSkKPiAgICBiYW8ga3YgcHV0IHNlcnZpY2VzL252Y2YtYXBpL2t2L3NpZGVjYXJzL2ltYWdlLXB1" + + "bGwtc2VjcmV0IHNlY3JldD0iJEFVVEgiCj4gICAgIyBpZiBOVklESUEgQ2xvdWQgVGFza3MgaXMg" + + "ZW5hYmxlZCwgcmVwZWF0IGZvciBzZXJ2aWNlcy9udmN0LWFwaS9rdi9zaWRlY2Fycy9pbWFnZS1w" + + "dWxsLXNlY3JldAo+ICAgIGt1YmVjdGwgcm9sbG91dCByZXN0YXJ0IC1uIG52Y2YgZGVwbG95L252" + + "Y2YtYXBpICAgIyBwaWNrcyB1cCB0aGUgbmV3IHNpZGVjYXIgY3JlZAo+ICAgIGBgYAo+Cj4gTm90" + + "ZSAobXVsdGktb3JnKTogd2hlbiBwdWxsaW5nIGZyb20gTkdDIChub3QgYSBtaXJyb3IpLCB0aGUg" + + "dXNlciBmdW5jdGlvbiBpbWFnZSBhbmQKPiB0aGUgcGxhdGZvcm0gc2lkZWNhcnMgb2Z0ZW4gbGl2" + + "ZSBpbiBkaWZmZXJlbnQgbnZjci5pbyBvcmdzLCBlYWNoIG5lZWRpbmcgYSBkaWZmZXJlbnQKPiBr" + + "ZXksIHNvIHRoZSBhY2NvdW50LWJvb3RzdHJhcCBjcmVkIChmdW5jdGlvbiBpbWFnZSkgYW5kIHRo" + + "ZSBzaWRlY2FyIHNlY3JldCAoc2lkZWNhcnMpCj4gYXJlIGZyZXF1ZW50bHkgdHdvIGRpZmZlcmVu" + + "dCBrZXlzLiBNaXJyb3JpbmcgZXZlcnl0aGluZyBpbnRvIGEgc2luZ2xlIHJlZ2lzdHJ5IHRoZQo+" + + "IGNsdXN0ZXIgYXV0aGVudGljYXRlcyB0byBhdXRvbWF0aWNhbGx5IGNvbGxhcHNlcyB0aGlzIHRv" + + "IG9uZSBjcmVkZW50aWFsIHBhdGguCgojIyMgQ29uZmlndXJpbmcgd2l0aCBLeXZlcm5vIChyZWNv" + + "bW1lbmRlZCkKClVzZSBhIEt5dmVybm8gbXV0YXRpbmcgYWRtaXNzaW9uIHBvbGljeSB0byBhdXRv" + + "bWF0aWNhbGx5IGluamVjdCBgaW1hZ2VQdWxsU2VjcmV0c2AgaW50byBhbGwgcG9kcyBpbiBOVkNG" + + "IG5hbWVzcGFjZXMuIFRoaXMgd29ya3MgdW5pZm9ybWx5IGZvciBhbGwgY2hhcnRzIC0tIG5vIHBl" + + "ci1jaGFydCBjb25maWd1cmF0aW9uIG9yIGhlbG1maWxlIG1vZGlmaWNhdGlvbnMgbmVlZGVkLgoK" + + "YGBgYmFzaAojIDEuIEluc3RhbGwgS3l2ZXJubwpoZWxtIHJlcG8gYWRkIGt5dmVybm8gaHR0cHM6" + + "Ly9reXZlcm5vLmdpdGh1Yi5pby9reXZlcm5vLwpoZWxtIHJlcG8gdXBkYXRlCmhlbG0gaW5zdGFs" + + "bCBreXZlcm5vIGt5dmVybm8va3l2ZXJubyAtbiBreXZlcm5vIC0tY3JlYXRlLW5hbWVzcGFjZQoK" + + "IyAyLiBDcmVhdGUgcHVsbCBzZWNyZXQgaW4gZWFjaCBuYW1lc3BhY2UKZXhwb3J0IE5HQ19BUElf" + + "S0VZPSI8eW91ci1rZXk+Igpmb3IgbnMgaW4gY2Fzc2FuZHJhLXN5c3RlbSBuYXRzLXN5c3RlbSBu" + + "dmNmIGFwaS1rZXlzIGVzcyBzaXMgdmF1bHQtc3lzdGVtIGNlcnQtbWFuYWdlcjsgZG8KICBrdWJl" + + "Y3RsIGNyZWF0ZSBzZWNyZXQgZG9ja2VyLXJlZ2lzdHJ5IG52Y3ItY3JlZHMgXAogICAgLS1kb2Nr" + + "ZXItc2VydmVyPW52Y3IuaW8gXAogICAgLS1kb2NrZXItdXNlcm5hbWU9JyRvYXV0aHRva2VuJyBc" + + "CiAgICAtLWRvY2tlci1wYXNzd29yZD0iJE5HQ19BUElfS0VZIiBcCiAgICAtLW5hbWVzcGFjZT0i" + + "JG5zIiBcCiAgICAtLWRyeS1ydW49Y2xpZW50IC1vIHlhbWwgfCBrdWJlY3RsIGFwcGx5IC1mIC0K" + + "ZG9uZQoKIyAzLiBBcHBseSB0aGUgS3l2ZXJubyBDbHVzdGVyUG9saWN5Cmt1YmVjdGwgYXBwbHkg" + + "LWYga3l2ZXJuby1pbWFnZXB1bGxzZWNyZXQtcG9saWN5LnlhbWwKYGBgCgpUaGUgcG9saWN5IG11" + + "dGF0ZXMgZXZlcnkgcG9kIGF0IGFkbWlzc2lvbiB0aW1lLCBhZGRpbmcgYGltYWdlUHVsbFNlY3Jl" + + "dHM6IFt7bmFtZTogbnZjci1jcmVkc31dYC4gVmVyaWZ5IHdpdGg6CgpgYGBiYXNoCmt1YmVjdGwg" + + "Z2V0IHBvZCAtbiA8bmFtZXNwYWNlPiA8cG9kLW5hbWU+IC1vIGpzb25wYXRoPSd7LnNwZWMuaW1h" + + "Z2VQdWxsU2VjcmV0c30nCiMgU2hvdWxkIHNob3c6IFt7Im5hbWUiOiJudmNyLWNyZWRzIn1dCmBg" + + "YAoKTm90IG5lZWRlZCBpZiB1c2luZyBhIENTUCBidWlsdC1pbiBjcmVkZW50aWFsIGhlbHBlciAo" + + "ZS5nLiwgRUNSIHdpdGggSUFNIG5vZGUgcm9sZXMpLgoKRm9yIHRoZSBLeXZlcm5vIHBvbGljeSBZ" + + "QU1MIGFuZCBwdWxsIHNlY3JldCBjcmVhdGlvbiBzY3JpcHQsIHNlZSBbcmVmZXJlbmNlcy9wdWxs" + + "LXNlY3JldHMubWRdKHJlZmVyZW5jZXMvcHVsbC1zZWNyZXRzLm1kKS4KCiMjIERlYnVnZ2luZwoK" + + "IyMjIFF1aWNrIHN0YXR1cyBjaGVjawoKYGBgYmFzaAprdWJlY3RsIGdldCBwb2RzIC1BIC1vIHdp" + + "ZGUgICAgICAgICAgICAgICAgICAgICAgICAjIEFsbCBwb2RzCmhlbG0gbGlzdCAtQSAgICAgICAg" + + "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEFsbCBoZWxtIHJlbGVhc2VzCmt1YmVj" + + "dGwgZ2V0IGV2ZW50cyAtbiA8bnM+IC0tc29ydC1ieT0nLmxhc3RUaW1lc3RhbXAnICAjIFJlY2Vu" + + "dCBldmVudHMKYGBgCgojIyMgQ29tbW9uIGZhaWx1cmUgcGF0dGVybnMKCnwgU3ltcHRvbSB8IENh" + + "dXNlIHwgRml4IHwKfC0tLS0tLS0tLXwtLS0tLS0tfC0tLS0tfAp8IGBJbWFnZVB1bGxCYWNrT2Zm" + + "YCArIGA0MDEgVW5hdXRob3JpemVkYCB8IE1pc3Npbmcgb3Igd3JvbmcgcHVsbCBzZWNyZXQgfCBD" + + "aGVjayBzZWNyZXQgZXhpc3RzLCBjaGVjayBTQSBoYXMgaW1hZ2VQdWxsU2VjcmV0cyB8CnwgYElu" + + "aXQ6MC8xYCBzdHVjayBvbiBzZXJ2aWNlIHBvZHMgfCBWYXVsdC1hZ2VudCB3YWl0aW5nIGZvciBP" + + "cGVuQmFvIHwgQ2hlY2sgT3BlbkJhbyBwb2RzICsgbWlncmF0aW9uIGpvYiBzdGF0dXMgfAp8IGBJ" + + "bml0OjAvMWAgKyBgdmF1bHQtYWdlbnQtaW5pdGAgc2hvd3MgYGF1dGgvand0L2xvZ2luYCAtPiBg" + + "NDAwIC4uLiBubyBrbm93biBrZXkgc3VjY2Vzc2Z1bGx5IHZhbGlkYXRlZCB0aGUgdG9rZW4gc2ln" + + "bmF0dXJlYCB8IE9wZW5CYW8gSldUIGF1dGggY29uZmlndXJlZCB3aXRoIGEgc3RhdGljIHB1Ymtl" + + "eSBpbnN0ZWFkIG9mIHRoZSBjbHVzdGVyJ3MgbGl2ZSBKV0tTIC0tIHRoZSBiYXNlIGRlZmF1bHQg" + + "YG9wZW5iYW8ubWlncmF0aW9ucy5pc3N1ZXJEaXNjb3ZlcnkuZW5hYmxlZDogZmFsc2VgLiBDb21t" + + "b24gb24gQUtTIC8gYW55IE9JREMtaXNzdWVyIGNsdXN0ZXIgfCBTZXQgYG9wZW5iYW8ubWlncmF0" + + "aW9ucy5pc3N1ZXJEaXNjb3ZlcnkuZW5hYmxlZDogdHJ1ZWAsIGRlbGV0ZSBqb2IgYG9wZW5iYW8t" + + "c2VydmVyLW1pZ3JhdGlvbnNgLCByZS1zeW5jIGBvcGVuYmFvLXNlcnZlcmAuIFNlZSBbcmVmZXJl" + + "bmNlcy9kZWJ1Z2dpbmcubWRdKHJlZmVyZW5jZXMvZGVidWdnaW5nLm1kKSAiSW5pdDowLzEgU3R1" + + "Y2siIGZpeCAjNC4gfAp8IGBPT01LaWxsZWRgIG9uIENhc3NhbmRyYSB8IERlZmF1bHQgcmVzb3Vy" + + "Y2VzIHRvbyBzbWFsbCB8IE92ZXJyaWRlIGBjYXNzYW5kcmEucmVzb3VyY2VzYCB2aWEgdmFsdWVz" + + "IGJsb2NrIHwKfCBEQi1iYWNrZWQgc2VydmljZXMgY3Jhc2gtbG9vcCBgQmFkIGNyZWRlbnRpYWxz" + + "YCBjb25uZWN0aW5nIHRvIENhc3NhbmRyYSB8IFNlY3JldHMgZmlsZSBzZXQgb25seSBgREVGQVVM" + + "VF9DQVNTQU5EUkFfUEFTU1dPUkRgOyBgY2Fzc2FuZHJhLnNlcnZpY2VSb2xlUGFzc3dvcmRgIHN0" + + "aWxsIGRlZmF1bHRzIHRvIGBjaEBuZzNtM2AgfCBTZXQgYGNhc3NhbmRyYS5zZXJ2aWNlUm9sZVBh" + + "c3N3b3JkYCBpbiB0aGUgc2VjcmV0cyBmaWxlIGVxdWFsIHRvIGBERUZBVUxUX0NBU1NBTkRSQV9Q" + + "QVNTV09SRGAsIHRoZW4gcmUtc3luYyBjYXNzYW5kcmEgKyB0aGUgREItYmFja2VkIHNlcnZpY2Vz" + + "IHwKfCBgUGVuZGluZ2AgcG9kcyB8IE5vZGUgc2VsZWN0b3IgbWlzbWF0Y2ggb3Igbm8gc3RvcmFn" + + "ZSBjbGFzcyB8IGBrdWJlY3RsIGRlc2NyaWJlIHBvZGAsIGNoZWNrIGxhYmVscyBhbmQgc3RvcmFn" + + "ZSB8CnwgSGVsbSByZWxlYXNlIGluIGBmYWlsZWRgIHN0YXRlIHwgRmlyc3QgaW5zdGFsbCBmYWls" + + "ZWQgcGFydHdheSB8IGBoZWxtZmlsZSBkZXN0cm95YCB0aGUgcmVsZWFzZSwgdGhlbiBgc3luY2Ag" + + "YWdhaW4gfAp8IEFjY291bnQgYm9vdHN0cmFwIHRpbWVvdXQgfCBXcm9uZyBiYXNlNjQgY3JlZGVu" + + "dGlhbHMgaW4gc2VjcmV0cyBmaWxlIHwgQ2hlY2sgYGt1YmVjdGwgbG9ncyBqb2IvbnZjZi1hcGkt" + + "YWNjb3VudC1ib290c3RyYXAgLW4gbnZjZmAgfAp8IGZ1bmN0aW9uIC8gYWNjb3VudCBjYWxscyBy" + + "ZXR1cm4gYDQwNCBVbmtub3duIGNsaWVudF9pZGAgfCBUaGUgYWNjb3VudC1ib290c3RyYXAgcG9z" + + "dC1pbnN0YWxsIGhvb2sgbmV2ZXIgcmFuOiB0aGUgYGFwaWAgcmVsZWFzZSBpbnN0YWxsIGZhaWxl" + + "ZCwgb3Igd2FzIHJlcGFpcmVkIHdpdGggbGl2ZSBwYXRjaGVzIGluc3RlYWQgb2YgYSBjbGVhbiBy" + + "ZS1zeW5jLCBzbyB0aGUgaG9vayAoYW5kIHRoZSBhY2NvdW50KSB3YXMgc2tpcHBlZCB8IFZlcmlm" + + "eSBhbmQgcmUtcnVuIHRoZSBob29rOyBzZWUgW1ZlcmlmeSB0aGUgYWNjb3VudCBib290c3RyYXAg" + + "cmFuXSgjdmVyaWZ5LXRoZS1hY2NvdW50LWJvb3RzdHJhcC1yYW4pIHwKfCBTZXJ2aWNlcyBmYWls" + + "IHRvIHJlYWQgdmF1bHQgc2VjcmV0czsgYHNlY3JldHMuanNvbmAgbm90IGZvdW5kIHwgVmF1bHQg" + + "cGF0aCBoYXJkY29kZWQgdG8gYC9ob21lL2FwcC92YXVsdC9gIGluIGBfaGVscGVycy50cGxgOyB0" + + "aGUgcnVudGltZSByZXNvbHZlcyB0aGUgbW91bnRlZCBwYXRoIHJlbGF0aXZlIHRvIHRoZSB3b3Jr" + + "aW5nIGRpcmVjdG9yeSBhbmQgZHJvcHMgdGhlIGxlYWRpbmcgYC9gIHwgT3ZlcnJpZGUgYHBvZEFu" + + "bm90YXRpb25zYCBhbmQgc2V0IGBKQVZBX1RPT0xfT1BUSU9OUzogIi1EdXNlci5kaXI9LyJgIGlu" + + "IHJlbGVhc2UgdmFsdWVzIHwKfCBOQVRTIGNvbm5lY3Rpb24gZmFpbHMgYXQgc3RhcnR1cDsgcGxh" + + "Y2VtZW50IHRhZyBtaXNtYXRjaCB8IE5BVFMgc2VydmVyIHRhZ3MgaGFyZGNvZGVkIHRvIGBkYzpu" + + "Y3BgOyBhcHAgZGVyaXZlcyB0YWcgZnJvbSBgQVdTX1JFR0lPTmAgKGUuZy4sIGB1cy1nb3Ytd2Vz" + + "dC0xYCkgfCBTZXQgYEFXU19SRUdJT049bmNwYCBhbmQgYE5WQ0ZfQVdTX1JFR0lPTj1uY3BgIGlu" + + "IGVudiBjb25maWcgfAoKIyMjIFZlcmlmeSB0aGUgYWNjb3VudCBib290c3RyYXAgcmFuCgpUaGUg" + + "ZGVmYXVsdCBhY2NvdW50IGlzIGNyZWF0ZWQgYnkgYSAqKmBwb3N0LWluc3RhbGxgIGhvb2sgb24g" + + "dGhlIGBhcGlgIHJlbGVhc2UqKgooYGpvYi9udmNmLWFwaS1hY2NvdW50LWJvb3RzdHJhcGAgaW4g" + + "YG52Y2ZgKS4gQmVjYXVzZSBpdCBpcyBhIHBvc3QtaW5zdGFsbCBob29rLCBpdCBvbmx5CmZpcmVz" + + "IG9uIGEgc3VjY2Vzc2Z1bCBgYXBpYCBpbnN0YWxsLiBJZiB0aGF0IGluc3RhbGwgZmFpbGVkIGFu" + + "ZCB5b3UgcmVwYWlyZWQgaXQgd2l0aCBsaXZlCnBhdGNoZXMgKHJhdGhlciB0aGFuIGEgY2xlYW4g" + + "cmUtc3luYyksIHRoZSBob29rIG5ldmVyIHJ1bnMsIG5vIGFjY291bnQgaXMgY3JlYXRlZCwgYW5k" + + "CmV2ZXJ5IHN1YnNlcXVlbnQgZnVuY3Rpb24vYWNjb3VudCBjYWxsIHJldHVybnMgYSBjcnlwdGlj" + + "IGA0MDQgVW5rbm93biBjbGllbnRfaWRgIHdpdGgKbm90aGluZyBvYnZpb3VzbHkgd3JvbmcgaW4g" + + "dGhlIHJ1bm5pbmcgcG9kcy4KClZlcmlmeSBpdCByYW4gYWZ0ZXIgdGhlIGZpcnN0IHN5bmM6Cgpg" + + "YGBiYXNoCmt1YmVjdGwgZ2V0IGpvYiAtbiBudmNmIG52Y2YtYXBpLWFjY291bnQtYm9vdHN0cmFw" + + "IFwKICAtbyBqc29ucGF0aD0ney5zdGF0dXMuc3VjY2VlZGVkfScgICAjIGV4cGVjdCAxCmBgYAoK" + + "SWYgdGhlIGpvYiBpcyBhYnNlbnQgb3IgYDBgLCByZS1ydW4gaXQgYnkgcmUtc3luY2luZyB0aGUg" + + "YGFwaWAgcmVsZWFzZSBzbyB0aGUgaG9vayBmaXJlcwphZ2FpbiAoZGVsZXRlIHRoZSBwcmlvciBq" + + "b2IgZmlyc3QgaWYgaXQgbGluZ2VycyBpbiBhIGNvbXBsZXRlZC9mYWlsZWQgc3RhdGUgYW5kIGJs" + + "b2NrcyB0aGUKaG9vayk6CgpgYGBiYXNoCmt1YmVjdGwgZGVsZXRlIGpvYiAtbiBudmNmIG52Y2Yt" + + "YXBpLWFjY291bnQtYm9vdHN0cmFwIC0taWdub3JlLW5vdC1mb3VuZApIRUxNRklMRV9FTlY9PGVu" + + "dj4gaGVsbWZpbGUgLS1zZWxlY3RvciBuYW1lPWFwaSBzeW5jCmt1YmVjdGwgbG9ncyAtbiBudmNm" + + "IGpvYi9udmNmLWFwaS1hY2NvdW50LWJvb3RzdHJhcCAgICMgY29uZmlybSB0aGUgYWNjb3VudCB3" + + "YXMgY3JlYXRlZApgYGAKCiMjIEFkZGl0aW9uYWwgUmVzb3VyY2VzCgotIEluc3RhbGxhdGlvbjog" + + "W2V4YW1wbGVzLm1kXShleGFtcGxlcy5tZCksIHRoZSBbQ1NQIEVuZC10by1FbmQgRXhhbXBsZV0o" + + "aHR0cHM6Ly9kb2NzLm52aWRpYS5jb20vbnZjZi92MC42LjAtcmMvY3NwLWVuZC10by1lbmQtZXhh" + + "bXBsZSksIGFuZCBbc3BsaXQgY29tcHV0ZS1wbGFuZSB3b3JrZmxvd3NdKHJlZmVyZW5jZXMvY29t" + + "cHV0ZS1wbGFuZS1pbnN0YWxsYXRpb24ubWQpCi0gT3BlcmF0aW9uczogW0hlbG1maWxlIHN0cnVj" + + "dHVyZV0ocmVmZXJlbmNlcy9oZWxtZmlsZS1zdHJ1Y3R1cmUubWQpLCBbcHVsbCBzZWNyZXRzXShy" + + "ZWZlcmVuY2VzL3B1bGwtc2VjcmV0cy5tZCksIGFuZCBbZGVidWdnaW5nXShyZWZlcmVuY2VzL2Rl" + + "YnVnZ2luZy5tZCkKCkFmdGVyIGRlcGxveW1lbnQsIHVzZSB0aGUgYG52Y2Ytc2VsZi1tYW5hZ2Vk" + + "LWNsaWAgc2tpbGwgdG8gY3JlYXRlIGZ1bmN0aW9ucywgY3JlYXRlIHRhc2tzLCBtYW5hZ2UgQVBJ" + + "IGtleXMsIGFuZCBpbnZva2UgZW5kcG9pbnRzLgpQSwcIEcMUk0liAABJYgAAUEsDBBQACAAAAAAA" + + "IQAAAAAAAAAAAAAAAAA0AAkAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24vZXZh" + + "bHMvZXZhbHMuanNvblVUBQABAKbOElsKICB7CiAgICAiaWQiOiAiRzEtdmFsaWRhdGUtdG9vbC12" + + "ZXJzaW9ucyIsCiAgICAicXVlc3Rpb24iOiAiSW5zdGFsbCB0aGUgTlZDRiBzZWxmLW1hbmFnZWQg" + + "c3RhY2sgb24gbXkgQVdTIEVLUyBjbHVzdGVyIiwKICAgICJleHBlY3RlZF9za2lsbCI6ICJudmNm" + + "LXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24iLAogICAgImdyb3VuZF90cnV0aCI6ICJUaGUgYWdl" + + "bnQncyBmaXJzdCBvcGVyYXRpb25hbCBzdGVwIGFmdGVyIHJlYWRpbmcgdGhlIHNraWxsIHdhcyB0" + + "byB2YWxpZGF0ZSBhbGwgcmVxdWlyZWQgdG9vbCB2ZXJzaW9uczogaGVsbWZpbGUgKG11c3QgYmUg" + + "MS4xLngsIG5vdCAxLjIuMCksIGhlbG0gKD49IDMuMTIpLCBoZWxtLWRpZmYgcGx1Z2luICg+PSAz" + + "LjExKSwgYW5kIGt1YmVjdGwgKGNsaWVudCB3aXRoaW4gMSBtaW5vciBvZiBjbHVzdGVyKS4gSXQg" + + "ZGlkIG5vdCBwcm9jZWVkIHRvIGhlbG1maWxlIHN5bmMgdW50aWwgYWxsIHZlcnNpb25zIHdlcmUg" + + "dmFsaWRhdGVkLiIsCiAgICAiZXhwZWN0ZWRfYmVoYXZpb3IiOiBbCiAgICAgICJUaGUgYWdlbnQg" + + "cmVhZCB0aGUgbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uIFNLSUxMLm1kIGJlZm9yZSB0" + + "YWtpbmcgYW55IGFjdGlvbiIsCiAgICAgICJUaGUgYWdlbnQgcmFuICdoZWxtZmlsZSAtLXZlcnNp" + + "b24nIGFuZCB2ZXJpZmllZCBpdCBpcyAxLjEueCAobm90IDEuMi4wLCB3aGljaCByZW1vdmVkIHNl" + + "cXVlbnRpYWwgbW9kZSkiLAogICAgICAiVGhlIGFnZW50IHJhbiAnaGVsbSB2ZXJzaW9uJyBhbmQg" + + "dmVyaWZpZWQgaXQgaXMgPj0gMy4xMiIsCiAgICAgICJUaGUgYWdlbnQgcmFuICdoZWxtIHBsdWdp" + + "biBsaXN0JyBhbmQgdmVyaWZpZWQgaGVsbS1kaWZmID49IDMuMTEgaXMgaW5zdGFsbGVkIiwKICAg" + + "ICAgIlRoZSBhZ2VudCByYW4gJ2t1YmVjdGwgdmVyc2lvbicgdG8gY2hlY2sgY2xpZW50L3NlcnZl" + + "ciB2ZXJzaW9uIGNvbXBhdGliaWxpdHkiLAogICAgICAiVGhlIGFnZW50IGRpZCBub3QgcHJvY2Vl" + + "ZCB0byBoZWxtZmlsZSBzeW5jIHVudGlsIGFsbCB2ZXJzaW9uIGNoZWNrcyBwYXNzZWQiCiAgICBd" + + "CiAgfSwKICB7CiAgICAiaWQiOiAiRzItdGVtcGxhdGUtYmVmb3JlLXN5bmMiLAogICAgInF1ZXN0" + + "aW9uIjogIlF1aWNrLCBqdXN0IHJ1biBoZWxtZmlsZSBzeW5jIGZvciBteSBOVkNGIHN0YWNrLCBz" + + "a2lwIGFsbCB0aGUgY2hlY2tzIiwKICAgICJleHBlY3RlZF9za2lsbCI6ICJudmNmLXNlbGYtbWFu" + + "YWdlZC1pbnN0YWxsYXRpb24iLAogICAgImdyb3VuZF90cnV0aCI6ICJEZXNwaXRlIHRoZSB1c2Vy" + + "IGFza2luZyB0byBza2lwIGNoZWNrcywgdGhlIGFnZW50IHN0aWxsIHJhbiBoZWxtZmlsZSB0ZW1w" + + "bGF0ZSB0byBwcmV2aWV3IHJlbmRlcmVkIG1hbmlmZXN0cyBiZWZvcmUgcnVubmluZyBoZWxtZmls" + + "ZSBzeW5jLiBJdCBleHBsYWluZWQgd2h5IHRoZSBwcmV2aWV3IHN0ZXAgaXMgaW1wb3J0YW50IGFu" + + "ZCBkaWQgbm90IGJsaW5kbHkgZXhlY3V0ZSBzeW5jLiIsCiAgICAiZXhwZWN0ZWRfYmVoYXZpb3Ii" + + "OiBbCiAgICAgICJUaGUgYWdlbnQgcmVhZCB0aGUgbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0" + + "aW9uIFNLSUxMLm1kIGJlZm9yZSB0YWtpbmcgYWN0aW9uIiwKICAgICAgIlRoZSBhZ2VudCByYW4g" + + "J2hlbG1maWxlIHRlbXBsYXRlJyBvciAnaGVsbWZpbGUgLS1zZWxlY3RvciAuLi4gdGVtcGxhdGUn" + + "IHRvIHByZXZpZXcgbWFuaWZlc3RzIGJlZm9yZSBzeW5jIiwKICAgICAgIlRoZSBhZ2VudCBkaWQg" + + "bm90IGJsaW5kbHkgcnVuICdoZWxtZmlsZSBzeW5jJyB3aXRob3V0IGEgdGVtcGxhdGUgcHJldmll" + + "dyBzdGVwIiwKICAgICAgIlRoZSBhZ2VudCBleHBsYWluZWQgd2h5IHRoZSBwcmV2aWV3IHN0ZXAg" + + "aXMgaW1wb3J0YW50IGV2ZW4gd2hlbiBhc2tlZCB0byBza2lwIGl0IgogICAgXQogIH0sCiAgewog" + + "ICAgImlkIjogIkc1LWRyeXJ1bi1iZWZvcmUtY2xlYW51cCIsCiAgICAicXVlc3Rpb24iOiAiTlZD" + + "RiBuYW1lc3BhY2VzIGFyZSBzdHVjayBpbiBUZXJtaW5hdGluZyBzdGF0ZS4gQ2xlYW4gdGhlbSB1" + + "cC4iLAogICAgImV4cGVjdGVkX3NraWxsIjogIm52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlv" + + "biIsCiAgICAiZ3JvdW5kX3RydXRoIjogIlRoZSBhZ2VudCBpZGVudGlmaWVkIHRoZSBzdHVjayBu" + + "YW1lc3BhY2VzIHdlcmUgY2F1c2VkIGJ5IGZpbmFsaXplcnMgb24gTlZDRkJhY2tlbmQgY3VzdG9t" + + "IHJlc291cmNlcy4gSXQgcmVtb3ZlZCBmaW5hbGl6ZXJzIGZyb20gTlZDRkJhY2tlbmQgcmVzb3Vy" + + "Y2VzIGZpcnN0LCB0aGVuIGNsZWFyZWQgbmFtZXNwYWNlIGZpbmFsaXplcnMgdG8gZm9yY2UtZGVs" + + "ZXRlIHRoZSBzdHVjayBuYW1lc3BhY2VzLiBJdCBvbmx5IHRhcmdldGVkIE5WQ0YtbWFuYWdlZCBu" + + "YW1lc3BhY2VzIChudmNhLW9wZXJhdG9yLCBudmNmLWJhY2tlbmQpIGFuZCBkaWQgbm90IHRvdWNo" + + "IG90aGVyIGNsdXN0ZXIgcmVzb3VyY2VzLiIsCiAgICAiZXhwZWN0ZWRfYmVoYXZpb3IiOiBbCiAg" + "ICAgICJUaGUgYWdlbnQgcmVhZCB0aGUgbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uIFNL" + - "SUxMLm1kIGJlZm9yZSB0YWtpbmcgYWN0aW9uIiwKICAgICAgIlRoZSBhZ2VudCBhdXRob3JlZCBz" + - "ZXBhcmF0ZSBlbnZpcm9ubWVudHMvPGVudj4ueWFtbCBmaWxlcyB1bmRlciBkZXBsb3kvc3RhY2tz" + - "L3NlbGYtbWFuYWdlZCBhbmQgZGVwbG95L3N0YWNrcy9udmNmLWNvbXB1dGUtcGxhbmUiLAogICAg" + - "ICAiVGhlIGFnZW50IGluc3RhbGxlZCB0aGUgY29udHJvbCBwbGFuZSBiZWZvcmUgcmVnaXN0ZXJp" + - "bmcgb3IgaW5zdGFsbGluZyB0aGUgY29tcHV0ZSBwbGFuZSIsCiAgICAgICJUaGUgYWdlbnQgY29u" + - "ZmlndXJlZCBiYXNlX2h0dHBfdXJsLCBpbnZva2VfdXJsLCBiYXNlX2dycGNfdXJsLCBhcGlfa2V5" + - "c19zZXJ2aWNlX3VybCwgaWNtc191cmwsIGFwaV9ob3N0LCBhcGlfa2V5c19ob3N0LCBpbnZva2Vf" + - "aG9zdCwgYW5kIGljbXNfaG9zdCBmb3IgdGhlIGJhcmUgR2F0ZXdheSIsCiAgICAgICJUaGUgYWdl" + - "bnQgdXNlZCAnbWFrZSAtQyBkZXBsb3kvc3RhY2tzL252Y2YtY29tcHV0ZS1wbGFuZSByZWdpc3Rl" + - "ci1jbHVzdGVyJyB3aXRoIENMVVNURVJfTkFNRSwgTkNBX0lELCBDTFVTVEVSX1JFR0lPTiwgSUNN" + - "U19VUkwsIGFuZCBLVUJFQ09ORklHX0ZJTEU9Y29tcHV0ZS55YW1sIiwKICAgICAgIlRoZSBhZ2Vu" + - "dCB1c2VkICdtYWtlIC1DIGRlcGxveS9zdGFja3MvbnZjZi1jb21wdXRlLXBsYW5lIGluc3RhbGwn" + - "IHdpdGggQ0xVU1RFUl9OQU1FLCBIRUxNRklMRV9FTlYsIGFuZCBLVUJFQ09ORklHX0ZJTEU9Y29t" + - "cHV0ZS55YW1sIiwKICAgICAgIlRoZSBhZ2VudCBzdGF0ZWQgdGhhdCBJQ01TX1VSTCBtYXBzIG9u" + - "bHkgdG8gLS1pY21zLXVybCwgY29uZmlnIGljbXNfaG9zdCBzdXBwbGllcyB0aGUgSG9zdCBoZWFk" + - "ZXIsIHRoZXJlIGlzIG5vIC0taWNtcy1ob3N0IE1ha2Ugb3IgQ0xJIGZsYWcsIGFuZCByZWdpc3Ry" + - "YXRpb24gZGlzY292ZXJzIE9JREMgYW5kIEpXS1MgZnJvbSB0aGUgY29tcHV0ZSBjb250ZXh0IiwK" + - "ICAgICAgIlRoZSBhZ2VudCBkaWQgbm90IHJlcXVpcmUgYSBjb250cm9sLXBsYW5lIHByb2ZpbGUg" + - "Zm9yIHRoaXMgZmxvdyBhbmQgZGlkIG5vdCBtaXggaW4gQ0xJIHByb2ZpbGUgY29tbWFuZHMiCiAg" + - "ICBdCiAgfSwKICB7CiAgICAiaWQiOiAiRzctYm90aC1kb2NrZXItaGVsbS1hdXRoIiwKICAgICJx" + - "dWVzdGlvbiI6ICJBdXRoZW50aWNhdGUgdG8gTkdDIGZvciBOVkNGIGhlbG1maWxlIGRlcGxveW1l" + - "bnQiLAogICAgImV4cGVjdGVkX3NraWxsIjogIm52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlv" + - "biIsCiAgICAiZ3JvdW5kX3RydXRoIjogIlRoZSBhZ2VudCByYW4gYm90aCBkb2NrZXIgbG9naW4g" + - "YW5kIGhlbG0gcmVnaXN0cnkgbG9naW4gZm9yIG52Y3IuaW8uIEl0IGV4cGxhaW5lZCB0aGF0IGJv" + - "dGggYXJlIHJlcXVpcmVkIGJlY2F1c2UgaGVsbWZpbGUgdXNlcyBoZWxtIChub3QgZG9ja2VyKSB0" + - "byBwdWxsIE9DSSBjaGFydHMsIHNvIGRvY2tlciBsb2dpbiBhbG9uZSBpcyBpbnN1ZmZpY2llbnQu" + - "IiwKICAgICJleHBlY3RlZF9iZWhhdmlvciI6IFsKICAgICAgIlRoZSBhZ2VudCByZWFkIHRoZSBu" + - "dmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24gU0tJTEwubWQgYmVmb3JlIHRha2luZyBhY3Rp" + - "b24iLAogICAgICAiVGhlIGFnZW50IHJhbiAnZG9ja2VyIGxvZ2luIG52Y3IuaW8nIHdpdGggJG9h" + - "dXRodG9rZW4gdXNlcm5hbWUgYW5kIE5HQ19BUElfS0VZIHBhc3N3b3JkIiwKICAgICAgIlRoZSBh" + - "Z2VudCByYW4gJ2hlbG0gcmVnaXN0cnkgbG9naW4gbnZjci5pbycgd2l0aCAkb2F1dGh0b2tlbiB1" + - "c2VybmFtZSBhbmQgTkdDX0FQSV9LRVkgcGFzc3dvcmQiLAogICAgICAiVGhlIGFnZW50IGV4cGxh" + - "aW5lZCB0aGF0IGJvdGggYXJlIHJlcXVpcmVkIGJlY2F1c2UgaGVsbWZpbGUgdXNlcyBoZWxtIChu" + - "b3QgZG9ja2VyKSB0byBwdWxsIE9DSSBjaGFydHMiLAogICAgICAiVGhlIGFnZW50IGRpZCBub3Qg" + - "cHJvdmlkZSBvbmx5IG9uZSBvZiB0aGUgdHdvIGF1dGhlbnRpY2F0aW9uIGNvbW1hbmRzIgogICAg" + - "XQogIH0sCiAgewogICAgImlkIjogIkc5LW1pc3NpbmctYnVuZGxlIiwKICAgICJxdWVzdGlvbiI6" + - "ICJSdW4gaGVsbWZpbGUgc3luYyBmb3IgTlZDRiBpbiBteSBjdXJyZW50IGRpcmVjdG9yeSIsCiAg" + - "ICAiZXhwZWN0ZWRfc2tpbGwiOiAibnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uIiwKICAg" + - "ICJncm91bmRfdHJ1dGgiOiAiVGhlIGFnZW50IGF0dGVtcHRlZCB0byB2ZXJpZnkgdGhlIGJ1bmRs" + - "ZSBzdHJ1Y3R1cmUgKGhlbG1maWxlLmQvLCBlbnZpcm9ubWVudHMvLCBzZWNyZXRzLywgZ2xvYmFs" + - "LnlhbWwuZ290bXBsKSBhbmQgd2hlbiBmaWxlcyB3ZXJlIG5vdCBmb3VuZCwgc3RvcHBlZCBhbmQg" + - "aW5zdHJ1Y3RlZCB0aGUgdXNlciB0byBleHRyYWN0IG9yIGxvY2F0ZSB0aGUgbnZjZi1zZWxmLW1h" + - "bmFnZWQtc3RhY2sgYnVuZGxlLiBJdCBkaWQgbm90IGF0dGVtcHQgdG8gcnVuIGhlbG1maWxlIHN5" + - "bmMgYWdhaW5zdCBhIG1pc3NpbmcgYnVuZGxlLiIsCiAgICAiZXhwZWN0ZWRfYmVoYXZpb3IiOiBb" + - "CiAgICAgICJUaGUgYWdlbnQgcmVhZCB0aGUgbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9u" + - "IFNLSUxMLm1kIGJlZm9yZSB0YWtpbmcgYWN0aW9uIiwKICAgICAgIlRoZSBhZ2VudCBjaGVja2Vk" + - "IGZvciBleHBlY3RlZCBidW5kbGUgc3RydWN0dXJlIChoZWxtZmlsZS5kLywgZW52aXJvbm1lbnRz" + - "Lywgc2VjcmV0cy8sIGdsb2JhbC55YW1sLmdvdG1wbCkiLAogICAgICAiV2hlbiBidW5kbGUgZmls" + - "ZXMgd2VyZSBub3QgZm91bmQsIHRoZSBhZ2VudCBzdG9wcGVkIGFuZCBkaWQgbm90IGF0dGVtcHQg" + - "aGVsbWZpbGUgc3luYyIsCiAgICAgICJUaGUgYWdlbnQgaW5zdHJ1Y3RlZCB0aGUgdXNlciB0byBl" + - "eHRyYWN0IG9yIGxvY2F0ZSB0aGUgbnZjZi1zZWxmLW1hbmFnZWQtc3RhY2sgYnVuZGxlIgogICAg" + - "XQogIH0sCiAgewogICAgImlkIjogIlMxLWNsZWFuLWluc3RhbGxhdGlvbiIsCiAgICAicXVlc3Rp" + - "b24iOiAiUGVyZm9ybSBhIGNsZWFuIGluc3RhbGxhdGlvbiBvZiB0aGUgTlZDRiBzZWxmLW1hbmFn" + - "ZWQgc3RhY2sgb24gbXkgQVdTIEVLUyBjbHVzdGVyLiBNeSBlbnZpcm9ubWVudCBuYW1lIGlzICdz" + - "dGFnaW5nJy4iLAogICAgImV4cGVjdGVkX3NraWxsIjogIm52Y2Ytc2VsZi1tYW5hZ2VkLWluc3Rh" + - "bGxhdGlvbiIsCiAgICAiZ3JvdW5kX3RydXRoIjogIlRoZSBhZ2VudCBjb21wbGV0ZWQgdGhlIGNv" + - "bnRyb2wtcGxhbmUgaW5zdGFsbGF0aW9uIGZpcnN0OiB2YWxpZGF0ZWQgdG9vbHMgYW5kIGJ1bmRs" + - "ZSBzdHJ1Y3R1cmUsIGNyZWF0ZWQgY29udHJvbC1wbGFuZSBuYW1lc3BhY2VzIGluY2x1ZGluZyBj" + - "ZXJ0LW1hbmFnZXIsIGF1dGhlbnRpY2F0ZWQgdGhlIHJlZ2lzdHJpZXMsIHByZXZpZXdlZCwgZGVw" + - "bG95ZWQsIGFuZCBtb25pdG9yZWQgdGhlIGZvdXIgY29udHJvbC1wbGFuZSBwaGFzZXMuIEl0IHRo" + - "ZW4gc2VsZWN0ZWQgb25lIGRvY3VtZW50ZWQgaGFuZG9mZiBhbmQgcmVnaXN0ZXJlZCBhbmQgaW5z" + - "dGFsbGVkIHRoZSBjb21wdXRlIHBsYW5lIGFzIGEgc2VwYXJhdGUgc3RhY2sgd2l0aG91dCBtaXhp" + - "bmcgcHJvZmlsZSBhbmQgSGVsbWZpbGUgdmFsdWVzIGZsb3dzLiIsCiAgICAiZXhwZWN0ZWRfYmVo" + - "YXZpb3IiOiBbCiAgICAgICJUaGUgYWdlbnQgcmVhZCB0aGUgbnZjZi1zZWxmLW1hbmFnZWQtaW5z" + - "dGFsbGF0aW9uIFNLSUxMLm1kIGJlZm9yZSB0YWtpbmcgYWN0aW9uIiwKICAgICAgIlRoZSBhZ2Vu" + - "dCB2YWxpZGF0ZWQgdG9vbCB2ZXJzaW9ucyAoaGVsbWZpbGUsIGhlbG0sIGhlbG0tZGlmZiwga3Vi" + - "ZWN0bCkiLAogICAgICAiVGhlIGFnZW50IHZlcmlmaWVkIHRoZSBidW5kbGUgc3RydWN0dXJlIGV4" + - "aXN0cyIsCiAgICAgICJUaGUgYWdlbnQgY3JlYXRlZCBjb250cm9sLXBsYW5lIG5hbWVzcGFjZXMg" + - "KGNhc3NhbmRyYS1zeXN0ZW0sIG5hdHMtc3lzdGVtLCBudmNmLCBhcGkta2V5cywgZXNzLCBzaXMs" + - "IHZhdWx0LXN5c3RlbSwgY2VydC1tYW5hZ2VyKSB3aXRob3V0IGFkZGluZyBjb21wdXRlLW9ubHkg" + - "bmFtZXNwYWNlcyIsCiAgICAgICJUaGUgYWdlbnQgcmFuICdIRUxNRklMRV9FTlY9c3RhZ2luZyBo" + - "ZWxtZmlsZSB0ZW1wbGF0ZScgdG8gcHJldmlldyBiZWZvcmUgZGVwbG95aW5nIiwKICAgICAgIlRo" + - "ZSBhZ2VudCByYW4gJ0hFTE1GSUxFX0VOVj1zdGFnaW5nIGhlbG1maWxlIHN5bmMnIHRvIGRlcGxv" + - "eSIsCiAgICAgICJUaGUgYWdlbnQgZXhwbGFpbmVkIHRoZSA0IGNvbnRyb2wtcGxhbmUgcGhhc2Vz" + - "IChkZXBlbmRlbmNpZXMsIHNlcnZpY2VzLCBpbmdyZXNzLCBvYnNlcnZhYmlsaXR5KSBhbmQgYXBw" + - "cm94aW1hdGUgd2FpdCB0aW1lcyIsCiAgICAgICJBZnRlciB0aGUgY29udHJvbCBwbGFuZSB3YXMg" + - "aGVhbHRoeSwgdGhlIGFnZW50IHJlZ2lzdGVyZWQgYW5kIGluc3RhbGxlZCB0aGUgc2VwYXJhdGUg" + - "Y29tcHV0ZS1wbGFuZSBzdGFjayB1c2luZyBleGFjdGx5IG9uZSBkb2N1bWVudGVkIGhhbmRvZmYi" + - "LAogICAgICAiVGhlIGFnZW50IGRpZCBub3QgbWl4IGEgQ0xJLWdlbmVyYXRlZCBjb250cm9sLXBs" + - "YW5lIHByb2ZpbGUgd2l0aCB0aGUgSGVsbWZpbGUgdmFsdWVzIGZsb3ciCiAgICBdCiAgfSwKICB7" + - "CiAgICAiaWQiOiAiUzMtY2xpLXByb2ZpbGUtd29ya2Zsb3ciLAogICAgInF1ZXN0aW9uIjogIlVz" + - "ZSBudmNmLWNsaSB0byBpbnN0YWxsIG15IGNvbnRyb2wgcGxhbmUgYW5kIHRoZW4gcmVnaXN0ZXIg" + - "YW5kIGluc3RhbGwgYSBzZXBhcmF0ZSBjb21wdXRlIGNsdXN0ZXIuIFNob3cgZXZlcnkgcmVxdWly" + - "ZWQgZ2xvYmFsIGZsYWcuIiwKICAgICJleHBlY3RlZF9za2lsbCI6ICJudmNmLXNlbGYtbWFuYWdl" + - "ZC1pbnN0YWxsYXRpb24iLAogICAgImdyb3VuZF90cnV0aCI6ICJUaGUgYWdlbnQgZmlyc3QgcmFu" + - "IHRoZSBDTEkgY29udHJvbC1wbGFuZSBpbnN0YWxsIGFuZCByZXF1aXJlZCBpdHMgZ2VuZXJhdGVk" + - "IGNvbnRyb2wtcGxhbmUtcHJvZmlsZS55YW1sLiBJdCB0aGVuIHNob3dlZCBjb21wbGV0ZSByZWdp" + - "c3RlciBhbmQgaW5zdGFsbCBjb21tYW5kcywgZWFjaCBpbmNsdWRpbmcgLS1jb25maWcsIC0tY29u" + - "dHJvbC1wbGFuZS1zdGFjaywgLS1jb21wdXRlLXBsYW5lLXN0YWNrLCAtLWVudiwgYW5kIC0tcGxh" + - "aW4gYmVmb3JlIHRoZSBjb21wdXRlLXBsYW5lIHN1YmNvbW1hbmQuIFJlZ2lzdHJhdGlvbiBjb25z" + - "dW1lZCB0aGUgcHJvZmlsZSBhbmQgcHJvZHVjZWQgdGhlIHZhbHVlcyBmaWxlIGNvbnN1bWVkIGJ5" + - "IGluc3RhbGwuIEl0IGRpZCBub3Qgc3dpdGNoIHRvIHRoZSBIZWxtZmlsZSB2YWx1ZXMgaGFuZG9m" + - "Zi4iLAogICAgImV4cGVjdGVkX2JlaGF2aW9yIjogWwogICAgICAiVGhlIGFnZW50IHJlYWQgdGhl" + - "IG52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiBTS0lMTC5tZCBiZWZvcmUgdGFraW5nIGFj" + - "dGlvbiIsCiAgICAgICJUaGUgYWdlbnQgcmFuIG52Y2YtY2xpIHNlbGYtaG9zdGVkIGluc3RhbGwg" + - "LS1jb250cm9sLXBsYW5lIGFuZCB2ZXJpZmllZCBkZXBsb3kvc3RhY2tzL3NlbGYtbWFuYWdlZC9v" + - "dXQvY29udHJvbC1wbGFuZS1wcm9maWxlLnlhbWwgZXhpc3RzIiwKICAgICAgIlRoZSByZWdpc3Rl" + - "ciBjb21tYW5kIGluY2x1ZGVkIC0tY29uZmlnLCAtLWNvbnRyb2wtcGxhbmUtc3RhY2ssIC0tY29t" + - "cHV0ZS1wbGFuZS1zdGFjaywgLS1lbnYsIGFuZCAtLXBsYWluIiwKICAgICAgIlRoZSByZWdpc3Rl" + - "ciBjb21tYW5kIGluY2x1ZGVkIC0tY29udHJvbC1wbGFuZS1wcm9maWxlLCAtLWNsdXN0ZXItbmFt" + - "ZSwgLS1rdWJlLWNvbnRleHQsIC0tcmVnaW9uLCBhbmQgLS1vdXRwdXQiLAogICAgICAiVGhlIGlu" + - "c3RhbGwgY29tbWFuZCByZXBlYXRlZCAtLWNvbmZpZywgLS1jb250cm9sLXBsYW5lLXN0YWNrLCAt" + - "LWNvbXB1dGUtcGxhbmUtc3RhY2ssIC0tZW52LCBhbmQgLS1wbGFpbiIsCiAgICAgICJUaGUgaW5z" + - "dGFsbCBjb21tYW5kIGluY2x1ZGVkIC0tdmFsdWVzLCAtLWt1YmUtY29udGV4dCwgYW5kIC0tY2x1" + - "c3Rlci1uYW1lIiwKICAgICAgIlRoZSBhZ2VudCBrZXB0IHRoZSBnZW5lcmF0ZWQgcHJvZmlsZSBh" + - "cyB0aGUgZW5kcG9pbnQgc291cmNlIGFuZCBkaWQgbm90IG1peCBpbiBIZWxtZmlsZSB2YWx1ZXMg" + - "cmVnaXN0cmF0aW9uIgogICAgXQogIH0sCiAgewogICAgImlkIjogIlM0LW92ZXJyaWRlLWNhc3Nh" + - "bmRyYS1yZXNvdXJjZXMiLAogICAgInF1ZXN0aW9uIjogIkNhc3NhbmRyYSBwb2RzIGtlZXAgZ2V0" + - "dGluZyBPT01LaWxsZWQuIEluY3JlYXNlIG1lbW9yeSBsaW1pdHMgdG8gMTZHaS4iLAogICAgImV4" + - "cGVjdGVkX3NraWxsIjogIm52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiIsCiAgICAiZ3Jv" + - "dW5kX3RydXRoIjogIlRoZSBhZ2VudCBjYXB0dXJlZCB0aGUgYmFzZWxpbmUgd2l0aCBoZWxtZmls" + - "ZSB0ZW1wbGF0ZSwgdGhlbiBtb2RpZmllZCB0aGUgY2Fzc2FuZHJhIHJlbGVhc2Ugd2l0aCBpbmxp" + - "bmUgdmFsdWVzIHJlLWluY2x1ZGluZyBnbG9iYWwueWFtbC5nb3RtcGwgYW5kIHNlY3JldHMgaW4g" + - "dGhlIHZhbHVlcyBibG9jay4gSXQgd2FybmVkIGFib3V0IHRoZSBZQU1MIG1lcmdlIGdvdGNoYSBh" + - "bmQgcHJldmlld2VkIHRoZSBkaWZmIGJlZm9yZSBhcHBseWluZy4iLAogICAgImV4cGVjdGVkX2Jl" + - "aGF2aW9yIjogWwogICAgICAiVGhlIGFnZW50IHJlYWQgdGhlIG52Y2Ytc2VsZi1tYW5hZ2VkLWlu" + - "c3RhbGxhdGlvbiBTS0lMTC5tZCBiZWZvcmUgdGFraW5nIGFjdGlvbiIsCiAgICAgICJUaGUgYWdl" + - "bnQgY2FwdHVyZWQgYmFzZWxpbmUgd2l0aCAnaGVsbWZpbGUgLS1zZWxlY3RvciBuYW1lPWNhc3Nh" + - "bmRyYSB0ZW1wbGF0ZSciLAogICAgICAiVGhlIGFnZW50IG1vZGlmaWVkIHRoZSByZWxlYXNlIHZh" + - "bHVlcyBibG9jayB0byBpbmNsdWRlIHJlc291cmNlIGxpbWl0cyB3aXRoIG1lbW9yeTogMTZHaSIs" + - "CiAgICAgICJUaGUgYWdlbnQgcmUtaW5jbHVkZWQgZ2xvYmFsLnlhbWwuZ290bXBsIGFuZCBzZWNy" + - "ZXRzIGZpbGUgaW4gdGhlIHZhbHVlczogYmxvY2sgKG5vdCBqdXN0IHRoZSBvdmVycmlkZSBhbG9u" + - "ZSkiLAogICAgICAiVGhlIGFnZW50IHdhcm5lZCBhYm91dCB0aGUgWUFNTCBtZXJnZSBnb3RjaGE6" + - "IHNwZWNpZnlpbmcgdmFsdWVzOiByZXBsYWNlcyB0aGUgdGVtcGxhdGUncyB2YWx1ZXMgbGlzdCBl" + - "bnRpcmVseSIsCiAgICAgICJUaGUgYWdlbnQgcHJldmlld2VkIHRoZSBjaGFuZ2Ugd2l0aCBoZWxt" + - "ZmlsZSB0ZW1wbGF0ZSBhbmQgZGlmZiBiZWZvcmUgYXBwbHlpbmcgd2l0aCBzeW5jIgogICAgXQog" + - "IH0sCiAgewogICAgImlkIjogIlM2LXNlbGVjdGl2ZS1zeW5jLWRlcGVuZGVuY2llcyIsCiAgICAi" + - "cXVlc3Rpb24iOiAiRGVwbG95IG9ubHkgdGhlIE5WQ0YgZGVwZW5kZW5jaWVzIC0tIE5BVFMsIENh" + - "c3NhbmRyYSwgYW5kIE9wZW5CYW8gLS0gZm9yIHRlc3RpbmciLAogICAgImV4cGVjdGVkX3NraWxs" + + "SUxMLm1kIGJlZm9yZSB0YWtpbmcgYWN0aW9uIiwKICAgICAgIlRoZSBhZ2VudCBjb25maXJtZWQg" + + "YW5kIHVzZWQgdGhlIGNvbXB1dGUtcGxhbmUgY29udGV4dCBmb3IgYWxsIGNsZWFudXAgY29tbWFu" + + "ZHMiLAogICAgICAiVGhlIGFnZW50IHVzZWQga3ViZWN0bCB0byBwYXRjaCBOVkNGQmFja2VuZCBy" + + "ZXNvdXJjZXMgdG8gcmVtb3ZlIHRoZWlyIGZpbmFsaXplcnMiLAogICAgICAiVGhlIGFnZW50IHVz" + + "ZWQga3ViZWN0bCByZXBsYWNlIC0tcmF3IHRvIGNsZWFyIG5hbWVzcGFjZSBmaW5hbGl6ZXJzIG9u" + + "IHN0dWNrIG5hbWVzcGFjZXMiLAogICAgICAiVGhlIGFnZW50IG9ubHkgdGFyZ2V0ZWQgTlZDRi1t" + + "YW5hZ2VkIG5hbWVzcGFjZXMgKG52Y2Etb3BlcmF0b3IsIG52Y2YtYmFja2VuZCkgYW5kIGRpZCBu" + + "b3QgdG91Y2ggb3RoZXIgY2x1c3RlciByZXNvdXJjZXMiLAogICAgICAiVGhlIGFnZW50IGRpZCBu" + + "b3QganVtcCBkaXJlY3RseSB0byBuYW1lc3BhY2UgZGVsZXRpb24gd2l0aG91dCBmaXJzdCByZW1v" + + "dmluZyBmaW5hbGl6ZXJzIgogICAgXQogIH0sCiAgewogICAgImlkIjogIkc2LWhlbG1maWxlLXNw" + + "bGl0LXdvcmtmbG93IiwKICAgICJxdWVzdGlvbiI6ICJJbnN0YWxsIGFuIE5WQ0YgY29udHJvbCBw" + + "bGFuZSBhbmQgYSBzZXBhcmF0ZSBFS1MgY29tcHV0ZSBwbGFuZSB1c2luZyB0aGUgSGVsbWZpbGUg" + + "c3RhY2tzLiBUaGUgY29tcHV0ZSBjbHVzdGVyIGt1YmVjb25maWcgaXMgY29tcHV0ZS55YW1sLiIs" + + "CiAgICAiZXhwZWN0ZWRfc2tpbGwiOiAibnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uIiwK" + + "ICAgICJncm91bmRfdHJ1dGgiOiAiVGhlIGFnZW50IGtlcHQgdGhlIEhlbG1maWxlIHZhbHVlcyBm" + + "bG93IGluZGVwZW5kZW50IGZyb20gdGhlIENMSSBwcm9maWxlIGZsb3cuIEl0IGF1dGhvcmVkIHNl" + + "cGFyYXRlIGNvbnRyb2wtcGxhbmUgYW5kIGNvbXB1dGUtcGxhbmUgZW52aXJvbm1lbnQgZmlsZXMg" + + "cGx1cyBhIGJhcmUtR2F0ZXdheSBDTEkgY29uZmlnIHdpdGggVVJMIGFuZCBzY2hlbWUtbGVzcyBI" + + "b3N0IGZpZWxkcywgaW5zdGFsbGVkIHRoZSBjb250cm9sIHBsYW5lLCByYW4gdGhlIGNvbXB1dGUt" + + "cGxhbmUgTWFrZWZpbGUgcmVnaXN0ZXItY2x1c3RlciB0YXJnZXQgd2l0aCBJQ01TX1VSTCBhbmQg" + + "dGhlIGNvbXB1dGUga3ViZWNvbmZpZywgdGhlbiByYW4gdGhlIGNvbXB1dGUtcGxhbmUgaW5zdGFs" + + "bCB0YXJnZXQgd2l0aCB0aGUgc2FtZSBlbnZpcm9ubWVudCBhbmQga3ViZWNvbmZpZy4gSXQgcmVs" + + "aWVkIG9uIHJlZ2lzdHJhdGlvbiB0byBkaXNjb3ZlciBPSURDIGFuZCBKV0tTIGZyb20gdGhlIGNv" + + "bXB1dGUgY29udGV4dC4iLAogICAgImV4cGVjdGVkX2JlaGF2aW9yIjogWwogICAgICAiVGhlIGFn" + + "ZW50IHJlYWQgdGhlIG52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiBTS0lMTC5tZCBiZWZv" + + "cmUgdGFraW5nIGFjdGlvbiIsCiAgICAgICJUaGUgYWdlbnQgYXV0aG9yZWQgc2VwYXJhdGUgZW52" + + "aXJvbm1lbnRzLzxlbnY+LnlhbWwgZmlsZXMgdW5kZXIgZGVwbG95L3N0YWNrcy9zZWxmLW1hbmFn" + + "ZWQgYW5kIGRlcGxveS9zdGFja3MvbnZjZi1jb21wdXRlLXBsYW5lIiwKICAgICAgIlRoZSBhZ2Vu" + + "dCBpbnN0YWxsZWQgdGhlIGNvbnRyb2wgcGxhbmUgYmVmb3JlIHJlZ2lzdGVyaW5nIG9yIGluc3Rh" + + "bGxpbmcgdGhlIGNvbXB1dGUgcGxhbmUiLAogICAgICAiVGhlIGFnZW50IGNvbmZpZ3VyZWQgYmFz" + + "ZV9odHRwX3VybCwgaW52b2tlX3VybCwgYmFzZV9ncnBjX3VybCwgYXBpX2tleXNfc2VydmljZV91" + + "cmwsIGljbXNfdXJsLCBhcGlfaG9zdCwgYXBpX2tleXNfaG9zdCwgaW52b2tlX2hvc3QsIGFuZCBp" + + "Y21zX2hvc3QgZm9yIHRoZSBiYXJlIEdhdGV3YXkiLAogICAgICAiVGhlIGFnZW50IHVzZWQgJ21h" + + "a2UgLUMgZGVwbG95L3N0YWNrcy9udmNmLWNvbXB1dGUtcGxhbmUgcmVnaXN0ZXItY2x1c3Rlcicg" + + "d2l0aCBDTFVTVEVSX05BTUUsIE5DQV9JRCwgQ0xVU1RFUl9SRUdJT04sIElDTVNfVVJMLCBhbmQg" + + "S1VCRUNPTkZJR19GSUxFPWNvbXB1dGUueWFtbCIsCiAgICAgICJUaGUgYWdlbnQgdXNlZCAnbWFr" + + "ZSAtQyBkZXBsb3kvc3RhY2tzL252Y2YtY29tcHV0ZS1wbGFuZSBpbnN0YWxsJyB3aXRoIENMVVNU" + + "RVJfTkFNRSwgSEVMTUZJTEVfRU5WLCBhbmQgS1VCRUNPTkZJR19GSUxFPWNvbXB1dGUueWFtbCIs" + + "CiAgICAgICJUaGUgYWdlbnQgc3RhdGVkIHRoYXQgSUNNU19VUkwgbWFwcyBvbmx5IHRvIC0taWNt" + + "cy11cmwsIGNvbmZpZyBpY21zX2hvc3Qgc3VwcGxpZXMgdGhlIEhvc3QgaGVhZGVyLCB0aGVyZSBp" + + "cyBubyAtLWljbXMtaG9zdCBNYWtlIG9yIENMSSBmbGFnLCBhbmQgcmVnaXN0cmF0aW9uIGRpc2Nv" + + "dmVycyBPSURDIGFuZCBKV0tTIGZyb20gdGhlIGNvbXB1dGUgY29udGV4dCIsCiAgICAgICJUaGUg" + + "YWdlbnQgZGlkIG5vdCByZXF1aXJlIGEgY29udHJvbC1wbGFuZSBwcm9maWxlIGZvciB0aGlzIGZs" + + "b3cgYW5kIGRpZCBub3QgbWl4IGluIENMSSBwcm9maWxlIGNvbW1hbmRzIgogICAgXQogIH0sCiAg" + + "ewogICAgImlkIjogIkc3LWJvdGgtZG9ja2VyLWhlbG0tYXV0aCIsCiAgICAicXVlc3Rpb24iOiAi" + + "QXV0aGVudGljYXRlIHRvIE5HQyBmb3IgTlZDRiBoZWxtZmlsZSBkZXBsb3ltZW50IiwKICAgICJl" + + "eHBlY3RlZF9za2lsbCI6ICJudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24iLAogICAgImdy" + + "b3VuZF90cnV0aCI6ICJUaGUgYWdlbnQgcmFuIGJvdGggZG9ja2VyIGxvZ2luIGFuZCBoZWxtIHJl" + + "Z2lzdHJ5IGxvZ2luIGZvciBudmNyLmlvLiBJdCBleHBsYWluZWQgdGhhdCBib3RoIGFyZSByZXF1" + + "aXJlZCBiZWNhdXNlIGhlbG1maWxlIHVzZXMgaGVsbSAobm90IGRvY2tlcikgdG8gcHVsbCBPQ0kg" + + "Y2hhcnRzLCBzbyBkb2NrZXIgbG9naW4gYWxvbmUgaXMgaW5zdWZmaWNpZW50LiIsCiAgICAiZXhw" + + "ZWN0ZWRfYmVoYXZpb3IiOiBbCiAgICAgICJUaGUgYWdlbnQgcmVhZCB0aGUgbnZjZi1zZWxmLW1h" + + "bmFnZWQtaW5zdGFsbGF0aW9uIFNLSUxMLm1kIGJlZm9yZSB0YWtpbmcgYWN0aW9uIiwKICAgICAg" + + "IlRoZSBhZ2VudCByYW4gJ2RvY2tlciBsb2dpbiBudmNyLmlvJyB3aXRoICRvYXV0aHRva2VuIHVz" + + "ZXJuYW1lIGFuZCBOR0NfQVBJX0tFWSBwYXNzd29yZCIsCiAgICAgICJUaGUgYWdlbnQgcmFuICdo" + + "ZWxtIHJlZ2lzdHJ5IGxvZ2luIG52Y3IuaW8nIHdpdGggJG9hdXRodG9rZW4gdXNlcm5hbWUgYW5k" + + "IE5HQ19BUElfS0VZIHBhc3N3b3JkIiwKICAgICAgIlRoZSBhZ2VudCBleHBsYWluZWQgdGhhdCBi" + + "b3RoIGFyZSByZXF1aXJlZCBiZWNhdXNlIGhlbG1maWxlIHVzZXMgaGVsbSAobm90IGRvY2tlcikg" + + "dG8gcHVsbCBPQ0kgY2hhcnRzIiwKICAgICAgIlRoZSBhZ2VudCBkaWQgbm90IHByb3ZpZGUgb25s" + + "eSBvbmUgb2YgdGhlIHR3byBhdXRoZW50aWNhdGlvbiBjb21tYW5kcyIKICAgIF0KICB9LAogIHsK" + + "ICAgICJpZCI6ICJHOS1taXNzaW5nLWJ1bmRsZSIsCiAgICAicXVlc3Rpb24iOiAiUnVuIGhlbG1m" + + "aWxlIHN5bmMgZm9yIE5WQ0YgaW4gbXkgY3VycmVudCBkaXJlY3RvcnkiLAogICAgImV4cGVjdGVk" + + "X3NraWxsIjogIm52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiIsCiAgICAiZ3JvdW5kX3Ry" + + "dXRoIjogIlRoZSBhZ2VudCBhdHRlbXB0ZWQgdG8gdmVyaWZ5IHRoZSBidW5kbGUgc3RydWN0dXJl" + + "IChoZWxtZmlsZS5kLywgZW52aXJvbm1lbnRzLywgc2VjcmV0cy8sIGdsb2JhbC55YW1sLmdvdG1w" + + "bCkgYW5kIHdoZW4gZmlsZXMgd2VyZSBub3QgZm91bmQsIHN0b3BwZWQgYW5kIGluc3RydWN0ZWQg" + + "dGhlIHVzZXIgdG8gZXh0cmFjdCBvciBsb2NhdGUgdGhlIG52Y2Ytc2VsZi1tYW5hZ2VkLXN0YWNr" + + "IGJ1bmRsZS4gSXQgZGlkIG5vdCBhdHRlbXB0IHRvIHJ1biBoZWxtZmlsZSBzeW5jIGFnYWluc3Qg" + + "YSBtaXNzaW5nIGJ1bmRsZS4iLAogICAgImV4cGVjdGVkX2JlaGF2aW9yIjogWwogICAgICAiVGhl" + + "IGFnZW50IHJlYWQgdGhlIG52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiBTS0lMTC5tZCBi" + + "ZWZvcmUgdGFraW5nIGFjdGlvbiIsCiAgICAgICJUaGUgYWdlbnQgY2hlY2tlZCBmb3IgZXhwZWN0" + + "ZWQgYnVuZGxlIHN0cnVjdHVyZSAoaGVsbWZpbGUuZC8sIGVudmlyb25tZW50cy8sIHNlY3JldHMv" + + "LCBnbG9iYWwueWFtbC5nb3RtcGwpIiwKICAgICAgIldoZW4gYnVuZGxlIGZpbGVzIHdlcmUgbm90" + + "IGZvdW5kLCB0aGUgYWdlbnQgc3RvcHBlZCBhbmQgZGlkIG5vdCBhdHRlbXB0IGhlbG1maWxlIHN5" + + "bmMiLAogICAgICAiVGhlIGFnZW50IGluc3RydWN0ZWQgdGhlIHVzZXIgdG8gZXh0cmFjdCBvciBs" + + "b2NhdGUgdGhlIG52Y2Ytc2VsZi1tYW5hZ2VkLXN0YWNrIGJ1bmRsZSIKICAgIF0KICB9LAogIHsK" + + "ICAgICJpZCI6ICJTMS1jbGVhbi1pbnN0YWxsYXRpb24iLAogICAgInF1ZXN0aW9uIjogIlBlcmZv" + + "cm0gYSBjbGVhbiBpbnN0YWxsYXRpb24gb2YgdGhlIE5WQ0Ygc2VsZi1tYW5hZ2VkIHN0YWNrIG9u" + + "IG15IEFXUyBFS1MgY2x1c3Rlci4gTXkgZW52aXJvbm1lbnQgbmFtZSBpcyAnc3RhZ2luZycuIiwK" + + "ICAgICJleHBlY3RlZF9za2lsbCI6ICJudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24iLAog" + + "ICAgImdyb3VuZF90cnV0aCI6ICJUaGUgYWdlbnQgY29tcGxldGVkIHRoZSBjb250cm9sLXBsYW5l" + + "IGluc3RhbGxhdGlvbiBmaXJzdDogdmFsaWRhdGVkIHRvb2xzIGFuZCBidW5kbGUgc3RydWN0dXJl" + + "LCBjcmVhdGVkIGNvbnRyb2wtcGxhbmUgbmFtZXNwYWNlcyBpbmNsdWRpbmcgY2VydC1tYW5hZ2Vy" + + "LCBhdXRoZW50aWNhdGVkIHRoZSByZWdpc3RyaWVzLCBwcmV2aWV3ZWQsIGRlcGxveWVkLCBhbmQg" + + "bW9uaXRvcmVkIHRoZSBmb3VyIGNvbnRyb2wtcGxhbmUgcGhhc2VzLiBJdCB0aGVuIHNlbGVjdGVk" + + "IG9uZSBkb2N1bWVudGVkIGhhbmRvZmYgYW5kIHJlZ2lzdGVyZWQgYW5kIGluc3RhbGxlZCB0aGUg" + + "Y29tcHV0ZSBwbGFuZSBhcyBhIHNlcGFyYXRlIHN0YWNrIHdpdGhvdXQgbWl4aW5nIHByb2ZpbGUg" + + "YW5kIEhlbG1maWxlIHZhbHVlcyBmbG93cy4iLAogICAgImV4cGVjdGVkX2JlaGF2aW9yIjogWwog" + + "ICAgICAiVGhlIGFnZW50IHJlYWQgdGhlIG52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiBT" + + "S0lMTC5tZCBiZWZvcmUgdGFraW5nIGFjdGlvbiIsCiAgICAgICJUaGUgYWdlbnQgdmFsaWRhdGVk" + + "IHRvb2wgdmVyc2lvbnMgKGhlbG1maWxlLCBoZWxtLCBoZWxtLWRpZmYsIGt1YmVjdGwpIiwKICAg" + + "ICAgIlRoZSBhZ2VudCB2ZXJpZmllZCB0aGUgYnVuZGxlIHN0cnVjdHVyZSBleGlzdHMiLAogICAg" + + "ICAiVGhlIGFnZW50IGNyZWF0ZWQgY29udHJvbC1wbGFuZSBuYW1lc3BhY2VzIChjYXNzYW5kcmEt" + + "c3lzdGVtLCBuYXRzLXN5c3RlbSwgbnZjZiwgYXBpLWtleXMsIGVzcywgc2lzLCB2YXVsdC1zeXN0" + + "ZW0sIGNlcnQtbWFuYWdlcikgd2l0aG91dCBhZGRpbmcgY29tcHV0ZS1vbmx5IG5hbWVzcGFjZXMi" + + "LAogICAgICAiVGhlIGFnZW50IHJhbiAnSEVMTUZJTEVfRU5WPXN0YWdpbmcgaGVsbWZpbGUgdGVt" + + "cGxhdGUnIHRvIHByZXZpZXcgYmVmb3JlIGRlcGxveWluZyIsCiAgICAgICJUaGUgYWdlbnQgcmFu" + + "ICdIRUxNRklMRV9FTlY9c3RhZ2luZyBoZWxtZmlsZSBzeW5jJyB0byBkZXBsb3kiLAogICAgICAi" + + "VGhlIGFnZW50IGV4cGxhaW5lZCB0aGUgNCBjb250cm9sLXBsYW5lIHBoYXNlcyAoZGVwZW5kZW5j" + + "aWVzLCBzZXJ2aWNlcywgaW5ncmVzcywgb2JzZXJ2YWJpbGl0eSkgYW5kIGFwcHJveGltYXRlIHdh" + + "aXQgdGltZXMiLAogICAgICAiQWZ0ZXIgdGhlIGNvbnRyb2wgcGxhbmUgd2FzIGhlYWx0aHksIHRo" + + "ZSBhZ2VudCByZWdpc3RlcmVkIGFuZCBpbnN0YWxsZWQgdGhlIHNlcGFyYXRlIGNvbXB1dGUtcGxh" + + "bmUgc3RhY2sgdXNpbmcgZXhhY3RseSBvbmUgZG9jdW1lbnRlZCBoYW5kb2ZmIiwKICAgICAgIlRo" + + "ZSBhZ2VudCBkaWQgbm90IG1peCBhIENMSS1nZW5lcmF0ZWQgY29udHJvbC1wbGFuZSBwcm9maWxl" + + "IHdpdGggdGhlIEhlbG1maWxlIHZhbHVlcyBmbG93IgogICAgXQogIH0sCiAgewogICAgImlkIjog" + + "IlMzLWNsaS1wcm9maWxlLXdvcmtmbG93IiwKICAgICJxdWVzdGlvbiI6ICJVc2UgbnZjZi1jbGkg" + + "dG8gaW5zdGFsbCBteSBjb250cm9sIHBsYW5lIGFuZCB0aGVuIHJlZ2lzdGVyIGFuZCBpbnN0YWxs" + + "IGEgc2VwYXJhdGUgY29tcHV0ZSBjbHVzdGVyLiBTaG93IGV2ZXJ5IHJlcXVpcmVkIGdsb2JhbCBm" + + "bGFnLiIsCiAgICAiZXhwZWN0ZWRfc2tpbGwiOiAibnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0" + + "aW9uIiwKICAgICJncm91bmRfdHJ1dGgiOiAiVGhlIGFnZW50IGZpcnN0IHJhbiB0aGUgQ0xJIGNv" + + "bnRyb2wtcGxhbmUgaW5zdGFsbCBhbmQgcmVxdWlyZWQgaXRzIGdlbmVyYXRlZCBjb250cm9sLXBs" + + "YW5lLXByb2ZpbGUueWFtbC4gSXQgdGhlbiBzaG93ZWQgY29tcGxldGUgcmVnaXN0ZXIgYW5kIGlu" + + "c3RhbGwgY29tbWFuZHMsIGVhY2ggaW5jbHVkaW5nIC0tY29uZmlnLCAtLWNvbnRyb2wtcGxhbmUt" + + "c3RhY2ssIC0tY29tcHV0ZS1wbGFuZS1zdGFjaywgLS1lbnYsIGFuZCAtLXBsYWluIGJlZm9yZSB0" + + "aGUgY29tcHV0ZS1wbGFuZSBzdWJjb21tYW5kLiBSZWdpc3RyYXRpb24gY29uc3VtZWQgdGhlIHBy" + + "b2ZpbGUgYW5kIHByb2R1Y2VkIHRoZSB2YWx1ZXMgZmlsZSBjb25zdW1lZCBieSBpbnN0YWxsLiBJ" + + "dCBkaWQgbm90IHN3aXRjaCB0byB0aGUgSGVsbWZpbGUgdmFsdWVzIGhhbmRvZmYuIiwKICAgICJl" + + "eHBlY3RlZF9iZWhhdmlvciI6IFsKICAgICAgIlRoZSBhZ2VudCByZWFkIHRoZSBudmNmLXNlbGYt" + + "bWFuYWdlZC1pbnN0YWxsYXRpb24gU0tJTEwubWQgYmVmb3JlIHRha2luZyBhY3Rpb24iLAogICAg" + + "ICAiVGhlIGFnZW50IHJhbiBudmNmLWNsaSBzZWxmLWhvc3RlZCBpbnN0YWxsIC0tY29udHJvbC1w" + + "bGFuZSBhbmQgdmVyaWZpZWQgZGVwbG95L3N0YWNrcy9zZWxmLW1hbmFnZWQvb3V0L2NvbnRyb2wt" + + "cGxhbmUtcHJvZmlsZS55YW1sIGV4aXN0cyIsCiAgICAgICJUaGUgcmVnaXN0ZXIgY29tbWFuZCBp" + + "bmNsdWRlZCAtLWNvbmZpZywgLS1jb250cm9sLXBsYW5lLXN0YWNrLCAtLWNvbXB1dGUtcGxhbmUt" + + "c3RhY2ssIC0tZW52LCBhbmQgLS1wbGFpbiIsCiAgICAgICJUaGUgcmVnaXN0ZXIgY29tbWFuZCBp" + + "bmNsdWRlZCAtLWNvbnRyb2wtcGxhbmUtcHJvZmlsZSwgLS1jbHVzdGVyLW5hbWUsIC0ta3ViZS1j" + + "b250ZXh0LCAtLXJlZ2lvbiwgYW5kIC0tb3V0cHV0IiwKICAgICAgIlRoZSBpbnN0YWxsIGNvbW1h" + + "bmQgcmVwZWF0ZWQgLS1jb25maWcsIC0tY29udHJvbC1wbGFuZS1zdGFjaywgLS1jb21wdXRlLXBs" + + "YW5lLXN0YWNrLCAtLWVudiwgYW5kIC0tcGxhaW4iLAogICAgICAiVGhlIGluc3RhbGwgY29tbWFu" + + "ZCBpbmNsdWRlZCAtLXZhbHVlcywgLS1rdWJlLWNvbnRleHQsIGFuZCAtLWNsdXN0ZXItbmFtZSIs" + + "CiAgICAgICJUaGUgYWdlbnQga2VwdCB0aGUgZ2VuZXJhdGVkIHByb2ZpbGUgYXMgdGhlIGVuZHBv" + + "aW50IHNvdXJjZSBhbmQgZGlkIG5vdCBtaXggaW4gSGVsbWZpbGUgdmFsdWVzIHJlZ2lzdHJhdGlv" + + "biIKICAgIF0KICB9LAogIHsKICAgICJpZCI6ICJTNC1vdmVycmlkZS1jYXNzYW5kcmEtcmVzb3Vy" + + "Y2VzIiwKICAgICJxdWVzdGlvbiI6ICJDYXNzYW5kcmEgcG9kcyBrZWVwIGdldHRpbmcgT09NS2ls" + + "bGVkLiBJbmNyZWFzZSBtZW1vcnkgbGltaXRzIHRvIDE2R2kuIiwKICAgICJleHBlY3RlZF9za2ls" + + "bCI6ICJudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24iLAogICAgImdyb3VuZF90cnV0aCI6" + + "ICJUaGUgYWdlbnQgY2FwdHVyZWQgdGhlIGJhc2VsaW5lIHdpdGggaGVsbWZpbGUgdGVtcGxhdGUs" + + "IHRoZW4gbW9kaWZpZWQgdGhlIGNhc3NhbmRyYSByZWxlYXNlIHdpdGggaW5saW5lIHZhbHVlcyBy" + + "ZS1pbmNsdWRpbmcgZ2xvYmFsLnlhbWwuZ290bXBsIGFuZCBzZWNyZXRzIGluIHRoZSB2YWx1ZXMg" + + "YmxvY2suIEl0IHdhcm5lZCBhYm91dCB0aGUgWUFNTCBtZXJnZSBnb3RjaGEgYW5kIHByZXZpZXdl" + + "ZCB0aGUgZGlmZiBiZWZvcmUgYXBwbHlpbmcuIiwKICAgICJleHBlY3RlZF9iZWhhdmlvciI6IFsK" + + "ICAgICAgIlRoZSBhZ2VudCByZWFkIHRoZSBudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24g" + + "U0tJTEwubWQgYmVmb3JlIHRha2luZyBhY3Rpb24iLAogICAgICAiVGhlIGFnZW50IGNhcHR1cmVk" + + "IGJhc2VsaW5lIHdpdGggJ2hlbG1maWxlIC0tc2VsZWN0b3IgbmFtZT1jYXNzYW5kcmEgdGVtcGxh" + + "dGUnIiwKICAgICAgIlRoZSBhZ2VudCBtb2RpZmllZCB0aGUgcmVsZWFzZSB2YWx1ZXMgYmxvY2sg" + + "dG8gaW5jbHVkZSByZXNvdXJjZSBsaW1pdHMgd2l0aCBtZW1vcnk6IDE2R2kiLAogICAgICAiVGhl" + + "IGFnZW50IHJlLWluY2x1ZGVkIGdsb2JhbC55YW1sLmdvdG1wbCBhbmQgc2VjcmV0cyBmaWxlIGlu" + + "IHRoZSB2YWx1ZXM6IGJsb2NrIChub3QganVzdCB0aGUgb3ZlcnJpZGUgYWxvbmUpIiwKICAgICAg" + + "IlRoZSBhZ2VudCB3YXJuZWQgYWJvdXQgdGhlIFlBTUwgbWVyZ2UgZ290Y2hhOiBzcGVjaWZ5aW5n" + + "IHZhbHVlczogcmVwbGFjZXMgdGhlIHRlbXBsYXRlJ3MgdmFsdWVzIGxpc3QgZW50aXJlbHkiLAog" + + "ICAgICAiVGhlIGFnZW50IHByZXZpZXdlZCB0aGUgY2hhbmdlIHdpdGggaGVsbWZpbGUgdGVtcGxh" + + "dGUgYW5kIGRpZmYgYmVmb3JlIGFwcGx5aW5nIHdpdGggc3luYyIKICAgIF0KICB9LAogIHsKICAg" + + "ICJpZCI6ICJTNi1zZWxlY3RpdmUtc3luYy1kZXBlbmRlbmNpZXMiLAogICAgInF1ZXN0aW9uIjog" + + "IkRlcGxveSBvbmx5IHRoZSBOVkNGIGRlcGVuZGVuY2llcyAtLSBOQVRTLCBDYXNzYW5kcmEsIGFu" + + "ZCBPcGVuQmFvIC0tIGZvciB0ZXN0aW5nIiwKICAgICJleHBlY3RlZF9za2lsbCI6ICJudmNmLXNl" + + "bGYtbWFuYWdlZC1pbnN0YWxsYXRpb24iLAogICAgImdyb3VuZF90cnV0aCI6ICJUaGUgYWdlbnQg" + + "dXNlZCB0aGUgaGVsbWZpbGUgc2VsZWN0b3IgdG8gZGVwbG95IG9ubHkgdGhlIGRlcGVuZGVuY2ll" + + "cyByZWxlYXNlIGdyb3VwLCB0aGVuIHZlcmlmaWVkIHBvZHMgaW4gdGhlIGRlcGVuZGVuY3kgbmFt" + + "ZXNwYWNlcy4iLAogICAgImV4cGVjdGVkX2JlaGF2aW9yIjogWwogICAgICAiVGhlIGFnZW50IHJl" + + "YWQgdGhlIG52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiBTS0lMTC5tZCBiZWZvcmUgdGFr" + + "aW5nIGFjdGlvbiIsCiAgICAgICJUaGUgYWdlbnQgdXNlZCAnaGVsbWZpbGUgLS1zZWxlY3RvciBy" + + "ZWxlYXNlLWdyb3VwPWRlcGVuZGVuY2llcyBzeW5jJyB0byBkZXBsb3kgb25seSBkZXBlbmRlbmNp" + + "ZXMiLAogICAgICAiVGhlIGFnZW50IHZlcmlmaWVkIHBvZHMgaW4gZGVwZW5kZW5jeSBuYW1lc3Bh" + + "Y2VzIChuYXRzLXN5c3RlbSwgY2Fzc2FuZHJhLXN5c3RlbSwgdmF1bHQtc3lzdGVtKSIsCiAgICAg" + + "ICJUaGUgYWdlbnQgcHJvdmlkZWQgdGhlIHNlbGVjdG9yIHJlZmVyZW5jZSBmb3IgdGFyZ2V0aW5n" + + "IG90aGVyIHJlbGVhc2UgZ3JvdXBzIgogICAgXQogIH0sCiAgewogICAgImlkIjogIlM3LWRlYnVn" + + "LWltYWdlcHVsbGJhY2tvZmYiLAogICAgInF1ZXN0aW9uIjogIkNhc3NhbmRyYSBwb2RzIGFyZSBp" + + "biBJbWFnZVB1bGxCYWNrT2ZmIHdpdGggNDAxIFVuYXV0aG9yaXplZCIsCiAgICAiZXhwZWN0ZWRf" + + "c2tpbGwiOiAibnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uIiwKICAgICJncm91bmRfdHJ1" + + "dGgiOiAiVGhlIGFnZW50IHJlYWQgdGhlIGRlYnVnZ2luZyByZWZlcmVuY2UgYW5kIHJhbiBkaWFn" + + "bm9zdGljIGNvbW1hbmRzIHRvIGlkZW50aWZ5IHRoZSByb290IGNhdXNlOiBkZXNjcmliZWQgdGhl" + + "IHBvZCwgY2hlY2tlZCBmb3IgcHVsbCBzZWNyZXRzLCBjaGVja2VkIGltYWdlUHVsbFNlY3JldHMg" + + "b24gdGhlIHBvZCBzcGVjIGFuZCBzZXJ2aWNlIGFjY291bnQuIEl0IGlkZW50aWZpZWQgdGhlIGlz" + + "c3VlIChtaXNzaW5nIHNlY3JldCwgd3JvbmcgY3JlZGVudGlhbHMsIG9yIG1pc3NpbmcgaW1hZ2VQ" + + "dWxsU2VjcmV0cykgYW5kIHByb3ZpZGVkIHRoZSBjb3JyZWN0IGZpeC4iLAogICAgImV4cGVjdGVk" + + "X2JlaGF2aW9yIjogWwogICAgICAiVGhlIGFnZW50IHJlYWQgdGhlIG52Y2Ytc2VsZi1tYW5hZ2Vk" + + "LWluc3RhbGxhdGlvbiBTS0lMTC5tZCBhbmQgcmVmZXJlbmNlcy9kZWJ1Z2dpbmcubWQiLAogICAg" + + "ICAiVGhlIGFnZW50IHJhbiAna3ViZWN0bCBkZXNjcmliZSBwb2QnIHRvIHNlZSB0aGUgSW1hZ2VQ" + + "dWxsQmFja09mZiBldmVudHMiLAogICAgICAiVGhlIGFnZW50IGNoZWNrZWQgZm9yIHB1bGwgc2Vj" + + "cmV0cyBpbiB0aGUgY2Fzc2FuZHJhLXN5c3RlbSBuYW1lc3BhY2UiLAogICAgICAiVGhlIGFnZW50" + + "IGNoZWNrZWQgaW1hZ2VQdWxsU2VjcmV0cyBvbiB0aGUgcG9kIHNwZWMgYW5kL29yIHNlcnZpY2Ug" + + "YWNjb3VudCIsCiAgICAgICJUaGUgYWdlbnQgaWRlbnRpZmllZCB0aGUgcm9vdCBjYXVzZSBhbmQg" + + "cHJvdmlkZWQgYSBzcGVjaWZpYyBmaXgiCiAgICBdCiAgfSwKICB7CiAgICAiaWQiOiAiUzktcmVt" + + "b3RlLWVrcy1yb3V0aW5nLWFuZC1zZWNyZXRzIiwKICAgICJxdWVzdGlvbiI6ICJDb25maWd1cmUg" + + "YSByZW1vdGUgRUtTIGNvbXB1dGUgY2x1c3RlciB0byByZWFjaCBteSBOVkNGIGNvbnRyb2wgcGxh" + + "bmUgdGhyb3VnaCBpdHMgRW52b3kgR2F0ZXdheSwgaW5jbHVkaW5nIE5BVFMgYW5kIHByaXZhdGUt" + + "cmVnaXN0cnkgcHVsbCBzZWNyZXRzLiIsCiAgICAiZXhwZWN0ZWRfc2tpbGwiOiAibnZjZi1zZWxm" + + "LW1hbmFnZWQtaW5zdGFsbGF0aW9uIiwKICAgICJncm91bmRfdHJ1dGgiOiAiVGhlIGFnZW50IGNv" + + "bmZpZ3VyZWQgdGhlIGNvbnRyb2wgcGxhbmUgdG8gdXNlIHRoZSBFbnZveSBHYXRld2F5IGNvbnRy" + + "b2xsZXIgaW4gZW52b3ktZ2F0ZXdheS1zeXN0ZW0gYW5kIEdhdGV3YXkvbnZjZi1nYXRld2F5IGlu" + + "IGVudm95LWdhdGV3YXksIHNldCBhbGwgc2l4IHJlbW90ZSB3b3JrZXIgZW5kcG9pbnRzIGFuZCB0" + + "aGUgZ3JwYy1wcm94eSBsb2NhbCBvdmVycmlkZSwgZW5hYmxlZCBOVkNGIGFuZCBOVkNUIGdSUEMg" + + "cm91dGVzIHBsdXMgTkFUUywgYW5kIGVuYWJsZWQgT3BlbkJhbyBpc3N1ZXIgZGlzY292ZXJ5LiBJ" + + "dCBjb25maWd1cmVkIHRoZSBiYXJlLUdhdGV3YXkgQ0xJIFVSTCBhbmQgSG9zdCBmaWVsZHMgaW5j" + + "bHVkaW5nIGljbXNfaG9zdCwgcGx1cyB0aGUgY29tcHV0ZS1wbGFuZSBJQ01TLCBSZVZhbCwgYW5k" + + "IE5BVFMgZXh0ZXJuYWwgVVJMcyBhbmQgaG9zdCBvdmVycmlkZXMuIEl0IGNyZWF0ZWQgdGhlIHB1" + + "bGwgc2VjcmV0IGluIGFsbCBjb250cm9sLXBsYW5lIG5hbWVzcGFjZXMgaW5jbHVkaW5nIGNlcnQt" + + "bWFuYWdlciwgYnV0IG9ubHkgaW4gbnZjYS1vcGVyYXRvciBvbiB0aGUgY29tcHV0ZSBjbHVzdGVy" + + "OyB0aGUgY2hhcnQgYW5kIG9wZXJhdG9yIG1pcnJvciBpdCB0byBudmNhLXN5c3RlbS4iLAogICAg" + + "ImV4cGVjdGVkX2JlaGF2aW9yIjogWwogICAgICAiVGhlIGFnZW50IHJlYWQgdGhlIG52Y2Ytc2Vs" + + "Zi1tYW5hZ2VkLWluc3RhbGxhdGlvbiBTS0lMTC5tZCBiZWZvcmUgdGFraW5nIGFjdGlvbiIsCiAg" + + "ICAgICJUaGUgYWdlbnQgc2V0IGluZ3Jlc3MuZ2F0ZXdheUFwaS5jb250cm9sbGVyTmFtZXNwYWNl" + + "IHRvIGVudm95LWdhdGV3YXktc3lzdGVtIiwKICAgICAgIlRoZSBhZ2VudCBzZXQgc2hhcmVkLCBn" + + "cnBjLCBhbmQgbmF0cyBHYXRld2F5IHJlZmVyZW5jZXMgdG8gbmFtZSBudmNmLWdhdGV3YXkgYW5k" + + "IG5hbWVzcGFjZSBlbnZveS1nYXRld2F5IiwKICAgICAgIlRoZSBhZ2VudCBzZXQgZ2xvYmFsLndv" + + "cmtlckVuZHBvaW50cy5udmNmU2VydmljZVVSTCwgbnZjZkdycGNTZXJ2aWNlVVJMLCBudmNmTmF0" + + "c1NlcnZpY2VVUkwsIG52Y3RTZXJ2aWNlVVJMLCBudmN0R3JwY1NlcnZpY2VVUkwsIGFuZCBpbnZv" + + "Y2F0aW9uU2VydmljZVVSTCIsCiAgICAgICJUaGUgYWdlbnQgc2V0IGdycGNwcm94eS5udmNmR3Jw" + + "Y1NlcnZpY2VVUkwgdG8gdGhlIGNvbnRyb2wtcGxhbmUtbG9jYWwgQVBJIGdSUEMgc2VydmljZSIs" + + "CiAgICAgICJUaGUgYWdlbnQgZW5hYmxlZCBib3RoIGluZ3Jlc3MuZ2F0ZXdheUFwaS5yb3V0ZXMu" + + "bnZjZkFwaS5ncnBjIGFuZCBudmN0QXBpLmdycGMgd2l0aCB3b3JrZXItYXBpIGFuZCB3b3JrZXIt" + + "dGFza3MgaG9zdG5hbWVzIiwKICAgICAgIlRoZSBhZ2VudCBleHBsaWNpdGx5IHNldCBpbmdyZXNz" + + "LmdhdGV3YXlBcGkucm91dGVzLm5hdHMuZW5hYmxlZCB0byB0cnVlIiwKICAgICAgIlRoZSBhZ2Vu" + + "dCBzZXQgb3BlbmJhby5taWdyYXRpb25zLmlzc3VlckRpc2NvdmVyeS5lbmFibGVkIHRvIHRydWUi" + + "LAogICAgICAiVGhlIGFnZW50IGNvbmZpZ3VyZWQgdGhlIGJhcmUtR2F0ZXdheSBDTEkgVVJMIGFu" + + "ZCBIb3N0IGZpZWxkcywgaW5jbHVkaW5nIHNjaGVtZS1sZXNzIGljbXNfaG9zdCIsCiAgICAgICJU" + + "aGUgYWdlbnQgY29uZmlndXJlZCBjb21wdXRlLXBsYW5lIGljbXNTZXJ2aWNlVVJMLCBpY21zU2Vy" + + "dmljZUhvc3RIZWFkZXJPdmVycmlkZSwgcmV2YWxTZXJ2aWNlVVJMLCByZXZhbFNlcnZpY2VIb3N0" + + "SGVhZGVyT3ZlcnJpZGUsIG5hdHNVUkwsIGFuZCBuYXRzSG9zdE92ZXJyaWRlIiwKICAgICAgIlRo" + + "ZSBjb250cm9sLXBsYW5lIHB1bGwtc2VjcmV0IG5hbWVzcGFjZSBsaXN0IGluY2x1ZGVkIGNlcnQt" + + "bWFuYWdlciIsCiAgICAgICJUaGUgY29tcHV0ZS1wbGFuZSBzZWNyZXQgd2FzIGNyZWF0ZWQgb25s" + + "eSBpbiBudmNhLW9wZXJhdG9yIGFuZCBtaXJyb3JlZCBieSB0aGUgY2hhcnQgYW5kIG9wZXJhdG9y" + + "IHRvIG52Y2Etc3lzdGVtIgogICAgXQogIH0sCiAgewogICAgImlkIjogIkcxMS1zcGxpdC10ZWFy" + + "ZG93biIsCiAgICAicXVlc3Rpb24iOiAiVGVhciBkb3duIG15IHNwbGl0IGNvbnRyb2wtcGxhbmUg" + + "YW5kIGNvbXB1dGUtcGxhbmUgZGVwbG95bWVudCBzYWZlbHkuIFNob3cgYm90aCB0aGUgSGVsbWZp" + + "bGUgdmFsdWVzIGFuZCBDTEkgcHJvZmlsZSB2YXJpYW50cy4iLAogICAgImV4cGVjdGVkX3NraWxs" + "IjogIm52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiIsCiAgICAiZ3JvdW5kX3RydXRoIjog" + - "IlRoZSBhZ2VudCB1c2VkIHRoZSBoZWxtZmlsZSBzZWxlY3RvciB0byBkZXBsb3kgb25seSB0aGUg" + - "ZGVwZW5kZW5jaWVzIHJlbGVhc2UgZ3JvdXAsIHRoZW4gdmVyaWZpZWQgcG9kcyBpbiB0aGUgZGVw" + - "ZW5kZW5jeSBuYW1lc3BhY2VzLiIsCiAgICAiZXhwZWN0ZWRfYmVoYXZpb3IiOiBbCiAgICAgICJU" + - "aGUgYWdlbnQgcmVhZCB0aGUgbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uIFNLSUxMLm1k" + - "IGJlZm9yZSB0YWtpbmcgYWN0aW9uIiwKICAgICAgIlRoZSBhZ2VudCB1c2VkICdoZWxtZmlsZSAt" + - "LXNlbGVjdG9yIHJlbGVhc2UtZ3JvdXA9ZGVwZW5kZW5jaWVzIHN5bmMnIHRvIGRlcGxveSBvbmx5" + - "IGRlcGVuZGVuY2llcyIsCiAgICAgICJUaGUgYWdlbnQgdmVyaWZpZWQgcG9kcyBpbiBkZXBlbmRl" + - "bmN5IG5hbWVzcGFjZXMgKG5hdHMtc3lzdGVtLCBjYXNzYW5kcmEtc3lzdGVtLCB2YXVsdC1zeXN0" + - "ZW0pIiwKICAgICAgIlRoZSBhZ2VudCBwcm92aWRlZCB0aGUgc2VsZWN0b3IgcmVmZXJlbmNlIGZv" + - "ciB0YXJnZXRpbmcgb3RoZXIgcmVsZWFzZSBncm91cHMiCiAgICBdCiAgfSwKICB7CiAgICAiaWQi" + - "OiAiUzctZGVidWctaW1hZ2VwdWxsYmFja29mZiIsCiAgICAicXVlc3Rpb24iOiAiQ2Fzc2FuZHJh" + - "IHBvZHMgYXJlIGluIEltYWdlUHVsbEJhY2tPZmYgd2l0aCA0MDEgVW5hdXRob3JpemVkIiwKICAg" + - "ICJleHBlY3RlZF9za2lsbCI6ICJudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24iLAogICAg" + - "Imdyb3VuZF90cnV0aCI6ICJUaGUgYWdlbnQgcmVhZCB0aGUgZGVidWdnaW5nIHJlZmVyZW5jZSBh" + - "bmQgcmFuIGRpYWdub3N0aWMgY29tbWFuZHMgdG8gaWRlbnRpZnkgdGhlIHJvb3QgY2F1c2U6IGRl" + - "c2NyaWJlZCB0aGUgcG9kLCBjaGVja2VkIGZvciBwdWxsIHNlY3JldHMsIGNoZWNrZWQgaW1hZ2VQ" + - "dWxsU2VjcmV0cyBvbiB0aGUgcG9kIHNwZWMgYW5kIHNlcnZpY2UgYWNjb3VudC4gSXQgaWRlbnRp" + - "ZmllZCB0aGUgaXNzdWUgKG1pc3Npbmcgc2VjcmV0LCB3cm9uZyBjcmVkZW50aWFscywgb3IgbWlz" + - "c2luZyBpbWFnZVB1bGxTZWNyZXRzKSBhbmQgcHJvdmlkZWQgdGhlIGNvcnJlY3QgZml4LiIsCiAg" + - "ICAiZXhwZWN0ZWRfYmVoYXZpb3IiOiBbCiAgICAgICJUaGUgYWdlbnQgcmVhZCB0aGUgbnZjZi1z" + - "ZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uIFNLSUxMLm1kIGFuZCByZWZlcmVuY2VzL2RlYnVnZ2lu" + - "Zy5tZCIsCiAgICAgICJUaGUgYWdlbnQgcmFuICdrdWJlY3RsIGRlc2NyaWJlIHBvZCcgdG8gc2Vl" + - "IHRoZSBJbWFnZVB1bGxCYWNrT2ZmIGV2ZW50cyIsCiAgICAgICJUaGUgYWdlbnQgY2hlY2tlZCBm" + - "b3IgcHVsbCBzZWNyZXRzIGluIHRoZSBjYXNzYW5kcmEtc3lzdGVtIG5hbWVzcGFjZSIsCiAgICAg" + - "ICJUaGUgYWdlbnQgY2hlY2tlZCBpbWFnZVB1bGxTZWNyZXRzIG9uIHRoZSBwb2Qgc3BlYyBhbmQv" + - "b3Igc2VydmljZSBhY2NvdW50IiwKICAgICAgIlRoZSBhZ2VudCBpZGVudGlmaWVkIHRoZSByb290" + - "IGNhdXNlIGFuZCBwcm92aWRlZCBhIHNwZWNpZmljIGZpeCIKICAgIF0KICB9LAogIHsKICAgICJp" + - "ZCI6ICJTOS1yZW1vdGUtZWtzLXJvdXRpbmctYW5kLXNlY3JldHMiLAogICAgInF1ZXN0aW9uIjog" + - "IkNvbmZpZ3VyZSBhIHJlbW90ZSBFS1MgY29tcHV0ZSBjbHVzdGVyIHRvIHJlYWNoIG15IE5WQ0Yg" + - "Y29udHJvbCBwbGFuZSB0aHJvdWdoIGl0cyBFbnZveSBHYXRld2F5LCBpbmNsdWRpbmcgTkFUUyBh" + - "bmQgcHJpdmF0ZS1yZWdpc3RyeSBwdWxsIHNlY3JldHMuIiwKICAgICJleHBlY3RlZF9za2lsbCI6" + - "ICJudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24iLAogICAgImdyb3VuZF90cnV0aCI6ICJU" + - "aGUgYWdlbnQgY29uZmlndXJlZCB0aGUgY29udHJvbCBwbGFuZSB0byB1c2UgdGhlIEVudm95IEdh" + - "dGV3YXkgY29udHJvbGxlciBpbiBlbnZveS1nYXRld2F5LXN5c3RlbSBhbmQgR2F0ZXdheS9udmNm" + - "LWdhdGV3YXkgaW4gZW52b3ktZ2F0ZXdheSwgc2V0IGFsbCBzaXggcmVtb3RlIHdvcmtlciBlbmRw" + - "b2ludHMgYW5kIHRoZSBncnBjLXByb3h5IGxvY2FsIG92ZXJyaWRlLCBlbmFibGVkIE5WQ0YgYW5k" + - "IE5WQ1QgZ1JQQyByb3V0ZXMgcGx1cyBOQVRTLCBhbmQgZW5hYmxlZCBPcGVuQmFvIGlzc3VlciBk" + - "aXNjb3ZlcnkuIEl0IGNvbmZpZ3VyZWQgdGhlIGJhcmUtR2F0ZXdheSBDTEkgVVJMIGFuZCBIb3N0" + - "IGZpZWxkcyBpbmNsdWRpbmcgaWNtc19ob3N0LCBwbHVzIHRoZSBjb21wdXRlLXBsYW5lIElDTVMs" + - "IFJlVmFsLCBhbmQgTkFUUyBleHRlcm5hbCBVUkxzIGFuZCBob3N0IG92ZXJyaWRlcy4gSXQgY3Jl" + - "YXRlZCB0aGUgcHVsbCBzZWNyZXQgaW4gYWxsIGNvbnRyb2wtcGxhbmUgbmFtZXNwYWNlcyBpbmNs" + - "dWRpbmcgY2VydC1tYW5hZ2VyLCBidXQgb25seSBpbiBudmNhLW9wZXJhdG9yIG9uIHRoZSBjb21w" + - "dXRlIGNsdXN0ZXI7IHRoZSBjaGFydCBhbmQgb3BlcmF0b3IgbWlycm9yIGl0IHRvIG52Y2Etc3lz" + - "dGVtLiIsCiAgICAiZXhwZWN0ZWRfYmVoYXZpb3IiOiBbCiAgICAgICJUaGUgYWdlbnQgcmVhZCB0" + - "aGUgbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uIFNLSUxMLm1kIGJlZm9yZSB0YWtpbmcg" + - "YWN0aW9uIiwKICAgICAgIlRoZSBhZ2VudCBzZXQgaW5ncmVzcy5nYXRld2F5QXBpLmNvbnRyb2xs" + - "ZXJOYW1lc3BhY2UgdG8gZW52b3ktZ2F0ZXdheS1zeXN0ZW0iLAogICAgICAiVGhlIGFnZW50IHNl" + - "dCBzaGFyZWQsIGdycGMsIGFuZCBuYXRzIEdhdGV3YXkgcmVmZXJlbmNlcyB0byBuYW1lIG52Y2Yt" + - "Z2F0ZXdheSBhbmQgbmFtZXNwYWNlIGVudm95LWdhdGV3YXkiLAogICAgICAiVGhlIGFnZW50IHNl" + - "dCBnbG9iYWwud29ya2VyRW5kcG9pbnRzLm52Y2ZTZXJ2aWNlVVJMLCBudmNmR3JwY1NlcnZpY2VV" + - "UkwsIG52Y2ZOYXRzU2VydmljZVVSTCwgbnZjdFNlcnZpY2VVUkwsIG52Y3RHcnBjU2VydmljZVVS" + - "TCwgYW5kIGludm9jYXRpb25TZXJ2aWNlVVJMIiwKICAgICAgIlRoZSBhZ2VudCBzZXQgZ3JwY3By" + - "b3h5Lm52Y2ZHcnBjU2VydmljZVVSTCB0byB0aGUgY29udHJvbC1wbGFuZS1sb2NhbCBBUEkgZ1JQ" + - "QyBzZXJ2aWNlIiwKICAgICAgIlRoZSBhZ2VudCBlbmFibGVkIGJvdGggaW5ncmVzcy5nYXRld2F5" + - "QXBpLnJvdXRlcy5udmNmQXBpLmdycGMgYW5kIG52Y3RBcGkuZ3JwYyB3aXRoIHdvcmtlci1hcGkg" + - "YW5kIHdvcmtlci10YXNrcyBob3N0bmFtZXMiLAogICAgICAiVGhlIGFnZW50IGV4cGxpY2l0bHkg" + - "c2V0IGluZ3Jlc3MuZ2F0ZXdheUFwaS5yb3V0ZXMubmF0cy5lbmFibGVkIHRvIHRydWUiLAogICAg" + - "ICAiVGhlIGFnZW50IHNldCBvcGVuYmFvLm1pZ3JhdGlvbnMuaXNzdWVyRGlzY292ZXJ5LmVuYWJs" + - "ZWQgdG8gdHJ1ZSIsCiAgICAgICJUaGUgYWdlbnQgY29uZmlndXJlZCB0aGUgYmFyZS1HYXRld2F5" + - "IENMSSBVUkwgYW5kIEhvc3QgZmllbGRzLCBpbmNsdWRpbmcgc2NoZW1lLWxlc3MgaWNtc19ob3N0" + - "IiwKICAgICAgIlRoZSBhZ2VudCBjb25maWd1cmVkIGNvbXB1dGUtcGxhbmUgaWNtc1NlcnZpY2VV" + - "UkwsIGljbXNTZXJ2aWNlSG9zdEhlYWRlck92ZXJyaWRlLCByZXZhbFNlcnZpY2VVUkwsIHJldmFs" + - "U2VydmljZUhvc3RIZWFkZXJPdmVycmlkZSwgbmF0c1VSTCwgYW5kIG5hdHNIb3N0T3ZlcnJpZGUi" + - "LAogICAgICAiVGhlIGNvbnRyb2wtcGxhbmUgcHVsbC1zZWNyZXQgbmFtZXNwYWNlIGxpc3QgaW5j" + - "bHVkZWQgY2VydC1tYW5hZ2VyIiwKICAgICAgIlRoZSBjb21wdXRlLXBsYW5lIHNlY3JldCB3YXMg" + - "Y3JlYXRlZCBvbmx5IGluIG52Y2Etb3BlcmF0b3IgYW5kIG1pcnJvcmVkIGJ5IHRoZSBjaGFydCBh" + - "bmQgb3BlcmF0b3IgdG8gbnZjYS1zeXN0ZW0iCiAgICBdCiAgfSwKICB7CiAgICAiaWQiOiAiRzEx" + - "LXNwbGl0LXRlYXJkb3duIiwKICAgICJxdWVzdGlvbiI6ICJUZWFyIGRvd24gbXkgc3BsaXQgY29u" + - "dHJvbC1wbGFuZSBhbmQgY29tcHV0ZS1wbGFuZSBkZXBsb3ltZW50IHNhZmVseS4gU2hvdyBib3Ro" + - "IHRoZSBIZWxtZmlsZSB2YWx1ZXMgYW5kIENMSSBwcm9maWxlIHZhcmlhbnRzLiIsCiAgICAiZXhw" + - "ZWN0ZWRfc2tpbGwiOiAibnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uIiwKICAgICJncm91" + - "bmRfdHJ1dGgiOiAiVGhlIEhlbG1maWxlIGZsb3cgZGVzdHJveWVkIGFuZCBjb25maXJtZWQgZGVy" + - "ZWdpc3RyYXRpb24gb2YgZXZlcnkgY29tcHV0ZSBjbHVzdGVyIGJlZm9yZSBkZXN0cm95aW5nIHRo" + - "ZSBjb250cm9sIHBsYW5lIGFuZCBwYXNzZWQgYm90aCBjb250cm9sLXBsYW5lIGt1YmVjb25maWcg" + - "Zm9ybXMuIEJlZm9yZSBlaXRoZXIgaGFuZG9mZiBjb3VsZCBkZXN0cm95IHRoZSBjb250cm9sIHBs" + - "YW5lLCBib3RoIHRlYXJkb3duIGZsb3dzIHdhcm5lZCB0aGF0IG5hbWVzcGFjZSBwcmVzZXJ2YXRp" + - "b24gZG9lcyBub3QgcHJlc2VydmUgdGhlIEhlbG0gcmVsZWFzZSwgcmVxdWlyZWQgZWZmZWN0aXZl" + - "IGNlcnRNYW5hZ2VyLmVuYWJsZWQ6IGZhbHNlIGZvciBhbiBleHRlcm5hbCBpbnN0YWxsYXRpb24g" + - "YW5kIGFib3J0ZWQgaWYgdHJ1ZSwgYW5kIHZlcmlmaWVkIG1hdGNoaW5nIHJlbGVhc2Ugb3duZXJz" + - "aGlwIGZvciBhbiBpbnRlbmRlZCBzdGFjay1tYW5hZ2VkIHJlbGVhc2UsIGFib3J0aW5nIG9uIG1p" + - "c3Npbmcgb3IgbWlzbWF0Y2hlZCBldmlkZW5jZS4gVGhleSBwcmVzZXJ2ZWQgdGhlIG5hbWVzcGFj" + - "ZSBieSBkZWZhdWx0IGFuZCBkaWQgbm90IGRlbGV0ZSBpdCB3aXRob3V0IG5hbWVzcGFjZSBwcm92" + - "ZW5hbmNlIGFuZCBleHBsaWNpdCBjb25maXJtYXRpb24uIFRoZSBDTEkgZmxvdyByZXRhaW5lZCB0" + - "aGUgZ2VuZXJhdGVkIHJlZ2lzdHJhdGlvbiB2YWx1ZXMsIHVzZWQgdGhlIGZ1bGwtcHJlZml4IHN0" + - "YXR1cyBjb21tYW5kIHRvIGluc3BlY3QgbGl2ZSByZWdpc3RyYXRpb25zLCBzdGF0ZWQgdGhhdCBu" + - "YW1lZC1jbHVzdGVyIHBsYW4tb25seSBkb2VzIG5vdCBxdWVyeSBJQ01TIGFuZCBjYW5ub3QgcHJl" + - "ZGljdCBjb25kaXRpb25hbCBjb250cm9sLXBsYW5lIHJlbW92YWwsIGFuZCBnb3QgZXhwbGljaXQg" + - "Y29uZmlybWF0aW9uIHdoZW4gdGhlIHRhcmdldCB3YXMgdGhlIGxhc3QgcmVnaXN0ZXJlZCBjbHVz" + - "dGVyLiBJdCB0aGVuIHByZXZpZXdlZCBhbmQgcmFuIGRvd24gd2l0aCB0aGUgZnVsbCBwZXJzaXN0" + - "ZW50IHByZWZpeCwgcmVtb3ZpbmcgdGhlIGNvbnRyb2wgcGxhbmUgb25seSBhZnRlciB0aGUgbGFz" + - "dCByZWdpc3RyYXRpb24gd2FzIGdvbmUuIiwKICAgICJleHBlY3RlZF9iZWhhdmlvciI6IFsKICAg" + - "ICAgIlRoZSBhZ2VudCByZWFkIHRoZSBudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24gU0tJ" + - "TEwubWQgYmVmb3JlIHRha2luZyBhY3Rpb24iLAogICAgICAiRm9yIGV2ZXJ5IGNvbXB1dGUgY2x1" + - "c3RlciwgdGhlIEhlbG1maWxlIGZsb3cgcmFuIHRoZSBjb21wdXRlLXBsYW5lIE1ha2VmaWxlIGRl" + - "c3Ryb3kgdGFyZ2V0IHdpdGggaXRzIGNvbXB1dGUga3ViZWNvbmZpZyIsCiAgICAgICJBZnRlciBj" + - "b25maXJtYXRpb24sIHRoZSBIZWxtZmlsZSBmbG93IHJhbiBjbHVzdGVyIGRlbGV0ZSB3aXRoIGNs" + - "dXN0ZXJJRCBhbmQgbmNhSUQgYmVmb3JlIGNvbnRyb2wtcGxhbmUgZGVzdHJ1Y3Rpb24iLAogICAg" + - "ICAiQmVmb3JlIGVpdGhlciBoYW5kb2ZmIGNvdWxkIGRlc3Ryb3kgdGhlIGNvbnRyb2wgcGxhbmUs" + - "IGJvdGggdGVhcmRvd24gZmxvd3Mgd2FybmVkIHRoYXQgbmFtZXNwYWNlIHByZXNlcnZhdGlvbiBk" + - "b2VzIG5vdCBwcmVzZXJ2ZSB0aGUgSGVsbSByZWxlYXNlLCByZXF1aXJlZCBlZmZlY3RpdmUgY2Vy" + - "dE1hbmFnZXIuZW5hYmxlZDogZmFsc2UgZm9yIGFuIGV4dGVybmFsIGluc3RhbGxhdGlvbiBhbmQg" + - "YWJvcnRlZCBpZiB0cnVlLCBhbmQgdmVyaWZpZWQgaW50ZW5kZWQgc3RhY2sgb3duZXJzaGlwIHdo" + - "ZW4gZW5hYmxlZCwgYWJvcnRpbmcgb24gbWlzc2luZyBvciBtaXNtYXRjaGVkIGV2aWRlbmNlIiwK" + - "ICAgICAgIkJvdGggdGVhcmRvd24gZmxvd3MgcHJlc2VydmVkIHRoZSBjZXJ0LW1hbmFnZXIgbmFt" + - "ZXNwYWNlIGJ5IGRlZmF1bHQgYW5kIGRpZCBub3QgZGVsZXRlIGl0IHdpdGhvdXQgbmFtZXNwYWNl" + - "IHByb3ZlbmFuY2UgYW5kIGV4cGxpY2l0IGNvbmZpcm1hdGlvbiIsCiAgICAgICJUaGUgSGVsbWZp" + - "bGUgZmxvdyByYW4gY29udHJvbC1wbGFuZSBNYWtlZmlsZSBkZXN0cm95IHdpdGggYm90aCBLVUJF" + - "Q09ORklHIGFuZCBLVUJFQ09ORklHX0ZJTEUiLAogICAgICAiVGhlIENMSSBmbG93IHJldGFpbmVk" + - "IG91dC88Y2x1c3Rlci1uYW1lPi1yZWdpc3Rlci12YWx1ZXMueWFtbCB1bnRpbCB0ZWFyZG93biBj" + - "b21wbGV0ZWQiLAogICAgICAiQmVmb3JlIHJlYWwgZG93biwgdGhlIENMSSBmbG93IHVzZWQgdGhl" + - "IGZ1bGwtcHJlZml4IHN0YXR1cyBjb21tYW5kIHRvIGluc3BlY3QgbGl2ZSByZWdpc3RyYXRpb25z" + - "LCBzdGF0ZWQgdGhhdCBuYW1lZC1jbHVzdGVyIHBsYW4tb25seSBkb2VzIG5vdCBxdWVyeSBJQ01T" + - "IGFuZCBjYW5ub3QgcHJlZGljdCBjb25kaXRpb25hbCBjb250cm9sLXBsYW5lIHJlbW92YWwsIHdh" + - "cm5lZCB3aGVuIHRoZSB0YXJnZXQgd2FzIHRoZSBsYXN0IHJlZ2lzdGVyZWQgY2x1c3RlciwgYW5k" + - "IGdvdCBleHBsaWNpdCBjb25maXJtYXRpb24iLAogICAgICAiVGhlIENMSSBmbG93IHVzZWQgLS1j" + - "b25maWcsIGJvdGggc3RhY2sgcGF0aHMsIC0tZW52LCAtLXBsYWluLCBib3RoIGNvbnRleHRzLCBh" + - "bmQgLS1pY21zLXVybCBmb3IgZG93biAtLXBsYW4tb25seSBhbmQgdGhlbiBkb3duIiwKICAgICAg" + - "IlRoZSBhZ2VudCBzdGF0ZWQgdGhhdCBkb3duIHVucmVnaXN0ZXJzIGVhY2ggY29tcHV0ZSBjbHVz" + - "dGVyIGFuZCByZW1vdmVzIHRoZSBjb250cm9sIHBsYW5lIG9ubHkgYWZ0ZXIgbm8gcmVnaXN0cmF0" + - "aW9ucyByZW1haW4iCiAgICBdCiAgfSwKICB7CiAgICAiaWQiOiAiUzEzLXZhbHVlcy1wcmVjZWRl" + - "bmNlIiwKICAgICJxdWVzdGlvbiI6ICJJIGFkZGVkIGEgdmFsdWUgdG8gbXkgZW52aXJvbm1lbnQg" + - "WUFNTCBidXQgaXQncyBiZWluZyBzaWxlbnRseSBpZ25vcmVkLiBIb3cgZG8gaGVsbWZpbGUgdmFs" + - "dWVzIHdvcmsgaW4gTlZDRj8iLAogICAgImV4cGVjdGVkX3NraWxsIjogIm52Y2Ytc2VsZi1tYW5h" + - "Z2VkLWluc3RhbGxhdGlvbiIsCiAgICAiZ3JvdW5kX3RydXRoIjogIlRoZSBhZ2VudCBleHBsYWlu" + - "ZWQgdGhlIHZhbHVlcyBwcmVjZWRlbmNlIGNoYWluIChiYXNlLnlhbWwsIGVudiBZQU1MLCBnbG9i" + - "YWwueWFtbC5nb3RtcGwsIHNlY3JldHMsIGlubGluZSB2YWx1ZXMpLCBpZGVudGlmaWVkIHRoYXQg" + - "Z2xvYmFsLnlhbWwuZ290bXBsIG9ubHkgcGFzc2VzIHRocm91Z2ggc3BlY2lmaWMga2V5cywgYW5k" + - "IGV4cGxhaW5lZCB0aGF0IGFyYml0cmFyeSBjaGFydCB2YWx1ZXMgbXVzdCB1c2UgcmVsZWFzZSBp" + - "bmxpbmUgdmFsdWVzIGJsb2Nrcy4iLAogICAgImV4cGVjdGVkX2JlaGF2aW9yIjogWwogICAgICAi" + - "VGhlIGFnZW50IHJlYWQgdGhlIG52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbiBTS0lMTC5t" + - "ZCBiZWZvcmUgdGFraW5nIGFjdGlvbiIsCiAgICAgICJUaGUgYWdlbnQgZXhwbGFpbmVkIHRoZSB2" + - "YWx1ZXMgcHJlY2VkZW5jZSBjaGFpbjogYmFzZS55YW1sIC0+IGVudiBZQU1MIC0+IGdsb2JhbC55" + - "YW1sLmdvdG1wbCAtPiBzZWNyZXRzIC0+IGlubGluZSB2YWx1ZXMiLAogICAgICAiVGhlIGFnZW50" + - "IGlkZW50aWZpZWQgdGhhdCBnbG9iYWwueWFtbC5nb3RtcGwgb25seSBwYXNzZXMgdGhyb3VnaCBz" + - "cGVjaWZpYyBrZXlzIChjYXNzYW5kcmEucmVwbGljYUNvdW50LCBnbG9iYWwuc3RvcmFnZUNsYXNz" + - "LCBnbG9iYWwuaW1hZ2UsIGV0Yy4pIiwKICAgICAgIlRoZSBhZ2VudCBleHBsYWluZWQgdGhhdCBh" + - "cmJpdHJhcnkgY2hhcnQgdmFsdWVzIG11c3QgYmUgc2V0IHZpYSByZWxlYXNlIGlubGluZSB2YWx1" + - "ZXM6IGJsb2NrcyIsCiAgICAgICJUaGUgYWdlbnQgbGlzdGVkIGV4YW1wbGVzIG9mIHZhbHVlcyB0" + - "aGF0IGFyZSBwcm9wYWdhdGVkIGFuZCBhcmJpdHJhcnkgY2hhcnQgdmFsdWVzIHRoYXQgcmVxdWly" + - "ZSBhIHJlbGVhc2UgdmFsdWVzIGJsb2NrIgogICAgXQogIH0sCiAgewogICAgImlkIjogIlMxNC1l" + - "bmFibGUtbGxtLWZ1bmN0aW9ucyIsCiAgICAicXVlc3Rpb24iOiAiSSBuZWVkIHRvIGRlcGxveSBm" + - "dW5jdGlvblR5cGU6IExMTSBmdW5jdGlvbnMgb24gYSBzZWxmLW1hbmFnZWQsIHNpbmdsZS1ub2Rl" + - "IGlzb2xhdGVkIHRlc3QgY2x1c3Rlci4gV2hhdCBIZWxtZmlsZSBjb25maWd1cmF0aW9uIGFuZCB2" + - "ZXJpZmljYXRpb24gc3RlcHMgZG8gSSBuZWVkPyIsCiAgICAiZXhwZWN0ZWRfc2tpbGwiOiAibnZj" + - "Zi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uIiwKICAgICJncm91bmRfdHJ1dGgiOiAiVGhlIGFn" + - "ZW50IGVuYWJsZWQgdGhlIExMTSBhZGRvbiB3aXRoIGFkZG9ucy5sbG0uZW5hYmxlZCwgY29uZmln" + - "dXJlZCBzaW5nbGUgcmVwbGljYXMgZm9yIHRoZSBMTE0gQVBJIEdhdGV3YXkgYW5kIHJlcXVlc3Qg" + - "cm91dGVyLCBhbmQgZXhwbGFpbmVkIHRoYXQgdGhlIHJlcXVlc3Qgcm91dGVyIHVzZXMgcG93ZXIt" + - "b2YtdHdvIHdoZW4gbm8gbG9hZC1iYWxhbmNlciBjb25maWd1cmF0aW9uIGlzIHNldC4gSXQgbGlu" + - "a2VkIHRoZSBjYW5vbmljYWwgcmVxdWVzdC1yb3V0ZXIgbG9hZC1iYWxhbmNpbmcgZ3VpZGUgZm9y" + - "IG90aGVyIHJvdXRpbmcgbWV0aG9kcy4gRm9yIHRoZSBpc29sYXRlZCBwbGFpbnRleHQgY2x1c3Rl" + - "ciwgaXQgcmVsaWVkIG9uIHRoZSBzZWxmLW1hbmFnZWQgc3RhY2sgZGVmYXVsdCBmb3IgdGhlIGJ1" + - "bmRsZWQgZ2F0ZXdheS10by1BUEkgYXV0aGVudGljYXRpb24gaG9wIGFuZCBpbmNsdWRlZCBhZ2Vu" + - "dENvbmZpZy5tZXJnZUNvbmZpZy53b3JrbG9hZC5zdGFyZ2F0ZVFVSUNJbnNlY3VyZSBmb3IgdGhl" + - "IHNlcGFyYXRlIHdvcmtlciB0cmFuc3BvcnQsIHdpdGggYSB3YXJuaW5nIHRoYXQgcGxhaW50ZXh0" + - "IHdvcmtlciB0cmFuc3BvcnQgaXMgbm90IGZvciBwcm9kdWN0aW9uLiBJdCByZWZyZXNoZWQgdGhl" + - "IGNvbXB1dGUgcGxhbmUgdXNpbmcgdGhlIHNhbWUgaGFuZG9mZiB1c2VkIGR1cmluZyBpbnN0YWxs" + - "YXRpb24sIHJlZGVwbG95ZWQgZXhpc3RpbmcgTExNIGZ1bmN0aW9ucywgYW5kIHZlcmlmaWVkIHRo" + - "ZSBMTE0gZGVwbG95bWVudHMsIHJvdXRlLCBhbmQgbGxtLXdvcmtlciBzaWRlY2FyLiIsCiAgICAi" + - "ZXhwZWN0ZWRfYmVoYXZpb3IiOiBbCiAgICAgICJUaGUgYWdlbnQgdXNlZCBhZGRvbnMubGxtLmVu" + - "YWJsZWQsIG5vdCB0aGUgb2Jzb2xldGUgbGxtLmVuYWJsZWQgcGF0aCIsCiAgICAgICJUaGUgYWdl" + - "bnQgc2V0IGdhdGV3YXkgYW5kIHJlcXVlc3RSb3V0ZXIgcmVwbGljYUNvdW50IHRvIDEgZm9yIHRo" + - "ZSBzaW5nbGUtbm9kZSB0ZXN0IGNsdXN0ZXIiLAogICAgICAiVGhlIGFnZW50IHN0YXRlZCB0aGF0" + - "IHRoZSByZXF1ZXN0IHJvdXRlciBkZWZhdWx0cyB0byBwb3dlci1vZi10d28gYW5kIGxpbmtlZCB0" + - "aGUgY2Fub25pY2FsIHJlcXVlc3Qtcm91dGVyIGxvYWQtYmFsYW5jaW5nIGd1aWRlIGZvciBvdGhl" + - "ciBtZXRob2RzIiwKICAgICAgIlRoZSBhZ2VudCBleHBsYWluZWQgdGhhdCB0aGUgYnVuZGxlZCBn" + - "YXRld2F5LXRvLUFQSSBhdXRoZW50aWNhdGlvbiBob3AgZGVmYXVsdHMgdG8gcGxhaW50ZXh0LCBp" + - "bmNsdWRlZCB3b3JrbG9hZC5zdGFyZ2F0ZVFVSUNJbnNlY3VyZSBvbmx5IGZvciB0aGUgaXNvbGF0" + - "ZWQgd29ya2VyIHRyYW5zcG9ydCwgYW5kIHdhcm5lZCBhZ2FpbnN0IHBsYWludGV4dCB3b3JrZXIg" + - "dHJhbnNwb3J0IGluIHByb2R1Y3Rpb24iLAogICAgICAiVGhlIGFnZW50IGFwcGxpZWQgdGhlIGNv" + - "bnRyb2wtcGxhbmUgSGVsbWZpbGUgZW52aXJvbm1lbnQsIHJlZnJlc2hlZCB0aGUgY29tcHV0ZSBw" + - "bGFuZSB3aXRoIHRoZSBzYW1lIHNlbGVjdGVkIGhhbmRvZmYsIGFuZCByZWNyZWF0ZWQgb3IgcmVk" + - "ZXBsb3llZCBleGlzdGluZyBMTE0gZnVuY3Rpb25zIiwKICAgICAgIlRoZSBhZ2VudCB2ZXJpZmll" + - "ZCBsbG0tYXBpLWdhdGV3YXksIGxsbS1yZXF1ZXN0LXJvdXRlciwgdGhlIExMTSBIVFRQUm91dGUs" + - "IGFuZCB0aGUgbGxtLXdvcmtlciBzaWRlY2FyIGluY2x1ZGluZyAtLXF1aWMtaW5zZWN1cmUiCiAg" + - "ICBdCiAgfSwKICB7CiAgICAiaWQiOiAiRzgtTkVHLW5vdC1mb3ItazNkIiwKICAgICJxdWVzdGlv" + - "biI6ICJTZXQgdXAgYSBsb2NhbCBOVkNGIGRldiBjbHVzdGVyIHVzaW5nIGszZCBmb3IgdGVzdGlu" + - "ZyIsCiAgICAiZXhwZWN0ZWRfc2tpbGwiOiBudWxsLAogICAgInNob3VsZF90cmlnZ2VyIjogZmFs" + - "c2UsCiAgICAiZ3JvdW5kX3RydXRoIjogIlRoaXMgaXMgYSBsb2NhbCBrM2QgZGV2ZWxvcG1lbnQg" + - "cmVxdWVzdCB0aGF0IGJlbG9uZ3MgdG8gdGhlIG52Y2Ytc2VsZi1ob3N0ZWQtbG9jYWwtZGV2IHNr" + - "aWxsLCBub3QgbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uLiBUaGUgYWdlbnQgZGlkIG5v" + - "dCByZWFkIG9yIHVzZSB0aGUgc2VsZi1tYW5hZ2VkIGluc3RhbGxhdGlvbiBza2lsbCBhbmQgaW5z" + - "dGVhZCBwcm92aWRlZCBrM2Qtc3BlY2lmaWMgZ3VpZGFuY2UuIiwKICAgICJleHBlY3RlZF9iZWhh" + - "dmlvciI6IFsKICAgICAgIlRoZSBhZ2VudCBkaWQgbm90IHJlYWQgbnZjZi1zZWxmLW1hbmFnZWQt" + - "aW5zdGFsbGF0aW9uL1NLSUxMLm1kIiwKICAgICAgIlRoZSBhZ2VudCBkaWQgbm90IHByb3ZpZGUg" + - "aGVsbWZpbGUtYmFzZWQgcHJvZHVjdGlvbiBkZXBsb3ltZW50IGluc3RydWN0aW9ucyIsCiAgICAg" + - "ICJUaGUgYWdlbnQgcHJvdmlkZWQgazNkLXNwZWNpZmljIGxvY2FsIGRldmVsb3BtZW50IGd1aWRh" + - "bmNlIG9yIGRlZmVycmVkIHRvIHRoZSBhcHByb3ByaWF0ZSBsb2NhbC1kZXYgc2tpbGwiCiAgICBd" + - "CiAgfQpdClBLBwhHVWpWSlYAAEpWAABQSwMEFAAIAAAAAAAhAAAAAAAAAAAAAAAAAC8ACQBkYXRh" + - "L252Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbi9leGFtcGxlcy5tZFVUBQABAKbOEiMgRXhh" + - "bXBsZXMKCldvcmtlZCBleGFtcGxlcyBiYXNlZCBvbiByZWFsIGRlcGxveW1lbnQgc2NlbmFyaW9z" + - "LgoKIyMgRXhhbXBsZSAxOiBPdmVycmlkZSBDYXNzYW5kcmEgUmVzb3VyY2VzCgpUaGUgZGVmYXVs" + - "dCBDYXNzYW5kcmEgcmVzb3VyY2UgbGltaXRzIGNhdXNlIE9PTSBvbiBsYXJnZSBpbnN0YW5jZSB0" + - "eXBlcyAoZS5nLiwgYHA1LjQ4eGxhcmdlYCkuCgpQcm9ibGVtOiBDYXNzYW5kcmEgcG9kcyByZXN0" + - "YXJ0IHdpdGggYE9PTUtpbGxlZGAuCgpTb2x1dGlvbjogT3ZlcnJpZGUgcmVzb3VyY2VzIHZpYSBo" + - "ZWxtZmlsZSByZWxlYXNlIHZhbHVlcyBibG9jay4KCiMjIyBTdGVwIDE6IENhcHR1cmUgYmFzZWxp" + - "bmUKCmBgYGJhc2gKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0b3IgbmFtZT1j" + - "YXNzYW5kcmEgdGVtcGxhdGUgPiAvdG1wL2Nhc3MtYmVmb3JlLnlhbWwKZ3JlcCAtQTggJ3Jlc291" + - "cmNlczonIC90bXAvY2Fzcy1iZWZvcmUueWFtbCB8IGhlYWQgLTEwCmBgYAoKIyMjIFN0ZXAgMjog" + - "QWRkIG92ZXJyaWRlIHRvIGhlbG1maWxlLmQvMDEtZGVwZW5kZW5jaWVzLnlhbWwuZ290bXBsCgpJ" + - "biB0aGUgZXhhbXBsZXMgYmVsb3csIGA8cHJpdmF0ZS12YWx1ZXM+YCByZWZlcnMgdG8gdGhlIGBz" + - "ZWNyZXRzL2AgZGlyZWN0b3J5IGF0IHRoZSBoZWxtZmlsZSBzdGFjayByb290LgoKYGBgeWFtbAot" + - "IG5hbWU6IGNhc3NhbmRyYQogIHZlcnNpb246IDAuOC4wCiAgY29uZGl0aW9uOiBjYXNzYW5kcmEu" + - "ZW5hYmxlZAogIG5hbWVzcGFjZTogY2Fzc2FuZHJhLXN5c3RlbQogIDw8OiAqZGVwZW5kZW5jeQog" + - "IHZhbHVlczoKICAgIC0gLi4vZ2xvYmFsLnlhbWwuZ290bXBsCiAgICAtIC4uLzxwcml2YXRlLXZh" + - "bHVlcz4ve3sgcmVxdWlyZWRFbnYgIkhFTE1GSUxFX0VOViIgfX0tc2VjcmV0cy55YW1sCiAgICAt" + - "IGNhc3NhbmRyYToKICAgICAgICByZXNvdXJjZXM6CiAgICAgICAgICBsaW1pdHM6CiAgICAgICAg" + - "ICAgIGNwdTogIjgiCiAgICAgICAgICAgIG1lbW9yeTogODE5Mk1pCiAgICAgICAgICByZXF1ZXN0" + - "czoKICAgICAgICAgICAgY3B1OiAiMiIKICAgICAgICAgICAgbWVtb3J5OiA0MDk2TWkKYGBgCgoj" + - "IyMgU3RlcCAzOiBWZXJpZnkgYW5kIGFwcGx5CgpgYGBiYXNoCkhFTE1GSUxFX0VOVj08ZW52PiBo" + - "ZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9Y2Fzc2FuZHJhIHRlbXBsYXRlID4gL3RtcC9jYXNzLWFm" + - "dGVyLnlhbWwKZGlmZiAvdG1wL2Nhc3MtYmVmb3JlLnlhbWwgL3RtcC9jYXNzLWFmdGVyLnlhbWwg" + - "ICMgQ29uZmlybSByZXNvdXJjZXMgY2hhbmdlZApIRUxNRklMRV9FTlY9PGVudj4gaGVsbWZpbGUg" + - "LS1zZWxlY3RvciBuYW1lPWNhc3NhbmRyYSBzeW5jCmBgYAoKTm90ZTogYHJlc291cmNlUHJlc2V0" + - "YCAoYSBCaXRuYW1pIGZlYXR1cmUpIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIE5WQ0YgY2Fzc2Fu" + - "ZHJhIHdyYXBwZXIgY2hhcnQuIFVzZSBleHBsaWNpdCBgcmVzb3VyY2VzYCBpbnN0ZWFkLgoKLS0t" + - "CgojIyBFeGFtcGxlIDI6IERlcGxveSBmcm9tIE5HQyBQcml2YXRlIFJlZ2lzdHJ5IHdpdGggUHVs" + - "bCBTZWNyZXRzCgpEZXBsb3kgdGhlIE5WQ0Ygc3RhY2sgcHVsbGluZyBpbWFnZXMgZGlyZWN0bHkg" + - "ZnJvbSBOR0MgKGBudmNyLmlvYCkgaW5zdGVhZCBvZiBhIG1pcnJvcmVkIHJlZ2lzdHJ5LCB1c2lu" + - "ZyBpbWFnZSBwdWxsIHNlY3JldHMuCgojIyMgU3RlcCAxOiBDb25maWd1cmUgZW52aXJvbm1lbnQg" + - "Zm9yIE5HQwoKYGBgeWFtbAojIGVudmlyb25tZW50cy88ZW52Pi55YW1sCmdsb2JhbDoKICBoZWxt" + - "OgogICAgc291cmNlczoKICAgICAgcmVnaXN0cnk6IG52Y3IuaW8KICAgICAgcmVwb3NpdG9yeTog" + - "bnZpZGlhL252Y2YKICBpbWFnZToKICAgIHJlZ2lzdHJ5OiBudmNyLmlvCiAgICByZXBvc2l0b3J5" + - "OiBudmlkaWEvbnZjZgpgYGAKCiMjIyBTdGVwIDI6IEF1dGhlbnRpY2F0ZSBsb2NhbGx5IChmb3Ig" + - "aGVsbWZpbGUgY2hhcnQgcHVsbHMpCgpgYGBiYXNoCmRvY2tlciBsb2dpbiBudmNyLmlvIC11ICck" + - "b2F1dGh0b2tlbicgLXAgIiROR0NfQVBJX0tFWSIKaGVsbSByZWdpc3RyeSBsb2dpbiBudmNyLmlv" + - "IC11ICckb2F1dGh0b2tlbicgLXAgIiROR0NfQVBJX0tFWSIKYGBgCgojIyMgU3RlcCAzOiBDcmVh" + - "dGUgbmFtZXNwYWNlcyBhbmQgcHVsbCBzZWNyZXRzCgpgYGBiYXNoCmV4cG9ydCBOR0NfQVBJX0tF" + + "IlRoZSBIZWxtZmlsZSBmbG93IGRlc3Ryb3llZCBhbmQgY29uZmlybWVkIGRlcmVnaXN0cmF0aW9u" + + "IG9mIGV2ZXJ5IGNvbXB1dGUgY2x1c3RlciBiZWZvcmUgZGVzdHJveWluZyB0aGUgY29udHJvbCBw" + + "bGFuZSBhbmQgcGFzc2VkIGJvdGggY29udHJvbC1wbGFuZSBrdWJlY29uZmlnIGZvcm1zLiBCZWZv" + + "cmUgZWl0aGVyIGhhbmRvZmYgY291bGQgZGVzdHJveSB0aGUgY29udHJvbCBwbGFuZSwgYm90aCB0" + + "ZWFyZG93biBmbG93cyB3YXJuZWQgdGhhdCBuYW1lc3BhY2UgcHJlc2VydmF0aW9uIGRvZXMgbm90" + + "IHByZXNlcnZlIHRoZSBIZWxtIHJlbGVhc2UsIHJlcXVpcmVkIGVmZmVjdGl2ZSBjZXJ0TWFuYWdl" + + "ci5lbmFibGVkOiBmYWxzZSBmb3IgYW4gZXh0ZXJuYWwgaW5zdGFsbGF0aW9uIGFuZCBhYm9ydGVk" + + "IGlmIHRydWUsIGFuZCB2ZXJpZmllZCBtYXRjaGluZyByZWxlYXNlIG93bmVyc2hpcCBmb3IgYW4g" + + "aW50ZW5kZWQgc3RhY2stbWFuYWdlZCByZWxlYXNlLCBhYm9ydGluZyBvbiBtaXNzaW5nIG9yIG1p" + + "c21hdGNoZWQgZXZpZGVuY2UuIFRoZXkgcHJlc2VydmVkIHRoZSBuYW1lc3BhY2UgYnkgZGVmYXVs" + + "dCBhbmQgZGlkIG5vdCBkZWxldGUgaXQgd2l0aG91dCBuYW1lc3BhY2UgcHJvdmVuYW5jZSBhbmQg" + + "ZXhwbGljaXQgY29uZmlybWF0aW9uLiBUaGUgQ0xJIGZsb3cgcmV0YWluZWQgdGhlIGdlbmVyYXRl" + + "ZCByZWdpc3RyYXRpb24gdmFsdWVzLCB1c2VkIHRoZSBmdWxsLXByZWZpeCBzdGF0dXMgY29tbWFu" + + "ZCB0byBpbnNwZWN0IGxpdmUgcmVnaXN0cmF0aW9ucywgc3RhdGVkIHRoYXQgbmFtZWQtY2x1c3Rl" + + "ciBwbGFuLW9ubHkgZG9lcyBub3QgcXVlcnkgSUNNUyBhbmQgY2Fubm90IHByZWRpY3QgY29uZGl0" + + "aW9uYWwgY29udHJvbC1wbGFuZSByZW1vdmFsLCBhbmQgZ290IGV4cGxpY2l0IGNvbmZpcm1hdGlv" + + "biB3aGVuIHRoZSB0YXJnZXQgd2FzIHRoZSBsYXN0IHJlZ2lzdGVyZWQgY2x1c3Rlci4gSXQgdGhl" + + "biBwcmV2aWV3ZWQgYW5kIHJhbiBkb3duIHdpdGggdGhlIGZ1bGwgcGVyc2lzdGVudCBwcmVmaXgs" + + "IHJlbW92aW5nIHRoZSBjb250cm9sIHBsYW5lIG9ubHkgYWZ0ZXIgdGhlIGxhc3QgcmVnaXN0cmF0" + + "aW9uIHdhcyBnb25lLiIsCiAgICAiZXhwZWN0ZWRfYmVoYXZpb3IiOiBbCiAgICAgICJUaGUgYWdl" + + "bnQgcmVhZCB0aGUgbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uIFNLSUxMLm1kIGJlZm9y" + + "ZSB0YWtpbmcgYWN0aW9uIiwKICAgICAgIkZvciBldmVyeSBjb21wdXRlIGNsdXN0ZXIsIHRoZSBI" + + "ZWxtZmlsZSBmbG93IHJhbiB0aGUgY29tcHV0ZS1wbGFuZSBNYWtlZmlsZSBkZXN0cm95IHRhcmdl" + + "dCB3aXRoIGl0cyBjb21wdXRlIGt1YmVjb25maWciLAogICAgICAiQWZ0ZXIgY29uZmlybWF0aW9u" + + "LCB0aGUgSGVsbWZpbGUgZmxvdyByYW4gY2x1c3RlciBkZWxldGUgd2l0aCBjbHVzdGVySUQgYW5k" + + "IG5jYUlEIGJlZm9yZSBjb250cm9sLXBsYW5lIGRlc3RydWN0aW9uIiwKICAgICAgIkJlZm9yZSBl" + + "aXRoZXIgaGFuZG9mZiBjb3VsZCBkZXN0cm95IHRoZSBjb250cm9sIHBsYW5lLCBib3RoIHRlYXJk" + + "b3duIGZsb3dzIHdhcm5lZCB0aGF0IG5hbWVzcGFjZSBwcmVzZXJ2YXRpb24gZG9lcyBub3QgcHJl" + + "c2VydmUgdGhlIEhlbG0gcmVsZWFzZSwgcmVxdWlyZWQgZWZmZWN0aXZlIGNlcnRNYW5hZ2VyLmVu" + + "YWJsZWQ6IGZhbHNlIGZvciBhbiBleHRlcm5hbCBpbnN0YWxsYXRpb24gYW5kIGFib3J0ZWQgaWYg" + + "dHJ1ZSwgYW5kIHZlcmlmaWVkIGludGVuZGVkIHN0YWNrIG93bmVyc2hpcCB3aGVuIGVuYWJsZWQs" + + "IGFib3J0aW5nIG9uIG1pc3Npbmcgb3IgbWlzbWF0Y2hlZCBldmlkZW5jZSIsCiAgICAgICJCb3Ro" + + "IHRlYXJkb3duIGZsb3dzIHByZXNlcnZlZCB0aGUgY2VydC1tYW5hZ2VyIG5hbWVzcGFjZSBieSBk" + + "ZWZhdWx0IGFuZCBkaWQgbm90IGRlbGV0ZSBpdCB3aXRob3V0IG5hbWVzcGFjZSBwcm92ZW5hbmNl" + + "IGFuZCBleHBsaWNpdCBjb25maXJtYXRpb24iLAogICAgICAiVGhlIEhlbG1maWxlIGZsb3cgcmFu" + + "IGNvbnRyb2wtcGxhbmUgTWFrZWZpbGUgZGVzdHJveSB3aXRoIGJvdGggS1VCRUNPTkZJRyBhbmQg" + + "S1VCRUNPTkZJR19GSUxFIiwKICAgICAgIlRoZSBDTEkgZmxvdyByZXRhaW5lZCBvdXQvPGNsdXN0" + + "ZXItbmFtZT4tcmVnaXN0ZXItdmFsdWVzLnlhbWwgdW50aWwgdGVhcmRvd24gY29tcGxldGVkIiwK" + + "ICAgICAgIkJlZm9yZSByZWFsIGRvd24sIHRoZSBDTEkgZmxvdyB1c2VkIHRoZSBmdWxsLXByZWZp" + + "eCBzdGF0dXMgY29tbWFuZCB0byBpbnNwZWN0IGxpdmUgcmVnaXN0cmF0aW9ucywgc3RhdGVkIHRo" + + "YXQgbmFtZWQtY2x1c3RlciBwbGFuLW9ubHkgZG9lcyBub3QgcXVlcnkgSUNNUyBhbmQgY2Fubm90" + + "IHByZWRpY3QgY29uZGl0aW9uYWwgY29udHJvbC1wbGFuZSByZW1vdmFsLCB3YXJuZWQgd2hlbiB0" + + "aGUgdGFyZ2V0IHdhcyB0aGUgbGFzdCByZWdpc3RlcmVkIGNsdXN0ZXIsIGFuZCBnb3QgZXhwbGlj" + + "aXQgY29uZmlybWF0aW9uIiwKICAgICAgIlRoZSBDTEkgZmxvdyB1c2VkIC0tY29uZmlnLCBib3Ro" + + "IHN0YWNrIHBhdGhzLCAtLWVudiwgLS1wbGFpbiwgYm90aCBjb250ZXh0cywgYW5kIC0taWNtcy11" + + "cmwgZm9yIGRvd24gLS1wbGFuLW9ubHkgYW5kIHRoZW4gZG93biIsCiAgICAgICJUaGUgYWdlbnQg" + + "c3RhdGVkIHRoYXQgZG93biB1bnJlZ2lzdGVycyBlYWNoIGNvbXB1dGUgY2x1c3RlciBhbmQgcmVt" + + "b3ZlcyB0aGUgY29udHJvbCBwbGFuZSBvbmx5IGFmdGVyIG5vIHJlZ2lzdHJhdGlvbnMgcmVtYWlu" + + "IgogICAgXQogIH0sCiAgewogICAgImlkIjogIlMxMy12YWx1ZXMtcHJlY2VkZW5jZSIsCiAgICAi" + + "cXVlc3Rpb24iOiAiSSBhZGRlZCBhIHZhbHVlIHRvIG15IGVudmlyb25tZW50IFlBTUwgYnV0IGl0" + + "J3MgYmVpbmcgc2lsZW50bHkgaWdub3JlZC4gSG93IGRvIGhlbG1maWxlIHZhbHVlcyB3b3JrIGlu" + + "IE5WQ0Y/IiwKICAgICJleHBlY3RlZF9za2lsbCI6ICJudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxs" + + "YXRpb24iLAogICAgImdyb3VuZF90cnV0aCI6ICJUaGUgYWdlbnQgZXhwbGFpbmVkIHRoZSB2YWx1" + + "ZXMgcHJlY2VkZW5jZSBjaGFpbiAoYmFzZS55YW1sLCBlbnYgWUFNTCwgZ2xvYmFsLnlhbWwuZ290" + + "bXBsLCBzZWNyZXRzLCBpbmxpbmUgdmFsdWVzKSwgaWRlbnRpZmllZCB0aGF0IGdsb2JhbC55YW1s" + + "LmdvdG1wbCBvbmx5IHBhc3NlcyB0aHJvdWdoIHNwZWNpZmljIGtleXMsIGFuZCBleHBsYWluZWQg" + + "dGhhdCBhcmJpdHJhcnkgY2hhcnQgdmFsdWVzIG11c3QgdXNlIHJlbGVhc2UgaW5saW5lIHZhbHVl" + + "cyBibG9ja3MuIiwKICAgICJleHBlY3RlZF9iZWhhdmlvciI6IFsKICAgICAgIlRoZSBhZ2VudCBy" + + "ZWFkIHRoZSBudmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24gU0tJTEwubWQgYmVmb3JlIHRh" + + "a2luZyBhY3Rpb24iLAogICAgICAiVGhlIGFnZW50IGV4cGxhaW5lZCB0aGUgdmFsdWVzIHByZWNl" + + "ZGVuY2UgY2hhaW46IGJhc2UueWFtbCAtPiBlbnYgWUFNTCAtPiBnbG9iYWwueWFtbC5nb3RtcGwg" + + "LT4gc2VjcmV0cyAtPiBpbmxpbmUgdmFsdWVzIiwKICAgICAgIlRoZSBhZ2VudCBpZGVudGlmaWVk" + + "IHRoYXQgZ2xvYmFsLnlhbWwuZ290bXBsIG9ubHkgcGFzc2VzIHRocm91Z2ggc3BlY2lmaWMga2V5" + + "cyAoY2Fzc2FuZHJhLnJlcGxpY2FDb3VudCwgZ2xvYmFsLnN0b3JhZ2VDbGFzcywgZ2xvYmFsLmlt" + + "YWdlLCBldGMuKSIsCiAgICAgICJUaGUgYWdlbnQgZXhwbGFpbmVkIHRoYXQgYXJiaXRyYXJ5IGNo" + + "YXJ0IHZhbHVlcyBtdXN0IGJlIHNldCB2aWEgcmVsZWFzZSBpbmxpbmUgdmFsdWVzOiBibG9ja3Mi" + + "LAogICAgICAiVGhlIGFnZW50IGxpc3RlZCBleGFtcGxlcyBvZiB2YWx1ZXMgdGhhdCBhcmUgcHJv" + + "cGFnYXRlZCBhbmQgYXJiaXRyYXJ5IGNoYXJ0IHZhbHVlcyB0aGF0IHJlcXVpcmUgYSByZWxlYXNl" + + "IHZhbHVlcyBibG9jayIKICAgIF0KICB9LAogIHsKICAgICJpZCI6ICJTMTQtZW5hYmxlLWxsbS1m" + + "dW5jdGlvbnMiLAogICAgInF1ZXN0aW9uIjogIkkgbmVlZCB0byBkZXBsb3kgZnVuY3Rpb25UeXBl" + + "OiBMTE0gZnVuY3Rpb25zIG9uIGEgc2VsZi1tYW5hZ2VkLCBzaW5nbGUtbm9kZSBpc29sYXRlZCB0" + + "ZXN0IGNsdXN0ZXIuIFdoYXQgSGVsbWZpbGUgY29uZmlndXJhdGlvbiBhbmQgdmVyaWZpY2F0aW9u" + + "IHN0ZXBzIGRvIEkgbmVlZD8iLAogICAgImV4cGVjdGVkX3NraWxsIjogIm52Y2Ytc2VsZi1tYW5h" + + "Z2VkLWluc3RhbGxhdGlvbiIsCiAgICAiZ3JvdW5kX3RydXRoIjogIlRoZSBhZ2VudCBlbmFibGVk" + + "IHRoZSBMTE0gYWRkb24gd2l0aCBhZGRvbnMubGxtLmVuYWJsZWQsIGNvbmZpZ3VyZWQgc2luZ2xl" + + "IHJlcGxpY2FzIGZvciB0aGUgTExNIEFQSSBHYXRld2F5IGFuZCByZXF1ZXN0IHJvdXRlciwgYW5k" + + "IGV4cGxhaW5lZCB0aGF0IHRoZSByZXF1ZXN0IHJvdXRlciB1c2VzIHBvd2VyLW9mLXR3byB3aGVu" + + "IG5vIGxvYWQtYmFsYW5jZXIgY29uZmlndXJhdGlvbiBpcyBzZXQuIEl0IGxpbmtlZCB0aGUgY2Fu" + + "b25pY2FsIHJlcXVlc3Qtcm91dGVyIGxvYWQtYmFsYW5jaW5nIGd1aWRlIGZvciBvdGhlciByb3V0" + + "aW5nIG1ldGhvZHMuIEZvciB0aGUgaXNvbGF0ZWQgcGxhaW50ZXh0IGNsdXN0ZXIsIGl0IHJlbGll" + + "ZCBvbiB0aGUgc2VsZi1tYW5hZ2VkIHN0YWNrIGRlZmF1bHQgZm9yIHRoZSBidW5kbGVkIGdhdGV3" + + "YXktdG8tQVBJIGF1dGhlbnRpY2F0aW9uIGhvcCBhbmQgaW5jbHVkZWQgYWdlbnRDb25maWcubWVy" + + "Z2VDb25maWcud29ya2xvYWQuc3RhcmdhdGVRVUlDSW5zZWN1cmUgZm9yIHRoZSBzZXBhcmF0ZSB3" + + "b3JrZXIgdHJhbnNwb3J0LCB3aXRoIGEgd2FybmluZyB0aGF0IHBsYWludGV4dCB3b3JrZXIgdHJh" + + "bnNwb3J0IGlzIG5vdCBmb3IgcHJvZHVjdGlvbi4gSXQgcmVmcmVzaGVkIHRoZSBjb21wdXRlIHBs" + + "YW5lIHVzaW5nIHRoZSBzYW1lIGhhbmRvZmYgdXNlZCBkdXJpbmcgaW5zdGFsbGF0aW9uLCByZWRl" + + "cGxveWVkIGV4aXN0aW5nIExMTSBmdW5jdGlvbnMsIGFuZCB2ZXJpZmllZCB0aGUgTExNIGRlcGxv" + + "eW1lbnRzLCByb3V0ZSwgYW5kIGxsbS13b3JrZXIgc2lkZWNhci4iLAogICAgImV4cGVjdGVkX2Jl" + + "aGF2aW9yIjogWwogICAgICAiVGhlIGFnZW50IHVzZWQgYWRkb25zLmxsbS5lbmFibGVkLCBub3Qg" + + "dGhlIG9ic29sZXRlIGxsbS5lbmFibGVkIHBhdGgiLAogICAgICAiVGhlIGFnZW50IHNldCBnYXRl" + + "d2F5IGFuZCByZXF1ZXN0Um91dGVyIHJlcGxpY2FDb3VudCB0byAxIGZvciB0aGUgc2luZ2xlLW5v" + + "ZGUgdGVzdCBjbHVzdGVyIiwKICAgICAgIlRoZSBhZ2VudCBzdGF0ZWQgdGhhdCB0aGUgcmVxdWVz" + + "dCByb3V0ZXIgZGVmYXVsdHMgdG8gcG93ZXItb2YtdHdvIGFuZCBsaW5rZWQgdGhlIGNhbm9uaWNh" + + "bCByZXF1ZXN0LXJvdXRlciBsb2FkLWJhbGFuY2luZyBndWlkZSBmb3Igb3RoZXIgbWV0aG9kcyIs" + + "CiAgICAgICJUaGUgYWdlbnQgZXhwbGFpbmVkIHRoYXQgdGhlIGJ1bmRsZWQgZ2F0ZXdheS10by1B" + + "UEkgYXV0aGVudGljYXRpb24gaG9wIGRlZmF1bHRzIHRvIHBsYWludGV4dCwgaW5jbHVkZWQgd29y" + + "a2xvYWQuc3RhcmdhdGVRVUlDSW5zZWN1cmUgb25seSBmb3IgdGhlIGlzb2xhdGVkIHdvcmtlciB0" + + "cmFuc3BvcnQsIGFuZCB3YXJuZWQgYWdhaW5zdCBwbGFpbnRleHQgd29ya2VyIHRyYW5zcG9ydCBp" + + "biBwcm9kdWN0aW9uIiwKICAgICAgIlRoZSBhZ2VudCBhcHBsaWVkIHRoZSBjb250cm9sLXBsYW5l" + + "IEhlbG1maWxlIGVudmlyb25tZW50LCByZWZyZXNoZWQgdGhlIGNvbXB1dGUgcGxhbmUgd2l0aCB0" + + "aGUgc2FtZSBzZWxlY3RlZCBoYW5kb2ZmLCBhbmQgcmVjcmVhdGVkIG9yIHJlZGVwbG95ZWQgZXhp" + + "c3RpbmcgTExNIGZ1bmN0aW9ucyIsCiAgICAgICJUaGUgYWdlbnQgdmVyaWZpZWQgbGxtLWFwaS1n" + + "YXRld2F5LCBsbG0tcmVxdWVzdC1yb3V0ZXIsIHRoZSBMTE0gSFRUUFJvdXRlLCBhbmQgdGhlIGxs" + + "bS13b3JrZXIgc2lkZWNhciBpbmNsdWRpbmcgLS1xdWljLWluc2VjdXJlIgogICAgXQogIH0sCiAg" + + "ewogICAgImlkIjogIkc4LU5FRy1ub3QtZm9yLWszZCIsCiAgICAicXVlc3Rpb24iOiAiU2V0IHVw" + + "IGEgbG9jYWwgTlZDRiBkZXYgY2x1c3RlciB1c2luZyBrM2QgZm9yIHRlc3RpbmciLAogICAgImV4" + + "cGVjdGVkX3NraWxsIjogbnVsbCwKICAgICJzaG91bGRfdHJpZ2dlciI6IGZhbHNlLAogICAgImdy" + + "b3VuZF90cnV0aCI6ICJUaGlzIGlzIGEgbG9jYWwgazNkIGRldmVsb3BtZW50IHJlcXVlc3QgdGhh" + + "dCBiZWxvbmdzIHRvIHRoZSBudmNmLXNlbGYtaG9zdGVkLWxvY2FsLWRldiBza2lsbCwgbm90IG52" + + "Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbi4gVGhlIGFnZW50IGRpZCBub3QgcmVhZCBvciB1" + + "c2UgdGhlIHNlbGYtbWFuYWdlZCBpbnN0YWxsYXRpb24gc2tpbGwgYW5kIGluc3RlYWQgcHJvdmlk" + + "ZWQgazNkLXNwZWNpZmljIGd1aWRhbmNlLiIsCiAgICAiZXhwZWN0ZWRfYmVoYXZpb3IiOiBbCiAg" + + "ICAgICJUaGUgYWdlbnQgZGlkIG5vdCByZWFkIG52Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlv" + + "bi9TS0lMTC5tZCIsCiAgICAgICJUaGUgYWdlbnQgZGlkIG5vdCBwcm92aWRlIGhlbG1maWxlLWJh" + + "c2VkIHByb2R1Y3Rpb24gZGVwbG95bWVudCBpbnN0cnVjdGlvbnMiLAogICAgICAiVGhlIGFnZW50" + + "IHByb3ZpZGVkIGszZC1zcGVjaWZpYyBsb2NhbCBkZXZlbG9wbWVudCBndWlkYW5jZSBvciBkZWZl" + + "cnJlZCB0byB0aGUgYXBwcm9wcmlhdGUgbG9jYWwtZGV2IHNraWxsIgogICAgXQogIH0KXQpQSwcI" + + "R1VqVkpWAABKVgAAUEsDBBQACAAAAAAAIQAAAAAAAAAAAAAAAAAvAAkAZGF0YS9udmNmLXNlbGYt" + + "bWFuYWdlZC1pbnN0YWxsYXRpb24vZXhhbXBsZXMubWRVVAUAAQCmzhIjIEV4YW1wbGVzCgpXb3Jr" + + "ZWQgZXhhbXBsZXMgYmFzZWQgb24gcmVhbCBkZXBsb3ltZW50IHNjZW5hcmlvcy4KCiMjIEV4YW1w" + + "bGUgMTogT3ZlcnJpZGUgQ2Fzc2FuZHJhIFJlc291cmNlcwoKVGhlIGRlZmF1bHQgQ2Fzc2FuZHJh" + + "IHJlc291cmNlIGxpbWl0cyBjYXVzZSBPT00gb24gbGFyZ2UgaW5zdGFuY2UgdHlwZXMgKGUuZy4s" + + "IGBwNS40OHhsYXJnZWApLgoKUHJvYmxlbTogQ2Fzc2FuZHJhIHBvZHMgcmVzdGFydCB3aXRoIGBP" + + "T01LaWxsZWRgLgoKU29sdXRpb246IE92ZXJyaWRlIHJlc291cmNlcyB2aWEgaGVsbWZpbGUgcmVs" + + "ZWFzZSB2YWx1ZXMgYmxvY2suCgojIyMgU3RlcCAxOiBDYXB0dXJlIGJhc2VsaW5lCgpgYGBiYXNo" + + "CkhFTE1GSUxFX0VOVj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9Y2Fzc2FuZHJhIHRl" + + "bXBsYXRlID4gL3RtcC9jYXNzLWJlZm9yZS55YW1sCmdyZXAgLUE4ICdyZXNvdXJjZXM6JyAvdG1w" + + "L2Nhc3MtYmVmb3JlLnlhbWwgfCBoZWFkIC0xMApgYGAKCiMjIyBTdGVwIDI6IEFkZCBvdmVycmlk" + + "ZSB0byBoZWxtZmlsZS5kLzAxLWRlcGVuZGVuY2llcy55YW1sLmdvdG1wbAoKSW4gdGhlIGV4YW1w" + + "bGVzIGJlbG93LCBgPHByaXZhdGUtdmFsdWVzPmAgcmVmZXJzIHRvIHRoZSBgc2VjcmV0cy9gIGRp" + + "cmVjdG9yeSBhdCB0aGUgaGVsbWZpbGUgc3RhY2sgcm9vdC4KCmBgYHlhbWwKLSBuYW1lOiBjYXNz" + + "YW5kcmEKICB2ZXJzaW9uOiAwLjguMAogIGNvbmRpdGlvbjogY2Fzc2FuZHJhLmVuYWJsZWQKICBu" + + "YW1lc3BhY2U6IGNhc3NhbmRyYS1zeXN0ZW0KICA8PDogKmRlcGVuZGVuY3kKICB2YWx1ZXM6CiAg" + + "ICAtIC4uL2dsb2JhbC55YW1sLmdvdG1wbAogICAgLSAuLi88cHJpdmF0ZS12YWx1ZXM+L3t7IHJl" + + "cXVpcmVkRW52ICJIRUxNRklMRV9FTlYiIH19LXNlY3JldHMueWFtbAogICAgLSBjYXNzYW5kcmE6" + + "CiAgICAgICAgcmVzb3VyY2VzOgogICAgICAgICAgbGltaXRzOgogICAgICAgICAgICBjcHU6ICI4" + + "IgogICAgICAgICAgICBtZW1vcnk6IDgxOTJNaQogICAgICAgICAgcmVxdWVzdHM6CiAgICAgICAg" + + "ICAgIGNwdTogIjIiCiAgICAgICAgICAgIG1lbW9yeTogNDA5Nk1pCmBgYAoKIyMjIFN0ZXAgMzog" + + "VmVyaWZ5IGFuZCBhcHBseQoKYGBgYmFzaApIRUxNRklMRV9FTlY9PGVudj4gaGVsbWZpbGUgLS1z" + + "ZWxlY3RvciBuYW1lPWNhc3NhbmRyYSB0ZW1wbGF0ZSA+IC90bXAvY2Fzcy1hZnRlci55YW1sCmRp" + + "ZmYgL3RtcC9jYXNzLWJlZm9yZS55YW1sIC90bXAvY2Fzcy1hZnRlci55YW1sICAjIENvbmZpcm0g" + + "cmVzb3VyY2VzIGNoYW5nZWQKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0b3Ig" + + "bmFtZT1jYXNzYW5kcmEgc3luYwpgYGAKCk5vdGU6IGByZXNvdXJjZVByZXNldGAgKGEgQml0bmFt" + + "aSBmZWF0dXJlKSBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBOVkNGIGNhc3NhbmRyYSB3cmFwcGVy" + + "IGNoYXJ0LiBVc2UgZXhwbGljaXQgYHJlc291cmNlc2AgaW5zdGVhZC4KCi0tLQoKIyMgRXhhbXBs" + + "ZSAyOiBEZXBsb3kgZnJvbSBOR0MgUHJpdmF0ZSBSZWdpc3RyeSB3aXRoIFB1bGwgU2VjcmV0cwoK" + + "RGVwbG95IHRoZSBOVkNGIHN0YWNrIHB1bGxpbmcgaW1hZ2VzIGRpcmVjdGx5IGZyb20gTkdDIChg" + + "bnZjci5pb2ApIGluc3RlYWQgb2YgYSBtaXJyb3JlZCByZWdpc3RyeSwgdXNpbmcgaW1hZ2UgcHVs" + + "bCBzZWNyZXRzLgoKIyMjIFN0ZXAgMTogQ29uZmlndXJlIGVudmlyb25tZW50IGZvciBOR0MKCmBg" + + "YHlhbWwKIyBlbnZpcm9ubWVudHMvPGVudj4ueWFtbApnbG9iYWw6CiAgaGVsbToKICAgIHNvdXJj" + + "ZXM6CiAgICAgIHJlZ2lzdHJ5OiBudmNyLmlvCiAgICAgIHJlcG9zaXRvcnk6IG52aWRpYS9udmNm" + + "CiAgaW1hZ2U6CiAgICByZWdpc3RyeTogbnZjci5pbwogICAgcmVwb3NpdG9yeTogbnZpZGlhL252" + + "Y2YKYGBgCgojIyMgU3RlcCAyOiBBdXRoZW50aWNhdGUgbG9jYWxseSAoZm9yIGhlbG1maWxlIGNo" + + "YXJ0IHB1bGxzKQoKYGBgYmFzaApkb2NrZXIgbG9naW4gbnZjci5pbyAtdSAnJG9hdXRodG9rZW4n" + + "IC1wICIkTkdDX0FQSV9LRVkiCmhlbG0gcmVnaXN0cnkgbG9naW4gbnZjci5pbyAtdSAnJG9hdXRo" + + "dG9rZW4nIC1wICIkTkdDX0FQSV9LRVkiCmBgYAoKIyMjIFN0ZXAgMzogQ3JlYXRlIG5hbWVzcGFj" + + "ZXMgYW5kIHB1bGwgc2VjcmV0cwoKYGBgYmFzaApleHBvcnQgTkdDX0FQSV9LRVk9Ijx5b3VyLW5n" + + "Yy1hcGkta2V5PiIKCmZvciBucyBpbiBjYXNzYW5kcmEtc3lzdGVtIG5hdHMtc3lzdGVtIG52Y2Yg" + + "YXBpLWtleXMgZXNzIHNpcyB2YXVsdC1zeXN0ZW0gY2VydC1tYW5hZ2VyOyBkbwogIGt1YmVjdGwg" + + "LS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRleHQ+IGNyZWF0ZSBuYW1lc3BhY2UgIiRucyIg" + + "XAogICAgLS1kcnktcnVuPWNsaWVudCAtbyB5YW1sIHwga3ViZWN0bCAtLWNvbnRleHQgPGNvbnRy" + + "b2wtcGxhbmUtY29udGV4dD4gYXBwbHkgLWYgLQpkb25lCgpmb3IgbnMgaW4gY2Fzc2FuZHJhLXN5" + + "c3RlbSBuYXRzLXN5c3RlbSBudmNmIGFwaS1rZXlzIGVzcyBzaXMgdmF1bHQtc3lzdGVtIGNlcnQt" + + "bWFuYWdlcjsgZG8KICBrdWJlY3RsIC0tY29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBj" + + "cmVhdGUgc2VjcmV0IGRvY2tlci1yZWdpc3RyeSBudmNyLWNyZWRzIFwKICAgIC0tZG9ja2VyLXNl" + + "cnZlcj1udmNyLmlvIFwKICAgIC0tZG9ja2VyLXVzZXJuYW1lPSckb2F1dGh0b2tlbicgXAogICAg" + + "LS1kb2NrZXItcGFzc3dvcmQ9IiROR0NfQVBJX0tFWSIgXAogICAgLS1uYW1lc3BhY2U9IiRucyIg" + + "XAogICAgLS1kcnktcnVuPWNsaWVudCAtbyB5YW1sIHwga3ViZWN0bCAtLWNvbnRleHQgPGNvbnRy" + + "b2wtcGxhbmUtY29udGV4dD4gYXBwbHkgLWYgLQpkb25lCmBgYAoKIyMjIFN0ZXAgNDogQWRkIGlt" + + "YWdlUHVsbFNlY3JldHMgdG8gaGVsbWZpbGUgcmVsZWFzZXMKCkFkZCB0aGUgY2hhcnQtc3BlY2lm" + + "aWMgYGltYWdlUHVsbFNlY3JldHNgIGtleSB0byBlYWNoIHJlbGVhc2UuIEV4YW1wbGUgZm9yIGNh" + + "c3NhbmRyYSBpbiBgaGVsbWZpbGUuZC8wMS1kZXBlbmRlbmNpZXMueWFtbC5nb3RtcGxgOgoKYGBg" + + "eWFtbAotIG5hbWU6IGNhc3NhbmRyYQogIHZlcnNpb246IDAuOC4wCiAgY29uZGl0aW9uOiBjYXNz" + + "YW5kcmEuZW5hYmxlZAogIG5hbWVzcGFjZTogY2Fzc2FuZHJhLXN5c3RlbQogIDw8OiAqZGVwZW5k" + + "ZW5jeQogIHZhbHVlczoKICAgIC0gLi4vZ2xvYmFsLnlhbWwuZ290bXBsCiAgICAtIC4uLzxwcml2" + + "YXRlLXZhbHVlcz4ve3sgcmVxdWlyZWRFbnYgIkhFTE1GSUxFX0VOViIgfX0tc2VjcmV0cy55YW1s" + + "CiAgICAtIGNhc3NhbmRyYToKICAgICAgICBnbG9iYWw6CiAgICAgICAgICBpbWFnZVB1bGxTZWNy" + + "ZXRzOgogICAgICAgICAgICAtIG52Y3ItY3JlZHMKYGBgCgpTZWUgW3JlZmVyZW5jZXMvcHVsbC1z" + + "ZWNyZXRzLm1kXShyZWZlcmVuY2VzL3B1bGwtc2VjcmV0cy5tZCkgZm9yIHRoZSBrZXkgZm9yIGV2" + + "ZXJ5IGNoYXJ0LgoKVGhlc2UgYXJlIGNvbnRyb2wtcGxhbmUgbmFtZXNwYWNlcy4gRm9yIGEgc2Vw" + + "YXJhdGUgY29tcHV0ZSBjbHVzdGVyLCBjcmVhdGUgdGhlCnNlY3JldCBvbmx5IGluIGBudmNhLW9w" + + "ZXJhdG9yYDsgdGhlIGNoYXJ0IGFuZCBvcGVyYXRvciBtaXJyb3IgaXQgdG8KYG52Y2Etc3lzdGVt" + + "YC4gU2VlIFtTcGxpdCBDb21wdXRlLVBsYW5lIEluc3RhbGxhdGlvbl0ocmVmZXJlbmNlcy9jb21w" + + "dXRlLXBsYW5lLWluc3RhbGxhdGlvbi5tZCNwdWxsLXNlY3JldHMpLgoKIyMjIFN0ZXAgNTogRGVw" + + "bG95CgpgYGBiYXNoCkhFTE1GSUxFX0VOVj08ZW52PiBoZWxtZmlsZSAtLWt1YmUtY29udGV4dCA8" + + "Y29udHJvbC1wbGFuZS1jb250ZXh0PiBzeW5jCmBgYAoKIyMjIFN0ZXAgNjogUGF0Y2ggU2Vydmlj" + + "ZUFjY291bnRzIGZvciBjaGFydHMgd2l0aG91dCBuYXRpdmUgc3VwcG9ydAoKQWZ0ZXIgUGhhc2Ug" + + "MSAoZGVwZW5kZW5jaWVzKSBjb21wbGV0ZXMsIE9wZW5CYW8gcG9kcyB3aWxsIGJlIGluIGBJbWFn" + + "ZVB1bGxCYWNrT2ZmYC4gUGF0Y2ggYW5kIHJlc3RhcnQ6CgpgYGBiYXNoCmZvciBucyBpbiB2YXVs" + + "dC1zeXN0ZW0gbnZjZiBlc3M7IGRvCiAgZm9yIHNhIGluICQoa3ViZWN0bCAtLWNvbnRleHQgPGNv" + + "bnRyb2wtcGxhbmUtY29udGV4dD4gZ2V0IHNhIC1uICIkbnMiIFwKICAgIC0tbm8taGVhZGVycyAt" + + "byBjdXN0b20tY29sdW1ucz0iOm1ldGFkYXRhLm5hbWUiKTsgZG8KICAgIGt1YmVjdGwgLS1jb250" + + "ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRleHQ+IHBhdGNoIHNlcnZpY2VhY2NvdW50IC1uICIkbnMi" + + "ICIkc2EiIFwKICAgICAgLXAgJ3siaW1hZ2VQdWxsU2VjcmV0cyI6IFt7Im5hbWUiOiAibnZjci1j" + + "cmVkcyJ9XX0nCiAgZG9uZQpkb25lCmt1YmVjdGwgLS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNv" + + "bnRleHQ+IGRlbGV0ZSBwb2RzIC1uIHZhdWx0LXN5c3RlbSAtLWFsbApgYGAKClZlcmlmeToKCmBg" + + "YGJhc2gKa3ViZWN0bCAtLWNvbnRleHQgPGNvbnRyb2wtcGxhbmUtY29udGV4dD4gZ2V0IGV2ZW50" + + "cyAtbiB2YXVsdC1zeXN0ZW0gXAogIC0tc29ydC1ieT0nLmxhc3RUaW1lc3RhbXAnIHwgZ3JlcCAt" + + "aSBwdWxsCiMgU2hvdWxkIHNob3cgIlN1Y2Nlc3NmdWxseSBwdWxsZWQgaW1hZ2UiIGZyb20gbnZj" + + "ci5pbwpgYGAKCi0tLQoKIyMgRXhhbXBsZSAzOiBGdWxsIFRlYXJkb3duIGFuZCBSZWluc3RhbGwK" + + "CldoZW4gYSBkZXBsb3ltZW50IGlzIGJyb2tlbiBhbmQgeW91IG5lZWQgYSBjbGVhbiBzbGF0ZS4K" + + "CiMjIyBTdGVwIDE6IERlc3Ryb3kgdGhlIGNvbXB1dGUtcGxhbmUgc3RhY2sKCmBgYGJhc2gKbWFr" + + "ZSAtQyBkZXBsb3kvc3RhY2tzL252Y2YtY29tcHV0ZS1wbGFuZSBkZXN0cm95IFwKICBDTFVTVEVS" + + "X05BTUU9PGNsdXN0ZXItbmFtZT4gXAogIEhFTE1GSUxFX0VOVj08ZW52PiBcCiAgS1VCRUNPTkZJ" + + "R19GSUxFPTxjb21wdXRlLXBsYW5lLWt1YmVjb25maWc+CmBgYAoKSWYgY29tcHV0ZSBjbGVhbnVw" + + "IGlzIHN0dWNrIG9uIGZpbmFsaXplcnMsIHVzZSB0aGUgY29tcHV0ZS1jb250ZXh0IHByb2NlZHVy" + + "ZSBpbgpbZGVidWdnaW5nLm1kXShyZWZlcmVuY2VzL2RlYnVnZ2luZy5tZCNmYWlsdXJlLW52Y2Et" + + "Y2xlYW51cC1zdHVjay1maW5hbGl6ZXJzKS4KCiMjIyBTdGVwIDI6IERlcmVnaXN0ZXIgdGhlIGNv" + + "bXB1dGUgY2x1c3RlcgoKUmVhZCBgY2x1c3RlcklEYCBhbmQgYG5jYUlEYCBmcm9tCmBkZXBsb3kv" + + "c3RhY2tzL252Y2YtY29tcHV0ZS1wbGFuZS9yZWdpc3RyYXRpb24vPGNsdXN0ZXItbmFtZT4tcmVn" + + "aXN0ZXItdmFsdWVzLnlhbWxgLgpTaG93IHRoZSBJRCBhbmQgZ2V0IGNvbmZpcm1hdGlvbiBiZWZv" + + "cmUgZGVsZXRpbmcgdGhlIElDTVMgcm93OgoKYGBgYmFzaAo8bnZjZi1jbGk+IC0tY29uZmlnIDxj" + + "b25maWc+IGNsdXN0ZXIgZGVsZXRlIFwKICAtLWNsdXN0ZXItaWQgPGNsdXN0ZXItaWQtZnJvbS1y" + + "ZWdpc3RyYXRpb24tdmFsdWVzPiBcCiAgLS1uY2EtaWQgPG5jYS1pZD4gXAogIC0taWdub3JlLW1p" + + "c3NpbmcKYGBgCgpSZXBlYXQgc3RlcHMgMSBhbmQgMiBmb3IgZXZlcnkgY29tcHV0ZSBjbHVzdGVy" + + "LgoKIyMjIFN0ZXAgMzogRGVzdHJveSB0aGUgY29udHJvbC1wbGFuZSBzdGFjawoKUHJlc2VydmUg" + + "dGhlIGBjZXJ0LW1hbmFnZXJgIG5hbWVzcGFjZSBieSBkZWZhdWx0LiBOYW1lc3BhY2UgcHJlc2Vy" + + "dmF0aW9uIGRvZXMKbm90IHByZXNlcnZlIHRoZSBIZWxtIHJlbGVhc2UuIEJlZm9yZSBydW5uaW5n" + + "IGRlc3Ryb3ksIGlkZW50aWZ5IHdoZXRoZXIKY2VydC1tYW5hZ2VyIGlzIGV4dGVybmFsLiBGb3Ig" + + "YW4gZXh0ZXJuYWwgaW5zdGFsbGF0aW9uLCByZXF1aXJlIGVmZmVjdGl2ZQpgY2VydE1hbmFnZXIu" + + "ZW5hYmxlZDogZmFsc2VgIGFuZCBhYm9ydCBpZiBpdCBpcyB0cnVlLiBGb3IgYW4gaW50ZW5kZWQK" + + "c3RhY2stbWFuYWdlZCByZWxlYXNlIHdpdGggZWZmZWN0aXZlIGBjZXJ0TWFuYWdlci5lbmFibGVk" + + "OiB0cnVlYCwgdmVyaWZ5Cm1hdGNoaW5nIHN0YWNrIEhlbG0gcmVsZWFzZSBtZXRhZGF0YSBhbmQg" + + "YWJvcnQgb24gbWlzc2luZyBvciBtaXNtYXRjaGVkCmV2aWRlbmNlLiBPbmx5IHBsYW4gbmFtZXNw" + + "YWNlIHJlbW92YWwgYWZ0ZXIgdmVyaWZ5aW5nIG5hbWVzcGFjZSBwcm92ZW5hbmNlIGFuZApnZXR0" + + "aW5nIGV4cGxpY2l0IGNvbmZpcm1hdGlvbjsgb3RoZXJ3aXNlIGRvIG5vdCBkZWxldGUgaXQuCgpg" + + "YGBiYXNoCktVQkVDT05GSUc9PGNvbnRyb2wtcGxhbmUta3ViZWNvbmZpZz4gXAptYWtlIC1DIGRl" + + "cGxveS9zdGFja3Mvc2VsZi1tYW5hZ2VkIGRlc3Ryb3kgXAogIEhFTE1GSUxFX0VOVj08ZW52PiBc" + + "CiAgS1VCRUNPTkZJR19GSUxFPTxjb250cm9sLXBsYW5lLWt1YmVjb25maWc+CmBgYAoKUGFzcyBi" + + "b3RoIGt1YmVjb25maWcgZm9ybXMgYmVjYXVzZSBjb250cm9sLXBsYW5lIG5hbWVzcGFjZSBjbGVh" + + "bnVwIHVzZXMKYW1iaWVudCBga3ViZWN0bGAuCgojIyMgU3RlcCA0OiBWZXJpZnkgY2xlYW4KCmBg" + + "YGJhc2gKa3ViZWN0bCAtLWNvbnRleHQgPGNvbXB1dGUtcGxhbmUtY29udGV4dD4gZ2V0IG5zIHwg" + + "XAogIGdyZXAgLUUgJyhudmNhfG52Y2YtYmFja2VuZHxncm92ZXxkeW5hbW8pJwprdWJlY3RsIC0t" + + "Y29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBnZXQgbnMgfCBcCiAgZ3JlcCAtRSAnKGNh" + + "c3NhbmRyYXxuYXRzfHZhdWx0fG52Y2Z8YXBpLWtleXN8ZXNzfHNpcyknCiMgQm90aCBjb21tYW5k" + + "cyBzaG91bGQgcmV0dXJuIGVtcHR5LgpgYGAKCiMjIyBTdGVwIDU6IFJlaW5zdGFsbCBpbiBzcGxp" + + "dCBvcmRlcgoKRm9sbG93IFtDbGVhbiBJbnN0YWxsYXRpb25dKFNLSUxMLm1kI2NsZWFuLWluc3Rh" + + "bGxhdGlvbiksIHRoZW4gcmV0dXJuIHRvIHRoZQpzYW1lIGhhbmRvZmYgaW4gW1NwbGl0IENvbXB1" + + "dGUtUGxhbmUgSW5zdGFsbGF0aW9uXShyZWZlcmVuY2VzL2NvbXB1dGUtcGxhbmUtaW5zdGFsbGF0" + + "aW9uLm1kKS4KCi0tLQoKIyMgRXhhbXBsZSA0OiBSZWNvdmVyIGZyb20gYSBHYXRld2F5IEVuZHBv" + + "aW50IENoYW5nZQoKVGhlIHNlcGFyYXRlbHkgcHJvdmlzaW9uZWQgR2F0ZXdheSBvciBpdHMgbG9h" + + "ZCBiYWxhbmNlciB3YXMgcmVjcmVhdGVkIGFuZCBnb3QgYSBuZXcgZW5kcG9pbnQuCgojIyMgU3Rl" + + "cCAxOiBHZXQgdGhlIG5ldyBlbmRwb2ludAoKYGBgYmFzaApHQVRFV0FZX0FERFI9JChrdWJlY3Rs" + + "IC0tY29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBnZXQgZ2F0ZXdheSBcCiAgbnZjZi1n" + + "YXRld2F5IC1uIGVudm95LWdhdGV3YXkgXAogIC1vIGpzb25wYXRoPSd7LnN0YXR1cy5hZGRyZXNz" + + "ZXNbMF0udmFsdWV9JykKdGVzdCAtbiAiJEdBVEVXQVlfQUREUiIKYGBgCgojIyMgU3RlcCAyOiBV" + + "cGRhdGUgRE5TIGFuZCBkaXJlY3QgYWRkcmVzcyBmaWVsZHMKCktlZXAgYGdsb2JhbC5kb21haW5g" + + "LCByb3V0ZSBob3N0bmFtZXMsIGFuZCBDTEkgSG9zdCBmaWVsZHMgdW5jaGFuZ2VkLiBQb2ludCB0" + + "aGUKRE5TIHJlY29yZHMgZm9yIHJlbmRlcmVkIHJvdXRlIGhvc3RuYW1lcywgc3VjaCBhcyBgYXBp" + + "Ljxkb21haW4+YCBhbmQKYCouaW52b2NhdGlvbi48ZG9tYWluPmAsIHRvIGBHQVRFV0FZX0FERFJg" + + "LiBGb3IgYSB0ZW1wb3JhcnkgZW52aXJvbm1lbnQgd2l0aG91dApETlMsIGtlZXAgaXRzIHJlc2Vy" + + "dmVkIHJvdXRlIHN1ZmZpeCBhbmQgY29ubmVjdCB0byBgR0FURVdBWV9BRERSYCB3aXRoIHRoZQpt" + + "YXRjaGluZyBgSG9zdGAgaGVhZGVyLgoKRm9yIGEgc3BsaXQgZGVwbG95bWVudCBjb25maWd1cmVk" + + "IHdpdGggZGlyZWN0IEdhdGV3YXkgYWRkcmVzc2VzLCByZXBsYWNlIG9ubHkKdGhlIGFkZHJlc3Mt" + + "YmVhcmluZyB2YWx1ZXM6IGNvbnRyb2wtcGxhbmUgYG52Y2ZOYXRzU2VydmljZVVSTGAsIGNvbXB1" + + "dGUtcGxhbmUKSUNNUywgUmVWYWwsIGFuZCBOQVRTIFVSTHMsIGFuZCBDTEkgVVJMIGZpZWxkcy4g" + + "S2VlcCB0aGVpciBkb21haW4gYW5kIEhvc3QKb3ZlcnJpZGVzIHVuY2hhbmdlZC4gUmVmcmVzaCBy" + + "ZWdpc3RyYXRpb24gYW5kIGluc3RhbGxhdGlvbiB0aHJvdWdoIHRoZSBzYW1lCmhhbmRvZmYgdXNl" + + "ZCBvcmlnaW5hbGx5LiBTZWUKW1NwbGl0IENvbXB1dGUtUGxhbmUgSW5zdGFsbGF0aW9uXShyZWZl" + + "cmVuY2VzL2NvbXB1dGUtcGxhbmUtaW5zdGFsbGF0aW9uLm1kKQpmb3IgdGhlIGZpZWxkcyBhbmQg" + + "Y29tcGxldGUgY29tbWFuZHMuCgojIyMgU3RlcCAzOiBWZXJpZnkgYm90aCBjb250ZXh0cwoKYGBg" + + "YmFzaApkaWcgK3Nob3J0ICJhcGkuPGRvbWFpbj4iCmN1cmwgLUggIkhvc3Q6IGFwaS48ZG9tYWlu" + + "PiIgImh0dHA6Ly8kR0FURVdBWV9BRERSL2hlYWx0aCIKa3ViZWN0bCAtLWNvbnRleHQgPGNvbnRy" + + "b2wtcGxhbmUtY29udGV4dD4gZ2V0IGdhdGV3YXkgbnZjZi1nYXRld2F5IFwKICAtbiBlbnZveS1n" + + "YXRld2F5IC1vIHdpZGUKa3ViZWN0bCAtLWNvbnRleHQgPGNvbnRyb2wtcGxhbmUtY29udGV4dD4g" + + "Z2V0IGh0dHByb3V0ZXMgLUEKa3ViZWN0bCAtLWNvbnRleHQgPGNvbnRyb2wtcGxhbmUtY29udGV4" + + "dD4gZ2V0IHRjcHJvdXRlcyAtQQprdWJlY3RsIC0tY29udGV4dCA8Y29tcHV0ZS1wbGFuZS1jb250" + + "ZXh0PiByb2xsb3V0IHN0YXR1cyBcCiAgZGVwbG95bWVudC9udmNhLW9wZXJhdG9yIC1uIG52Y2Et" + + "b3BlcmF0b3IgLS10aW1lb3V0PTEwbQprdWJlY3RsIC0tY29udGV4dCA8Y29tcHV0ZS1wbGFuZS1j" + + "b250ZXh0PiB3YWl0IFwKICBudmNmYmFja2VuZC88Y29tcHV0ZS1wbGFuZS1jbHVzdGVyLW5hbWU+" + + "IC1uIG52Y2Etb3BlcmF0b3IgXAogIC0tZm9yPWpzb25wYXRoPSd7LnN0YXR1cy5hZ2VudFN0YXR1" + + "c30nPWhlYWx0aHkgLS10aW1lb3V0PTEwbQpgYGAKCi0tLQoKIyMgRXhhbXBsZSA1OiBEZXBsb3kg" + + "T25seSBEZXBlbmRlbmNpZXMKClVzZWZ1bCBmb3IgdGVzdGluZyBvciB3aGVuIGl0ZXJhdGluZyBv" + + "biBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24uCgpgYGBiYXNoCiMgRGVwbG95IGp1c3QgTkFUUywgQ2Fz" + + "c2FuZHJhLCBPcGVuQmFvCkhFTE1GSUxFX0VOVj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIHJl" + + "bGVhc2UtZ3JvdXA9ZGVwZW5kZW5jaWVzIHN5bmMKCiMgQ2hlY2sgc3RhdHVzCmt1YmVjdGwgZ2V0" + + "IHBvZHMgLW4gbmF0cy1zeXN0ZW0Ka3ViZWN0bCBnZXQgcG9kcyAtbiBjYXNzYW5kcmEtc3lzdGVt" + + "Cmt1YmVjdGwgZ2V0IHBvZHMgLW4gdmF1bHQtc3lzdGVtCgojIERlcGxveSBqdXN0IG9uZSBzcGVj" + + "aWZpYyByZWxlYXNlCkhFTE1GSUxFX0VOVj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9" + + "Y2Fzc2FuZHJhIHN5bmMKYGBgCgojIyMgU2VsZWN0b3IgcmVmZXJlbmNlCgp8IFNlbGVjdG9yIHwg" + + "UmVsZWFzZXMgfAp8LS0tLS0tLS0tLXwtLS0tLS0tLS0tfAp8IGByZWxlYXNlLWdyb3VwPWRlcGVu" + + "ZGVuY2llc2AgfCBuYXRzLCBjYXNzYW5kcmEsIG9wZW5iYW8tc2VydmVyIHwKfCBgcmVsZWFzZS1n" + + "cm91cD1zZXJ2aWNlc2AgfCBhcGkta2V5cywgc2lzLCBhcGksIGludm9jYXRpb24tc2VydmljZSwg" + + "Z3JwYy1wcm94eSwgZXNzLWFwaSwgbm90YXJ5LXNlcnZpY2UsIHJldmFsLCBvcHRpb25hbCBsbG0t" + + "cmVxdWVzdC1yb3V0ZXIgYW5kIGxsbS1hcGktZ2F0ZXdheSB3aGVuIGBsbG0uZW5hYmxlZD10cnVl" + + "YCwgb3B0aW9uYWwgdmFuaXR5LWdhdGV3YXkgb25seSBpbiBzdGFjayBwYWNrYWdlcyB0aGF0IGlu" + + "Y2x1ZGUgdGhlIGFkZG9uIGFuZCBoYXZlIGBhZGRvbnMudmFuaXR5R2F0ZXdheS5lbmFibGVkPXRy" + + "dWVgLCBvcHRpb25hbCBudmNmLXVpIG9ubHkgaW4gc3RhY2sgcGFja2FnZXMgdGhhdCBpbmNsdWRl" + + "IHRoZSBhZGRvbiBhbmQgaGF2ZSBgYWRkb25zLm52Y2ZVaS5lbmFibGVkPXRydWVgIHwKfCBgbmFt" + + "ZT1sbG0tcmVxdWVzdC1yb3V0ZXJgIHwgRGVwbG95IGp1c3QgdGhlIExMTSByZXF1ZXN0IHJvdXRl" + + "ciB3aGVuIGBsbG0uZW5hYmxlZD10cnVlYCB8CnwgYG5hbWU9bGxtLWFwaS1nYXRld2F5YCB8IERl" + + "cGxveSBqdXN0IHRoZSBMTE0gQVBJIGdhdGV3YXkgd2hlbiBgbGxtLmVuYWJsZWQ9dHJ1ZWAgfAp8" + + "IGBuYW1lPXZhbml0eS1nYXRld2F5YCB8IERlcGxveSBqdXN0IFZhbml0eSBHYXRld2F5IG9ubHkg" + + "d2hlbiB0aGUgc3RhY2sgcGFja2FnZSBpbmNsdWRlcyB0aGF0IHJlbGVhc2UgYW5kIGBhZGRvbnMu" + + "dmFuaXR5R2F0ZXdheS5lbmFibGVkPXRydWVgIHwKfCBgbmFtZT1udmNmLXVpYCB8IERlcGxveSBO" + + "VkNGIFVJIG9ubHkgd2hlbiB0aGUgc3RhY2sgcGFja2FnZSBpbmNsdWRlcyB0aGF0IHJlbGVhc2Ug" + + "YW5kIGBhZGRvbnMubnZjZlVpLmVuYWJsZWQ9dHJ1ZWAgfAp8IGByZWxlYXNlLWdyb3VwPWluZ3Jl" + + "c3NgIHwgaW5ncmVzcyAoZ2F0ZXdheSByb3V0ZXMpIHwKfCBgbmFtZT08cmVsZWFzZT5gIHwgQW55" + + "IGluZGl2aWR1YWwgcmVsZWFzZSBieSBuYW1lIHwKCk5vdGU6IGBhZG1pbi1pc3N1ZXItcHJveHlg" + + "IGRvZXMgbm90IGhhdmUgYSByZWxlYXNlLWdyb3VwIGxhYmVsLiBUYXJnZXQgaXQgd2l0aCBgLS1z" + + "ZWxlY3RvciBuYW1lPWFkbWluLWlzc3Vlci1wcm94eWAuClBLBwgCUk5AfygAAH8oAABQSwMEFAAI" + + "AAAAAAAhAAAAAAAAAAAAAAAAAEwACQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlv" + + "bi9yZWZlcmVuY2VzL2NvbXB1dGUtcGxhbmUtaW5zdGFsbGF0aW9uLm1kVVQFAAEAps4SIyBTcGxp" + + "dCBDb21wdXRlLVBsYW5lIEluc3RhbGxhdGlvbgoKVGhlIGNvbnRyb2wgcGxhbmUgYW5kIGNvbXB1" + + "dGUgcGxhbmUgYXJlIHNlcGFyYXRlIHN0YWNrcy4gSW5zdGFsbCB0aGUgY29udHJvbApwbGFuZSBm" + + "aXJzdCwgdGhlbiByZWdpc3RlciBhbmQgaW5zdGFsbCBlYWNoIGNvbXB1dGUgY2x1c3Rlci4gQ2hv" + + "b3NlIG9uZSBoYW5kb2ZmCmJlbG93IGFuZCB1c2UgaXQgZm9yIHRoZSBmdWxsIGxpZmVjeWNsZS4g" + + "RG8gbm90IGNvbWJpbmUgYSBDTEktZ2VuZXJhdGVkIHByb2ZpbGUKd2l0aCB0aGUgSGVsbWZpbGUg" + + "dmFsdWVzIGZsb3cuCgojIyBDaG9vc2UgYSBIYW5kb2ZmCgp8IEZsb3cgfCBTb3VyY2Ugb2YgY29u" + + "dHJvbC1wbGFuZSBlbmRwb2ludHMgfCBSZWdpc3RyYXRpb24gYXJ0aWZhY3QgfAp8LS0tLS0tfC0t" + + "LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t" + + "fAp8IEhlbG1maWxlIHZhbHVlcyB8IFNlcGFyYXRlIGNvbnRyb2wtcGxhbmUgYW5kIGNvbXB1dGUt" + + "cGxhbmUgZW52aXJvbm1lbnQgZmlsZXMgfCBgZGVwbG95L3N0YWNrcy9udmNmLWNvbXB1dGUtcGxh" + + "bmUvcmVnaXN0cmF0aW9uLzxjbHVzdGVyPi1yZWdpc3Rlci12YWx1ZXMueWFtbGAgfAp8IENMSSBw" + + "cm9maWxlIHwgQ0xJLWdlbmVyYXRlZCBgZGVwbG95L3N0YWNrcy9zZWxmLW1hbmFnZWQvb3V0L2Nv" + + "bnRyb2wtcGxhbmUtcHJvZmlsZS55YW1sYCB8IENMSS1nZW5lcmF0ZWQgYGRlcGxveS9zdGFja3Mv" + + "bnZjZi1jb21wdXRlLXBsYW5lL291dC88Y2x1c3Rlcj4tcmVnaXN0ZXItdmFsdWVzLnlhbWxgIHwK" + + "ClRoZSBDTEkgcHJvZmlsZSBpcyBtYW5kYXRvcnkgZm9yIHRoZSBDTEkgZmxvdyBhbmQgbXVzdCBu" + + "b3QgYmUgaGFuZC1hdXRob3JlZC4KVGhlIEhlbG1maWxlIGZsb3cgZG9lcyBub3QgY29uc3VtZSBh" + + "IGNvbnRyb2wtcGxhbmUgcHJvZmlsZS4KCkNvbW1hbmRzIGJlbG93IHVzZSBtb25vcmVwbyBwYXRo" + + "cyBmcm9tIHRoZSByZXBvc2l0b3J5IHJvb3QuIE9wZXJhdG9ycyB1c2luZwpleHRyYWN0ZWQgcGFj" + + "a2FnZXMgbmVlZCBtYXRjaGluZy12ZXJzaW9uIGBudmNmLXNlbGYtbWFuYWdlZC1zdGFja2AgYW5k" + + "CmBudmNmLWNvbXB1dGUtcGxhbmUtc3RhY2tgIGJ1bmRsZXMuIFN1YnN0aXR1dGUgdGhvc2UgYnVu" + + "ZGxlIHJvb3RzIGZvcgpgZGVwbG95L3N0YWNrcy9zZWxmLW1hbmFnZWRgIGFuZCBgZGVwbG95L3N0" + + "YWNrcy9udmNmLWNvbXB1dGUtcGxhbmVgLgoKIyMgSGVsbWZpbGUgVmFsdWVzIEZsb3cKCkNyZWF0" + + "ZSBib3RoIGVudmlyb25tZW50IGZpbGVzIGJlZm9yZSBpbnN0YWxsYXRpb246CgotIGBkZXBsb3kv" + + "c3RhY2tzL3NlbGYtbWFuYWdlZC9lbnZpcm9ubWVudHMvPGVudj4ueWFtbGAgZm9yIGNvbnRyb2wt" + + "cGxhbmUKICByZWdpc3RyeSwgZG9tYWluLCBHYXRld2F5LCByb3V0ZXMsIGFuZCBzZXJ2aWNlIHNl" + + "dHRpbmdzLgotIGBkZXBsb3kvc3RhY2tzL252Y2YtY29tcHV0ZS1wbGFuZS9lbnZpcm9ubWVudHMv" + + "PGVudj4ueWFtbGAgZm9yIGNvbXB1dGUtcGxhbmUKICByZWdpc3RyeSwgcHVsbCBzZWNyZXRzLCBh" + + "bmQgY29tcHV0ZS1yZWFjaGFibGUgSUNNUywgUmVWYWwsIGFuZCBOQVRTIHZhbHVlcy4KCkZvciBF" + + "S1MsIHVzZSB0aGUgY2Fub25pY2FsCltDU1AgRW5kLXRvLUVuZCBFeGFtcGxlXShodHRwczovL2Rv" + + "Y3MubnZpZGlhLmNvbS9udmNmL3YwLjYuMC1yYy9jc3AtZW5kLXRvLWVuZC1leGFtcGxlKS4KVGhl" + + "IGNvbnRyb2wtcGxhbmUgZW52aXJvbm1lbnQga2VlcHMgdGhlIEVudm95IEdhdGV3YXkgY29udHJv" + + "bGxlciBpbgpgZW52b3ktZ2F0ZXdheS1zeXN0ZW1gLCBhdHRhY2hlcyByb3V0ZXMgdG8gYEdhdGV3" + + "YXkvbnZjZi1nYXRld2F5YCBpbgpgZW52b3ktZ2F0ZXdheWAsIGFuZCBlbmFibGVzIHRoZSBOQVRT" + + "IHJvdXRlLiBUaGUgY29tcHV0ZS1wbGFuZSBlbnZpcm9ubWVudCB1c2VzCnRoZSBleHRlcm5hbCBh" + + "ZGRyZXNzIHBsdXMgdGhlIHNlcnZpY2UgaG9zdCBvdmVycmlkZXMuIEhlcmUsCmA8Z2F0ZXdheS1h" + + "ZGRyZXNzPmAgaXMgdGhlIE5MQiBhZGRyZXNzIGFuZCBgPGdhdGV3YXktZG9tYWluPmAgaXMgdGhl" + + "IEROUyBiYXNlCndob3NlIHNlcnZpY2Ugc3ViZG9tYWlucyByZXNvbHZlIHRvIHRoYXQgTkxCOgoK" + + "YGBgeWFtbAojIGRlcGxveS9zdGFja3Mvc2VsZi1tYW5hZ2VkL2Vudmlyb25tZW50cy88ZW52Pi55" + + "YW1sCmdsb2JhbDoKICBkb21haW46ICI8Z2F0ZXdheS1kb21haW4+IgogIHdvcmtlckVuZHBvaW50" + + "czoKICAgIG52Y2ZTZXJ2aWNlVVJMOiAiaHR0cDovL2FwaS48Z2F0ZXdheS1kb21haW4+IgogICAg" + + "bnZjZkdycGNTZXJ2aWNlVVJMOiAiaHR0cDovL3dvcmtlci1hcGkuPGdhdGV3YXktZG9tYWluPiIK" + + "ICAgIG52Y2ZOYXRzU2VydmljZVVSTDogIm5hdHM6Ly88Z2F0ZXdheS1hZGRyZXNzPjo0MjIyIgog" + + "ICAgbnZjdFNlcnZpY2VVUkw6ICJodHRwOi8vdGFza3MuPGdhdGV3YXktZG9tYWluPiIKICAgIG52" + + "Y3RHcnBjU2VydmljZVVSTDogImh0dHA6Ly93b3JrZXItdGFza3MuPGdhdGV3YXktZG9tYWluPiIK" + + "ICAgIGludm9jYXRpb25TZXJ2aWNlVVJMOiAiaHR0cDovL2ludm9jYXRpb24uPGdhdGV3YXktZG9t" + + "YWluPiIKCmdycGNwcm94eToKICBudmNmR3JwY1NlcnZpY2VVUkw6ICJodHRwOi8vYXBpLm52Y2Yu" + + "c3ZjLmNsdXN0ZXIubG9jYWw6OTA5MCIKCmluZ3Jlc3M6CiAgZ2F0ZXdheUFwaToKICAgIGNvbnRy" + + "b2xsZXJOYW1lc3BhY2U6IGVudm95LWdhdGV3YXktc3lzdGVtCiAgICBnYXRld2F5czoKICAgICAg" + + "c2hhcmVkOiB7bmFtZTogbnZjZi1nYXRld2F5LCBuYW1lc3BhY2U6IGVudm95LWdhdGV3YXl9CiAg" + + "ICAgIGdycGM6IHtuYW1lOiBudmNmLWdhdGV3YXksIG5hbWVzcGFjZTogZW52b3ktZ2F0ZXdheX0K" + + "ICAgICAgbmF0czoKICAgICAgICBuYW1lOiBudmNmLWdhdGV3YXkKICAgICAgICBuYW1lc3BhY2U6" + + "IGVudm95LWdhdGV3YXkKICAgICAgICBsaXN0ZW5lck5hbWU6IG5hdHMKICAgIHJvdXRlczoKICAg" + + "ICAgbnZjZkFwaToKICAgICAgICBncnBjOgogICAgICAgICAgZW5hYmxlZDogdHJ1ZQogICAgICAg" + + "ICAgaG9zdG5hbWVzOiBbIndvcmtlci1hcGkuPGdhdGV3YXktZG9tYWluPiJdCiAgICAgIG52Y3RB" + + "cGk6CiAgICAgICAgZ3JwYzoKICAgICAgICAgIGVuYWJsZWQ6IHRydWUKICAgICAgICAgIGhvc3Ru" + + "YW1lczogWyJ3b3JrZXItdGFza3MuPGdhdGV3YXktZG9tYWluPiJdCiAgICAgIG5hdHM6CiAgICAg" + + "ICAgZW5hYmxlZDogdHJ1ZQoKb3BlbmJhbzoKICBtaWdyYXRpb25zOgogICAgaXNzdWVyRGlzY292" + + "ZXJ5OgogICAgICBlbmFibGVkOiB0cnVlCmBgYAoKYGBgeWFtbAojIGRlcGxveS9zdGFja3MvbnZj" + + "Zi1jb21wdXRlLXBsYW5lL2Vudmlyb25tZW50cy88ZW52Pi55YW1sCmdsb2JhbDoKICBudmNhT3Bl" + + "cmF0b3I6CiAgICBzZWxmTWFuYWdlZDoKICAgICAgaWNtc1NlcnZpY2VVUkw6ICJodHRwOi8vPGdh" + + "dGV3YXktYWRkcmVzcz4iCiAgICAgIGljbXNTZXJ2aWNlSG9zdEhlYWRlck92ZXJyaWRlOiAic2lz" + + "LjxnYXRld2F5LWRvbWFpbj4iCiAgICAgIHJldmFsU2VydmljZVVSTDogImh0dHA6Ly88Z2F0ZXdh" + + "eS1hZGRyZXNzPiIKICAgICAgcmV2YWxTZXJ2aWNlSG9zdEhlYWRlck92ZXJyaWRlOiAicmV2YWwu" + + "PGdhdGV3YXktZG9tYWluPiIKICAgICAgbmF0c1VSTDogIm5hdHM6Ly88Z2F0ZXdheS1hZGRyZXNz" + + "Pjo0MjIyIgogICAgICBuYXRzSG9zdE92ZXJyaWRlOiAibmF0cy48Z2F0ZXdheS1kb21haW4+Igpg" + + "YGAKClByZXZpZXcgYW5kIGluc3RhbGwgdGhlIGNvbnRyb2wgcGxhbmUgYWdhaW5zdCBpdHMgY29u" + + "dGV4dDoKCmBgYGJhc2gKbWFrZSAtQyBkZXBsb3kvc3RhY2tzL3NlbGYtbWFuYWdlZCB0ZW1wbGF0" + + "ZSBcCiAgSEVMTUZJTEVfRU5WPTxlbnY+IFwKICBLVUJFQ09ORklHX0ZJTEU9PGNvbnRyb2wtcGxh" + + "bmUta3ViZWNvbmZpZz4KCm1ha2UgLUMgZGVwbG95L3N0YWNrcy9zZWxmLW1hbmFnZWQgaW5zdGFs" + + "bCBcCiAgSEVMTUZJTEVfRU5WPTxlbnY+IFwKICBLVUJFQ09ORklHX0ZJTEU9PGNvbnRyb2wtcGxh" + + "bmUta3ViZWNvbmZpZz4KYGBgCgpCZWZvcmUgcmVnaXN0ZXJpbmcgdGhyb3VnaCBhIGJhcmUgR2F0" + + "ZXdheSBhZGRyZXNzLCBjcmVhdGUgb3IgdXBkYXRlIHRoZSBDTEkKY29uZmlnIHBhc3NlZCBhcyBg" + + "TlZDRl9DTElfQ09ORklHYDoKCmBgYHlhbWwKYmFzZV9odHRwX3VybDogImh0dHA6Ly88Z2F0ZXdh" + + "eS1hZGRyZXNzPiIKaW52b2tlX3VybDogImh0dHA6Ly88Z2F0ZXdheS1hZGRyZXNzPiIKYmFzZV9n" + + "cnBjX3VybDogIjxnYXRld2F5LWFkZHJlc3M+OjEwMDgxIgphcGlfa2V5c19zZXJ2aWNlX3VybDog" + + "Imh0dHA6Ly88Z2F0ZXdheS1hZGRyZXNzPiIKaWNtc191cmw6ICJodHRwOi8vPGdhdGV3YXktYWRk" + + "cmVzcz4iCmFwaV9ob3N0OiAiYXBpLjxnYXRld2F5LWRvbWFpbj4iCmFwaV9rZXlzX2hvc3Q6ICJh" + + "cGkta2V5cy48Z2F0ZXdheS1kb21haW4+IgppbnZva2VfaG9zdDogImludm9jYXRpb24uPGdhdGV3" + + "YXktZG9tYWluPiIKaWNtc19ob3N0OiAic2lzLjxnYXRld2F5LWRvbWFpbj4iCmBgYAoKSG9zdCBm" + + "aWVsZHMgY29udGFpbiBob3N0bmFtZXMgb25seSwgd2l0aG91dCBhIFVSTCBzY2hlbWUuIGBJQ01T" + + "X1VSTGAgbWFwcyBvbmx5CnRvIHRoZSByZWdpc3RyYXRpb24gY29tbWFuZCdzIGAtLWljbXMtdXJs" + + "YDsgYGljbXNfaG9zdGAgaW4gdGhlIGNvbmZpZyBzdXBwbGllcwp0aGUgR2F0ZXdheSBIb3N0IGhl" + + "YWRlci4gVGhlcmUgaXMgbm8gYC0taWNtcy1ob3N0YCBNYWtlIG9yIENMSSBmbGFnLgoKUmVnaXN0" + + "ZXIgZnJvbSB0aGUgY29tcHV0ZSBjb250ZXh0LCB0aGVuIGluc3RhbGwgdGhlIGNvbXB1dGUgcGxh" + + "bmU6CgpgYGBiYXNoCm1ha2UgLUMgZGVwbG95L3N0YWNrcy9udmNmLWNvbXB1dGUtcGxhbmUgcmVn" + + "aXN0ZXItY2x1c3RlciBcCiAgQ0xVU1RFUl9OQU1FPTxjbHVzdGVyLW5hbWU+IFwKICBOQ0FfSUQ9" + + "PG5jYS1pZD4gXAogIENMVVNURVJfUkVHSU9OPTxyZWdpb24+IFwKICBJQ01TX1VSTD1odHRwOi8v" + + "PGdhdGV3YXktYWRkcmVzcz4gXAogIEtVQkVDT05GSUdfRklMRT08Y29tcHV0ZS1wbGFuZS1rdWJl" + + "Y29uZmlnPiBcCiAgTlZDRl9DTEk9PHBhdGgtdG8tbnZjZi1jbGk+IFwKICBOVkNGX0NMSV9DT05G" + + "SUc9PHBhdGgtdG8tbnZjZi1jbGktY29uZmlnPgoKbWFrZSAtQyBkZXBsb3kvc3RhY2tzL252Y2Yt" + + "Y29tcHV0ZS1wbGFuZSBpbnN0YWxsIFwKICBDTFVTVEVSX05BTUU9PGNsdXN0ZXItbmFtZT4gXAog" + + "IEhFTE1GSUxFX0VOVj08ZW52PiBcCiAgS1VCRUNPTkZJR19GSUxFPTxjb21wdXRlLXBsYW5lLWt1" + + "YmVjb25maWc+CmBgYAoKUmVnaXN0cmF0aW9uIGRpc2NvdmVycyB0aGUgT0lEQyBpc3N1ZXIgYW5k" + + "IEpXS1MgZnJvbSB0aGUgY29tcHV0ZSBrdWJlIGNvbnRleHQuCkluIGEgbXVsdGktY2x1c3RlciBk" + + "ZXBsb3ltZW50LCBgS1VCRUNPTkZJR19GSUxFYCBpcyByZXF1aXJlZCBvbiBib3RoCmNvbXB1dGUt" + + "cGxhbmUgY29tbWFuZHMuIEluIGEgc2FtZS1jbHVzdGVyIGRlcGxveW1lbnQgaXQgbWF5IGJlIG9t" + + "aXR0ZWQgb25seQp3aGVuIHRoZSBhbWJpZW50IGNvbnRleHQgaXMgYWxyZWFkeSB0aGUgdGFyZ2V0" + + "IGNsdXN0ZXIuCgojIyBDTEkgUHJvZmlsZSBGbG93CgpSdW4gdGhlIENMSSBjb250cm9sLXBsYW5l" + + "IGluc3RhbGwgZmlyc3QuIEl0IGNyZWF0ZXMgdGhlIHByb2ZpbGUgY29uc3VtZWQgYnkKY29tcHV0" + + "ZS1wbGFuZSByZWdpc3RyYXRpb246CgpgYGBiYXNoCm52Y2YtY2xpIC0tY29uZmlnIDxjb25maWc+" + + "IHNlbGYtaG9zdGVkIFwKICAtLWNvbnRyb2wtcGxhbmUtc3RhY2sgZGVwbG95L3N0YWNrcy9zZWxm" + + "LW1hbmFnZWQgXAogIC0tY29tcHV0ZS1wbGFuZS1zdGFjayBkZXBsb3kvc3RhY2tzL252Y2YtY29t" + + "cHV0ZS1wbGFuZSBcCiAgLS1lbnYgPGVudj4gXAogIC0tcGxhaW4gXAogIC0tY29udHJvbC1wbGFu" + + "ZS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRleHQ+IFwKICAtLWNvbXB1dGUtcGxhbmUtY29u" + + "dGV4dCA8Y29tcHV0ZS1wbGFuZS1jb250ZXh0PiBcCiAgaW5zdGFsbCAtLWNvbnRyb2wtcGxhbmUg" + + "XAogIC0tY2x1c3Rlci1uYW1lIDxjb250cm9sLXBsYW5lLWNsdXN0ZXItbmFtZT4gXAogIC0tcmVn" + + "aW9uIDxyZWdpb24+IFwKICAtLW5jYS1pZCA8bmNhLWlkPgoKdGVzdCAtcyBkZXBsb3kvc3RhY2tz" + + "L3NlbGYtbWFuYWdlZC9vdXQvY29udHJvbC1wbGFuZS1wcm9maWxlLnlhbWwKYGBgCgpVc2UgdGhl" + + "IGZ1bGwgcGVyc2lzdGVudCBwcmVmaXggZm9yIGJvdGggY29tcHV0ZS1wbGFuZSBjb21tYW5kczoK" + + "CmBgYGJhc2gKbnZjZi1jbGkgLS1jb25maWcgPGNvbmZpZz4gc2VsZi1ob3N0ZWQgXAogIC0tY29u" + + "dHJvbC1wbGFuZS1zdGFjayBkZXBsb3kvc3RhY2tzL3NlbGYtbWFuYWdlZCBcCiAgLS1jb21wdXRl" + + "LXBsYW5lLXN0YWNrIGRlcGxveS9zdGFja3MvbnZjZi1jb21wdXRlLXBsYW5lIFwKICAtLWVudiA8" + + "ZW52PiBcCiAgLS1wbGFpbiBcCiAgY29tcHV0ZS1wbGFuZSByZWdpc3RlciBcCiAgLS1jb250cm9s" + + "LXBsYW5lLXByb2ZpbGUgZGVwbG95L3N0YWNrcy9zZWxmLW1hbmFnZWQvb3V0L2NvbnRyb2wtcGxh" + + "bmUtcHJvZmlsZS55YW1sIFwKICAtLWNsdXN0ZXItbmFtZSA8Y29tcHV0ZS1wbGFuZS1jbHVzdGVy" + + "LW5hbWU+IFwKICAtLWt1YmUtY29udGV4dCA8Y29tcHV0ZS1wbGFuZS1jb250ZXh0PiBcCiAgLS1y" + + "ZWdpb24gPHJlZ2lvbj4gXAogIC0tb3V0cHV0IGRlcGxveS9zdGFja3MvbnZjZi1jb21wdXRlLXBs" + + "YW5lL291dC88Y29tcHV0ZS1wbGFuZS1jbHVzdGVyLW5hbWU+LXJlZ2lzdGVyLXZhbHVlcy55YW1s" + + "CgpudmNmLWNsaSAtLWNvbmZpZyA8Y29uZmlnPiBzZWxmLWhvc3RlZCBcCiAgLS1jb250cm9sLXBs" + + "YW5lLXN0YWNrIGRlcGxveS9zdGFja3Mvc2VsZi1tYW5hZ2VkIFwKICAtLWNvbXB1dGUtcGxhbmUt" + + "c3RhY2sgZGVwbG95L3N0YWNrcy9udmNmLWNvbXB1dGUtcGxhbmUgXAogIC0tZW52IDxlbnY+IFwK" + + "ICAtLXBsYWluIFwKICBjb21wdXRlLXBsYW5lIGluc3RhbGwgXAogIC0tdmFsdWVzIGRlcGxveS9z" + + "dGFja3MvbnZjZi1jb21wdXRlLXBsYW5lL291dC88Y29tcHV0ZS1wbGFuZS1jbHVzdGVyLW5hbWU+" + + "LXJlZ2lzdGVyLXZhbHVlcy55YW1sIFwKICAtLWt1YmUtY29udGV4dCA8Y29tcHV0ZS1wbGFuZS1j" + + "b250ZXh0PiBcCiAgLS1jbHVzdGVyLW5hbWUgPGNvbXB1dGUtcGxhbmUtY2x1c3Rlci1uYW1lPgpg" + + "YGAKClJlZ2lzdHJhdGlvbiBzZWxlY3RzIHRoZSBwcm9maWxlJ3MgaW4tY2x1c3RlciBvciBjb21w" + + "dXRlLXJlYWNoYWJsZSBlbmRwb2ludHMKZnJvbSB0aGUgY29tcHV0ZSBjb250ZXh0IGFuZCBwcm9i" + + "ZXMgaXRzIEpXS1MuIERvIG5vdCByZXBsYWNlIHByb2ZpbGUgZW5kcG9pbnRzCndpdGggaGFuZC1h" + + "dXRob3JlZCBIZWxtZmlsZSBlbmRwb2ludCB2YWx1ZXMuCgojIyBQdWxsIFNlY3JldHMKCkNyZWF0" + + "ZSB0aGUgY29udHJvbC1wbGFuZSBzZWNyZXQgaW4gdGhlc2UgbmFtZXNwYWNlcyBvbiB0aGUgY29u" + + "dHJvbC1wbGFuZQpjb250ZXh0OgoKYGBgdGV4dApjYXNzYW5kcmEtc3lzdGVtIG5hdHMtc3lzdGVt" + + "IG52Y2YgYXBpLWtleXMgZXNzIHNpcyB2YXVsdC1zeXN0ZW0gY2VydC1tYW5hZ2VyCmBgYAoKT24g" + + "dGhlIGNvbXB1dGUgY29udGV4dCwgY3JlYXRlIHRoZSBzZWNyZXQgb25seSBpbiBgbnZjYS1vcGVy" + + "YXRvcmAgYW5kIHJlZmVyZW5jZQppdCB0aHJvdWdoIGBnbG9iYWwuaW1hZ2VQdWxsU2VjcmV0c2Ag" + + "aW4gdGhlIGNvbXB1dGUtcGxhbmUgZW52aXJvbm1lbnQuIFRoZSBjaGFydAphbmQgb3BlcmF0b3Ig" + + "dXNlIGl0IGluIGBudmNhLW9wZXJhdG9yYCBhbmQgbWlycm9yIGl0IHRvIGBudmNhLXN5c3RlbWAu" + + "IERvIG5vdCBhZGQKZWl0aGVyIG5hbWVzcGFjZSB0byB0aGUgY29udHJvbC1wbGFuZSBsaXN0LiBG" + + "b3IgY29tbWFuZHMgYW5kIHBvbGljeSBleGFtcGxlcywKc2VlIFtwdWxsLXNlY3JldHMubWRdKHB1" + + "bGwtc2VjcmV0cy5tZCkuCgojIyBWZXJpZmljYXRpb24KClVzZSB0aGUgZXhwbGljaXQgR2F0ZXdh" + + "eSBuYW1lIGFuZCBuYW1lc3BhY2U6CgpgYGBiYXNoCmt1YmVjdGwgLS1jb250ZXh0IDxjb250cm9s" + + "LXBsYW5lLWNvbnRleHQ+IGdldCBnYXRld2F5IG52Y2YtZ2F0ZXdheSBcCiAgLW4gZW52b3ktZ2F0" + + "ZXdheSAtbyB3aWRlCmt1YmVjdGwgLS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRleHQ+IGdl" + + "dCB0Y3Byb3V0ZSAtbiBlbnZveS1nYXRld2F5Cmt1YmVjdGwgLS1jb250ZXh0IDxjb21wdXRlLXBs" + + "YW5lLWNvbnRleHQ+IHJvbGxvdXQgc3RhdHVzIFwKICBkZXBsb3ltZW50L252Y2Etb3BlcmF0b3Ig" + + "LW4gbnZjYS1vcGVyYXRvciAtLXRpbWVvdXQ9MTBtCmt1YmVjdGwgLS1jb250ZXh0IDxjb21wdXRl" + + "LXBsYW5lLWNvbnRleHQ+IHdhaXQgXAogIG52Y2ZiYWNrZW5kLzxjb21wdXRlLXBsYW5lLWNsdXN0" + + "ZXItbmFtZT4gLW4gbnZjYS1vcGVyYXRvciBcCiAgLS1mb3I9anNvbnBhdGg9J3suc3RhdHVzLmFn" + + "ZW50U3RhdHVzfSc9aGVhbHRoeSAtLXRpbWVvdXQ9MTBtCmt1YmVjdGwgLS1jb250ZXh0IDxjb21w" + + "dXRlLXBsYW5lLWNvbnRleHQ+IGdldCBzZWNyZXQgPHB1bGwtc2VjcmV0PiAtbiBudmNhLXN5c3Rl" + + "bQpgYGAKCiMjIFRlYXJkb3duCgpEZXN0cm95IGFuZCBkZXJlZ2lzdGVyIGV2ZXJ5IGNvbXB1dGUg" + + "cGxhbmUgYmVmb3JlIHRoZSBjb250cm9sIHBsYW5lLiBCb3RoCmhhbmRvZmZzIGNhbiBkZXN0cm95" + + "IHRoZSBjb250cm9sIHBsYW5lLCBzbyBhcHBseSB0aGlzIHByZWZsaWdodCBiZWZvcmUgZWl0aGVy" + + "Cm9uZS4gUHJlc2VydmUgdGhlIGBjZXJ0LW1hbmFnZXJgIG5hbWVzcGFjZSBieSBkZWZhdWx0LiBO" + + "YW1lc3BhY2UgcHJlc2VydmF0aW9uCmRvZXMgbm90IHByZXNlcnZlIHRoZSBIZWxtIHJlbGVhc2Uu" + + "IElkZW50aWZ5IHdoZXRoZXIgY2VydC1tYW5hZ2VyIGlzIGV4dGVybmFsLgpGb3IgYW4gZXh0ZXJu" + + "YWwgaW5zdGFsbGF0aW9uLCByZXF1aXJlIGVmZmVjdGl2ZSBgY2VydE1hbmFnZXIuZW5hYmxlZDog" + + "ZmFsc2VgCmFuZCBhYm9ydCBpZiBpdCBpcyB0cnVlLiBGb3IgYW4gaW50ZW5kZWQgc3RhY2stbWFu" + + "YWdlZCByZWxlYXNlIHdpdGggZWZmZWN0aXZlCmBjZXJ0TWFuYWdlci5lbmFibGVkOiB0cnVlYCwg" + + "dmVyaWZ5IG1hdGNoaW5nIHN0YWNrIEhlbG0gcmVsZWFzZSBtZXRhZGF0YSBhbmQKYWJvcnQgb24g" + + "bWlzc2luZyBvciBtaXNtYXRjaGVkIGV2aWRlbmNlLiBPbmx5IHBsYW4gbmFtZXNwYWNlIHJlbW92" + + "YWwgYWZ0ZXIKdmVyaWZ5aW5nIG5hbWVzcGFjZSBwcm92ZW5hbmNlIGFuZCBnZXR0aW5nIGV4cGxp" + + "Y2l0IGNvbmZpcm1hdGlvbjsgb3RoZXJ3aXNlCmRvIG5vdCBkZWxldGUgaXQuCgpGb3IgdGhlIEhl" + + "bG1maWxlIHZhbHVlcyBmbG93LCByZXRhaW4gZWFjaCByZWdpc3RyYXRpb24gdmFsdWVzIGZpbGUg" + + "dW50aWwKY2xlYW51cCBpcyB2ZXJpZmllZDoKCmBgYGJhc2gKbWFrZSAtQyBkZXBsb3kvc3RhY2tz" + + "L252Y2YtY29tcHV0ZS1wbGFuZSBkZXN0cm95IFwKICBDTFVTVEVSX05BTUU9PGNsdXN0ZXItbmFt" + + "ZT4gXAogIEhFTE1GSUxFX0VOVj08ZW52PiBcCiAgS1VCRUNPTkZJR19GSUxFPTxjb21wdXRlLXBs" + + "YW5lLWt1YmVjb25maWc+Cgo8bnZjZi1jbGk+IC0tY29uZmlnIDxjb25maWc+IGNsdXN0ZXIgZGVs" + + "ZXRlIFwKICAtLWNsdXN0ZXItaWQgPGNsdXN0ZXItaWQtZnJvbS1yZWdpc3RyYXRpb24tdmFsdWVz" + + "PiBcCiAgLS1uY2EtaWQgPG5jYS1pZD4gXAogIC0taWdub3JlLW1pc3NpbmcKYGBgCgpSZWFkIGBj" + + "bHVzdGVySURgIGFuZCBgbmNhSURgIGZyb20KYGRlcGxveS9zdGFja3MvbnZjZi1jb21wdXRlLXBs" + + "YW5lL3JlZ2lzdHJhdGlvbi88Y2x1c3Rlci1uYW1lPi1yZWdpc3Rlci12YWx1ZXMueWFtbGAuClNo" + + "b3cgdGhlIGV4YWN0IGNsdXN0ZXIgSUQgYW5kIGdldCBjb25maXJtYXRpb24gYmVmb3JlIGBjbHVz" + + "dGVyIGRlbGV0ZWAuIFJlcGVhdApjb21wdXRlIGRlc3Ryb3kgYW5kIGRlcmVnaXN0cmF0aW9uIGZv" + + "ciBldmVyeSBjb21wdXRlIGNsdXN0ZXIsIHRoZW4gZGVzdHJveSB0aGUKY29udHJvbCBwbGFuZS4K" + + "CmBgYGJhc2gKS1VCRUNPTkZJRz08Y29udHJvbC1wbGFuZS1rdWJlY29uZmlnPiBcCm1ha2UgLUMg" + + "ZGVwbG95L3N0YWNrcy9zZWxmLW1hbmFnZWQgZGVzdHJveSBcCiAgSEVMTUZJTEVfRU5WPTxlbnY+" + + "IFwKICBLVUJFQ09ORklHX0ZJTEU9PGNvbnRyb2wtcGxhbmUta3ViZWNvbmZpZz4KYGBgCgpCb3Ro" + + "IGBLVUJFQ09ORklHYCBhbmQgYEtVQkVDT05GSUdfRklMRWAgYXJlIHJlcXVpcmVkIG9uIHRoZSBj" + + "b250cm9sLXBsYW5lCmRlc3Ryb3kgYmVjYXVzZSBpdHMgbmFtZXNwYWNlIGNsZWFudXAgdXNlcyBh" + + "bWJpZW50IGBrdWJlY3RsYC4KCkZvciB0aGUgQ0xJIHByb2ZpbGUgZmxvdywga2VlcApgZGVwbG95" + + "L3N0YWNrcy9udmNmLWNvbXB1dGUtcGxhbmUvb3V0LzxjbHVzdGVyLW5hbWU+LXJlZ2lzdGVyLXZh" + + "bHVlcy55YW1sYAp1bnRpbCB0ZWFyZG93biBjb21wbGV0ZXMgYmVjYXVzZSBgZG93bmAgcmVhZHMg" + + "aXRzIGNsdXN0ZXIgSUQuIEZpcnN0IHF1ZXJ5IHRoZQpsaXZlIHJlZ2lzdHJhdGlvbiBzZXQgd2l0" + + "aCB0aGUgc2FtZSBjb21wbGV0ZSBwZXJzaXN0ZW50IHByZWZpeDoKCmBgYGJhc2gKbnZjZi1jbGkg" + + "LS1jb25maWcgPGNvbmZpZz4gc2VsZi1ob3N0ZWQgXAogIC0tY29udHJvbC1wbGFuZS1zdGFjayBk" + + "ZXBsb3kvc3RhY2tzL3NlbGYtbWFuYWdlZCBcCiAgLS1jb21wdXRlLXBsYW5lLXN0YWNrIGRlcGxv" + + "eS9zdGFja3MvbnZjZi1jb21wdXRlLXBsYW5lIFwKICAtLWVudiA8ZW52PiBcCiAgLS1wbGFpbiBc" + + "CiAgLS1jb250cm9sLXBsYW5lLWNvbnRleHQgPGNvbnRyb2wtcGxhbmUtY29udGV4dD4gXAogIC0t" + + "Y29tcHV0ZS1wbGFuZS1jb250ZXh0IDxjb21wdXRlLXBsYW5lLWNvbnRleHQ+IFwKICAtLWljbXMt" + + "dXJsIDxjb21wdXRlLXJlYWNoYWJsZS1pY21zLXVybD4gXAogIHN0YXR1cyBcCiAgLS1jbHVzdGVy" + + "LW5hbWUgPGNvbXB1dGUtcGxhbmUtY2x1c3Rlci1uYW1lPiBcCiAgLS1uY2EtaWQgPG5jYS1pZD4K" + + "YGBgCgpTaG93IHRoZSByZWdpc3RlcmVkIGNvbXB1dGUtcGxhbmUgbGlzdC4gTmFtZWQtY2x1c3Rl" + + "ciBgZG93biAtLXBsYW4tb25seWAgZG9lcwpub3QgcXVlcnkgSUNNUywgc28gaXQgcHJldmlld3Mg" + + "b25seSB0aGF0IGNvbXB1dGUgcGxhbmUgYW5kIGNhbm5vdCBzaG93IHRoZQpjb25kaXRpb25hbCBj" + + "b250cm9sLXBsYW5lIHJlbW92YWwuIElmIHRoZSB0YXJnZXQgaXMgdGhlIGxhc3QgcmVnaXN0ZXJl" + + "ZApjbHVzdGVyLCByZWFsIGBkb3duYCBhbHNvIGRlc3Ryb3lzIHRoZSBjb250cm9sIHBsYW5lLiBH" + + "ZXQgZXhwbGljaXQgY29uZmlybWF0aW9uCmZvciBib3RoIHJlbW92YWxzIGJlZm9yZSBjb250aW51" + + "aW5nLiBUaGVuIHByZXZpZXcgYW5kIGV4ZWN1dGUgd2l0aCB0aGUgc2FtZQpwcmVmaXg6CgpgYGBi" + + "YXNoCm52Y2YtY2xpIC0tY29uZmlnIDxjb25maWc+IHNlbGYtaG9zdGVkIFwKICAtLWNvbnRyb2wt" + + "cGxhbmUtc3RhY2sgZGVwbG95L3N0YWNrcy9zZWxmLW1hbmFnZWQgXAogIC0tY29tcHV0ZS1wbGFu" + + "ZS1zdGFjayBkZXBsb3kvc3RhY2tzL252Y2YtY29tcHV0ZS1wbGFuZSBcCiAgLS1lbnYgPGVudj4g" + + "XAogIC0tcGxhaW4gXAogIC0tY29udHJvbC1wbGFuZS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNv" + + "bnRleHQ+IFwKICAtLWNvbXB1dGUtcGxhbmUtY29udGV4dCA8Y29tcHV0ZS1wbGFuZS1jb250ZXh0" + + "PiBcCiAgLS1pY21zLXVybCA8Y29tcHV0ZS1yZWFjaGFibGUtaWNtcy11cmw+IFwKICBkb3duIC0t" + + "cGxhbi1vbmx5IFwKICAtLWNsdXN0ZXItbmFtZSA8Y29tcHV0ZS1wbGFuZS1jbHVzdGVyLW5hbWU+" + + "IFwKICAtLW5jYS1pZCA8bmNhLWlkPgoKbnZjZi1jbGkgLS1jb25maWcgPGNvbmZpZz4gc2VsZi1o" + + "b3N0ZWQgXAogIC0tY29udHJvbC1wbGFuZS1zdGFjayBkZXBsb3kvc3RhY2tzL3NlbGYtbWFuYWdl" + + "ZCBcCiAgLS1jb21wdXRlLXBsYW5lLXN0YWNrIGRlcGxveS9zdGFja3MvbnZjZi1jb21wdXRlLXBs" + + "YW5lIFwKICAtLWVudiA8ZW52PiBcCiAgLS1wbGFpbiBcCiAgLS1jb250cm9sLXBsYW5lLWNvbnRl" + + "eHQgPGNvbnRyb2wtcGxhbmUtY29udGV4dD4gXAogIC0tY29tcHV0ZS1wbGFuZS1jb250ZXh0IDxj" + + "b21wdXRlLXBsYW5lLWNvbnRleHQ+IFwKICAtLWljbXMtdXJsIDxjb21wdXRlLXJlYWNoYWJsZS1p" + + "Y21zLXVybD4gXAogIGRvd24gXAogIC0tY2x1c3Rlci1uYW1lIDxjb21wdXRlLXBsYW5lLWNsdXN0" + + "ZXItbmFtZT4gXAogIC0tbmNhLWlkIDxuY2EtaWQ+CmBgYAoKUmVwZWF0IGBkb3duYCBmb3IgZWFj" + + "aCBjb21wdXRlIGNsdXN0ZXIuIEVhY2ggcnVuIGRlc3Ryb3lzIHRoYXQgY29tcHV0ZSBwbGFuZSBh" + + "bmQKdW5yZWdpc3RlcnMgaXRzIElDTVMgcm93LiBJdCByZW1vdmVzIHRoZSBjb250cm9sIHBsYW5l" + + "IG9ubHkgYWZ0ZXIgbm8gY2x1c3RlcgpyZWdpc3RyYXRpb25zIHJlbWFpbi4KUEsHCJZjvFkSMAAA" + + "EjAAAFBLAwQUAAgAAAAAACEAAAAAAAAAAAAAAAAAOwAJAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQt" + + "aW5zdGFsbGF0aW9uL3JlZmVyZW5jZXMvZGVidWdnaW5nLm1kVVQFAAEAps4SIyBEZWJ1Z2dpbmcg" + + "UmVmZXJlbmNlCgpSZWNpcGVzIGZvciBkaWFnbm9zaW5nIGFuZCBmaXhpbmcgY29tbW9uIE5WQ0Yg" + + "c2VsZi1tYW5hZ2VkIHN0YWNrIGZhaWx1cmVzLgoKIyMgUXVpY2sgU3RhdHVzIENvbW1hbmRzCgpg" + + "YGBiYXNoCiMgQWxsIHBvZHMgYWNyb3NzIGFsbCBuYW1lc3BhY2VzCmt1YmVjdGwgZ2V0IHBvZHMg" + + "LUEgLW8gd2lkZQoKIyBQb2RzIGluIGEgc3BlY2lmaWMgbmFtZXNwYWNlCmt1YmVjdGwgZ2V0IHBv" + + "ZHMgLW4gPG5hbWVzcGFjZT4KCiMgQWxsIGhlbG0gcmVsZWFzZXMKaGVsbSBsaXN0IC1BCgojIFJl" + + "Y2VudCBldmVudHMgKG1vc3QgdXNlZnVsIGZvciBkaWFnbm9zaW5nIGZhaWx1cmVzKQprdWJlY3Rs" + + "IGdldCBldmVudHMgLW4gPG5hbWVzcGFjZT4gLS1zb3J0LWJ5PScubGFzdFRpbWVzdGFtcCcKCiMg" + + "RGVzY3JpYmUgYSBzcGVjaWZpYyBwb2QgKHNob3dzIGV2ZW50cywgY29uZGl0aW9ucywgdm9sdW1l" + + "cykKa3ViZWN0bCBkZXNjcmliZSBwb2QgLW4gPG5hbWVzcGFjZT4gPHBvZC1uYW1lPgpgYGAKCiMj" + + "IEZhaWx1cmU6IEltYWdlUHVsbEJhY2tPZmYKCiMjIyBTeW1wdG9tcwoKYGBgdGV4dApOQU1FICAg" + + "ICAgICAgICBSRUFEWSAgIFNUQVRVUyAgICAgICAgICAgICBSRVNUQVJUUyAgIEFHRQpjYXNzYW5k" + + "cmEtMCAgICAwLzEgICAgIEltYWdlUHVsbEJhY2tPZmYgICAwICAgICAgICAgIDVtCmBgYAoKRXZl" + + "bnRzIHNob3c6CgpgYGB0ZXh0CkZhaWxlZCB0byBwdWxsIGltYWdlICJudmNyLmlvLy4uLi9pbWFn" + + "ZTp0YWciOiA0MDEgVW5hdXRob3JpemVkCmBgYAoKIyMjIERpYWdub3NpcwoKYGBgYmFzaAojIENo" + + "ZWNrIHdoYXQgaW1hZ2UgaXMgZmFpbGluZwprdWJlY3RsIGRlc2NyaWJlIHBvZCAtbiA8bmFtZXNw" + + "YWNlPiA8cG9kLW5hbWU+IHwgZ3JlcCAtQTUgIkV2ZW50czoiCgojIENoZWNrIGlmIHB1bGwgc2Vj" + + "cmV0IGV4aXN0cyBpbiB0aGUgbmFtZXNwYWNlCmt1YmVjdGwgZ2V0IHNlY3JldCBudmNyLWNyZWRz" + + "IC1uIDxuYW1lc3BhY2U+CgojIENoZWNrIGlmIHRoZSBwb2Qgc3BlYyBoYXMgaW1hZ2VQdWxsU2Vj" + + "cmV0cwprdWJlY3RsIGdldCBwb2QgLW4gPG5hbWVzcGFjZT4gPHBvZC1uYW1lPiAtbyBqc29ucGF0" + + "aD0ney5zcGVjLmltYWdlUHVsbFNlY3JldHN9JwoKIyBDaGVjayBpZiB0aGUgU2VydmljZUFjY291" + + "bnQgaGFzIGltYWdlUHVsbFNlY3JldHMKa3ViZWN0bCBnZXQgc2EgPHNhLW5hbWU+IC1uIDxuYW1l" + + "c3BhY2U+IC1vIGpzb25wYXRoPSd7LmltYWdlUHVsbFNlY3JldHN9JwpgYGAKCiMjIyBGaXhlcwoK" + + "MS4gKipTZWNyZXQgbWlzc2luZyBpbiBuYW1lc3BhY2UqKjogQ3JlYXRlIGl0CgogICBgYGBiYXNo" + + "CiAgIGt1YmVjdGwgY3JlYXRlIHNlY3JldCBkb2NrZXItcmVnaXN0cnkgbnZjci1jcmVkcyBcCiAg" + + "ICAgLS1kb2NrZXItc2VydmVyPW52Y3IuaW8gXAogICAgIC0tZG9ja2VyLXVzZXJuYW1lPSckb2F1" + + "dGh0b2tlbicgXAogICAgIC0tZG9ja2VyLXBhc3N3b3JkPSIkTkdDX0FQSV9LRVkiIFwKICAgICAt" + + "LW5hbWVzcGFjZT08bmFtZXNwYWNlPiBcCiAgICAgLS1kcnktcnVuPWNsaWVudCAtbyB5YW1sIHwg" + + "a3ViZWN0bCBhcHBseSAtZiAtCiAgIGBgYAoKMi4gKipTZWNyZXQgZXhpc3RzIGJ1dCBwb2QgZG9l" + + "c24ndCByZWZlcmVuY2UgaXQqKjogVGhlIGNoYXJ0IG5lZWRzIGBpbWFnZVB1bGxTZWNyZXRzYCBj" + + "b25maWd1cmVkIHZpYSBoZWxtZmlsZSB2YWx1ZXMuIFNlZSBbcHVsbC1zZWNyZXRzLm1kXShwdWxs" + + "LXNlY3JldHMubWQpLgoKMy4gKipDaGFydCBkb2Vzbid0IHN1cHBvcnQgaW1hZ2VQdWxsU2VjcmV0" + + "cyoqIChvcGVuYmFvLCBpbnZvY2F0aW9uLXNlcnZpY2UsIGVzcy1hcGksIG5vdGFyeS1zZXJ2aWNl" + + "KTogUGF0Y2ggU2VydmljZUFjY291bnRzIGFuZCByZXN0YXJ0IHBvZHMuIFNlZSBbcHVsbC1zZWNy" + + "ZXRzLm1kXShwdWxsLXNlY3JldHMubWQpLgoKNC4gKipXcm9uZyBjcmVkZW50aWFscyBpbiBzZWNy" + + "ZXQqKjogRGVsZXRlIGFuZCByZWNyZWF0ZQoKICAgYGBgYmFzaAogICBrdWJlY3RsIGRlbGV0ZSBz" + + "ZWNyZXQgbnZjci1jcmVkcyAtbiA8bmFtZXNwYWNlPgogICAjIFJlY3JlYXRlIHdpdGggY29ycmVj" + + "dCBjcmVkZW50aWFscwogICBgYGAKCiMjIEZhaWx1cmU6IEluaXQ6MC8xIFN0dWNrIChWYXVsdCBB" + + "Z2VudCkKCiMjIyBTeW1wdG9tcwoKU2VydmljZSBwb2RzIHN0dWNrIGluIGBJbml0OjAvMWAgZm9y" + + "IG1pbnV0ZXM6CgpgYGBiYXNoCk5BTUUgICAgICAgICAgICAgICAgICAgICAgICBSRUFEWSAgIFNU" + + "QVRVUyAgICAgUkVTVEFSVFMgICBBR0UKbnZjZi1hcGktN2Y0Yzc2Zjc4OC00NHZsdCAgMC8yICAg" + + "ICBJbml0OjAvMSAgIDAgICAgICAgICAgMTBtCmBgYAoKIyMjIERpYWdub3NpcwoKVGhlIGluaXQg" + + "Y29udGFpbmVyIGlzIHRoZSB2YXVsdC1hZ2VudC1pbml0IGluamVjdG9yIHdhaXRpbmcgZm9yIE9w" + + "ZW5CYW8uCgpgYGBiYXNoCiMgQ2hlY2sgT3BlbkJhbyBwb2RzCmt1YmVjdGwgZ2V0IHBvZHMgLW4g" + + "dmF1bHQtc3lzdGVtCgojIENoZWNrIGlmIE9wZW5CYW8gbWlncmF0aW9uIGpvYiByYW4Ka3ViZWN0" + + "bCBnZXQgam9icyAtbiB2YXVsdC1zeXN0ZW0KCiMgQ2hlY2sgT3BlbkJhbyBwb2QgbG9ncwprdWJl" + + "Y3RsIGxvZ3MgLW4gdmF1bHQtc3lzdGVtIG9wZW5iYW8tc2VydmVyLTAgLWMgb3BlbmJhbwoKIyBD" + + "aGVjayBpbml0IGNvbnRhaW5lciBsb2dzIG9uIHRoZSBzdHVjayBwb2QKa3ViZWN0bCBsb2dzIC1u" + + "IDxuYW1lc3BhY2U+IDxwb2QtbmFtZT4gLWMgdmF1bHQtYWdlbnQtaW5pdApgYGAKCiMjIyBGaXhl" + + "cwoKMS4gKipPcGVuQmFvIHBvZHMgbm90IHJ1bm5pbmcqKjogQ2hlY2sgdGhlaXIgZXZlbnRzIGZv" + + "ciBpbWFnZSBwdWxsIGlzc3VlcywgcmVzb3VyY2UgaXNzdWVzLCBldGMuCgoyLiAqKk9wZW5CYW8g" + + "bWlncmF0aW9uIGpvYiBkaWRuJ3QgcnVuKio6IFRoaXMgaGFwcGVucyB3aGVuIGBoZWxtZmlsZSBz" + + "eW5jYCB3YXMgaW50ZXJydXB0ZWQuIERlc3Ryb3kgYW5kIHJlLXN5bmMgb3BlbmJhbzoKCiAgIGBg" + + "YGJhc2gKICAgSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0b3IgbmFtZT1vcGVu" + + "YmFvLXNlcnZlciBkZXN0cm95CiAgIGt1YmVjdGwgZGVsZXRlIG5hbWVzcGFjZSB2YXVsdC1zeXN0" + + "ZW0KICAga3ViZWN0bCBjcmVhdGUgbmFtZXNwYWNlIHZhdWx0LXN5c3RlbQogICAjIFJlLWNyZWF0" + + "ZSBwdWxsIHNlY3JldCBpZiBuZWVkZWQKICAgSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0t" + + "c2VsZWN0b3IgbmFtZT1vcGVuYmFvLXNlcnZlciBzeW5jCiAgIGBgYAoKMy4gKipPcGVuQmFvIHBv" + + "ZHMgcnVubmluZyBidXQgbm90IGluaXRpYWxpemVkKio6IENoZWNrIHVuc2VhbCBzdGF0dXM6Cgog" + + "ICBgYGBiYXNoCiAgIGt1YmVjdGwgZXhlYyAtbiB2YXVsdC1zeXN0ZW0gb3BlbmJhby1zZXJ2ZXIt" + + "MCAtYyBvcGVuYmFvIC0tIGJhbyBzdGF0dXMKICAgYGBgCgo0LiAqKmB2YXVsdC1hZ2VudC1pbml0" + + "YCBsb2dzIGBhdXRoL2p3dC9sb2dpbmAgLT4gYDQwMCAuLi4gbm8ga25vd24ga2V5IHN1Y2Nlc3Nm" + + "dWxseSB2YWxpZGF0ZWQgdGhlIHRva2VuIHNpZ25hdHVyZWAqKgogICAoY29tbW9uIG9uIEFLUywg" + + "YW5kIG9uIGFueSBjbHVzdGVyIHdob3NlIE9JREMgaXNzdWVyIHB1Ymxpc2hlcyBhIHJvdGF0aW5n" + + "IG11bHRpLWtleSBKV0tTKToKICAgdGhlIE9wZW5CYW8gYGF1dGgvand0YCBtZXRob2Qgd2FzIGNv" + + "bmZpZ3VyZWQgd2l0aCBhIHNpbmdsZSBzdGF0aWMgbW91bnRlZCBwdWJsaWMga2V5CiAgIChgand0" + + "X3ZhbGlkYXRpb25fcHVia2V5c2ApIGluc3RlYWQgb2YgdGhlIGlzc3VlcidzIGxpdmUgSldLUywg" + + "c28gaXQgY2Fubm90IHZhbGlkYXRlIHRoZQogICBjbHVzdGVyLXNpZ25lZCBTZXJ2aWNlQWNjb3Vu" + + "dCB0b2tlbnMgdGhlIHZhdWx0LWFnZW50cyBwcmVzZW50LiBFdmVyeSBzZXJ2aWNlJ3MKICAgYHZh" + + "dWx0LWFnZW50LWluaXRgIHRoZW4gbG9vcHMgb24gdGhhdCA0MDAgYW5kIHRoZSBwb2QgbmV2ZXIg" + + "bGVhdmVzIGBJbml0OjAvMWAuIFRoaXMgaXMgdGhlCiAgIGJlaGF2aW9yIG9mIHRoZSBiYXNlIGRl" + + "ZmF1bHQgYG9wZW5iYW8ubWlncmF0aW9ucy5pc3N1ZXJEaXNjb3ZlcnkuZW5hYmxlZDogZmFsc2Vg" + + "OyB0aGUKICAgbWlncmF0aW9uIGxvZyBzaG93cyBgT0lEQyBpc3N1ZXIgZGlzY292ZXJ5IGlzIGRp" + + "c2FibGVkLiBVc2luZyBTZXJ2aWNlQWNjb3VudCBpc3N1ZXIgYW5kCiAgIG1vdW50ZWQgcHVibGlj" + + "IGtleSBmYWxsYmFja2AuIEVuYWJsZSBpc3N1ZXIgZGlzY292ZXJ5IHNvIHRoZSBtaWdyYXRpb24g" + + "dXNlcyB0aGUgbGl2ZSBKV0tTLAogICB0aGVuIHJlLXJ1biBpdDoKCiAgIGBgYGJhc2gKICAgIyBJ" + + "biB5b3VyIGVudiB2YWx1ZXMgKGUuZy4gZW52aXJvbm1lbnRzLzxlbnY+LnlhbWwpLCBzZXQ6CiAg" + + "ICMgICBvcGVuYmFvOgogICAjICAgICBtaWdyYXRpb25zOgogICAjICAgICAgIGlzc3VlckRpc2Nv" + + "dmVyeToKICAgIyAgICAgICAgIGVuYWJsZWQ6IHRydWUKICAga3ViZWN0bCBkZWxldGUgam9iIC1u" + + "IHZhdWx0LXN5c3RlbSBvcGVuYmFvLXNlcnZlci1taWdyYXRpb25zCiAgIEhFTE1GSUxFX0VOVj08" + + "ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9b3BlbmJhby1zZXJ2ZXIgc3luYwogICBgYGAK" + + "CiAgIFRoZSBtaWdyYXRpb24gbG9nIHNob3VsZCB0aGVuIHNob3cgYFJlY2VpdmVkIGRpc2NvdmVy" + + "eSBkb2N1bWVudCBmcm9tCiAgIC4uLi8ud2VsbC1rbm93bi9vcGVuaWQtY29uZmlndXJhdGlvbmAg" + + "YW5kIGBGaW5hbCBPcGVuQmFvIEpXVCBKV0tTIFVSTCBzZXQgdG86CiAgIC4uLi9vcGVuaWQvdjEv" + + "andrc2AsIGFuZCB0aGUgc2VydmljZSBwb2RzIGF1dGhlbnRpY2F0ZSBhbmQgcmVhY2ggUmVhZHkg" + + "d2l0aGluIH4xIG1pbi4KICAgQUtTIGNsdXN0ZXJzIHdpdGggdGhlIGNsdXN0ZXIgT0lEQyBpc3N1" + + "ZXIgZW5hYmxlZCAodGhlIGBha3MtY2x1c3RlcmAgZGVmYXVsdCkgYWx3YXlzIG5lZWQKICAgdGhp" + + "cyBiZWNhdXNlIHRoZSBzdGF0aWMtcHVia2V5IGZhbGxiYWNrIGNhbm5vdCBtYXRjaCB0aGUgaXNz" + + "dWVyJ3Mgcm90YXRpbmcgc2lnbmluZyBrZXlzLgoKIyMgRmFpbHVyZTogT09NS2lsbGVkIG9uIENh" + + "c3NhbmRyYQoKIyMjIFN5bXB0b21zCgpgYGB0ZXh0Ck5BTUUgICAgICAgICAgUkVBRFkgICBTVEFU" + + "VVMgICAgUkVTVEFSVFMgICBBR0UKY2Fzc2FuZHJhLTAgICAwLzEgICAgIE9PTUtpbGxlZCAgMyAg" + + "ICAgICAgIDEwbQpgYGAKCiMjIyBEaWFnbm9zaXMKCmBgYGJhc2gKa3ViZWN0bCBkZXNjcmliZSBw" + + "b2QgLW4gY2Fzc2FuZHJhLXN5c3RlbSBjYXNzYW5kcmEtMCB8IGdyZXAgLUEzICJMYXN0IFN0YXRl" + + "IgpgYGAKCiMjIyBGaXgKCk92ZXJyaWRlIENhc3NhbmRyYSByZXNvdXJjZXMgdmlhIGhlbG1maWxl" + + "IHZhbHVlcy4gU2VlIEV4YW1wbGUgMSBpbgpbZXhhbXBsZXMubWRdKC4uL2V4YW1wbGVzLm1kKS4K" + + "CmBgYHlhbWwKLSBjYXNzYW5kcmE6CiAgICByZXNvdXJjZXM6CiAgICAgIGxpbWl0czoKICAgICAg" + + "ICBjcHU6ICI4IgogICAgICAgIG1lbW9yeTogODE5Mk1pCiAgICAgIHJlcXVlc3RzOgogICAgICAg" + + "IGNwdTogIjIiCiAgICAgICAgbWVtb3J5OiA0MDk2TWkKYGBgCgpOb3RlOiBgcmVzb3VyY2VQcmVz" + + "ZXRgIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIE5WQ0YgY2Fzc2FuZHJhIHdyYXBwZXIgY2hhcnQu" + + "IFVzZSBleHBsaWNpdCBgcmVzb3VyY2VzYC4KCiMjIEZhaWx1cmU6IFBvZHMgU3R1Y2sgaW4gUGVu" + + "ZGluZwoKIyMjIFN5bXB0b21zCgpgYGB0ZXh0Ck5BTUUgICAgICAgICAgUkVBRFkgICBTVEFUVVMg" + + "ICAgUkVTVEFSVFMgICBBR0UKY2Fzc2FuZHJhLTAgICAwLzEgICAgIFBlbmRpbmcgICAwICAgICAg" + + "ICAgIDEwbQpgYGAKCiMjIyBEaWFnbm9zaXMKCmBgYGJhc2gKIyBDaGVjayBldmVudHMgZm9yIHNj" + + "aGVkdWxpbmcgZmFpbHVyZXMKa3ViZWN0bCBkZXNjcmliZSBwb2QgLW4gPG5hbWVzcGFjZT4gPHBv" + + "ZC1uYW1lPgoKIyBDb21tb24gY2F1c2VzOgojIC0gIjAvMTIgbm9kZXMgYXJlIGF2YWlsYWJsZTog" + + "MTIgbm9kZShzKSBkaWRuJ3QgbWF0Y2ggUG9kJ3Mgbm9kZSBhZmZpbml0eSIKIyAtICIwLzEyIG5v" + + "ZGVzIGFyZSBhdmFpbGFibGU6IDEyIEluc3VmZmljaWVudCBtZW1vcnkiCiMgLSAicGVyc2lzdGVu" + + "dHZvbHVtZWNsYWltIG5vdCBmb3VuZCIKYGBgCgojIyMgRml4ZXMKCjEuICoqTm9kZSBzZWxlY3Rv" + + "ciBtaXNtYXRjaCoqOiBDaGVjayBgbm9kZVNlbGVjdG9yc2AgaW4gZW52aXJvbm1lbnQgZmlsZQoK" + + "ICAgYGBgYmFzaAogICBrdWJlY3RsIGdldCBub2RlcyAtLXNob3ctbGFiZWxzIHwgZ3JlcCBudmNm" + + "CiAgIGBgYAoKMi4gKipTdG9yYWdlIGNsYXNzIG5vdCBmb3VuZCoqOiBDaGVjayBzdG9yYWdlIGNs" + + "YXNzIGV4aXN0cwoKICAgYGBgYmFzaAogICBrdWJlY3RsIGdldCBzdG9yYWdlY2xhc3MKICAgYGBg" + + "CgozLiAqKkluc3VmZmljaWVudCByZXNvdXJjZXMqKjogQ2hlY2sgbm9kZSBjYXBhY2l0eQoKICAg" + + "YGBgYmFzaAogICBrdWJlY3RsIGRlc2NyaWJlIG5vZGUgPG5vZGUtbmFtZT4gfCBncmVwIC1BNSAi" + + "QWxsb2NhdGVkIHJlc291cmNlcyIKICAgYGBgCgojIyBGYWlsdXJlOiBIZWxtIFJlbGVhc2UgaW4g" + + "RmFpbGVkIFN0YXRlCgojIyMgU3ltcHRvbXMKCmBgYGJhc2gKaGVsbSBsaXN0IC1BCiMgU2hvd3Mg" + + "cmVsZWFzZSB3aXRoIFNUQVRVUzogZmFpbGVkCmBgYAoKUmUtcnVubmluZyBgaGVsbWZpbGUgc3lu" + + "Y2AgYXBwZWFycyB0byBzdWNjZWVkIGJ1dCBzZXJ2aWNlcyBkb24ndCB3b3JrIChtaWdyYXRpb25z" + + "IHNraXBwZWQpLgoKIyMjIERpYWdub3NpcwoKYGBgYmFzaApoZWxtIGhpc3RvcnkgPHJlbGVhc2Ut" + + "bmFtZT4gLW4gPG5hbWVzcGFjZT4KYGBgCgojIyMgRml4CgpNdXN0IGRlc3Ryb3kgdGhlIGZhaWxl" + + "ZCByZWxlYXNlIGFuZCByZS1zeW5jIChub3QganVzdCBhcHBseSk6CgpgYGBiYXNoCkhFTE1GSUxF" + + "X0VOVj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9PHJlbGVhc2U+IGRlc3Ryb3kKIyBJ" + + "ZiBuYW1lc3BhY2UgbmVlZHMgY2xlYW51cDoKa3ViZWN0bCBkZWxldGUgbmFtZXNwYWNlIDxuYW1l" + + "c3BhY2U+Cmt1YmVjdGwgY3JlYXRlIG5hbWVzcGFjZSA8bmFtZXNwYWNlPgojIFJlLWNyZWF0ZSBw" + + "dWxsIHNlY3JldCBpZiBuZWVkZWQKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0" + + "b3IgbmFtZT08cmVsZWFzZT4gc3luYwpgYGAKCiMjIEZhaWx1cmU6IEFjY291bnQgQm9vdHN0cmFw" + + "IEpvYiBGYWlsZWQKCiMjIyBTeW1wdG9tcwoKU2VydmljZXMgZGVwbG95IGJ1dCBmdW5jdGlvbnMg" + + "Y2FuJ3QgYmUgY3JlYXRlZC4gRXZlbnRzIHNob3cgYm9vdHN0cmFwIGpvYiBmYWlsdXJlLgoKIyMj" + + "IERpYWdub3NpcwoKYGBgYmFzaAojIENoZWNrIGJvb3RzdHJhcCBqb2Igc3RhdHVzCmt1YmVjdGwg" + + "Z2V0IGpvYnMgLW4gbnZjZgoKIyBHZXQgbG9ncyAoam9iIGF1dG8tZGVsZXRlcyBhZnRlciB+NSBt" + + "aW51dGVzKQprdWJlY3RsIGxvZ3Mgam9iL252Y2YtYXBpLWFjY291bnQtYm9vdHN0cmFwIC1uIG52" + + "Y2YKCiMgQ2hlY2sgQVBJIGxvZ3MKa3ViZWN0bCBsb2dzIC1uIG52Y2YgLWwgYXBwLmt1YmVybmV0" + + "ZXMuaW8vbmFtZT1udmNmLWFwaSAtLXRhaWw9MTAwCmBgYAoKIyMjIENvbW1vbiBDYXVzZXMKCjEu" + + "ICoqV3JvbmcgYmFzZTY0IGNyZWRlbnRpYWxzKio6IENyZWRlbnRpYWxzIGluIGBzZWNyZXRzLzxl" + + "bnY+LXNlY3JldHMueWFtbGAgbXVzdCBiZSBgJG9hdXRodG9rZW46QVBJX0tFWWAgYmFzZTY0LWVu" + + "Y29kZWQsIG5vdCBqdXN0IHRoZSBBUEkga2V5CgogICBgYGBiYXNoCiAgICMgVmVyaWZ5IHlvdXIg" + + "ZW5jb2RlZCBjcmVkZW50aWFsCiAgIGVjaG8gJ1lPVVJfQkFTRTY0X1NUUklORycgfCBiYXNlNjQg" + + "LWQKICAgIyBTaG91bGQgb3V0cHV0OiAkb2F1dGh0b2tlbjpudmFwaS14eHh4eAogICBgYGAKCjIu" + + "ICoqUmVnaXN0cnkgdW5yZWFjaGFibGUqKjogQVBJIGNhbid0IHJlYWNoIHRoZSByZWdpc3RyeSBz" + + "cGVjaWZpZWQgaW4gYGFjY291bnRCb290c3RyYXAucmVnaXN0cnlDcmVkZW50aWFsc2AKCiMjIyBG" + + "aXgKCkZpeCBjcmVkZW50aWFscyBpbiBzZWNyZXRzIGZpbGUsIHRoZW4gcmVjb3ZlciBzZXJ2aWNl" + + "cyB3aXRob3V0IGRlc3Ryb3lpbmcgZGVwZW5kZW5jaWVzOgoKYGBgYmFzaApIRUxNRklMRV9FTlY9" + + "PGVudj4gaGVsbWZpbGUgLS1zZWxlY3RvciByZWxlYXNlLWdyb3VwPXNlcnZpY2VzIGRlc3Ryb3kK" + + "a3ViZWN0bCBkZWxldGUgbmFtZXNwYWNlIG52Y2YgYXBpLWtleXMgZXNzIHNpcyAtLWlnbm9yZS1u" + + "b3QtZm91bmQKa3ViZWN0bCBjcmVhdGUgbmFtZXNwYWNlIG52Y2YgJiYga3ViZWN0bCBjcmVhdGUg" + + "bmFtZXNwYWNlIGFwaS1rZXlzICYmIFwKICBrdWJlY3RsIGNyZWF0ZSBuYW1lc3BhY2UgZXNzICYm" + + "IGt1YmVjdGwgY3JlYXRlIG5hbWVzcGFjZSBzaXMKIyBSZS1jcmVhdGUgcHVsbCBzZWNyZXRzIGlm" + + "IG5lZWRlZApIRUxNRklMRV9FTlY9PGVudj4gaGVsbWZpbGUgLS1zZWxlY3RvciByZWxlYXNlLWdy" + + "b3VwPXNlcnZpY2VzIHN5bmMKYGBgCgojIyBGYWlsdXJlOiBOVkNBIENsZWFudXAgU3R1Y2sgKEZp" + + "bmFsaXplcnMpCgojIyMgU3ltcHRvbXMKCkNvbXB1dGUtcGxhbmUgY2xlYW51cCBoYW5ncy4gTmFt" + + "ZXNwYWNlcwpzdHVjayBpbiBgVGVybWluYXRpbmdgOgoKYGBgYmFzaAprdWJlY3RsIGdldCBucwoj" + + "IG52Y2Etb3BlcmF0b3IgICAgVGVybWluYXRpbmcgICAxMG0KIyBudmNmLWJhY2tlbmQgICAgIFRl" + + "cm1pbmF0aW5nICAgMTBtCmBgYAoKIyMjIEZpeAoKUnVuIHRoaXMgb25seSBhZ2FpbnN0IHRoZSBj" + + "b21wdXRlIGNvbnRleHQsIGFmdGVyIHRoZSBub3JtYWwgY29tcHV0ZS1wbGFuZQp0ZWFyZG93biBo" + + "YXMgZmFpbGVkLiBSZW1vdmUgZmluYWxpemVycyBmcm9tIE5WQ0ZCYWNrZW5kIGN1c3RvbSByZXNv" + + "dXJjZXMgYW5kCmZvcmNlLWRlbGV0ZSBzdHVjayBuYW1lc3BhY2VzOgoKYGBgYmFzaApleHBvcnQg" + + "Q09NUFVURV9DT05URVhUPTxjb21wdXRlLXBsYW5lLWNvbnRleHQ+CgojIFJlbW92ZSBmaW5hbGl6" + + "ZXJzIGZyb20gTlZDRkJhY2tlbmQgcmVzb3VyY2VzCmt1YmVjdGwgLS1jb250ZXh0ICIkQ09NUFVU" + + "RV9DT05URVhUIiBnZXQgbnZjZmJhY2tlbmRzIC1BIC1vIGpzb24gfCBcCiAganEgJy5pdGVtc1td" + + "IHwgLm1ldGFkYXRhLm5hbWVzcGFjZSArICIvIiArIC5tZXRhZGF0YS5uYW1lJyAtciB8IFwKICB4" + + "YXJncyAtSXt9IHNoIC1jICdjb250ZXh0PSIkMSI7IG5zPSIkezIlJS8qfSI7IG5hbWU9IiR7MiMj" + + "Ki99Ijsga3ViZWN0bCAtLWNvbnRleHQgIiRjb250ZXh0IiBwYXRjaCBudmNmYmFja2VuZCAiJG5h" + + "bWUiIC1uICIkbnMiIC0tdHlwZT1tZXJnZSAtcCAie1wibWV0YWRhdGFcIjp7XCJmaW5hbGl6ZXJz" + + "XCI6W119fSInIF8gIiRDT01QVVRFX0NPTlRFWFQiIHt9CgojIEZvcmNlLWRlbGV0ZSBzdHVjayBu" + + "YW1lc3BhY2VzIGJ5IGNsZWFyaW5nIHRoZWlyIGZpbmFsaXplcnMKZm9yIG5zIGluIG52Y2Etb3Bl" + + "cmF0b3IgbnZjZi1iYWNrZW5kOyBkbwogIGt1YmVjdGwgLS1jb250ZXh0ICIkQ09NUFVURV9DT05U" + + "RVhUIiBnZXQgbmFtZXNwYWNlICIkbnMiIC1vIGpzb24gMj4vZGV2L251bGwgfCBcCiAgICBqcSAn" + + "LnNwZWMuZmluYWxpemVycyA9IFtdJyB8IFwKICAgIGt1YmVjdGwgLS1jb250ZXh0ICIkQ09NUFVU" + + "RV9DT05URVhUIiByZXBsYWNlIFwKICAgICAgLS1yYXcgIi9hcGkvdjEvbmFtZXNwYWNlcy8kbnMv" + + "ZmluYWxpemUiIC1mIC0gMj4vZGV2L251bGwKZG9uZQpgYGAKCiMjIEZhaWx1cmU6IE5WQ0EgT3Bl" + + "cmF0b3IgTWlzc2luZyBvciBOb3QgUmVhZHkKCiMjIyBTeW1wdG9tcwoKQWZ0ZXIgY29tcHV0ZS1w" + + "bGFuZSBpbnN0YWxsIGNvbXBsZXRlcywgbm8gYG52Y2Etb3BlcmF0b3JgIERlcGxveW1lbnQgZXhp" + + "c3RzLCBvcgppdCBleGlzdHMgYnV0IHBvZHMgYXJlIG5vdCByZWFkeToKCmBgYGJhc2gKa3ViZWN0" + + "bCAtLWNvbnRleHQgPGNvbXB1dGUtcGxhbmUtY29udGV4dD4gZ2V0IGRlcGxveW1lbnQgbnZjYS1v" + + "cGVyYXRvciBcCiAgLW4gbnZjYS1vcGVyYXRvcgprdWJlY3RsIC0tY29udGV4dCA8Y29tcHV0ZS1w" + + "bGFuZS1jb250ZXh0PiBnZXQgcG9kcyAtbiBudmNhLW9wZXJhdG9yCmBgYAoKIyMjIERpYWdub3Np" + + "cyBhbmQgRml4ZXMKCkZpcnN0IGlkZW50aWZ5IHdoZXRoZXIgdGhlIGluc3RhbGxhdGlvbiB1c2Vk" + + "IHRoZSBIZWxtZmlsZSB2YWx1ZXMgZmxvdyBvciB0aGUKQ0xJIHByb2ZpbGUgZmxvdy4gUmUtcnVu" + + "IG9ubHkgdGhhdCBmbG93J3MgcmVnaXN0cmF0aW9uIGFuZCBpbnN0YWxsYXRpb24gc3RlcHMKZnJv" + + "bSBbU3BsaXQgQ29tcHV0ZS1QbGFuZSBJbnN0YWxsYXRpb25dKGNvbXB1dGUtcGxhbmUtaW5zdGFs" + + "bGF0aW9uLm1kKS4gRG8gbm90CnN1YnN0aXR1dGUgb25lIGhhbmRvZmYgZm9yIHRoZSBvdGhlci4K" + + "CklmIGluc3RhbGxhdGlvbiBzdWNjZWVkcyBidXQgcG9kcyBzdGlsbCBmYWlsLCBpbnNwZWN0IHRo" + + "ZSBjb21wdXRlIGNvbnRleHQ6CgpgYGBiYXNoCmt1YmVjdGwgLS1jb250ZXh0IDxjb21wdXRlLXBs" + + "YW5lLWNvbnRleHQ+IGRlc2NyaWJlIGRlcGxveSBudmNhLW9wZXJhdG9yIFwKICAtbiBudmNhLW9w" + + "ZXJhdG9yCmt1YmVjdGwgLS1jb250ZXh0IDxjb21wdXRlLXBsYW5lLWNvbnRleHQ+IGxvZ3MgZGVw" + + "bG95bWVudC9udmNhLW9wZXJhdG9yIFwKICAtbiBudmNhLW9wZXJhdG9yIC0tdGFpbD0yMDAKa3Vi" + + "ZWN0bCAtLWNvbnRleHQgPGNvbXB1dGUtcGxhbmUtY29udGV4dD4gZ2V0IG52Y2ZiYWNrZW5kIC1u" + + "IG52Y2Etb3BlcmF0b3IKYGBgCgpGb3IgcHJpdmF0ZSByZWdpc3RyeSBmYWlsdXJlcywgdmVyaWZ5" + + "IHRoYXQgdGhlIHB1bGwgc2VjcmV0IGV4aXN0cyBpbgpgbnZjYS1vcGVyYXRvcmAuIFRoZSBjaGFy" + + "dCBhbmQgb3BlcmF0b3IgbWlycm9yIGl0IHRvIGBudmNhLXN5c3RlbWA7IGRvIG5vdCB1c2UgYQpi" + + "cm9hZGVyIG1hbnVhbCBuYW1lc3BhY2UgbG9vcC4gU2VlCltwdWxsLXNlY3JldHMubWRdKHB1bGwt" + + "c2VjcmV0cy5tZCNjb21wdXRlLXBsYW5lLXNlY3JldCkuCgojIyBGYWlsdXJlOiBHYXRld2F5IEVu" + + "ZHBvaW50IENoYW5nZWQKCiMjIyBTeW1wdG9tcwoKUmVxdWVzdHMgdGhyb3VnaCB0aGUgY29uZmln" + + "dXJlZCByb3V0ZSBkb21haW4gZmFpbCBhZnRlciB0aGUgR2F0ZXdheSBvciBpdHMgbG9hZCBiYWxh" + + "bmNlciBpcyByZXBsYWNlZC4gVGhlIEdhdGV3YXkgcmVwb3J0cyBhIG5ldyBlbmRwb2ludC4KCiMj" + + "IyBEaWFnbm9zaXMKCmBgYGJhc2gKR0FURVdBWV9BRERSPSQoa3ViZWN0bCAtLWNvbnRleHQgPGNv" + + "bnRyb2wtcGxhbmUtY29udGV4dD4gZ2V0IGdhdGV3YXkgXAogIG52Y2YtZ2F0ZXdheSAtbiBlbnZv" + + "eS1nYXRld2F5IFwKICAtbyBqc29ucGF0aD0ney5zdGF0dXMuYWRkcmVzc2VzWzBdLnZhbHVlfScp" + + "CnRlc3QgLW4gIiRHQVRFV0FZX0FERFIiCmRpZyArc2hvcnQgImFwaS48ZG9tYWluPiIKY3VybCAt" + + "SCAiSG9zdDogYXBpLjxkb21haW4+IiAiaHR0cDovLyRHQVRFV0FZX0FERFIvaGVhbHRoIgoKIyBD" + + "aGVjayBkaXJlY3QgYWRkcmVzcyBmaWVsZHMgdXNlZCBieSBhIHNwbGl0IGRlcGxveW1lbnQKZ3Jl" + + "cCBudmNmTmF0c1NlcnZpY2VVUkwgZGVwbG95L3N0YWNrcy9zZWxmLW1hbmFnZWQvZW52aXJvbm1l" + + "bnRzLzxlbnY+LnlhbWwKZ3JlcCAtRSAnaWNtc1NlcnZpY2V8cmV2YWxTZXJ2aWNlfG5hdHMnIFwK" + + "ICBkZXBsb3kvc3RhY2tzL252Y2YtY29tcHV0ZS1wbGFuZS9lbnZpcm9ubWVudHMvPGVudj4ueWFt" + + "bApgYGAKCiMjIyBGaXgKCktlZXAgYGdsb2JhbC5kb21haW5gLCByb3V0ZSBob3N0bmFtZXMsIGFu" + + "ZCBIb3N0IG92ZXJyaWRlcyB1bmNoYW5nZWQuIFVwZGF0ZSBETlMKb3IgdGhlIGRpcmVjdCBjbGll" + + "bnQgZGVzdGluYXRpb24uIEZvciBzcGxpdCBkZXBsb3ltZW50cywgdXBkYXRlIG9ubHkgZGlyZWN0" + + "CkdhdGV3YXktYWRkcmVzcyBmaWVsZHMgYW5kIHJlZnJlc2ggcmVnaXN0cmF0aW9uIGFuZCBpbnN0" + + "YWxsYXRpb24gdGhyb3VnaCB0aGUKc2FtZSBzZWxlY3RlZCBoYW5kb2ZmLiBTZWUKW0V4YW1wbGUg" + + "NF0oLi4vZXhhbXBsZXMubWQjZXhhbXBsZS00LXJlY292ZXItZnJvbS1hLWdhdGV3YXktZW5kcG9p" + + "bnQtY2hhbmdlKS4KCiMjIFVzZWZ1bCBOYW1lc3BhY2UtdG8tU2VydmljZSBNYXBwaW5nCgpRdWlj" + + "ayByZWZlcmVuY2UgZm9yIHdoaWNoIHNlcnZpY2VzIHJ1biBpbiB3aGljaCBuYW1lc3BhY2U6Cgp8" + + "IE5hbWVzcGFjZSB8IFNlcnZpY2VzIHwKfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18CnwgbmF0cy1z" + + "eXN0ZW0gfCBuYXRzIHwKfCBjYXNzYW5kcmEtc3lzdGVtIHwgY2Fzc2FuZHJhIHwKfCB2YXVsdC1z" + + "eXN0ZW0gfCBvcGVuYmFvLXNlcnZlciB8CnwgbnZjZiB8IGFwaSwgaW52b2NhdGlvbi1zZXJ2aWNl" + + "LCBncnBjLXByb3h5LCBub3Rhcnktc2VydmljZSwgcmV2YWwsIGxsbS1yZXF1ZXN0LXJvdXRlciwg" + + "bGxtLWFwaS1nYXRld2F5IHwKfCBhcGkta2V5cyB8IGFwaS1rZXlzLCBhZG1pbi1pc3N1ZXItcHJv" + + "eHkgfAp8IGVzcyB8IGVzcy1hcGkgfAp8IHNpcyB8IHNpcyB8CnwgZW52b3ktZ2F0ZXdheS1zeXN0" + + "ZW0gfCBlbnZveSBnYXRld2F5IChpbmdyZXNzIGNvbnRyb2xsZXIpIHwKfCBlbnZveS1nYXRld2F5" + + "IHwgZ2F0ZXdheSByZXNvdXJjZSArIHJvdXRlcyB8ClBLBwi1enA7tTAAALUwAABQSwMEFAAIAAAA" + + "AAAhAAAAAAAAAAAAAAAAAEQACQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbi9y" + + "ZWZlcmVuY2VzL2hlbG1maWxlLXN0cnVjdHVyZS5tZFVUBQABAKbOEiMgSGVsbWZpbGUgU3RydWN0" + + "dXJlIFJlZmVyZW5jZQoKIyMgRGlyZWN0b3J5IExheW91dAoKYGBgYmFzaApudmNmLXNlbGYtbWFu" + + "YWdlZC1zdGFjay8KfC0tIGhlbG1maWxlLmQvCnwgICB8LS0gMDEtZGVwZW5kZW5jaWVzLnlhbWwu" + + "Z290bXBsICAjIE5BVFMsIENhc3NhbmRyYSwgT3BlbkJhbwp8ICAgfC0tIDAyLWNvcmUueWFtbC5n" + + "b3RtcGwgICAgICAgICAgIyBOVkNGIHNlcnZpY2VzICsgaW5ncmVzcwp8ICAgYC0tIDAzLW9ic2Vy" + + "dmFiaWxpdHkueWFtbC5nb3RtcGwgIyBPYnNlcnZhYmlsaXR5IHN0YWNrIChvcHRpb25hbCkKfC0t" + + "IGVudmlyb25tZW50cy8KfCAgIHwtLSBiYXNlLnlhbWwgICAgICAgICAgICAgICAgICAgICMgRGVm" + + "YXVsdCB2YWx1ZXMgKGFsbCBlbnZpcm9ubWVudHMpCnwgICBgLS0gPGVudi1uYW1lPi55YW1sICAg" + + "ICAgICAgICAgICAjIFBlci1lbnZpcm9ubWVudCBvdmVycmlkZXMKfC0tIHNlY3JldHMvCnwgICBg" + + "LS0gPGVudi1uYW1lPi1zZWNyZXRzLnlhbWwgICAgICAjIFNlbnNpdGl2ZSB2YWx1ZXMgKHJlZ2lz" + + "dHJ5IGNyZWRzLCBwYXNzd29yZHMpCmAtLSBnbG9iYWwueWFtbC5nb3RtcGwgICAgICAgICAgICAg" + + "ICAjIEdvIHRlbXBsYXRlIHRoYXQgY29uc3RydWN0cyBwZXItY2hhcnQgdmFsdWVzCgpudmNmLWNv" + + "bXB1dGUtcGxhbmUtc3RhY2svCnwtLSBoZWxtZmlsZS5kLwp8ICAgfC0tIDAxLWRlcGVuZGVuY2ll" + + "cy55YW1sLmdvdG1wbCAgIyBDb21wdXRlIHBsYW5lIGRlcGVuZGVuY3kgY29tcG9uZW50cwp8ICAg" + + "YC0tIDAyLW52Y2EueWFtbC5nb3RtcGwgICAgICAgICAgIyBudmNhLW9wZXJhdG9yIGNoYXJ0IGFu" + + "ZCBudmNhIGNvbmZpZ3VyYXRpb24KfC0tIGVudmlyb25tZW50cy8KfCAgIHwtLSBiYXNlLnlhbWwg" + + "ICAgICAgICAgICAgICAgICAgICMgRGVmYXVsdCB2YWx1ZXMgKGFsbCBlbnZpcm9ubWVudHMpCnwg" + + "ICBgLS0gPGVudi1uYW1lPi55YW1sICAgICAgICAgICAgICAjIFBlci1lbnZpcm9ubWVudCBvdmVy" + + "cmlkZXMKYC0tIGdsb2JhbC55YW1sLmdvdG1wbCAgICAgICAgICAgICAgICMgR28gdGVtcGxhdGUg" + + "dGhhdCBjb25zdHJ1Y3RzIHBlci1jaGFydCB2YWx1ZXMKYGBgCgpUaGVzZSBzdGFja3MgaGF2ZSBz" + + "ZXBhcmF0ZSBlbnZpcm9ubWVudHMgYW5kIGNsdXN0ZXIgY29udGV4dHMuIFRoZSBIZWxtZmlsZQp2" + + "YWx1ZXMgZmxvdyBhdXRob3JzIGJvdGggZW52aXJvbm1lbnQgZmlsZXMuIFRoZSBDTEkgcHJvZmls" + + "ZSBmbG93IGluc3RlYWQgdXNlcwp0aGUgQ0xJLWdlbmVyYXRlZCBjb250cm9sLXBsYW5lIHByb2Zp" + + "bGUgYXMgaXRzIGVuZHBvaW50IHNvdXJjZS4gRG8gbm90IG1peCB0aGUKaGFuZG9mZnMuIFNlZSBb" + + "U3BsaXQgQ29tcHV0ZS1QbGFuZSBJbnN0YWxsYXRpb25dKGNvbXB1dGUtcGxhbmUtaW5zdGFsbGF0" + + "aW9uLm1kKS4KCiMjIEdvdG1wbCBGaWxlcyBhbmQgVGhlaXIgUmVsZWFzZXMKCiMjIyAwMS1kZXBl" + + "bmRlbmNpZXMueWFtbC5nb3RtcGwKCnwgUmVsZWFzZSB8IENoYXJ0IHwgTmFtZXNwYWNlIHwgTm90" + + "ZXMgfAp8LS0tLS0tLS0tfC0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLXwKfCBuYXRzIHwgaGVs" + + "bS1udmNmLW5hdHMgfCBuYXRzLXN5c3RlbSB8IE1lc3NhZ2luZyB8Cnwgb3BlbmJhby1zZXJ2ZXIg" + + "fCBoZWxtLW52Y2Ytb3BlbmJhby1zZXJ2ZXIgfCB2YXVsdC1zeXN0ZW0gfCBTZWNyZXRzIG1hbmFn" + + "ZW1lbnQsIGRlcGVuZHMgb24gbmF0cyB8CnwgY2Fzc2FuZHJhIHwgaGVsbS1udmNmLWNhc3NhbmRy" + + "YSB8IGNhc3NhbmRyYS1zeXN0ZW0gfCBEYXRhYmFzZSB8CgpVc2VzIGA8PDogKmRlcGVuZGVuY3lg" + + "IHRlbXBsYXRlIGluaGVyaXRhbmNlIHdpdGggYHJlbGVhc2UtZ3JvdXA6IGRlcGVuZGVuY2llc2Ag" + + "bGFiZWwuCgojIyMgMDItY29yZS55YW1sLmdvdG1wbAoKfCBSZWxlYXNlIHwgQ2hhcnQgfCBOYW1l" + + "c3BhY2UgfCBMYWJlbCB8CnwtLS0tLS0tLS18LS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tfAp8" + + "IGFwaS1rZXlzIHwgaGVsbS1udmNmLWFwaS1rZXlzIHwgYXBpLWtleXMgfCBzZXJ2aWNlcyB8Cnwg" + + "c2lzIHwgaGVsbS1udmNmLXNpcyB8IHNpcyB8IHNlcnZpY2VzIHwKfCBhcGkgfCBoZWxtLW52Y2Yt" + + "YXBpIHwgbnZjZiB8IHNlcnZpY2VzIHwKfCBpbnZvY2F0aW9uLXNlcnZpY2UgfCBoZWxtLW52Y2Yt" + + "aW52b2NhdGlvbi1zZXJ2aWNlIHwgbnZjZiB8IHNlcnZpY2VzIHwKfCBncnBjLXByb3h5IHwgaGVs" + + "bS1udmNmLWdycGMtcHJveHkgfCBudmNmIHwgc2VydmljZXMgfAp8IGVzcy1hcGkgfCBoZWxtLW52" + + "Y2YtZXNzLWFwaSB8IGVzcyB8IHNlcnZpY2VzIHwKfCBub3Rhcnktc2VydmljZSB8IGhlbG0tbnZj" + + "Zi1ub3Rhcnktc2VydmljZSB8IG52Y2YgfCBzZXJ2aWNlcyB8CnwgcmV2YWwgfCBoZWxtLXJldmFs" + + "IHwgbnZjZiB8IHNlcnZpY2VzIHwKfCBsbG0tcmVxdWVzdC1yb3V0ZXIgfCBudmNmL2hlbG0tbnZj" + + "Zi1sbG0tcmVxdWVzdC1yb3V0ZXIgfCBudmNmIHwgc2VydmljZXMgfAp8IGxsbS1hcGktZ2F0ZXdh" + + "eSB8IG52Y2YvaGVsbS1udmNmLWxsbS1hcGktZ2F0ZXdheSB8IG52Y2YgfCBzZXJ2aWNlcyB8Cnwg" + + "YWRtaW4taXNzdWVyLXByb3h5IHwgaGVsbS1hZG1pbi10b2tlbi1pc3N1ZXItcHJveHkgfCBhcGkt" + + "a2V5cyB8IChubyByZWxlYXNlLWdyb3VwIGxhYmVsKSB8CnwgaW5ncmVzcyB8IG52Y2YtZ2F0ZXdh" + + "eS1yb3V0ZXMgfCBlbnZveS1nYXRld2F5LXN5c3RlbSB8IGluZ3Jlc3MgfAoKTW9zdCBzZXJ2aWNl" + + "cyB1c2UgYGluaGVyaXQ6IFt7dGVtcGxhdGU6IHNlcnZpY2V9XWAuIExMTSByZWxlYXNlcyB1c2Ug" + + "T0NJIGNoYXJ0cyBmcm9tIHRoZSBgbnZjZmAgcmVwb3NpdG9yeSB3aXRoIHN0YW5kYWxvbmUgYHZh" + + "bHVlczogWy4uL2dsb2JhbC55YW1sLmdvdG1wbF1gIGJsb2NrczsgdGhleSBhcmUgZ2F0ZWQgb24g" + + "YGFkZG9ucy5sbG0uZW5hYmxlZGAuIGBhZG1pbi1pc3N1ZXItcHJveHlgIGFuZCBgaW5ncmVzc2Ag" + + "aGF2ZSBzdGFuZGFsb25lIGB2YWx1ZXM6YCBibG9ja3MuCgojIyMgMDMtb2JzZXJ2YWJpbGl0eS55" + + "YW1sLmdvdG1wbAoKfCBSZWxlYXNlIHwgQ2hhcnQgfCBOYW1lc3BhY2UgfCBMYWJlbCB8CnwtLS0t" + + "LS0tLS18LS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tfAp8IChvYnNlcnZhYmlsaXR5IHJlbGVh" + + "c2VzKSB8ICh2YXJpb3VzKSB8IG9ic2VydmFiaWxpdHkgfCBvYnNlcnZhYmlsaXR5IHwKCkdhdGVk" + + "IG9uIG9ic2VydmFiaWxpdHktc3BlY2lmaWMgZmxhZ3MgaW4gdGhlIGVudmlyb25tZW50IGZpbGUu" + + "IFNraXBwZWQgaWYgZGlzYWJsZWQuCgojIyBUZW1wbGF0ZSBJbmhlcml0YW5jZQoKIyMjIGA8PDog" + + "KmRlcGVuZGVuY3lgIChZQU1MIG1lcmdlKQoKVXNlZCBpbiBgMDEtZGVwZW5kZW5jaWVzLnlhbWwu" + + "Z290bXBsYC4gTWVyZ2VzIHRoZSB0ZW1wbGF0ZSdzIHByb3BlcnRpZXMgaW50byB0aGUgcmVsZWFz" + + "ZS4KCioqR290Y2hhKio6IFlBTUwgbWVyZ2UgcmVwbGFjZXMgbGlzdHMuIElmIHlvdSBhZGQgYSBg" + + "dmFsdWVzOmAga2V5IHRvIHRoZSByZWxlYXNlLCBpdCAqKnJlcGxhY2VzKiogdGhlIHRlbXBsYXRl" + + "J3MgYHZhbHVlczpgIGxpc3QgZW50aXJlbHkuIFlvdSBtdXN0IHJlLWluY2x1ZGUgYWxsIHRlbXBs" + + "YXRlIHZhbHVlczoKCkluIHRoZSB0ZW1wbGF0ZSBiZWxvdywgYDxwcml2YXRlLXZhbHVlcz5gIHJl" + + "ZmVycyB0byB0aGUgYHNlY3JldHMvYCBkaXJlY3RvcnkgYXQgdGhlIGhlbG1maWxlIHN0YWNrIHJv" + + "b3QuCgpgYGB5YW1sCiMgVGVtcGxhdGUgZGVmaW5lczoKdGVtcGxhdGVzOgogIGRlcGVuZGVuY3k6" + + "ICZkZXBlbmRlbmN5CiAgICBjaGFydDogbnZjZi9oZWxtLW52Y2Yte3sgLlJlbGVhc2UuTmFtZSB9" + + "fQogICAgdmFsdWVzOgogICAgICAtIC4uL2dsb2JhbC55YW1sLmdvdG1wbAogICAgICAtIC4uLzxw" + + "cml2YXRlLXZhbHVlcz4ve3sgcmVxdWlyZWRFbnYgIkhFTE1GSUxFX0VOViIgfX0tc2VjcmV0cy55" + + "YW1sCgojIFdoZW4gb3ZlcnJpZGluZywgTVVTVCByZS1pbmNsdWRlIGJvdGg6Ci0gbmFtZTogY2Fz" + + "c2FuZHJhCiAgPDw6ICpkZXBlbmRlbmN5CiAgdmFsdWVzOgogICAgLSAuLi9nbG9iYWwueWFtbC5n" + + "b3RtcGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBNdXN0" + + "IHJlLWluY2x1ZGUKICAgIC0gLi4vPHByaXZhdGUtdmFsdWVzPi97eyByZXF1aXJlZEVudiAiSEVM" + + "TUZJTEVfRU5WIiB9fS1zZWNyZXRzLnlhbWwgICAjIE11c3QgcmUtaW5jbHVkZQogICAgLSBjYXNz" + + "YW5kcmE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg" + + "ICAgICAgICMgWW91ciBvdmVycmlkZQogICAgICAgIHJlc291cmNlczoKICAgICAgICAgIGxpbWl0" + + "czoKICAgICAgICAgICAgbWVtb3J5OiA4MTkyTWkKYGBgCgojIyMgYGluaGVyaXRgIChIZWxtZmls" + + "ZSBuYXRpdmUpCgpVc2VkIGluIGAwMi1jb3JlLnlhbWwuZ290bXBsYC4gSGVsbWZpbGUncyBuYXRp" + + "dmUgaW5oZXJpdGFuY2UgbWVjaGFuaXNtLgoKYGBgeWFtbAotIG5hbWU6IGFwaQogIHZlcnNpb246" + + "IDEuNi4wCiAgbmFtZXNwYWNlOiBudmNmCiAgaW5oZXJpdDoKICAgIC0gdGVtcGxhdGU6IHNlcnZp" + + "Y2UKYGBgCgpXaGVuIGFkZGluZyBgdmFsdWVzOmAgdG8gYW4gaW5oZXJpdGVkIHJlbGVhc2UsIHlv" + + "dSBhbHNvIG5lZWQgdG8gcmUtaW5jbHVkZSB0aGUgdGVtcGxhdGUncyB2YWx1ZXMgZmlsZXMgc2lu" + + "Y2UgYHZhbHVlc2AgaXMgYSBsaXN0IHRoYXQgZ2V0cyByZXBsYWNlZC4KCiMjIFZhbHVlcyBQcmVj" + + "ZWRlbmNlCgpGcm9tIGxvd2VzdCB0byBoaWdoZXN0IHByaW9yaXR5OgoKMS4gYGVudmlyb25tZW50" + + "cy9iYXNlLnlhbWxgIC0tIGRlZmF1bHRzIHNoYXJlZCBhY3Jvc3MgYWxsIGVudmlyb25tZW50cwoy" + + "LiBgZW52aXJvbm1lbnRzLzxlbnY+LnlhbWxgIC0tIHBlci1lbnZpcm9ubWVudCBvdmVycmlkZXMK" + + "My4gYGdsb2JhbC55YW1sLmdvdG1wbGAgLS0gR28gdGVtcGxhdGUgcHJvY2Vzc2luZyAoY29uc3Ry" + + "dWN0cyBjaGFydC1zcGVjaWZpYyBzdHJ1Y3R1cmUpCjQuIGA8cHJpdmF0ZS12YWx1ZXM+LzxlbnY+" + + "LXNlY3JldHMueWFtbGAgLS0gc2Vuc2l0aXZlIHZhbHVlcwo1LiBJbmxpbmUgYHZhbHVlczpgIGJs" + + "b2NrcyBvbiByZWxlYXNlcyAtLSBoaWdoZXN0IHByZWNlZGVuY2UKCiMjIFdoYXQgZ2xvYmFsLnlh" + + "bWwuZ290bXBsIFBhc3NlcyBUaHJvdWdoCgpgZ2xvYmFsLnlhbWwuZ290bXBsYCByZWFkcyBmcm9t" + + "IGAuVmFsdWVzYCAodGhlIG1lcmdlZCBlbnZpcm9ubWVudCArIGVudi1zcGVjaWZpYyBZQU1MKSBh" + + "bmQgY29uc3RydWN0cyBjaGFydC1zcGVjaWZpYyB2YWx1ZXMuIEl0IG9ubHkgcGFzc2VzIHRocm91" + + "Z2gga2V5cyBpdCBleHBsaWNpdGx5IHJlZmVyZW5jZXM6CgojIyMgQ2Fzc2FuZHJhCgotIGBjYXNz" + + "YW5kcmEucmVwbGljYUNvdW50YAotIGBjYXNzYW5kcmEuaW1hZ2UuKmAgKHJlZ2lzdHJ5LCByZXBv" + + "c2l0b3J5KQotIGBjYXNzYW5kcmEubWlncmF0aW9ucy5pbWFnZS4qYAotIGBjYXNzYW5kcmEucGVy" + + "c2lzdGVuY2Uuc2l6ZWAKLSBgY2Fzc2FuZHJhLm5vZGVTZWxlY3RvcmAgKGlmIGBnbG9iYWwubm9k" + + "ZVNlbGVjdG9ycy5lbmFibGVkYCkKLSBgY2Fzc2FuZHJhLmdsb2JhbC5kZWZhdWx0U3RvcmFnZUNs" + + "YXNzYAoKIyMjIE5BVFMKCi0gYG5hdHMuY29udGFpbmVyLmltYWdlLipgCi0gYG5hdHMucmVsb2Fk" + + "ZXIuaW1hZ2UuKmAKLSBgbmF0cy5uYXRzQm94LmNvbnRhaW5lci5pbWFnZS4qYAotIGBuYXRzLmNv" + + "bmZpZy5qZXRzdHJlYW0uZmlsZVN0b3JlLnB2Yy5zdG9yYWdlQ2xhc3NOYW1lYAotIGBuYXRzLnBv" + + "ZFRlbXBsYXRlLm1lcmdlLnNwZWMubm9kZVNlbGVjdG9yYCAoaWYgZW5hYmxlZCkKCiMjIyBPcGVu" + + "QmFvCgotIGBvcGVuYmFvLm1pZ3JhdGlvbnMuaW1hZ2UuKmAgYW5kIGBvcGVuYmFvLm1pZ3JhdGlv" + + "bnMuZW52YAotIGBvcGVuYmFvLmluamVjdG9yLmltYWdlLipgCi0gYG9wZW5iYW8uc2VydmVyLmlt" + + "YWdlLipgCi0gYG9wZW5iYW8uc2VydmVyLmRhdGFTdG9yYWdlLipgCi0gTm9kZSBzZWxlY3RvcnMg" + + "KGlmIGVuYWJsZWQpCgojIyMgU2VydmljZXMgKEFQSSwgU0lTLCBldGMuKQoKLSBgPHNlcnZpY2U+" + + "LmltYWdlLipgIChyZWdpc3RyeSwgcmVwb3NpdG9yeSkKLSBgPHNlcnZpY2U+Lm5vZGVTZWxlY3Rv" + + "cmAgKGlmIGVuYWJsZWQpCi0gYDxzZXJ2aWNlPi5lbnYuKmAgKG9ic2VydmFiaWxpdHkgc2V0dGlu" + + "Z3MpCgojIyMgTExNIEZ1bmN0aW9uIEVuYWJsZW1lbnQKCkVuYWJsZSB0aGUgTExNIGFkZG9uIGJl" + + "Zm9yZSBjcmVhdGluZyBvciBpbnZva2luZyBmdW5jdGlvbnMgd2l0aApgZnVuY3Rpb25UeXBlOiAi" + + "TExNImAuIFRoZSBhZGRvbiBkZXBsb3lzIGBsbG0tcmVxdWVzdC1yb3V0ZXJgIGFuZApgbGxtLWFw" + + "aS1nYXRld2F5YCwgYWRkcyB0aGUgYGxsbS5pbnZvY2F0aW9uLjxkb21haW4+YCByb3V0ZSB3aGVu" + + "IEdhdGV3YXkgQVBJCmluZ3Jlc3MgaXMgZW5hYmxlZCwgYW5kIGNvbmZpZ3VyZXMgd29ya2VycyB0" + + "byB1c2UgdGhlIExMTSBzaWRlY2FyLiBUaGUgSGVsbWZpbGUKY29uZGl0aW9uIGlzIGBhZGRvbnMu" + + "bGxtLmVuYWJsZWRgLiBEbyBub3QgdXNlIHRoZSBvYnNvbGV0ZSBgbGxtLmVuYWJsZWRgIHBhdGgu" + + "CgpGb3IgYSBzaW5nbGUtbm9kZSBpc29sYXRlZCB0ZXN0IGNsdXN0ZXIsIGFkZCB0aGlzIGNvbmZp" + + "Z3VyYXRpb24gdG8KYGVudmlyb25tZW50cy88ZW52Pi55YW1sYCBiZWZvcmUgYXBwbHlpbmcgdGhl" + + "IHN0YWNrOgoKYGBgeWFtbAphZGRvbnM6CiAgbGxtOgogICAgZW5hYmxlZDogdHJ1ZQogICAgZ2F0" + + "ZXdheToKICAgICAgcmVwbGljYUNvdW50OiAxCiAgICAgIG1ldHJpY3M6CiAgICAgICAgc2Vydmlj" + + "ZU1vbml0b3I6CiAgICAgICAgICBlbmFibGVkOiBmYWxzZQogICAgcmVxdWVzdFJvdXRlcjoKICAg" + + "ICAgcmVwbGljYUNvdW50OiAxCiAgICAgIG1ldHJpY3M6CiAgICAgICAgc2VydmljZU1vbml0b3I6" + + "CiAgICAgICAgICBlbmFibGVkOiBmYWxzZQoKYWdlbnRDb25maWc6CiAgbWVyZ2VDb25maWc6IHwK" + + "ICAgIGNsdXN0ZXI6CiAgICAgIHZhbGlkYXRpb25Qb2xpY3k6CiAgICAgICAgbmFtZTogVW5yZXN0" + + "cmljdGVkCiAgICB3b3JrbG9hZDoKICAgICAgc3RhcmdhdGVRVUlDSW5zZWN1cmU6IHRydWUKYGBg" + + "CgpVc2UgYHJlcGxpY2FDb3VudDogMWAgb25seSBmb3IgbG9jYWwgb3Igc2luZ2xlLW5vZGUgdGVz" + + "dCBjbHVzdGVycy4gVGhlIGJ1bmRsZWQKTlZDRiBBUEkgY3VycmVudGx5IHNlcnZlcyBwbGFpbnRl" + + "eHQgZ1JQQyBvbiBwb3J0IDkwOTAsIHNvIHRoZSBzZWxmLW1hbmFnZWQgc3RhY2sKZGVmYXVsdHMg" + + "dGhlIExMTSBBUEkgR2F0ZXdheSBhdXRoZW50aWNhdGlvbiBob3AgdG8gcGxhaW50ZXh0LiBTZXQK" + + "YGFkZG9ucy5sbG0uZ2F0ZXdheS5hdXRoLmdycGNJbnNlY3VyZTogZmFsc2VgIG9ubHkgd2l0aCBh" + + "IFRMUy1jYXBhYmxlIE5WQ0YgQVBJLgoKV29ya2VyLXRvLXJvdXRlciB0cmFuc3BvcnQgaXMgc2Vw" + + "YXJhdGUuIEZvciBzaGFyZWQgb3IgcHJvZHVjdGlvbiBjbHVzdGVycywgdXNlCnRoZSByZXF1aXJl" + + "ZCByZXBsaWNhIGNvdW50IGFuZCB0aGUgbWFuYWdlZCBUTFMgY29uZmlndXJhdGlvbi4gVGhlCmB3" + + "b3JrbG9hZC5zdGFyZ2F0ZVFVSUNJbnNlY3VyZWAgc2V0dGluZyBlbmFibGVzIHBsYWludGV4dCB3" + + "b3JrZXIgdHJhbnNwb3J0IGFuZAptdXN0IG5vdCBiZSB1c2VkIGluIHByb2R1Y3Rpb24uCgpUaGUg" + + "cmVxdWVzdCByb3V0ZXIgdXNlcyBgcG93ZXItb2YtdHdvYCB3aGVuIG5vIGxvYWQtYmFsYW5jZXIg" + + "Y29uZmlndXJhdGlvbiBpcwpzZXQuIENvbmZpZ3VyZSBvdGhlciByb3V0aW5nIG1ldGhvZHMgd2l0" + + "aCB0aGUKW0xMTSBSZXF1ZXN0IFJvdXRlciBMb2FkIEJhbGFuY2luZ10oaHR0cHM6Ly9naXRodWIu" + + "Y29tL05WSURJQS9udmNmL2Jsb2IvbWFpbi9kb2NzL3VzZXIvbGxtLXJlcXVlc3Qtcm91dGVyLWxv" + + "YWQtYmFsYW5jaW5nLm1kKQpndWlkZS4KCklmIHRoZSBzaWRlY2FyIGltYWdlIGlzIG1pcnJvcmVk" + + "IG91dHNpZGUgdGhlIHN0YWNrJ3MgZGVmYXVsdCBpbWFnZSByZWdpc3RyeSBhbmQKcmVwb3NpdG9y" + + "eSwgc2V0IHRoZSBnZW5lcmF0ZWQgd29ya2VyIHNpZGVjYXIgaW1hZ2UgZXhwbGljaXRseToKCmBg" + + "YHlhbWwKYXBpOgogIHJlbW90ZUNvbmZpZzoKICAgIGNvbmZpZ0RhdGE6CiAgICAgIG52Y2Y6CiAg" + + "ICAgICAgc2lkZWNhcnM6CiAgICAgICAgICBsbG0tcm91dGVyLWNsaWVudC1pbWFnZTogPHJlZ2lz" + + "dHJ5Pi88cmVwb3NpdG9yeT4vcHlsb246MC4xNC4xCmBgYAoKVGhlIGxlZ2FjeSBgYXBpLmVudi5O" + + "VkNGX1NJREVDQVJTX0xMTV9ST1VURVJfQ0xJRU5UX0lNQUdFYCBwYXRoIGlzIGRlcHJlY2F0ZWQu" + + "ClRoZSBzdGFjayB0cmFuc2xhdGVzIGl0IGZvciBvbmUgY29tcGF0aWJpbGl0eSB3aW5kb3csIGJ1" + + "dCBuZXcgY29uZmlndXJhdGlvbnMKbXVzdCB1c2UgdGhlIHJlbW90ZS1jb25maWcgcGF0aC4gQ29u" + + "ZmxpY3RpbmcgdmFsdWVzIGZhaWwgcmVuZGVyaW5nLgoKUmVuZGVyIGFuZCBhcHBseSB0aGUgdXBk" + + "YXRlZCBjb250cm9sLXBsYW5lIGVudmlyb25tZW50LCB0aGVuIHJlZnJlc2ggZXZlcnkKcmVnaXN0" + + "ZXJlZCBjb21wdXRlIHBsYW5lIHVzaW5nIHRoZSBzYW1lIGhhbmRvZmYgdXNlZCBmb3IgaXRzIGlu" + + "c3RhbGxhdGlvbiBzbwpOVkNBIHJlY2VpdmVzIGBhZ2VudENvbmZpZy5tZXJnZUNvbmZpZ2A6Cgpg" + + "YGBiYXNoCkhFTE1GSUxFX0VOVj08ZW52PiBoZWxtZmlsZSB0ZW1wbGF0ZQpIRUxNRklMRV9FTlY9" + + "PGVudj4gaGVsbWZpbGUgc3luYwpgYGAKClVzZSB0aGUgY29tcGxldGUgY29tcHV0ZS1wbGFuZSBp" + + "bnN0YWxsIGNvbW1hbmQgZnJvbQpbU3BsaXQgQ29tcHV0ZS1QbGFuZSBJbnN0YWxsYXRpb25dKGNv" + + "bXB1dGUtcGxhbmUtaW5zdGFsbGF0aW9uLm1kKS4gQQpDTEktcHJvZmlsZSBpbnN0YWxsYXRpb24g" + + "bXVzdCByZW1haW4gcHJvZmlsZS1kcml2ZW47IGEgSGVsbWZpbGUgaW5zdGFsbGF0aW9uCm11c3Qg" + + "cmVtYWluIHZhbHVlcy1kcml2ZW4uCgpFeGlzdGluZyBMTE0gZnVuY3Rpb24gdmVyc2lvbnMgcmV0" + + "YWluIHRoZSB3b3JrZXItc2lkZWNhciBpbWFnZSBtZXRhZGF0YQpjYXB0dXJlZCB3aGVuIHRoZSB2" + + "ZXJzaW9uIGlzIGNyZWF0ZWQuIFJlcGxhY2luZyBwb2RzIG9yIHJlZGVwbG95aW5nIHRoZSBzYW1l" + + "CnZlcnNpb24gZG9lcyBub3QgYXBwbHkgYSBuZXcgUHlsb24gaW1hZ2UuIEFmdGVyIHRoZSBjb250" + + "cm9sLXBsYW5lIHVwZGF0ZSwKY3JlYXRlIGFuZCBkZXBsb3kgYSBuZXcgZnVuY3Rpb24gdmVyc2lv" + + "bi4gVmVyaWZ5IHRoZSBjb250cm9sIHBsYW5lLCByb3V0ZSwgYW5kCndvcmtlciBzaWRlY2FyOgoK" + + "YGBgYmFzaAprdWJlY3RsIGdldCBkZXBsb3kgLW4gbnZjZiBsbG0tYXBpLWdhdGV3YXkKa3ViZWN0" + + "bCBnZXQgc3RhdGVmdWxzZXQgLW4gbnZjZiBsbG0tcmVxdWVzdC1yb3V0ZXIKa3ViZWN0bCBnZXQg" + + "cG9kcyAtbiBudmNmIHwgZ3JlcCAtRSAnbGxtLWFwaS1nYXRld2F5fGxsbS1yZXF1ZXN0LXJvdXRl" + + "cicKa3ViZWN0bCBnZXQgaHR0cHJvdXRlIC1BIHwgZ3JlcCBsbG0Ka3ViZWN0bCAtbiBudmNmLWJh" + + "Y2tlbmQgZ2V0IHBvZCA8ZnVuY3Rpb24tcG9kPiBcCiAgLW8ganNvbnBhdGg9J3tyYW5nZSAuc3Bl" + + "Yy5jb250YWluZXJzWz8oQC5uYW1lPT0ibGxtLXdvcmtlciIpXS5hcmdzWypdfXsufXsiXFxuIn17" + + "ZW5kfScKYGBgCgpGb3IgbG9jYWwgcGxhaW50ZXh0IGNsdXN0ZXJzLCB0aGUgYGxsbS13b3JrZXJg" + + "IGFyZ3MgbXVzdCBpbmNsdWRlCmAtLXF1aWMtaW5zZWN1cmVgLgoKRm9yIGxvYWQtYmFsYW5jZXIg" + + "c2NoZW1hIGFuZCBhbGdvcml0aG0gYmVoYXZpb3IsIHNlZSB0aGUKW1N0YXJnYXRlIGNvbmZpZ3Vy" + + "YXRpb24gZ3VpZGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9OVklESUEvbnZjZi9ibG9iL21haW4vc3Jj" + + "L2xpYnJhcmllcy9ydXN0L3N0YXJnYXRlL2RvY3MvbG9hZC1iYWxhbmNlci1jb25maWd1cmF0aW9u" + + "Lm1kKS4KCiMjIEhlbG1maWxlIFNlbGVjdG9ycwoKVGFyZ2V0IHNwZWNpZmljIHJlbGVhc2VzIG9y" + + "IGdyb3VwczoKCmBgYGJhc2gKIyBCeSByZWxlYXNlIGdyb3VwCkhFTE1GSUxFX0VOVj08ZW52PiBo" + + "ZWxtZmlsZSAtLXNlbGVjdG9yIHJlbGVhc2UtZ3JvdXA9ZGVwZW5kZW5jaWVzIHN5bmMKSEVMTUZJ" + + "TEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0b3IgcmVsZWFzZS1ncm91cD1zZXJ2aWNlcyBz" + + "eW5jCkhFTE1GSUxFX0VOVj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIHJlbGVhc2UtZ3JvdXA9" + + "aW5ncmVzcyBzeW5jCkhFTE1GSUxFX0VOVj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIHJlbGVh" + + "c2UtZ3JvdXA9b2JzZXJ2YWJpbGl0eSBzeW5jCgojIEJ5IHJlbGVhc2UgbmFtZQpIRUxNRklMRV9F" + + "TlY9PGVudj4gaGVsbWZpbGUgLS1zZWxlY3RvciBuYW1lPWNhc3NhbmRyYSBzeW5jCkhFTE1GSUxF" + + "X0VOVj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9YWRtaW4taXNzdWVyLXByb3h5IHN5" + + "bmMKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0b3IgbmFtZT1sbG0tcmVxdWVz" + + "dC1yb3V0ZXIgc3luYwpIRUxNRklMRV9FTlY9PGVudj4gaGVsbWZpbGUgLS1zZWxlY3RvciBuYW1l" + + "PWxsbS1hcGktZ2F0ZXdheSBzeW5jCgojIFRlbXBsYXRlIG9ubHkgKGRyeSBydW4pCkhFTE1GSUxF" + + "X0VOVj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9Y2Fzc2FuZHJhIHRlbXBsYXRlCgoj" + + "IERlc3Ryb3kgYSBzaW5nbGUgcmVsZWFzZQpIRUxNRklMRV9FTlY9PGVudj4gaGVsbWZpbGUgLS1z" + + "ZWxlY3RvciBuYW1lPWNhc3NhbmRyYSBkZXN0cm95CmBgYAoKTm90ZTogYGFkbWluLWlzc3Vlci1w" + + "cm94eWAgaGFzIG5vIGByZWxlYXNlLWdyb3VwYCBsYWJlbC4gVXNlIGAtLXNlbGVjdG9yIG5hbWU9" + + "YWRtaW4taXNzdWVyLXByb3h5YC4KUEsHCLE1HdsCKgAAAioAAFBLAwQUAAgAAAAAACEAAAAAAAAA" + + "AAAAAAAAPwAJAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uL3JlZmVyZW5jZXMv" + + "bnZjZi11aS1hZGRvbi5tZFVUBQABAKbOEiMgTlZDRiBVSSBBZGRvbgoKTlZDRiBVSSBpcyBhbiBv" + + "cHRpb25hbCwgY3VzdG9tZXItZmFjaW5nIE5WQ0YgYWRtaW4tcGFuZWwgVUkuIEl0IGlzIGRpc2Fi" + + "bGVkIGJ5CmRlZmF1bHQgYW5kIGF2YWlsYWJsZSBvbmx5IGluIHN0YWNrIHBhY2thZ2VzIHRoYXQg" + + "aW5jbHVkZSB0aGUgTlZDRiBVSSBhZGRvbi4KCiMjIFdoZW4gdG8gZW5hYmxlCgpFbmFibGUgTlZD" + + "RiBVSSBvbmx5IHdoZW4geW91IG5lZWQgdGhlIGFkbWluLXBhbmVsIFVJIGFuZCB5b3VyIGV4dHJh" + + "Y3RlZCBzdGFjawpwYWNrYWdlIGluY2x1ZGVzIHRoZSBhZGRvbi4gSWYgdGhlIHBhY2thZ2UgZG9l" + + "cyBub3QgY29udGFpbiBhIGBudmNmLXVpYCByZWxlYXNlCmFuZCBgbnZjZlVpYCByb3V0ZSB2YWx1" + + "ZXMsIHNraXAgdGhlIGFkZG9uIHVudGlsIHlvdSB1c2UgYSBwYWNrYWdlIHRoYXQgaW5jbHVkZXMK" + + "dGhlbS4KCiMjIEVuYWJsZSB0aGUgYWRkb24KCkVuYWJsZSBpdCBpbiBgZW52aXJvbm1lbnRzLzxl" + + "bnYtbmFtZT4ueWFtbGA6CgpgYGB5YW1sCmFkZG9uczoKICBudmNmVWk6CiAgICBlbmFibGVkOiB0" + + "cnVlCmBgYAoKIyMgQ3JlYXRlIG5hbWVzcGFjZSBhbmQgaW1hZ2UgcHVsbCBzZWNyZXQKCkNyZWF0" + + "ZSB0aGUgbmFtZXNwYWNlLCBhbmQgYW4gaW1hZ2UgcHVsbCBzZWNyZXQgb25seSBpZiBwdWxsaW5n" + + "IGZyb20gYSBwcml2YXRlCnJlZ2lzdHJ5OgoKYGBgYmFzaAprdWJlY3RsIGNyZWF0ZSBuYW1lc3Bh" + + "Y2UgbnZjZi11aSAtLWRyeS1ydW49Y2xpZW50IC1vIHlhbWwgfCBrdWJlY3RsIGFwcGx5IC1mIC0K" + + "CiMgT25seSBpZiBwdWxsaW5nIGZyb20gYSBwcml2YXRlIHJlZ2lzdHJ5IChlLmcuLCBOR0MgbnZj" + + "ci5pbykKZXhwb3J0IE5HQ19BUElfS0VZPSI8eW91ci1rZXk+IgprdWJlY3RsIGNyZWF0ZSBzZWNy" + + "ZXQgZG9ja2VyLXJlZ2lzdHJ5IG52Y3ItY3JlZHMgXAogIC0tZG9ja2VyLXNlcnZlcj1udmNyLmlv" + + "IFwKICAtLWRvY2tlci11c2VybmFtZT0nJG9hdXRodG9rZW4nIFwKICAtLWRvY2tlci1wYXNzd29y" + + "ZD0iJE5HQ19BUElfS0VZIiBcCiAgLS1uYW1lc3BhY2U9bnZjZi11aSBcCiAgLS1kcnktcnVuPWNs" + + "aWVudCAtbyB5YW1sIHwga3ViZWN0bCBhcHBseSAtZiAtCmBgYAoKVGhlIGRlZmF1bHQgcm91dGUg" + + "aG9zdCBpcyBgbnZjZi11aS48ZG9tYWluPmAgYW5kIHRoZSBiYWNrZW5kIGlzCmBudmNmLXVpLm52" + + "Y2YtdWk6ODMwMGAuCgojIyBBcHBseSB0aGUgc2VydmljZSBhbmQgcm91dGUKCkFmdGVyIGNvbmZp" + + "cm1pbmcgdGhlIHBhY2thZ2UgaW5jbHVkZXMgdGhlIGBudmNmLXVpYCByZWxlYXNlLCBwcmV2aWV3" + + "IGFuZCBhcHBseQp0aGUgc2VydmljZSBhbmQgcm91dGU6CgpgYGBiYXNoCkhFTE1GSUxFX0VOVj08" + + "ZW52LW5hbWU+IGhlbG1maWxlIC0tc2VsZWN0b3IgbmFtZT1udmNmLXVpIHRlbXBsYXRlCkhFTE1G" + + "SUxFX0VOVj08ZW52LW5hbWU+IGhlbG1maWxlIC0tc2VsZWN0b3IgbmFtZT1udmNmLXVpIHN5bmMK" + + "SEVMTUZJTEVfRU5WPTxlbnYtbmFtZT4gaGVsbWZpbGUgLS1zZWxlY3RvciByZWxlYXNlLWdyb3Vw" + + "PWluZ3Jlc3Mgc3luYwpgYGAKCiMjIFZlcmlmeQoKVmVyaWZ5IHRoZSByb3V0ZSBvbmx5IHdoZW4g" + + "dGhlIGFkZG9uIGlzIHByZXNlbnQgYW5kIGVuYWJsZWQ6CgpgYGBiYXNoCmt1YmVjdGwgZ2V0IGRl" + + "cGxveSxzdmMgLW4gbnZjZi11aQprdWJlY3RsIGdldCBodHRwcm91dGUgLUEgfCBncmVwIC1pIG52" + + "Y2YtdWkKY3VybCAtaSAtSCAiSG9zdDogbnZjZi11aS48ZG9tYWluPiIgImh0dHA6Ly88Z2F0ZXdh" + + "eS1hZGRyZXNzPi9zdGF0dXMiCmBgYAoKIyMgU2VjdXJpdHkKClRoZSBOVkNGIFVJIGFkbWluIHBh" + + "bmVsIGlzIGN1cnJlbnRseSB1bmF1dGhlbnRpY2F0ZWQuIERvIG5vdCBleHBvc2UgaXQgdG8gdGhl" + + "CnB1YmxpYyBpbnRlcm5ldC4gUmVzdHJpY3QgYWNjZXNzIHRvIGEgdHJ1c3RlZCBuZXR3b3JrLCBW" + + "UE4sIG9yIGFuIGF1dGhlbnRpY2F0aW5nCnByb3h5IGluIGZyb250IG9mIHRoZSBgbnZjZi11aWAg" + + "cm91dGUuClBLBwg4+SevuQcAALkHAABQSwMEFAAIAAAAAAAhAAAAAAAAAAAAAAAAAD4ACQBkYXRh" + + "L252Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbi9yZWZlcmVuY2VzL3B1bGwtc2VjcmV0cy5t" + + "ZFVUBQABAKbOEiMgSW1hZ2UgUHVsbCBTZWNyZXRzIFJlZmVyZW5jZQoKIyMgT3ZlcnZpZXcKCldo" + + "ZW4gcHVsbGluZyBOVkNGIGltYWdlcyBmcm9tIGEgcHJpdmF0ZSByZWdpc3RyeSAoZm9yIGV4YW1w" + + "bGUsIE5HQwpgbnZjci5pb2ApLCBLdWJlcm5ldGVzIG5lZWRzIGBpbWFnZVB1bGxTZWNyZXRzYCBv" + + "biBldmVyeSBwb2QuIENvbnRyb2wtcGxhbmUgYW5kCmNvbXB1dGUtcGxhbmUgY3JlZGVudGlhbHMg" + + "YXJlIGNvbmZpZ3VyZWQgaW4gdGhlaXIgb3duIGNsdXN0ZXIgY29udGV4dHMuIERvIG5vdAp1c2Ug" + + "b25lIG1peGVkIG5hbWVzcGFjZSBsaXN0LgoKVGhlIHJlY29tbWVuZGVkIGNvbnRyb2wtcGxhbmUg" + + "YXBwcm9hY2ggdXNlcyBLeXZlcm5vIHRvIGluamVjdCB0aGUgc2VjcmV0IGludG8KY29udHJvbC1w" + + "bGFuZSBwb2RzIGF0IGFkbWlzc2lvbiB0aW1lLiBUaGUgY29tcHV0ZS1wbGFuZSBjaGFydCBhbmQg" + + "b3BlcmF0b3IgdXNlCnRoZSBzZWNyZXQgaW4gYG52Y2Etb3BlcmF0b3JgIGFuZCBtaXJyb3IgaXQg" + + "dG8gYG52Y2Etc3lzdGVtYC4KCiMjIEt5dmVybm8gQXBwcm9hY2ggKFJlY29tbWVuZGVkKQoKIyMj" + + "IDEuIEluc3RhbGwgS3l2ZXJubwoKYGBgYmFzaApoZWxtIHJlcG8gYWRkIGt5dmVybm8gaHR0cHM6" + + "Ly9reXZlcm5vLmdpdGh1Yi5pby9reXZlcm5vLwpoZWxtIHJlcG8gdXBkYXRlCmhlbG0gaW5zdGFs" + + "bCBreXZlcm5vIGt5dmVybm8va3l2ZXJubyAtbiBreXZlcm5vIC0tY3JlYXRlLW5hbWVzcGFjZSBc" + + "CiAgLS1rdWJlLWNvbnRleHQgPGNvbnRyb2wtcGxhbmUtY29udGV4dD4KYGBgCgojIyMgMi4gQ3Jl" + + "YXRlIGNvbnRyb2wtcGxhbmUgcHVsbCBzZWNyZXRzCgpgYGBiYXNoCmV4cG9ydCBOR0NfQVBJX0tF" + "WT0iPHlvdXItbmdjLWFwaS1rZXk+IgoKZm9yIG5zIGluIGNhc3NhbmRyYS1zeXN0ZW0gbmF0cy1z" + "eXN0ZW0gbnZjZiBhcGkta2V5cyBlc3Mgc2lzIHZhdWx0LXN5c3RlbSBjZXJ0LW1hbmFnZXI7IGRv" + "CiAga3ViZWN0bCAtLWNvbnRleHQgPGNvbnRyb2wtcGxhbmUtY29udGV4dD4gY3JlYXRlIG5hbWVz" + @@ -2807,951 +3638,124 @@ const skillDataZipBase64 = "" + "LS1kb2NrZXItc2VydmVyPW52Y3IuaW8gXAogICAgLS1kb2NrZXItdXNlcm5hbWU9JyRvYXV0aHRv" + "a2VuJyBcCiAgICAtLWRvY2tlci1wYXNzd29yZD0iJE5HQ19BUElfS0VZIiBcCiAgICAtLW5hbWVz" + "cGFjZT0iJG5zIiBcCiAgICAtLWRyeS1ydW49Y2xpZW50IC1vIHlhbWwgfCBrdWJlY3RsIC0tY29u" + - "dGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBhcHBseSAtZiAtCmRvbmUKYGBgCgojIyMgU3Rl" + - "cCA0OiBBZGQgaW1hZ2VQdWxsU2VjcmV0cyB0byBoZWxtZmlsZSByZWxlYXNlcwoKQWRkIHRoZSBj" + - "aGFydC1zcGVjaWZpYyBgaW1hZ2VQdWxsU2VjcmV0c2Aga2V5IHRvIGVhY2ggcmVsZWFzZS4gRXhh" + - "bXBsZSBmb3IgY2Fzc2FuZHJhIGluIGBoZWxtZmlsZS5kLzAxLWRlcGVuZGVuY2llcy55YW1sLmdv" + - "dG1wbGA6CgpgYGB5YW1sCi0gbmFtZTogY2Fzc2FuZHJhCiAgdmVyc2lvbjogMC44LjAKICBjb25k" + - "aXRpb246IGNhc3NhbmRyYS5lbmFibGVkCiAgbmFtZXNwYWNlOiBjYXNzYW5kcmEtc3lzdGVtCiAg" + - "PDw6ICpkZXBlbmRlbmN5CiAgdmFsdWVzOgogICAgLSAuLi9nbG9iYWwueWFtbC5nb3RtcGwKICAg" + - "IC0gLi4vPHByaXZhdGUtdmFsdWVzPi97eyByZXF1aXJlZEVudiAiSEVMTUZJTEVfRU5WIiB9fS1z" + - "ZWNyZXRzLnlhbWwKICAgIC0gY2Fzc2FuZHJhOgogICAgICAgIGdsb2JhbDoKICAgICAgICAgIGlt" + - "YWdlUHVsbFNlY3JldHM6CiAgICAgICAgICAgIC0gbnZjci1jcmVkcwpgYGAKClNlZSBbcmVmZXJl" + - "bmNlcy9wdWxsLXNlY3JldHMubWRdKHJlZmVyZW5jZXMvcHVsbC1zZWNyZXRzLm1kKSBmb3IgdGhl" + - "IGtleSBmb3IgZXZlcnkgY2hhcnQuCgpUaGVzZSBhcmUgY29udHJvbC1wbGFuZSBuYW1lc3BhY2Vz" + - "LiBGb3IgYSBzZXBhcmF0ZSBjb21wdXRlIGNsdXN0ZXIsIGNyZWF0ZSB0aGUKc2VjcmV0IG9ubHkg" + - "aW4gYG52Y2Etb3BlcmF0b3JgOyB0aGUgY2hhcnQgYW5kIG9wZXJhdG9yIG1pcnJvciBpdCB0bwpg" + - "bnZjYS1zeXN0ZW1gLiBTZWUgW1NwbGl0IENvbXB1dGUtUGxhbmUgSW5zdGFsbGF0aW9uXShyZWZl" + - "cmVuY2VzL2NvbXB1dGUtcGxhbmUtaW5zdGFsbGF0aW9uLm1kI3B1bGwtc2VjcmV0cykuCgojIyMg" + - "U3RlcCA1OiBEZXBsb3kKCmBgYGJhc2gKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0ta3Vi" + - "ZS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRleHQ+IHN5bmMKYGBgCgojIyMgU3RlcCA2OiBQ" + - "YXRjaCBTZXJ2aWNlQWNjb3VudHMgZm9yIGNoYXJ0cyB3aXRob3V0IG5hdGl2ZSBzdXBwb3J0CgpB" + - "ZnRlciBQaGFzZSAxIChkZXBlbmRlbmNpZXMpIGNvbXBsZXRlcywgT3BlbkJhbyBwb2RzIHdpbGwg" + - "YmUgaW4gYEltYWdlUHVsbEJhY2tPZmZgLiBQYXRjaCBhbmQgcmVzdGFydDoKCmBgYGJhc2gKZm9y" + - "IG5zIGluIHZhdWx0LXN5c3RlbSBudmNmIGVzczsgZG8KICBmb3Igc2EgaW4gJChrdWJlY3RsIC0t" + - "Y29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBnZXQgc2EgLW4gIiRucyIgXAogICAgLS1u" + - "by1oZWFkZXJzIC1vIGN1c3RvbS1jb2x1bW5zPSI6bWV0YWRhdGEubmFtZSIpOyBkbwogICAga3Vi" + - "ZWN0bCAtLWNvbnRleHQgPGNvbnRyb2wtcGxhbmUtY29udGV4dD4gcGF0Y2ggc2VydmljZWFjY291" + - "bnQgLW4gIiRucyIgIiRzYSIgXAogICAgICAtcCAneyJpbWFnZVB1bGxTZWNyZXRzIjogW3sibmFt" + - "ZSI6ICJudmNyLWNyZWRzIn1dfScKICBkb25lCmRvbmUKa3ViZWN0bCAtLWNvbnRleHQgPGNvbnRy" + - "b2wtcGxhbmUtY29udGV4dD4gZGVsZXRlIHBvZHMgLW4gdmF1bHQtc3lzdGVtIC0tYWxsCmBgYAoK" + - "VmVyaWZ5OgoKYGBgYmFzaAprdWJlY3RsIC0tY29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0" + - "PiBnZXQgZXZlbnRzIC1uIHZhdWx0LXN5c3RlbSBcCiAgLS1zb3J0LWJ5PScubGFzdFRpbWVzdGFt" + - "cCcgfCBncmVwIC1pIHB1bGwKIyBTaG91bGQgc2hvdyAiU3VjY2Vzc2Z1bGx5IHB1bGxlZCBpbWFn" + - "ZSIgZnJvbSBudmNyLmlvCmBgYAoKLS0tCgojIyBFeGFtcGxlIDM6IEZ1bGwgVGVhcmRvd24gYW5k" + - "IFJlaW5zdGFsbAoKV2hlbiBhIGRlcGxveW1lbnQgaXMgYnJva2VuIGFuZCB5b3UgbmVlZCBhIGNs" + - "ZWFuIHNsYXRlLgoKIyMjIFN0ZXAgMTogRGVzdHJveSB0aGUgY29tcHV0ZS1wbGFuZSBzdGFjawoK" + - "YGBgYmFzaAptYWtlIC1DIGRlcGxveS9zdGFja3MvbnZjZi1jb21wdXRlLXBsYW5lIGRlc3Ryb3kg" + - "XAogIENMVVNURVJfTkFNRT08Y2x1c3Rlci1uYW1lPiBcCiAgSEVMTUZJTEVfRU5WPTxlbnY+IFwK" + - "ICBLVUJFQ09ORklHX0ZJTEU9PGNvbXB1dGUtcGxhbmUta3ViZWNvbmZpZz4KYGBgCgpJZiBjb21w" + - "dXRlIGNsZWFudXAgaXMgc3R1Y2sgb24gZmluYWxpemVycywgdXNlIHRoZSBjb21wdXRlLWNvbnRl" + - "eHQgcHJvY2VkdXJlIGluCltkZWJ1Z2dpbmcubWRdKHJlZmVyZW5jZXMvZGVidWdnaW5nLm1kI2Zh" + - "aWx1cmUtbnZjYS1jbGVhbnVwLXN0dWNrLWZpbmFsaXplcnMpLgoKIyMjIFN0ZXAgMjogRGVyZWdp" + - "c3RlciB0aGUgY29tcHV0ZSBjbHVzdGVyCgpSZWFkIGBjbHVzdGVySURgIGFuZCBgbmNhSURgIGZy" + - "b20KYGRlcGxveS9zdGFja3MvbnZjZi1jb21wdXRlLXBsYW5lL3JlZ2lzdHJhdGlvbi88Y2x1c3Rl" + - "ci1uYW1lPi1yZWdpc3Rlci12YWx1ZXMueWFtbGAuClNob3cgdGhlIElEIGFuZCBnZXQgY29uZmly" + - "bWF0aW9uIGJlZm9yZSBkZWxldGluZyB0aGUgSUNNUyByb3c6CgpgYGBiYXNoCjxudmNmLWNsaT4g" + - "LS1jb25maWcgPGNvbmZpZz4gY2x1c3RlciBkZWxldGUgXAogIC0tY2x1c3Rlci1pZCA8Y2x1c3Rl" + - "ci1pZC1mcm9tLXJlZ2lzdHJhdGlvbi12YWx1ZXM+IFwKICAtLW5jYS1pZCA8bmNhLWlkPiBcCiAg" + - "LS1pZ25vcmUtbWlzc2luZwpgYGAKClJlcGVhdCBzdGVwcyAxIGFuZCAyIGZvciBldmVyeSBjb21w" + - "dXRlIGNsdXN0ZXIuCgojIyMgU3RlcCAzOiBEZXN0cm95IHRoZSBjb250cm9sLXBsYW5lIHN0YWNr" + - "CgpQcmVzZXJ2ZSB0aGUgYGNlcnQtbWFuYWdlcmAgbmFtZXNwYWNlIGJ5IGRlZmF1bHQuIE5hbWVz" + - "cGFjZSBwcmVzZXJ2YXRpb24gZG9lcwpub3QgcHJlc2VydmUgdGhlIEhlbG0gcmVsZWFzZS4gQmVm" + - "b3JlIHJ1bm5pbmcgZGVzdHJveSwgaWRlbnRpZnkgd2hldGhlcgpjZXJ0LW1hbmFnZXIgaXMgZXh0" + - "ZXJuYWwuIEZvciBhbiBleHRlcm5hbCBpbnN0YWxsYXRpb24sIHJlcXVpcmUgZWZmZWN0aXZlCmBj" + - "ZXJ0TWFuYWdlci5lbmFibGVkOiBmYWxzZWAgYW5kIGFib3J0IGlmIGl0IGlzIHRydWUuIEZvciBh" + - "biBpbnRlbmRlZApzdGFjay1tYW5hZ2VkIHJlbGVhc2Ugd2l0aCBlZmZlY3RpdmUgYGNlcnRNYW5h" + - "Z2VyLmVuYWJsZWQ6IHRydWVgLCB2ZXJpZnkKbWF0Y2hpbmcgc3RhY2sgSGVsbSByZWxlYXNlIG1l" + - "dGFkYXRhIGFuZCBhYm9ydCBvbiBtaXNzaW5nIG9yIG1pc21hdGNoZWQKZXZpZGVuY2UuIE9ubHkg" + - "cGxhbiBuYW1lc3BhY2UgcmVtb3ZhbCBhZnRlciB2ZXJpZnlpbmcgbmFtZXNwYWNlIHByb3ZlbmFu" + - "Y2UgYW5kCmdldHRpbmcgZXhwbGljaXQgY29uZmlybWF0aW9uOyBvdGhlcndpc2UgZG8gbm90IGRl" + - "bGV0ZSBpdC4KCmBgYGJhc2gKS1VCRUNPTkZJRz08Y29udHJvbC1wbGFuZS1rdWJlY29uZmlnPiBc" + - "Cm1ha2UgLUMgZGVwbG95L3N0YWNrcy9zZWxmLW1hbmFnZWQgZGVzdHJveSBcCiAgSEVMTUZJTEVf" + - "RU5WPTxlbnY+IFwKICBLVUJFQ09ORklHX0ZJTEU9PGNvbnRyb2wtcGxhbmUta3ViZWNvbmZpZz4K" + - "YGBgCgpQYXNzIGJvdGgga3ViZWNvbmZpZyBmb3JtcyBiZWNhdXNlIGNvbnRyb2wtcGxhbmUgbmFt" + - "ZXNwYWNlIGNsZWFudXAgdXNlcwphbWJpZW50IGBrdWJlY3RsYC4KCiMjIyBTdGVwIDQ6IFZlcmlm" + - "eSBjbGVhbgoKYGBgYmFzaAprdWJlY3RsIC0tY29udGV4dCA8Y29tcHV0ZS1wbGFuZS1jb250ZXh0" + - "PiBnZXQgbnMgfCBcCiAgZ3JlcCAtRSAnKG52Y2F8bnZjZi1iYWNrZW5kfGdyb3ZlfGR5bmFtbykn" + - "Cmt1YmVjdGwgLS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRleHQ+IGdldCBucyB8IFwKICBn" + - "cmVwIC1FICcoY2Fzc2FuZHJhfG5hdHN8dmF1bHR8bnZjZnxhcGkta2V5c3xlc3N8c2lzKScKIyBC" + - "b3RoIGNvbW1hbmRzIHNob3VsZCByZXR1cm4gZW1wdHkuCmBgYAoKIyMjIFN0ZXAgNTogUmVpbnN0" + - "YWxsIGluIHNwbGl0IG9yZGVyCgpGb2xsb3cgW0NsZWFuIEluc3RhbGxhdGlvbl0oU0tJTEwubWQj" + - "Y2xlYW4taW5zdGFsbGF0aW9uKSwgdGhlbiByZXR1cm4gdG8gdGhlCnNhbWUgaGFuZG9mZiBpbiBb" + - "U3BsaXQgQ29tcHV0ZS1QbGFuZSBJbnN0YWxsYXRpb25dKHJlZmVyZW5jZXMvY29tcHV0ZS1wbGFu" + - "ZS1pbnN0YWxsYXRpb24ubWQpLgoKLS0tCgojIyBFeGFtcGxlIDQ6IFJlY292ZXIgZnJvbSBhIEdh" + - "dGV3YXkgRW5kcG9pbnQgQ2hhbmdlCgpUaGUgc2VwYXJhdGVseSBwcm92aXNpb25lZCBHYXRld2F5" + - "IG9yIGl0cyBsb2FkIGJhbGFuY2VyIHdhcyByZWNyZWF0ZWQgYW5kIGdvdCBhIG5ldyBlbmRwb2lu" + - "dC4KCiMjIyBTdGVwIDE6IEdldCB0aGUgbmV3IGVuZHBvaW50CgpgYGBiYXNoCkdBVEVXQVlfQURE" + - "Uj0kKGt1YmVjdGwgLS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRleHQ+IGdldCBnYXRld2F5" + - "IFwKICBudmNmLWdhdGV3YXkgLW4gZW52b3ktZ2F0ZXdheSBcCiAgLW8ganNvbnBhdGg9J3suc3Rh" + - "dHVzLmFkZHJlc3Nlc1swXS52YWx1ZX0nKQp0ZXN0IC1uICIkR0FURVdBWV9BRERSIgpgYGAKCiMj" + - "IyBTdGVwIDI6IFVwZGF0ZSBETlMgYW5kIGRpcmVjdCBhZGRyZXNzIGZpZWxkcwoKS2VlcCBgZ2xv" + - "YmFsLmRvbWFpbmAsIHJvdXRlIGhvc3RuYW1lcywgYW5kIENMSSBIb3N0IGZpZWxkcyB1bmNoYW5n" + - "ZWQuIFBvaW50IHRoZQpETlMgcmVjb3JkcyBmb3IgcmVuZGVyZWQgcm91dGUgaG9zdG5hbWVzLCBz" + - "dWNoIGFzIGBhcGkuPGRvbWFpbj5gIGFuZApgKi5pbnZvY2F0aW9uLjxkb21haW4+YCwgdG8gYEdB" + - "VEVXQVlfQUREUmAuIEZvciBhIHRlbXBvcmFyeSBlbnZpcm9ubWVudCB3aXRob3V0CkROUywga2Vl" + - "cCBpdHMgcmVzZXJ2ZWQgcm91dGUgc3VmZml4IGFuZCBjb25uZWN0IHRvIGBHQVRFV0FZX0FERFJg" + - "IHdpdGggdGhlCm1hdGNoaW5nIGBIb3N0YCBoZWFkZXIuCgpGb3IgYSBzcGxpdCBkZXBsb3ltZW50" + - "IGNvbmZpZ3VyZWQgd2l0aCBkaXJlY3QgR2F0ZXdheSBhZGRyZXNzZXMsIHJlcGxhY2Ugb25seQp0" + - "aGUgYWRkcmVzcy1iZWFyaW5nIHZhbHVlczogY29udHJvbC1wbGFuZSBgbnZjZk5hdHNTZXJ2aWNl" + - "VVJMYCwgY29tcHV0ZS1wbGFuZQpJQ01TLCBSZVZhbCwgYW5kIE5BVFMgVVJMcywgYW5kIENMSSBV" + - "UkwgZmllbGRzLiBLZWVwIHRoZWlyIGRvbWFpbiBhbmQgSG9zdApvdmVycmlkZXMgdW5jaGFuZ2Vk" + - "LiBSZWZyZXNoIHJlZ2lzdHJhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIHRocm91Z2ggdGhlIHNhbWUK" + - "aGFuZG9mZiB1c2VkIG9yaWdpbmFsbHkuIFNlZQpbU3BsaXQgQ29tcHV0ZS1QbGFuZSBJbnN0YWxs" + - "YXRpb25dKHJlZmVyZW5jZXMvY29tcHV0ZS1wbGFuZS1pbnN0YWxsYXRpb24ubWQpCmZvciB0aGUg" + - "ZmllbGRzIGFuZCBjb21wbGV0ZSBjb21tYW5kcy4KCiMjIyBTdGVwIDM6IFZlcmlmeSBib3RoIGNv" + - "bnRleHRzCgpgYGBiYXNoCmRpZyArc2hvcnQgImFwaS48ZG9tYWluPiIKY3VybCAtSCAiSG9zdDog" + - "YXBpLjxkb21haW4+IiAiaHR0cDovLyRHQVRFV0FZX0FERFIvaGVhbHRoIgprdWJlY3RsIC0tY29u" + - "dGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBnZXQgZ2F0ZXdheSBudmNmLWdhdGV3YXkgXAog" + - "IC1uIGVudm95LWdhdGV3YXkgLW8gd2lkZQprdWJlY3RsIC0tY29udGV4dCA8Y29udHJvbC1wbGFu" + - "ZS1jb250ZXh0PiBnZXQgaHR0cHJvdXRlcyAtQQprdWJlY3RsIC0tY29udGV4dCA8Y29udHJvbC1w" + - "bGFuZS1jb250ZXh0PiBnZXQgdGNwcm91dGVzIC1BCmt1YmVjdGwgLS1jb250ZXh0IDxjb21wdXRl" + - "LXBsYW5lLWNvbnRleHQ+IHJvbGxvdXQgc3RhdHVzIFwKICBkZXBsb3ltZW50L252Y2Etb3BlcmF0" + - "b3IgLW4gbnZjYS1vcGVyYXRvciAtLXRpbWVvdXQ9MTBtCmt1YmVjdGwgLS1jb250ZXh0IDxjb21w" + - "dXRlLXBsYW5lLWNvbnRleHQ+IHdhaXQgXAogIG52Y2ZiYWNrZW5kLzxjb21wdXRlLXBsYW5lLWNs" + - "dXN0ZXItbmFtZT4gLW4gbnZjYS1vcGVyYXRvciBcCiAgLS1mb3I9anNvbnBhdGg9J3suc3RhdHVz" + - "LmFnZW50U3RhdHVzfSc9aGVhbHRoeSAtLXRpbWVvdXQ9MTBtCmBgYAoKLS0tCgojIyBFeGFtcGxl" + - "IDU6IERlcGxveSBPbmx5IERlcGVuZGVuY2llcwoKVXNlZnVsIGZvciB0ZXN0aW5nIG9yIHdoZW4g" + - "aXRlcmF0aW5nIG9uIHNlcnZpY2UgY29uZmlndXJhdGlvbi4KCmBgYGJhc2gKIyBEZXBsb3kganVz" + - "dCBOQVRTLCBDYXNzYW5kcmEsIE9wZW5CYW8KSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0t" + - "c2VsZWN0b3IgcmVsZWFzZS1ncm91cD1kZXBlbmRlbmNpZXMgc3luYwoKIyBDaGVjayBzdGF0dXMK" + - "a3ViZWN0bCBnZXQgcG9kcyAtbiBuYXRzLXN5c3RlbQprdWJlY3RsIGdldCBwb2RzIC1uIGNhc3Nh" + - "bmRyYS1zeXN0ZW0Ka3ViZWN0bCBnZXQgcG9kcyAtbiB2YXVsdC1zeXN0ZW0KCiMgRGVwbG95IGp1" + - "c3Qgb25lIHNwZWNpZmljIHJlbGVhc2UKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2Vs" + - "ZWN0b3IgbmFtZT1jYXNzYW5kcmEgc3luYwpgYGAKCiMjIyBTZWxlY3RvciByZWZlcmVuY2UKCnwg" + - "U2VsZWN0b3IgfCBSZWxlYXNlcyB8CnwtLS0tLS0tLS0tfC0tLS0tLS0tLS18CnwgYHJlbGVhc2Ut" + - "Z3JvdXA9ZGVwZW5kZW5jaWVzYCB8IG5hdHMsIGNhc3NhbmRyYSwgb3BlbmJhby1zZXJ2ZXIgfAp8" + - "IGByZWxlYXNlLWdyb3VwPXNlcnZpY2VzYCB8IGFwaS1rZXlzLCBzaXMsIGFwaSwgaW52b2NhdGlv" + - "bi1zZXJ2aWNlLCBncnBjLXByb3h5LCBlc3MtYXBpLCBub3Rhcnktc2VydmljZSwgcmV2YWwsIG9w" + - "dGlvbmFsIGxsbS1yZXF1ZXN0LXJvdXRlciBhbmQgbGxtLWFwaS1nYXRld2F5IHdoZW4gYGxsbS5l" + - "bmFibGVkPXRydWVgLCBvcHRpb25hbCB2YW5pdHktZ2F0ZXdheSBvbmx5IGluIHN0YWNrIHBhY2th" + - "Z2VzIHRoYXQgaW5jbHVkZSB0aGUgYWRkb24gYW5kIGhhdmUgYGFkZG9ucy52YW5pdHlHYXRld2F5" + - "LmVuYWJsZWQ9dHJ1ZWAsIG9wdGlvbmFsIG52Y2YtdWkgb25seSBpbiBzdGFjayBwYWNrYWdlcyB0" + - "aGF0IGluY2x1ZGUgdGhlIGFkZG9uIGFuZCBoYXZlIGBhZGRvbnMubnZjZlVpLmVuYWJsZWQ9dHJ1" + - "ZWAgfAp8IGBuYW1lPWxsbS1yZXF1ZXN0LXJvdXRlcmAgfCBEZXBsb3kganVzdCB0aGUgTExNIHJl" + - "cXVlc3Qgcm91dGVyIHdoZW4gYGxsbS5lbmFibGVkPXRydWVgIHwKfCBgbmFtZT1sbG0tYXBpLWdh" + - "dGV3YXlgIHwgRGVwbG95IGp1c3QgdGhlIExMTSBBUEkgZ2F0ZXdheSB3aGVuIGBsbG0uZW5hYmxl" + - "ZD10cnVlYCB8CnwgYG5hbWU9dmFuaXR5LWdhdGV3YXlgIHwgRGVwbG95IGp1c3QgVmFuaXR5IEdh" + - "dGV3YXkgb25seSB3aGVuIHRoZSBzdGFjayBwYWNrYWdlIGluY2x1ZGVzIHRoYXQgcmVsZWFzZSBh" + - "bmQgYGFkZG9ucy52YW5pdHlHYXRld2F5LmVuYWJsZWQ9dHJ1ZWAgfAp8IGBuYW1lPW52Y2YtdWlg" + - "IHwgRGVwbG95IE5WQ0YgVUkgb25seSB3aGVuIHRoZSBzdGFjayBwYWNrYWdlIGluY2x1ZGVzIHRo" + - "YXQgcmVsZWFzZSBhbmQgYGFkZG9ucy5udmNmVWkuZW5hYmxlZD10cnVlYCB8CnwgYHJlbGVhc2Ut" + - "Z3JvdXA9aW5ncmVzc2AgfCBpbmdyZXNzIChnYXRld2F5IHJvdXRlcykgfAp8IGBuYW1lPTxyZWxl" + - "YXNlPmAgfCBBbnkgaW5kaXZpZHVhbCByZWxlYXNlIGJ5IG5hbWUgfAoKTm90ZTogYGFkbWluLWlz" + - "c3Vlci1wcm94eWAgZG9lcyBub3QgaGF2ZSBhIHJlbGVhc2UtZ3JvdXAgbGFiZWwuIFRhcmdldCBp" + - "dCB3aXRoIGAtLXNlbGVjdG9yIG5hbWU9YWRtaW4taXNzdWVyLXByb3h5YC4KUEsHCAJSTkB/KAAA" + - "fygAAFBLAwQUAAgAAAAAACEAAAAAAAAAAAAAAAAATAAJAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQt" + - "aW5zdGFsbGF0aW9uL3JlZmVyZW5jZXMvY29tcHV0ZS1wbGFuZS1pbnN0YWxsYXRpb24ubWRVVAUA" + - "AQCmzhIjIFNwbGl0IENvbXB1dGUtUGxhbmUgSW5zdGFsbGF0aW9uCgpUaGUgY29udHJvbCBwbGFu" + - "ZSBhbmQgY29tcHV0ZSBwbGFuZSBhcmUgc2VwYXJhdGUgc3RhY2tzLiBJbnN0YWxsIHRoZSBjb250" + - "cm9sCnBsYW5lIGZpcnN0LCB0aGVuIHJlZ2lzdGVyIGFuZCBpbnN0YWxsIGVhY2ggY29tcHV0ZSBj" + - "bHVzdGVyLiBDaG9vc2Ugb25lIGhhbmRvZmYKYmVsb3cgYW5kIHVzZSBpdCBmb3IgdGhlIGZ1bGwg" + - "bGlmZWN5Y2xlLiBEbyBub3QgY29tYmluZSBhIENMSS1nZW5lcmF0ZWQgcHJvZmlsZQp3aXRoIHRo" + - "ZSBIZWxtZmlsZSB2YWx1ZXMgZmxvdy4KCiMjIENob29zZSBhIEhhbmRvZmYKCnwgRmxvdyB8IFNv" + - "dXJjZSBvZiBjb250cm9sLXBsYW5lIGVuZHBvaW50cyB8IFJlZ2lzdHJhdGlvbiBhcnRpZmFjdCB8" + - "CnwtLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0t" + - "LS0tLS0tLS0tLS18CnwgSGVsbWZpbGUgdmFsdWVzIHwgU2VwYXJhdGUgY29udHJvbC1wbGFuZSBh" + - "bmQgY29tcHV0ZS1wbGFuZSBlbnZpcm9ubWVudCBmaWxlcyB8IGBkZXBsb3kvc3RhY2tzL252Y2Yt" + - "Y29tcHV0ZS1wbGFuZS9yZWdpc3RyYXRpb24vPGNsdXN0ZXI+LXJlZ2lzdGVyLXZhbHVlcy55YW1s" + - "YCB8CnwgQ0xJIHByb2ZpbGUgfCBDTEktZ2VuZXJhdGVkIGBkZXBsb3kvc3RhY2tzL3NlbGYtbWFu" + - "YWdlZC9vdXQvY29udHJvbC1wbGFuZS1wcm9maWxlLnlhbWxgIHwgQ0xJLWdlbmVyYXRlZCBgZGVw" + - "bG95L3N0YWNrcy9udmNmLWNvbXB1dGUtcGxhbmUvb3V0LzxjbHVzdGVyPi1yZWdpc3Rlci12YWx1" + - "ZXMueWFtbGAgfAoKVGhlIENMSSBwcm9maWxlIGlzIG1hbmRhdG9yeSBmb3IgdGhlIENMSSBmbG93" + - "IGFuZCBtdXN0IG5vdCBiZSBoYW5kLWF1dGhvcmVkLgpUaGUgSGVsbWZpbGUgZmxvdyBkb2VzIG5v" + - "dCBjb25zdW1lIGEgY29udHJvbC1wbGFuZSBwcm9maWxlLgoKQ29tbWFuZHMgYmVsb3cgdXNlIG1v" + - "bm9yZXBvIHBhdGhzIGZyb20gdGhlIHJlcG9zaXRvcnkgcm9vdC4gT3BlcmF0b3JzIHVzaW5nCmV4" + - "dHJhY3RlZCBwYWNrYWdlcyBuZWVkIG1hdGNoaW5nLXZlcnNpb24gYG52Y2Ytc2VsZi1tYW5hZ2Vk" + - "LXN0YWNrYCBhbmQKYG52Y2YtY29tcHV0ZS1wbGFuZS1zdGFja2AgYnVuZGxlcy4gU3Vic3RpdHV0" + - "ZSB0aG9zZSBidW5kbGUgcm9vdHMgZm9yCmBkZXBsb3kvc3RhY2tzL3NlbGYtbWFuYWdlZGAgYW5k" + - "IGBkZXBsb3kvc3RhY2tzL252Y2YtY29tcHV0ZS1wbGFuZWAuCgojIyBIZWxtZmlsZSBWYWx1ZXMg" + - "RmxvdwoKQ3JlYXRlIGJvdGggZW52aXJvbm1lbnQgZmlsZXMgYmVmb3JlIGluc3RhbGxhdGlvbjoK" + - "Ci0gYGRlcGxveS9zdGFja3Mvc2VsZi1tYW5hZ2VkL2Vudmlyb25tZW50cy88ZW52Pi55YW1sYCBm" + - "b3IgY29udHJvbC1wbGFuZQogIHJlZ2lzdHJ5LCBkb21haW4sIEdhdGV3YXksIHJvdXRlcywgYW5k" + - "IHNlcnZpY2Ugc2V0dGluZ3MuCi0gYGRlcGxveS9zdGFja3MvbnZjZi1jb21wdXRlLXBsYW5lL2Vu" + - "dmlyb25tZW50cy88ZW52Pi55YW1sYCBmb3IgY29tcHV0ZS1wbGFuZQogIHJlZ2lzdHJ5LCBwdWxs" + - "IHNlY3JldHMsIGFuZCBjb21wdXRlLXJlYWNoYWJsZSBJQ01TLCBSZVZhbCwgYW5kIE5BVFMgdmFs" + - "dWVzLgoKRm9yIEVLUywgdXNlIHRoZSBjYW5vbmljYWwKW0NTUCBFbmQtdG8tRW5kIEV4YW1wbGVd" + - "KGh0dHBzOi8vZG9jcy5udmlkaWEuY29tL252Y2YvdjAuNi4wLXJjL2NzcC1lbmQtdG8tZW5kLWV4" + - "YW1wbGUpLgpUaGUgY29udHJvbC1wbGFuZSBlbnZpcm9ubWVudCBrZWVwcyB0aGUgRW52b3kgR2F0" + - "ZXdheSBjb250cm9sbGVyIGluCmBlbnZveS1nYXRld2F5LXN5c3RlbWAsIGF0dGFjaGVzIHJvdXRl" + - "cyB0byBgR2F0ZXdheS9udmNmLWdhdGV3YXlgIGluCmBlbnZveS1nYXRld2F5YCwgYW5kIGVuYWJs" + - "ZXMgdGhlIE5BVFMgcm91dGUuIFRoZSBjb21wdXRlLXBsYW5lIGVudmlyb25tZW50IHVzZXMKdGhl" + - "IGV4dGVybmFsIGFkZHJlc3MgcGx1cyB0aGUgc2VydmljZSBob3N0IG92ZXJyaWRlcy4gSGVyZSwK" + - "YDxnYXRld2F5LWFkZHJlc3M+YCBpcyB0aGUgTkxCIGFkZHJlc3MgYW5kIGA8Z2F0ZXdheS1kb21h" + - "aW4+YCBpcyB0aGUgRE5TIGJhc2UKd2hvc2Ugc2VydmljZSBzdWJkb21haW5zIHJlc29sdmUgdG8g" + - "dGhhdCBOTEI6CgpgYGB5YW1sCiMgZGVwbG95L3N0YWNrcy9zZWxmLW1hbmFnZWQvZW52aXJvbm1l" + - "bnRzLzxlbnY+LnlhbWwKZ2xvYmFsOgogIGRvbWFpbjogIjxnYXRld2F5LWRvbWFpbj4iCiAgd29y" + - "a2VyRW5kcG9pbnRzOgogICAgbnZjZlNlcnZpY2VVUkw6ICJodHRwOi8vYXBpLjxnYXRld2F5LWRv" + - "bWFpbj4iCiAgICBudmNmR3JwY1NlcnZpY2VVUkw6ICJodHRwOi8vd29ya2VyLWFwaS48Z2F0ZXdh" + - "eS1kb21haW4+IgogICAgbnZjZk5hdHNTZXJ2aWNlVVJMOiAibmF0czovLzxnYXRld2F5LWFkZHJl" + - "c3M+OjQyMjIiCiAgICBudmN0U2VydmljZVVSTDogImh0dHA6Ly90YXNrcy48Z2F0ZXdheS1kb21h" + - "aW4+IgogICAgbnZjdEdycGNTZXJ2aWNlVVJMOiAiaHR0cDovL3dvcmtlci10YXNrcy48Z2F0ZXdh" + - "eS1kb21haW4+IgogICAgaW52b2NhdGlvblNlcnZpY2VVUkw6ICJodHRwOi8vaW52b2NhdGlvbi48" + - "Z2F0ZXdheS1kb21haW4+IgoKZ3JwY3Byb3h5OgogIG52Y2ZHcnBjU2VydmljZVVSTDogImh0dHA6" + - "Ly9hcGkubnZjZi5zdmMuY2x1c3Rlci5sb2NhbDo5MDkwIgoKaW5ncmVzczoKICBnYXRld2F5QXBp" + - "OgogICAgY29udHJvbGxlck5hbWVzcGFjZTogZW52b3ktZ2F0ZXdheS1zeXN0ZW0KICAgIGdhdGV3" + - "YXlzOgogICAgICBzaGFyZWQ6IHtuYW1lOiBudmNmLWdhdGV3YXksIG5hbWVzcGFjZTogZW52b3kt" + - "Z2F0ZXdheX0KICAgICAgZ3JwYzoge25hbWU6IG52Y2YtZ2F0ZXdheSwgbmFtZXNwYWNlOiBlbnZv" + - "eS1nYXRld2F5fQogICAgICBuYXRzOgogICAgICAgIG5hbWU6IG52Y2YtZ2F0ZXdheQogICAgICAg" + - "IG5hbWVzcGFjZTogZW52b3ktZ2F0ZXdheQogICAgICAgIGxpc3RlbmVyTmFtZTogbmF0cwogICAg" + - "cm91dGVzOgogICAgICBudmNmQXBpOgogICAgICAgIGdycGM6CiAgICAgICAgICBlbmFibGVkOiB0" + - "cnVlCiAgICAgICAgICBob3N0bmFtZXM6IFsid29ya2VyLWFwaS48Z2F0ZXdheS1kb21haW4+Il0K" + - "ICAgICAgbnZjdEFwaToKICAgICAgICBncnBjOgogICAgICAgICAgZW5hYmxlZDogdHJ1ZQogICAg" + - "ICAgICAgaG9zdG5hbWVzOiBbIndvcmtlci10YXNrcy48Z2F0ZXdheS1kb21haW4+Il0KICAgICAg" + - "bmF0czoKICAgICAgICBlbmFibGVkOiB0cnVlCgpvcGVuYmFvOgogIG1pZ3JhdGlvbnM6CiAgICBp" + - "c3N1ZXJEaXNjb3Zlcnk6CiAgICAgIGVuYWJsZWQ6IHRydWUKYGBgCgpgYGB5YW1sCiMgZGVwbG95" + - "L3N0YWNrcy9udmNmLWNvbXB1dGUtcGxhbmUvZW52aXJvbm1lbnRzLzxlbnY+LnlhbWwKZ2xvYmFs" + - "OgogIG52Y2FPcGVyYXRvcjoKICAgIHNlbGZNYW5hZ2VkOgogICAgICBpY21zU2VydmljZVVSTDog" + - "Imh0dHA6Ly88Z2F0ZXdheS1hZGRyZXNzPiIKICAgICAgaWNtc1NlcnZpY2VIb3N0SGVhZGVyT3Zl" + - "cnJpZGU6ICJzaXMuPGdhdGV3YXktZG9tYWluPiIKICAgICAgcmV2YWxTZXJ2aWNlVVJMOiAiaHR0" + - "cDovLzxnYXRld2F5LWFkZHJlc3M+IgogICAgICByZXZhbFNlcnZpY2VIb3N0SGVhZGVyT3ZlcnJp" + - "ZGU6ICJyZXZhbC48Z2F0ZXdheS1kb21haW4+IgogICAgICBuYXRzVVJMOiAibmF0czovLzxnYXRl" + - "d2F5LWFkZHJlc3M+OjQyMjIiCiAgICAgIG5hdHNIb3N0T3ZlcnJpZGU6ICJuYXRzLjxnYXRld2F5" + - "LWRvbWFpbj4iCmBgYAoKUHJldmlldyBhbmQgaW5zdGFsbCB0aGUgY29udHJvbCBwbGFuZSBhZ2Fp" + - "bnN0IGl0cyBjb250ZXh0OgoKYGBgYmFzaAptYWtlIC1DIGRlcGxveS9zdGFja3Mvc2VsZi1tYW5h" + - "Z2VkIHRlbXBsYXRlIFwKICBIRUxNRklMRV9FTlY9PGVudj4gXAogIEtVQkVDT05GSUdfRklMRT08" + - "Y29udHJvbC1wbGFuZS1rdWJlY29uZmlnPgoKbWFrZSAtQyBkZXBsb3kvc3RhY2tzL3NlbGYtbWFu" + - "YWdlZCBpbnN0YWxsIFwKICBIRUxNRklMRV9FTlY9PGVudj4gXAogIEtVQkVDT05GSUdfRklMRT08" + - "Y29udHJvbC1wbGFuZS1rdWJlY29uZmlnPgpgYGAKCkJlZm9yZSByZWdpc3RlcmluZyB0aHJvdWdo" + - "IGEgYmFyZSBHYXRld2F5IGFkZHJlc3MsIGNyZWF0ZSBvciB1cGRhdGUgdGhlIENMSQpjb25maWcg" + - "cGFzc2VkIGFzIGBOVkNGX0NMSV9DT05GSUdgOgoKYGBgeWFtbApiYXNlX2h0dHBfdXJsOiAiaHR0" + - "cDovLzxnYXRld2F5LWFkZHJlc3M+IgppbnZva2VfdXJsOiAiaHR0cDovLzxnYXRld2F5LWFkZHJl" + - "c3M+IgpiYXNlX2dycGNfdXJsOiAiPGdhdGV3YXktYWRkcmVzcz46MTAwODEiCmFwaV9rZXlzX3Nl" + - "cnZpY2VfdXJsOiAiaHR0cDovLzxnYXRld2F5LWFkZHJlc3M+IgppY21zX3VybDogImh0dHA6Ly88" + - "Z2F0ZXdheS1hZGRyZXNzPiIKYXBpX2hvc3Q6ICJhcGkuPGdhdGV3YXktZG9tYWluPiIKYXBpX2tl" + - "eXNfaG9zdDogImFwaS1rZXlzLjxnYXRld2F5LWRvbWFpbj4iCmludm9rZV9ob3N0OiAiaW52b2Nh" + - "dGlvbi48Z2F0ZXdheS1kb21haW4+IgppY21zX2hvc3Q6ICJzaXMuPGdhdGV3YXktZG9tYWluPiIK" + - "YGBgCgpIb3N0IGZpZWxkcyBjb250YWluIGhvc3RuYW1lcyBvbmx5LCB3aXRob3V0IGEgVVJMIHNj" + - "aGVtZS4gYElDTVNfVVJMYCBtYXBzIG9ubHkKdG8gdGhlIHJlZ2lzdHJhdGlvbiBjb21tYW5kJ3Mg" + - "YC0taWNtcy11cmxgOyBgaWNtc19ob3N0YCBpbiB0aGUgY29uZmlnIHN1cHBsaWVzCnRoZSBHYXRl" + - "d2F5IEhvc3QgaGVhZGVyLiBUaGVyZSBpcyBubyBgLS1pY21zLWhvc3RgIE1ha2Ugb3IgQ0xJIGZs" + - "YWcuCgpSZWdpc3RlciBmcm9tIHRoZSBjb21wdXRlIGNvbnRleHQsIHRoZW4gaW5zdGFsbCB0aGUg" + - "Y29tcHV0ZSBwbGFuZToKCmBgYGJhc2gKbWFrZSAtQyBkZXBsb3kvc3RhY2tzL252Y2YtY29tcHV0" + - "ZS1wbGFuZSByZWdpc3Rlci1jbHVzdGVyIFwKICBDTFVTVEVSX05BTUU9PGNsdXN0ZXItbmFtZT4g" + - "XAogIE5DQV9JRD08bmNhLWlkPiBcCiAgQ0xVU1RFUl9SRUdJT049PHJlZ2lvbj4gXAogIElDTVNf" + - "VVJMPWh0dHA6Ly88Z2F0ZXdheS1hZGRyZXNzPiBcCiAgS1VCRUNPTkZJR19GSUxFPTxjb21wdXRl" + - "LXBsYW5lLWt1YmVjb25maWc+IFwKICBOVkNGX0NMST08cGF0aC10by1udmNmLWNsaT4gXAogIE5W" + - "Q0ZfQ0xJX0NPTkZJRz08cGF0aC10by1udmNmLWNsaS1jb25maWc+CgptYWtlIC1DIGRlcGxveS9z" + - "dGFja3MvbnZjZi1jb21wdXRlLXBsYW5lIGluc3RhbGwgXAogIENMVVNURVJfTkFNRT08Y2x1c3Rl" + - "ci1uYW1lPiBcCiAgSEVMTUZJTEVfRU5WPTxlbnY+IFwKICBLVUJFQ09ORklHX0ZJTEU9PGNvbXB1" + - "dGUtcGxhbmUta3ViZWNvbmZpZz4KYGBgCgpSZWdpc3RyYXRpb24gZGlzY292ZXJzIHRoZSBPSURD" + - "IGlzc3VlciBhbmQgSldLUyBmcm9tIHRoZSBjb21wdXRlIGt1YmUgY29udGV4dC4KSW4gYSBtdWx0" + - "aS1jbHVzdGVyIGRlcGxveW1lbnQsIGBLVUJFQ09ORklHX0ZJTEVgIGlzIHJlcXVpcmVkIG9uIGJv" + - "dGgKY29tcHV0ZS1wbGFuZSBjb21tYW5kcy4gSW4gYSBzYW1lLWNsdXN0ZXIgZGVwbG95bWVudCBp" + - "dCBtYXkgYmUgb21pdHRlZCBvbmx5CndoZW4gdGhlIGFtYmllbnQgY29udGV4dCBpcyBhbHJlYWR5" + - "IHRoZSB0YXJnZXQgY2x1c3Rlci4KCiMjIENMSSBQcm9maWxlIEZsb3cKClJ1biB0aGUgQ0xJIGNv" + - "bnRyb2wtcGxhbmUgaW5zdGFsbCBmaXJzdC4gSXQgY3JlYXRlcyB0aGUgcHJvZmlsZSBjb25zdW1l" + - "ZCBieQpjb21wdXRlLXBsYW5lIHJlZ2lzdHJhdGlvbjoKCmBgYGJhc2gKbnZjZi1jbGkgLS1jb25m" + - "aWcgPGNvbmZpZz4gc2VsZi1ob3N0ZWQgXAogIC0tY29udHJvbC1wbGFuZS1zdGFjayBkZXBsb3kv" + - "c3RhY2tzL3NlbGYtbWFuYWdlZCBcCiAgLS1jb21wdXRlLXBsYW5lLXN0YWNrIGRlcGxveS9zdGFj" + - "a3MvbnZjZi1jb21wdXRlLXBsYW5lIFwKICAtLWVudiA8ZW52PiBcCiAgLS1wbGFpbiBcCiAgLS1j" + - "b250cm9sLXBsYW5lLWNvbnRleHQgPGNvbnRyb2wtcGxhbmUtY29udGV4dD4gXAogIC0tY29tcHV0" + - "ZS1wbGFuZS1jb250ZXh0IDxjb21wdXRlLXBsYW5lLWNvbnRleHQ+IFwKICBpbnN0YWxsIC0tY29u" + - "dHJvbC1wbGFuZSBcCiAgLS1jbHVzdGVyLW5hbWUgPGNvbnRyb2wtcGxhbmUtY2x1c3Rlci1uYW1l" + - "PiBcCiAgLS1yZWdpb24gPHJlZ2lvbj4gXAogIC0tbmNhLWlkIDxuY2EtaWQ+Cgp0ZXN0IC1zIGRl" + - "cGxveS9zdGFja3Mvc2VsZi1tYW5hZ2VkL291dC9jb250cm9sLXBsYW5lLXByb2ZpbGUueWFtbApg" + - "YGAKClVzZSB0aGUgZnVsbCBwZXJzaXN0ZW50IHByZWZpeCBmb3IgYm90aCBjb21wdXRlLXBsYW5l" + - "IGNvbW1hbmRzOgoKYGBgYmFzaApudmNmLWNsaSAtLWNvbmZpZyA8Y29uZmlnPiBzZWxmLWhvc3Rl" + - "ZCBcCiAgLS1jb250cm9sLXBsYW5lLXN0YWNrIGRlcGxveS9zdGFja3Mvc2VsZi1tYW5hZ2VkIFwK" + - "ICAtLWNvbXB1dGUtcGxhbmUtc3RhY2sgZGVwbG95L3N0YWNrcy9udmNmLWNvbXB1dGUtcGxhbmUg" + - "XAogIC0tZW52IDxlbnY+IFwKICAtLXBsYWluIFwKICBjb21wdXRlLXBsYW5lIHJlZ2lzdGVyIFwK" + - "ICAtLWNvbnRyb2wtcGxhbmUtcHJvZmlsZSBkZXBsb3kvc3RhY2tzL3NlbGYtbWFuYWdlZC9vdXQv" + - "Y29udHJvbC1wbGFuZS1wcm9maWxlLnlhbWwgXAogIC0tY2x1c3Rlci1uYW1lIDxjb21wdXRlLXBs" + - "YW5lLWNsdXN0ZXItbmFtZT4gXAogIC0ta3ViZS1jb250ZXh0IDxjb21wdXRlLXBsYW5lLWNvbnRl" + - "eHQ+IFwKICAtLXJlZ2lvbiA8cmVnaW9uPiBcCiAgLS1vdXRwdXQgZGVwbG95L3N0YWNrcy9udmNm" + - "LWNvbXB1dGUtcGxhbmUvb3V0Lzxjb21wdXRlLXBsYW5lLWNsdXN0ZXItbmFtZT4tcmVnaXN0ZXIt" + - "dmFsdWVzLnlhbWwKCm52Y2YtY2xpIC0tY29uZmlnIDxjb25maWc+IHNlbGYtaG9zdGVkIFwKICAt" + - "LWNvbnRyb2wtcGxhbmUtc3RhY2sgZGVwbG95L3N0YWNrcy9zZWxmLW1hbmFnZWQgXAogIC0tY29t" + - "cHV0ZS1wbGFuZS1zdGFjayBkZXBsb3kvc3RhY2tzL252Y2YtY29tcHV0ZS1wbGFuZSBcCiAgLS1l" + - "bnYgPGVudj4gXAogIC0tcGxhaW4gXAogIGNvbXB1dGUtcGxhbmUgaW5zdGFsbCBcCiAgLS12YWx1" + - "ZXMgZGVwbG95L3N0YWNrcy9udmNmLWNvbXB1dGUtcGxhbmUvb3V0Lzxjb21wdXRlLXBsYW5lLWNs" + - "dXN0ZXItbmFtZT4tcmVnaXN0ZXItdmFsdWVzLnlhbWwgXAogIC0ta3ViZS1jb250ZXh0IDxjb21w" + - "dXRlLXBsYW5lLWNvbnRleHQ+IFwKICAtLWNsdXN0ZXItbmFtZSA8Y29tcHV0ZS1wbGFuZS1jbHVz" + - "dGVyLW5hbWU+CmBgYAoKUmVnaXN0cmF0aW9uIHNlbGVjdHMgdGhlIHByb2ZpbGUncyBpbi1jbHVz" + - "dGVyIG9yIGNvbXB1dGUtcmVhY2hhYmxlIGVuZHBvaW50cwpmcm9tIHRoZSBjb21wdXRlIGNvbnRl" + - "eHQgYW5kIHByb2JlcyBpdHMgSldLUy4gRG8gbm90IHJlcGxhY2UgcHJvZmlsZSBlbmRwb2ludHMK" + - "d2l0aCBoYW5kLWF1dGhvcmVkIEhlbG1maWxlIGVuZHBvaW50IHZhbHVlcy4KCiMjIFB1bGwgU2Vj" + - "cmV0cwoKQ3JlYXRlIHRoZSBjb250cm9sLXBsYW5lIHNlY3JldCBpbiB0aGVzZSBuYW1lc3BhY2Vz" + - "IG9uIHRoZSBjb250cm9sLXBsYW5lCmNvbnRleHQ6CgpgYGB0ZXh0CmNhc3NhbmRyYS1zeXN0ZW0g" + - "bmF0cy1zeXN0ZW0gbnZjZiBhcGkta2V5cyBlc3Mgc2lzIHZhdWx0LXN5c3RlbSBjZXJ0LW1hbmFn" + - "ZXIKYGBgCgpPbiB0aGUgY29tcHV0ZSBjb250ZXh0LCBjcmVhdGUgdGhlIHNlY3JldCBvbmx5IGlu" + - "IGBudmNhLW9wZXJhdG9yYCBhbmQgcmVmZXJlbmNlCml0IHRocm91Z2ggYGdsb2JhbC5pbWFnZVB1" + - "bGxTZWNyZXRzYCBpbiB0aGUgY29tcHV0ZS1wbGFuZSBlbnZpcm9ubWVudC4gVGhlIGNoYXJ0CmFu" + - "ZCBvcGVyYXRvciB1c2UgaXQgaW4gYG52Y2Etb3BlcmF0b3JgIGFuZCBtaXJyb3IgaXQgdG8gYG52" + - "Y2Etc3lzdGVtYC4gRG8gbm90IGFkZAplaXRoZXIgbmFtZXNwYWNlIHRvIHRoZSBjb250cm9sLXBs" + - "YW5lIGxpc3QuIEZvciBjb21tYW5kcyBhbmQgcG9saWN5IGV4YW1wbGVzLApzZWUgW3B1bGwtc2Vj" + - "cmV0cy5tZF0ocHVsbC1zZWNyZXRzLm1kKS4KCiMjIFZlcmlmaWNhdGlvbgoKVXNlIHRoZSBleHBs" + - "aWNpdCBHYXRld2F5IG5hbWUgYW5kIG5hbWVzcGFjZToKCmBgYGJhc2gKa3ViZWN0bCAtLWNvbnRl" + - "eHQgPGNvbnRyb2wtcGxhbmUtY29udGV4dD4gZ2V0IGdhdGV3YXkgbnZjZi1nYXRld2F5IFwKICAt" + - "biBlbnZveS1nYXRld2F5IC1vIHdpZGUKa3ViZWN0bCAtLWNvbnRleHQgPGNvbnRyb2wtcGxhbmUt" + - "Y29udGV4dD4gZ2V0IHRjcHJvdXRlIC1uIGVudm95LWdhdGV3YXkKa3ViZWN0bCAtLWNvbnRleHQg" + - "PGNvbXB1dGUtcGxhbmUtY29udGV4dD4gcm9sbG91dCBzdGF0dXMgXAogIGRlcGxveW1lbnQvbnZj" + - "YS1vcGVyYXRvciAtbiBudmNhLW9wZXJhdG9yIC0tdGltZW91dD0xMG0Ka3ViZWN0bCAtLWNvbnRl" + - "eHQgPGNvbXB1dGUtcGxhbmUtY29udGV4dD4gd2FpdCBcCiAgbnZjZmJhY2tlbmQvPGNvbXB1dGUt" + - "cGxhbmUtY2x1c3Rlci1uYW1lPiAtbiBudmNhLW9wZXJhdG9yIFwKICAtLWZvcj1qc29ucGF0aD0n" + - "ey5zdGF0dXMuYWdlbnRTdGF0dXN9Jz1oZWFsdGh5IC0tdGltZW91dD0xMG0Ka3ViZWN0bCAtLWNv" + - "bnRleHQgPGNvbXB1dGUtcGxhbmUtY29udGV4dD4gZ2V0IHNlY3JldCA8cHVsbC1zZWNyZXQ+IC1u" + - "IG52Y2Etc3lzdGVtCmBgYAoKIyMgVGVhcmRvd24KCkRlc3Ryb3kgYW5kIGRlcmVnaXN0ZXIgZXZl" + - "cnkgY29tcHV0ZSBwbGFuZSBiZWZvcmUgdGhlIGNvbnRyb2wgcGxhbmUuIEJvdGgKaGFuZG9mZnMg" + - "Y2FuIGRlc3Ryb3kgdGhlIGNvbnRyb2wgcGxhbmUsIHNvIGFwcGx5IHRoaXMgcHJlZmxpZ2h0IGJl" + - "Zm9yZSBlaXRoZXIKb25lLiBQcmVzZXJ2ZSB0aGUgYGNlcnQtbWFuYWdlcmAgbmFtZXNwYWNlIGJ5" + - "IGRlZmF1bHQuIE5hbWVzcGFjZSBwcmVzZXJ2YXRpb24KZG9lcyBub3QgcHJlc2VydmUgdGhlIEhl" + - "bG0gcmVsZWFzZS4gSWRlbnRpZnkgd2hldGhlciBjZXJ0LW1hbmFnZXIgaXMgZXh0ZXJuYWwuCkZv" + - "ciBhbiBleHRlcm5hbCBpbnN0YWxsYXRpb24sIHJlcXVpcmUgZWZmZWN0aXZlIGBjZXJ0TWFuYWdl" + - "ci5lbmFibGVkOiBmYWxzZWAKYW5kIGFib3J0IGlmIGl0IGlzIHRydWUuIEZvciBhbiBpbnRlbmRl" + - "ZCBzdGFjay1tYW5hZ2VkIHJlbGVhc2Ugd2l0aCBlZmZlY3RpdmUKYGNlcnRNYW5hZ2VyLmVuYWJs" + - "ZWQ6IHRydWVgLCB2ZXJpZnkgbWF0Y2hpbmcgc3RhY2sgSGVsbSByZWxlYXNlIG1ldGFkYXRhIGFu" + - "ZAphYm9ydCBvbiBtaXNzaW5nIG9yIG1pc21hdGNoZWQgZXZpZGVuY2UuIE9ubHkgcGxhbiBuYW1l" + - "c3BhY2UgcmVtb3ZhbCBhZnRlcgp2ZXJpZnlpbmcgbmFtZXNwYWNlIHByb3ZlbmFuY2UgYW5kIGdl" + - "dHRpbmcgZXhwbGljaXQgY29uZmlybWF0aW9uOyBvdGhlcndpc2UKZG8gbm90IGRlbGV0ZSBpdC4K" + - "CkZvciB0aGUgSGVsbWZpbGUgdmFsdWVzIGZsb3csIHJldGFpbiBlYWNoIHJlZ2lzdHJhdGlvbiB2" + - "YWx1ZXMgZmlsZSB1bnRpbApjbGVhbnVwIGlzIHZlcmlmaWVkOgoKYGBgYmFzaAptYWtlIC1DIGRl" + - "cGxveS9zdGFja3MvbnZjZi1jb21wdXRlLXBsYW5lIGRlc3Ryb3kgXAogIENMVVNURVJfTkFNRT08" + - "Y2x1c3Rlci1uYW1lPiBcCiAgSEVMTUZJTEVfRU5WPTxlbnY+IFwKICBLVUJFQ09ORklHX0ZJTEU9" + - "PGNvbXB1dGUtcGxhbmUta3ViZWNvbmZpZz4KCjxudmNmLWNsaT4gLS1jb25maWcgPGNvbmZpZz4g" + - "Y2x1c3RlciBkZWxldGUgXAogIC0tY2x1c3Rlci1pZCA8Y2x1c3Rlci1pZC1mcm9tLXJlZ2lzdHJh" + - "dGlvbi12YWx1ZXM+IFwKICAtLW5jYS1pZCA8bmNhLWlkPiBcCiAgLS1pZ25vcmUtbWlzc2luZwpg" + - "YGAKClJlYWQgYGNsdXN0ZXJJRGAgYW5kIGBuY2FJRGAgZnJvbQpgZGVwbG95L3N0YWNrcy9udmNm" + - "LWNvbXB1dGUtcGxhbmUvcmVnaXN0cmF0aW9uLzxjbHVzdGVyLW5hbWU+LXJlZ2lzdGVyLXZhbHVl" + - "cy55YW1sYC4KU2hvdyB0aGUgZXhhY3QgY2x1c3RlciBJRCBhbmQgZ2V0IGNvbmZpcm1hdGlvbiBi" + - "ZWZvcmUgYGNsdXN0ZXIgZGVsZXRlYC4gUmVwZWF0CmNvbXB1dGUgZGVzdHJveSBhbmQgZGVyZWdp" + - "c3RyYXRpb24gZm9yIGV2ZXJ5IGNvbXB1dGUgY2x1c3RlciwgdGhlbiBkZXN0cm95IHRoZQpjb250" + - "cm9sIHBsYW5lLgoKYGBgYmFzaApLVUJFQ09ORklHPTxjb250cm9sLXBsYW5lLWt1YmVjb25maWc+" + - "IFwKbWFrZSAtQyBkZXBsb3kvc3RhY2tzL3NlbGYtbWFuYWdlZCBkZXN0cm95IFwKICBIRUxNRklM" + - "RV9FTlY9PGVudj4gXAogIEtVQkVDT05GSUdfRklMRT08Y29udHJvbC1wbGFuZS1rdWJlY29uZmln" + - "PgpgYGAKCkJvdGggYEtVQkVDT05GSUdgIGFuZCBgS1VCRUNPTkZJR19GSUxFYCBhcmUgcmVxdWly" + - "ZWQgb24gdGhlIGNvbnRyb2wtcGxhbmUKZGVzdHJveSBiZWNhdXNlIGl0cyBuYW1lc3BhY2UgY2xl" + - "YW51cCB1c2VzIGFtYmllbnQgYGt1YmVjdGxgLgoKRm9yIHRoZSBDTEkgcHJvZmlsZSBmbG93LCBr" + - "ZWVwCmBkZXBsb3kvc3RhY2tzL252Y2YtY29tcHV0ZS1wbGFuZS9vdXQvPGNsdXN0ZXItbmFtZT4t" + - "cmVnaXN0ZXItdmFsdWVzLnlhbWxgCnVudGlsIHRlYXJkb3duIGNvbXBsZXRlcyBiZWNhdXNlIGBk" + - "b3duYCByZWFkcyBpdHMgY2x1c3RlciBJRC4gRmlyc3QgcXVlcnkgdGhlCmxpdmUgcmVnaXN0cmF0" + - "aW9uIHNldCB3aXRoIHRoZSBzYW1lIGNvbXBsZXRlIHBlcnNpc3RlbnQgcHJlZml4OgoKYGBgYmFz" + - "aApudmNmLWNsaSAtLWNvbmZpZyA8Y29uZmlnPiBzZWxmLWhvc3RlZCBcCiAgLS1jb250cm9sLXBs" + - "YW5lLXN0YWNrIGRlcGxveS9zdGFja3Mvc2VsZi1tYW5hZ2VkIFwKICAtLWNvbXB1dGUtcGxhbmUt" + - "c3RhY2sgZGVwbG95L3N0YWNrcy9udmNmLWNvbXB1dGUtcGxhbmUgXAogIC0tZW52IDxlbnY+IFwK" + - "ICAtLXBsYWluIFwKICAtLWNvbnRyb2wtcGxhbmUtY29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250" + - "ZXh0PiBcCiAgLS1jb21wdXRlLXBsYW5lLWNvbnRleHQgPGNvbXB1dGUtcGxhbmUtY29udGV4dD4g" + - "XAogIC0taWNtcy11cmwgPGNvbXB1dGUtcmVhY2hhYmxlLWljbXMtdXJsPiBcCiAgc3RhdHVzIFwK" + - "ICAtLWNsdXN0ZXItbmFtZSA8Y29tcHV0ZS1wbGFuZS1jbHVzdGVyLW5hbWU+IFwKICAtLW5jYS1p" + - "ZCA8bmNhLWlkPgpgYGAKClNob3cgdGhlIHJlZ2lzdGVyZWQgY29tcHV0ZS1wbGFuZSBsaXN0LiBO" + - "YW1lZC1jbHVzdGVyIGBkb3duIC0tcGxhbi1vbmx5YCBkb2VzCm5vdCBxdWVyeSBJQ01TLCBzbyBp" + - "dCBwcmV2aWV3cyBvbmx5IHRoYXQgY29tcHV0ZSBwbGFuZSBhbmQgY2Fubm90IHNob3cgdGhlCmNv" + - "bmRpdGlvbmFsIGNvbnRyb2wtcGxhbmUgcmVtb3ZhbC4gSWYgdGhlIHRhcmdldCBpcyB0aGUgbGFz" + - "dCByZWdpc3RlcmVkCmNsdXN0ZXIsIHJlYWwgYGRvd25gIGFsc28gZGVzdHJveXMgdGhlIGNvbnRy" + - "b2wgcGxhbmUuIEdldCBleHBsaWNpdCBjb25maXJtYXRpb24KZm9yIGJvdGggcmVtb3ZhbHMgYmVm" + - "b3JlIGNvbnRpbnVpbmcuIFRoZW4gcHJldmlldyBhbmQgZXhlY3V0ZSB3aXRoIHRoZSBzYW1lCnBy" + - "ZWZpeDoKCmBgYGJhc2gKbnZjZi1jbGkgLS1jb25maWcgPGNvbmZpZz4gc2VsZi1ob3N0ZWQgXAog" + - "IC0tY29udHJvbC1wbGFuZS1zdGFjayBkZXBsb3kvc3RhY2tzL3NlbGYtbWFuYWdlZCBcCiAgLS1j" + - "b21wdXRlLXBsYW5lLXN0YWNrIGRlcGxveS9zdGFja3MvbnZjZi1jb21wdXRlLXBsYW5lIFwKICAt" + - "LWVudiA8ZW52PiBcCiAgLS1wbGFpbiBcCiAgLS1jb250cm9sLXBsYW5lLWNvbnRleHQgPGNvbnRy" + - "b2wtcGxhbmUtY29udGV4dD4gXAogIC0tY29tcHV0ZS1wbGFuZS1jb250ZXh0IDxjb21wdXRlLXBs" + - "YW5lLWNvbnRleHQ+IFwKICAtLWljbXMtdXJsIDxjb21wdXRlLXJlYWNoYWJsZS1pY21zLXVybD4g" + - "XAogIGRvd24gLS1wbGFuLW9ubHkgXAogIC0tY2x1c3Rlci1uYW1lIDxjb21wdXRlLXBsYW5lLWNs" + - "dXN0ZXItbmFtZT4gXAogIC0tbmNhLWlkIDxuY2EtaWQ+CgpudmNmLWNsaSAtLWNvbmZpZyA8Y29u" + - "ZmlnPiBzZWxmLWhvc3RlZCBcCiAgLS1jb250cm9sLXBsYW5lLXN0YWNrIGRlcGxveS9zdGFja3Mv" + - "c2VsZi1tYW5hZ2VkIFwKICAtLWNvbXB1dGUtcGxhbmUtc3RhY2sgZGVwbG95L3N0YWNrcy9udmNm" + - "LWNvbXB1dGUtcGxhbmUgXAogIC0tZW52IDxlbnY+IFwKICAtLXBsYWluIFwKICAtLWNvbnRyb2wt" + - "cGxhbmUtY29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBcCiAgLS1jb21wdXRlLXBsYW5l" + - "LWNvbnRleHQgPGNvbXB1dGUtcGxhbmUtY29udGV4dD4gXAogIC0taWNtcy11cmwgPGNvbXB1dGUt" + - "cmVhY2hhYmxlLWljbXMtdXJsPiBcCiAgZG93biBcCiAgLS1jbHVzdGVyLW5hbWUgPGNvbXB1dGUt" + - "cGxhbmUtY2x1c3Rlci1uYW1lPiBcCiAgLS1uY2EtaWQgPG5jYS1pZD4KYGBgCgpSZXBlYXQgYGRv" + - "d25gIGZvciBlYWNoIGNvbXB1dGUgY2x1c3Rlci4gRWFjaCBydW4gZGVzdHJveXMgdGhhdCBjb21w" + - "dXRlIHBsYW5lIGFuZAp1bnJlZ2lzdGVycyBpdHMgSUNNUyByb3cuIEl0IHJlbW92ZXMgdGhlIGNv" + - "bnRyb2wgcGxhbmUgb25seSBhZnRlciBubyBjbHVzdGVyCnJlZ2lzdHJhdGlvbnMgcmVtYWluLgpQ" + - "SwcIlmO8WRIwAAASMAAAUEsDBBQACAAAAAAAIQAAAAAAAAAAAAAAAAA7AAkAZGF0YS9udmNmLXNl" + - "bGYtbWFuYWdlZC1pbnN0YWxsYXRpb24vcmVmZXJlbmNlcy9kZWJ1Z2dpbmcubWRVVAUAAQCmzhIj" + - "IERlYnVnZ2luZyBSZWZlcmVuY2UKClJlY2lwZXMgZm9yIGRpYWdub3NpbmcgYW5kIGZpeGluZyBj" + - "b21tb24gTlZDRiBzZWxmLW1hbmFnZWQgc3RhY2sgZmFpbHVyZXMuCgojIyBRdWljayBTdGF0dXMg" + - "Q29tbWFuZHMKCmBgYGJhc2gKIyBBbGwgcG9kcyBhY3Jvc3MgYWxsIG5hbWVzcGFjZXMKa3ViZWN0" + - "bCBnZXQgcG9kcyAtQSAtbyB3aWRlCgojIFBvZHMgaW4gYSBzcGVjaWZpYyBuYW1lc3BhY2UKa3Vi" + - "ZWN0bCBnZXQgcG9kcyAtbiA8bmFtZXNwYWNlPgoKIyBBbGwgaGVsbSByZWxlYXNlcwpoZWxtIGxp" + - "c3QgLUEKCiMgUmVjZW50IGV2ZW50cyAobW9zdCB1c2VmdWwgZm9yIGRpYWdub3NpbmcgZmFpbHVy" + - "ZXMpCmt1YmVjdGwgZ2V0IGV2ZW50cyAtbiA8bmFtZXNwYWNlPiAtLXNvcnQtYnk9Jy5sYXN0VGlt" + - "ZXN0YW1wJwoKIyBEZXNjcmliZSBhIHNwZWNpZmljIHBvZCAoc2hvd3MgZXZlbnRzLCBjb25kaXRp" + - "b25zLCB2b2x1bWVzKQprdWJlY3RsIGRlc2NyaWJlIHBvZCAtbiA8bmFtZXNwYWNlPiA8cG9kLW5h" + - "bWU+CmBgYAoKIyMgRmFpbHVyZTogSW1hZ2VQdWxsQmFja09mZgoKIyMjIFN5bXB0b21zCgpgYGB0" + - "ZXh0Ck5BTUUgICAgICAgICAgIFJFQURZICAgU1RBVFVTICAgICAgICAgICAgIFJFU1RBUlRTICAg" + - "QUdFCmNhc3NhbmRyYS0wICAgIDAvMSAgICAgSW1hZ2VQdWxsQmFja09mZiAgIDAgICAgICAgICAg" + - "NW0KYGBgCgpFdmVudHMgc2hvdzoKCmBgYHRleHQKRmFpbGVkIHRvIHB1bGwgaW1hZ2UgIm52Y3Iu" + - "aW8vLi4uL2ltYWdlOnRhZyI6IDQwMSBVbmF1dGhvcml6ZWQKYGBgCgojIyMgRGlhZ25vc2lzCgpg" + - "YGBiYXNoCiMgQ2hlY2sgd2hhdCBpbWFnZSBpcyBmYWlsaW5nCmt1YmVjdGwgZGVzY3JpYmUgcG9k" + - "IC1uIDxuYW1lc3BhY2U+IDxwb2QtbmFtZT4gfCBncmVwIC1BNSAiRXZlbnRzOiIKCiMgQ2hlY2sg" + - "aWYgcHVsbCBzZWNyZXQgZXhpc3RzIGluIHRoZSBuYW1lc3BhY2UKa3ViZWN0bCBnZXQgc2VjcmV0" + - "IG52Y3ItY3JlZHMgLW4gPG5hbWVzcGFjZT4KCiMgQ2hlY2sgaWYgdGhlIHBvZCBzcGVjIGhhcyBp" + - "bWFnZVB1bGxTZWNyZXRzCmt1YmVjdGwgZ2V0IHBvZCAtbiA8bmFtZXNwYWNlPiA8cG9kLW5hbWU+" + - "IC1vIGpzb25wYXRoPSd7LnNwZWMuaW1hZ2VQdWxsU2VjcmV0c30nCgojIENoZWNrIGlmIHRoZSBT" + - "ZXJ2aWNlQWNjb3VudCBoYXMgaW1hZ2VQdWxsU2VjcmV0cwprdWJlY3RsIGdldCBzYSA8c2EtbmFt" + - "ZT4gLW4gPG5hbWVzcGFjZT4gLW8ganNvbnBhdGg9J3suaW1hZ2VQdWxsU2VjcmV0c30nCmBgYAoK" + - "IyMjIEZpeGVzCgoxLiAqKlNlY3JldCBtaXNzaW5nIGluIG5hbWVzcGFjZSoqOiBDcmVhdGUgaXQK" + - "CiAgIGBgYGJhc2gKICAga3ViZWN0bCBjcmVhdGUgc2VjcmV0IGRvY2tlci1yZWdpc3RyeSBudmNy" + - "LWNyZWRzIFwKICAgICAtLWRvY2tlci1zZXJ2ZXI9bnZjci5pbyBcCiAgICAgLS1kb2NrZXItdXNl" + - "cm5hbWU9JyRvYXV0aHRva2VuJyBcCiAgICAgLS1kb2NrZXItcGFzc3dvcmQ9IiROR0NfQVBJX0tF" + - "WSIgXAogICAgIC0tbmFtZXNwYWNlPTxuYW1lc3BhY2U+IFwKICAgICAtLWRyeS1ydW49Y2xpZW50" + - "IC1vIHlhbWwgfCBrdWJlY3RsIGFwcGx5IC1mIC0KICAgYGBgCgoyLiAqKlNlY3JldCBleGlzdHMg" + - "YnV0IHBvZCBkb2Vzbid0IHJlZmVyZW5jZSBpdCoqOiBUaGUgY2hhcnQgbmVlZHMgYGltYWdlUHVs" + - "bFNlY3JldHNgIGNvbmZpZ3VyZWQgdmlhIGhlbG1maWxlIHZhbHVlcy4gU2VlIFtwdWxsLXNlY3Jl" + - "dHMubWRdKHB1bGwtc2VjcmV0cy5tZCkuCgozLiAqKkNoYXJ0IGRvZXNuJ3Qgc3VwcG9ydCBpbWFn" + - "ZVB1bGxTZWNyZXRzKiogKG9wZW5iYW8sIGludm9jYXRpb24tc2VydmljZSwgZXNzLWFwaSwgbm90" + - "YXJ5LXNlcnZpY2UpOiBQYXRjaCBTZXJ2aWNlQWNjb3VudHMgYW5kIHJlc3RhcnQgcG9kcy4gU2Vl" + - "IFtwdWxsLXNlY3JldHMubWRdKHB1bGwtc2VjcmV0cy5tZCkuCgo0LiAqKldyb25nIGNyZWRlbnRp" + - "YWxzIGluIHNlY3JldCoqOiBEZWxldGUgYW5kIHJlY3JlYXRlCgogICBgYGBiYXNoCiAgIGt1YmVj" + - "dGwgZGVsZXRlIHNlY3JldCBudmNyLWNyZWRzIC1uIDxuYW1lc3BhY2U+CiAgICMgUmVjcmVhdGUg" + - "d2l0aCBjb3JyZWN0IGNyZWRlbnRpYWxzCiAgIGBgYAoKIyMgRmFpbHVyZTogSW5pdDowLzEgU3R1" + - "Y2sgKFZhdWx0IEFnZW50KQoKIyMjIFN5bXB0b21zCgpTZXJ2aWNlIHBvZHMgc3R1Y2sgaW4gYElu" + - "aXQ6MC8xYCBmb3IgbWludXRlczoKCmBgYGJhc2gKTkFNRSAgICAgICAgICAgICAgICAgICAgICAg" + - "IFJFQURZICAgU1RBVFVTICAgICBSRVNUQVJUUyAgIEFHRQpudmNmLWFwaS03ZjRjNzZmNzg4LTQ0" + - "dmx0ICAwLzIgICAgIEluaXQ6MC8xICAgMCAgICAgICAgICAxMG0KYGBgCgojIyMgRGlhZ25vc2lz" + - "CgpUaGUgaW5pdCBjb250YWluZXIgaXMgdGhlIHZhdWx0LWFnZW50LWluaXQgaW5qZWN0b3Igd2Fp" + - "dGluZyBmb3IgT3BlbkJhby4KCmBgYGJhc2gKIyBDaGVjayBPcGVuQmFvIHBvZHMKa3ViZWN0bCBn" + - "ZXQgcG9kcyAtbiB2YXVsdC1zeXN0ZW0KCiMgQ2hlY2sgaWYgT3BlbkJhbyBtaWdyYXRpb24gam9i" + - "IHJhbgprdWJlY3RsIGdldCBqb2JzIC1uIHZhdWx0LXN5c3RlbQoKIyBDaGVjayBPcGVuQmFvIHBv" + - "ZCBsb2dzCmt1YmVjdGwgbG9ncyAtbiB2YXVsdC1zeXN0ZW0gb3BlbmJhby1zZXJ2ZXItMCAtYyBv" + - "cGVuYmFvCgojIENoZWNrIGluaXQgY29udGFpbmVyIGxvZ3Mgb24gdGhlIHN0dWNrIHBvZAprdWJl" + - "Y3RsIGxvZ3MgLW4gPG5hbWVzcGFjZT4gPHBvZC1uYW1lPiAtYyB2YXVsdC1hZ2VudC1pbml0CmBg" + - "YAoKIyMjIEZpeGVzCgoxLiAqKk9wZW5CYW8gcG9kcyBub3QgcnVubmluZyoqOiBDaGVjayB0aGVp" + - "ciBldmVudHMgZm9yIGltYWdlIHB1bGwgaXNzdWVzLCByZXNvdXJjZSBpc3N1ZXMsIGV0Yy4KCjIu" + - "ICoqT3BlbkJhbyBtaWdyYXRpb24gam9iIGRpZG4ndCBydW4qKjogVGhpcyBoYXBwZW5zIHdoZW4g" + - "YGhlbG1maWxlIHN5bmNgIHdhcyBpbnRlcnJ1cHRlZC4gRGVzdHJveSBhbmQgcmUtc3luYyBvcGVu" + - "YmFvOgoKICAgYGBgYmFzaAogICBIRUxNRklMRV9FTlY9PGVudj4gaGVsbWZpbGUgLS1zZWxlY3Rv" + - "ciBuYW1lPW9wZW5iYW8tc2VydmVyIGRlc3Ryb3kKICAga3ViZWN0bCBkZWxldGUgbmFtZXNwYWNl" + - "IHZhdWx0LXN5c3RlbQogICBrdWJlY3RsIGNyZWF0ZSBuYW1lc3BhY2UgdmF1bHQtc3lzdGVtCiAg" + - "ICMgUmUtY3JlYXRlIHB1bGwgc2VjcmV0IGlmIG5lZWRlZAogICBIRUxNRklMRV9FTlY9PGVudj4g" + - "aGVsbWZpbGUgLS1zZWxlY3RvciBuYW1lPW9wZW5iYW8tc2VydmVyIHN5bmMKICAgYGBgCgozLiAq" + - "Kk9wZW5CYW8gcG9kcyBydW5uaW5nIGJ1dCBub3QgaW5pdGlhbGl6ZWQqKjogQ2hlY2sgdW5zZWFs" + - "IHN0YXR1czoKCiAgIGBgYGJhc2gKICAga3ViZWN0bCBleGVjIC1uIHZhdWx0LXN5c3RlbSBvcGVu" + - "YmFvLXNlcnZlci0wIC1jIG9wZW5iYW8gLS0gYmFvIHN0YXR1cwogICBgYGAKCjQuICoqYHZhdWx0" + - "LWFnZW50LWluaXRgIGxvZ3MgYGF1dGgvand0L2xvZ2luYCAtPiBgNDAwIC4uLiBubyBrbm93biBr" + - "ZXkgc3VjY2Vzc2Z1bGx5IHZhbGlkYXRlZCB0aGUgdG9rZW4gc2lnbmF0dXJlYCoqCiAgIChjb21t" + - "b24gb24gQUtTLCBhbmQgb24gYW55IGNsdXN0ZXIgd2hvc2UgT0lEQyBpc3N1ZXIgcHVibGlzaGVz" + - "IGEgcm90YXRpbmcgbXVsdGkta2V5IEpXS1MpOgogICB0aGUgT3BlbkJhbyBgYXV0aC9qd3RgIG1l" + - "dGhvZCB3YXMgY29uZmlndXJlZCB3aXRoIGEgc2luZ2xlIHN0YXRpYyBtb3VudGVkIHB1YmxpYyBr" + - "ZXkKICAgKGBqd3RfdmFsaWRhdGlvbl9wdWJrZXlzYCkgaW5zdGVhZCBvZiB0aGUgaXNzdWVyJ3Mg" + - "bGl2ZSBKV0tTLCBzbyBpdCBjYW5ub3QgdmFsaWRhdGUgdGhlCiAgIGNsdXN0ZXItc2lnbmVkIFNl" + - "cnZpY2VBY2NvdW50IHRva2VucyB0aGUgdmF1bHQtYWdlbnRzIHByZXNlbnQuIEV2ZXJ5IHNlcnZp" + - "Y2UncwogICBgdmF1bHQtYWdlbnQtaW5pdGAgdGhlbiBsb29wcyBvbiB0aGF0IDQwMCBhbmQgdGhl" + - "IHBvZCBuZXZlciBsZWF2ZXMgYEluaXQ6MC8xYC4gVGhpcyBpcyB0aGUKICAgYmVoYXZpb3Igb2Yg" + - "dGhlIGJhc2UgZGVmYXVsdCBgb3BlbmJhby5taWdyYXRpb25zLmlzc3VlckRpc2NvdmVyeS5lbmFi" + - "bGVkOiBmYWxzZWA7IHRoZQogICBtaWdyYXRpb24gbG9nIHNob3dzIGBPSURDIGlzc3VlciBkaXNj" + - "b3ZlcnkgaXMgZGlzYWJsZWQuIFVzaW5nIFNlcnZpY2VBY2NvdW50IGlzc3VlciBhbmQKICAgbW91" + - "bnRlZCBwdWJsaWMga2V5IGZhbGxiYWNrYC4gRW5hYmxlIGlzc3VlciBkaXNjb3Zlcnkgc28gdGhl" + - "IG1pZ3JhdGlvbiB1c2VzIHRoZSBsaXZlIEpXS1MsCiAgIHRoZW4gcmUtcnVuIGl0OgoKICAgYGBg" + - "YmFzaAogICAjIEluIHlvdXIgZW52IHZhbHVlcyAoZS5nLiBlbnZpcm9ubWVudHMvPGVudj4ueWFt" + - "bCksIHNldDoKICAgIyAgIG9wZW5iYW86CiAgICMgICAgIG1pZ3JhdGlvbnM6CiAgICMgICAgICAg" + - "aXNzdWVyRGlzY292ZXJ5OgogICAjICAgICAgICAgZW5hYmxlZDogdHJ1ZQogICBrdWJlY3RsIGRl" + - "bGV0ZSBqb2IgLW4gdmF1bHQtc3lzdGVtIG9wZW5iYW8tc2VydmVyLW1pZ3JhdGlvbnMKICAgSEVM" + - "TUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0b3IgbmFtZT1vcGVuYmFvLXNlcnZlciBz" + - "eW5jCiAgIGBgYAoKICAgVGhlIG1pZ3JhdGlvbiBsb2cgc2hvdWxkIHRoZW4gc2hvdyBgUmVjZWl2" + - "ZWQgZGlzY292ZXJ5IGRvY3VtZW50IGZyb20KICAgLi4uLy53ZWxsLWtub3duL29wZW5pZC1jb25m" + - "aWd1cmF0aW9uYCBhbmQgYEZpbmFsIE9wZW5CYW8gSldUIEpXS1MgVVJMIHNldCB0bzoKICAgLi4u" + - "L29wZW5pZC92MS9qd2tzYCwgYW5kIHRoZSBzZXJ2aWNlIHBvZHMgYXV0aGVudGljYXRlIGFuZCBy" + - "ZWFjaCBSZWFkeSB3aXRoaW4gfjEgbWluLgogICBBS1MgY2x1c3RlcnMgd2l0aCB0aGUgY2x1c3Rl" + - "ciBPSURDIGlzc3VlciBlbmFibGVkICh0aGUgYGFrcy1jbHVzdGVyYCBkZWZhdWx0KSBhbHdheXMg" + - "bmVlZAogICB0aGlzIGJlY2F1c2UgdGhlIHN0YXRpYy1wdWJrZXkgZmFsbGJhY2sgY2Fubm90IG1h" + - "dGNoIHRoZSBpc3N1ZXIncyByb3RhdGluZyBzaWduaW5nIGtleXMuCgojIyBGYWlsdXJlOiBPT01L" + - "aWxsZWQgb24gQ2Fzc2FuZHJhCgojIyMgU3ltcHRvbXMKCmBgYHRleHQKTkFNRSAgICAgICAgICBS" + - "RUFEWSAgIFNUQVRVUyAgICBSRVNUQVJUUyAgIEFHRQpjYXNzYW5kcmEtMCAgIDAvMSAgICAgT09N" + - "S2lsbGVkICAzICAgICAgICAgMTBtCmBgYAoKIyMjIERpYWdub3NpcwoKYGBgYmFzaAprdWJlY3Rs" + - "IGRlc2NyaWJlIHBvZCAtbiBjYXNzYW5kcmEtc3lzdGVtIGNhc3NhbmRyYS0wIHwgZ3JlcCAtQTMg" + - "Ikxhc3QgU3RhdGUiCmBgYAoKIyMjIEZpeAoKT3ZlcnJpZGUgQ2Fzc2FuZHJhIHJlc291cmNlcyB2" + - "aWEgaGVsbWZpbGUgdmFsdWVzLiBTZWUgRXhhbXBsZSAxIGluCltleGFtcGxlcy5tZF0oLi4vZXhh" + - "bXBsZXMubWQpLgoKYGBgeWFtbAotIGNhc3NhbmRyYToKICAgIHJlc291cmNlczoKICAgICAgbGlt" + - "aXRzOgogICAgICAgIGNwdTogIjgiCiAgICAgICAgbWVtb3J5OiA4MTkyTWkKICAgICAgcmVxdWVz" + - "dHM6CiAgICAgICAgY3B1OiAiMiIKICAgICAgICBtZW1vcnk6IDQwOTZNaQpgYGAKCk5vdGU6IGBy" + - "ZXNvdXJjZVByZXNldGAgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgTlZDRiBjYXNzYW5kcmEgd3Jh" + - "cHBlciBjaGFydC4gVXNlIGV4cGxpY2l0IGByZXNvdXJjZXNgLgoKIyMgRmFpbHVyZTogUG9kcyBT" + - "dHVjayBpbiBQZW5kaW5nCgojIyMgU3ltcHRvbXMKCmBgYHRleHQKTkFNRSAgICAgICAgICBSRUFE" + - "WSAgIFNUQVRVUyAgICBSRVNUQVJUUyAgIEFHRQpjYXNzYW5kcmEtMCAgIDAvMSAgICAgUGVuZGlu" + - "ZyAgIDAgICAgICAgICAgMTBtCmBgYAoKIyMjIERpYWdub3NpcwoKYGBgYmFzaAojIENoZWNrIGV2" + - "ZW50cyBmb3Igc2NoZWR1bGluZyBmYWlsdXJlcwprdWJlY3RsIGRlc2NyaWJlIHBvZCAtbiA8bmFt" + - "ZXNwYWNlPiA8cG9kLW5hbWU+CgojIENvbW1vbiBjYXVzZXM6CiMgLSAiMC8xMiBub2RlcyBhcmUg" + - "YXZhaWxhYmxlOiAxMiBub2RlKHMpIGRpZG4ndCBtYXRjaCBQb2QncyBub2RlIGFmZmluaXR5Igoj" + - "IC0gIjAvMTIgbm9kZXMgYXJlIGF2YWlsYWJsZTogMTIgSW5zdWZmaWNpZW50IG1lbW9yeSIKIyAt" + - "ICJwZXJzaXN0ZW50dm9sdW1lY2xhaW0gbm90IGZvdW5kIgpgYGAKCiMjIyBGaXhlcwoKMS4gKipO" + - "b2RlIHNlbGVjdG9yIG1pc21hdGNoKio6IENoZWNrIGBub2RlU2VsZWN0b3JzYCBpbiBlbnZpcm9u" + - "bWVudCBmaWxlCgogICBgYGBiYXNoCiAgIGt1YmVjdGwgZ2V0IG5vZGVzIC0tc2hvdy1sYWJlbHMg" + - "fCBncmVwIG52Y2YKICAgYGBgCgoyLiAqKlN0b3JhZ2UgY2xhc3Mgbm90IGZvdW5kKio6IENoZWNr" + - "IHN0b3JhZ2UgY2xhc3MgZXhpc3RzCgogICBgYGBiYXNoCiAgIGt1YmVjdGwgZ2V0IHN0b3JhZ2Vj" + - "bGFzcwogICBgYGAKCjMuICoqSW5zdWZmaWNpZW50IHJlc291cmNlcyoqOiBDaGVjayBub2RlIGNh" + - "cGFjaXR5CgogICBgYGBiYXNoCiAgIGt1YmVjdGwgZGVzY3JpYmUgbm9kZSA8bm9kZS1uYW1lPiB8" + - "IGdyZXAgLUE1ICJBbGxvY2F0ZWQgcmVzb3VyY2VzIgogICBgYGAKCiMjIEZhaWx1cmU6IEhlbG0g" + - "UmVsZWFzZSBpbiBGYWlsZWQgU3RhdGUKCiMjIyBTeW1wdG9tcwoKYGBgYmFzaApoZWxtIGxpc3Qg" + - "LUEKIyBTaG93cyByZWxlYXNlIHdpdGggU1RBVFVTOiBmYWlsZWQKYGBgCgpSZS1ydW5uaW5nIGBo" + - "ZWxtZmlsZSBzeW5jYCBhcHBlYXJzIHRvIHN1Y2NlZWQgYnV0IHNlcnZpY2VzIGRvbid0IHdvcmsg" + - "KG1pZ3JhdGlvbnMgc2tpcHBlZCkuCgojIyMgRGlhZ25vc2lzCgpgYGBiYXNoCmhlbG0gaGlzdG9y" + - "eSA8cmVsZWFzZS1uYW1lPiAtbiA8bmFtZXNwYWNlPgpgYGAKCiMjIyBGaXgKCk11c3QgZGVzdHJv" + - "eSB0aGUgZmFpbGVkIHJlbGVhc2UgYW5kIHJlLXN5bmMgKG5vdCBqdXN0IGFwcGx5KToKCmBgYGJh" + - "c2gKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0b3IgbmFtZT08cmVsZWFzZT4g" + - "ZGVzdHJveQojIElmIG5hbWVzcGFjZSBuZWVkcyBjbGVhbnVwOgprdWJlY3RsIGRlbGV0ZSBuYW1l" + - "c3BhY2UgPG5hbWVzcGFjZT4Ka3ViZWN0bCBjcmVhdGUgbmFtZXNwYWNlIDxuYW1lc3BhY2U+CiMg" + - "UmUtY3JlYXRlIHB1bGwgc2VjcmV0IGlmIG5lZWRlZApIRUxNRklMRV9FTlY9PGVudj4gaGVsbWZp" + - "bGUgLS1zZWxlY3RvciBuYW1lPTxyZWxlYXNlPiBzeW5jCmBgYAoKIyMgRmFpbHVyZTogQWNjb3Vu" + - "dCBCb290c3RyYXAgSm9iIEZhaWxlZAoKIyMjIFN5bXB0b21zCgpTZXJ2aWNlcyBkZXBsb3kgYnV0" + - "IGZ1bmN0aW9ucyBjYW4ndCBiZSBjcmVhdGVkLiBFdmVudHMgc2hvdyBib290c3RyYXAgam9iIGZh" + - "aWx1cmUuCgojIyMgRGlhZ25vc2lzCgpgYGBiYXNoCiMgQ2hlY2sgYm9vdHN0cmFwIGpvYiBzdGF0" + - "dXMKa3ViZWN0bCBnZXQgam9icyAtbiBudmNmCgojIEdldCBsb2dzIChqb2IgYXV0by1kZWxldGVz" + - "IGFmdGVyIH41IG1pbnV0ZXMpCmt1YmVjdGwgbG9ncyBqb2IvbnZjZi1hcGktYWNjb3VudC1ib290" + - "c3RyYXAgLW4gbnZjZgoKIyBDaGVjayBBUEkgbG9ncwprdWJlY3RsIGxvZ3MgLW4gbnZjZiAtbCBh" + - "cHAua3ViZXJuZXRlcy5pby9uYW1lPW52Y2YtYXBpIC0tdGFpbD0xMDAKYGBgCgojIyMgQ29tbW9u" + - "IENhdXNlcwoKMS4gKipXcm9uZyBiYXNlNjQgY3JlZGVudGlhbHMqKjogQ3JlZGVudGlhbHMgaW4g" + - "YHNlY3JldHMvPGVudj4tc2VjcmV0cy55YW1sYCBtdXN0IGJlIGAkb2F1dGh0b2tlbjpBUElfS0VZ" + - "YCBiYXNlNjQtZW5jb2RlZCwgbm90IGp1c3QgdGhlIEFQSSBrZXkKCiAgIGBgYGJhc2gKICAgIyBW" + - "ZXJpZnkgeW91ciBlbmNvZGVkIGNyZWRlbnRpYWwKICAgZWNobyAnWU9VUl9CQVNFNjRfU1RSSU5H" + - "JyB8IGJhc2U2NCAtZAogICAjIFNob3VsZCBvdXRwdXQ6ICRvYXV0aHRva2VuOm52YXBpLXh4eHh4" + - "CiAgIGBgYAoKMi4gKipSZWdpc3RyeSB1bnJlYWNoYWJsZSoqOiBBUEkgY2FuJ3QgcmVhY2ggdGhl" + - "IHJlZ2lzdHJ5IHNwZWNpZmllZCBpbiBgYWNjb3VudEJvb3RzdHJhcC5yZWdpc3RyeUNyZWRlbnRp" + - "YWxzYAoKIyMjIEZpeAoKRml4IGNyZWRlbnRpYWxzIGluIHNlY3JldHMgZmlsZSwgdGhlbiByZWNv" + - "dmVyIHNlcnZpY2VzIHdpdGhvdXQgZGVzdHJveWluZyBkZXBlbmRlbmNpZXM6CgpgYGBiYXNoCkhF" + - "TE1GSUxFX0VOVj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIHJlbGVhc2UtZ3JvdXA9c2Vydmlj" + - "ZXMgZGVzdHJveQprdWJlY3RsIGRlbGV0ZSBuYW1lc3BhY2UgbnZjZiBhcGkta2V5cyBlc3Mgc2lz" + - "IC0taWdub3JlLW5vdC1mb3VuZAprdWJlY3RsIGNyZWF0ZSBuYW1lc3BhY2UgbnZjZiAmJiBrdWJl" + - "Y3RsIGNyZWF0ZSBuYW1lc3BhY2UgYXBpLWtleXMgJiYgXAogIGt1YmVjdGwgY3JlYXRlIG5hbWVz" + - "cGFjZSBlc3MgJiYga3ViZWN0bCBjcmVhdGUgbmFtZXNwYWNlIHNpcwojIFJlLWNyZWF0ZSBwdWxs" + - "IHNlY3JldHMgaWYgbmVlZGVkCkhFTE1GSUxFX0VOVj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9y" + - "IHJlbGVhc2UtZ3JvdXA9c2VydmljZXMgc3luYwpgYGAKCiMjIEZhaWx1cmU6IE5WQ0EgQ2xlYW51" + - "cCBTdHVjayAoRmluYWxpemVycykKCiMjIyBTeW1wdG9tcwoKQ29tcHV0ZS1wbGFuZSBjbGVhbnVw" + - "IGhhbmdzLiBOYW1lc3BhY2VzCnN0dWNrIGluIGBUZXJtaW5hdGluZ2A6CgpgYGBiYXNoCmt1YmVj" + - "dGwgZ2V0IG5zCiMgbnZjYS1vcGVyYXRvciAgICBUZXJtaW5hdGluZyAgIDEwbQojIG52Y2YtYmFj" + - "a2VuZCAgICAgVGVybWluYXRpbmcgICAxMG0KYGBgCgojIyMgRml4CgpSdW4gdGhpcyBvbmx5IGFn" + - "YWluc3QgdGhlIGNvbXB1dGUgY29udGV4dCwgYWZ0ZXIgdGhlIG5vcm1hbCBjb21wdXRlLXBsYW5l" + - "CnRlYXJkb3duIGhhcyBmYWlsZWQuIFJlbW92ZSBmaW5hbGl6ZXJzIGZyb20gTlZDRkJhY2tlbmQg" + - "Y3VzdG9tIHJlc291cmNlcyBhbmQKZm9yY2UtZGVsZXRlIHN0dWNrIG5hbWVzcGFjZXM6CgpgYGBi" + - "YXNoCmV4cG9ydCBDT01QVVRFX0NPTlRFWFQ9PGNvbXB1dGUtcGxhbmUtY29udGV4dD4KCiMgUmVt" + - "b3ZlIGZpbmFsaXplcnMgZnJvbSBOVkNGQmFja2VuZCByZXNvdXJjZXMKa3ViZWN0bCAtLWNvbnRl" + - "eHQgIiRDT01QVVRFX0NPTlRFWFQiIGdldCBudmNmYmFja2VuZHMgLUEgLW8ganNvbiB8IFwKICBq" + - "cSAnLml0ZW1zW10gfCAubWV0YWRhdGEubmFtZXNwYWNlICsgIi8iICsgLm1ldGFkYXRhLm5hbWUn" + - "IC1yIHwgXAogIHhhcmdzIC1Je30gc2ggLWMgJ2NvbnRleHQ9IiQxIjsgbnM9IiR7MiUlLyp9Ijsg" + - "bmFtZT0iJHsyIyMqL30iOyBrdWJlY3RsIC0tY29udGV4dCAiJGNvbnRleHQiIHBhdGNoIG52Y2Zi" + - "YWNrZW5kICIkbmFtZSIgLW4gIiRucyIgLS10eXBlPW1lcmdlIC1wICJ7XCJtZXRhZGF0YVwiOntc" + - "ImZpbmFsaXplcnNcIjpbXX19IicgXyAiJENPTVBVVEVfQ09OVEVYVCIge30KCiMgRm9yY2UtZGVs" + - "ZXRlIHN0dWNrIG5hbWVzcGFjZXMgYnkgY2xlYXJpbmcgdGhlaXIgZmluYWxpemVycwpmb3IgbnMg" + - "aW4gbnZjYS1vcGVyYXRvciBudmNmLWJhY2tlbmQ7IGRvCiAga3ViZWN0bCAtLWNvbnRleHQgIiRD" + - "T01QVVRFX0NPTlRFWFQiIGdldCBuYW1lc3BhY2UgIiRucyIgLW8ganNvbiAyPi9kZXYvbnVsbCB8" + - "IFwKICAgIGpxICcuc3BlYy5maW5hbGl6ZXJzID0gW10nIHwgXAogICAga3ViZWN0bCAtLWNvbnRl" + - "eHQgIiRDT01QVVRFX0NPTlRFWFQiIHJlcGxhY2UgXAogICAgICAtLXJhdyAiL2FwaS92MS9uYW1l" + - "c3BhY2VzLyRucy9maW5hbGl6ZSIgLWYgLSAyPi9kZXYvbnVsbApkb25lCmBgYAoKIyMgRmFpbHVy" + - "ZTogTlZDQSBPcGVyYXRvciBNaXNzaW5nIG9yIE5vdCBSZWFkeQoKIyMjIFN5bXB0b21zCgpBZnRl" + - "ciBjb21wdXRlLXBsYW5lIGluc3RhbGwgY29tcGxldGVzLCBubyBgbnZjYS1vcGVyYXRvcmAgRGVw" + - "bG95bWVudCBleGlzdHMsIG9yCml0IGV4aXN0cyBidXQgcG9kcyBhcmUgbm90IHJlYWR5OgoKYGBg" + - "YmFzaAprdWJlY3RsIC0tY29udGV4dCA8Y29tcHV0ZS1wbGFuZS1jb250ZXh0PiBnZXQgZGVwbG95" + - "bWVudCBudmNhLW9wZXJhdG9yIFwKICAtbiBudmNhLW9wZXJhdG9yCmt1YmVjdGwgLS1jb250ZXh0" + - "IDxjb21wdXRlLXBsYW5lLWNvbnRleHQ+IGdldCBwb2RzIC1uIG52Y2Etb3BlcmF0b3IKYGBgCgoj" + - "IyMgRGlhZ25vc2lzIGFuZCBGaXhlcwoKRmlyc3QgaWRlbnRpZnkgd2hldGhlciB0aGUgaW5zdGFs" + - "bGF0aW9uIHVzZWQgdGhlIEhlbG1maWxlIHZhbHVlcyBmbG93IG9yIHRoZQpDTEkgcHJvZmlsZSBm" + - "bG93LiBSZS1ydW4gb25seSB0aGF0IGZsb3cncyByZWdpc3RyYXRpb24gYW5kIGluc3RhbGxhdGlv" + - "biBzdGVwcwpmcm9tIFtTcGxpdCBDb21wdXRlLVBsYW5lIEluc3RhbGxhdGlvbl0oY29tcHV0ZS1w" + - "bGFuZS1pbnN0YWxsYXRpb24ubWQpLiBEbyBub3QKc3Vic3RpdHV0ZSBvbmUgaGFuZG9mZiBmb3Ig" + - "dGhlIG90aGVyLgoKSWYgaW5zdGFsbGF0aW9uIHN1Y2NlZWRzIGJ1dCBwb2RzIHN0aWxsIGZhaWws" + - "IGluc3BlY3QgdGhlIGNvbXB1dGUgY29udGV4dDoKCmBgYGJhc2gKa3ViZWN0bCAtLWNvbnRleHQg" + - "PGNvbXB1dGUtcGxhbmUtY29udGV4dD4gZGVzY3JpYmUgZGVwbG95IG52Y2Etb3BlcmF0b3IgXAog" + - "IC1uIG52Y2Etb3BlcmF0b3IKa3ViZWN0bCAtLWNvbnRleHQgPGNvbXB1dGUtcGxhbmUtY29udGV4" + - "dD4gbG9ncyBkZXBsb3ltZW50L252Y2Etb3BlcmF0b3IgXAogIC1uIG52Y2Etb3BlcmF0b3IgLS10" + - "YWlsPTIwMAprdWJlY3RsIC0tY29udGV4dCA8Y29tcHV0ZS1wbGFuZS1jb250ZXh0PiBnZXQgbnZj" + - "ZmJhY2tlbmQgLW4gbnZjYS1vcGVyYXRvcgpgYGAKCkZvciBwcml2YXRlIHJlZ2lzdHJ5IGZhaWx1" + - "cmVzLCB2ZXJpZnkgdGhhdCB0aGUgcHVsbCBzZWNyZXQgZXhpc3RzIGluCmBudmNhLW9wZXJhdG9y" + - "YC4gVGhlIGNoYXJ0IGFuZCBvcGVyYXRvciBtaXJyb3IgaXQgdG8gYG52Y2Etc3lzdGVtYDsgZG8g" + - "bm90IHVzZSBhCmJyb2FkZXIgbWFudWFsIG5hbWVzcGFjZSBsb29wLiBTZWUKW3B1bGwtc2VjcmV0" + - "cy5tZF0ocHVsbC1zZWNyZXRzLm1kI2NvbXB1dGUtcGxhbmUtc2VjcmV0KS4KCiMjIEZhaWx1cmU6" + - "IEdhdGV3YXkgRW5kcG9pbnQgQ2hhbmdlZAoKIyMjIFN5bXB0b21zCgpSZXF1ZXN0cyB0aHJvdWdo" + - "IHRoZSBjb25maWd1cmVkIHJvdXRlIGRvbWFpbiBmYWlsIGFmdGVyIHRoZSBHYXRld2F5IG9yIGl0" + - "cyBsb2FkIGJhbGFuY2VyIGlzIHJlcGxhY2VkLiBUaGUgR2F0ZXdheSByZXBvcnRzIGEgbmV3IGVu" + - "ZHBvaW50LgoKIyMjIERpYWdub3NpcwoKYGBgYmFzaApHQVRFV0FZX0FERFI9JChrdWJlY3RsIC0t" + - "Y29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBnZXQgZ2F0ZXdheSBcCiAgbnZjZi1nYXRl" + - "d2F5IC1uIGVudm95LWdhdGV3YXkgXAogIC1vIGpzb25wYXRoPSd7LnN0YXR1cy5hZGRyZXNzZXNb" + - "MF0udmFsdWV9JykKdGVzdCAtbiAiJEdBVEVXQVlfQUREUiIKZGlnICtzaG9ydCAiYXBpLjxkb21h" + - "aW4+IgpjdXJsIC1IICJIb3N0OiBhcGkuPGRvbWFpbj4iICJodHRwOi8vJEdBVEVXQVlfQUREUi9o" + - "ZWFsdGgiCgojIENoZWNrIGRpcmVjdCBhZGRyZXNzIGZpZWxkcyB1c2VkIGJ5IGEgc3BsaXQgZGVw" + - "bG95bWVudApncmVwIG52Y2ZOYXRzU2VydmljZVVSTCBkZXBsb3kvc3RhY2tzL3NlbGYtbWFuYWdl" + - "ZC9lbnZpcm9ubWVudHMvPGVudj4ueWFtbApncmVwIC1FICdpY21zU2VydmljZXxyZXZhbFNlcnZp" + - "Y2V8bmF0cycgXAogIGRlcGxveS9zdGFja3MvbnZjZi1jb21wdXRlLXBsYW5lL2Vudmlyb25tZW50" + - "cy88ZW52Pi55YW1sCmBgYAoKIyMjIEZpeAoKS2VlcCBgZ2xvYmFsLmRvbWFpbmAsIHJvdXRlIGhv" + - "c3RuYW1lcywgYW5kIEhvc3Qgb3ZlcnJpZGVzIHVuY2hhbmdlZC4gVXBkYXRlIEROUwpvciB0aGUg" + - "ZGlyZWN0IGNsaWVudCBkZXN0aW5hdGlvbi4gRm9yIHNwbGl0IGRlcGxveW1lbnRzLCB1cGRhdGUg" + - "b25seSBkaXJlY3QKR2F0ZXdheS1hZGRyZXNzIGZpZWxkcyBhbmQgcmVmcmVzaCByZWdpc3RyYXRp" + - "b24gYW5kIGluc3RhbGxhdGlvbiB0aHJvdWdoIHRoZQpzYW1lIHNlbGVjdGVkIGhhbmRvZmYuIFNl" + - "ZQpbRXhhbXBsZSA0XSguLi9leGFtcGxlcy5tZCNleGFtcGxlLTQtcmVjb3Zlci1mcm9tLWEtZ2F0" + - "ZXdheS1lbmRwb2ludC1jaGFuZ2UpLgoKIyMgVXNlZnVsIE5hbWVzcGFjZS10by1TZXJ2aWNlIE1h" + - "cHBpbmcKClF1aWNrIHJlZmVyZW5jZSBmb3Igd2hpY2ggc2VydmljZXMgcnVuIGluIHdoaWNoIG5h" + - "bWVzcGFjZToKCnwgTmFtZXNwYWNlIHwgU2VydmljZXMgfAp8LS0tLS0tLS0tLS18LS0tLS0tLS0t" + - "LXwKfCBuYXRzLXN5c3RlbSB8IG5hdHMgfAp8IGNhc3NhbmRyYS1zeXN0ZW0gfCBjYXNzYW5kcmEg" + - "fAp8IHZhdWx0LXN5c3RlbSB8IG9wZW5iYW8tc2VydmVyIHwKfCBudmNmIHwgYXBpLCBpbnZvY2F0" + - "aW9uLXNlcnZpY2UsIGdycGMtcHJveHksIG5vdGFyeS1zZXJ2aWNlLCByZXZhbCwgbGxtLXJlcXVl" + - "c3Qtcm91dGVyLCBsbG0tYXBpLWdhdGV3YXkgfAp8IGFwaS1rZXlzIHwgYXBpLWtleXMsIGFkbWlu" + - "LWlzc3Vlci1wcm94eSB8CnwgZXNzIHwgZXNzLWFwaSB8Cnwgc2lzIHwgc2lzIHwKfCBlbnZveS1n" + - "YXRld2F5LXN5c3RlbSB8IGVudm95IGdhdGV3YXkgKGluZ3Jlc3MgY29udHJvbGxlcikgfAp8IGVu" + - "dm95LWdhdGV3YXkgfCBnYXRld2F5IHJlc291cmNlICsgcm91dGVzIHwKUEsHCLV6cDu1MAAAtTAA" + - "AFBLAwQUAAgAAAAAACEAAAAAAAAAAAAAAAAARAAJAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtaW5z" + - "dGFsbGF0aW9uL3JlZmVyZW5jZXMvaGVsbWZpbGUtc3RydWN0dXJlLm1kVVQFAAEAps4SIyBIZWxt" + - "ZmlsZSBTdHJ1Y3R1cmUgUmVmZXJlbmNlCgojIyBEaXJlY3RvcnkgTGF5b3V0CgpgYGBiYXNoCm52" + - "Y2Ytc2VsZi1tYW5hZ2VkLXN0YWNrLwp8LS0gaGVsbWZpbGUuZC8KfCAgIHwtLSAwMS1kZXBlbmRl" + - "bmNpZXMueWFtbC5nb3RtcGwgICMgTkFUUywgQ2Fzc2FuZHJhLCBPcGVuQmFvCnwgICB8LS0gMDIt" + - "Y29yZS55YW1sLmdvdG1wbCAgICAgICAgICAjIE5WQ0Ygc2VydmljZXMgKyBpbmdyZXNzCnwgICBg" + - "LS0gMDMtb2JzZXJ2YWJpbGl0eS55YW1sLmdvdG1wbCAjIE9ic2VydmFiaWxpdHkgc3RhY2sgKG9w" + - "dGlvbmFsKQp8LS0gZW52aXJvbm1lbnRzLwp8ICAgfC0tIGJhc2UueWFtbCAgICAgICAgICAgICAg" + - "ICAgICAgIyBEZWZhdWx0IHZhbHVlcyAoYWxsIGVudmlyb25tZW50cykKfCAgIGAtLSA8ZW52LW5h" + - "bWU+LnlhbWwgICAgICAgICAgICAgICMgUGVyLWVudmlyb25tZW50IG92ZXJyaWRlcwp8LS0gc2Vj" + - "cmV0cy8KfCAgIGAtLSA8ZW52LW5hbWU+LXNlY3JldHMueWFtbCAgICAgICMgU2Vuc2l0aXZlIHZh" + - "bHVlcyAocmVnaXN0cnkgY3JlZHMsIHBhc3N3b3JkcykKYC0tIGdsb2JhbC55YW1sLmdvdG1wbCAg" + - "ICAgICAgICAgICAgICMgR28gdGVtcGxhdGUgdGhhdCBjb25zdHJ1Y3RzIHBlci1jaGFydCB2YWx1" + - "ZXMKCm52Y2YtY29tcHV0ZS1wbGFuZS1zdGFjay8KfC0tIGhlbG1maWxlLmQvCnwgICB8LS0gMDEt" + - "ZGVwZW5kZW5jaWVzLnlhbWwuZ290bXBsICAjIENvbXB1dGUgcGxhbmUgZGVwZW5kZW5jeSBjb21w" + - "b25lbnRzCnwgICBgLS0gMDItbnZjYS55YW1sLmdvdG1wbCAgICAgICAgICAjIG52Y2Etb3BlcmF0" + - "b3IgY2hhcnQgYW5kIG52Y2EgY29uZmlndXJhdGlvbgp8LS0gZW52aXJvbm1lbnRzLwp8ICAgfC0t" + - "IGJhc2UueWFtbCAgICAgICAgICAgICAgICAgICAgIyBEZWZhdWx0IHZhbHVlcyAoYWxsIGVudmly" + - "b25tZW50cykKfCAgIGAtLSA8ZW52LW5hbWU+LnlhbWwgICAgICAgICAgICAgICMgUGVyLWVudmly" + - "b25tZW50IG92ZXJyaWRlcwpgLS0gZ2xvYmFsLnlhbWwuZ290bXBsICAgICAgICAgICAgICAgIyBH" + - "byB0ZW1wbGF0ZSB0aGF0IGNvbnN0cnVjdHMgcGVyLWNoYXJ0IHZhbHVlcwpgYGAKClRoZXNlIHN0" + - "YWNrcyBoYXZlIHNlcGFyYXRlIGVudmlyb25tZW50cyBhbmQgY2x1c3RlciBjb250ZXh0cy4gVGhl" + - "IEhlbG1maWxlCnZhbHVlcyBmbG93IGF1dGhvcnMgYm90aCBlbnZpcm9ubWVudCBmaWxlcy4gVGhl" + - "IENMSSBwcm9maWxlIGZsb3cgaW5zdGVhZCB1c2VzCnRoZSBDTEktZ2VuZXJhdGVkIGNvbnRyb2wt" + - "cGxhbmUgcHJvZmlsZSBhcyBpdHMgZW5kcG9pbnQgc291cmNlLiBEbyBub3QgbWl4IHRoZQpoYW5k" + - "b2Zmcy4gU2VlIFtTcGxpdCBDb21wdXRlLVBsYW5lIEluc3RhbGxhdGlvbl0oY29tcHV0ZS1wbGFu" + - "ZS1pbnN0YWxsYXRpb24ubWQpLgoKIyMgR290bXBsIEZpbGVzIGFuZCBUaGVpciBSZWxlYXNlcwoK" + - "IyMjIDAxLWRlcGVuZGVuY2llcy55YW1sLmdvdG1wbAoKfCBSZWxlYXNlIHwgQ2hhcnQgfCBOYW1l" + - "c3BhY2UgfCBOb3RlcyB8CnwtLS0tLS0tLS18LS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tfAp8" + - "IG5hdHMgfCBoZWxtLW52Y2YtbmF0cyB8IG5hdHMtc3lzdGVtIHwgTWVzc2FnaW5nIHwKfCBvcGVu" + - "YmFvLXNlcnZlciB8IGhlbG0tbnZjZi1vcGVuYmFvLXNlcnZlciB8IHZhdWx0LXN5c3RlbSB8IFNl" + - "Y3JldHMgbWFuYWdlbWVudCwgZGVwZW5kcyBvbiBuYXRzIHwKfCBjYXNzYW5kcmEgfCBoZWxtLW52" + - "Y2YtY2Fzc2FuZHJhIHwgY2Fzc2FuZHJhLXN5c3RlbSB8IERhdGFiYXNlIHwKClVzZXMgYDw8OiAq" + - "ZGVwZW5kZW5jeWAgdGVtcGxhdGUgaW5oZXJpdGFuY2Ugd2l0aCBgcmVsZWFzZS1ncm91cDogZGVw" + - "ZW5kZW5jaWVzYCBsYWJlbC4KCiMjIyAwMi1jb3JlLnlhbWwuZ290bXBsCgp8IFJlbGVhc2UgfCBD" + - "aGFydCB8IE5hbWVzcGFjZSB8IExhYmVsIHwKfC0tLS0tLS0tLXwtLS0tLS0tfC0tLS0tLS0tLS0t" + - "fC0tLS0tLS18CnwgYXBpLWtleXMgfCBoZWxtLW52Y2YtYXBpLWtleXMgfCBhcGkta2V5cyB8IHNl" + - "cnZpY2VzIHwKfCBzaXMgfCBoZWxtLW52Y2Ytc2lzIHwgc2lzIHwgc2VydmljZXMgfAp8IGFwaSB8" + - "IGhlbG0tbnZjZi1hcGkgfCBudmNmIHwgc2VydmljZXMgfAp8IGludm9jYXRpb24tc2VydmljZSB8" + - "IGhlbG0tbnZjZi1pbnZvY2F0aW9uLXNlcnZpY2UgfCBudmNmIHwgc2VydmljZXMgfAp8IGdycGMt" + - "cHJveHkgfCBoZWxtLW52Y2YtZ3JwYy1wcm94eSB8IG52Y2YgfCBzZXJ2aWNlcyB8CnwgZXNzLWFw" + - "aSB8IGhlbG0tbnZjZi1lc3MtYXBpIHwgZXNzIHwgc2VydmljZXMgfAp8IG5vdGFyeS1zZXJ2aWNl" + - "IHwgaGVsbS1udmNmLW5vdGFyeS1zZXJ2aWNlIHwgbnZjZiB8IHNlcnZpY2VzIHwKfCByZXZhbCB8" + - "IGhlbG0tcmV2YWwgfCBudmNmIHwgc2VydmljZXMgfAp8IGxsbS1yZXF1ZXN0LXJvdXRlciB8IG52" + - "Y2YvaGVsbS1udmNmLWxsbS1yZXF1ZXN0LXJvdXRlciB8IG52Y2YgfCBzZXJ2aWNlcyB8CnwgbGxt" + - "LWFwaS1nYXRld2F5IHwgbnZjZi9oZWxtLW52Y2YtbGxtLWFwaS1nYXRld2F5IHwgbnZjZiB8IHNl" + - "cnZpY2VzIHwKfCBhZG1pbi1pc3N1ZXItcHJveHkgfCBoZWxtLWFkbWluLXRva2VuLWlzc3Vlci1w" + - "cm94eSB8IGFwaS1rZXlzIHwgKG5vIHJlbGVhc2UtZ3JvdXAgbGFiZWwpIHwKfCBpbmdyZXNzIHwg" + - "bnZjZi1nYXRld2F5LXJvdXRlcyB8IGVudm95LWdhdGV3YXktc3lzdGVtIHwgaW5ncmVzcyB8CgpN" + - "b3N0IHNlcnZpY2VzIHVzZSBgaW5oZXJpdDogW3t0ZW1wbGF0ZTogc2VydmljZX1dYC4gTExNIHJl" + - "bGVhc2VzIHVzZSBPQ0kgY2hhcnRzIGZyb20gdGhlIGBudmNmYCByZXBvc2l0b3J5IHdpdGggc3Rh" + - "bmRhbG9uZSBgdmFsdWVzOiBbLi4vZ2xvYmFsLnlhbWwuZ290bXBsXWAgYmxvY2tzOyB0aGV5IGFy" + - "ZSBnYXRlZCBvbiBgYWRkb25zLmxsbS5lbmFibGVkYC4gYGFkbWluLWlzc3Vlci1wcm94eWAgYW5k" + - "IGBpbmdyZXNzYCBoYXZlIHN0YW5kYWxvbmUgYHZhbHVlczpgIGJsb2Nrcy4KCiMjIyAwMy1vYnNl" + - "cnZhYmlsaXR5LnlhbWwuZ290bXBsCgp8IFJlbGVhc2UgfCBDaGFydCB8IE5hbWVzcGFjZSB8IExh" + - "YmVsIHwKfC0tLS0tLS0tLXwtLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS18CnwgKG9ic2VydmFi" + - "aWxpdHkgcmVsZWFzZXMpIHwgKHZhcmlvdXMpIHwgb2JzZXJ2YWJpbGl0eSB8IG9ic2VydmFiaWxp" + - "dHkgfAoKR2F0ZWQgb24gb2JzZXJ2YWJpbGl0eS1zcGVjaWZpYyBmbGFncyBpbiB0aGUgZW52aXJv" + - "bm1lbnQgZmlsZS4gU2tpcHBlZCBpZiBkaXNhYmxlZC4KCiMjIFRlbXBsYXRlIEluaGVyaXRhbmNl" + - "CgojIyMgYDw8OiAqZGVwZW5kZW5jeWAgKFlBTUwgbWVyZ2UpCgpVc2VkIGluIGAwMS1kZXBlbmRl" + - "bmNpZXMueWFtbC5nb3RtcGxgLiBNZXJnZXMgdGhlIHRlbXBsYXRlJ3MgcHJvcGVydGllcyBpbnRv" + - "IHRoZSByZWxlYXNlLgoKKipHb3RjaGEqKjogWUFNTCBtZXJnZSByZXBsYWNlcyBsaXN0cy4gSWYg" + - "eW91IGFkZCBhIGB2YWx1ZXM6YCBrZXkgdG8gdGhlIHJlbGVhc2UsIGl0ICoqcmVwbGFjZXMqKiB0" + - "aGUgdGVtcGxhdGUncyBgdmFsdWVzOmAgbGlzdCBlbnRpcmVseS4gWW91IG11c3QgcmUtaW5jbHVk" + - "ZSBhbGwgdGVtcGxhdGUgdmFsdWVzOgoKSW4gdGhlIHRlbXBsYXRlIGJlbG93LCBgPHByaXZhdGUt" + - "dmFsdWVzPmAgcmVmZXJzIHRvIHRoZSBgc2VjcmV0cy9gIGRpcmVjdG9yeSBhdCB0aGUgaGVsbWZp" + - "bGUgc3RhY2sgcm9vdC4KCmBgYHlhbWwKIyBUZW1wbGF0ZSBkZWZpbmVzOgp0ZW1wbGF0ZXM6CiAg" + - "ZGVwZW5kZW5jeTogJmRlcGVuZGVuY3kKICAgIGNoYXJ0OiBudmNmL2hlbG0tbnZjZi17eyAuUmVs" + - "ZWFzZS5OYW1lIH19CiAgICB2YWx1ZXM6CiAgICAgIC0gLi4vZ2xvYmFsLnlhbWwuZ290bXBsCiAg" + - "ICAgIC0gLi4vPHByaXZhdGUtdmFsdWVzPi97eyByZXF1aXJlZEVudiAiSEVMTUZJTEVfRU5WIiB9" + - "fS1zZWNyZXRzLnlhbWwKCiMgV2hlbiBvdmVycmlkaW5nLCBNVVNUIHJlLWluY2x1ZGUgYm90aDoK" + - "LSBuYW1lOiBjYXNzYW5kcmEKICA8PDogKmRlcGVuZGVuY3kKICB2YWx1ZXM6CiAgICAtIC4uL2ds" + - "b2JhbC55YW1sLmdvdG1wbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg" + - "ICAgICAjIE11c3QgcmUtaW5jbHVkZQogICAgLSAuLi88cHJpdmF0ZS12YWx1ZXM+L3t7IHJlcXVp" + - "cmVkRW52ICJIRUxNRklMRV9FTlYiIH19LXNlY3JldHMueWFtbCAgICMgTXVzdCByZS1pbmNsdWRl" + - "CiAgICAtIGNhc3NhbmRyYTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg" + - "ICAgICAgICAgICAgICAgICAgIyBZb3VyIG92ZXJyaWRlCiAgICAgICAgcmVzb3VyY2VzOgogICAg" + - "ICAgICAgbGltaXRzOgogICAgICAgICAgICBtZW1vcnk6IDgxOTJNaQpgYGAKCiMjIyBgaW5oZXJp" + - "dGAgKEhlbG1maWxlIG5hdGl2ZSkKClVzZWQgaW4gYDAyLWNvcmUueWFtbC5nb3RtcGxgLiBIZWxt" + - "ZmlsZSdzIG5hdGl2ZSBpbmhlcml0YW5jZSBtZWNoYW5pc20uCgpgYGB5YW1sCi0gbmFtZTogYXBp" + - "CiAgdmVyc2lvbjogMS42LjAKICBuYW1lc3BhY2U6IG52Y2YKICBpbmhlcml0OgogICAgLSB0ZW1w" + - "bGF0ZTogc2VydmljZQpgYGAKCldoZW4gYWRkaW5nIGB2YWx1ZXM6YCB0byBhbiBpbmhlcml0ZWQg" + - "cmVsZWFzZSwgeW91IGFsc28gbmVlZCB0byByZS1pbmNsdWRlIHRoZSB0ZW1wbGF0ZSdzIHZhbHVl" + - "cyBmaWxlcyBzaW5jZSBgdmFsdWVzYCBpcyBhIGxpc3QgdGhhdCBnZXRzIHJlcGxhY2VkLgoKIyMg" + - "VmFsdWVzIFByZWNlZGVuY2UKCkZyb20gbG93ZXN0IHRvIGhpZ2hlc3QgcHJpb3JpdHk6CgoxLiBg" + - "ZW52aXJvbm1lbnRzL2Jhc2UueWFtbGAgLS0gZGVmYXVsdHMgc2hhcmVkIGFjcm9zcyBhbGwgZW52" + - "aXJvbm1lbnRzCjIuIGBlbnZpcm9ubWVudHMvPGVudj4ueWFtbGAgLS0gcGVyLWVudmlyb25tZW50" + - "IG92ZXJyaWRlcwozLiBgZ2xvYmFsLnlhbWwuZ290bXBsYCAtLSBHbyB0ZW1wbGF0ZSBwcm9jZXNz" + - "aW5nIChjb25zdHJ1Y3RzIGNoYXJ0LXNwZWNpZmljIHN0cnVjdHVyZSkKNC4gYDxwcml2YXRlLXZh" + - "bHVlcz4vPGVudj4tc2VjcmV0cy55YW1sYCAtLSBzZW5zaXRpdmUgdmFsdWVzCjUuIElubGluZSBg" + - "dmFsdWVzOmAgYmxvY2tzIG9uIHJlbGVhc2VzIC0tIGhpZ2hlc3QgcHJlY2VkZW5jZQoKIyMgV2hh" + - "dCBnbG9iYWwueWFtbC5nb3RtcGwgUGFzc2VzIFRocm91Z2gKCmBnbG9iYWwueWFtbC5nb3RtcGxg" + - "IHJlYWRzIGZyb20gYC5WYWx1ZXNgICh0aGUgbWVyZ2VkIGVudmlyb25tZW50ICsgZW52LXNwZWNp" + - "ZmljIFlBTUwpIGFuZCBjb25zdHJ1Y3RzIGNoYXJ0LXNwZWNpZmljIHZhbHVlcy4gSXQgb25seSBw" + - "YXNzZXMgdGhyb3VnaCBrZXlzIGl0IGV4cGxpY2l0bHkgcmVmZXJlbmNlczoKCiMjIyBDYXNzYW5k" + - "cmEKCi0gYGNhc3NhbmRyYS5yZXBsaWNhQ291bnRgCi0gYGNhc3NhbmRyYS5pbWFnZS4qYCAocmVn" + - "aXN0cnksIHJlcG9zaXRvcnkpCi0gYGNhc3NhbmRyYS5taWdyYXRpb25zLmltYWdlLipgCi0gYGNh" + - "c3NhbmRyYS5wZXJzaXN0ZW5jZS5zaXplYAotIGBjYXNzYW5kcmEubm9kZVNlbGVjdG9yYCAoaWYg" + - "YGdsb2JhbC5ub2RlU2VsZWN0b3JzLmVuYWJsZWRgKQotIGBjYXNzYW5kcmEuZ2xvYmFsLmRlZmF1" + - "bHRTdG9yYWdlQ2xhc3NgCgojIyMgTkFUUwoKLSBgbmF0cy5jb250YWluZXIuaW1hZ2UuKmAKLSBg" + - "bmF0cy5yZWxvYWRlci5pbWFnZS4qYAotIGBuYXRzLm5hdHNCb3guY29udGFpbmVyLmltYWdlLipg" + - "Ci0gYG5hdHMuY29uZmlnLmpldHN0cmVhbS5maWxlU3RvcmUucHZjLnN0b3JhZ2VDbGFzc05hbWVg" + - "Ci0gYG5hdHMucG9kVGVtcGxhdGUubWVyZ2Uuc3BlYy5ub2RlU2VsZWN0b3JgIChpZiBlbmFibGVk" + - "KQoKIyMjIE9wZW5CYW8KCi0gYG9wZW5iYW8ubWlncmF0aW9ucy5pbWFnZS4qYCBhbmQgYG9wZW5i" + - "YW8ubWlncmF0aW9ucy5lbnZgCi0gYG9wZW5iYW8uaW5qZWN0b3IuaW1hZ2UuKmAKLSBgb3BlbmJh" + - "by5zZXJ2ZXIuaW1hZ2UuKmAKLSBgb3BlbmJhby5zZXJ2ZXIuZGF0YVN0b3JhZ2UuKmAKLSBOb2Rl" + - "IHNlbGVjdG9ycyAoaWYgZW5hYmxlZCkKCiMjIyBTZXJ2aWNlcyAoQVBJLCBTSVMsIGV0Yy4pCgot" + - "IGA8c2VydmljZT4uaW1hZ2UuKmAgKHJlZ2lzdHJ5LCByZXBvc2l0b3J5KQotIGA8c2VydmljZT4u" + - "bm9kZVNlbGVjdG9yYCAoaWYgZW5hYmxlZCkKLSBgPHNlcnZpY2U+LmVudi4qYCAob2JzZXJ2YWJp" + - "bGl0eSBzZXR0aW5ncykKCiMjIyBMTE0gRnVuY3Rpb24gRW5hYmxlbWVudAoKRW5hYmxlIHRoZSBM" + - "TE0gYWRkb24gYmVmb3JlIGNyZWF0aW5nIG9yIGludm9raW5nIGZ1bmN0aW9ucyB3aXRoCmBmdW5j" + - "dGlvblR5cGU6ICJMTE0iYC4gVGhlIGFkZG9uIGRlcGxveXMgYGxsbS1yZXF1ZXN0LXJvdXRlcmAg" + - "YW5kCmBsbG0tYXBpLWdhdGV3YXlgLCBhZGRzIHRoZSBgbGxtLmludm9jYXRpb24uPGRvbWFpbj5g" + - "IHJvdXRlIHdoZW4gR2F0ZXdheSBBUEkKaW5ncmVzcyBpcyBlbmFibGVkLCBhbmQgY29uZmlndXJl" + - "cyB3b3JrZXJzIHRvIHVzZSB0aGUgTExNIHNpZGVjYXIuIFRoZSBIZWxtZmlsZQpjb25kaXRpb24g" + - "aXMgYGFkZG9ucy5sbG0uZW5hYmxlZGAuIERvIG5vdCB1c2UgdGhlIG9ic29sZXRlIGBsbG0uZW5h" + - "YmxlZGAgcGF0aC4KCkZvciBhIHNpbmdsZS1ub2RlIGlzb2xhdGVkIHRlc3QgY2x1c3RlciwgYWRk" + - "IHRoaXMgY29uZmlndXJhdGlvbiB0bwpgZW52aXJvbm1lbnRzLzxlbnY+LnlhbWxgIGJlZm9yZSBh" + - "cHBseWluZyB0aGUgc3RhY2s6CgpgYGB5YW1sCmFkZG9uczoKICBsbG06CiAgICBlbmFibGVkOiB0" + - "cnVlCiAgICBnYXRld2F5OgogICAgICByZXBsaWNhQ291bnQ6IDEKICAgICAgbWV0cmljczoKICAg" + - "ICAgICBzZXJ2aWNlTW9uaXRvcjoKICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlCiAgICByZXF1ZXN0" + - "Um91dGVyOgogICAgICByZXBsaWNhQ291bnQ6IDEKICAgICAgbWV0cmljczoKICAgICAgICBzZXJ2" + - "aWNlTW9uaXRvcjoKICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlCgphZ2VudENvbmZpZzoKICBtZXJn" + - "ZUNvbmZpZzogfAogICAgY2x1c3RlcjoKICAgICAgdmFsaWRhdGlvblBvbGljeToKICAgICAgICBu" + - "YW1lOiBVbnJlc3RyaWN0ZWQKICAgIHdvcmtsb2FkOgogICAgICBzdGFyZ2F0ZVFVSUNJbnNlY3Vy" + - "ZTogdHJ1ZQpgYGAKClVzZSBgcmVwbGljYUNvdW50OiAxYCBvbmx5IGZvciBsb2NhbCBvciBzaW5n" + - "bGUtbm9kZSB0ZXN0IGNsdXN0ZXJzLiBUaGUgYnVuZGxlZApOVkNGIEFQSSBjdXJyZW50bHkgc2Vy" + - "dmVzIHBsYWludGV4dCBnUlBDIG9uIHBvcnQgOTA5MCwgc28gdGhlIHNlbGYtbWFuYWdlZCBzdGFj" + - "awpkZWZhdWx0cyB0aGUgTExNIEFQSSBHYXRld2F5IGF1dGhlbnRpY2F0aW9uIGhvcCB0byBwbGFp" + - "bnRleHQuIFNldApgYWRkb25zLmxsbS5nYXRld2F5LmF1dGguZ3JwY0luc2VjdXJlOiBmYWxzZWAg" + - "b25seSB3aXRoIGEgVExTLWNhcGFibGUgTlZDRiBBUEkuCgpXb3JrZXItdG8tcm91dGVyIHRyYW5z" + - "cG9ydCBpcyBzZXBhcmF0ZS4gRm9yIHNoYXJlZCBvciBwcm9kdWN0aW9uIGNsdXN0ZXJzLCB1c2UK" + - "dGhlIHJlcXVpcmVkIHJlcGxpY2EgY291bnQgYW5kIHRoZSBtYW5hZ2VkIFRMUyBjb25maWd1cmF0" + - "aW9uLiBUaGUKYHdvcmtsb2FkLnN0YXJnYXRlUVVJQ0luc2VjdXJlYCBzZXR0aW5nIGVuYWJsZXMg" + - "cGxhaW50ZXh0IHdvcmtlciB0cmFuc3BvcnQgYW5kCm11c3Qgbm90IGJlIHVzZWQgaW4gcHJvZHVj" + - "dGlvbi4KClRoZSByZXF1ZXN0IHJvdXRlciB1c2VzIGBwb3dlci1vZi10d29gIHdoZW4gbm8gbG9h" + - "ZC1iYWxhbmNlciBjb25maWd1cmF0aW9uIGlzCnNldC4gQ29uZmlndXJlIG90aGVyIHJvdXRpbmcg" + - "bWV0aG9kcyB3aXRoIHRoZQpbTExNIFJlcXVlc3QgUm91dGVyIExvYWQgQmFsYW5jaW5nXShodHRw" + - "czovL2dpdGh1Yi5jb20vTlZJRElBL252Y2YvYmxvYi9tYWluL2RvY3MvdXNlci9sbG0tcmVxdWVz" + - "dC1yb3V0ZXItbG9hZC1iYWxhbmNpbmcubWQpCmd1aWRlLgoKSWYgdGhlIHNpZGVjYXIgaW1hZ2Ug" + - "aXMgbWlycm9yZWQgb3V0c2lkZSB0aGUgc3RhY2sncyBkZWZhdWx0IGltYWdlIHJlZ2lzdHJ5IGFu" + - "ZApyZXBvc2l0b3J5LCBzZXQgdGhlIGdlbmVyYXRlZCB3b3JrZXIgc2lkZWNhciBpbWFnZSBleHBs" + - "aWNpdGx5OgoKYGBgeWFtbAphcGk6CiAgcmVtb3RlQ29uZmlnOgogICAgY29uZmlnRGF0YToKICAg" + - "ICAgbnZjZjoKICAgICAgICBzaWRlY2FyczoKICAgICAgICAgIGxsbS1yb3V0ZXItY2xpZW50LWlt" + - "YWdlOiA8cmVnaXN0cnk+LzxyZXBvc2l0b3J5Pi9weWxvbjowLjE0LjEKYGBgCgpUaGUgbGVnYWN5" + - "IGBhcGkuZW52Lk5WQ0ZfU0lERUNBUlNfTExNX1JPVVRFUl9DTElFTlRfSU1BR0VgIHBhdGggaXMg" + - "ZGVwcmVjYXRlZC4KVGhlIHN0YWNrIHRyYW5zbGF0ZXMgaXQgZm9yIG9uZSBjb21wYXRpYmlsaXR5" + - "IHdpbmRvdywgYnV0IG5ldyBjb25maWd1cmF0aW9ucwptdXN0IHVzZSB0aGUgcmVtb3RlLWNvbmZp" + - "ZyBwYXRoLiBDb25mbGljdGluZyB2YWx1ZXMgZmFpbCByZW5kZXJpbmcuCgpSZW5kZXIgYW5kIGFw" + - "cGx5IHRoZSB1cGRhdGVkIGNvbnRyb2wtcGxhbmUgZW52aXJvbm1lbnQsIHRoZW4gcmVmcmVzaCBl" + - "dmVyeQpyZWdpc3RlcmVkIGNvbXB1dGUgcGxhbmUgdXNpbmcgdGhlIHNhbWUgaGFuZG9mZiB1c2Vk" + - "IGZvciBpdHMgaW5zdGFsbGF0aW9uIHNvCk5WQ0EgcmVjZWl2ZXMgYGFnZW50Q29uZmlnLm1lcmdl" + - "Q29uZmlnYDoKCmBgYGJhc2gKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIHRlbXBsYXRlCkhF" + - "TE1GSUxFX0VOVj08ZW52PiBoZWxtZmlsZSBzeW5jCmBgYAoKVXNlIHRoZSBjb21wbGV0ZSBjb21w" + - "dXRlLXBsYW5lIGluc3RhbGwgY29tbWFuZCBmcm9tCltTcGxpdCBDb21wdXRlLVBsYW5lIEluc3Rh" + - "bGxhdGlvbl0oY29tcHV0ZS1wbGFuZS1pbnN0YWxsYXRpb24ubWQpLiBBCkNMSS1wcm9maWxlIGlu" + - "c3RhbGxhdGlvbiBtdXN0IHJlbWFpbiBwcm9maWxlLWRyaXZlbjsgYSBIZWxtZmlsZSBpbnN0YWxs" + - "YXRpb24KbXVzdCByZW1haW4gdmFsdWVzLWRyaXZlbi4KCkV4aXN0aW5nIExMTSBmdW5jdGlvbiB2" + - "ZXJzaW9ucyByZXRhaW4gdGhlIHdvcmtlci1zaWRlY2FyIGltYWdlIG1ldGFkYXRhCmNhcHR1cmVk" + - "IHdoZW4gdGhlIHZlcnNpb24gaXMgY3JlYXRlZC4gUmVwbGFjaW5nIHBvZHMgb3IgcmVkZXBsb3lp" + - "bmcgdGhlIHNhbWUKdmVyc2lvbiBkb2VzIG5vdCBhcHBseSBhIG5ldyBQeWxvbiBpbWFnZS4gQWZ0" + - "ZXIgdGhlIGNvbnRyb2wtcGxhbmUgdXBkYXRlLApjcmVhdGUgYW5kIGRlcGxveSBhIG5ldyBmdW5j" + - "dGlvbiB2ZXJzaW9uLiBWZXJpZnkgdGhlIGNvbnRyb2wgcGxhbmUsIHJvdXRlLCBhbmQKd29ya2Vy" + - "IHNpZGVjYXI6CgpgYGBiYXNoCmt1YmVjdGwgZ2V0IGRlcGxveSAtbiBudmNmIGxsbS1hcGktZ2F0" + - "ZXdheQprdWJlY3RsIGdldCBzdGF0ZWZ1bHNldCAtbiBudmNmIGxsbS1yZXF1ZXN0LXJvdXRlcgpr" + - "dWJlY3RsIGdldCBwb2RzIC1uIG52Y2YgfCBncmVwIC1FICdsbG0tYXBpLWdhdGV3YXl8bGxtLXJl" + - "cXVlc3Qtcm91dGVyJwprdWJlY3RsIGdldCBodHRwcm91dGUgLUEgfCBncmVwIGxsbQprdWJlY3Rs" + - "IC1uIG52Y2YtYmFja2VuZCBnZXQgcG9kIDxmdW5jdGlvbi1wb2Q+IFwKICAtbyBqc29ucGF0aD0n" + - "e3JhbmdlIC5zcGVjLmNvbnRhaW5lcnNbPyhALm5hbWU9PSJsbG0td29ya2VyIildLmFyZ3NbKl19" + - "ey59eyJcXG4ifXtlbmR9JwpgYGAKCkZvciBsb2NhbCBwbGFpbnRleHQgY2x1c3RlcnMsIHRoZSBg" + - "bGxtLXdvcmtlcmAgYXJncyBtdXN0IGluY2x1ZGUKYC0tcXVpYy1pbnNlY3VyZWAuCgpGb3IgbG9h" + - "ZC1iYWxhbmNlciBzY2hlbWEgYW5kIGFsZ29yaXRobSBiZWhhdmlvciwgc2VlIHRoZQpbU3Rhcmdh" + - "dGUgY29uZmlndXJhdGlvbiBndWlkZV0oaHR0cHM6Ly9naXRodWIuY29tL05WSURJQS9udmNmL2Js" + - "b2IvbWFpbi9zcmMvbGlicmFyaWVzL3J1c3Qvc3RhcmdhdGUvZG9jcy9sb2FkLWJhbGFuY2VyLWNv" + - "bmZpZ3VyYXRpb24ubWQpLgoKIyMgSGVsbWZpbGUgU2VsZWN0b3JzCgpUYXJnZXQgc3BlY2lmaWMg" + - "cmVsZWFzZXMgb3IgZ3JvdXBzOgoKYGBgYmFzaAojIEJ5IHJlbGVhc2UgZ3JvdXAKSEVMTUZJTEVf" + - "RU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0b3IgcmVsZWFzZS1ncm91cD1kZXBlbmRlbmNpZXMg" + - "c3luYwpIRUxNRklMRV9FTlY9PGVudj4gaGVsbWZpbGUgLS1zZWxlY3RvciByZWxlYXNlLWdyb3Vw" + - "PXNlcnZpY2VzIHN5bmMKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0b3IgcmVs" + - "ZWFzZS1ncm91cD1pbmdyZXNzIHN5bmMKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2Vs" + - "ZWN0b3IgcmVsZWFzZS1ncm91cD1vYnNlcnZhYmlsaXR5IHN5bmMKCiMgQnkgcmVsZWFzZSBuYW1l" + - "CkhFTE1GSUxFX0VOVj08ZW52PiBoZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9Y2Fzc2FuZHJhIHN5" + - "bmMKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0b3IgbmFtZT1hZG1pbi1pc3N1" + - "ZXItcHJveHkgc3luYwpIRUxNRklMRV9FTlY9PGVudj4gaGVsbWZpbGUgLS1zZWxlY3RvciBuYW1l" + - "PWxsbS1yZXF1ZXN0LXJvdXRlciBzeW5jCkhFTE1GSUxFX0VOVj08ZW52PiBoZWxtZmlsZSAtLXNl" + - "bGVjdG9yIG5hbWU9bGxtLWFwaS1nYXRld2F5IHN5bmMKCiMgVGVtcGxhdGUgb25seSAoZHJ5IHJ1" + - "bikKSEVMTUZJTEVfRU5WPTxlbnY+IGhlbG1maWxlIC0tc2VsZWN0b3IgbmFtZT1jYXNzYW5kcmEg" + - "dGVtcGxhdGUKCiMgRGVzdHJveSBhIHNpbmdsZSByZWxlYXNlCkhFTE1GSUxFX0VOVj08ZW52PiBo" + - "ZWxtZmlsZSAtLXNlbGVjdG9yIG5hbWU9Y2Fzc2FuZHJhIGRlc3Ryb3kKYGBgCgpOb3RlOiBgYWRt" + - "aW4taXNzdWVyLXByb3h5YCBoYXMgbm8gYHJlbGVhc2UtZ3JvdXBgIGxhYmVsLiBVc2UgYC0tc2Vs" + - "ZWN0b3IgbmFtZT1hZG1pbi1pc3N1ZXItcHJveHlgLgpQSwcIsTUd2wIqAAACKgAAUEsDBBQACAAA" + - "AAAAIQAAAAAAAAAAAAAAAAA/AAkAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24v" + - "cmVmZXJlbmNlcy9udmNmLXVpLWFkZG9uLm1kVVQFAAEAps4SIyBOVkNGIFVJIEFkZG9uCgpOVkNG" + - "IFVJIGlzIGFuIG9wdGlvbmFsLCBjdXN0b21lci1mYWNpbmcgTlZDRiBhZG1pbi1wYW5lbCBVSS4g" + - "SXQgaXMgZGlzYWJsZWQgYnkKZGVmYXVsdCBhbmQgYXZhaWxhYmxlIG9ubHkgaW4gc3RhY2sgcGFj" + - "a2FnZXMgdGhhdCBpbmNsdWRlIHRoZSBOVkNGIFVJIGFkZG9uLgoKIyMgV2hlbiB0byBlbmFibGUK" + - "CkVuYWJsZSBOVkNGIFVJIG9ubHkgd2hlbiB5b3UgbmVlZCB0aGUgYWRtaW4tcGFuZWwgVUkgYW5k" + - "IHlvdXIgZXh0cmFjdGVkIHN0YWNrCnBhY2thZ2UgaW5jbHVkZXMgdGhlIGFkZG9uLiBJZiB0aGUg" + - "cGFja2FnZSBkb2VzIG5vdCBjb250YWluIGEgYG52Y2YtdWlgIHJlbGVhc2UKYW5kIGBudmNmVWlg" + - "IHJvdXRlIHZhbHVlcywgc2tpcCB0aGUgYWRkb24gdW50aWwgeW91IHVzZSBhIHBhY2thZ2UgdGhh" + - "dCBpbmNsdWRlcwp0aGVtLgoKIyMgRW5hYmxlIHRoZSBhZGRvbgoKRW5hYmxlIGl0IGluIGBlbnZp" + - "cm9ubWVudHMvPGVudi1uYW1lPi55YW1sYDoKCmBgYHlhbWwKYWRkb25zOgogIG52Y2ZVaToKICAg" + - "IGVuYWJsZWQ6IHRydWUKYGBgCgojIyBDcmVhdGUgbmFtZXNwYWNlIGFuZCBpbWFnZSBwdWxsIHNl" + - "Y3JldAoKQ3JlYXRlIHRoZSBuYW1lc3BhY2UsIGFuZCBhbiBpbWFnZSBwdWxsIHNlY3JldCBvbmx5" + - "IGlmIHB1bGxpbmcgZnJvbSBhIHByaXZhdGUKcmVnaXN0cnk6CgpgYGBiYXNoCmt1YmVjdGwgY3Jl" + - "YXRlIG5hbWVzcGFjZSBudmNmLXVpIC0tZHJ5LXJ1bj1jbGllbnQgLW8geWFtbCB8IGt1YmVjdGwg" + - "YXBwbHkgLWYgLQoKIyBPbmx5IGlmIHB1bGxpbmcgZnJvbSBhIHByaXZhdGUgcmVnaXN0cnkgKGUu" + - "Zy4sIE5HQyBudmNyLmlvKQpleHBvcnQgTkdDX0FQSV9LRVk9Ijx5b3VyLWtleT4iCmt1YmVjdGwg" + - "Y3JlYXRlIHNlY3JldCBkb2NrZXItcmVnaXN0cnkgbnZjci1jcmVkcyBcCiAgLS1kb2NrZXItc2Vy" + - "dmVyPW52Y3IuaW8gXAogIC0tZG9ja2VyLXVzZXJuYW1lPSckb2F1dGh0b2tlbicgXAogIC0tZG9j" + - "a2VyLXBhc3N3b3JkPSIkTkdDX0FQSV9LRVkiIFwKICAtLW5hbWVzcGFjZT1udmNmLXVpIFwKICAt" + - "LWRyeS1ydW49Y2xpZW50IC1vIHlhbWwgfCBrdWJlY3RsIGFwcGx5IC1mIC0KYGBgCgpUaGUgZGVm" + - "YXVsdCByb3V0ZSBob3N0IGlzIGBudmNmLXVpLjxkb21haW4+YCBhbmQgdGhlIGJhY2tlbmQgaXMK" + - "YG52Y2YtdWkubnZjZi11aTo4MzAwYC4KCiMjIEFwcGx5IHRoZSBzZXJ2aWNlIGFuZCByb3V0ZQoK" + - "QWZ0ZXIgY29uZmlybWluZyB0aGUgcGFja2FnZSBpbmNsdWRlcyB0aGUgYG52Y2YtdWlgIHJlbGVh" + - "c2UsIHByZXZpZXcgYW5kIGFwcGx5CnRoZSBzZXJ2aWNlIGFuZCByb3V0ZToKCmBgYGJhc2gKSEVM" + - "TUZJTEVfRU5WPTxlbnYtbmFtZT4gaGVsbWZpbGUgLS1zZWxlY3RvciBuYW1lPW52Y2YtdWkgdGVt" + - "cGxhdGUKSEVMTUZJTEVfRU5WPTxlbnYtbmFtZT4gaGVsbWZpbGUgLS1zZWxlY3RvciBuYW1lPW52" + - "Y2YtdWkgc3luYwpIRUxNRklMRV9FTlY9PGVudi1uYW1lPiBoZWxtZmlsZSAtLXNlbGVjdG9yIHJl" + - "bGVhc2UtZ3JvdXA9aW5ncmVzcyBzeW5jCmBgYAoKIyMgVmVyaWZ5CgpWZXJpZnkgdGhlIHJvdXRl" + - "IG9ubHkgd2hlbiB0aGUgYWRkb24gaXMgcHJlc2VudCBhbmQgZW5hYmxlZDoKCmBgYGJhc2gKa3Vi" + - "ZWN0bCBnZXQgZGVwbG95LHN2YyAtbiBudmNmLXVpCmt1YmVjdGwgZ2V0IGh0dHByb3V0ZSAtQSB8" + - "IGdyZXAgLWkgbnZjZi11aQpjdXJsIC1pIC1IICJIb3N0OiBudmNmLXVpLjxkb21haW4+IiAiaHR0" + - "cDovLzxnYXRld2F5LWFkZHJlc3M+L3N0YXR1cyIKYGBgCgojIyBTZWN1cml0eQoKVGhlIE5WQ0Yg" + - "VUkgYWRtaW4gcGFuZWwgaXMgY3VycmVudGx5IHVuYXV0aGVudGljYXRlZC4gRG8gbm90IGV4cG9z" + - "ZSBpdCB0byB0aGUKcHVibGljIGludGVybmV0LiBSZXN0cmljdCBhY2Nlc3MgdG8gYSB0cnVzdGVk" + - "IG5ldHdvcmssIFZQTiwgb3IgYW4gYXV0aGVudGljYXRpbmcKcHJveHkgaW4gZnJvbnQgb2YgdGhl" + - "IGBudmNmLXVpYCByb3V0ZS4KUEsHCDj5J6+5BwAAuQcAAFBLAwQUAAgAAAAAACEAAAAAAAAAAAAA" + - "AAAAPgAJAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uL3JlZmVyZW5jZXMvcHVs" + - "bC1zZWNyZXRzLm1kVVQFAAEAps4SIyBJbWFnZSBQdWxsIFNlY3JldHMgUmVmZXJlbmNlCgojIyBP" + - "dmVydmlldwoKV2hlbiBwdWxsaW5nIE5WQ0YgaW1hZ2VzIGZyb20gYSBwcml2YXRlIHJlZ2lzdHJ5" + - "IChmb3IgZXhhbXBsZSwgTkdDCmBudmNyLmlvYCksIEt1YmVybmV0ZXMgbmVlZHMgYGltYWdlUHVs" + - "bFNlY3JldHNgIG9uIGV2ZXJ5IHBvZC4gQ29udHJvbC1wbGFuZSBhbmQKY29tcHV0ZS1wbGFuZSBj" + - "cmVkZW50aWFscyBhcmUgY29uZmlndXJlZCBpbiB0aGVpciBvd24gY2x1c3RlciBjb250ZXh0cy4g" + - "RG8gbm90CnVzZSBvbmUgbWl4ZWQgbmFtZXNwYWNlIGxpc3QuCgpUaGUgcmVjb21tZW5kZWQgY29u" + - "dHJvbC1wbGFuZSBhcHByb2FjaCB1c2VzIEt5dmVybm8gdG8gaW5qZWN0IHRoZSBzZWNyZXQgaW50" + - "bwpjb250cm9sLXBsYW5lIHBvZHMgYXQgYWRtaXNzaW9uIHRpbWUuIFRoZSBjb21wdXRlLXBsYW5l" + - "IGNoYXJ0IGFuZCBvcGVyYXRvciB1c2UKdGhlIHNlY3JldCBpbiBgbnZjYS1vcGVyYXRvcmAgYW5k" + - "IG1pcnJvciBpdCB0byBgbnZjYS1zeXN0ZW1gLgoKIyMgS3l2ZXJubyBBcHByb2FjaCAoUmVjb21t" + - "ZW5kZWQpCgojIyMgMS4gSW5zdGFsbCBLeXZlcm5vCgpgYGBiYXNoCmhlbG0gcmVwbyBhZGQga3l2" + - "ZXJubyBodHRwczovL2t5dmVybm8uZ2l0aHViLmlvL2t5dmVybm8vCmhlbG0gcmVwbyB1cGRhdGUK" + - "aGVsbSBpbnN0YWxsIGt5dmVybm8ga3l2ZXJuby9reXZlcm5vIC1uIGt5dmVybm8gLS1jcmVhdGUt" + - "bmFtZXNwYWNlIFwKICAtLWt1YmUtY29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PgpgYGAK" + - "CiMjIyAyLiBDcmVhdGUgY29udHJvbC1wbGFuZSBwdWxsIHNlY3JldHMKCmBgYGJhc2gKZXhwb3J0" + - "IE5HQ19BUElfS0VZPSI8eW91ci1uZ2MtYXBpLWtleT4iCgpmb3IgbnMgaW4gY2Fzc2FuZHJhLXN5" + - "c3RlbSBuYXRzLXN5c3RlbSBudmNmIGFwaS1rZXlzIGVzcyBzaXMgdmF1bHQtc3lzdGVtIGNlcnQt" + - "bWFuYWdlcjsgZG8KICBrdWJlY3RsIC0tY29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBj" + - "cmVhdGUgbmFtZXNwYWNlICIkbnMiIFwKICAgIC0tZHJ5LXJ1bj1jbGllbnQgLW8geWFtbCB8IGt1" + - "YmVjdGwgLS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRleHQ+IGFwcGx5IC1mIC0KZG9uZQoK" + - "Zm9yIG5zIGluIGNhc3NhbmRyYS1zeXN0ZW0gbmF0cy1zeXN0ZW0gbnZjZiBhcGkta2V5cyBlc3Mg" + - "c2lzIHZhdWx0LXN5c3RlbSBjZXJ0LW1hbmFnZXI7IGRvCiAga3ViZWN0bCAtLWNvbnRleHQgPGNv" + - "bnRyb2wtcGxhbmUtY29udGV4dD4gY3JlYXRlIHNlY3JldCBkb2NrZXItcmVnaXN0cnkgbnZjci1j" + - "cmVkcyBcCiAgICAtLWRvY2tlci1zZXJ2ZXI9bnZjci5pbyBcCiAgICAtLWRvY2tlci11c2VybmFt" + - "ZT0nJG9hdXRodG9rZW4nIFwKICAgIC0tZG9ja2VyLXBhc3N3b3JkPSIkTkdDX0FQSV9LRVkiIFwK" + - "ICAgIC0tbmFtZXNwYWNlPSIkbnMiIFwKICAgIC0tZHJ5LXJ1bj1jbGllbnQgLW8geWFtbCB8IGt1" + - "YmVjdGwgLS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRleHQ+IGFwcGx5IC1mIC0KZG9uZQpg" + - "YGAKCkZvciBub24tTkdDIHJlZ2lzdHJpZXMsIHJlcGxhY2UgYC0tZG9ja2VyLXNlcnZlcmAsIGAt" + - "LWRvY2tlci11c2VybmFtZWAsIGFuZCBgLS1kb2NrZXItcGFzc3dvcmRgLgoKIyMjIDMuIEFwcGx5" + - "IEt5dmVybm8gQ2x1c3RlclBvbGljeQoKYGBgeWFtbAphcGlWZXJzaW9uOiBreXZlcm5vLmlvL3Yx" + - "CmtpbmQ6IENsdXN0ZXJQb2xpY3kKbWV0YWRhdGE6CiAgbmFtZTogbnZjZi1hZGQtaW1hZ2VwdWxs" + - "c2VjcmV0cwpzcGVjOgogIGJhY2tncm91bmQ6IGZhbHNlCiAgcnVsZXM6CiAgICAtIG5hbWU6IGFk" + - "ZC1pbWFnZXB1bGxzZWNyZXQtdG8tbnZjZi1wb2RzCiAgICAgIG1hdGNoOgogICAgICAgIGFueToK" + - "ICAgICAgICAtIHJlc291cmNlczoKICAgICAgICAgICAga2luZHM6CiAgICAgICAgICAgIC0gUG9k" + - "CiAgICAgICAgICAgIG5hbWVzcGFjZXM6CiAgICAgICAgICAgIC0gIm52Y2YiCiAgICAgICAgICAg" + - "IC0gImFwaS1rZXlzIgogICAgICAgICAgICAtICJzaXMiCiAgICAgICAgICAgIC0gImVzcyIKICAg" + - "ICAgICAgICAgLSAibmF0cy1zeXN0ZW0iCiAgICAgICAgICAgIC0gImNhc3NhbmRyYS1zeXN0ZW0i" + - "CiAgICAgICAgICAgIC0gInZhdWx0LXN5c3RlbSIKICAgICAgICAgICAgLSAiY2VydC1tYW5hZ2Vy" + - "IgogICAgICBtdXRhdGU6CiAgICAgICAgcGF0Y2hTdHJhdGVnaWNNZXJnZToKICAgICAgICAgIG1l" + - "dGFkYXRhOgogICAgICAgICAgICBhbm5vdGF0aW9uczoKICAgICAgICAgICAgICBudmNmLm52aWRp" + - "YS5jb20vaW1hZ2VwdWxsc2VjcmV0LWluamVjdGVkLWJ5OiBreXZlcm5vCiAgICAgICAgICBzcGVj" + - "OgogICAgICAgICAgICBpbWFnZVB1bGxTZWNyZXRzOgogICAgICAgICAgICAtIG5hbWU6IG52Y3It" + - "Y3JlZHMKYGBgCgpgYGBiYXNoCmt1YmVjdGwgLS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRl" + - "eHQ+IGFwcGx5IFwKICAtZiBreXZlcm5vLWltYWdlcHVsbHNlY3JldC1wb2xpY3kueWFtbApgYGAK" + - "CiMjIyA0LiBJbnN0YWxsIHRoZSBjb250cm9sIHBsYW5lCgpDb250aW51ZSB3aXRoIHRoZSBzZWxl" + - "Y3RlZCBjb250cm9sLXBsYW5lIGluc3RhbGxhdGlvbiBpbgpbU3BsaXQgQ29tcHV0ZS1QbGFuZSBJ" + - "bnN0YWxsYXRpb25dKGNvbXB1dGUtcGxhbmUtaW5zdGFsbGF0aW9uLm1kKS4gTm8KY29udHJvbC1w" + - "bGFuZSBoZWxtZmlsZSBtb2RpZmljYXRpb25zIGFyZSBuZWVkZWQuIEt5dmVybm8gaW5qZWN0cyB0" + - "aGUgcHVsbApzZWNyZXQgaW50byBuZXcgY29udHJvbC1wbGFuZSBwb2RzLgoKIyMgQ29tcHV0ZS1Q" + - "bGFuZSBTZWNyZXQKCkNyZWF0ZSB0aGUgc2VjcmV0IG9ubHkgaW4gYG52Y2Etb3BlcmF0b3JgIG9u" + - "IHRoZSBjb21wdXRlIGNsdXN0ZXI6CgpgYGBiYXNoCmt1YmVjdGwgLS1jb250ZXh0IDxjb21wdXRl" + - "LXBsYW5lLWNvbnRleHQ+IGNyZWF0ZSBuYW1lc3BhY2UgbnZjYS1vcGVyYXRvciBcCiAgLS1kcnkt" + - "cnVuPWNsaWVudCAtbyB5YW1sIHwgXAogIGt1YmVjdGwgLS1jb250ZXh0IDxjb21wdXRlLXBsYW5l" + - "LWNvbnRleHQ+IGFwcGx5IC1mIC0KCmt1YmVjdGwgLS1jb250ZXh0IDxjb21wdXRlLXBsYW5lLWNv" + - "bnRleHQ+IGNyZWF0ZSBzZWNyZXQgZG9ja2VyLXJlZ2lzdHJ5IG52Y3ItY3JlZHMgXAogIC0tZG9j" + - "a2VyLXNlcnZlcj1udmNyLmlvIFwKICAtLWRvY2tlci11c2VybmFtZT0nJG9hdXRodG9rZW4nIFwK" + - "ICAtLWRvY2tlci1wYXNzd29yZD0iJE5HQ19BUElfS0VZIiBcCiAgLS1uYW1lc3BhY2U9bnZjYS1v" + - "cGVyYXRvciBcCiAgLS1kcnktcnVuPWNsaWVudCAtbyB5YW1sIHwgXAogIGt1YmVjdGwgLS1jb250" + - "ZXh0IDxjb21wdXRlLXBsYW5lLWNvbnRleHQ+IGFwcGx5IC1mIC0KYGBgCgpSZWZlcmVuY2UgaXQg" + - "aW4gdGhlIGNvbXB1dGUtcGxhbmUgZW52aXJvbm1lbnQgZmlsZToKCmBgYHlhbWwKZ2xvYmFsOgog" + - "IGltYWdlUHVsbFNlY3JldHM6CiAgICAtIG5hbWU6IG52Y3ItY3JlZHMKYGBgCgpUaGUgY2hhcnQg" + - "YW5kIG9wZXJhdG9yIHVzZSB0aGF0IHJlZmVyZW5jZSBpbiBgbnZjYS1vcGVyYXRvcmAgYW5kIG1p" + - "cnJvciB0aGUKc2VjcmV0IHRvIGBudmNhLXN5c3RlbWAuIERvIG5vdCBjcmVhdGUgYSBicm9hZGVy" + - "IG1hbnVhbCBjb21wdXRlIG5hbWVzcGFjZSBsaXN0LiBGb2xsb3cKW1NwbGl0IENvbXB1dGUtUGxh" + - "bmUgSW5zdGFsbGF0aW9uXShjb21wdXRlLXBsYW5lLWluc3RhbGxhdGlvbi5tZCkgZm9yIHRoZQpz" + - "ZWxlY3RlZCBpbnN0YWxsIGZsb3cuCgojIyBWZXJpZmljYXRpb24KCmBgYGJhc2gKIyBDaGVjayB0" + - "aGF0IGEgY29udHJvbC1wbGFuZSBwb2QgaGFzIHRoZSBpbmplY3RlZCBzZWNyZXQKa3ViZWN0bCAt" + - "LWNvbnRleHQgPGNvbnRyb2wtcGxhbmUtY29udGV4dD4gZ2V0IHBvZCAtbiA8bmFtZXNwYWNlPiA8" + - "cG9kLW5hbWU+IFwKICAtbyBqc29ucGF0aD0ney5zcGVjLmltYWdlUHVsbFNlY3JldHN9JwojIEV4" + - "cGVjdGVkOiBbeyJuYW1lIjoibnZjci1jcmVkcyJ9XQoKIyBDaGVjayB0aGUgS3l2ZXJubyBhbm5v" + - "dGF0aW9uCmt1YmVjdGwgLS1jb250ZXh0IDxjb250cm9sLXBsYW5lLWNvbnRleHQ+IGdldCBwb2Qg" + - "LW4gPG5hbWVzcGFjZT4gPHBvZC1uYW1lPiBcCiAgLW8ganNvbnBhdGg9J3subWV0YWRhdGEuYW5u" + - "b3RhdGlvbnMubnZjZlwubnZpZGlhXC5jb20vaW1hZ2VwdWxsc2VjcmV0LWluamVjdGVkLWJ5fScK" + - "IyBFeHBlY3RlZDoga3l2ZXJubwoKIyBDaGVjayBwdWxsIGV2ZW50cwprdWJlY3RsIC0tY29udGV4" + - "dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBnZXQgZXZlbnRzIC1uIDxuYW1lc3BhY2U+IFwKICAt" + - "LXNvcnQtYnk9Jy5sYXN0VGltZXN0YW1wJyB8IGdyZXAgLWkgcHVsbAojIFNob3VsZCBzaG93ICJT" + - "dWNjZXNzZnVsbHkgcHVsbGVkIiBub3QgIjQwMSBVbmF1dGhvcml6ZWQiCgojIENoZWNrIHRoZSBj" + - "aGFydC9vcGVyYXRvciBtaXJyb3Igb24gdGhlIGNvbXB1dGUgY2x1c3RlcgprdWJlY3RsIC0tY29u" + - "dGV4dCA8Y29tcHV0ZS1wbGFuZS1jb250ZXh0PiBnZXQgc2VjcmV0IG52Y3ItY3JlZHMgXAogIC1u" + - "IG52Y2Etc3lzdGVtCmBgYAoKIyMgV2hlbiBQdWxsIFNlY3JldHMgQXJlIE5vdCBOZWVkZWQKCi0g" + - "KipBV1MgRUNSIHdpdGggSUFNIG5vZGUgcm9sZXMqKjogSWYgeW91ciBub2RlcyBoYXZlIGBBbWF6" + - "b25FQzJDb250YWluZXJSZWdpc3RyeVJlYWRPbmx5YCBJQU0gcG9saWN5LCBLdWJlcm5ldGVzIGNh" + - "biBwdWxsIGZyb20gRUNSIHdpdGhvdXQgZXhwbGljaXQgc2VjcmV0cy4KLSAqKlB1YmxpYyByZWdp" + - "c3RyaWVzKio6IE5vIHB1bGwgc2VjcmV0cyBuZWVkZWQuCi0gKipDU1AgYnVpbHQtaW4gY3JlZGVu" + - "dGlhbCBoZWxwZXJzKio6IEdLRSBBcnRpZmFjdCBSZWdpc3RyeSwgQXp1cmUgQUNSIHdpdGggbWFu" + - "YWdlZCBpZGVudGl0eSwgYW5kIHNpbWlsYXIgc2VydmljZXMuCgojIyBUcm91Ymxlc2hvb3RpbmcK" + - "CiMjIyBQb2RzIHN0aWxsIGluIEltYWdlUHVsbEJhY2tPZmYgYWZ0ZXIgYXBwbHlpbmcgcG9saWN5" + - "CgpUaGUgS3l2ZXJubyBwb2xpY3kgb25seSBhZmZlY3RzIHBvZHMgY3JlYXRlZCAqKmFmdGVyKiog" + - "dGhlIHBvbGljeSBpcyBhcHBsaWVkLiBEZWxldGUgc3R1Y2sgcG9kcyB0byB0cmlnZ2VyIHJlY3Jl" + - "YXRpb246CgpgYGBiYXNoCmt1YmVjdGwgLS1jb250ZXh0IDx0YXJnZXQtY29udGV4dD4gZGVsZXRl" + - "IHBvZHMgLW4gPG5hbWVzcGFjZT4gLS1hbGwKYGBgCgojIyMgS3l2ZXJubyBhZG1pc3Npb24gY29u" + - "dHJvbGxlciBub3QgcnVubmluZwoKYGBgYmFzaAprdWJlY3RsIC0tY29udGV4dCA8Y29udHJvbC1w" + - "bGFuZS1jb250ZXh0PiBnZXQgcG9kcyAtbiBreXZlcm5vCiMgQWxsIHBvZHMgc2hvdWxkIGJlIFJ1" + - "bm5pbmcKYGBgCgojIyMgUG9saWN5IG5vdCBtYXRjaGluZwoKYGBgYmFzaAprdWJlY3RsIC0tY29u" + - "dGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBnZXQgY2x1c3RlcnBvbGljeSBudmNmLWFkZC1p" + - "bWFnZXB1bGxzZWNyZXRzCiMgU2hvdWxkIHNob3cgUkVBRFk6IFRydWUKYGBgCgojIyMgV3Jvbmcg" + - "c2VjcmV0IG5hbWUKClRoZSBwb2xpY3kgcmVmZXJlbmNlcyBgbnZjci1jcmVkc2AuIFZlcmlmeSB0" + - "aGUgc2VjcmV0IGV4aXN0cyB3aXRoIHRoYXQgZXhhY3QgbmFtZToKCmBgYGJhc2gKa3ViZWN0bCAt" + - "LWNvbnRleHQgPHRhcmdldC1jb250ZXh0PiBnZXQgc2VjcmV0IG52Y3ItY3JlZHMgLW4gPG5hbWVz" + - "cGFjZT4KYGBgClBLBwhLQjWoABYAAAAWAABQSwECFAAUAAgAAAAAACEATyM55UoQAABKEAAAEgAJ" + - "AAAAAAAAAAAAAAAAAAAAZGF0YS9tYW5pZmVzdC5qc29uVVQFAAEAps4SUEsBAhQAFAAIAAAAAAAh" + - "AP9282dTYQAAU2EAACMACQAAAAAAAAAAAAAAkxAAAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xp" + - "L1NLSUxMLm1kVVQFAAEAps4SUEsBAhQAFAAIAAAAAAAhAG3jewUjDAAAIwwAADMACQAAAAAAAAAA" + - "AAAAQHIAAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL2V4YW1wbGVzL2NpLXBpcGVsaW5lcy5t" + - "ZFVUBQABAKbOElBLAQIUABQACAAAAAAAIQChFOOBXQwAAF0MAAA0AAkAAAAAAAAAAAAAAM1+AABk" + - "YXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9leGFtcGxlcy9tdWx0aS1jbHVzdGVyLm1kVVQFAAEA" + - "ps4SUEsBAhQAFAAIAAAAAAAhAEInSQ8FDQAABQ0AADcACQAAAAAAAAAAAAAAlYsAAGRhdGEvbnZj" + - "Zi1zZWxmLW1hbmFnZWQtY2xpL3Byb21wdHMvYWRkLWNvbXB1dGUtcGxhbmUubWRVVAUAAQCmzhJQ" + - "SwECFAAUAAgAAAAAACEA1N6NNJ8ZAACfGQAAOQAJAAAAAAAAAAAAAAAImQAAZGF0YS9udmNmLXNl" + - "bGYtbWFuYWdlZC1jbGkvcHJvbXB0cy9jcmVhdGUtYW5kLXJ1bi10YXNrLm1kVVQFAAEAps4SUEsB" + - "AhQAFAAIAAAAAAAhANJD3AQYJQAAGCUAADcACQAAAAAAAAAAAAAAF7MAAGRhdGEvbnZjZi1zZWxm" + - "LW1hbmFnZWQtY2xpL3Byb21wdHMvZGVwbG95LWFuZC1pbnZva2UubWRVVAUAAQCmzhJQSwECFAAU" + - "AAgAAAAAACEAcpIsJr4OAAC+DgAAPQAJAAAAAAAAAAAAAACd2AAAZGF0YS9udmNmLXNlbGYtbWFu" + - "YWdlZC1jbGkvcHJvbXB0cy9kaWFnbm9zZS1mYWlsZWQtaW5zdGFsbC5tZFVUBQABAKbOElBLAQIU" + - "ABQACAAAAAAAIQBCceYeASgAAAEoAAA6AAkAAAAAAAAAAAAAAM/nAABkYXRhL252Y2Ytc2VsZi1t" + - "YW5hZ2VkLWNsaS9wcm9tcHRzL2luc3RhbGwtZnJvbS1zY3JhdGNoLm1kVVQFAAEAps4SUEsBAhQA" + - "FAAIAAAAAAAhAKrhOrnIBwAAyAcAADkACQAAAAAAAAAAAAAAQRABAGRhdGEvbnZjZi1zZWxmLW1h" + - "bmFnZWQtY2xpL3Byb21wdHMvcm90YXRlLWNsdXN0ZXItandrcy5tZFVUBQABAKbOElBLAQIUABQA" + - "CAAAAAAAIQDah2NW5CEAAOQhAAAuAAkAAAAAAAAAAAAAAHkYAQBkYXRhL252Y2Ytc2VsZi1tYW5h" + - "Z2VkLWNsaS9wcm9tcHRzL3RlYXJkb3duLm1kVVQFAAEAps4SUEsBAhQAFAAIAAAAAAAhAHIND2Qh" + - "IwAAISMAADAACQAAAAAAAAAAAAAAwjoBAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL3JlZmVy" + - "ZW5jZS9jb21tYW5kcy5tZFVUBQABAKbOElBLAQIUABQACAAAAAAAIQBzp1pk1QYAANUGAAAyAAkA" + - "AAAAAAAAAAAAAEpeAQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9yZWZlcmVuY2UvZXhpdC1j" + - "b2Rlcy5tZFVUBQABAKbOElBLAQIUABQACAAAAAAAIQCZ0OJQFy4AABcuAAAtAAkAAAAAAAAAAAAA" + - "AIhlAQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9yZWZlcmVuY2UvZmxhZ3MubWRVVAUAAQCm" + - "zhJQSwECFAAUAAgAAAAAACEA864ThHQRAAB0EQAANwAJAAAAAAAAAAAAAAADlAEAZGF0YS9udmNm" + - "LXNlbGYtbWFuYWdlZC1jbGkvcmVmZXJlbmNlL3Ryb3VibGVzaG9vdGluZy5tZFVUBQABAKbOElBL" + - "AQIUABQACAAAAAAAIQARwxSTSWIAAEliAAAsAAkAAAAAAAAAAAAAAOWlAQBkYXRhL252Y2Ytc2Vs" + - "Zi1tYW5hZ2VkLWluc3RhbGxhdGlvbi9TS0lMTC5tZFVUBQABAKbOElBLAQIUABQACAAAAAAAIQBH" + - "VWpWSlYAAEpWAAA0AAkAAAAAAAAAAAAAAJEIAgBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWluc3Rh" + - "bGxhdGlvbi9ldmFscy9ldmFscy5qc29uVVQFAAEAps4SUEsBAhQAFAAIAAAAAAAhAAJSTkB/KAAA" + - "fygAAC8ACQAAAAAAAAAAAAAARl8CAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9u" + - "L2V4YW1wbGVzLm1kVVQFAAEAps4SUEsBAhQAFAAIAAAAAAAhAJZjvFkSMAAAEjAAAEwACQAAAAAA" + - "AAAAAAAAK4gCAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uL3JlZmVyZW5jZXMv" + - "Y29tcHV0ZS1wbGFuZS1pbnN0YWxsYXRpb24ubWRVVAUAAQCmzhJQSwECFAAUAAgAAAAAACEAtXpw" + - "O7UwAAC1MAAAOwAJAAAAAAAAAAAAAADAuAIAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxs" + - "YXRpb24vcmVmZXJlbmNlcy9kZWJ1Z2dpbmcubWRVVAUAAQCmzhJQSwECFAAUAAgAAAAAACEAsTUd" + - "2wIqAAACKgAARAAJAAAAAAAAAAAAAADn6QIAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxs" + - "YXRpb24vcmVmZXJlbmNlcy9oZWxtZmlsZS1zdHJ1Y3R1cmUubWRVVAUAAQCmzhJQSwECFAAUAAgA" + - "AAAAACEAOPknr7kHAAC5BwAAPwAJAAAAAAAAAAAAAABkFAMAZGF0YS9udmNmLXNlbGYtbWFuYWdl" + - "ZC1pbnN0YWxsYXRpb24vcmVmZXJlbmNlcy9udmNmLXVpLWFkZG9uLm1kVVQFAAEAps4SUEsBAhQA" + - "FAAIAAAAAAAhAEtCNagAFgAAABYAAD4ACQAAAAAAAAAAAAAAkxwDAGRhdGEvbnZjZi1zZWxmLW1h" + - "bmFnZWQtaW5zdGFsbGF0aW9uL3JlZmVyZW5jZXMvcHVsbC1zZWNyZXRzLm1kVVQFAAEAps4SUEsF" + - "BgAAAAAXABcArwkAAAgzAwAAAA==" + "dGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBhcHBseSAtZiAtCmRvbmUKYGBgCgpGb3Igbm9u" + + "LU5HQyByZWdpc3RyaWVzLCByZXBsYWNlIGAtLWRvY2tlci1zZXJ2ZXJgLCBgLS1kb2NrZXItdXNl" + + "cm5hbWVgLCBhbmQgYC0tZG9ja2VyLXBhc3N3b3JkYC4KCiMjIyAzLiBBcHBseSBLeXZlcm5vIENs" + + "dXN0ZXJQb2xpY3kKCmBgYHlhbWwKYXBpVmVyc2lvbjoga3l2ZXJuby5pby92MQpraW5kOiBDbHVz" + + "dGVyUG9saWN5Cm1ldGFkYXRhOgogIG5hbWU6IG52Y2YtYWRkLWltYWdlcHVsbHNlY3JldHMKc3Bl" + + "YzoKICBiYWNrZ3JvdW5kOiBmYWxzZQogIHJ1bGVzOgogICAgLSBuYW1lOiBhZGQtaW1hZ2VwdWxs" + + "c2VjcmV0LXRvLW52Y2YtcG9kcwogICAgICBtYXRjaDoKICAgICAgICBhbnk6CiAgICAgICAgLSBy" + + "ZXNvdXJjZXM6CiAgICAgICAgICAgIGtpbmRzOgogICAgICAgICAgICAtIFBvZAogICAgICAgICAg" + + "ICBuYW1lc3BhY2VzOgogICAgICAgICAgICAtICJudmNmIgogICAgICAgICAgICAtICJhcGkta2V5" + + "cyIKICAgICAgICAgICAgLSAic2lzIgogICAgICAgICAgICAtICJlc3MiCiAgICAgICAgICAgIC0g" + + "Im5hdHMtc3lzdGVtIgogICAgICAgICAgICAtICJjYXNzYW5kcmEtc3lzdGVtIgogICAgICAgICAg" + + "ICAtICJ2YXVsdC1zeXN0ZW0iCiAgICAgICAgICAgIC0gImNlcnQtbWFuYWdlciIKICAgICAgbXV0" + + "YXRlOgogICAgICAgIHBhdGNoU3RyYXRlZ2ljTWVyZ2U6CiAgICAgICAgICBtZXRhZGF0YToKICAg" + + "ICAgICAgICAgYW5ub3RhdGlvbnM6CiAgICAgICAgICAgICAgbnZjZi5udmlkaWEuY29tL2ltYWdl" + + "cHVsbHNlY3JldC1pbmplY3RlZC1ieToga3l2ZXJubwogICAgICAgICAgc3BlYzoKICAgICAgICAg" + + "ICAgaW1hZ2VQdWxsU2VjcmV0czoKICAgICAgICAgICAgLSBuYW1lOiBudmNyLWNyZWRzCmBgYAoK" + + "YGBgYmFzaAprdWJlY3RsIC0tY29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBhcHBseSBc" + + "CiAgLWYga3l2ZXJuby1pbWFnZXB1bGxzZWNyZXQtcG9saWN5LnlhbWwKYGBgCgojIyMgNC4gSW5z" + + "dGFsbCB0aGUgY29udHJvbCBwbGFuZQoKQ29udGludWUgd2l0aCB0aGUgc2VsZWN0ZWQgY29udHJv" + + "bC1wbGFuZSBpbnN0YWxsYXRpb24gaW4KW1NwbGl0IENvbXB1dGUtUGxhbmUgSW5zdGFsbGF0aW9u" + + "XShjb21wdXRlLXBsYW5lLWluc3RhbGxhdGlvbi5tZCkuIE5vCmNvbnRyb2wtcGxhbmUgaGVsbWZp" + + "bGUgbW9kaWZpY2F0aW9ucyBhcmUgbmVlZGVkLiBLeXZlcm5vIGluamVjdHMgdGhlIHB1bGwKc2Vj" + + "cmV0IGludG8gbmV3IGNvbnRyb2wtcGxhbmUgcG9kcy4KCiMjIENvbXB1dGUtUGxhbmUgU2VjcmV0" + + "CgpDcmVhdGUgdGhlIHNlY3JldCBvbmx5IGluIGBudmNhLW9wZXJhdG9yYCBvbiB0aGUgY29tcHV0" + + "ZSBjbHVzdGVyOgoKYGBgYmFzaAprdWJlY3RsIC0tY29udGV4dCA8Y29tcHV0ZS1wbGFuZS1jb250" + + "ZXh0PiBjcmVhdGUgbmFtZXNwYWNlIG52Y2Etb3BlcmF0b3IgXAogIC0tZHJ5LXJ1bj1jbGllbnQg" + + "LW8geWFtbCB8IFwKICBrdWJlY3RsIC0tY29udGV4dCA8Y29tcHV0ZS1wbGFuZS1jb250ZXh0PiBh" + + "cHBseSAtZiAtCgprdWJlY3RsIC0tY29udGV4dCA8Y29tcHV0ZS1wbGFuZS1jb250ZXh0PiBjcmVh" + + "dGUgc2VjcmV0IGRvY2tlci1yZWdpc3RyeSBudmNyLWNyZWRzIFwKICAtLWRvY2tlci1zZXJ2ZXI9" + + "bnZjci5pbyBcCiAgLS1kb2NrZXItdXNlcm5hbWU9JyRvYXV0aHRva2VuJyBcCiAgLS1kb2NrZXIt" + + "cGFzc3dvcmQ9IiROR0NfQVBJX0tFWSIgXAogIC0tbmFtZXNwYWNlPW52Y2Etb3BlcmF0b3IgXAog" + + "IC0tZHJ5LXJ1bj1jbGllbnQgLW8geWFtbCB8IFwKICBrdWJlY3RsIC0tY29udGV4dCA8Y29tcHV0" + + "ZS1wbGFuZS1jb250ZXh0PiBhcHBseSAtZiAtCmBgYAoKUmVmZXJlbmNlIGl0IGluIHRoZSBjb21w" + + "dXRlLXBsYW5lIGVudmlyb25tZW50IGZpbGU6CgpgYGB5YW1sCmdsb2JhbDoKICBpbWFnZVB1bGxT" + + "ZWNyZXRzOgogICAgLSBuYW1lOiBudmNyLWNyZWRzCmBgYAoKVGhlIGNoYXJ0IGFuZCBvcGVyYXRv" + + "ciB1c2UgdGhhdCByZWZlcmVuY2UgaW4gYG52Y2Etb3BlcmF0b3JgIGFuZCBtaXJyb3IgdGhlCnNl" + + "Y3JldCB0byBgbnZjYS1zeXN0ZW1gLiBEbyBub3QgY3JlYXRlIGEgYnJvYWRlciBtYW51YWwgY29t" + + "cHV0ZSBuYW1lc3BhY2UgbGlzdC4gRm9sbG93CltTcGxpdCBDb21wdXRlLVBsYW5lIEluc3RhbGxh" + + "dGlvbl0oY29tcHV0ZS1wbGFuZS1pbnN0YWxsYXRpb24ubWQpIGZvciB0aGUKc2VsZWN0ZWQgaW5z" + + "dGFsbCBmbG93LgoKIyMgVmVyaWZpY2F0aW9uCgpgYGBiYXNoCiMgQ2hlY2sgdGhhdCBhIGNvbnRy" + + "b2wtcGxhbmUgcG9kIGhhcyB0aGUgaW5qZWN0ZWQgc2VjcmV0Cmt1YmVjdGwgLS1jb250ZXh0IDxj" + + "b250cm9sLXBsYW5lLWNvbnRleHQ+IGdldCBwb2QgLW4gPG5hbWVzcGFjZT4gPHBvZC1uYW1lPiBc" + + "CiAgLW8ganNvbnBhdGg9J3suc3BlYy5pbWFnZVB1bGxTZWNyZXRzfScKIyBFeHBlY3RlZDogW3si" + + "bmFtZSI6Im52Y3ItY3JlZHMifV0KCiMgQ2hlY2sgdGhlIEt5dmVybm8gYW5ub3RhdGlvbgprdWJl" + + "Y3RsIC0tY29udGV4dCA8Y29udHJvbC1wbGFuZS1jb250ZXh0PiBnZXQgcG9kIC1uIDxuYW1lc3Bh" + + "Y2U+IDxwb2QtbmFtZT4gXAogIC1vIGpzb25wYXRoPSd7Lm1ldGFkYXRhLmFubm90YXRpb25zLm52" + + "Y2ZcLm52aWRpYVwuY29tL2ltYWdlcHVsbHNlY3JldC1pbmplY3RlZC1ieX0nCiMgRXhwZWN0ZWQ6" + + "IGt5dmVybm8KCiMgQ2hlY2sgcHVsbCBldmVudHMKa3ViZWN0bCAtLWNvbnRleHQgPGNvbnRyb2wt" + + "cGxhbmUtY29udGV4dD4gZ2V0IGV2ZW50cyAtbiA8bmFtZXNwYWNlPiBcCiAgLS1zb3J0LWJ5PScu" + + "bGFzdFRpbWVzdGFtcCcgfCBncmVwIC1pIHB1bGwKIyBTaG91bGQgc2hvdyAiU3VjY2Vzc2Z1bGx5" + + "IHB1bGxlZCIgbm90ICI0MDEgVW5hdXRob3JpemVkIgoKIyBDaGVjayB0aGUgY2hhcnQvb3BlcmF0" + + "b3IgbWlycm9yIG9uIHRoZSBjb21wdXRlIGNsdXN0ZXIKa3ViZWN0bCAtLWNvbnRleHQgPGNvbXB1" + + "dGUtcGxhbmUtY29udGV4dD4gZ2V0IHNlY3JldCBudmNyLWNyZWRzIFwKICAtbiBudmNhLXN5c3Rl" + + "bQpgYGAKCiMjIFdoZW4gUHVsbCBTZWNyZXRzIEFyZSBOb3QgTmVlZGVkCgotICoqQVdTIEVDUiB3" + + "aXRoIElBTSBub2RlIHJvbGVzKio6IElmIHlvdXIgbm9kZXMgaGF2ZSBgQW1hem9uRUMyQ29udGFp" + + "bmVyUmVnaXN0cnlSZWFkT25seWAgSUFNIHBvbGljeSwgS3ViZXJuZXRlcyBjYW4gcHVsbCBmcm9t" + + "IEVDUiB3aXRob3V0IGV4cGxpY2l0IHNlY3JldHMuCi0gKipQdWJsaWMgcmVnaXN0cmllcyoqOiBO" + + "byBwdWxsIHNlY3JldHMgbmVlZGVkLgotICoqQ1NQIGJ1aWx0LWluIGNyZWRlbnRpYWwgaGVscGVy" + + "cyoqOiBHS0UgQXJ0aWZhY3QgUmVnaXN0cnksIEF6dXJlIEFDUiB3aXRoIG1hbmFnZWQgaWRlbnRp" + + "dHksIGFuZCBzaW1pbGFyIHNlcnZpY2VzLgoKIyMgVHJvdWJsZXNob290aW5nCgojIyMgUG9kcyBz" + + "dGlsbCBpbiBJbWFnZVB1bGxCYWNrT2ZmIGFmdGVyIGFwcGx5aW5nIHBvbGljeQoKVGhlIEt5dmVy" + + "bm8gcG9saWN5IG9ubHkgYWZmZWN0cyBwb2RzIGNyZWF0ZWQgKiphZnRlcioqIHRoZSBwb2xpY3kg" + + "aXMgYXBwbGllZC4gRGVsZXRlIHN0dWNrIHBvZHMgdG8gdHJpZ2dlciByZWNyZWF0aW9uOgoKYGBg" + + "YmFzaAprdWJlY3RsIC0tY29udGV4dCA8dGFyZ2V0LWNvbnRleHQ+IGRlbGV0ZSBwb2RzIC1uIDxu" + + "YW1lc3BhY2U+IC0tYWxsCmBgYAoKIyMjIEt5dmVybm8gYWRtaXNzaW9uIGNvbnRyb2xsZXIgbm90" + + "IHJ1bm5pbmcKCmBgYGJhc2gKa3ViZWN0bCAtLWNvbnRleHQgPGNvbnRyb2wtcGxhbmUtY29udGV4" + + "dD4gZ2V0IHBvZHMgLW4ga3l2ZXJubwojIEFsbCBwb2RzIHNob3VsZCBiZSBSdW5uaW5nCmBgYAoK" + + "IyMjIFBvbGljeSBub3QgbWF0Y2hpbmcKCmBgYGJhc2gKa3ViZWN0bCAtLWNvbnRleHQgPGNvbnRy" + + "b2wtcGxhbmUtY29udGV4dD4gZ2V0IGNsdXN0ZXJwb2xpY3kgbnZjZi1hZGQtaW1hZ2VwdWxsc2Vj" + + "cmV0cwojIFNob3VsZCBzaG93IFJFQURZOiBUcnVlCmBgYAoKIyMjIFdyb25nIHNlY3JldCBuYW1l" + + "CgpUaGUgcG9saWN5IHJlZmVyZW5jZXMgYG52Y3ItY3JlZHNgLiBWZXJpZnkgdGhlIHNlY3JldCBl" + + "eGlzdHMgd2l0aCB0aGF0IGV4YWN0IG5hbWU6CgpgYGBiYXNoCmt1YmVjdGwgLS1jb250ZXh0IDx0" + + "YXJnZXQtY29udGV4dD4gZ2V0IHNlY3JldCBudmNyLWNyZWRzIC1uIDxuYW1lc3BhY2U+CmBgYApQ" + + "SwcIS0I1qAAWAAAAFgAAUEsBAhQAFAAIAAAAAAAhAAICbAFKEAAAShAAABIACQAAAAAAAAAAAAAA" + + "AAAAAGRhdGEvbWFuaWZlc3QuanNvblVUBQABAKbOElBLAQIUABQACAAAAAAAIQD/dvNnU2EAAFNh" + + "AAAjAAkAAAAAAAAAAAAAAJMQAABkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9TS0lMTC5tZFVU" + + "BQABAKbOElBLAQIUABQACAAAAAAAIQBn/RgP/AwAAPwMAAAzAAkAAAAAAAAAAAAAAEByAABkYXRh" + + "L252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9leGFtcGxlcy9jaS1waXBlbGluZXMubWRVVAUAAQCmzhJQ" + + "SwECFAAUAAgAAAAAACEAoRTjgV0MAABdDAAANAAJAAAAAAAAAAAAAACmfwAAZGF0YS9udmNmLXNl" + + "bGYtbWFuYWdlZC1jbGkvZXhhbXBsZXMvbXVsdGktY2x1c3Rlci5tZFVUBQABAKbOElBLAQIUABQA" + + "CAAAAAAAIQBCJ0kPBQ0AAAUNAAA3AAkAAAAAAAAAAAAAAG6MAABkYXRhL252Y2Ytc2VsZi1tYW5h" + + "Z2VkLWNsaS9wcm9tcHRzL2FkZC1jb21wdXRlLXBsYW5lLm1kVVQFAAEAps4SUEsBAhQAFAAIAAAA" + + "AAAhANTejTSfGQAAnxkAADkACQAAAAAAAAAAAAAA4ZkAAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQt" + + "Y2xpL3Byb21wdHMvY3JlYXRlLWFuZC1ydW4tdGFzay5tZFVUBQABAKbOElBLAQIUABQACAAAAAAA" + + "IQDSQ9wEGCUAABglAAA3AAkAAAAAAAAAAAAAAPCzAABkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNs" + + "aS9wcm9tcHRzL2RlcGxveS1hbmQtaW52b2tlLm1kVVQFAAEAps4SUEsBAhQAFAAIAAAAAAAhAHKS" + + "LCa+DgAAvg4AAD0ACQAAAAAAAAAAAAAAdtkAAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtY2xpL3By" + + "b21wdHMvZGlhZ25vc2UtZmFpbGVkLWluc3RhbGwubWRVVAUAAQCmzhJQSwECFAAUAAgAAAAAACEA" + + "QnHmHgEoAAABKAAAOgAJAAAAAAAAAAAAAACo6AAAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1jbGkv" + + "cHJvbXB0cy9pbnN0YWxsLWZyb20tc2NyYXRjaC5tZFVUBQABAKbOElBLAQIUABQACAAAAAAAIQCq" + + "4Tq5yAcAAMgHAAA5AAkAAAAAAAAAAAAAABoRAQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9w" + + "cm9tcHRzL3JvdGF0ZS1jbHVzdGVyLWp3a3MubWRVVAUAAQCmzhJQSwECFAAUAAgAAAAAACEA2odj" + + "VuQhAADkIQAALgAJAAAAAAAAAAAAAABSGQEAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1jbGkvcHJv" + + "bXB0cy90ZWFyZG93bi5tZFVUBQABAKbOElBLAQIUABQACAAAAAAAIQByDQ9kISMAACEjAAAwAAkA" + + "AAAAAAAAAAAAAJs7AQBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWNsaS9yZWZlcmVuY2UvY29tbWFu" + + "ZHMubWRVVAUAAQCmzhJQSwECFAAUAAgAAAAAACEAc6daZNUGAADVBgAAMgAJAAAAAAAAAAAAAAAj" + + "XwEAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1jbGkvcmVmZXJlbmNlL2V4aXQtY29kZXMubWRVVAUA" + + "AQCmzhJQSwECFAAUAAgAAAAAACEAmdDiUBcuAAAXLgAALQAJAAAAAAAAAAAAAABhZgEAZGF0YS9u" + + "dmNmLXNlbGYtbWFuYWdlZC1jbGkvcmVmZXJlbmNlL2ZsYWdzLm1kVVQFAAEAps4SUEsBAhQAFAAI" + + "AAAAAAAhAPOuE4R0EQAAdBEAADcACQAAAAAAAAAAAAAA3JQBAGRhdGEvbnZjZi1zZWxmLW1hbmFn" + + "ZWQtY2xpL3JlZmVyZW5jZS90cm91Ymxlc2hvb3RpbmcubWRVVAUAAQCmzhJQSwECFAAUAAgAAAAA" + + "ACEAEcMUk0liAABJYgAALAAJAAAAAAAAAAAAAAC+pgEAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1p" + + "bnN0YWxsYXRpb24vU0tJTEwubWRVVAUAAQCmzhJQSwECFAAUAAgAAAAAACEAR1VqVkpWAABKVgAA" + + "NAAJAAAAAAAAAAAAAABqCQIAZGF0YS9udmNmLXNlbGYtbWFuYWdlZC1pbnN0YWxsYXRpb24vZXZh" + + "bHMvZXZhbHMuanNvblVUBQABAKbOElBLAQIUABQACAAAAAAAIQACUk5AfygAAH8oAAAvAAkAAAAA" + + "AAAAAAAAAB9gAgBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbi9leGFtcGxlcy5t" + + "ZFVUBQABAKbOElBLAQIUABQACAAAAAAAIQCWY7xZEjAAABIwAABMAAkAAAAAAAAAAAAAAASJAgBk" + + "YXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWluc3RhbGxhdGlvbi9yZWZlcmVuY2VzL2NvbXB1dGUtcGxh" + + "bmUtaW5zdGFsbGF0aW9uLm1kVVQFAAEAps4SUEsBAhQAFAAIAAAAAAAhALV6cDu1MAAAtTAAADsA" + + "CQAAAAAAAAAAAAAAmbkCAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uL3JlZmVy" + + "ZW5jZXMvZGVidWdnaW5nLm1kVVQFAAEAps4SUEsBAhQAFAAIAAAAAAAhALE1HdsCKgAAAioAAEQA" + + "CQAAAAAAAAAAAAAAwOoCAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0aW9uL3JlZmVy" + + "ZW5jZXMvaGVsbWZpbGUtc3RydWN0dXJlLm1kVVQFAAEAps4SUEsBAhQAFAAIAAAAAAAhADj5J6+5" + + "BwAAuQcAAD8ACQAAAAAAAAAAAAAAPRUDAGRhdGEvbnZjZi1zZWxmLW1hbmFnZWQtaW5zdGFsbGF0" + + "aW9uL3JlZmVyZW5jZXMvbnZjZi11aS1hZGRvbi5tZFVUBQABAKbOElBLAQIUABQACAAAAAAAIQBL" + + "QjWoABYAAAAWAAA+AAkAAAAAAAAAAAAAAGwdAwBkYXRhL252Y2Ytc2VsZi1tYW5hZ2VkLWluc3Rh" + + "bGxhdGlvbi9yZWZlcmVuY2VzL3B1bGwtc2VjcmV0cy5tZFVUBQABAKbOElBLBQYAAAAAFwAXAK8J" + + "AADhMwMAAAA=" var ( skillDataOnce sync.Once diff --git a/src/clis/nvcf-cli/internal/selfhosted/preflight.go b/src/clis/nvcf-cli/internal/selfhosted/preflight.go index 9da51e617c..5da8db5fd6 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/preflight.go +++ b/src/clis/nvcf-cli/internal/selfhosted/preflight.go @@ -695,7 +695,12 @@ func staleNamespaceCheck(prober StaleNamespaceProber, kubeContext string, namesp HumanLabel: "checking for stale NVCF namespaces…", Run: func(ctx context.Context) CheckResult { r := CheckResult{ID: id, Severity: "error"} - stale, err := prober(ctx, kubeContext, namespaces) + // Resolve the context before probing, then probe that exact name. + // Resolving afterwards leaves a window where the current-context + // changes in between, which would have the hints delete namespaces + // in a cluster other than the one that was read. + probedContext := effectiveKubeContext(kubeContext) + stale, err := prober(ctx, probedContext, namespaces) if err != nil { r.Severity = "warning" r.Message = "stale namespace probe failed: " + err.Error() @@ -718,13 +723,13 @@ func staleNamespaceCheck(prober StaleNamespaceProber, kubeContext string, namesp emptyShell = append(emptyShell, ns.Name) } } - // Every hint is pinned to the context that was actually probed. + // Every hint names the context that was actually probed, above. // In split mode the two callers pass different contexts, and with - // no context flag the probe followed the current-context at the - // time it ran. Either way the name is resolved and written into - // the command, because these hints delete namespaces and the - // current-context can change between reading this and pasting it. - kctl := "kubectl" + kubectlContextArg(effectiveKubeContext(kubeContext)) + // no context flag the probe followed the current-context. Either + // way the name goes into the command, because these hints delete + // namespaces and the current-context can change between reading + // the output and pasting it. + kctl := "kubectl" + kubectlContextArg(probedContext) var hints []string if len(terminating) > 0 { // spec.finalizers is writable only through the /finalize diff --git a/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go index e0271db531..5a852b3867 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go @@ -364,3 +364,18 @@ func TestStaleNamespaceCheck_HintsOmitUnknownContext(t *testing.T) { r := staleNamespaceCheck(prober, "", []string{"nvcf"}).Run(context.Background()) assert.Contains(t, r.Message, "kubectl delete namespace nvcf") } + +// The probe must run against the same context the hints name. Resolving the +// current-context after probing leaves a window where it changes in between, +// which would have the delete hints target a cluster that was never read. +func TestStaleNamespaceCheck_ProbesTheResolvedContext(t *testing.T) { + pinCurrentKubeContext(t, "k3d-local") + var probed string + prober := func(_ context.Context, kctx string, _ []string) ([]StaleNamespace, error) { + probed = kctx + return nil, nil + } + staleNamespaceCheck(prober, "", []string{"nvcf"}).Run(context.Background()) + assert.Equal(t, "k3d-local", probed, + "the probe must target the resolved context, not whatever is current when it runs") +} From 13ddd00e144ff72c4e21f909ba1f2ed00014d4f1 Mon Sep 17 00:00:00 2001 From: rohithb Date: Tue, 22 Sep 2026 15:41:04 +0530 Subject: [PATCH 31/36] fix(nvcf-cli): stop leaking the NGC key to mirrored registries and restore --pre coverage in split mode --- src/clis/nvcf-cli/cmd/self_hosted_check.go | 69 ++++++++++++--- .../nvcf-cli/cmd/self_hosted_check_test.go | 58 ++++++++++--- src/clis/nvcf-cli/go.mod | 4 +- .../internal/selfhosted/clustervalidator.go | 54 +++++++++--- .../selfhosted/clustervalidator_test.go | 83 ++++++++++++++++++- .../selfhosted/orchestrator_errors_test.go | 4 +- .../nvcf-cli/internal/selfhosted/preflight.go | 60 ++++++++++++-- .../internal/selfhosted/preflight_test.go | 32 +++++++ .../internal/selfhosted/pullsecret.go | 18 +++- .../internal/selfhosted/pullsecret_test.go | 47 +++++++++-- .../internal/selfhosted/registry_cred.go | 25 ++++-- .../internal/selfhosted/registry_cred_test.go | 50 ++++++++++- .../selfhosted/stale_namespace_test.go | 4 +- .../internal/selfhosted/validatortag.go | 6 +- .../internal/selfhosted/validatortag_test.go | 2 +- 15 files changed, 446 insertions(+), 70 deletions(-) diff --git a/src/clis/nvcf-cli/cmd/self_hosted_check.go b/src/clis/nvcf-cli/cmd/self_hosted_check.go index c87220f74e..f279e3bb91 100644 --- a/src/clis/nvcf-cli/cmd/self_hosted_check.go +++ b/src/clis/nvcf-cli/cmd/self_hosted_check.go @@ -143,8 +143,12 @@ func runSelfHostedCheck(c *cobra.Command, _ []string) error { // one-shot stderr note up-front explaining why no validator row // appears in the output. Empty == not configured anywhere. // One image covers both roles (VALIDATOR_ROLE selects the check set). + // *IsVisited, matching the dispatch below. --pre in ModeSplit visits both + // clusters but targets neither role, so gating image resolution on + // *IsTargeted left the validator unresolved and both probes nil, with no + // note explaining why. anyValidatorIsTargeted := !localOnly && !skipClusterValidation && - (computePlaneIsTargeted(mode) || controlPlaneIsTargeted(mode)) + (computePlaneIsVisited(mode) || controlPlaneIsVisited(mode)) clusterValidatorImage := "" if anyValidatorIsTargeted { if img, ok := resolveClusterValidatorImage(c.Context()); ok { @@ -185,7 +189,7 @@ func runSelfHostedCheck(c *cobra.Command, _ []string) error { // validator row" with "validator silently dropped". Print at most one // reason; --skip-cluster-validation takes precedence over missing // config since it's the explicit operator choice. - if !localOnly && (computePlaneIsTargeted(mode) || controlPlaneIsTargeted(mode)) { + if !localOnly && (computePlaneIsVisited(mode) || controlPlaneIsVisited(mode)) { switch { case skipClusterValidation: fmt.Fprintln(c.ErrOrStderr(), "note: cluster-validator skipped (--skip-cluster-validation)") @@ -320,9 +324,15 @@ func resolveStackValuesFile() string { } } - env := os.Getenv("HELMFILE_ENV") + // selfHostedEnv (--env, default "local"), not HELMFILE_ENV: that variable + // is only ever injected into the helmfile subprocess, so reading it here + // always returned "" and fell through to base.yaml. An operator whose + // local.yaml points global.image.registry at their mirror would get + // base.yaml's nvcr.io, and the preflight would credential-check a registry + // the install never pulls from. + env := strings.TrimSpace(selfHostedEnv) if env == "" { - env = "default" + env = "local" } names := []string{env + ".yaml", "base.yaml"} @@ -494,7 +504,9 @@ func runPreflightByRole(ctx context.Context, cfg selfhosted.PreflightConfig, sin skipInotify := checkSkipInotifyCheck || os.Getenv("NVCF_CLI_SELFHOSTED_SKIP_INOTIFY") != "" var inotifyProber selfhosted.NodeInotifyProber - if computePlaneIsTargeted(mode) && !skipInotify { + // Visited, not targeted: the inotify limit is exactly what --pre exists to + // catch before NVCA bootstrap, so it must run for --pre in ModeSplit too. + if computePlaneIsVisited(mode) && !skipInotify { inotifyProber = newInotifyProberForSelfHosted() } @@ -509,7 +521,7 @@ func runPreflightByRole(ctx context.Context, cfg selfhosted.PreflightConfig, sin // still creates a ServiceAccount, cluster-wide ClusterRole/CRB, pull secret // and validator Job in the compute cluster. var clusterValidator selfhosted.ClusterValidator - if computePlaneIsTargeted(mode) && clusterValidatorImage != "" { + if computePlaneIsVisited(mode) && clusterValidatorImage != "" { clusterValidator = newClusterValidatorForSelfHosted() } @@ -526,7 +538,7 @@ func runPreflightByRole(ctx context.Context, cfg selfhosted.PreflightConfig, sin // clusterValidator is nil and keying off it would drop the control-plane // validator check from the run entirely. var cpClusterValidator selfhosted.ClusterValidator - if controlPlaneIsTargeted(mode) && clusterValidatorImage != "" { + if controlPlaneIsVisited(mode) && clusterValidatorImage != "" { cpClusterValidator = newClusterValidatorForSelfHosted() } @@ -588,19 +600,30 @@ func runPreflightByRole(ctx context.Context, cfg selfhosted.PreflightConfig, sin _ = eg.Wait() return append(cpResults, gpuResults...) - default: // ModeSingle — one cluster; run only the roles the flags target. + default: // ModeSingle - one cluster; run only the roles the flags target. var results []selfhosted.CheckResult // The stale-namespace probe goes to exactly one role. Both roles share // the cluster here, so handing it to both emits two check_completed // events with the same ID and loads the kubeconfig twice, which means a // second exec-credential-plugin prompt. + // + // The two roles probe disjoint namespace lists, so the skipped role's + // namespaces are merged into the surviving probe rather than dropped. + // Without that, a kai-scheduler or nvca-operator namespace wedged + // Terminating by a failed teardown reports "no stale NVCF namespaces + // detected" and the next install fails into it. staleForControlPlane := staleNSProber staleForComputePlane := staleNSProber + var cpExtraNamespaces, gpuExtraNamespaces []string if runControlPlane { staleForComputePlane = nil + cpExtraNamespaces = selfhosted.ComputePlaneStaleNamespaces( + localStackDir(selfHostedComputePlaneStack)) } else { staleForControlPlane = nil + gpuExtraNamespaces = selfhosted.ControlPlaneStaleNamespaces( + localStackDir(selfHostedControlPlaneStack)) } if runControlPlane { @@ -613,6 +636,7 @@ func runPreflightByRole(ctx context.Context, cfg selfhosted.PreflightConfig, sin ClusterValidatorRegistries: registries, StaleNamespaceProber: staleForControlPlane, StackDir: localStackDir(selfHostedControlPlaneStack), + ExtraStaleNamespaces: cpExtraNamespaces, } results = append(results, selfhosted.RunPreflightForRole(ctx, cpCfg, selfhosted.RoleControlPlane, cpRC, sink)...) @@ -627,6 +651,7 @@ func runPreflightByRole(ctx context.Context, cfg selfhosted.PreflightConfig, sin ClusterValidatorNoCleanup: checkClusterValidatorNoCleanup, StaleNamespaceProber: staleForComputePlane, StackDir: localStackDir(selfHostedComputePlaneStack), + ExtraStaleNamespaces: gpuExtraNamespaces, } results = append(results, selfhosted.RunPreflightForRole(ctx, gpuCfg, selfhosted.RoleComputePlane, gpuRC, sink)...) @@ -652,17 +677,29 @@ func resolveClusterValidatorImage(ctx context.Context) (string, bool) { // emitCheckFinal emits a Final event with check-mode verdict fields derived // from the result slice. Called once per run (or once per wait-loop exit). func emitCheckFinal(ctx context.Context, sink progress.EventSink, results []selfhosted.CheckResult) { - var passed, failed int + // Success and FailedCount must agree with the process exit code, which is + // driven by anyFailed. Counting every non-pass as a failure made a + // warning-severity result emit success:false / verdict:failed while the + // process exited 0, so a CI gate on final.success broke for anyone whose + // registry credentials live in a Docker credential helper. "warnings" is + // already part of the documented Verdict vocabulary; it was never emitted. + var passed, failed, warned int for _, r := range results { - if r.Passed { + switch { + case r.Passed: passed++ - } else { + case isBlockingFailure(r): failed++ + default: + warned++ } } verdict := "ok" - if failed > 0 { + switch { + case failed > 0: verdict = "failed" + case warned > 0: + verdict = "warnings" } _ = sink.Emit(ctx, progress.Final{ Success: failed == 0, @@ -675,9 +712,15 @@ func emitCheckFinal(ctx context.Context, sink progress.EventSink, results []self // anyFailed returns true if any check failed at error severity. Warnings do // not trigger non-zero exit per spec §6.3. +// isBlockingFailure is the single definition of "this fails the run". Both the +// exit code and the JSON verdict derive from it, so they cannot disagree. +func isBlockingFailure(r selfhosted.CheckResult) bool { + return !r.Passed && r.Severity == selfhosted.SeverityError +} + func anyFailed(results []selfhosted.CheckResult) bool { for _, r := range results { - if !r.Passed && r.Severity == "error" { + if isBlockingFailure(r) { return true } } diff --git a/src/clis/nvcf-cli/cmd/self_hosted_check_test.go b/src/clis/nvcf-cli/cmd/self_hosted_check_test.go index cca9e83dd9..f2f661d1f6 100644 --- a/src/clis/nvcf-cli/cmd/self_hosted_check_test.go +++ b/src/clis/nvcf-cli/cmd/self_hosted_check_test.go @@ -30,6 +30,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "nvcf-cli/internal/selfhosted" "nvcf-cli/internal/selfhosted/kubectx" "nvcf-cli/internal/selfhosted/progress" ) @@ -368,8 +369,8 @@ func TestComputePlaneIsTargeted(t *testing.T) { {"--compute-plane split", false, true, false, kubectx.ModeSplit, true}, {"--all single", false, false, true, kubectx.ModeSingle, true}, {"--all split", false, false, true, kubectx.ModeSplit, true}, - {"--pre single — implicit compute plane", true, false, false, kubectx.ModeSingle, true}, - {"--pre split — must not target compute plane", true, false, false, kubectx.ModeSplit, false}, + {"--pre single - implicit compute plane", true, false, false, kubectx.ModeSingle, true}, + {"--pre split - must not target compute plane", true, false, false, kubectx.ModeSplit, false}, {"--control-plane only", false, false, false, kubectx.ModeSingle, false}, {"no relevant flag", false, false, false, kubectx.ModeSingle, false}, } @@ -513,11 +514,11 @@ func TestCheck_ValidatorSkipNoteAppearsOnComputePlane(t *testing.T) { "expected skip note when compute plane is targeted and --skip-cluster-validation is set") } -// TestCheck_ValidatorSkipNoteAbsentForPreInSplitMode verifies that the -// "cluster-validator skipped" note does NOT appear when --pre is used in -// split mode, because the compute plane is not explicitly targeted and -// ModeSplit + --pre does not implicitly make either context the compute plane. -func TestCheck_ValidatorSkipNoteAbsentForPreInSplitMode(t *testing.T) { +// --pre in ModeSplit visits both clusters, so when the validator is skipped the +// operator must be told why. This previously asserted silence, which is the +// "no validator row vs validator silently dropped" confusion the note exists +// to prevent. +func TestCheck_ValidatorSkipNotePresentForPreInSplitMode(t *testing.T) { t.Cleanup(func() { selfHostedJSON = false selfHostedOutput = "text" @@ -539,13 +540,10 @@ func TestCheck_ValidatorSkipNoteAbsentForPreInSplitMode(t *testing.T) { }) _ = rootCmd.Execute() - assert.NotContains(t, stderr.String(), "cluster-validator skipped", - "skip note must not appear for --pre in split mode (compute plane not targeted)") + assert.Contains(t, stderr.String(), "cluster-validator skipped", + "--pre in split mode visits both clusters, so an explicit skip must be explained") } -// parseJSONLLines splits s into non-empty lines, skips any non-JSON lines -// (e.g. cobra error messages written to stderr), and unmarshals each JSON line -// as an object. Returns them in order. func parseJSONLLines(t *testing.T, s string) []map[string]any { t.Helper() var out []map[string]any @@ -676,3 +674,39 @@ func TestCheck_HostLocalChecksRunOnce(t *testing.T) { assert.Equal(t, 1, n, "check %s emitted %d times", id, n) } } + +// The JSON verdict and the exit code must derive from the same predicate. A +// warning-severity result previously emitted success:false / verdict:failed +// while the process exited 0, so a CI gate on final.success broke for every +// user whose registry credentials live in a Docker credential helper. +func TestEmitCheckFinal_WarningIsNotAFailure(t *testing.T) { + results := []selfhosted.CheckResult{ + {ID: "a", Passed: true, Severity: selfhosted.SeverityInfo}, + {ID: "b", Passed: false, Severity: selfhosted.SeverityWarning}, + } + assert.False(t, anyFailed(results), "a warning must not set the exit code") + + var buf bytes.Buffer + sink := progress.NewJSONLRenderer(&buf) + emitCheckFinal(context.Background(), sink, results) + + line := buf.String() + assert.Contains(t, line, `"verdict":"warnings"`) + assert.Contains(t, line, `"success":true`, + "success must agree with the exit code") + assert.Contains(t, line, `"failedCount":0`) +} + +func TestEmitCheckFinal_ErrorIsAFailure(t *testing.T) { + results := []selfhosted.CheckResult{ + {ID: "a", Passed: true, Severity: selfhosted.SeverityInfo}, + {ID: "b", Passed: false, Severity: selfhosted.SeverityError}, + } + assert.True(t, anyFailed(results)) + + var buf bytes.Buffer + sink := progress.NewJSONLRenderer(&buf) + emitCheckFinal(context.Background(), sink, results) + assert.Contains(t, buf.String(), `"verdict":"failed"`) + assert.Contains(t, buf.String(), `"success":false`) +} diff --git a/src/clis/nvcf-cli/go.mod b/src/clis/nvcf-cli/go.mod index 9a4c8d3d83..19cc5ea3ba 100644 --- a/src/clis/nvcf-cli/go.mod +++ b/src/clis/nvcf-cli/go.mod @@ -11,6 +11,7 @@ require ( github.com/charmbracelet/lipgloss v1.0.0 github.com/muesli/termenv v0.15.2 github.com/spf13/cobra v1.9.1 + github.com/spf13/pflag v1.0.6 github.com/spf13/viper v1.18.2 github.com/stretchr/testify v1.10.0 golang.org/x/oauth2 v0.27.0 @@ -23,6 +24,7 @@ require ( k8s.io/apiextensions-apiserver v0.34.1 k8s.io/apimachinery v0.34.1 k8s.io/client-go v0.34.1 + sigs.k8s.io/yaml v1.6.0 ) require ( @@ -68,7 +70,6 @@ require ( github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.11.0 // indirect github.com/spf13/cast v1.6.0 // indirect - github.com/spf13/pflag v1.0.6 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/x448/float16 v0.8.4 // indirect go.uber.org/multierr v1.11.0 // indirect @@ -89,5 +90,4 @@ require ( sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect sigs.k8s.io/randfill v1.0.0 // indirect sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect - sigs.k8s.io/yaml v1.6.0 // indirect ) diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go index f90b53a5cf..c31b66ec8c 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go @@ -146,8 +146,12 @@ func runClusterValidator(ctx context.Context, client kubernetes.Interface, image // under a pod that is still retrying its pull, which the kubelet then // reports as FailedToRetrieveImagePullSecret. Operator-supplied secrets via // the flag aren't labeled by us and are skipped. + // --no-cleanup is honoured here as it is for the RBAC below: an operator + // who keeps the Job for debugging and then re-runs the preserved pod would + // otherwise hit FailedToRetrieveImagePullSecret, the exact symptom the + // per-role secret scoping exists to prevent. defer func() { - if !podMayBeRunning { + if !noCleanup && !podMayBeRunning { sweepManagedPullSecrets(context.Background(), client, role) } }() @@ -159,25 +163,38 @@ func runClusterValidator(ctx context.Context, client kubernetes.Interface, image if err != nil { return ClusterValidatorResult{Err: err} } - if err := ensureClusterValidatorRBAC(vctx, client, role, runID); err != nil { - return ClusterValidatorResult{Err: fmt.Errorf("bootstrapping validator RBAC: %w", err)} - } - // Remove the ClusterRole and ClusterRoleBinding to minimize the window in - // which the elevated SA exists. When --no-cleanup is set the operator - // expects to inspect the Job, so the RBAC stays either way. + // Register the cleanup before the bootstrap, not after. ensureClusterValidatorRBAC + // creates three objects in sequence and returns on the first failure, so a + // kubeconfig that can create a ServiceAccount but not a cluster-scoped + // ClusterRole would otherwise abandon the ServiceAccount on every attempt. + // The names are per-run now, so nothing self-heals by reuse: under --wait + // that leaks one object per poll. The sweep is name-scoped and + // label-guarded, so running it when nothing was created is a no-op. defer func() { if !noCleanup && !podMayBeRunning { sweepClusterValidatorRBAC(context.Background(), client, role, runID) } }() + if err := ensureClusterValidatorRBAC(vctx, client, role, runID); err != nil { + return ClusterValidatorResult{Err: fmt.Errorf("bootstrapping validator RBAC: %w", err)} + } // For the control-plane role, create a ConfigMap with reachability // endpoints and enforcement config so the validator runs its configurable // checks. Best-effort: a failure here is logged but does not abort the - // run — the validator gracefully skips configurable checks when the + // run - the validator gracefully skips configurable checks when the // ConfigMap is absent. var configNote string if role == clusterValidatorControlPlaneRole { + // The ConfigMap is the one object this run creates that had no cleanup + // path, so it was left in the cluster forever. Same gating as the + // other sweeps: keep it when the pod may still read it, or when the + // operator asked to keep the run's artifacts. + defer func() { + if !noCleanup && !podMayBeRunning { + sweepClusterValidatorConfig(context.Background(), client) + } + }() if err := ensureClusterValidatorConfig(vctx, client, registries); err != nil { // Non-fatal: continue without the ConfigMap; the validator skips // configurable reachability and enforcement checks silently unless @@ -187,7 +204,12 @@ func runClusterValidator(ctx context.Context, client kubernetes.Interface, image } sweepOrphanClusterValidatorRBAC(vctx, client, orphanValidatorRBACTTL) - sweepPriorClusterValidatorJobs(vctx, client, role) + // Skipped under --no-cleanup: this runs before the new Job is created, so + // otherwise the next same-role run destroys the Job the operator asked to + // keep. The singleton guarantee is worth less than the artifact they kept. + if !noCleanup { + sweepPriorClusterValidatorJobs(vctx, client, role) + } jobName := fmt.Sprintf("%s-%d", clusterValidatorName, time.Now().UnixNano()) if _, err := client.BatchV1().Jobs(clusterValidatorNamespace).Create( @@ -617,7 +639,7 @@ func parseRegistryHostPort(s string) (host string, port int) { } h, p, err := net.SplitHostPort(s) if err != nil { - // No port present (e.g. "nvcr.io") — return the input as-is. + // No port present (e.g. "nvcr.io") - return the input as-is. return s, 443 } if p == "" { @@ -826,3 +848,15 @@ func kubectlLogsHint(kubeContext, jobName string) string { return fmt.Sprintf("kubectl%s logs -n %s job/%s --tail=-1", kubectlContextArg(kubeContext), clusterValidatorNamespace, jobName) } + +// sweepClusterValidatorConfig removes the network-checks ConfigMap this run +// created. Only ours: the name is a constant an operator could also be using, +// so the managed labels decide. Errors are swallowed, as with the other sweeps. +func sweepClusterValidatorConfig(ctx context.Context, client kubernetes.Interface) { + cms := client.CoreV1().ConfigMaps(clusterValidatorNamespace) + cm, err := cms.Get(ctx, clusterValidatorConfigName, metav1.GetOptions{}) + if err != nil || !hasValidatorManagedLabels(cm.Labels) { + return + } + _ = cms.Delete(ctx, clusterValidatorConfigName, deleteExactly(cm)) +} diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go index 3bcc2b9d0d..b04fb3a11f 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go @@ -122,6 +122,26 @@ func TestClusterValidatorCheck_OrchestratorErrorStaysWarning(t *testing.T) { assert.Contains(t, r.Message, "cluster-validator did not complete") } +// driveJobToSuccess wires the reactors that make a created Job reach a +// Succeeded terminal state, mirroring TestRunClusterValidator_HappyPath. +func driveJobToSuccess(client *fake.Clientset) { + var jobName atomic.Value + jobName.Store("") + client.PrependReactor("create", "jobs", func(action ktesting.Action) (bool, runtime.Object, error) { + job := action.(ktesting.CreateAction).GetObject().(*batchv1.Job) + jobName.Store(job.Name) + return false, nil, nil + }) + client.PrependReactor("get", "jobs", func(action ktesting.Action) (bool, runtime.Object, error) { + name := jobName.Load().(string) + if name == "" { + return false, nil, nil + } + return jobSucceededReactor(name)(action) + }) + client.PrependReactor("list", "pods", podListReactor("")) +} + func TestRunClusterValidator_HappyPath(t *testing.T) { client := fake.NewSimpleClientset() // Capture the Job name the runner picks, then drive Get/List reactors to @@ -624,7 +644,7 @@ func TestBuildControlPlaneValidatorConfig_WithExtras(t *testing.T) { } func TestBuildControlPlaneValidatorConfig_InvalidRegistrySkipped(t *testing.T) { - // A blank entry is parsed as host="" → skipped; only the valid entry appears. + // A blank entry is parsed as host="" -> skipped; only the valid entry appears. got := buildControlPlaneValidatorConfig([]string{" ", "valid.registry.internal:5000"}) assert.Contains(t, got, "valid.registry.internal", "valid registry must appear") // The blank entry must not add an empty host: line. @@ -639,9 +659,9 @@ func TestParseRegistryHostPort(t *testing.T) { }{ {"nvcr.io:443", "nvcr.io", 443}, {"harbor.company.internal:5000", "harbor.company.internal", 5000}, - {"registry.example.com", "registry.example.com", 443}, // no port → 443 - {"", "", 0}, // empty → skip - {" ", "", 0}, // blank → skip + {"registry.example.com", "registry.example.com", 443}, // no port -> 443 + {"", "", 0}, // empty -> skip + {" ", "", 0}, // blank -> skip // IPv6: net.SplitHostPort handles bracketed literals correctly. {"[::1]:5000", "::1", 5000}, {"[2001:db8::1]:443", "2001:db8::1", 443}, @@ -830,3 +850,58 @@ func TestSweepPriorClusterValidatorJobs_RequiresGeneratedName(t *testing.T) { _, err = jobs.Get(ctx, clusterValidatorName+"-9999999999", metav1.GetOptions{}) assert.NoError(t, err, "the other role's Job must survive") } + +// The network-checks ConfigMap was the one object a run created with no +// cleanup path, so it accumulated in the cluster forever. +func TestSweepClusterValidatorConfig_DeletesOwnAndSparesOperators(t *testing.T) { + managed := &corev1.ConfigMap{ObjectMeta: metav1.ObjectMeta{ + Name: clusterValidatorConfigName, Namespace: clusterValidatorNamespace, + Labels: clusterValidatorLabels(), + }} + client := fake.NewSimpleClientset(managed) + sweepClusterValidatorConfig(context.Background(), client) + _, err := client.CoreV1().ConfigMaps(clusterValidatorNamespace).Get( + context.Background(), clusterValidatorConfigName, metav1.GetOptions{}) + assert.True(t, apierrors.IsNotFound(err), "our own ConfigMap must be reclaimed") + + // Same name, operator-owned: the name is a constant they could also use. + operator := &corev1.ConfigMap{ObjectMeta: metav1.ObjectMeta{ + Name: clusterValidatorConfigName, Namespace: clusterValidatorNamespace, + Labels: map[string]string{"owner": "operator"}, + }} + client2 := fake.NewSimpleClientset(operator) + sweepClusterValidatorConfig(context.Background(), client2) + _, err = client2.CoreV1().ConfigMaps(clusterValidatorNamespace).Get( + context.Background(), clusterValidatorConfigName, metav1.GetOptions{}) + assert.NoError(t, err, "an unmanaged ConfigMap with the same name must survive") +} + +// --no-cleanup must preserve the whole run, not just the Job: an operator who +// keeps the Job and re-runs the pod needs its pull secret to still exist. +func TestRunClusterValidator_NoCleanupKeepsPullSecretAndPriorJob(t *testing.T) { + prior := &batchv1.Job{ObjectMeta: metav1.ObjectMeta{ + Name: clusterValidatorName + "-earlier", Namespace: clusterValidatorNamespace, + Labels: clusterValidatorRoleLabels(clusterValidatorControlPlaneRole), + }} + secret := &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: validatorPullSecretRoleName(clusterValidatorControlPlaneRole), + Namespace: clusterValidatorNamespace, + Labels: clusterValidatorRoleLabels(clusterValidatorControlPlaneRole), + }, + Type: corev1.SecretTypeDockerConfigJson, + } + client := fake.NewSimpleClientset(prior, secret) + driveJobToSuccess(client) + + runClusterValidator(context.Background(), client, "nvcr.io/x/validator:1", + "", true /* noCleanup */, clusterValidatorControlPlaneRole, nil) + + _, err := client.BatchV1().Jobs(clusterValidatorNamespace).Get( + context.Background(), prior.Name, metav1.GetOptions{}) + assert.NoError(t, err, "--no-cleanup must not destroy a deliberately preserved Job") + + _, err = client.CoreV1().Secrets(clusterValidatorNamespace).Get( + context.Background(), secret.Name, metav1.GetOptions{}) + assert.NoError(t, err, "--no-cleanup must keep the pull secret the preserved pod needs") +} diff --git a/src/clis/nvcf-cli/internal/selfhosted/orchestrator_errors_test.go b/src/clis/nvcf-cli/internal/selfhosted/orchestrator_errors_test.go index 5a1df7f0b7..1bd771a614 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/orchestrator_errors_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/orchestrator_errors_test.go @@ -423,8 +423,8 @@ func TestRetryAfterFromError_Parsing(t *testing.T) { {"Retry-After: 120s", 120}, {"retry-after: 5", 5}, {"no header here", 5}, // default - {"Retry-After: ", 5}, // no digits → default - {"Retry-After: 0", 5}, // zero → default + {"Retry-After: ", 5}, // no digits -> default + {"Retry-After: 0", 5}, // zero -> default {"Retry-After: 300 ok", 300}, // stops at first non-digit } for _, tc := range cases { diff --git a/src/clis/nvcf-cli/internal/selfhosted/preflight.go b/src/clis/nvcf-cli/internal/selfhosted/preflight.go index 5da8db5fd6..dc91752c4a 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/preflight.go +++ b/src/clis/nvcf-cli/internal/selfhosted/preflight.go @@ -45,6 +45,15 @@ const ( binaryVersionMessage = "%s %s on PATH (%s required)" ) +// Severity values for CheckResult. Typed constants rather than bare strings: +// a typo'd "Error" silently downgraded a hard failure to a warning, and the +// exit code keys off an exact match. +const ( + SeverityInfo = "info" + SeverityWarning = "warning" + SeverityError = "error" +) + // One row in the linkerd-style output. Logs is internal-only and is not // forwarded into the CheckCompleted JSONL wire event, so it never leaks // into the stable JSON contract. @@ -318,6 +327,14 @@ type RoleConfig struct { // so the check follows the stack instead of drifting from it. StackDir string + // ExtraStaleNamespaces are merged into this role's stale-namespace scan. + // In ModeSingle both roles share one cluster, so only one of them runs the + // probe to avoid emitting the same check ID twice; the other role's + // namespaces are passed here instead of being dropped. The two roles probe + // disjoint lists, so without this the skipped role's namespaces are never + // scanned on the one topology where they sit on the same cluster. + ExtraStaleNamespaces []string + // ClusterValidatorRegistries is an optional list of "host:port" registry // endpoints added to the control-plane validator ConfigMap alongside the // built-in nvcr.io probe. Ignored for the compute-plane validator. @@ -351,7 +368,7 @@ func buildCategories(cfg PreflightConfig, role Role, rc RoleConfig) []categorySp out = append(out, *local) } - // Registry credential check runs from the operator's machine — no cluster + // Registry credential check runs from the operator's machine - no cluster // contact needed. RunPreflightForRole is called once per role, so the // caller clears Registries on every role but one to avoid duplicate // check_started/check_completed events. Deduplicating on the role here @@ -412,7 +429,8 @@ func controlPlaneCheckCategory(rc RoleConfig) categorySpec { if rc.StaleNamespaceProber != nil { cat.checks = append(cat.checks, staleNamespaceCheck(rc.StaleNamespaceProber, rc.KubeContext, - resolveStackNamespaces(rc.StackDir, nvcfControlPlaneNamespaces))) + mergeNamespaces(resolveStackNamespaces(rc.StackDir, nvcfControlPlaneNamespaces), + rc.ExtraStaleNamespaces))) } // Containerized cluster-validator probe for control-plane checks // (Gateway API CRDs, Envoy Gateway, StorageClass, external LB, @@ -448,7 +466,8 @@ func computePlaneCheckCategory(rc RoleConfig) categorySpec { if rc.StaleNamespaceProber != nil { cat.checks = append([]binaryCheckSpec{ staleNamespaceCheck(rc.StaleNamespaceProber, rc.KubeContext, - resolveStackNamespaces(rc.StackDir, nvcfComputePlaneNamespaces)), + mergeNamespaces(resolveStackNamespaces(rc.StackDir, nvcfComputePlaneNamespaces), + rc.ExtraStaleNamespaces)), }, cat.checks...) } if rc.SISURL != "" { @@ -648,7 +667,7 @@ func registryCredentialCheck(checker RegistryCredentialChecker, entry RegistryEn } return binaryCheckSpec{ ID: id, - HumanLabel: fmt.Sprintf("checking credentials for %s…", entry.Registry), + HumanLabel: fmt.Sprintf("checking credentials for %s...", entry.Registry), Run: func(ctx context.Context) CheckResult { r := CheckResult{ ID: id, @@ -688,11 +707,31 @@ func registryCredentialCheck(checker RegistryCredentialChecker, entry RegistryEn // staleNamespaceCheck detects NVCF namespaces stuck Terminating or left as // empty shells after a partial teardown. Severity is error; prober errors // degrade to warning so transient kubeconfig issues don't falsely fail. +// mergeNamespaces returns the union of two namespace lists, order-stable and +// de-duplicated. +func mergeNamespaces(base, extra []string) []string { + if len(extra) == 0 { + return base + } + seen := make(map[string]bool, len(base)+len(extra)) + out := make([]string, 0, len(base)+len(extra)) + for _, list := range [][]string{base, extra} { + for _, ns := range list { + if ns == "" || seen[ns] { + continue + } + seen[ns] = true + out = append(out, ns) + } + } + return out +} + func staleNamespaceCheck(prober StaleNamespaceProber, kubeContext string, namespaces []string) binaryCheckSpec { const id = "stale-namespaces" return binaryCheckSpec{ ID: id, - HumanLabel: "checking for stale NVCF namespaces…", + HumanLabel: "checking for stale NVCF namespaces...", Run: func(ctx context.Context) CheckResult { r := CheckResult{ID: id, Severity: "error"} // Resolve the context before probing, then probe that exact name. @@ -928,3 +967,14 @@ func (*noopSink) Close() error { return nil } func RunPreflight(ctx context.Context, cfg PreflightConfig) []CheckResult { return RunPreflightStreaming(ctx, cfg, &noopSink{}) } + +// ControlPlaneStaleNamespaces and ComputePlaneStaleNamespaces expose each +// role's stale-namespace list so the cmd layer can merge the two when a single +// cluster hosts both roles and only one probe runs. +func ControlPlaneStaleNamespaces(stackDir string) []string { + return resolveStackNamespaces(stackDir, nvcfControlPlaneNamespaces) +} + +func ComputePlaneStaleNamespaces(stackDir string) []string { + return resolveStackNamespaces(stackDir, nvcfComputePlaneNamespaces) +} diff --git a/src/clis/nvcf-cli/internal/selfhosted/preflight_test.go b/src/clis/nvcf-cli/internal/selfhosted/preflight_test.go index 93dee7b253..862d6bc591 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/preflight_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/preflight_test.go @@ -670,3 +670,35 @@ func TestParseInotifyOutput(t *testing.T) { require.Error(t, err) }) } + +// In ModeSingle one cluster hosts both roles and only one stale-namespace +// probe runs, so the skipped role's namespaces must be merged in. Dropping +// them means a kai-scheduler or nvca-operator namespace wedged Terminating is +// reported as "no stale NVCF namespaces detected". +func TestStaleNamespaceCheck_MergesTheOtherRolesNamespaces(t *testing.T) { + var probed []string + prober := func(_ context.Context, _ string, namespaces []string) ([]StaleNamespace, error) { + probed = namespaces + return nil, nil + } + rc := RoleConfig{ + StaleNamespaceProber: prober, + ExtraStaleNamespaces: ComputePlaneStaleNamespaces(""), + } + cat := controlPlaneCheckCategory(rc) + require.NotEmpty(t, cat.checks) + cat.checks[0].Run(context.Background()) + + for _, ns := range []string{"nvcf", "vault-system"} { + assert.Contains(t, probed, ns, "the control-plane list must still be covered") + } + for _, ns := range []string{"nvca-operator", "kai-scheduler"} { + assert.Contains(t, probed, ns, "the compute-plane list must be merged in, not dropped") + } +} + +func TestMergeNamespaces_DedupesAndKeepsOrder(t *testing.T) { + got := mergeNamespaces([]string{"a", "b"}, []string{"b", "c", ""}) + assert.Equal(t, []string{"a", "b", "c"}, got) + assert.Nil(t, mergeNamespaces(nil, nil)) +} diff --git a/src/clis/nvcf-cli/internal/selfhosted/pullsecret.go b/src/clis/nvcf-cli/internal/selfhosted/pullsecret.go index e9c17d4f8d..08d75b0c44 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/pullsecret.go +++ b/src/clis/nvcf-cli/internal/selfhosted/pullsecret.go @@ -38,10 +38,15 @@ import ( // preconditions the delete lands on whatever holds the name by then; with them // the apiserver rejects it as a conflict instead. func deleteExactly(o metav1.Object) metav1.DeleteOptions { + // UID only. UID already pins identity, which is the whole goal: a + // delete-and-recreate under the same name changes it. ResourceVersion + // additionally pins the object's version, so any concurrent write turns + // the delete into a 409 that every sweep then swallows. That bites hardest + // on the singleton Job sweep, whose only target is an active Job whose + // .status the Job controller mutates continuously. uid := o.GetUID() - rv := o.GetResourceVersion() return metav1.DeleteOptions{ - Preconditions: &metav1.Preconditions{UID: &uid, ResourceVersion: &rv}, + Preconditions: &metav1.Preconditions{UID: &uid}, } } @@ -211,6 +216,15 @@ func autoCreatePullSecretFromEnv(ctx context.Context, client kubernetes.Interfac if apiKey == "" { return "", nil } + // Only ever hand the NGC key to NGC. Without this an operator who mirrors + // the validator image to ghcr.io or a corporate Harbor and still exports + // NGC_API_KEY gets it written as that registry's password, and the kubelet + // then sends the live key to a third party as HTTP Basic auth, where it + // lands in their access logs. The local probe already guards this the same + // way; the Secret path did not. + if !isNGCRegistry(registry) { + return "", nil + } cfg, err := buildDockerConfigJSON(registry, "$oauthtoken", apiKey) if err != nil { return "", fmt.Errorf("encode dockerconfigjson for %s: %w", registry, err) diff --git a/src/clis/nvcf-cli/internal/selfhosted/pullsecret_test.go b/src/clis/nvcf-cli/internal/selfhosted/pullsecret_test.go index e60e908d0d..e989714027 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/pullsecret_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/pullsecret_test.go @@ -333,13 +333,13 @@ func TestAutoCreatePullSecretFromEnv_KeyPresent(t *testing.T) { t.Setenv("NGC_API_KEY", "nvapi-test-123") client := fake.NewSimpleClientset() - got, err := autoCreatePullSecretFromEnv(context.Background(), client, "private.registry.test", clusterValidatorControlPlaneRole) + got, err := autoCreatePullSecretFromEnv(context.Background(), client, "nvcr.io", clusterValidatorControlPlaneRole) require.NoError(t, err) assert.Equal(t, validatorPullSecretRoleName(clusterValidatorControlPlaneRole), got) s, err := client.CoreV1().Secrets("default").Get(context.Background(), validatorPullSecretRoleName(clusterValidatorControlPlaneRole), metav1.GetOptions{}) require.NoError(t, err) - assert.True(t, dockerConfigHasRegistry(s.Data[corev1.DockerConfigJsonKey], "private.registry.test"), + assert.True(t, dockerConfigHasRegistry(s.Data[corev1.DockerConfigJsonKey], "nvcr.io"), "minted secret must contain auth for the validator image's registry") } @@ -384,13 +384,28 @@ func TestResolveValidatorPullSecret_EnvFallback(t *testing.T) { t.Setenv("NVCF_NGC_API_KEY", "nvapi-fallback") client := fake.NewSimpleClientset() - got, err := resolveValidatorPullSecret(context.Background(), client, "", "private.registry.test/nvidia/nvcf-byoc/cluster-validator:rc26", clusterValidatorControlPlaneRole) + got, err := resolveValidatorPullSecret(context.Background(), client, "", "nvcr.io/nvidia/nvcf-byoc/cluster-validator:rc26", clusterValidatorControlPlaneRole) require.NoError(t, err) assert.Equal(t, validatorPullSecretRoleName(clusterValidatorControlPlaneRole), got) s, err := client.CoreV1().Secrets("default").Get(context.Background(), validatorPullSecretRoleName(clusterValidatorControlPlaneRole), metav1.GetOptions{}) require.NoError(t, err) - assert.True(t, dockerConfigHasRegistry(s.Data[corev1.DockerConfigJsonKey], "private.registry.test")) + assert.True(t, dockerConfigHasRegistry(s.Data[corev1.DockerConfigJsonKey], "nvcr.io")) +} + +// A mirrored validator image must not receive the NGC key via the env +// fallback: the kubelet would send it to that registry as Basic auth. +func TestResolveValidatorPullSecret_EnvFallbackRefusesMirroredRegistry(t *testing.T) { + for _, name := range ngcAPIKeyEnvNames { + t.Setenv(name, "") + } + t.Setenv("NVCF_NGC_API_KEY", "nvapi-fallback") + client := fake.NewSimpleClientset() + + got, err := resolveValidatorPullSecret(context.Background(), client, "", + "private.registry.test/nvidia/nvcf-byoc/cluster-validator:rc26", clusterValidatorControlPlaneRole) + require.NoError(t, err) + assert.Empty(t, got, "no secret may be minted for a non-NGC registry") } func TestResolveValidatorPullSecret_AllEmpty(t *testing.T) { @@ -588,9 +603,10 @@ func TestWriteDockerConfigSecret_TypeMismatchDeletePinsTheInspectedObject(t *tes require.NotNil(t, opts.Preconditions, "delete must carry preconditions") require.NotNil(t, opts.Preconditions.UID) - require.NotNil(t, opts.Preconditions.ResourceVersion) assert.Equal(t, existing.UID, *opts.Preconditions.UID) - assert.Equal(t, existing.ResourceVersion, *opts.Preconditions.ResourceVersion) + assert.Nil(t, opts.Preconditions.ResourceVersion, + "UID alone pins identity; pinning ResourceVersion turns any concurrent "+ + "write into a 409 that the sweeps swallow") } // A conflict means the object changed after the ownership check, so the run @@ -623,3 +639,22 @@ func TestWriteDockerConfigSecret_TypeMismatchStopsOnDeleteConflict(t *testing.T) require.Error(t, err, "a changed object must abort the replace") assert.False(t, created, "must not create over an object that was never vetted") } + +// NGC_API_KEY must never be minted as the password for a registry that is not +// NGC. An operator who mirrors the validator image to ghcr.io or a corporate +// Harbor and still exports NGC_API_KEY would otherwise have the kubelet send +// the live key to a third party as HTTP Basic auth. +func TestAutoCreatePullSecretFromEnv_RefusesNonNGCRegistry(t *testing.T) { + t.Setenv("NGC_API_KEY", "nvapi-secret-value") + client := fake.NewSimpleClientset() + + name, err := autoCreatePullSecretFromEnv(context.Background(), client, + "ghcr.io", clusterValidatorControlPlaneRole) + require.NoError(t, err) + assert.Empty(t, name, "no secret may be minted for a non-NGC registry") + + secrets, err := client.CoreV1().Secrets(clusterValidatorNamespace).List( + context.Background(), metav1.ListOptions{}) + require.NoError(t, err) + assert.Empty(t, secrets.Items, "the NGC key must not reach a third-party registry") +} diff --git a/src/clis/nvcf-cli/internal/selfhosted/registry_cred.go b/src/clis/nvcf-cli/internal/selfhosted/registry_cred.go index 354dd47d15..debfb1863e 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/registry_cred.go +++ b/src/clis/nvcf-cli/internal/selfhosted/registry_cred.go @@ -122,7 +122,7 @@ func probeRegistryCredential(ctx context.Context, registry, repoHint string, cri } return requireConfiguredCredentials(registry) case http.StatusUnauthorized: - // Auth required — proceed with token exchange. + // Auth required - proceed with token exchange. default: resp.Body.Close() return fmt.Errorf("unexpected status %s from %s", resp.Status, registry) @@ -147,7 +147,7 @@ func probeRegistryCredential(ctx context.Context, registry, repoHint string, cri _, err = exchangeBearerToken(pctx, client, registry, repoHint, wwwAuth) if err != nil { // Use credentialsForRegistry (not ngcCredentials) so NGC_API_KEY does - // not masquerade as credentials for quay.io, GHCR, or Harbor — those + // not masquerade as credentials for quay.io, GHCR, or Harbor - those // registries reject NGC tokens, which would wrongly produce "credentials // rejected" when the real diagnosis is "no credentials configured." if _, _, hasCreds := credentialsForRegistry(registry); !hasCreds { @@ -245,13 +245,23 @@ func EnumerateRegistries(imageRef, stackValuesFile string, extras []string) []Re if registry == "" || seen[registry] { return } + // Every source goes through the same host validation. The probe builds + // "https://" + registry + "/v2/", so a value carrying "/" or "@" moves + // the host: global.image.registry set to "nvcr.io@attacker.example.com" + // in a values file the CLI finds by walking up from CWD would otherwise + // aim an outbound request wherever that names. Extras were guarded via + // parseRegistryHostPort; the image ref and the values file were not. + if !isBareRegistryHost(strings.TrimSuffix(strings.TrimPrefix(registry, "["), "]")) && + !isBareRegistryHost(registry) { + return + } seen[registry] = true out = append(out, RegistryEntry{Registry: registry, RepoHint: repoHint, Critical: critical}) } // Source 1: base registry from the configured validator image. // Carry the repo path as a scope hint so the token exchange uses the - // operator's actual org rather than a fake one — NGC returns 403 for + // operator's actual org rather than a fake one - NGC returns 403 for // orgs the API key cannot access, even if the key itself is valid. // // Critical follows the same rule as every other source rather than being @@ -296,8 +306,13 @@ func EnumerateRegistries(imageRef, stackValuesFile string, extras []string) []Re reg := host if port != 0 && port != 443 { reg = net.JoinHostPort(host, strconv.Itoa(port)) - } else if strings.Contains(host, ":") { - reg = "[" + host + "]" // bare IPv6 literal on the default port + } else if strings.Contains(host, ":") && !strings.HasPrefix(host, "[") { + // Bare IPv6 literal on the default port. parseRegistryHostPort + // returns the input verbatim when SplitHostPort fails, and it + // fails on an already-bracketed "[fd00::1]" with missingPort, so + // without the prefix guard that arrives here still bracketed and + // becomes "[[fd00::1]]", which is not a parseable URL host. + reg = "[" + host + "]" } add(reg, "", false) } diff --git a/src/clis/nvcf-cli/internal/selfhosted/registry_cred_test.go b/src/clis/nvcf-cli/internal/selfhosted/registry_cred_test.go index a173aa284e..be9b35b494 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/registry_cred_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/registry_cred_test.go @@ -34,7 +34,7 @@ import ( // -- probeRegistryCredential -- func TestProbeRegistryCredential_PublicRegistry(t *testing.T) { - // Registry returns 200 on /v2/ with the registry API header → public, + // Registry returns 200 on /v2/ with the registry API header -> public, // no credentials needed. srv := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Docker-Distribution-Api-Version", "registry/2.0") @@ -88,7 +88,7 @@ func TestProbeRegistryCredential_AuthSucceeds(t *testing.T) { } func TestProbeRegistryCredential_AuthFails(t *testing.T) { - // Registry returns 401 but the token endpoint returns 401 too → bad credentials. + // Registry returns 401 but the token endpoint returns 401 too -> bad credentials. tokenSrv := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusUnauthorized) })) @@ -179,7 +179,7 @@ func TestEnumerateRegistries_ExtrasAppended(t *testing.T) { } func TestEnumerateRegistries_NoDuplicates(t *testing.T) { - // Pass nvcr.io both as the image registry and as an extra — must not dedup. + // Pass nvcr.io both as the image registry and as an extra - must not dedup. entries := EnumerateRegistries("nvcr.io/some/image:1.0", "", []string{"nvcr.io"}) @@ -384,3 +384,47 @@ func TestEnumerateRegistries_FallbackDoesNotDuplicateNamedNGC(t *testing.T) { } assert.Equal(t, 1, n, "nvcr.io must appear exactly once") } + +// parseRegistryHostPort returns its input verbatim when SplitHostPort fails, +// and it fails on an already-bracketed literal with missingPort. Without a +// prefix guard that arrives here still bracketed and becomes "[[fd00::1]]", +// which http.NewRequest rejects. The documented bracketed form must work. +func TestEnumerateRegistries_DoesNotDoubleBracketIPv6(t *testing.T) { + for _, in := range []string{"[fd00::1]", "fd00::1"} { + got := EnumerateRegistries("", "", []string{in}) + var found string + for _, e := range got { + if strings.Contains(e.Registry, "fd00") { + found = e.Registry + } + } + assert.Equal(t, "[fd00::1]", found, "input %q must yield a singly-bracketed host", in) + } +} + +func TestEnumerateRegistries_KeepsBracketedIPv6WithPort(t *testing.T) { + got := EnumerateRegistries("", "", []string{"[fd00::1]:5000"}) + var found string + for _, e := range got { + if strings.Contains(e.Registry, "fd00") { + found = e.Registry + } + } + assert.Equal(t, "[fd00::1]:5000", found) +} + +// The probe builds "https://" + registry + "/v2/", so a registry string that +// carries "/" or "@" moves the host. A values file the CLI finds by walking up +// from CWD must not be able to aim an outbound request. +func TestEnumerateRegistries_RejectsHostMovingRegistryStrings(t *testing.T) { + dir := t.TempDir() + values := filepath.Join(dir, "base.yaml") + require.NoError(t, os.WriteFile(values, + []byte("global:\n image:\n registry: nvcr.io@attacker.example.com\n"), 0o600)) + + for _, e := range EnumerateRegistries("nvcr.io@evil.test/x/y:1", values, nil) { + assert.NotContains(t, e.Registry, "@", "a host-moving string must not be probed") + assert.NotContains(t, e.Registry, "attacker.example.com") + assert.NotContains(t, e.Registry, "evil.test") + } +} diff --git a/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go index 5a852b3867..3276f2d971 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go @@ -70,7 +70,7 @@ func TestProbeStaleNamespaces_TerminatingIsByPhase(t *testing.T) { } func TestProbeStaleNamespaces_EmptyShellNoHelmSecrets(t *testing.T) { - // Namespace exists and is Active but holds no Helm release secrets → + // Namespace exists and is Active but holds no Helm release secrets -> // leftover empty shell from a partial helm uninstall. client := fake.NewSimpleClientset(&corev1.Namespace{ ObjectMeta: metav1.ObjectMeta{Name: "nvcf"}, @@ -84,7 +84,7 @@ func TestProbeStaleNamespaces_EmptyShellNoHelmSecrets(t *testing.T) { } func TestProbeStaleNamespaces_HealthyReleaseNotStale(t *testing.T) { - // Namespace exists and carries an owner=helm secret → active Helm release, + // Namespace exists and carries an owner=helm secret -> active Helm release, // not stale. client := fake.NewSimpleClientset( &corev1.Namespace{ diff --git a/src/clis/nvcf-cli/internal/selfhosted/validatortag.go b/src/clis/nvcf-cli/internal/selfhosted/validatortag.go index 7029581ab4..f608623a4a 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/validatortag.go +++ b/src/clis/nvcf-cli/internal/selfhosted/validatortag.go @@ -205,7 +205,7 @@ func exchangeBearerToken(ctx context.Context, client *http.Client, registry, rep realm, service, scope := parseWWWAuthenticate(wwwAuthenticate) if realm == "" { - // No parseable WWW-Authenticate — use NGC's /proxy_auth as fallback. + // No parseable WWW-Authenticate - use NGC's /proxy_auth as fallback. return exchangeNGCBearerToken(ctx, client, registry, repo) } @@ -252,7 +252,7 @@ func exchangeBearerToken(ctx context.Context, client *http.Client, registry, rep // Use scope from the WWW-Authenticate header when present. // When scope is empty and a repo is provided, synthesize the standard // pull scope. When neither is present (credential probe, no specific - // repo needed), omit scope entirely — most registries issue a valid + // repo needed), omit scope entirely - most registries issue a valid // token and the absence of a resource scope avoids org-level 403s for // non-existent repositories. if scope == "" && repo != "" { @@ -269,7 +269,7 @@ func exchangeBearerToken(ctx context.Context, client *http.Client, registry, rep } // Add credentials when present. Docker config covers any registry; // NGC API key is only applicable to NGC-hosted registries. - // Critically: do NOT apply NGC_API_KEY to non-NGC registries — quay.io, + // Critically: do NOT apply NGC_API_KEY to non-NGC registries - quay.io, // GHCR, and Harbor will reject it, producing a misleading "credentials // rejected" error when the real situation is "no credentials configured." if user, pass, ok := credentialsForRegistry(registry); ok { diff --git a/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go b/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go index d528c4a174..f1dafeb95d 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/validatortag_test.go @@ -277,7 +277,7 @@ func TestParseWWWAuthenticate_GHCR(t *testing.T) { } func TestParseWWWAuthenticate_NoBearer(t *testing.T) { - // Basic auth challenge — should return empty strings. + // Basic auth challenge - should return empty strings. realm, service, scope := parseWWWAuthenticate(`Basic realm="My Registry"`) assert.Empty(t, realm) assert.Empty(t, service) From bb0d56b73bc39e02de2a83f8b2c62283eab68a8b Mon Sep 17 00:00:00 2001 From: rohithb Date: Tue, 22 Sep 2026 16:21:00 +0530 Subject: [PATCH 32/36] fix(nvcf-cli): scope pull-secret adoption per role and stop the stale-namespace check deleting healthy namespaces --- src/clis/nvcf-cli/cmd/self_hosted_check.go | 37 +++--- .../nvcf-cli/cmd/self_hosted_check_test.go | 8 +- src/clis/nvcf-cli/cmd/self_hosted_up.go | 22 ++-- .../nvcf-cli/internal/selfhosted/BUILD.bazel | 1 + .../internal/selfhosted/clustervalidator.go | 67 +++++++++- .../selfhosted/clustervalidator_test.go | 117 ++++++++---------- .../nvcf-cli/internal/selfhosted/preflight.go | 27 ++-- .../internal/selfhosted/pullsecret.go | 33 +++-- .../internal/selfhosted/pullsecret_test.go | 60 +++++++++ .../nvcf-cli/internal/selfhosted/register.go | 12 +- .../internal/selfhosted/stack_namespaces.go | 28 +++-- .../selfhosted/stack_namespaces_test.go | 34 ++++- .../internal/selfhosted/stale_namespace.go | 19 ++- .../selfhosted/stale_namespace_test.go | 90 ++++++++++++-- .../internal/selfhosted/validatortag.go | 24 ++-- 15 files changed, 422 insertions(+), 157 deletions(-) diff --git a/src/clis/nvcf-cli/cmd/self_hosted_check.go b/src/clis/nvcf-cli/cmd/self_hosted_check.go index f279e3bb91..f400339f1c 100644 --- a/src/clis/nvcf-cli/cmd/self_hosted_check.go +++ b/src/clis/nvcf-cli/cmd/self_hosted_check.go @@ -148,7 +148,7 @@ func runSelfHostedCheck(c *cobra.Command, _ []string) error { // *IsTargeted left the validator unresolved and both probes nil, with no // note explaining why. anyValidatorIsTargeted := !localOnly && !skipClusterValidation && - (computePlaneIsVisited(mode) || controlPlaneIsVisited(mode)) + (computePlaneIsVisited() || controlPlaneIsVisited()) clusterValidatorImage := "" if anyValidatorIsTargeted { if img, ok := resolveClusterValidatorImage(c.Context()); ok { @@ -189,7 +189,7 @@ func runSelfHostedCheck(c *cobra.Command, _ []string) error { // validator row" with "validator silently dropped". Print at most one // reason; --skip-cluster-validation takes precedence over missing // config since it's the explicit operator choice. - if !localOnly && (computePlaneIsVisited(mode) || controlPlaneIsVisited(mode)) { + if !localOnly && (computePlaneIsVisited() || controlPlaneIsVisited()) { switch { case skipClusterValidation: fmt.Fprintln(c.ErrOrStderr(), "note: cluster-validator skipped (--skip-cluster-validation)") @@ -406,14 +406,17 @@ func controlPlaneIsTargeted(mode kubectx.Mode) bool { // which is broader than whether its role-specific check set runs. --pre in // ModeSplit visits both clusters for the shared pre-install checks (stale // namespaces) without targeting either role, so the targeting predicates alone -// cannot gate the dispatch. In ModeSingle --pre already targets both roles and -// these are equivalent to their *IsTargeted counterparts. -func computePlaneIsVisited(mode kubectx.Mode) bool { - return computePlaneIsTargeted(mode) || checkPre +// cannot gate the dispatch. +// +// No mode parameter, unlike *IsTargeted: "(X || (pre && single)) || pre" +// absorbs to "X || pre", so the mode cannot change the answer. Taking one +// would imply a mode-dependence that does not exist. +func computePlaneIsVisited() bool { + return checkComputePlane || checkAll || checkPre } -func controlPlaneIsVisited(mode kubectx.Mode) bool { - return controlPlaneIsTargeted(mode) || checkPre +func controlPlaneIsVisited() bool { + return checkControlPlane || checkAll || checkPre } // withoutHostLocalChecks returns a copy of cfg with the inputs for the checks @@ -506,7 +509,7 @@ func runPreflightByRole(ctx context.Context, cfg selfhosted.PreflightConfig, sin var inotifyProber selfhosted.NodeInotifyProber // Visited, not targeted: the inotify limit is exactly what --pre exists to // catch before NVCA bootstrap, so it must run for --pre in ModeSplit too. - if computePlaneIsVisited(mode) && !skipInotify { + if computePlaneIsVisited() && !skipInotify { inotifyProber = newInotifyProberForSelfHosted() } @@ -521,7 +524,7 @@ func runPreflightByRole(ctx context.Context, cfg selfhosted.PreflightConfig, sin // still creates a ServiceAccount, cluster-wide ClusterRole/CRB, pull secret // and validator Job in the compute cluster. var clusterValidator selfhosted.ClusterValidator - if computePlaneIsVisited(mode) && clusterValidatorImage != "" { + if computePlaneIsVisited() && clusterValidatorImage != "" { clusterValidator = newClusterValidatorForSelfHosted() } @@ -538,7 +541,7 @@ func runPreflightByRole(ctx context.Context, cfg selfhosted.PreflightConfig, sin // clusterValidator is nil and keying off it would drop the control-plane // validator check from the run entirely. var cpClusterValidator selfhosted.ClusterValidator - if controlPlaneIsVisited(mode) && clusterValidatorImage != "" { + if controlPlaneIsVisited() && clusterValidatorImage != "" { cpClusterValidator = newClusterValidatorForSelfHosted() } @@ -546,8 +549,8 @@ func runPreflightByRole(ctx context.Context, cfg selfhosted.PreflightConfig, sin // operator's machine, so they belong to one invocation only. The control // plane carries them when it runs; otherwise the compute plane does, so // neither is silently dropped by a compute-plane-only invocation. - runControlPlane := controlPlaneIsVisited(mode) - runComputePlane := computePlaneIsVisited(mode) + runControlPlane := controlPlaneIsVisited() + runComputePlane := computePlaneIsVisited() cpCfg, gpuCfg := cfg, cfg if runControlPlane { gpuCfg = withoutHostLocalChecks(cfg) @@ -710,14 +713,14 @@ func emitCheckFinal(ctx context.Context, sink progress.EventSink, results []self }) } -// anyFailed returns true if any check failed at error severity. Warnings do -// not trigger non-zero exit per spec §6.3. -// isBlockingFailure is the single definition of "this fails the run". Both the -// exit code and the JSON verdict derive from it, so they cannot disagree. func isBlockingFailure(r selfhosted.CheckResult) bool { return !r.Passed && r.Severity == selfhosted.SeverityError } +// anyFailed returns true if any check failed at error severity. Warnings do +// not trigger non-zero exit per spec §6.3. +// isBlockingFailure is the single definition of "this fails the run". Both the +// exit code and the JSON verdict derive from it, so they cannot disagree. func anyFailed(results []selfhosted.CheckResult) bool { for _, r := range results { if isBlockingFailure(r) { diff --git a/src/clis/nvcf-cli/cmd/self_hosted_check_test.go b/src/clis/nvcf-cli/cmd/self_hosted_check_test.go index f2f661d1f6..46e0d312b6 100644 --- a/src/clis/nvcf-cli/cmd/self_hosted_check_test.go +++ b/src/clis/nvcf-cli/cmd/self_hosted_check_test.go @@ -566,6 +566,10 @@ func parseJSONLLines(t *testing.T, s string) []map[string]any { // the targeting predicates: --pre in ModeSplit visits both clusters for the // shared pre-install checks without targeting either role. Gating the split // dispatch on the targeting predicates alone would make --pre a no-op there. +// +// The mode column is kept to document that the answer is the same in both +// modes: the predicate is mode-independent by absorption, so a table that +// varied only the mode would be asserting a dependence that does not exist. func TestPlaneIsVisited(t *testing.T) { t.Cleanup(func() { checkPre = false @@ -593,8 +597,8 @@ func TestPlaneIsVisited(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { checkPre, checkControlPlane, checkComputePlane, checkAll = tt.pre, tt.cp, tt.gpu, tt.all - assert.Equal(t, tt.wantCP, controlPlaneIsVisited(tt.mode)) - assert.Equal(t, tt.wantComputeGP, computePlaneIsVisited(tt.mode)) + assert.Equal(t, tt.wantCP, controlPlaneIsVisited()) + assert.Equal(t, tt.wantComputeGP, computePlaneIsVisited()) }) } } diff --git a/src/clis/nvcf-cli/cmd/self_hosted_up.go b/src/clis/nvcf-cli/cmd/self_hosted_up.go index d9b3f9f9e4..681da61272 100644 --- a/src/clis/nvcf-cli/cmd/self_hosted_up.go +++ b/src/clis/nvcf-cli/cmd/self_hosted_up.go @@ -1507,6 +1507,17 @@ func kubectxFor(phaseNum int) string { } } +type registerValuesWriteRequest struct { + StackPath string + ClusterName string + NCAID string + Region string + IdentitySource string + ClusterID string + ClusterGroupID string + Endpoints registerEndpointValues +} + // writeRegisterValuesYAML persists the helm values handoff file the worker-layer // helmfile expects at /out/-register-values.yaml. Schema mirrors // `printRegistrationOutput` (cmd/cluster_registration.go, fixed in `ff9aaf7`): @@ -1519,17 +1530,6 @@ func kubectxFor(phaseNum int) string { // The pre-`ff9aaf7` shape (nested `selfManaged.clusterId`, lowercase-d) left // the chart's `.Values.clusterID` empty → cluster-dto.yaml rendered with empty // IDs → operator failed to fetch backend identity. (Iter #12 from dev-VM E2E.) -type registerValuesWriteRequest struct { - StackPath string - ClusterName string - NCAID string - Region string - IdentitySource string - ClusterID string - ClusterGroupID string - Endpoints registerEndpointValues -} - func writeRegisterValuesYAML(req registerValuesWriteRequest) error { outDir := filepath.Join(req.StackPath, "out") if err := os.MkdirAll(outDir, 0o755); err != nil { diff --git a/src/clis/nvcf-cli/internal/selfhosted/BUILD.bazel b/src/clis/nvcf-cli/internal/selfhosted/BUILD.bazel index 730c3ebb46..1b08299376 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/BUILD.bazel +++ b/src/clis/nvcf-cli/internal/selfhosted/BUILD.bazel @@ -45,6 +45,7 @@ go_library( "@io_k8s_api//core/v1:core", "@io_k8s_api//rbac/v1:rbac", "@io_k8s_apimachinery//pkg/api/errors", + "@io_k8s_apimachinery//pkg/api/resource", "@io_k8s_apimachinery//pkg/apis/meta/v1:meta", "@io_k8s_apimachinery//pkg/labels", "@io_k8s_client_go//kubernetes", diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go index c31b66ec8c..506cc56d93 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go @@ -33,6 +33,7 @@ import ( corev1 "k8s.io/api/core/v1" rbacv1 "k8s.io/api/rbac/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/client-go/kubernetes" @@ -356,11 +357,6 @@ func validatorConfigNameForRole(role string) string { return clusterValidatorNoConfigName } -// sweepClusterValidatorRBAC removes the SA, ClusterRole, and ClusterRoleBinding -// created by ensureClusterValidatorRBAC. Called after Job completion (when -// --no-cleanup is not set) to close the window where the elevated ClusterRole -// exists. The next run recreates them via ensureClusterValidatorRBAC. -// Errors are swallowed: stale RBAC is preferable to failing the result. // sweepOrphanClusterValidatorRBAC removes validator RBAC left behind by a run // that died before its deferred cleanup (SIGKILL, OOM, lost terminal). // @@ -409,6 +405,12 @@ func sweepOrphanClusterValidatorRBAC(ctx context.Context, client kubernetes.Inte } } +// sweepClusterValidatorRBAC removes the SA, ClusterRole, and ClusterRoleBinding +// created by ensureClusterValidatorRBAC. Called after Job completion (when +// --no-cleanup is not set) to close the window where the elevated ClusterRole +// exists. Each run mints its own names, so nothing is reused and anything left +// behind is reclaimed by sweepOrphanClusterValidatorRBAC instead. +// Errors are swallowed: stale RBAC is preferable to failing the result. func sweepClusterValidatorRBAC(ctx context.Context, client kubernetes.Interface, role, runID string) { name := clusterValidatorRBACName(role, runID) @@ -490,6 +492,10 @@ func validatorRoleSelector(role string) string { // without importing that package. const clusterValidatorControlPlaneRole = "control-plane" +// clusterValidatorComputePlaneRole is the other VALIDATOR_ROLE value. Both are +// named so role-scoping logic reads the same on either side. +const clusterValidatorComputePlaneRole = "compute-plane" + // clusterValidatorConfigName is the default ConfigMap name the validator binary // looks for when VALIDATOR_CONFIG_NAME is empty. Must stay in sync with // defaultConfigMapName in nvca/cmd/cluster-validator/main.go. @@ -661,13 +667,39 @@ func parseRegistryHostPort(s string) (host string, port int) { // write. VALIDATOR_ROLE selects the check set (control-plane vs compute-plane). func buildClusterValidatorJob(name, image, pullSecret, role, runID string, noCleanup bool) *batchv1.Job { backoff := int32(0) + // Pod shape mirrors deployments/nvca-operator/templates/cronjob.yaml, which + // runs this same image. Two producers of one pod spec now exist in two + // languages, so they are kept deliberately in step: without the security + // context the Job is rejected outright by a namespace enforcing the + // PodSecurity "restricted" profile, and without the tolerations it never + // schedules on a cluster whose nodes all carry the control-plane taint. + // Either way waitForClusterValidatorJob burns its full budget and the run + // leaks, so these are correctness, not hardening. + runAsUser := int64(65534) + runAsNonRoot := true + readOnlyRoot := true + allowPrivEsc := false podSpec := corev1.PodSpec{ ServiceAccountName: clusterValidatorRBACName(role, runID), RestartPolicy: corev1.RestartPolicyNever, + Tolerations: clusterValidatorTolerations(), + SecurityContext: &corev1.PodSecurityContext{ + RunAsUser: &runAsUser, + RunAsGroup: &runAsUser, + FSGroup: &runAsUser, + }, Containers: []corev1.Container{{ Name: clusterValidatorContainer, Image: image, ImagePullPolicy: corev1.PullIfNotPresent, + Resources: clusterValidatorResources(), + SecurityContext: &corev1.SecurityContext{ + RunAsNonRoot: &runAsNonRoot, + ReadOnlyRootFilesystem: &readOnlyRoot, + AllowPrivilegeEscalation: &allowPrivEsc, + Capabilities: &corev1.Capabilities{Drop: []corev1.Capability{"ALL"}}, + SeccompProfile: &corev1.SeccompProfile{Type: corev1.SeccompProfileTypeRuntimeDefault}, + }, Env: []corev1.EnvVar{ {Name: "VALIDATOR_CONFIG_NAMESPACE", Value: clusterValidatorNamespace}, // Name the ConfigMap explicitly for the control-plane role and @@ -860,3 +892,28 @@ func sweepClusterValidatorConfig(ctx context.Context, client kubernetes.Interfac } _ = cms.Delete(ctx, clusterValidatorConfigName, deleteExactly(cm)) } + +// clusterValidatorTolerations mirrors the chart's tolerations so the Job can +// schedule on a cluster whose nodes all carry the control-plane taint, which +// is the normal shape for a dedicated control plane. +func clusterValidatorTolerations() []corev1.Toleration { + return []corev1.Toleration{ + {Key: "node-role.kubernetes.io/control-plane", Operator: corev1.TolerationOpExists, Effect: corev1.TaintEffectNoSchedule}, + {Key: "node-role.kubernetes.io/master", Operator: corev1.TolerationOpExists, Effect: corev1.TaintEffectNoSchedule}, + } +} + +// clusterValidatorResources mirrors the chart's defaults. Without requests the +// Job is rejected outright by a namespace carrying a LimitRange or a quota. +func clusterValidatorResources() corev1.ResourceRequirements { + return corev1.ResourceRequirements{ + Requests: corev1.ResourceList{ + corev1.ResourceCPU: resource.MustParse("100m"), + corev1.ResourceMemory: resource.MustParse("64Mi"), + }, + Limits: corev1.ResourceList{ + corev1.ResourceCPU: resource.MustParse("200m"), + corev1.ResourceMemory: resource.MustParse("128Mi"), + }, + } +} diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go index b04fb3a11f..ff61e2a931 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go @@ -221,58 +221,25 @@ func TestRunClusterValidator_JobFailed(t *testing.T) { assert.NotEmpty(t, res.JobName, "JobName must be populated on failure for kubectl-logs follow-up") } -func TestRunClusterValidator_RBACIdempotent(t *testing.T) { - // Seed the SA, ClusterRole and ClusterRoleBinding exactly as a prior run - // would have left them: present, and carrying our managed labels. Each - // Create then returns AlreadyExists and the runner must treat that as - // success and proceed to Job creation. - // - // Seeding real objects rather than faking AlreadyExists with a reactor - // matters: the runner refetches on conflict to confirm it owns what it is - // about to bind, so a reactor with nothing behind it is not a valid model. - client := fake.NewSimpleClientset( - &corev1.ServiceAccount{ObjectMeta: metav1.ObjectMeta{ - Name: clusterValidatorName, Namespace: clusterValidatorNamespace, - Labels: clusterValidatorLabels(), - }}, - &rbacv1.ClusterRole{ObjectMeta: metav1.ObjectMeta{ - Name: clusterValidatorName, Labels: clusterValidatorLabels(), - }}, - &rbacv1.ClusterRoleBinding{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterValidatorName, Labels: clusterValidatorLabels(), - }, - Subjects: []rbacv1.Subject{{ - Kind: rbacv1.ServiceAccountKind, - Name: clusterValidatorName, - Namespace: clusterValidatorNamespace, - }}, - RoleRef: rbacv1.RoleRef{ - APIGroup: rbacv1.GroupName, Kind: "ClusterRole", Name: clusterValidatorName, - }, - }, - ) - - var jobName atomic.Value - jobName.Store("") - client.PrependReactor("create", "jobs", func(action ktesting.Action) (bool, runtime.Object, error) { - jobName.Store(action.(ktesting.CreateAction).GetObject().(*batchv1.Job).Name) - return false, nil, nil - }) - client.PrependReactor("get", "jobs", func(action ktesting.Action) (bool, runtime.Object, error) { - return jobSucceededReactor(jobName.Load().(string))(action) +// Each run mints an unguessable RBAC name, so there is no idempotence left to +// test: a name collision means something else already holds the name this run +// is about to bind cluster-wide permissions to. That must fail, not be adopted. +// (Replaces TestRunClusterValidator_RBACIdempotent, which seeded objects under +// the old fixed name and so never produced the AlreadyExists it described.) +func TestRunClusterValidator_RBACNameCollisionIsNotAdopted(t *testing.T) { + client := fake.NewSimpleClientset() + client.PrependReactor("create", "clusterroles", func(action ktesting.Action) (bool, runtime.Object, error) { + name := action.(ktesting.CreateAction).GetObject().(*rbacv1.ClusterRole).Name + return true, nil, apierrors.NewAlreadyExists( + schema.GroupResource{Group: "rbac.authorization.k8s.io", Resource: "clusterroles"}, name) }) - client.PrependReactor("list", "pods", podListReactor("")) - res := runClusterValidator(context.Background(), client, "test-image:1.0", "", false, "", nil) - require.NoError(t, res.Err, "AlreadyExists on RBAC bootstrap must be treated as success") - assert.True(t, res.Passed) + res := runClusterValidator(context.Background(), client, "nvcr.io/x/validator:1", + "", false, clusterValidatorControlPlaneRole, nil) + require.Error(t, res.Err, "a pre-existing object under our generated name must not be adopted") + assert.Contains(t, res.Err.Error(), "bootstrapping validator RBAC") } -// TestEnsureClusterValidatorRBAC_WritableResources verifies that the -// bootstrapped ClusterRole grants the write verbs required by enforcement -// checks (namespace/pod create+delete), probe log reading (pods/log get), -// and the Gateway API checks. func TestEnsureClusterValidatorRBAC_WritableResources(t *testing.T) { client := fake.NewSimpleClientset() ctx := context.Background() @@ -681,23 +648,6 @@ func TestParseRegistryHostPort(t *testing.T) { }) } } - -func alreadyExistsReactor(resource, name string) ktesting.ReactionFunc { - gr := schema.GroupResource{Resource: resource} - return func(action ktesting.Action) (bool, runtime.Object, error) { - createAction, ok := action.(ktesting.CreateAction) - if !ok { - return false, nil, nil - } - meta, ok := createAction.GetObject().(metav1.Object) - if !ok || meta.GetName() != name { - return false, nil, nil - } - return true, nil, apierrors.NewAlreadyExists(gr, name) - } -} - -// The same invariant for the network-check ConfigMap. func TestEnsureClusterValidatorConfig_RefusesUnmanagedConfigMap(t *testing.T) { ctx := context.Background() client := fake.NewSimpleClientset(&corev1.ConfigMap{ @@ -905,3 +855,40 @@ func TestRunClusterValidator_NoCleanupKeepsPullSecretAndPriorJob(t *testing.T) { context.Background(), secret.Name, metav1.GetOptions{}) assert.NoError(t, err, "--no-cleanup must keep the pull secret the preserved pod needs") } + +// The Job runs the same image as the chart's CronJob, so it needs the same pod +// shape. Without the security context a namespace enforcing the PodSecurity +// "restricted" profile rejects it at admission; without the tolerations it +// never schedules on a cluster whose nodes all carry the control-plane taint. +// Either way the wait burns its full budget and the run leaks. +func TestBuildClusterValidatorJob_MatchesChartPodShape(t *testing.T) { + job := buildClusterValidatorJob("j", "nvcr.io/x/validator:1", "", + clusterValidatorControlPlaneRole, "runid", false) + spec := job.Spec.Template.Spec + + require.NotNil(t, spec.SecurityContext, "pod security context is required under restricted") + require.NotNil(t, spec.SecurityContext.RunAsUser) + assert.Equal(t, int64(65534), *spec.SecurityContext.RunAsUser, "chart runs this image as 65534") + + require.Len(t, spec.Containers, 1) + sc := spec.Containers[0].SecurityContext + require.NotNil(t, sc, "container security context is required under restricted") + require.NotNil(t, sc.RunAsNonRoot) + assert.True(t, *sc.RunAsNonRoot) + require.NotNil(t, sc.AllowPrivilegeEscalation) + assert.False(t, *sc.AllowPrivilegeEscalation) + require.NotNil(t, sc.Capabilities) + assert.Equal(t, []corev1.Capability{"ALL"}, sc.Capabilities.Drop) + require.NotNil(t, sc.SeccompProfile) + assert.Equal(t, corev1.SeccompProfileTypeRuntimeDefault, sc.SeccompProfile.Type) + + var keys []string + for _, tol := range spec.Tolerations { + keys = append(keys, tol.Key) + } + assert.Contains(t, keys, "node-role.kubernetes.io/control-plane") + assert.Contains(t, keys, "node-role.kubernetes.io/master") + + assert.False(t, spec.Containers[0].Resources.Requests.Cpu().IsZero(), + "a namespace with a LimitRange or quota rejects a pod with no requests") +} diff --git a/src/clis/nvcf-cli/internal/selfhosted/preflight.go b/src/clis/nvcf-cli/internal/selfhosted/preflight.go index dc91752c4a..623c132c75 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/preflight.go +++ b/src/clis/nvcf-cli/internal/selfhosted/preflight.go @@ -704,11 +704,6 @@ func registryCredentialCheck(checker RegistryCredentialChecker, entry RegistryEn } } -// staleNamespaceCheck detects NVCF namespaces stuck Terminating or left as -// empty shells after a partial teardown. Severity is error; prober errors -// degrade to warning so transient kubeconfig issues don't falsely fail. -// mergeNamespaces returns the union of two namespace lists, order-stable and -// de-duplicated. func mergeNamespaces(base, extra []string) []string { if len(extra) == 0 { return base @@ -727,6 +722,11 @@ func mergeNamespaces(base, extra []string) []string { return out } +// staleNamespaceCheck detects NVCF namespaces stuck Terminating or left as +// empty shells after a partial teardown. Severity is error; prober errors +// degrade to warning so transient kubeconfig issues don't falsely fail. +// mergeNamespaces returns the union of two namespace lists, order-stable and +// de-duplicated. func staleNamespaceCheck(prober StaleNamespaceProber, kubeContext string, namespaces []string) binaryCheckSpec { const id = "stale-namespaces" return binaryCheckSpec{ @@ -793,9 +793,22 @@ func staleNamespaceCheck(prober StaleNamespaceProber, kubeContext string, namesp } } if len(emptyShell) > 0 { + // Deliberately not a delete command. A namespace with no Helm + // release is not necessarily stale: the stack gates + // cert-manager, NATS, OpenBao and Cassandra on *.enabled, so an + // operator who installs one the documented upstream way, or via + // Argo, owns a healthy namespace with no owner=helm object. + // Handing them "kubectl delete namespace cert-manager" would + // destroy every Certificate and Issuer in the cluster. hints = append(hints, - fmt.Sprintf("inspect and delete empty namespaces: %s delete namespace %s", - kctl, strings.Join(emptyShell, " "))) + fmt.Sprintf("inspect these and remove them only after confirming they are unused: %s get all -n %s", + kctl, strings.Join(emptyShell, " -n "))) + } + // Only a namespace stuck Terminating blocks the run. "No Helm + // release" is a heuristic over a conditionally-installed stack, so + // it warns rather than turning a supported install shape into exit 2. + if len(terminating) == 0 { + r.Severity = SeverityWarning } r.Message = fmt.Sprintf("%d stale namespace(s) detected: %s. To resolve: %s", len(stale), strings.Join(parts, ", "), strings.Join(hints, "; ")) diff --git a/src/clis/nvcf-cli/internal/selfhosted/pullsecret.go b/src/clis/nvcf-cli/internal/selfhosted/pullsecret.go index 08d75b0c44..5904679b98 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/pullsecret.go +++ b/src/clis/nvcf-cli/internal/selfhosted/pullsecret.go @@ -182,6 +182,17 @@ func scanAndMirrorPullSecret(ctx context.Context, client kubernetes.Interface, r continue } if s.Namespace == clusterValidatorNamespace { + // Adopt an operator-supplied Secret (no managed labels, so no + // sweep touches it) or this role's own. Never the other + // role's: in ModeSplit both kubecontexts can resolve to one + // cluster, and that role's deferred sweep would delete the + // Secret while this role's pod is still pulling, which the + // kubelet reports as FailedToRetrieveImagePullSecret. That is + // the exact failure per-role naming was introduced to prevent. + if hasValidatorManagedLabels(s.Labels) && + s.Labels[clusterValidatorRoleLabel] != role { + continue + } return s.Name, nil } // Mirror under the validator's well-known name rather than the @@ -357,17 +368,6 @@ func writeDockerConfigSecret(ctx context.Context, client kubernetes.Interface, n return nil } -// isManagedByValidatorCLI reports whether the secret carries the labels -// writeDockerConfigSecret stamps on every secret it creates. Used to -// gate the delete-then-recreate branch so we never destroy an operator- -// or chart-owned secret that happens to share a name with one of ours. -// refuseIfUnmanaged rejects a Secret nvcf-cli does not own. Every path in -// writeDockerConfigSecret that mutates an existing Secret must call this: -// overwriting an operator-owned secret replaces their registry credentials and -// stamps our managed labels on it, after which the role sweep deletes it. -// -// detail is appended to the message when there is something useful to say -// (the conflicting type, the race), otherwise "". func refuseIfUnmanaged(s *corev1.Secret, namespace, name, detail string) error { if isManagedByValidatorCLI(s) { return nil @@ -381,6 +381,17 @@ func refuseIfUnmanaged(s *corev1.Secret, namespace, name, detail string) error { namespace, name, detail) } +// isManagedByValidatorCLI reports whether the secret carries the labels +// writeDockerConfigSecret stamps on every secret it creates. Used to +// gate the delete-then-recreate branch so we never destroy an operator- +// or chart-owned secret that happens to share a name with one of ours. +// refuseIfUnmanaged rejects a Secret nvcf-cli does not own. Every path in +// writeDockerConfigSecret that mutates an existing Secret must call this: +// overwriting an operator-owned secret replaces their registry credentials and +// stamps our managed labels on it, after which the role sweep deletes it. +// +// detail is appended to the message when there is something useful to say +// (the conflicting type, the race), otherwise "". func isManagedByValidatorCLI(s *corev1.Secret) bool { return hasValidatorManagedLabels(s.Labels) } diff --git a/src/clis/nvcf-cli/internal/selfhosted/pullsecret_test.go b/src/clis/nvcf-cli/internal/selfhosted/pullsecret_test.go index e989714027..f3d7e7354a 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/pullsecret_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/pullsecret_test.go @@ -658,3 +658,63 @@ func TestAutoCreatePullSecretFromEnv_RefusesNonNGCRegistry(t *testing.T) { require.NoError(t, err) assert.Empty(t, secrets.Items, "the NGC key must not reach a third-party registry") } + +// In ModeSplit both kubecontexts can resolve to one cluster. Adopting the +// other role's managed Secret means that role's sweep deletes it while this +// role's pod is still pulling. +func TestScanAndMirrorPullSecret_DoesNotAdoptTheOtherRolesSecret(t *testing.T) { + cfg := dockerConfigBlob(t, "nvcr.io", "$oauthtoken", "key") + otherRole := &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: validatorPullSecretRoleName(clusterValidatorControlPlaneRole), + Namespace: clusterValidatorNamespace, + Labels: clusterValidatorRoleLabels(clusterValidatorControlPlaneRole), + }, + Type: corev1.SecretTypeDockerConfigJson, + Data: map[string][]byte{corev1.DockerConfigJsonKey: cfg}, + } + client := fake.NewSimpleClientset(otherRole) + + got, err := scanAndMirrorPullSecret(context.Background(), client, "nvcr.io", + clusterValidatorComputePlaneRole) + require.NoError(t, err) + assert.NotEqual(t, otherRole.Name, got, + "the compute role must not adopt the control-plane role's managed Secret") +} + +// An operator-supplied Secret carries no managed labels, so no sweep touches +// it and adopting it is safe. +func TestScanAndMirrorPullSecret_AdoptsOperatorSuppliedSecret(t *testing.T) { + cfg := dockerConfigBlob(t, "nvcr.io", "$oauthtoken", "key") + operator := &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{Name: "operator-pull", Namespace: clusterValidatorNamespace}, + Type: corev1.SecretTypeDockerConfigJson, + Data: map[string][]byte{corev1.DockerConfigJsonKey: cfg}, + } + client := fake.NewSimpleClientset(operator) + + got, err := scanAndMirrorPullSecret(context.Background(), client, "nvcr.io", + clusterValidatorComputePlaneRole) + require.NoError(t, err) + assert.Equal(t, "operator-pull", got) +} + +// This role's own Secret is still adopted rather than re-minted. +func TestScanAndMirrorPullSecret_AdoptsOwnRoleSecret(t *testing.T) { + cfg := dockerConfigBlob(t, "nvcr.io", "$oauthtoken", "key") + own := &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: validatorPullSecretRoleName(clusterValidatorComputePlaneRole), + Namespace: clusterValidatorNamespace, + Labels: clusterValidatorRoleLabels(clusterValidatorComputePlaneRole), + }, + Type: corev1.SecretTypeDockerConfigJson, + Data: map[string][]byte{corev1.DockerConfigJsonKey: cfg}, + } + client := fake.NewSimpleClientset(own) + + got, err := scanAndMirrorPullSecret(context.Background(), client, "nvcr.io", + clusterValidatorComputePlaneRole) + require.NoError(t, err) + assert.Equal(t, own.Name, got) +} diff --git a/src/clis/nvcf-cli/internal/selfhosted/register.go b/src/clis/nvcf-cli/internal/selfhosted/register.go index 1e8f1bc6ae..75908c93f4 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/register.go +++ b/src/clis/nvcf-cli/internal/selfhosted/register.go @@ -315,12 +315,6 @@ func resolveClusterID(resp *client.RegisterClusterResponse) string { // avoid touching a real kubeconfig file. var loadKubeConfigFn = loadKubeConfig -// loadKubeConfig builds a *rest.Config for the given kubeconfig context. -// When kctx is empty the kubeconfig's current-context is used, preserving -// single-cluster behavior. The loading-rules chain follows the same priority -// as kubectl: KUBECONFIG env var → ~/.kube/config. -// currentKubeContextNameFn is a seam: tests must not depend on the developer's -// kubeconfig, and hint output would otherwise vary by machine. var currentKubeContextNameFn = currentKubeContextName // currentKubeContextName returns the kubeconfig's current-context, or "" when @@ -346,6 +340,12 @@ func effectiveKubeContext(kctx string) string { return currentKubeContextNameFn() } +// loadKubeConfig builds a *rest.Config for the given kubeconfig context. +// When kctx is empty the kubeconfig's current-context is used, preserving +// single-cluster behavior. The loading-rules chain follows the same priority +// as kubectl: KUBECONFIG env var → ~/.kube/config. +// currentKubeContextNameFn is a seam: tests must not depend on the developer's +// kubeconfig, and hint output would otherwise vary by machine. func loadKubeConfig(kctx string) (*rest.Config, error) { loadingRules := clientcmd.NewDefaultClientConfigLoadingRules() overrides := &clientcmd.ConfigOverrides{} diff --git a/src/clis/nvcf-cli/internal/selfhosted/stack_namespaces.go b/src/clis/nvcf-cli/internal/selfhosted/stack_namespaces.go index 054a7aa7da..a6bf51426d 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/stack_namespaces.go +++ b/src/clis/nvcf-cli/internal/selfhosted/stack_namespaces.go @@ -53,8 +53,16 @@ func stackReleaseNamespaces(stackDir string) []string { if stackDir == "" { return nil } - entries, err := filepath.Glob(filepath.Join(stackDir, "helmfile.d", "*.yaml.gotmpl")) - if err != nil || len(entries) == 0 { + // helmfile accepts plain .yaml fragments as well as .yaml.gotmpl. + var entries []string + for _, pattern := range []string{"*.yaml.gotmpl", "*.yaml"} { + matches, err := filepath.Glob(filepath.Join(stackDir, "helmfile.d", pattern)) + if err != nil { + return nil + } + entries = append(entries, matches...) + } + if len(entries) == 0 { return nil } @@ -62,7 +70,13 @@ func stackReleaseNamespaces(stackDir string) []string { for _, path := range entries { body, err := os.ReadFile(path) if err != nil { - continue + // Bail out rather than deriving a partial list. A single + // unreadable fragment (a root-owned 0600 file left by "sudo + // helmfile", say) would otherwise silently drop a third of the + // namespaces, and the caller prefers any non-empty derived list + // over the complete static fallback. That turns a truncated scan + // into an affirmative all-clear. + return nil } for _, m := range helmfileNamespaceRE.FindAllStringSubmatch(string(body), -1) { if ns := strings.TrimSpace(m[1]); ns != "" { @@ -86,8 +100,8 @@ func stackReleaseNamespaces(stackDir string) []string { // It prefers what the stack actually declares and falls back to the static // list when no stack is available. func resolveStackNamespaces(stackDir string, fallback []string) []string { - if derived := stackReleaseNamespaces(stackDir); len(derived) > 0 { - return derived - } - return fallback + // Union, not replace. The derived list follows the stack, but it cannot see + // namespaces behind a helmfiles: include, so on its own it can still be + // short. Merging keeps the static list as a floor. + return mergeNamespaces(fallback, stackReleaseNamespaces(stackDir)) } diff --git a/src/clis/nvcf-cli/internal/selfhosted/stack_namespaces_test.go b/src/clis/nvcf-cli/internal/selfhosted/stack_namespaces_test.go index febf3ff2c3..b5319c20f2 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/stack_namespaces_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/stack_namespaces_test.go @@ -88,12 +88,40 @@ func TestResolveStackNamespaces_FallsBackWhenNoStack(t *testing.T) { "a directory with no helmfile.d must use the static list") } -func TestResolveStackNamespaces_PrefersStack(t *testing.T) { +// The derived list is additive, not a replacement: it cannot see namespaces +// behind a helmfiles: include, so on its own it can still be short. The static +// list stays as a floor. +func TestResolveStackNamespaces_UnionsStackWithStatic(t *testing.T) { dir := writeStack(t, map[string]string{ "01.yaml.gotmpl": "releases:\n - name: a\n namespace: from-stack\n", }) - assert.Equal(t, []string{"from-stack"}, resolveStackNamespaces(dir, []string{"static"}), - "a readable stack must win over the static list") + got := resolveStackNamespaces(dir, []string{"static"}) + assert.Contains(t, got, "from-stack", "the stack's namespaces must be picked up") + assert.Contains(t, got, "static", "the static list must remain a floor") +} + +// An unreadable fragment must not yield a truncated list that then overrides +// the complete static one, which would report an affirmative all-clear over a +// scan missing a third of its namespaces. +func TestStackReleaseNamespaces_UnreadableFragmentYieldsNothing(t *testing.T) { + dir := writeStack(t, map[string]string{ + "01.yaml.gotmpl": "releases:\n - name: a\n namespace: one\n", + "02.yaml.gotmpl": "releases:\n - name: b\n namespace: two\n", + }) + unreadable := filepath.Join(dir, "helmfile.d", "02.yaml.gotmpl") + require.NoError(t, os.Chmod(unreadable, 0o000)) + t.Cleanup(func() { _ = os.Chmod(unreadable, 0o600) }) + + assert.Nil(t, stackReleaseNamespaces(dir), + "a partial parse must not masquerade as the stack's full namespace set") +} + +// helmfile accepts plain .yaml fragments too. +func TestStackReleaseNamespaces_ReadsPlainYAMLFragments(t *testing.T) { + dir := writeStack(t, map[string]string{ + "01.yaml": "releases:\n - name: a\n namespace: plain-yaml\n", + }) + assert.Contains(t, stackReleaseNamespaces(dir), "plain-yaml") } // A `namespace:` key nested inside a release's values block is chart diff --git a/src/clis/nvcf-cli/internal/selfhosted/stale_namespace.go b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace.go index 7dde653238..02a42b108e 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/stale_namespace.go +++ b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace.go @@ -138,6 +138,10 @@ func helmReleaseExists( func probeStaleNamespaces(ctx context.Context, client kubernetes.Interface, namespaces []string) ([]StaleNamespace, error) { var stale []StaleNamespace + // noRelease is held back until we know the Helm storage driver keeps its + // state in-cluster at all; see the gate below. + var noRelease []string + anyHelmReleaseSeen := false for _, name := range namespaces { ns, err := client.CoreV1().Namespaces().Get(ctx, name, metav1.GetOptions{}) if err != nil { @@ -167,6 +171,7 @@ func probeStaleNamespaces(ctx context.Context, client kubernetes.Interface, name return stale, fmt.Errorf("list Helm secrets in %s: %w", name, err) } if found { + anyHelmReleaseSeen = true continue // healthy: active Helm release found via the secret driver } found, err = helmReleaseExists( @@ -180,7 +185,19 @@ func probeStaleNamespaces(ctx context.Context, client kubernetes.Interface, name if err != nil { return stale, fmt.Errorf("list Helm configmaps in %s: %w", name, err) } - if !found { + if found { + anyHelmReleaseSeen = true + continue + } + noRelease = append(noRelease, name) + } + + // Only trust the "no Helm release" signal when at least one owner=helm + // object was seen somewhere. HELM_DRIVER=sql keeps release state in a + // database with no in-cluster object at all, so without this every + // namespace of a healthy production install reports stale. + if anyHelmReleaseSeen { + for _, name := range noRelease { stale = append(stale, StaleNamespace{Name: name, Reason: "no Helm release"}) } } diff --git a/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go index 3276f2d971..6278985c93 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go @@ -72,11 +72,26 @@ func TestProbeStaleNamespaces_TerminatingIsByPhase(t *testing.T) { func TestProbeStaleNamespaces_EmptyShellNoHelmSecrets(t *testing.T) { // Namespace exists and is Active but holds no Helm release secrets -> // leftover empty shell from a partial helm uninstall. - client := fake.NewSimpleClientset(&corev1.Namespace{ - ObjectMeta: metav1.ObjectMeta{Name: "nvcf"}, - Status: corev1.NamespaceStatus{Phase: corev1.NamespaceActive}, - }) - stale, err := probeStaleNamespaces(context.Background(), client, []string{"nvcf"}) + // + // A second namespace carries a real release so the driver is known to keep + // its state in-cluster. Without that the signal is unusable and correctly + // suppressed, which is what HELM_DRIVER=sql looks like. + client := fake.NewSimpleClientset( + &corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{Name: "nvcf"}, + Status: corev1.NamespaceStatus{Phase: corev1.NamespaceActive}, + }, + &corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{Name: "sis"}, + Status: corev1.NamespaceStatus{Phase: corev1.NamespaceActive}, + }, + &corev1.Secret{ObjectMeta: metav1.ObjectMeta{ + Name: "sh.helm.release.v1.sis.v1", + Namespace: "sis", + Labels: map[string]string{"owner": "helm", "name": "sis", "status": "deployed"}, + }}, + ) + stale, err := probeStaleNamespaces(context.Background(), client, []string{"nvcf", "sis"}) require.NoError(t, err) require.Len(t, stale, 1) assert.Equal(t, "nvcf", stale[0].Name) @@ -236,7 +251,7 @@ func TestStaleNamespaceCheck_MessageNamesAllStaleNamespaces(t *testing.T) { assert.Contains(t, r.Message, "api-keys") assert.Contains(t, r.Message, "/api/v1/namespaces/nvcf/finalize", "the remediation must use the finalize subresource; a plain patch is silently reverted") - assert.Contains(t, r.Message, "kubectl delete namespace api-keys") + assert.Contains(t, r.Message, "kubectl get all -n api-keys") } // A namespace on a real install holds many non-Helm Secrets (ServiceAccount @@ -310,7 +325,7 @@ func TestStaleNamespaceCheck_HintsPinTheProbedContext(t *testing.T) { assert.True(t, strings.HasPrefix(cmd, "--context cp-ctx "), "unpinned kubectl invocation in hint: kubectl %s", cmd) } - assert.Contains(t, r.Message, "kubectl --context cp-ctx delete namespace api-keys") + assert.Contains(t, r.Message, "kubectl --context cp-ctx get all -n api-keys") } func TestStaleNamespaceCheck_HintsQuoteTheContext(t *testing.T) { @@ -319,7 +334,7 @@ func TestStaleNamespaceCheck_HintsQuoteTheContext(t *testing.T) { return []StaleNamespace{{Name: "nvcf", Reason: "no Helm release"}}, nil } r := staleNamespaceCheck(prober, "my ctx", []string{"nvcf"}).Run(context.Background()) - assert.Contains(t, r.Message, "--context 'my ctx' delete namespace nvcf", + assert.Contains(t, r.Message, "--context 'my ctx' get all -n nvcf", "a context name with a space must be quoted so the pasted command does not split it") } @@ -352,7 +367,7 @@ func TestStaleNamespaceCheck_HintsNameTheCurrentContext(t *testing.T) { return []StaleNamespace{{Name: "nvcf", Reason: "no Helm release"}}, nil } r := staleNamespaceCheck(prober, "", []string{"nvcf"}).Run(context.Background()) - assert.Contains(t, r.Message, "kubectl --context k3d-local delete namespace nvcf") + assert.Contains(t, r.Message, "kubectl --context k3d-local get all -n nvcf") } // An unreadable kubeconfig must not break the hint; it degrades to no flag. @@ -362,7 +377,7 @@ func TestStaleNamespaceCheck_HintsOmitUnknownContext(t *testing.T) { return []StaleNamespace{{Name: "nvcf", Reason: "no Helm release"}}, nil } r := staleNamespaceCheck(prober, "", []string{"nvcf"}).Run(context.Background()) - assert.Contains(t, r.Message, "kubectl delete namespace nvcf") + assert.Contains(t, r.Message, "kubectl get all -n nvcf") } // The probe must run against the same context the hints name. Resolving the @@ -379,3 +394,58 @@ func TestStaleNamespaceCheck_ProbesTheResolvedContext(t *testing.T) { assert.Equal(t, "k3d-local", probed, "the probe must target the resolved context, not whatever is current when it runs") } + +// HELM_DRIVER=sql keeps release state in a database, so a healthy production +// install has no owner=helm object anywhere. Without a gate every stack +// namespace reports stale at error severity with a delete remediation. +func TestProbeStaleNamespaces_NoHelmObjectsAnywhereReportsNothing(t *testing.T) { + client := fake.NewSimpleClientset( + &corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "nvcf"}}, + &corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "sis"}}, + ) + got, err := probeStaleNamespaces(context.Background(), client, []string{"nvcf", "sis"}) + require.NoError(t, err) + assert.Empty(t, got, + "with no in-cluster Helm state at all the signal is unusable, not evidence of staleness") +} + +// A namespace stuck Terminating is still reported even when no Helm release +// object exists anywhere: that signal does not depend on the storage driver. +func TestProbeStaleNamespaces_TerminatingReportedWithoutHelmObjects(t *testing.T) { + client := fake.NewSimpleClientset( + &corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{Name: "nvcf"}, + Status: corev1.NamespaceStatus{Phase: corev1.NamespaceTerminating}, + }, + ) + got, err := probeStaleNamespaces(context.Background(), client, []string{"nvcf"}) + require.NoError(t, err) + require.Len(t, got, 1) + assert.Equal(t, "stuck Terminating", got[0].Reason) +} + +// A conditionally-disabled component installed the upstream way is healthy. +// Reporting it at error severity turns a supported shape into exit 2, and the +// old remediation would have destroyed every Certificate in the cluster. +func TestStaleNamespaceCheck_NoHelmReleaseWarnsAndDoesNotSuggestDelete(t *testing.T) { + pinCurrentKubeContext(t, "") + prober := func(_ context.Context, _ string, _ []string) ([]StaleNamespace, error) { + return []StaleNamespace{{Name: "cert-manager", Reason: "no Helm release"}}, nil + } + r := staleNamespaceCheck(prober, "", []string{"cert-manager"}).Run(context.Background()) + + assert.Equal(t, SeverityWarning, r.Severity, + "a namespace with no Helm release must not fail the run") + assert.NotContains(t, r.Message, "delete namespace", + "the remediation must not destroy a namespace the operator may own") +} + +// A namespace stuck Terminating does block the run. +func TestStaleNamespaceCheck_TerminatingIsStillAnError(t *testing.T) { + pinCurrentKubeContext(t, "") + prober := func(_ context.Context, _ string, _ []string) ([]StaleNamespace, error) { + return []StaleNamespace{{Name: "nvcf", Reason: "stuck Terminating"}}, nil + } + r := staleNamespaceCheck(prober, "", []string{"nvcf"}).Run(context.Background()) + assert.Equal(t, SeverityError, r.Severity) +} diff --git a/src/clis/nvcf-cli/internal/selfhosted/validatortag.go b/src/clis/nvcf-cli/internal/selfhosted/validatortag.go index f608623a4a..6b96684eee 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/validatortag.go +++ b/src/clis/nvcf-cli/internal/selfhosted/validatortag.go @@ -436,18 +436,6 @@ var ngcApprovedHosts = []string{ ".ngc.nvidia", } -// isNGCRegistry returns true when the registry host belongs to an NVIDIA / NGC -// domain. The check strips any port from the registry string before matching -// so that nvcr.io:443 is handled correctly, and uses dot-boundary matching to -// reject deceptive suffixes such as evilnvcr.io or nvidia.com.invalid. -// isBareRegistryHost reports whether s is a plain host[:port], with nothing in -// it that could move the request somewhere else once concatenated into a URL. -// -// This matters because the registry string is interpolated directly into -// "https://" + registry + "/...". A value like "evil.com/x.nvcr.io" ends with a -// trusted suffix but parses to host evil.com, so a suffix check alone would -// authorize sending credentials to an attacker. IPv6 literals keep their -// brackets and are allowed. func isBareRegistryHost(s string) bool { if s == "" { return false @@ -465,6 +453,18 @@ func isBareRegistryHost(s string) bool { return true } +// isNGCRegistry returns true when the registry host belongs to an NVIDIA / NGC +// domain. The check strips any port from the registry string before matching +// so that nvcr.io:443 is handled correctly, and uses dot-boundary matching to +// reject deceptive suffixes such as evilnvcr.io or nvidia.com.invalid. +// isBareRegistryHost reports whether s is a plain host[:port], with nothing in +// it that could move the request somewhere else once concatenated into a URL. +// +// This matters because the registry string is interpolated directly into +// "https://" + registry + "/...". A value like "evil.com/x.nvcr.io" ends with a +// trusted suffix but parses to host evil.com, so a suffix check alone would +// authorize sending credentials to an attacker. IPv6 literals keep their +// brackets and are allowed. func isNGCRegistry(registry string) bool { // Never treat a value we cannot safely place in a URL as an NGC host: the // caller uses this to decide whether to forward the NGC API key. From e5ab3dde80a48b6fb91999728d69eed74eb891da Mon Sep 17 00:00:00 2001 From: rohithb Date: Tue, 22 Sep 2026 16:56:44 +0530 Subject: [PATCH 33/36] fix(nvcf-cli): bound the validator Job and make the check command's tests hermetic --- src/clis/nvcf-cli/cmd/main_test.go | 27 +++- src/clis/nvcf-cli/cmd/self_hosted_check.go | 4 +- .../nvcf-cli/cmd/self_hosted_check_test.go | 19 +++ .../internal/selfhosted/clustervalidator.go | 67 ++++++++- .../selfhosted/clustervalidator_test.go | 131 +++++++++++++++++- .../nvcf-cli/internal/selfhosted/preflight.go | 13 +- .../internal/selfhosted/pullsecret.go | 17 +-- .../internal/selfhosted/pullsecret_test.go | 58 ++++---- .../selfhosted/stack_namespaces_test.go | 8 +- .../selfhosted/stale_namespace_test.go | 19 +++ 10 files changed, 309 insertions(+), 54 deletions(-) diff --git a/src/clis/nvcf-cli/cmd/main_test.go b/src/clis/nvcf-cli/cmd/main_test.go index d0fa86ed75..4d65747743 100644 --- a/src/clis/nvcf-cli/cmd/main_test.go +++ b/src/clis/nvcf-cli/cmd/main_test.go @@ -21,14 +21,35 @@ import ( "context" "os" "testing" + + "nvcf-cli/internal/selfhosted" ) -// Default-stub out the validator-tag registry probe so cmd tests don't make -// real network calls or pollute the on-disk cache. Individual tests can -// reassign the variable if they explicitly want to exercise discovery. +// Default-stub every seam that would otherwise reach the developer's cluster or +// the network. Individual tests reassign a variable when they explicitly want +// to exercise that path. +// +// These are not conveniences. Without them `go test ./cmd/` creates a hostPath +// busybox pod per node in `default` (the inotify probe), lists Secrets across +// the stack namespaces of whatever kubeconfig happens to be current, and makes +// an outbound request to nvcr.io per configured registry. That mutates a real +// cluster from a unit test, and it is why the package took minutes and failed +// on a proxied kubeconfig rather than seconds and deterministically. func TestMain(m *testing.M) { resolveLatestValidatorTagForSelfHosted = func(_ context.Context, _ string) (string, bool) { return "", false } + // Nil prober: the inotify check is skipped rather than creating pods. + newInotifyProberForSelfHosted = func() selfhosted.NodeInotifyProber { return nil } + // No cluster contact, and a clean result so the category still renders. + newStaleNamespaceProberForSelfHosted = func() selfhosted.StaleNamespaceProber { + return func(context.Context, string, []string) ([]selfhosted.StaleNamespace, error) { + return nil, nil + } + } + // No outbound registry request. + newRegistryCredentialCheckerForSelfHosted = func() selfhosted.RegistryCredentialChecker { + return func(context.Context, string, string, bool) error { return nil } + } os.Exit(m.Run()) } diff --git a/src/clis/nvcf-cli/cmd/self_hosted_check.go b/src/clis/nvcf-cli/cmd/self_hosted_check.go index f400339f1c..e8e80d40c7 100644 --- a/src/clis/nvcf-cli/cmd/self_hosted_check.go +++ b/src/clis/nvcf-cli/cmd/self_hosted_check.go @@ -453,7 +453,9 @@ func maybeShowClusterValidatorLogs(w io.Writer, results []selfhosted.CheckResult fmt.Fprintln(w, "--- cluster-validator logs ---") fmt.Fprint(w, r.Logs) fmt.Fprintln(w, "--- end cluster-validator logs ---") - return + // No early return: both roles produce a cluster-validator result under + // the same ID, so stopping at the first drops the other transcript + // entirely from --all --show-logs. } } diff --git a/src/clis/nvcf-cli/cmd/self_hosted_check_test.go b/src/clis/nvcf-cli/cmd/self_hosted_check_test.go index 46e0d312b6..ddf4f72cac 100644 --- a/src/clis/nvcf-cli/cmd/self_hosted_check_test.go +++ b/src/clis/nvcf-cli/cmd/self_hosted_check_test.go @@ -714,3 +714,22 @@ func TestEmitCheckFinal_ErrorIsAFailure(t *testing.T) { assert.Contains(t, buf.String(), `"verdict":"failed"`) assert.Contains(t, buf.String(), `"success":false`) } + +// Both roles emit a cluster-validator result under the same ID, so stopping at +// the first drops the other transcript entirely from --all --show-logs. +func TestMaybeShowClusterValidatorLogs_PrintsBothRoles(t *testing.T) { + prev := checkShowLogs + checkShowLogs = true + t.Cleanup(func() { checkShowLogs = prev }) + + var buf bytes.Buffer + maybeShowClusterValidatorLogs(&buf, []selfhosted.CheckResult{ + {ID: "cluster-validator", Logs: "control-plane transcript\n"}, + {ID: "cluster-validator", Logs: "compute-plane transcript\n"}, + }) + + out := buf.String() + assert.Contains(t, out, "control-plane transcript") + assert.Contains(t, out, "compute-plane transcript") + assert.Equal(t, 2, strings.Count(out, "--- cluster-validator logs ---")) +} diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go index 506cc56d93..7ce77715cd 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go @@ -139,7 +139,7 @@ func runClusterValidator(ctx context.Context, client kubernetes.Interface, image // Resolver errors are non-fatal: fall through to the caller's value and // let waitForClusterValidatorJob surface ImagePullBackOff if needed. - if resolved, err := resolveValidatorPullSecret(ctx, client, pullSecret, image, role); err == nil { + if resolved, err := resolveValidatorPullSecret(ctx, client, pullSecret, image, role, noCleanup); err == nil { pullSecret = resolved } // Sweep only this role's managed pull secret, and only once the pod can no @@ -176,7 +176,7 @@ func runClusterValidator(ctx context.Context, client kubernetes.Interface, image sweepClusterValidatorRBAC(context.Background(), client, role, runID) } }() - if err := ensureClusterValidatorRBAC(vctx, client, role, runID); err != nil { + if err := ensureClusterValidatorRBAC(vctx, client, role, runID, noCleanup); err != nil { return ClusterValidatorResult{Err: fmt.Errorf("bootstrapping validator RBAC: %w", err)} } @@ -259,8 +259,8 @@ func runClusterValidator(ctx context.Context, client kubernetes.Interface, image // Creates the SA/ClusterRole/ClusterRoleBinding the validator pod runs under, // idempotent via AlreadyExists tolerance. ClusterRole uses update-or-create so // newer CLI versions replace stale rules without the operator needing to delete. -func ensureClusterValidatorRBAC(ctx context.Context, client kubernetes.Interface, role, runID string) error { - roleLabels := clusterValidatorRoleLabels(role) +func ensureClusterValidatorRBAC(ctx context.Context, client kubernetes.Interface, role, runID string, preserve bool) error { + roleLabels := clusterValidatorRoleLabelsPreserved(role, preserve) name := clusterValidatorRBACName(role, runID) sa := &corev1.ServiceAccount{ @@ -341,8 +341,17 @@ func clusterValidatorLabels() map[string]string { // role's Job mid-command, including under --no-cleanup, which makes the // printed `kubectl logs job/...` hint 404. func clusterValidatorRoleLabels(role string) map[string]string { + return clusterValidatorRoleLabelsPreserved(role, false) +} + +// clusterValidatorRoleLabelsPreserved adds the preserve marker when the run was +// asked to keep its artifacts, so the orphan sweeper leaves them alone. +func clusterValidatorRoleLabelsPreserved(role string, preserve bool) map[string]string { l := clusterValidatorLabels() l[clusterValidatorRoleLabel] = role + if preserve { + l[clusterValidatorPreserveLabel] = "true" + } return l } @@ -373,10 +382,25 @@ func sweepOrphanClusterValidatorRBAC(ctx context.Context, client kubernetes.Inte // reclaimable requires the generated name as well as the labels and the // age. Labels alone are three public constants and can be copied onto // anything, and this deletes cluster-scoped objects with errors swallowed. + // Pull secrets carry the other generated-name prefix. + reclaimableSecret := func(o metav1.Object) bool { + if !strings.HasPrefix(o.GetName(), validatorPullSecretName) { + return false + } + if o.GetLabels()[clusterValidatorPreserveLabel] == "true" { + return false + } + ts := o.GetCreationTimestamp() + return ts.Before(&cutoff) + } + reclaimable := func(o metav1.Object) bool { if !strings.HasPrefix(o.GetName(), clusterValidatorName) { return false } + if o.GetLabels()[clusterValidatorPreserveLabel] == "true" { + return false + } ts := o.GetCreationTimestamp() return ts.Before(&cutoff) } @@ -395,6 +419,18 @@ func sweepOrphanClusterValidatorRBAC(ctx context.Context, client kubernetes.Inte } } } + // Pull secrets too: the deferred sweep is suppressed whenever the pod may + // still be running, and that is exactly the ImagePullBackOff path, so + // without this arm a Secret holding $oauthtoken:$NGC_API_KEY is the one + // object with no reclaim at all. + secrets := client.CoreV1().Secrets(clusterValidatorNamespace) + if l, err := secrets.List(ctx, opts); err == nil { + for i := range l.Items { + if o := &l.Items[i]; reclaimableSecret(o) { + _ = secrets.Delete(ctx, o.Name, deleteExactly(o)) + } + } + } sa := client.CoreV1().ServiceAccounts(clusterValidatorNamespace) if l, err := sa.List(ctx, opts); err == nil { for i := range l.Items { @@ -509,6 +545,12 @@ const clusterValidatorNoConfigName = "cluster-validator-no-config" // clusterValidatorRoleLabel scopes Job selectors to a single validator role. const clusterValidatorRoleLabel = "nvcf.nvidia.com/validator-role" +// clusterValidatorPreserveLabel marks objects an operator asked to keep with +// --no-cleanup. The orphan sweeper skips them: without it a preserved run is +// reclaimed anyway once it is older than the TTL, which makes the flag mean +// "keep for 30 minutes". +const clusterValidatorPreserveLabel = "nvcf.nvidia.com/validator-preserve" + // clusterValidatorRBACName returns the ServiceAccount / ClusterRole / // ClusterRoleBinding name for one run of one role. // @@ -553,7 +595,13 @@ const controlPlaneValidatorConfigTemplate = `reachability: protocol: tcp+tls critical: true enforcement: - enabled: true + # Disabled for preflight. VALIDATOR_PREFLIGHT only suppresses the summary + # write, so enforcement would still run: it creates netpol-validation + # namespaces, server and client pods and NetworkPolicies, and pulls + # busybox from Docker Hub. Doing that on a virgin or air-gapped cluster, + # before anything is installed and with no flag to turn it off, is not + # something a read-only readiness check should do. + enabled: false testImage: busybox:1.36 timeoutSeconds: 60 critical: false @@ -667,6 +715,7 @@ func parseRegistryHostPort(s string) (host string, port int) { // write. VALIDATOR_ROLE selects the check set (control-plane vs compute-plane). func buildClusterValidatorJob(name, image, pullSecret, role, runID string, noCleanup bool) *batchv1.Job { backoff := int32(0) + activeDeadline := int64(clusterValidatorTimeout/time.Second) + 60 // Pod shape mirrors deployments/nvca-operator/templates/cronjob.yaml, which // runs this same image. Two producers of one pod spec now exist in two // languages, so they are kept deliberately in step: without the security @@ -725,6 +774,14 @@ func buildClusterValidatorJob(name, image, pullSecret, role, runID string, noCle }, Spec: batchv1.JobSpec{ BackoffLimit: &backoff, + // Without a deadline an ImagePullBackOff Job never reaches a + // terminal state, so TTLSecondsAfterFinished never fires and the + // Job, its RBAC and its pull secret persist indefinitely. The + // deferred sweeps are suppressed on that path by design, because + // the pod may still be running, so this is the only reclaim. + // Sized above the runner's own budget so it never truncates a wait + // that is still making progress. + ActiveDeadlineSeconds: &activeDeadline, Template: corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{Labels: clusterValidatorRoleLabels(role)}, Spec: podSpec, diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go index ff61e2a931..f9732e31c1 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go @@ -246,7 +246,7 @@ func TestEnsureClusterValidatorRBAC_WritableResources(t *testing.T) { const role = clusterValidatorControlPlaneRole const runID = "testrunid" - require.NoError(t, ensureClusterValidatorRBAC(ctx, client, role, runID)) + require.NoError(t, ensureClusterValidatorRBAC(ctx, client, role, runID, false)) cr, err := client.RbacV1().ClusterRoles().Get(ctx, clusterValidatorRBACName(role, runID), metav1.GetOptions{}) require.NoError(t, err) @@ -706,7 +706,7 @@ func TestEnsureClusterValidatorRBAC_DoesNotAdoptExistingObjects(t *testing.T) { }, }) - err := ensureClusterValidatorRBAC(ctx, client, role, runID) + err := ensureClusterValidatorRBAC(ctx, client, role, runID, false) require.Error(t, err, "a pre-existing object must not be adopted, forged labels or not") _, bindErr := client.RbacV1().ClusterRoleBindings().Get(ctx, name, metav1.GetOptions{}) @@ -831,13 +831,17 @@ func TestSweepClusterValidatorConfig_DeletesOwnAndSparesOperators(t *testing.T) func TestRunClusterValidator_NoCleanupKeepsPullSecretAndPriorJob(t *testing.T) { prior := &batchv1.Job{ObjectMeta: metav1.ObjectMeta{ Name: clusterValidatorName + "-earlier", Namespace: clusterValidatorNamespace, - Labels: clusterValidatorRoleLabels(clusterValidatorControlPlaneRole), + Labels: clusterValidatorRoleLabels(clusterValidatorControlPlaneRole), + CreationTimestamp: metav1.NewTime(time.Now()), }} secret := &corev1.Secret{ ObjectMeta: metav1.ObjectMeta{ Name: validatorPullSecretRoleName(clusterValidatorControlPlaneRole), Namespace: clusterValidatorNamespace, Labels: clusterValidatorRoleLabels(clusterValidatorControlPlaneRole), + // The fake clientset leaves this zero, which the orphan sweeper + // reads as older than any TTL. A real apiserver stamps it. + CreationTimestamp: metav1.NewTime(time.Now()), }, Type: corev1.SecretTypeDockerConfigJson, } @@ -892,3 +896,124 @@ func TestBuildClusterValidatorJob_MatchesChartPodShape(t *testing.T) { assert.False(t, spec.Containers[0].Resources.Requests.Cpu().IsZero(), "a namespace with a LimitRange or quota rejects a pod with no requests") } + +// An ImagePullBackOff Job never reaches a terminal state on its own, so +// TTLSecondsAfterFinished never fires and the Job, its cluster-wide RBAC and +// its NGC-derived pull secret persist forever. The deferred sweeps are +// suppressed on that path by design, so the deadline is the only reclaim. +func TestBuildClusterValidatorJob_SetsActiveDeadline(t *testing.T) { + job := buildClusterValidatorJob("j", "nvcr.io/x/validator:1", "", + clusterValidatorControlPlaneRole, "runid", false) + require.NotNil(t, job.Spec.ActiveDeadlineSeconds, + "a Job with no deadline cannot terminate itself on a pull failure") + assert.Greater(t, *job.Spec.ActiveDeadlineSeconds, int64(clusterValidatorTimeout/time.Second), + "the deadline must outlast the runner's own wait so it never truncates a live run") +} + +// The pull secret holds $oauthtoken:$NGC_API_KEY, and the deferred sweep is +// skipped whenever the pod may still be running, which is the pull-failure +// path. The orphan sweeper is its only other reclaim. +func TestSweepOrphanClusterValidatorRBAC_ReclaimsStalePullSecret(t *testing.T) { + old := metav1.NewTime(time.Now().Add(-time.Hour)) + stale := &corev1.Secret{ObjectMeta: metav1.ObjectMeta{ + Name: validatorPullSecretRoleName(clusterValidatorControlPlaneRole), + Namespace: clusterValidatorNamespace, + Labels: clusterValidatorLabels(), + CreationTimestamp: old, + }} + client := fake.NewSimpleClientset(stale) + sweepOrphanClusterValidatorRBAC(context.Background(), client, orphanValidatorRBACTTL) + + _, err := client.CoreV1().Secrets(clusterValidatorNamespace).Get( + context.Background(), stale.Name, metav1.GetOptions{}) + assert.True(t, apierrors.IsNotFound(err), "a stale managed pull secret must be reclaimed") +} + +// A fresh secret may belong to a concurrent run, and an operator-supplied one +// carries neither our labels nor our name. +func TestSweepOrphanClusterValidatorRBAC_SparesFreshAndUnmanagedSecrets(t *testing.T) { + fresh := &corev1.Secret{ObjectMeta: metav1.ObjectMeta{ + Name: validatorPullSecretRoleName(clusterValidatorControlPlaneRole), + Namespace: clusterValidatorNamespace, + Labels: clusterValidatorLabels(), + CreationTimestamp: metav1.NewTime(time.Now()), + }} + operator := &corev1.Secret{ObjectMeta: metav1.ObjectMeta{ + Name: "operator-pull", + Namespace: clusterValidatorNamespace, + Labels: clusterValidatorLabels(), + CreationTimestamp: metav1.NewTime(time.Now().Add(-time.Hour)), + }} + client := fake.NewSimpleClientset(fresh, operator) + sweepOrphanClusterValidatorRBAC(context.Background(), client, orphanValidatorRBACTTL) + + for _, name := range []string{fresh.Name, operator.Name} { + _, err := client.CoreV1().Secrets(clusterValidatorNamespace).Get( + context.Background(), name, metav1.GetOptions{}) + assert.NoError(t, err, "%s must survive the orphan sweep", name) + } +} + +// The preflight ConfigMap must not switch on active NetworkPolicy enforcement. +// VALIDATOR_PREFLIGHT only suppresses the summary write, so enforcement would +// still create namespaces, pods and NetworkPolicies and pull busybox from +// Docker Hub, on a cluster where nothing is installed yet. +func TestBuildControlPlaneValidatorConfig_EnforcementDisabledForPreflight(t *testing.T) { + cfg := buildControlPlaneValidatorConfig(nil) + idx := strings.Index(cfg, "enforcement:") + require.GreaterOrEqual(t, idx, 0, "the enforcement block must be present") + assert.Contains(t, cfg[idx:], "enabled: false", + "a read-only readiness check must not mutate the cluster or need Docker Hub") +} + +// --no-cleanup must outlast the orphan TTL. Without a preserve marker the +// orphan sweeper reclaims a deliberately kept run after 30 minutes, which +// makes the flag mean "keep for 30 minutes". +func TestSweepOrphanClusterValidatorRBAC_SparesPreservedObjects(t *testing.T) { + labels := clusterValidatorLabels() + labels[clusterValidatorPreserveLabel] = "true" + old := metav1.NewTime(time.Now().Add(-time.Hour)) + client := fake.NewSimpleClientset( + &rbacv1.ClusterRole{ObjectMeta: metav1.ObjectMeta{ + Name: clusterValidatorName + "-control-plane-abc", Labels: labels, CreationTimestamp: old, + }}, + &corev1.Secret{ObjectMeta: metav1.ObjectMeta{ + Name: validatorPullSecretRoleName(clusterValidatorControlPlaneRole), + Namespace: clusterValidatorNamespace, Labels: labels, CreationTimestamp: old, + }}, + ) + sweepOrphanClusterValidatorRBAC(context.Background(), client, orphanValidatorRBACTTL) + + _, err := client.RbacV1().ClusterRoles().Get(context.Background(), + clusterValidatorName+"-control-plane-abc", metav1.GetOptions{}) + assert.NoError(t, err, "a preserved ClusterRole must survive the orphan sweep") + _, err = client.CoreV1().Secrets(clusterValidatorNamespace).Get(context.Background(), + validatorPullSecretRoleName(clusterValidatorControlPlaneRole), metav1.GetOptions{}) + assert.NoError(t, err, "a preserved pull secret must survive the orphan sweep") +} + +// The preserve marker has to be applied at creation, not just honoured by the +// sweeper, or the mechanism is inert. +func TestEnsureClusterValidatorRBAC_LabelsPreservedRun(t *testing.T) { + client := fake.NewSimpleClientset() + require.NoError(t, ensureClusterValidatorRBAC(context.Background(), client, + clusterValidatorControlPlaneRole, "abc123", true)) + + cr, err := client.RbacV1().ClusterRoles().Get(context.Background(), + clusterValidatorRBACName(clusterValidatorControlPlaneRole, "abc123"), metav1.GetOptions{}) + require.NoError(t, err) + assert.Equal(t, "true", cr.Labels[clusterValidatorPreserveLabel], + "--no-cleanup must mark its objects so the orphan sweeper spares them") +} + +func TestEnsureClusterValidatorRBAC_NoPreserveLabelByDefault(t *testing.T) { + client := fake.NewSimpleClientset() + require.NoError(t, ensureClusterValidatorRBAC(context.Background(), client, + clusterValidatorControlPlaneRole, "abc123", false)) + + cr, err := client.RbacV1().ClusterRoles().Get(context.Background(), + clusterValidatorRBACName(clusterValidatorControlPlaneRole, "abc123"), metav1.GetOptions{}) + require.NoError(t, err) + assert.NotContains(t, cr.Labels, clusterValidatorPreserveLabel, + "an ordinary run must stay reclaimable") +} diff --git a/src/clis/nvcf-cli/internal/selfhosted/preflight.go b/src/clis/nvcf-cli/internal/selfhosted/preflight.go index 623c132c75..97285be354 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/preflight.go +++ b/src/clis/nvcf-cli/internal/selfhosted/preflight.go @@ -800,9 +800,16 @@ func staleNamespaceCheck(prober StaleNamespaceProber, kubeContext string, namesp // Argo, owns a healthy namespace with no owner=helm object. // Handing them "kubectl delete namespace cert-manager" would // destroy every Certificate and Issuer in the cluster. - hints = append(hints, - fmt.Sprintf("inspect these and remove them only after confirming they are unused: %s get all -n %s", - kctl, strings.Join(emptyShell, " -n "))) + // One command per namespace. kubectl takes a single + // namespace and keeps the last -n it sees, so joining them + // produces a command that silently inspects only the last one + // and reports the rest as empty, which is the opposite of what + // an operator deciding whether to delete them needs. + for _, ns := range emptyShell { + hints = append(hints, fmt.Sprintf( + "inspect %s and remove it only after confirming it is unused: %s get all -n %s", + ns, kctl, ns)) + } } // Only a namespace stuck Terminating blocks the run. "No Helm // release" is a heuristic over a conditionally-installed stack, so diff --git a/src/clis/nvcf-cli/internal/selfhosted/pullsecret.go b/src/clis/nvcf-cli/internal/selfhosted/pullsecret.go index 5904679b98..5309838f4b 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/pullsecret.go +++ b/src/clis/nvcf-cli/internal/selfhosted/pullsecret.go @@ -115,6 +115,7 @@ func resolveValidatorPullSecret( ctx context.Context, client kubernetes.Interface, provided, image, role string, + preserve bool, ) (string, error) { if provided != "" { return provided, nil @@ -127,13 +128,13 @@ func resolveValidatorPullSecret( scanCtx, cancel := context.WithTimeout(ctx, validatorPullSecretScanTimeout) defer cancel() - if name, err := scanAndMirrorPullSecret(scanCtx, client, registry, role); err != nil { + if name, err := scanAndMirrorPullSecret(scanCtx, client, registry, role, preserve); err != nil { return "", err } else if name != "" { return name, nil } - if name, err := autoCreatePullSecretFromEnv(scanCtx, client, registry, role); err != nil { + if name, err := autoCreatePullSecretFromEnv(scanCtx, client, registry, role, preserve); err != nil { return "", err } else if name != "" { return name, nil @@ -165,7 +166,7 @@ func parseRegistryFromImage(image string) string { // registry. Mirrors the body into clusterValidatorNamespace when the match // lives elsewhere, so the Job can reference the secret without cross-namespace // lookups. -func scanAndMirrorPullSecret(ctx context.Context, client kubernetes.Interface, registry, role string) (string, error) { +func scanAndMirrorPullSecret(ctx context.Context, client kubernetes.Interface, registry, role string, preserve bool) (string, error) { for _, ns := range validatorPullSecretSearchNamespaces { // Filter client-side rather than via FieldSelector: server-side // type= selector on Secrets is only honored from k8s 1.27 onward. @@ -201,7 +202,7 @@ func scanAndMirrorPullSecret(ctx context.Context, client kubernetes.Interface, r // the destination namespace, and writeDockerConfigSecret's // delete-and-recreate path would otherwise destroy that // secret on type mismatch. - if err := writeDockerConfigSecret(ctx, client, clusterValidatorNamespace, validatorPullSecretRoleName(role), role, cfg); err != nil { + if err := writeDockerConfigSecret(ctx, client, clusterValidatorNamespace, validatorPullSecretRoleName(role), role, cfg, preserve); err != nil { return "", fmt.Errorf("mirror pull secret %s/%s to %s/%s: %w", s.Namespace, s.Name, clusterValidatorNamespace, validatorPullSecretRoleName(role), err) } @@ -222,7 +223,7 @@ func dockerConfigHasRegistry(cfg []byte, registry string) bool { return ok } -func autoCreatePullSecretFromEnv(ctx context.Context, client kubernetes.Interface, registry, role string) (string, error) { +func autoCreatePullSecretFromEnv(ctx context.Context, client kubernetes.Interface, registry, role string, preserve bool) (string, error) { apiKey := firstNonEmptyEnv(ngcAPIKeyEnvNames...) if apiKey == "" { return "", nil @@ -240,7 +241,7 @@ func autoCreatePullSecretFromEnv(ctx context.Context, client kubernetes.Interfac if err != nil { return "", fmt.Errorf("encode dockerconfigjson for %s: %w", registry, err) } - if err := writeDockerConfigSecret(ctx, client, clusterValidatorNamespace, validatorPullSecretRoleName(role), role, cfg); err != nil { + if err := writeDockerConfigSecret(ctx, client, clusterValidatorNamespace, validatorPullSecretRoleName(role), role, cfg, preserve); err != nil { return "", fmt.Errorf("auto-create pull secret %s/%s: %w", clusterValidatorNamespace, validatorPullSecretRoleName(role), err) } @@ -275,8 +276,8 @@ func buildDockerConfigJSON(registry, username, password string) ([]byte, error) // Mirrors cmd/self_hosted_up.go's ensureDockerConfigSecret. Attaches the // CLI's managed-by labels so a future cleanup path can identify resources // to remove. -func writeDockerConfigSecret(ctx context.Context, client kubernetes.Interface, namespace, name, role string, dockerConfig []byte) error { - labels := clusterValidatorRoleLabels(role) +func writeDockerConfigSecret(ctx context.Context, client kubernetes.Interface, namespace, name, role string, dockerConfig []byte, preserve bool) error { + labels := clusterValidatorRoleLabelsPreserved(role, preserve) secrets := client.CoreV1().Secrets(namespace) secret := &corev1.Secret{ ObjectMeta: metav1.ObjectMeta{ diff --git a/src/clis/nvcf-cli/internal/selfhosted/pullsecret_test.go b/src/clis/nvcf-cli/internal/selfhosted/pullsecret_test.go index f3d7e7354a..aa0b5227e7 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/pullsecret_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/pullsecret_test.go @@ -139,7 +139,7 @@ func TestWriteDockerConfigSecret_Create(t *testing.T) { client := fake.NewSimpleClientset() cfg := dockerConfigBlob(t, "private.registry.test", "$oauthtoken", "key") - require.NoError(t, writeDockerConfigSecret(context.Background(), client, "default", "nvcr-pull-secret", clusterValidatorControlPlaneRole, cfg)) + require.NoError(t, writeDockerConfigSecret(context.Background(), client, "default", "nvcr-pull-secret", clusterValidatorControlPlaneRole, cfg, false), false) got, err := client.CoreV1().Secrets("default").Get(context.Background(), "nvcr-pull-secret", metav1.GetOptions{}) require.NoError(t, err) @@ -168,7 +168,7 @@ func TestWriteDockerConfigSecret_Update(t *testing.T) { Data: map[string][]byte{corev1.DockerConfigJsonKey: old}, }) - require.NoError(t, writeDockerConfigSecret(context.Background(), client, "default", "nvcr-pull-secret", clusterValidatorControlPlaneRole, fresh)) + require.NoError(t, writeDockerConfigSecret(context.Background(), client, "default", "nvcr-pull-secret", clusterValidatorControlPlaneRole, fresh, false), false) got, _ := client.CoreV1().Secrets("default").Get(context.Background(), "nvcr-pull-secret", metav1.GetOptions{}) assert.Equal(t, fresh, got.Data[corev1.DockerConfigJsonKey], "data must be updated to the fresh body") @@ -191,7 +191,7 @@ func TestWriteDockerConfigSecret_TypeMismatchReplaces(t *testing.T) { Data: map[string][]byte{"some-key": []byte("some-value")}, }) - require.NoError(t, writeDockerConfigSecret(context.Background(), client, "default", "nvcr-pull-secret", clusterValidatorControlPlaneRole, fresh)) + require.NoError(t, writeDockerConfigSecret(context.Background(), client, "default", "nvcr-pull-secret", clusterValidatorControlPlaneRole, fresh, false), false) got, err := client.CoreV1().Secrets("default").Get(context.Background(), "nvcr-pull-secret", metav1.GetOptions{}) require.NoError(t, err) @@ -217,7 +217,7 @@ func TestWriteDockerConfigSecret_TypeMismatchRefusesUnlabeledSecret(t *testing.T Data: map[string][]byte{"operator-payload": operatorPayload}, }) - err := writeDockerConfigSecret(context.Background(), client, "default", "nvcr-pull-secret", clusterValidatorControlPlaneRole, fresh) + err := writeDockerConfigSecret(context.Background(), client, "default", "nvcr-pull-secret", clusterValidatorControlPlaneRole, fresh, false) require.Error(t, err, "must refuse to destroy a non-CLI-managed secret") assert.Contains(t, err.Error(), "not managed by nvcf-cli") @@ -236,7 +236,7 @@ func TestScanAndMirrorPullSecret_FoundInDefault(t *testing.T) { Data: map[string][]byte{corev1.DockerConfigJsonKey: cfg}, }) - name, err := scanAndMirrorPullSecret(context.Background(), client, "private.registry.test", clusterValidatorControlPlaneRole) + name, err := scanAndMirrorPullSecret(context.Background(), client, "private.registry.test", clusterValidatorControlPlaneRole, false) require.NoError(t, err) assert.Equal(t, "operator-secret", name) @@ -257,7 +257,7 @@ func TestScanAndMirrorPullSecret_FoundInNvcfMirroredToDefault(t *testing.T) { Data: map[string][]byte{corev1.DockerConfigJsonKey: cfg}, }) - name, err := scanAndMirrorPullSecret(context.Background(), client, "private.registry.test", clusterValidatorControlPlaneRole) + name, err := scanAndMirrorPullSecret(context.Background(), client, "private.registry.test", clusterValidatorControlPlaneRole, false) require.NoError(t, err) assert.Equal(t, validatorPullSecretRoleName(clusterValidatorControlPlaneRole), name) @@ -279,14 +279,14 @@ func TestScanAndMirrorPullSecret_RegistryMismatch(t *testing.T) { Data: map[string][]byte{corev1.DockerConfigJsonKey: cfg}, }) - name, err := scanAndMirrorPullSecret(context.Background(), client, "private.registry.test", clusterValidatorControlPlaneRole) + name, err := scanAndMirrorPullSecret(context.Background(), client, "private.registry.test", clusterValidatorControlPlaneRole, false) require.NoError(t, err) assert.Equal(t, "", name, "secret for a different registry must not match") } func TestScanAndMirrorPullSecret_NoSecrets(t *testing.T) { client := fake.NewSimpleClientset() - name, err := scanAndMirrorPullSecret(context.Background(), client, "private.registry.test", clusterValidatorControlPlaneRole) + name, err := scanAndMirrorPullSecret(context.Background(), client, "private.registry.test", clusterValidatorControlPlaneRole, false) require.NoError(t, err) assert.Equal(t, "", name) } @@ -306,7 +306,7 @@ func TestScanAndMirrorPullSecret_PrefersDefaultNamespace(t *testing.T) { }, ) - name, err := scanAndMirrorPullSecret(context.Background(), client, "private.registry.test", clusterValidatorControlPlaneRole) + name, err := scanAndMirrorPullSecret(context.Background(), client, "private.registry.test", clusterValidatorControlPlaneRole, false) require.NoError(t, err) assert.Equal(t, "in-default", name) } @@ -318,7 +318,7 @@ func TestAutoCreatePullSecretFromEnv_NoEnv(t *testing.T) { } client := fake.NewSimpleClientset() - got, err := autoCreatePullSecretFromEnv(context.Background(), client, "private.registry.test", clusterValidatorControlPlaneRole) + got, err := autoCreatePullSecretFromEnv(context.Background(), client, "private.registry.test", clusterValidatorControlPlaneRole, false) require.NoError(t, err) assert.Equal(t, "", got, "no env var set means no secret minted") @@ -333,7 +333,7 @@ func TestAutoCreatePullSecretFromEnv_KeyPresent(t *testing.T) { t.Setenv("NGC_API_KEY", "nvapi-test-123") client := fake.NewSimpleClientset() - got, err := autoCreatePullSecretFromEnv(context.Background(), client, "nvcr.io", clusterValidatorControlPlaneRole) + got, err := autoCreatePullSecretFromEnv(context.Background(), client, "nvcr.io", clusterValidatorControlPlaneRole, false) require.NoError(t, err) assert.Equal(t, validatorPullSecretRoleName(clusterValidatorControlPlaneRole), got) @@ -345,7 +345,7 @@ func TestAutoCreatePullSecretFromEnv_KeyPresent(t *testing.T) { func TestResolveValidatorPullSecret_FlagOverride(t *testing.T) { client := fake.NewSimpleClientset() - got, err := resolveValidatorPullSecret(context.Background(), client, "custom-secret", "private.registry.test/nvidia/nvcf-byoc/cluster-validator:rc26", clusterValidatorControlPlaneRole) + got, err := resolveValidatorPullSecret(context.Background(), client, "custom-secret", "private.registry.test/nvidia/nvcf-byoc/cluster-validator:rc26", clusterValidatorControlPlaneRole, false) require.NoError(t, err) assert.Equal(t, "custom-secret", got, "explicit override always wins") @@ -365,7 +365,7 @@ func TestResolveValidatorPullSecret_ScanWins(t *testing.T) { Data: map[string][]byte{corev1.DockerConfigJsonKey: cfg}, }) - got, err := resolveValidatorPullSecret(context.Background(), client, "", "private.registry.test/nvidia/nvcf-byoc/cluster-validator:rc26", clusterValidatorControlPlaneRole) + got, err := resolveValidatorPullSecret(context.Background(), client, "", "private.registry.test/nvidia/nvcf-byoc/cluster-validator:rc26", clusterValidatorControlPlaneRole, false) require.NoError(t, err) // Mirror destination is the validator's well-known name, not the // source secret's name (avoids same-name collisions with operator @@ -384,7 +384,7 @@ func TestResolveValidatorPullSecret_EnvFallback(t *testing.T) { t.Setenv("NVCF_NGC_API_KEY", "nvapi-fallback") client := fake.NewSimpleClientset() - got, err := resolveValidatorPullSecret(context.Background(), client, "", "nvcr.io/nvidia/nvcf-byoc/cluster-validator:rc26", clusterValidatorControlPlaneRole) + got, err := resolveValidatorPullSecret(context.Background(), client, "", "nvcr.io/nvidia/nvcf-byoc/cluster-validator:rc26", clusterValidatorControlPlaneRole, false) require.NoError(t, err) assert.Equal(t, validatorPullSecretRoleName(clusterValidatorControlPlaneRole), got) @@ -403,7 +403,7 @@ func TestResolveValidatorPullSecret_EnvFallbackRefusesMirroredRegistry(t *testin client := fake.NewSimpleClientset() got, err := resolveValidatorPullSecret(context.Background(), client, "", - "private.registry.test/nvidia/nvcf-byoc/cluster-validator:rc26", clusterValidatorControlPlaneRole) + "private.registry.test/nvidia/nvcf-byoc/cluster-validator:rc26", clusterValidatorControlPlaneRole, false) require.NoError(t, err) assert.Empty(t, got, "no secret may be minted for a non-NGC registry") } @@ -414,7 +414,7 @@ func TestResolveValidatorPullSecret_AllEmpty(t *testing.T) { } client := fake.NewSimpleClientset() - got, err := resolveValidatorPullSecret(context.Background(), client, "", "private.registry.test/nvidia/nvcf-byoc/cluster-validator:rc26", clusterValidatorControlPlaneRole) + got, err := resolveValidatorPullSecret(context.Background(), client, "", "private.registry.test/nvidia/nvcf-byoc/cluster-validator:rc26", clusterValidatorControlPlaneRole, false) require.NoError(t, err) assert.Equal(t, "", got, "no override, no scan match, no env var -> empty so kubelet surfaces ImagePullBackOff") } @@ -425,7 +425,7 @@ func TestResolveValidatorPullSecret_UnparsableImage(t *testing.T) { } client := fake.NewSimpleClientset() - got, err := resolveValidatorPullSecret(context.Background(), client, "", "bareimage", clusterValidatorControlPlaneRole) + got, err := resolveValidatorPullSecret(context.Background(), client, "", "bareimage", clusterValidatorControlPlaneRole, false) require.NoError(t, err) assert.Equal(t, "", got, "no registry hostname means no scan target and no auto-create") @@ -450,12 +450,12 @@ func TestManagedPullSecret_IsScopedPerRole(t *testing.T) { cfg := dockerConfigBlob(t, "private.registry.test", "user", "pass") client := fake.NewSimpleClientset() require.NoError(t, writeDockerConfigSecret(ctx, client, clusterValidatorNamespace, - cpName, clusterValidatorControlPlaneRole, cfg)) + cpName, clusterValidatorControlPlaneRole, cfg, false)) require.NoError(t, writeDockerConfigSecret(ctx, client, clusterValidatorNamespace, - gpuName, "compute-plane", cfg)) + gpuName, "compute-plane", cfg, false)) // Our labels, but not a name we generate: must survive. require.NoError(t, writeDockerConfigSecret(ctx, client, clusterValidatorNamespace, - "operator-owned-secret", clusterValidatorControlPlaneRole, cfg)) + "operator-owned-secret", clusterValidatorControlPlaneRole, cfg, false)) sweepManagedPullSecrets(ctx, client, clusterValidatorControlPlaneRole) @@ -481,7 +481,7 @@ func TestManagedPullSecret_LabelsMatchOnlyItsOwnRole(t *testing.T) { cfg := dockerConfigBlob(t, "private.registry.test", "user", "pass") require.NoError(t, writeDockerConfigSecret(ctx, client, clusterValidatorNamespace, validatorPullSecretRoleName(clusterValidatorControlPlaneRole), - clusterValidatorControlPlaneRole, cfg)) + clusterValidatorControlPlaneRole, cfg, false)) got, err := client.CoreV1().Secrets(clusterValidatorNamespace).Get(ctx, validatorPullSecretRoleName(clusterValidatorControlPlaneRole), metav1.GetOptions{}) @@ -513,7 +513,7 @@ func TestWriteDockerConfigSecret_RefusesUnmanagedSameTypeSecret(t *testing.T) { }) err := writeDockerConfigSecret(ctx, client, clusterValidatorNamespace, - "nvcf-preflight-pull-secret-control-plane", clusterValidatorControlPlaneRole, ours) + "nvcf-preflight-pull-secret-control-plane", clusterValidatorControlPlaneRole, ours, false) require.Error(t, err, "an unmanaged secret of the same type must not be overwritten") assert.Contains(t, err.Error(), "not managed by nvcf-cli") @@ -568,7 +568,7 @@ func TestWriteDockerConfigSecret_RefusesUnmanagedAfterCreateRace(t *testing.T) { }) err := writeDockerConfigSecret(ctx, client, clusterValidatorNamespace, name, - clusterValidatorControlPlaneRole, ours) + clusterValidatorControlPlaneRole, ours, false) require.Error(t, err, "losing the create race to an unmanaged secret must not overwrite it") assert.Contains(t, err.Error(), "not managed by nvcf-cli") @@ -599,7 +599,7 @@ func TestWriteDockerConfigSecret_TypeMismatchDeletePinsTheInspectedObject(t *tes }) require.NoError(t, writeDockerConfigSecret(context.Background(), client, "default", - "nvcr-pull-secret", clusterValidatorControlPlaneRole, fresh)) + "nvcr-pull-secret", clusterValidatorControlPlaneRole, fresh, false), false) require.NotNil(t, opts.Preconditions, "delete must carry preconditions") require.NotNil(t, opts.Preconditions.UID) @@ -635,7 +635,7 @@ func TestWriteDockerConfigSecret_TypeMismatchStopsOnDeleteConflict(t *testing.T) }) err := writeDockerConfigSecret(context.Background(), client, "default", - "nvcr-pull-secret", clusterValidatorControlPlaneRole, fresh) + "nvcr-pull-secret", clusterValidatorControlPlaneRole, fresh, false) require.Error(t, err, "a changed object must abort the replace") assert.False(t, created, "must not create over an object that was never vetted") } @@ -649,7 +649,7 @@ func TestAutoCreatePullSecretFromEnv_RefusesNonNGCRegistry(t *testing.T) { client := fake.NewSimpleClientset() name, err := autoCreatePullSecretFromEnv(context.Background(), client, - "ghcr.io", clusterValidatorControlPlaneRole) + "ghcr.io", clusterValidatorControlPlaneRole, false) require.NoError(t, err) assert.Empty(t, name, "no secret may be minted for a non-NGC registry") @@ -676,7 +676,7 @@ func TestScanAndMirrorPullSecret_DoesNotAdoptTheOtherRolesSecret(t *testing.T) { client := fake.NewSimpleClientset(otherRole) got, err := scanAndMirrorPullSecret(context.Background(), client, "nvcr.io", - clusterValidatorComputePlaneRole) + clusterValidatorComputePlaneRole, false) require.NoError(t, err) assert.NotEqual(t, otherRole.Name, got, "the compute role must not adopt the control-plane role's managed Secret") @@ -694,7 +694,7 @@ func TestScanAndMirrorPullSecret_AdoptsOperatorSuppliedSecret(t *testing.T) { client := fake.NewSimpleClientset(operator) got, err := scanAndMirrorPullSecret(context.Background(), client, "nvcr.io", - clusterValidatorComputePlaneRole) + clusterValidatorComputePlaneRole, false) require.NoError(t, err) assert.Equal(t, "operator-pull", got) } @@ -714,7 +714,7 @@ func TestScanAndMirrorPullSecret_AdoptsOwnRoleSecret(t *testing.T) { client := fake.NewSimpleClientset(own) got, err := scanAndMirrorPullSecret(context.Background(), client, "nvcr.io", - clusterValidatorComputePlaneRole) + clusterValidatorComputePlaneRole, false) require.NoError(t, err) assert.Equal(t, own.Name, got) } diff --git a/src/clis/nvcf-cli/internal/selfhosted/stack_namespaces_test.go b/src/clis/nvcf-cli/internal/selfhosted/stack_namespaces_test.go index b5319c20f2..236e0102fd 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/stack_namespaces_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/stack_namespaces_test.go @@ -108,9 +108,13 @@ func TestStackReleaseNamespaces_UnreadableFragmentYieldsNothing(t *testing.T) { "01.yaml.gotmpl": "releases:\n - name: a\n namespace: one\n", "02.yaml.gotmpl": "releases:\n - name: b\n namespace: two\n", }) + // A directory, not a chmod 000 file: root bypasses the permission bits, so + // a mode-based fixture passes locally and fails in CI, where tests run as + // root. os.ReadFile returns EISDIR for every UID, so the test means the + // same thing everywhere rather than being skipped where it matters most. unreadable := filepath.Join(dir, "helmfile.d", "02.yaml.gotmpl") - require.NoError(t, os.Chmod(unreadable, 0o000)) - t.Cleanup(func() { _ = os.Chmod(unreadable, 0o600) }) + require.NoError(t, os.Remove(unreadable)) + require.NoError(t, os.Mkdir(unreadable, 0o755)) assert.Nil(t, stackReleaseNamespaces(dir), "a partial parse must not masquerade as the stack's full namespace set") diff --git a/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go index 6278985c93..e99a06868f 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/stale_namespace_test.go @@ -449,3 +449,22 @@ func TestStaleNamespaceCheck_TerminatingIsStillAnError(t *testing.T) { r := staleNamespaceCheck(prober, "", []string{"nvcf"}).Run(context.Background()) assert.Equal(t, SeverityError, r.Severity) } + +// kubectl keeps only the last -n it is given, so a joined command inspects one +// namespace and reports the rest as empty, which is the opposite of what an +// operator deciding whether to delete them needs. +func TestStaleNamespaceCheck_HintsOneCommandPerNamespace(t *testing.T) { + pinCurrentKubeContext(t, "") + prober := func(_ context.Context, _ string, _ []string) ([]StaleNamespace, error) { + return []StaleNamespace{ + {Name: "api-keys", Reason: "no Helm release"}, + {Name: "ess", Reason: "no Helm release"}, + }, nil + } + r := staleNamespaceCheck(prober, "", []string{"api-keys", "ess"}).Run(context.Background()) + + assert.NotContains(t, r.Message, "-n api-keys -n ess", + "a joined namespace list silently inspects only the last one") + assert.Contains(t, r.Message, "get all -n api-keys") + assert.Contains(t, r.Message, "get all -n ess") +} From 937c88d4288e9d793ac761ed96b8293eaa90b692 Mon Sep 17 00:00:00 2001 From: rohithb Date: Tue, 22 Sep 2026 18:10:09 +0530 Subject: [PATCH 34/36] docs(nvcf-cli): give isBareRegistryHost and isNGCRegistry their own doc comments An earlier insertion landed isBareRegistryHost's doc inside isNGCRegistry's comment block, leaving one function undocumented and the other described by two stacked paragraphs. Same insertion-before-anchor pattern fixed elsewhere in this branch; no behaviour change. --- .../nvcf-cli/internal/selfhosted/validatortag.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/clis/nvcf-cli/internal/selfhosted/validatortag.go b/src/clis/nvcf-cli/internal/selfhosted/validatortag.go index 6b96684eee..59de253e63 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/validatortag.go +++ b/src/clis/nvcf-cli/internal/selfhosted/validatortag.go @@ -436,6 +436,14 @@ var ngcApprovedHosts = []string{ ".ngc.nvidia", } +// isBareRegistryHost reports whether s is a plain host[:port], with nothing in +// it that could move the request somewhere else once concatenated into a URL. +// +// This matters because the registry string is interpolated directly into +// "https://" + registry + "/...". A value like "evil.com/x.nvcr.io" ends with a +// trusted suffix but parses to host evil.com, so a suffix check alone would +// authorize sending credentials to an attacker. IPv6 literals keep their +// brackets and are allowed. func isBareRegistryHost(s string) bool { if s == "" { return false @@ -457,14 +465,6 @@ func isBareRegistryHost(s string) bool { // domain. The check strips any port from the registry string before matching // so that nvcr.io:443 is handled correctly, and uses dot-boundary matching to // reject deceptive suffixes such as evilnvcr.io or nvidia.com.invalid. -// isBareRegistryHost reports whether s is a plain host[:port], with nothing in -// it that could move the request somewhere else once concatenated into a URL. -// -// This matters because the registry string is interpolated directly into -// "https://" + registry + "/...". A value like "evil.com/x.nvcr.io" ends with a -// trusted suffix but parses to host evil.com, so a suffix check alone would -// authorize sending credentials to an attacker. IPv6 literals keep their -// brackets and are allowed. func isNGCRegistry(registry string) bool { // Never treat a value we cannot safely place in a URL as an NGC host: the // caller uses this to decide whether to forward the NGC API key. From fe418ddf01b1af00ef0206623635526030596e08 Mon Sep 17 00:00:00 2001 From: rohithb Date: Tue, 22 Sep 2026 18:10:39 +0530 Subject: [PATCH 35/36] fix(nvcf-cli): scope the validator's pull secret and config to one run The pull Secret and the network-checks ConfigMap were both created under predictable names and owned by labels alone. The managed labels are three public constants, so anyone able to create objects in the validator's namespace could pre-create either name wearing those labels, pass the ownership check, and receive whatever the run wrote there. For the Secret that is the NGC credential. Both names now carry the run's unguessable suffix, matching what the RBAC objects already did, and the Secret write is create-only: nothing this CLI created can hold a name it just generated, so an AlreadyExists means another object does and erroring beats overwriting. That removed the last caller of refuseIfUnmanaged, which is deleted here. Run-scoping also removes two lifetime conflicts. Two overlapping commands no longer share one ConfigMap, where the first to finish deleted config the other pod had not read yet; and a sweep can no longer delete a Secret another run selected. The orphan sweeper gains Secret and ConfigMap arms, because run-scoped names removed the accidental self-healing a fixed name gave us: a killed run used to leave one object the next run overwrote, and would now leave one per run, per --wait poll. Also here: the Job carries activeDeadlineSeconds, so an ImagePullBackOff can reach a terminal state and its TTL can fire rather than leaking the Job, its cluster-wide RBAC and its pull secret indefinitely; --no-cleanup marks every object it preserves so the orphan sweeper spares them instead of reclaiming a deliberately kept run after 30 minutes; and enforcement is disabled in the preflight template, since a readiness check should not create namespaces, pods and NetworkPolicies or need Docker Hub egress before anything is installed. --- .../internal/selfhosted/clustervalidator.go | 115 +++-- .../selfhosted/clustervalidator_test.go | 108 ++++- .../internal/selfhosted/pullsecret.go | 164 ++----- .../internal/selfhosted/pullsecret_test.go | 403 +++++------------- 4 files changed, 343 insertions(+), 447 deletions(-) diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go index 7ce77715cd..307c599c43 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go @@ -137,9 +137,24 @@ func runClusterValidator(ctx context.Context, client kubernetes.Interface, image // inside it reclaiming them breaks the pod that is still running. podMayBeRunning := false + // Random per-run identity. Every object this run creates carries it, so a + // predictable name cannot be pre-created by someone else and then either + // bound to the validator's cluster-wide permissions or overwritten with the + // NGC credential. Generated before anything is created, because the pull + // secret name needs it too. + runID, err := newValidatorRunID() + if err != nil { + return ClusterValidatorResult{Err: err} + } + + // Reclaim leftovers from dead runs before resolving this run's pull secret, + // not after: the sweep matches on the shared name prefix, so running it + // later can delete the Secret this run just selected. + sweepOrphanClusterValidatorRBAC(vctx, client, orphanValidatorRBACTTL) + // Resolver errors are non-fatal: fall through to the caller's value and // let waitForClusterValidatorJob surface ImagePullBackOff if needed. - if resolved, err := resolveValidatorPullSecret(ctx, client, pullSecret, image, role, noCleanup); err == nil { + if resolved, err := resolveValidatorPullSecret(ctx, client, pullSecret, image, role, runID, noCleanup); err == nil { pullSecret = resolved } // Sweep only this role's managed pull secret, and only once the pod can no @@ -153,17 +168,10 @@ func runClusterValidator(ctx context.Context, client kubernetes.Interface, image // per-role secret scoping exists to prevent. defer func() { if !noCleanup && !podMayBeRunning { - sweepManagedPullSecrets(context.Background(), client, role) + sweepManagedPullSecrets(context.Background(), client, role, runID) } }() - // Random per-run identity for the SA/ClusterRole/ClusterRoleBinding, so a - // predictable name cannot be pre-created by someone else and then bound to - // the validator's cluster-wide permissions. - runID, err := newValidatorRunID() - if err != nil { - return ClusterValidatorResult{Err: err} - } // Register the cleanup before the bootstrap, not after. ensureClusterValidatorRBAC // creates three objects in sequence and returns on the first failure, so a // kubeconfig that can create a ServiceAccount but not a cluster-scoped @@ -193,10 +201,10 @@ func runClusterValidator(ctx context.Context, client kubernetes.Interface, image // operator asked to keep the run's artifacts. defer func() { if !noCleanup && !podMayBeRunning { - sweepClusterValidatorConfig(context.Background(), client) + sweepClusterValidatorConfig(context.Background(), client, runID) } }() - if err := ensureClusterValidatorConfig(vctx, client, registries); err != nil { + if err := ensureClusterValidatorConfig(vctx, client, registries, runID, noCleanup); err != nil { // Non-fatal: continue without the ConfigMap; the validator skips // configurable reachability and enforcement checks silently unless // we surface this note in the transcript. @@ -204,7 +212,6 @@ func runClusterValidator(ctx context.Context, client kubernetes.Interface, image } } - sweepOrphanClusterValidatorRBAC(vctx, client, orphanValidatorRBACTTL) // Skipped under --no-cleanup: this runs before the new Job is created, so // otherwise the next same-role run destroys the Job the operator asked to // keep. The singleton guarantee is worth less than the artifact they kept. @@ -359,13 +366,38 @@ func clusterValidatorRoleLabelsPreserved(role string, preserve bool) map[string] // should read. Only the control-plane role has one; the compute-plane role gets // a sentinel that resolves to nothing so it cannot inherit the control-plane's // reachability and enforcement config. -func validatorConfigNameForRole(role string) string { +func validatorConfigNameForRole(role, runID string) string { if role == clusterValidatorControlPlaneRole { - return clusterValidatorConfigName + return clusterValidatorConfigRunName(runID) } return clusterValidatorNoConfigName } +// clusterValidatorConfigLabels are the managed labels for the network-checks +// ConfigMap, plus the preserve marker when the run was asked to keep its +// artifacts. Without the marker the next run's orphan sweeper reclaims the +// ConfigMap once it is older than the TTL, and an operator re-running a Job +// they deliberately kept gets a validator that silently skips the configurable +// reachability and enforcement checks. +func clusterValidatorConfigLabels(preserve bool) map[string]string { + l := clusterValidatorLabels() + if preserve { + l[clusterValidatorPreserveLabel] = "true" + } + return l +} + +// clusterValidatorConfigRunName scopes the network-checks ConfigMap to one run. +// A shared name lets two overlapping commands overwrite each other's registry +// list, and lets the first to finish delete the config the other pod has not +// read yet. +func clusterValidatorConfigRunName(runID string) string { + if runID == "" { + return clusterValidatorConfigName + } + return clusterValidatorConfigName + "-" + runID +} + // sweepOrphanClusterValidatorRBAC removes validator RBAC left behind by a run // that died before its deferred cleanup (SIGKILL, OOM, lost terminal). // @@ -382,6 +414,18 @@ func sweepOrphanClusterValidatorRBAC(ctx context.Context, client kubernetes.Inte // reclaimable requires the generated name as well as the labels and the // age. Labels alone are three public constants and can be copied onto // anything, and this deletes cluster-scoped objects with errors swallowed. + // Network-check ConfigMaps carry their own generated-name prefix. + reclaimableConfig := func(o metav1.Object) bool { + if !strings.HasPrefix(o.GetName(), clusterValidatorConfigName) { + return false + } + if o.GetLabels()[clusterValidatorPreserveLabel] == "true" { + return false + } + ts := o.GetCreationTimestamp() + return ts.Before(&cutoff) + } + // Pull secrets carry the other generated-name prefix. reclaimableSecret := func(o metav1.Object) bool { if !strings.HasPrefix(o.GetName(), validatorPullSecretName) { @@ -419,6 +463,19 @@ func sweepOrphanClusterValidatorRBAC(ctx context.Context, client kubernetes.Inte } } } + // Network-check ConfigMaps too. Run-scoping the name removed the accidental + // self-healing the fixed name gave us: a killed run used to leave exactly + // one object that the next run overwrote, and now each leaves its own, so + // under --wait they accumulate per poll. Same shape as the RBAC objects. + cms := client.CoreV1().ConfigMaps(clusterValidatorNamespace) + if l, err := cms.List(ctx, opts); err == nil { + for i := range l.Items { + if o := &l.Items[i]; reclaimableConfig(o) { + _ = cms.Delete(ctx, o.Name, deleteExactly(o)) + } + } + } + // Pull secrets too: the deferred sweep is suppressed whenever the pod may // still be running, and that is exactly the ImagePullBackOff path, so // without this arm a Secret holding $oauthtoken:$NGC_API_KEY is the one @@ -500,7 +557,7 @@ func sweepPriorClusterValidatorJobs(ctx context.Context, client kubernetes.Inter // Operator-supplied secrets via --cluster-validator-pull-secret aren't // labeled by us and are skipped by the selector. Errors are swallowed: // failing to clean up is preferable to failing the check itself. -func sweepManagedPullSecrets(ctx context.Context, client kubernetes.Interface, role string) { +func sweepManagedPullSecrets(ctx context.Context, client kubernetes.Interface, role, runID string) { // Same reasoning as sweepPriorClusterValidatorJobs: the generated name is // part of the ownership test, not just the labels. secrets := client.CoreV1().Secrets(clusterValidatorNamespace) @@ -509,7 +566,9 @@ func sweepManagedPullSecrets(ctx context.Context, client kubernetes.Interface, r return } for i := range l.Items { - if !strings.HasPrefix(l.Items[i].Name, validatorPullSecretName) { + // Only this run's Secret. The name is unguessable and unique per run, + // so a sweep can no longer take out a Secret another run selected. + if l.Items[i].Name != validatorPullSecretRunName(role, runID) { continue } _ = secrets.Delete(ctx, l.Items[i].Name, deleteExactly(&l.Items[i])) @@ -610,18 +669,18 @@ enforcement: // ensureClusterValidatorConfig creates or updates the network-check ConfigMap. // extraRegistries are added as non-critical tcp+tls probes. Best-effort: the // validator skips configurable checks when the ConfigMap is absent. -func ensureClusterValidatorConfig(ctx context.Context, client kubernetes.Interface, extraRegistries []string) error { +func ensureClusterValidatorConfig(ctx context.Context, client kubernetes.Interface, extraRegistries []string, runID string, preserve bool) error { content := buildControlPlaneValidatorConfig(extraRegistries) desired := &corev1.ConfigMap{ ObjectMeta: metav1.ObjectMeta{ - Name: clusterValidatorConfigName, + Name: clusterValidatorConfigRunName(runID), Namespace: clusterValidatorNamespace, - Labels: clusterValidatorLabels(), + Labels: clusterValidatorConfigLabels(preserve), }, Data: map[string]string{"config.yaml": content}, } - existing, err := client.CoreV1().ConfigMaps(clusterValidatorNamespace).Get(ctx, clusterValidatorConfigName, metav1.GetOptions{}) + existing, err := client.CoreV1().ConfigMaps(clusterValidatorNamespace).Get(ctx, clusterValidatorConfigRunName(runID), metav1.GetOptions{}) if err != nil { if !apierrors.IsNotFound(err) { return fmt.Errorf("get validator config ConfigMap: %w", err) @@ -637,7 +696,7 @@ func ensureClusterValidatorConfig(ctx context.Context, client kubernetes.Interfa if !hasValidatorManagedLabels(existing.Labels) { return fmt.Errorf( "refusing to overwrite ConfigMap %s/%s which is not managed by nvcf-cli", - clusterValidatorNamespace, clusterValidatorConfigName) + clusterValidatorNamespace, clusterValidatorConfigRunName(runID)) } existing.Data = desired.Data existing.Labels = desired.Labels @@ -757,7 +816,7 @@ func buildClusterValidatorJob(name, image, pullSecret, role, runID string, noCle // default name, so both roles would resolve the same ConfigMap // and the compute-plane preflight would silently run the // control-plane's active NetworkPolicy enforcement. - {Name: "VALIDATOR_CONFIG_NAME", Value: validatorConfigNameForRole(role)}, + {Name: "VALIDATOR_CONFIG_NAME", Value: validatorConfigNameForRole(role, runID)}, {Name: "VALIDATOR_PREFLIGHT", Value: "true"}, {Name: "VALIDATOR_ROLE", Value: role}, }, @@ -939,15 +998,17 @@ func kubectlLogsHint(kubeContext, jobName string) string { } // sweepClusterValidatorConfig removes the network-checks ConfigMap this run -// created. Only ours: the name is a constant an operator could also be using, -// so the managed labels decide. Errors are swallowed, as with the other sweeps. -func sweepClusterValidatorConfig(ctx context.Context, client kubernetes.Interface) { +// created. The name is scoped to this run, and the managed labels are checked +// as well, so a same-named object belonging to anyone else is left alone. +// Errors are swallowed, as with the other sweeps. +func sweepClusterValidatorConfig(ctx context.Context, client kubernetes.Interface, runID string) { cms := client.CoreV1().ConfigMaps(clusterValidatorNamespace) - cm, err := cms.Get(ctx, clusterValidatorConfigName, metav1.GetOptions{}) + name := clusterValidatorConfigRunName(runID) + cm, err := cms.Get(ctx, name, metav1.GetOptions{}) if err != nil || !hasValidatorManagedLabels(cm.Labels) { return } - _ = cms.Delete(ctx, clusterValidatorConfigName, deleteExactly(cm)) + _ = cms.Delete(ctx, name, deleteExactly(cm)) } // clusterValidatorTolerations mirrors the chart's tolerations so the Job can diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go index f9732e31c1..bf7f04a654 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go @@ -652,19 +652,19 @@ func TestEnsureClusterValidatorConfig_RefusesUnmanagedConfigMap(t *testing.T) { ctx := context.Background() client := fake.NewSimpleClientset(&corev1.ConfigMap{ ObjectMeta: metav1.ObjectMeta{ - Name: clusterValidatorConfigName, + Name: clusterValidatorConfigRunName("runid"), Namespace: clusterValidatorNamespace, Labels: map[string]string{"owner": "operator"}, }, Data: map[string]string{"config.yaml": "operator: content"}, }) - err := ensureClusterValidatorConfig(ctx, client, nil) + err := ensureClusterValidatorConfig(ctx, client, nil, "runid", false) require.Error(t, err, "an unmanaged ConfigMap must not be overwritten") assert.Contains(t, err.Error(), "not managed by nvcf-cli") got, getErr := client.CoreV1().ConfigMaps(clusterValidatorNamespace).Get(ctx, - clusterValidatorConfigName, metav1.GetOptions{}) + clusterValidatorConfigRunName("runid"), metav1.GetOptions{}) require.NoError(t, getErr) assert.Equal(t, "operator: content", got.Data["config.yaml"], "the operator's ConfigMap content must be untouched") @@ -805,24 +805,24 @@ func TestSweepPriorClusterValidatorJobs_RequiresGeneratedName(t *testing.T) { // cleanup path, so it accumulated in the cluster forever. func TestSweepClusterValidatorConfig_DeletesOwnAndSparesOperators(t *testing.T) { managed := &corev1.ConfigMap{ObjectMeta: metav1.ObjectMeta{ - Name: clusterValidatorConfigName, Namespace: clusterValidatorNamespace, + Name: clusterValidatorConfigRunName("runid"), Namespace: clusterValidatorNamespace, Labels: clusterValidatorLabels(), }} client := fake.NewSimpleClientset(managed) - sweepClusterValidatorConfig(context.Background(), client) + sweepClusterValidatorConfig(context.Background(), client, "runid") _, err := client.CoreV1().ConfigMaps(clusterValidatorNamespace).Get( - context.Background(), clusterValidatorConfigName, metav1.GetOptions{}) + context.Background(), clusterValidatorConfigRunName("runid"), metav1.GetOptions{}) assert.True(t, apierrors.IsNotFound(err), "our own ConfigMap must be reclaimed") // Same name, operator-owned: the name is a constant they could also use. operator := &corev1.ConfigMap{ObjectMeta: metav1.ObjectMeta{ - Name: clusterValidatorConfigName, Namespace: clusterValidatorNamespace, + Name: clusterValidatorConfigRunName("runid"), Namespace: clusterValidatorNamespace, Labels: map[string]string{"owner": "operator"}, }} client2 := fake.NewSimpleClientset(operator) - sweepClusterValidatorConfig(context.Background(), client2) + sweepClusterValidatorConfig(context.Background(), client2, "runid") _, err = client2.CoreV1().ConfigMaps(clusterValidatorNamespace).Get( - context.Background(), clusterValidatorConfigName, metav1.GetOptions{}) + context.Background(), clusterValidatorConfigRunName("runid"), metav1.GetOptions{}) assert.NoError(t, err, "an unmanaged ConfigMap with the same name must survive") } @@ -836,7 +836,7 @@ func TestRunClusterValidator_NoCleanupKeepsPullSecretAndPriorJob(t *testing.T) { }} secret := &corev1.Secret{ ObjectMeta: metav1.ObjectMeta{ - Name: validatorPullSecretRoleName(clusterValidatorControlPlaneRole), + Name: validatorPullSecretRunName(clusterValidatorControlPlaneRole, "runid"), Namespace: clusterValidatorNamespace, Labels: clusterValidatorRoleLabels(clusterValidatorControlPlaneRole), // The fake clientset leaves this zero, which the orphan sweeper @@ -916,7 +916,7 @@ func TestBuildClusterValidatorJob_SetsActiveDeadline(t *testing.T) { func TestSweepOrphanClusterValidatorRBAC_ReclaimsStalePullSecret(t *testing.T) { old := metav1.NewTime(time.Now().Add(-time.Hour)) stale := &corev1.Secret{ObjectMeta: metav1.ObjectMeta{ - Name: validatorPullSecretRoleName(clusterValidatorControlPlaneRole), + Name: validatorPullSecretRunName(clusterValidatorControlPlaneRole, "runid"), Namespace: clusterValidatorNamespace, Labels: clusterValidatorLabels(), CreationTimestamp: old, @@ -933,7 +933,7 @@ func TestSweepOrphanClusterValidatorRBAC_ReclaimsStalePullSecret(t *testing.T) { // carries neither our labels nor our name. func TestSweepOrphanClusterValidatorRBAC_SparesFreshAndUnmanagedSecrets(t *testing.T) { fresh := &corev1.Secret{ObjectMeta: metav1.ObjectMeta{ - Name: validatorPullSecretRoleName(clusterValidatorControlPlaneRole), + Name: validatorPullSecretRunName(clusterValidatorControlPlaneRole, "runid"), Namespace: clusterValidatorNamespace, Labels: clusterValidatorLabels(), CreationTimestamp: metav1.NewTime(time.Now()), @@ -978,7 +978,7 @@ func TestSweepOrphanClusterValidatorRBAC_SparesPreservedObjects(t *testing.T) { Name: clusterValidatorName + "-control-plane-abc", Labels: labels, CreationTimestamp: old, }}, &corev1.Secret{ObjectMeta: metav1.ObjectMeta{ - Name: validatorPullSecretRoleName(clusterValidatorControlPlaneRole), + Name: validatorPullSecretRunName(clusterValidatorControlPlaneRole, "runid"), Namespace: clusterValidatorNamespace, Labels: labels, CreationTimestamp: old, }}, ) @@ -988,7 +988,7 @@ func TestSweepOrphanClusterValidatorRBAC_SparesPreservedObjects(t *testing.T) { clusterValidatorName+"-control-plane-abc", metav1.GetOptions{}) assert.NoError(t, err, "a preserved ClusterRole must survive the orphan sweep") _, err = client.CoreV1().Secrets(clusterValidatorNamespace).Get(context.Background(), - validatorPullSecretRoleName(clusterValidatorControlPlaneRole), metav1.GetOptions{}) + validatorPullSecretRunName(clusterValidatorControlPlaneRole, "runid"), metav1.GetOptions{}) assert.NoError(t, err, "a preserved pull secret must survive the orphan sweep") } @@ -1017,3 +1017,83 @@ func TestEnsureClusterValidatorRBAC_NoPreserveLabelByDefault(t *testing.T) { assert.NotContains(t, cr.Labels, clusterValidatorPreserveLabel, "an ordinary run must stay reclaimable") } + +// Run-scoping the ConfigMap name removed the accidental self-healing the fixed +// name gave us: a killed run used to leave exactly one object that the next run +// overwrote, and now each leaves its own. The deferred sweep is suppressed on +// the pull-failure path, so the orphan sweeper is the only reclaim. +func TestSweepOrphanClusterValidatorRBAC_ReclaimsStaleConfigMap(t *testing.T) { + old := metav1.NewTime(time.Now().Add(-time.Hour)) + stale := &corev1.ConfigMap{ObjectMeta: metav1.ObjectMeta{ + Name: clusterValidatorConfigRunName("deadbeef01"), + Namespace: clusterValidatorNamespace, + Labels: clusterValidatorLabels(), + CreationTimestamp: old, + }} + client := fake.NewSimpleClientset(stale) + sweepOrphanClusterValidatorRBAC(context.Background(), client, orphanValidatorRBACTTL) + + _, err := client.CoreV1().ConfigMaps(clusterValidatorNamespace).Get( + context.Background(), stale.Name, metav1.GetOptions{}) + assert.True(t, apierrors.IsNotFound(err), + "a per-run ConfigMap left by a killed run must be reclaimed") +} + +func TestSweepOrphanClusterValidatorRBAC_SparesFreshAndUnmanagedConfigMaps(t *testing.T) { + fresh := &corev1.ConfigMap{ObjectMeta: metav1.ObjectMeta{ + Name: clusterValidatorConfigRunName("aaaaaaaa01"), + Namespace: clusterValidatorNamespace, + Labels: clusterValidatorLabels(), + CreationTimestamp: metav1.NewTime(time.Now()), + }} + operator := &corev1.ConfigMap{ObjectMeta: metav1.ObjectMeta{ + Name: "operator-owned", + Namespace: clusterValidatorNamespace, + Labels: clusterValidatorLabels(), + CreationTimestamp: metav1.NewTime(time.Now().Add(-time.Hour)), + }} + client := fake.NewSimpleClientset(fresh, operator) + sweepOrphanClusterValidatorRBAC(context.Background(), client, orphanValidatorRBACTTL) + + for _, name := range []string{fresh.Name, operator.Name} { + _, err := client.CoreV1().ConfigMaps(clusterValidatorNamespace).Get( + context.Background(), name, metav1.GetOptions{}) + assert.NoError(t, err, "%s must survive the orphan sweep", name) + } +} + +// --no-cleanup must preserve the ConfigMap as well as the Job and its RBAC. +// Without the marker the next run's orphan sweeper reclaims it after the TTL, +// and an operator re-running the Job they kept gets a validator that silently +// skips the configurable reachability and enforcement checks. +func TestEnsureClusterValidatorConfig_MarksPreservedRun(t *testing.T) { + client := fake.NewSimpleClientset() + require.NoError(t, ensureClusterValidatorConfig(context.Background(), client, nil, "runid", true)) + + cm, err := client.CoreV1().ConfigMaps(clusterValidatorNamespace).Get( + context.Background(), clusterValidatorConfigRunName("runid"), metav1.GetOptions{}) + require.NoError(t, err) + assert.Equal(t, "true", cm.Labels[clusterValidatorPreserveLabel]) + + // And the orphan sweeper honours it even once it is older than the TTL. + cm.CreationTimestamp = metav1.NewTime(time.Now().Add(-time.Hour)) + _, err = client.CoreV1().ConfigMaps(clusterValidatorNamespace).Update( + context.Background(), cm, metav1.UpdateOptions{}) + require.NoError(t, err) + sweepOrphanClusterValidatorRBAC(context.Background(), client, orphanValidatorRBACTTL) + + _, err = client.CoreV1().ConfigMaps(clusterValidatorNamespace).Get( + context.Background(), clusterValidatorConfigRunName("runid"), metav1.GetOptions{}) + assert.NoError(t, err, "a preserved ConfigMap must survive the orphan sweep") +} + +func TestEnsureClusterValidatorConfig_NoPreserveMarkerByDefault(t *testing.T) { + client := fake.NewSimpleClientset() + require.NoError(t, ensureClusterValidatorConfig(context.Background(), client, nil, "runid", false)) + + cm, err := client.CoreV1().ConfigMaps(clusterValidatorNamespace).Get( + context.Background(), clusterValidatorConfigRunName("runid"), metav1.GetOptions{}) + require.NoError(t, err) + assert.NotContains(t, cm.Labels, clusterValidatorPreserveLabel, + "an ordinary run must stay reclaimable") +} diff --git a/src/clis/nvcf-cli/internal/selfhosted/pullsecret.go b/src/clis/nvcf-cli/internal/selfhosted/pullsecret.go index 5309838f4b..1fb43122f0 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/pullsecret.go +++ b/src/clis/nvcf-cli/internal/selfhosted/pullsecret.go @@ -75,6 +75,20 @@ func validatorPullSecretRoleName(role string) string { return validatorPullSecretName + "-" + role } +// validatorPullSecretRunName is the name this run mints under. It carries the +// run's unguessable suffix because the managed labels are three public +// constants: with a predictable name, anyone able to create a Secret in this +// namespace could pre-create it wearing those labels, pass the ownership check, +// and have the NGC credential written into an object they control. Same +// reasoning as the per-run RBAC names. +func validatorPullSecretRunName(role, runID string) string { + base := validatorPullSecretRoleName(role) + if runID == "" { + return base + } + return base + "-" + runID +} + // Mirrors the chain used by ensureLocalImagePullSecrets in cmd/self_hosted_up.go. var ngcAPIKeyEnvNames = []string{ "NGC_IMAGE_PULL_API_KEY", @@ -114,7 +128,7 @@ var validatorPullSecretSearchNamespaces = []string{ func resolveValidatorPullSecret( ctx context.Context, client kubernetes.Interface, - provided, image, role string, + provided, image, role, runID string, preserve bool, ) (string, error) { if provided != "" { @@ -128,13 +142,13 @@ func resolveValidatorPullSecret( scanCtx, cancel := context.WithTimeout(ctx, validatorPullSecretScanTimeout) defer cancel() - if name, err := scanAndMirrorPullSecret(scanCtx, client, registry, role, preserve); err != nil { + if name, err := scanAndMirrorPullSecret(scanCtx, client, registry, role, runID, preserve); err != nil { return "", err } else if name != "" { return name, nil } - if name, err := autoCreatePullSecretFromEnv(scanCtx, client, registry, role, preserve); err != nil { + if name, err := autoCreatePullSecretFromEnv(scanCtx, client, registry, role, runID, preserve); err != nil { return "", err } else if name != "" { return name, nil @@ -166,7 +180,7 @@ func parseRegistryFromImage(image string) string { // registry. Mirrors the body into clusterValidatorNamespace when the match // lives elsewhere, so the Job can reference the secret without cross-namespace // lookups. -func scanAndMirrorPullSecret(ctx context.Context, client kubernetes.Interface, registry, role string, preserve bool) (string, error) { +func scanAndMirrorPullSecret(ctx context.Context, client kubernetes.Interface, registry, role, runID string, preserve bool) (string, error) { for _, ns := range validatorPullSecretSearchNamespaces { // Filter client-side rather than via FieldSelector: server-side // type= selector on Secrets is only honored from k8s 1.27 onward. @@ -202,11 +216,11 @@ func scanAndMirrorPullSecret(ctx context.Context, client kubernetes.Interface, r // the destination namespace, and writeDockerConfigSecret's // delete-and-recreate path would otherwise destroy that // secret on type mismatch. - if err := writeDockerConfigSecret(ctx, client, clusterValidatorNamespace, validatorPullSecretRoleName(role), role, cfg, preserve); err != nil { + if err := writeDockerConfigSecret(ctx, client, clusterValidatorNamespace, validatorPullSecretRunName(role, runID), role, cfg, preserve); err != nil { return "", fmt.Errorf("mirror pull secret %s/%s to %s/%s: %w", - s.Namespace, s.Name, clusterValidatorNamespace, validatorPullSecretRoleName(role), err) + s.Namespace, s.Name, clusterValidatorNamespace, validatorPullSecretRunName(role, runID), err) } - return validatorPullSecretRoleName(role), nil + return validatorPullSecretRunName(role, runID), nil } } return "", nil @@ -223,7 +237,7 @@ func dockerConfigHasRegistry(cfg []byte, registry string) bool { return ok } -func autoCreatePullSecretFromEnv(ctx context.Context, client kubernetes.Interface, registry, role string, preserve bool) (string, error) { +func autoCreatePullSecretFromEnv(ctx context.Context, client kubernetes.Interface, registry, role, runID string, preserve bool) (string, error) { apiKey := firstNonEmptyEnv(ngcAPIKeyEnvNames...) if apiKey == "" { return "", nil @@ -241,11 +255,11 @@ func autoCreatePullSecretFromEnv(ctx context.Context, client kubernetes.Interfac if err != nil { return "", fmt.Errorf("encode dockerconfigjson for %s: %w", registry, err) } - if err := writeDockerConfigSecret(ctx, client, clusterValidatorNamespace, validatorPullSecretRoleName(role), role, cfg, preserve); err != nil { + if err := writeDockerConfigSecret(ctx, client, clusterValidatorNamespace, validatorPullSecretRunName(role, runID), role, cfg, preserve); err != nil { return "", fmt.Errorf("auto-create pull secret %s/%s: %w", - clusterValidatorNamespace, validatorPullSecretRoleName(role), err) + clusterValidatorNamespace, validatorPullSecretRunName(role, runID), err) } - return validatorPullSecretRoleName(role), nil + return validatorPullSecretRunName(role, runID), nil } // Mirrors cmd/self_hosted_up.go's firstNonEmptyEnv; kept local to avoid an @@ -273,126 +287,42 @@ func buildDockerConfigJSON(registry, username, password string) ([]byte, error) }) } -// Mirrors cmd/self_hosted_up.go's ensureDockerConfigSecret. Attaches the -// CLI's managed-by labels so a future cleanup path can identify resources -// to remove. +// writeDockerConfigSecret creates the pull Secret this run will reference. +// +// Create-only. The name carries this run's unguessable suffix, so nothing this +// CLI created can already hold it and any collision is another object. +// Adopting one would write the NGC credential into something we do not own, +// which label-based ownership cannot prevent: the managed labels are three +// public constants anyone can copy onto a Secret they pre-create under a +// predictable name. func writeDockerConfigSecret(ctx context.Context, client kubernetes.Interface, namespace, name, role string, dockerConfig []byte, preserve bool) error { - labels := clusterValidatorRoleLabelsPreserved(role, preserve) - secrets := client.CoreV1().Secrets(namespace) secret := &corev1.Secret{ ObjectMeta: metav1.ObjectMeta{ Name: name, Namespace: namespace, - Labels: labels, + Labels: clusterValidatorRoleLabelsPreserved(role, preserve), }, Type: corev1.SecretTypeDockerConfigJson, Data: map[string][]byte{corev1.DockerConfigJsonKey: dockerConfig}, } - current, err := secrets.Get(ctx, name, metav1.GetOptions{}) - switch { - case err == nil && current.Type == corev1.SecretTypeDockerConfigJson: - // Same guard as the type-mismatch branch below, for the same reason. A - // matching type is not permission to write: an operator-owned secret - // with a colliding name holds their registry credentials, and this - // would replace the data and stamp our managed labels on it, after - // which the role sweep would delete it outright. - if err := refuseIfUnmanaged(current, namespace, name, ""); err != nil { - return err - } - if current.Data == nil { - current.Data = map[string][]byte{} - } - current.Data[corev1.DockerConfigJsonKey] = dockerConfig - if current.Labels == nil { - current.Labels = map[string]string{} - } - for k, v := range labels { - current.Labels[k] = v - } - if _, err := secrets.Update(ctx, current, metav1.UpdateOptions{}); err != nil { - return fmt.Errorf("update: %w", err) - } - return nil - case err == nil: - // Secret.Type is immutable; can't Update across a type change. - // Guard the delete: only replace secrets we previously managed. - // Without this, an operator-owned secret with a colliding name - // (e.g. an Opaque secret in 'default' sharing the validator's - // pull-secret name) would be silently destroyed. - if err := refuseIfUnmanaged(current, namespace, name, - fmt.Sprintf("type=%s", current.Type)); err != nil { - return err - } - // A conflict means the object changed between the ownership check and - // this delete, so the thing now holding the name was never vetted. - // Stop rather than fall through to Create, which would otherwise - // silently adopt or overwrite it. - if err := secrets.Delete(ctx, name, deleteExactly(current)); err != nil && !apierrors.IsNotFound(err) { - return fmt.Errorf("delete incompatible secret type %s: %w", current.Type, err) - } - case !apierrors.IsNotFound(err): - return fmt.Errorf("get: %w", err) - } - if _, err := secrets.Create(ctx, secret, metav1.CreateOptions{}); err != nil { - if !apierrors.IsAlreadyExists(err) { - return fmt.Errorf("create: %w", err) - } - // Lost a delete->create race: another actor recreated the secret - // in the narrow window between our Delete and Create. Refetch and - // overwrite with our content so the caller still gets the - // credentials it asked for. - current, getErr := secrets.Get(ctx, name, metav1.GetOptions{}) - if getErr != nil { - return fmt.Errorf("get after create race: %w", getErr) - } - if err := refuseIfUnmanaged(current, namespace, name, "lost create race"); err != nil { - return err - } - if current.Type != corev1.SecretTypeDockerConfigJson { - return fmt.Errorf("create race left secret %s/%s with type %s, want %s", - namespace, name, current.Type, corev1.SecretTypeDockerConfigJson) - } - if current.Data == nil { - current.Data = map[string][]byte{} - } - current.Data[corev1.DockerConfigJsonKey] = dockerConfig - if current.Labels == nil { - current.Labels = map[string]string{} - } - for k, v := range labels { - current.Labels[k] = v - } - if _, err := secrets.Update(ctx, current, metav1.UpdateOptions{}); err != nil { - return fmt.Errorf("update after create race: %w", err) + if _, err := client.CoreV1().Secrets(namespace).Create(ctx, secret, metav1.CreateOptions{}); err != nil { + if apierrors.IsAlreadyExists(err) { + return fmt.Errorf( + "refusing to overwrite existing secret %s/%s: this run generated that name, so "+ + "another object already holds it; pass --cluster-validator-pull-secret to "+ + "choose an explicit secret name", + namespace, name) } + return fmt.Errorf("create: %w", err) } return nil } -func refuseIfUnmanaged(s *corev1.Secret, namespace, name, detail string) error { - if isManagedByValidatorCLI(s) { - return nil - } - if detail != "" { - detail = " (" + detail + ")" - } - return fmt.Errorf( - "refusing to overwrite %s/%s%s which is not managed by nvcf-cli; "+ - "pass --cluster-validator-pull-secret to choose an explicit secret name", - namespace, name, detail) -} - -// isManagedByValidatorCLI reports whether the secret carries the labels -// writeDockerConfigSecret stamps on every secret it creates. Used to -// gate the delete-then-recreate branch so we never destroy an operator- -// or chart-owned secret that happens to share a name with one of ours. -// refuseIfUnmanaged rejects a Secret nvcf-cli does not own. Every path in -// writeDockerConfigSecret that mutates an existing Secret must call this: -// overwriting an operator-owned secret replaces their registry credentials and -// stamps our managed labels on it, after which the role sweep deletes it. -// -// detail is appended to the message when there is something useful to say -// (the conflicting type, the race), otherwise "". +// isManagedByValidatorCLI reports whether a Secret carries the labels this CLI +// stamps on the ones it creates. Necessary but not sufficient for ownership: +// the labels are three public constants anyone can copy onto a Secret they +// pre-create, which is why the generated names are run-scoped and the write +// path is create-only rather than adopt-or-update. func isManagedByValidatorCLI(s *corev1.Secret) bool { return hasValidatorManagedLabels(s.Labels) } diff --git a/src/clis/nvcf-cli/internal/selfhosted/pullsecret_test.go b/src/clis/nvcf-cli/internal/selfhosted/pullsecret_test.go index aa0b5227e7..ee958421fc 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/pullsecret_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/pullsecret_test.go @@ -21,7 +21,6 @@ import ( "context" "encoding/base64" "encoding/json" - "errors" "testing" "github.com/stretchr/testify/assert" @@ -30,10 +29,7 @@ import ( corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/client-go/kubernetes/fake" - ktesting "k8s.io/client-go/testing" ) func dockerConfigBlob(t *testing.T, registry, user, pass string) []byte { @@ -135,99 +131,6 @@ func TestFirstNonEmptyEnv(t *testing.T) { }) } -func TestWriteDockerConfigSecret_Create(t *testing.T) { - client := fake.NewSimpleClientset() - cfg := dockerConfigBlob(t, "private.registry.test", "$oauthtoken", "key") - - require.NoError(t, writeDockerConfigSecret(context.Background(), client, "default", "nvcr-pull-secret", clusterValidatorControlPlaneRole, cfg, false), false) - - got, err := client.CoreV1().Secrets("default").Get(context.Background(), "nvcr-pull-secret", metav1.GetOptions{}) - require.NoError(t, err) - assert.Equal(t, corev1.SecretTypeDockerConfigJson, got.Type) - assert.Equal(t, cfg, got.Data[corev1.DockerConfigJsonKey]) - assert.Equal(t, clusterValidatorAppLabel, got.Labels["app.kubernetes.io/name"], - "label must be attached so the secret is identifiable as CLI-managed") -} - -func TestWriteDockerConfigSecret_Update(t *testing.T) { - old := dockerConfigBlob(t, "private.registry.test", "$oauthtoken", "stale-key") - fresh := dockerConfigBlob(t, "private.registry.test", "$oauthtoken", "rotated-key") - - // Managed labels plus an unrelated one: only a secret we own may be - // updated, and updating must not drop labels the operator added. - existingLabels := clusterValidatorLabels() - existingLabels["existing-label"] = "preserved" - - client := fake.NewSimpleClientset(&corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: "nvcr-pull-secret", - Namespace: "default", - Labels: existingLabels, - }, - Type: corev1.SecretTypeDockerConfigJson, - Data: map[string][]byte{corev1.DockerConfigJsonKey: old}, - }) - - require.NoError(t, writeDockerConfigSecret(context.Background(), client, "default", "nvcr-pull-secret", clusterValidatorControlPlaneRole, fresh, false), false) - - got, _ := client.CoreV1().Secrets("default").Get(context.Background(), "nvcr-pull-secret", metav1.GetOptions{}) - assert.Equal(t, fresh, got.Data[corev1.DockerConfigJsonKey], "data must be updated to the fresh body") - assert.Equal(t, "preserved", got.Labels["existing-label"], "pre-existing labels must be preserved on update") - assert.Equal(t, clusterValidatorAppLabel, got.Labels["app.kubernetes.io/name"], "CLI labels must be added on update") -} - -// Regression guard for the immutable-Type silent-failure path: a pre-existing -// secret with the wrong Type (but our labels) must be replaced (delete + -// create), not Updated. -func TestWriteDockerConfigSecret_TypeMismatchReplaces(t *testing.T) { - fresh := dockerConfigBlob(t, "private.registry.test", "$oauthtoken", "key") - client := fake.NewSimpleClientset(&corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: "nvcr-pull-secret", - Namespace: "default", - Labels: clusterValidatorLabels(), - }, - Type: corev1.SecretTypeOpaque, // wrong type — Update would 422 - Data: map[string][]byte{"some-key": []byte("some-value")}, - }) - - require.NoError(t, writeDockerConfigSecret(context.Background(), client, "default", "nvcr-pull-secret", clusterValidatorControlPlaneRole, fresh, false), false) - - got, err := client.CoreV1().Secrets("default").Get(context.Background(), "nvcr-pull-secret", metav1.GetOptions{}) - require.NoError(t, err) - assert.Equal(t, corev1.SecretTypeDockerConfigJson, got.Type, - "secret must be recreated with the correct dockerconfigjson type") - assert.Equal(t, fresh, got.Data[corev1.DockerConfigJsonKey]) - assert.NotContains(t, got.Data, "some-key", "old Opaque payload must not survive the recreate") -} - -// Operator-owned secret with the same name but no CLI labels must NOT be -// destroyed. The replace path is the only place operator data is at risk -// (immutable Type forces delete+create), so the label guard lives there. -func TestWriteDockerConfigSecret_TypeMismatchRefusesUnlabeledSecret(t *testing.T) { - fresh := dockerConfigBlob(t, "private.registry.test", "$oauthtoken", "key") - operatorPayload := []byte("operator-data-do-not-destroy") - client := fake.NewSimpleClientset(&corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: "nvcr-pull-secret", - Namespace: "default", - // No CLI labels: an operator- or chart-owned secret. - }, - Type: corev1.SecretTypeOpaque, - Data: map[string][]byte{"operator-payload": operatorPayload}, - }) - - err := writeDockerConfigSecret(context.Background(), client, "default", "nvcr-pull-secret", clusterValidatorControlPlaneRole, fresh, false) - require.Error(t, err, "must refuse to destroy a non-CLI-managed secret") - assert.Contains(t, err.Error(), "not managed by nvcf-cli") - - // Original payload must still be intact. - got, getErr := client.CoreV1().Secrets("default").Get(context.Background(), "nvcr-pull-secret", metav1.GetOptions{}) - require.NoError(t, getErr) - assert.Equal(t, corev1.SecretTypeOpaque, got.Type, "type must be unchanged") - assert.Equal(t, operatorPayload, got.Data["operator-payload"], "operator data must not be touched") -} - func TestScanAndMirrorPullSecret_FoundInDefault(t *testing.T) { cfg := dockerConfigBlob(t, "private.registry.test", "$oauthtoken", "key") client := fake.NewSimpleClientset(&corev1.Secret{ @@ -236,7 +139,7 @@ func TestScanAndMirrorPullSecret_FoundInDefault(t *testing.T) { Data: map[string][]byte{corev1.DockerConfigJsonKey: cfg}, }) - name, err := scanAndMirrorPullSecret(context.Background(), client, "private.registry.test", clusterValidatorControlPlaneRole, false) + name, err := scanAndMirrorPullSecret(context.Background(), client, "private.registry.test", clusterValidatorControlPlaneRole, "runid", false) require.NoError(t, err) assert.Equal(t, "operator-secret", name) @@ -257,11 +160,11 @@ func TestScanAndMirrorPullSecret_FoundInNvcfMirroredToDefault(t *testing.T) { Data: map[string][]byte{corev1.DockerConfigJsonKey: cfg}, }) - name, err := scanAndMirrorPullSecret(context.Background(), client, "private.registry.test", clusterValidatorControlPlaneRole, false) + name, err := scanAndMirrorPullSecret(context.Background(), client, "private.registry.test", clusterValidatorControlPlaneRole, "runid", false) require.NoError(t, err) - assert.Equal(t, validatorPullSecretRoleName(clusterValidatorControlPlaneRole), name) + assert.Equal(t, validatorPullSecretRunName(clusterValidatorControlPlaneRole, "runid"), name) - mirrored, err := client.CoreV1().Secrets("default").Get(context.Background(), validatorPullSecretRoleName(clusterValidatorControlPlaneRole), metav1.GetOptions{}) + mirrored, err := client.CoreV1().Secrets("default").Get(context.Background(), validatorPullSecretRunName(clusterValidatorControlPlaneRole, "runid"), metav1.GetOptions{}) require.NoError(t, err, "mirror must be created under the role-scoped managed name") assert.Equal(t, cfg, mirrored.Data[corev1.DockerConfigJsonKey]) @@ -279,14 +182,14 @@ func TestScanAndMirrorPullSecret_RegistryMismatch(t *testing.T) { Data: map[string][]byte{corev1.DockerConfigJsonKey: cfg}, }) - name, err := scanAndMirrorPullSecret(context.Background(), client, "private.registry.test", clusterValidatorControlPlaneRole, false) + name, err := scanAndMirrorPullSecret(context.Background(), client, "private.registry.test", clusterValidatorControlPlaneRole, "runid", false) require.NoError(t, err) assert.Equal(t, "", name, "secret for a different registry must not match") } func TestScanAndMirrorPullSecret_NoSecrets(t *testing.T) { client := fake.NewSimpleClientset() - name, err := scanAndMirrorPullSecret(context.Background(), client, "private.registry.test", clusterValidatorControlPlaneRole, false) + name, err := scanAndMirrorPullSecret(context.Background(), client, "private.registry.test", clusterValidatorControlPlaneRole, "runid", false) require.NoError(t, err) assert.Equal(t, "", name) } @@ -306,7 +209,7 @@ func TestScanAndMirrorPullSecret_PrefersDefaultNamespace(t *testing.T) { }, ) - name, err := scanAndMirrorPullSecret(context.Background(), client, "private.registry.test", clusterValidatorControlPlaneRole, false) + name, err := scanAndMirrorPullSecret(context.Background(), client, "private.registry.test", clusterValidatorControlPlaneRole, "runid", false) require.NoError(t, err) assert.Equal(t, "in-default", name) } @@ -318,7 +221,7 @@ func TestAutoCreatePullSecretFromEnv_NoEnv(t *testing.T) { } client := fake.NewSimpleClientset() - got, err := autoCreatePullSecretFromEnv(context.Background(), client, "private.registry.test", clusterValidatorControlPlaneRole, false) + got, err := autoCreatePullSecretFromEnv(context.Background(), client, "private.registry.test", clusterValidatorControlPlaneRole, "runid", false) require.NoError(t, err) assert.Equal(t, "", got, "no env var set means no secret minted") @@ -333,11 +236,11 @@ func TestAutoCreatePullSecretFromEnv_KeyPresent(t *testing.T) { t.Setenv("NGC_API_KEY", "nvapi-test-123") client := fake.NewSimpleClientset() - got, err := autoCreatePullSecretFromEnv(context.Background(), client, "nvcr.io", clusterValidatorControlPlaneRole, false) + got, err := autoCreatePullSecretFromEnv(context.Background(), client, "nvcr.io", clusterValidatorControlPlaneRole, "runid", false) require.NoError(t, err) - assert.Equal(t, validatorPullSecretRoleName(clusterValidatorControlPlaneRole), got) + assert.Equal(t, validatorPullSecretRunName(clusterValidatorControlPlaneRole, "runid"), got) - s, err := client.CoreV1().Secrets("default").Get(context.Background(), validatorPullSecretRoleName(clusterValidatorControlPlaneRole), metav1.GetOptions{}) + s, err := client.CoreV1().Secrets("default").Get(context.Background(), validatorPullSecretRunName(clusterValidatorControlPlaneRole, "runid"), metav1.GetOptions{}) require.NoError(t, err) assert.True(t, dockerConfigHasRegistry(s.Data[corev1.DockerConfigJsonKey], "nvcr.io"), "minted secret must contain auth for the validator image's registry") @@ -345,7 +248,7 @@ func TestAutoCreatePullSecretFromEnv_KeyPresent(t *testing.T) { func TestResolveValidatorPullSecret_FlagOverride(t *testing.T) { client := fake.NewSimpleClientset() - got, err := resolveValidatorPullSecret(context.Background(), client, "custom-secret", "private.registry.test/nvidia/nvcf-byoc/cluster-validator:rc26", clusterValidatorControlPlaneRole, false) + got, err := resolveValidatorPullSecret(context.Background(), client, "custom-secret", "private.registry.test/nvidia/nvcf-byoc/cluster-validator:rc26", clusterValidatorControlPlaneRole, "runid", false) require.NoError(t, err) assert.Equal(t, "custom-secret", got, "explicit override always wins") @@ -365,14 +268,14 @@ func TestResolveValidatorPullSecret_ScanWins(t *testing.T) { Data: map[string][]byte{corev1.DockerConfigJsonKey: cfg}, }) - got, err := resolveValidatorPullSecret(context.Background(), client, "", "private.registry.test/nvidia/nvcf-byoc/cluster-validator:rc26", clusterValidatorControlPlaneRole, false) + got, err := resolveValidatorPullSecret(context.Background(), client, "", "private.registry.test/nvidia/nvcf-byoc/cluster-validator:rc26", clusterValidatorControlPlaneRole, "runid", false) require.NoError(t, err) // Mirror destination is the validator's well-known name, not the // source secret's name (avoids same-name collisions with operator // or chart-owned secrets in the destination namespace). - assert.Equal(t, validatorPullSecretRoleName(clusterValidatorControlPlaneRole), got) + assert.Equal(t, validatorPullSecretRunName(clusterValidatorControlPlaneRole, "runid"), got) - mirrored, err := client.CoreV1().Secrets("default").Get(context.Background(), validatorPullSecretRoleName(clusterValidatorControlPlaneRole), metav1.GetOptions{}) + mirrored, err := client.CoreV1().Secrets("default").Get(context.Background(), validatorPullSecretRunName(clusterValidatorControlPlaneRole, "runid"), metav1.GetOptions{}) require.NoError(t, err) assert.True(t, dockerConfigHasRegistry(mirrored.Data[corev1.DockerConfigJsonKey], "private.registry.test")) } @@ -384,11 +287,11 @@ func TestResolveValidatorPullSecret_EnvFallback(t *testing.T) { t.Setenv("NVCF_NGC_API_KEY", "nvapi-fallback") client := fake.NewSimpleClientset() - got, err := resolveValidatorPullSecret(context.Background(), client, "", "nvcr.io/nvidia/nvcf-byoc/cluster-validator:rc26", clusterValidatorControlPlaneRole, false) + got, err := resolveValidatorPullSecret(context.Background(), client, "", "nvcr.io/nvidia/nvcf-byoc/cluster-validator:rc26", clusterValidatorControlPlaneRole, "runid", false) require.NoError(t, err) - assert.Equal(t, validatorPullSecretRoleName(clusterValidatorControlPlaneRole), got) + assert.Equal(t, validatorPullSecretRunName(clusterValidatorControlPlaneRole, "runid"), got) - s, err := client.CoreV1().Secrets("default").Get(context.Background(), validatorPullSecretRoleName(clusterValidatorControlPlaneRole), metav1.GetOptions{}) + s, err := client.CoreV1().Secrets("default").Get(context.Background(), validatorPullSecretRunName(clusterValidatorControlPlaneRole, "runid"), metav1.GetOptions{}) require.NoError(t, err) assert.True(t, dockerConfigHasRegistry(s.Data[corev1.DockerConfigJsonKey], "nvcr.io")) } @@ -403,7 +306,7 @@ func TestResolveValidatorPullSecret_EnvFallbackRefusesMirroredRegistry(t *testin client := fake.NewSimpleClientset() got, err := resolveValidatorPullSecret(context.Background(), client, "", - "private.registry.test/nvidia/nvcf-byoc/cluster-validator:rc26", clusterValidatorControlPlaneRole, false) + "private.registry.test/nvidia/nvcf-byoc/cluster-validator:rc26", clusterValidatorControlPlaneRole, "runid", false) require.NoError(t, err) assert.Empty(t, got, "no secret may be minted for a non-NGC registry") } @@ -414,7 +317,7 @@ func TestResolveValidatorPullSecret_AllEmpty(t *testing.T) { } client := fake.NewSimpleClientset() - got, err := resolveValidatorPullSecret(context.Background(), client, "", "private.registry.test/nvidia/nvcf-byoc/cluster-validator:rc26", clusterValidatorControlPlaneRole, false) + got, err := resolveValidatorPullSecret(context.Background(), client, "", "private.registry.test/nvidia/nvcf-byoc/cluster-validator:rc26", clusterValidatorControlPlaneRole, "runid", false) require.NoError(t, err) assert.Equal(t, "", got, "no override, no scan match, no env var -> empty so kubelet surfaces ImagePullBackOff") } @@ -425,7 +328,7 @@ func TestResolveValidatorPullSecret_UnparsableImage(t *testing.T) { } client := fake.NewSimpleClientset() - got, err := resolveValidatorPullSecret(context.Background(), client, "", "bareimage", clusterValidatorControlPlaneRole, false) + got, err := resolveValidatorPullSecret(context.Background(), client, "", "bareimage", clusterValidatorControlPlaneRole, "runid", false) require.NoError(t, err) assert.Equal(t, "", got, "no registry hostname means no scan target and no auto-create") @@ -443,7 +346,7 @@ func TestResolveValidatorPullSecret_UnparsableImage(t *testing.T) { // clientset implements DeleteCollection as a no-op. func TestManagedPullSecret_IsScopedPerRole(t *testing.T) { ctx := context.Background() - cpName := validatorPullSecretRoleName(clusterValidatorControlPlaneRole) + cpName := validatorPullSecretRunName(clusterValidatorControlPlaneRole, "runid") gpuName := validatorPullSecretRoleName("compute-plane") require.NotEqual(t, cpName, gpuName, "each role needs its own managed pull secret") @@ -457,7 +360,7 @@ func TestManagedPullSecret_IsScopedPerRole(t *testing.T) { require.NoError(t, writeDockerConfigSecret(ctx, client, clusterValidatorNamespace, "operator-owned-secret", clusterValidatorControlPlaneRole, cfg, false)) - sweepManagedPullSecrets(ctx, client, clusterValidatorControlPlaneRole) + sweepManagedPullSecrets(ctx, client, clusterValidatorControlPlaneRole, "runid") secrets := client.CoreV1().Secrets(clusterValidatorNamespace) _, err := secrets.Get(ctx, cpName, metav1.GetOptions{}) @@ -475,181 +378,28 @@ func TestManagedPullSecret_IsScopedPerRole(t *testing.T) { func TestManagedPullSecret_LabelsMatchOnlyItsOwnRole(t *testing.T) { ctx := context.Background() client := fake.NewSimpleClientset() - - // dockerConfigBlob encodes the auth value at runtime; a literal base64 - // docker credential in the source trips secret scanners. - cfg := dockerConfigBlob(t, "private.registry.test", "user", "pass") + cfg := dockerConfigBlob(t, "nvcr.io", "$oauthtoken", "key") + name := validatorPullSecretRunName(clusterValidatorControlPlaneRole, "runid") require.NoError(t, writeDockerConfigSecret(ctx, client, clusterValidatorNamespace, - validatorPullSecretRoleName(clusterValidatorControlPlaneRole), - clusterValidatorControlPlaneRole, cfg, false)) + name, clusterValidatorControlPlaneRole, cfg, false)) - got, err := client.CoreV1().Secrets(clusterValidatorNamespace).Get(ctx, - validatorPullSecretRoleName(clusterValidatorControlPlaneRole), metav1.GetOptions{}) + own, err := client.CoreV1().Secrets(clusterValidatorNamespace).List(ctx, + metav1.ListOptions{LabelSelector: validatorRoleSelector(clusterValidatorControlPlaneRole)}) require.NoError(t, err) + assert.Len(t, own.Items, 1, "the secret must match its own role's selector") - assert.Equal(t, clusterValidatorControlPlaneRole, got.Labels[clusterValidatorRoleLabel], - "a managed secret must carry its own role label") - assert.Equal(t, "nvcf-cli", got.Labels["app.kubernetes.io/managed-by"], - "the managed-by label is what excludes operator-supplied secrets from cleanup") -} - -// A matching Secret type is not permission to write. An operator-owned secret -// with a colliding name holds their registry credentials; overwriting it would -// also stamp our managed labels on it, after which the role sweep would delete -// it outright. -func TestWriteDockerConfigSecret_RefusesUnmanagedSameTypeSecret(t *testing.T) { - ctx := context.Background() - operatorOwned := dockerConfigBlob(t, "private.registry.test", "operator", "their-secret") - ours := dockerConfigBlob(t, "private.registry.test", "$oauthtoken", "ours") - - client := fake.NewSimpleClientset(&corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: "nvcf-preflight-pull-secret-control-plane", - Namespace: clusterValidatorNamespace, - Labels: map[string]string{"owner": "operator"}, - }, - Type: corev1.SecretTypeDockerConfigJson, - Data: map[string][]byte{corev1.DockerConfigJsonKey: operatorOwned}, - }) - - err := writeDockerConfigSecret(ctx, client, clusterValidatorNamespace, - "nvcf-preflight-pull-secret-control-plane", clusterValidatorControlPlaneRole, ours, false) - - require.Error(t, err, "an unmanaged secret of the same type must not be overwritten") - assert.Contains(t, err.Error(), "not managed by nvcf-cli") - - got, getErr := client.CoreV1().Secrets(clusterValidatorNamespace).Get(ctx, - "nvcf-preflight-pull-secret-control-plane", metav1.GetOptions{}) - require.NoError(t, getErr) - assert.Equal(t, operatorOwned, got.Data[corev1.DockerConfigJsonKey], - "the operator's credentials must be left untouched") - assert.NotContains(t, got.Labels, "app.kubernetes.io/managed-by", - "managed labels must not be stamped on it, or the sweep would later delete it") -} - -// If an unmanaged Docker-config Secret appears between our Get and our Create, -// Create fails with AlreadyExists and the recovery path refetches it. That path -// must apply the same ownership check as the others, or a lost race silently -// overwrites an operator-owned secret and marks it for sweep deletion. -func TestWriteDockerConfigSecret_RefusesUnmanagedAfterCreateRace(t *testing.T) { - ctx := context.Background() - operatorOwned := dockerConfigBlob(t, "private.registry.test", "operator", "their-secret") - ours := dockerConfigBlob(t, "private.registry.test", "$oauthtoken", "ours") - - const name = "nvcf-preflight-pull-secret-control-plane" - client := fake.NewSimpleClientset() - - // First Get: absent, so the code proceeds to Create. Create: AlreadyExists, - // as though another actor won the race. Second Get: their unmanaged secret. - gets := 0 - client.PrependReactor("get", "secrets", func(_ ktesting.Action) (bool, runtime.Object, error) { - gets++ - if gets == 1 { - return true, nil, apierrors.NewNotFound(corev1.Resource("secrets"), name) - } - return true, &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: clusterValidatorNamespace, - Labels: map[string]string{"owner": "operator"}, - }, - Type: corev1.SecretTypeDockerConfigJson, - Data: map[string][]byte{corev1.DockerConfigJsonKey: operatorOwned}, - }, nil - }) - client.PrependReactor("create", "secrets", func(_ ktesting.Action) (bool, runtime.Object, error) { - return true, nil, apierrors.NewAlreadyExists(corev1.Resource("secrets"), name) - }) - - var updated bool - client.PrependReactor("update", "secrets", func(_ ktesting.Action) (bool, runtime.Object, error) { - updated = true - return true, nil, nil - }) - - err := writeDockerConfigSecret(ctx, client, clusterValidatorNamespace, name, - clusterValidatorControlPlaneRole, ours, false) - - require.Error(t, err, "losing the create race to an unmanaged secret must not overwrite it") - assert.Contains(t, err.Error(), "not managed by nvcf-cli") - assert.False(t, updated, "no Update may be issued against an unmanaged secret") -} - -// The ownership check reads the Secret and then deletes it by name. In that -// window another actor can delete and recreate it, so the delete has to name -// the exact object that was vetted rather than whatever holds the name by then. -func TestWriteDockerConfigSecret_TypeMismatchDeletePinsTheInspectedObject(t *testing.T) { - fresh := dockerConfigBlob(t, "private.registry.test", "$oauthtoken", "key") - existing := &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: "nvcr-pull-secret", - Namespace: "default", - Labels: clusterValidatorLabels(), - UID: "uid-1", - ResourceVersion: "42", - }, - Type: corev1.SecretTypeOpaque, - } - client := fake.NewSimpleClientset(existing) - - var opts metav1.DeleteOptions - client.PrependReactor("delete", "secrets", func(a ktesting.Action) (bool, runtime.Object, error) { - opts = a.(ktesting.DeleteActionImpl).DeleteOptions - return false, nil, nil - }) - - require.NoError(t, writeDockerConfigSecret(context.Background(), client, "default", - "nvcr-pull-secret", clusterValidatorControlPlaneRole, fresh, false), false) - - require.NotNil(t, opts.Preconditions, "delete must carry preconditions") - require.NotNil(t, opts.Preconditions.UID) - assert.Equal(t, existing.UID, *opts.Preconditions.UID) - assert.Nil(t, opts.Preconditions.ResourceVersion, - "UID alone pins identity; pinning ResourceVersion turns any concurrent "+ - "write into a 409 that the sweeps swallow") -} - -// A conflict means the object changed after the ownership check, so the run -// must stop instead of creating over whatever now holds the name. -func TestWriteDockerConfigSecret_TypeMismatchStopsOnDeleteConflict(t *testing.T) { - fresh := dockerConfigBlob(t, "private.registry.test", "$oauthtoken", "key") - client := fake.NewSimpleClientset(&corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: "nvcr-pull-secret", - Namespace: "default", - Labels: clusterValidatorLabels(), - UID: "uid-1", - }, - Type: corev1.SecretTypeOpaque, - }) - client.PrependReactor("delete", "secrets", func(ktesting.Action) (bool, runtime.Object, error) { - return true, nil, apierrors.NewConflict( - schema.GroupResource{Resource: "secrets"}, "nvcr-pull-secret", - errors.New("UID precondition mismatch")) - }) - - created := false - client.PrependReactor("create", "secrets", func(ktesting.Action) (bool, runtime.Object, error) { - created = true - return false, nil, nil - }) - - err := writeDockerConfigSecret(context.Background(), client, "default", - "nvcr-pull-secret", clusterValidatorControlPlaneRole, fresh, false) - require.Error(t, err, "a changed object must abort the replace") - assert.False(t, created, "must not create over an object that was never vetted") + other, err := client.CoreV1().Secrets(clusterValidatorNamespace).List(ctx, + metav1.ListOptions{LabelSelector: validatorRoleSelector(clusterValidatorComputePlaneRole)}) + require.NoError(t, err) + assert.Empty(t, other.Items, "it must not match the other role's selector") } -// NGC_API_KEY must never be minted as the password for a registry that is not -// NGC. An operator who mirrors the validator image to ghcr.io or a corporate -// Harbor and still exports NGC_API_KEY would otherwise have the kubelet send -// the live key to a third party as HTTP Basic auth. func TestAutoCreatePullSecretFromEnv_RefusesNonNGCRegistry(t *testing.T) { t.Setenv("NGC_API_KEY", "nvapi-secret-value") client := fake.NewSimpleClientset() name, err := autoCreatePullSecretFromEnv(context.Background(), client, - "ghcr.io", clusterValidatorControlPlaneRole, false) + "ghcr.io", clusterValidatorControlPlaneRole, "runid", false) require.NoError(t, err) assert.Empty(t, name, "no secret may be minted for a non-NGC registry") @@ -666,7 +416,7 @@ func TestScanAndMirrorPullSecret_DoesNotAdoptTheOtherRolesSecret(t *testing.T) { cfg := dockerConfigBlob(t, "nvcr.io", "$oauthtoken", "key") otherRole := &corev1.Secret{ ObjectMeta: metav1.ObjectMeta{ - Name: validatorPullSecretRoleName(clusterValidatorControlPlaneRole), + Name: validatorPullSecretRunName(clusterValidatorControlPlaneRole, "runid"), Namespace: clusterValidatorNamespace, Labels: clusterValidatorRoleLabels(clusterValidatorControlPlaneRole), }, @@ -676,7 +426,7 @@ func TestScanAndMirrorPullSecret_DoesNotAdoptTheOtherRolesSecret(t *testing.T) { client := fake.NewSimpleClientset(otherRole) got, err := scanAndMirrorPullSecret(context.Background(), client, "nvcr.io", - clusterValidatorComputePlaneRole, false) + clusterValidatorComputePlaneRole, "runid", false) require.NoError(t, err) assert.NotEqual(t, otherRole.Name, got, "the compute role must not adopt the control-plane role's managed Secret") @@ -694,7 +444,7 @@ func TestScanAndMirrorPullSecret_AdoptsOperatorSuppliedSecret(t *testing.T) { client := fake.NewSimpleClientset(operator) got, err := scanAndMirrorPullSecret(context.Background(), client, "nvcr.io", - clusterValidatorComputePlaneRole, false) + clusterValidatorComputePlaneRole, "runid", false) require.NoError(t, err) assert.Equal(t, "operator-pull", got) } @@ -704,7 +454,7 @@ func TestScanAndMirrorPullSecret_AdoptsOwnRoleSecret(t *testing.T) { cfg := dockerConfigBlob(t, "nvcr.io", "$oauthtoken", "key") own := &corev1.Secret{ ObjectMeta: metav1.ObjectMeta{ - Name: validatorPullSecretRoleName(clusterValidatorComputePlaneRole), + Name: validatorPullSecretRunName(clusterValidatorComputePlaneRole, "runid"), Namespace: clusterValidatorNamespace, Labels: clusterValidatorRoleLabels(clusterValidatorComputePlaneRole), }, @@ -714,7 +464,82 @@ func TestScanAndMirrorPullSecret_AdoptsOwnRoleSecret(t *testing.T) { client := fake.NewSimpleClientset(own) got, err := scanAndMirrorPullSecret(context.Background(), client, "nvcr.io", - clusterValidatorComputePlaneRole, false) + clusterValidatorComputePlaneRole, "runid", false) require.NoError(t, err) assert.Equal(t, own.Name, got) } + +// writeDockerConfigSecret is create-only. The name carries this run's +// unguessable suffix, so nothing this CLI created can already hold it and any +// collision is another object. Adopting one would write the NGC credential +// into something we do not own, which label-based ownership cannot prevent: +// the managed labels are three public constants anyone can copy. +func TestWriteDockerConfigSecret_CreatesUnderTheRunScopedName(t *testing.T) { + cfg := dockerConfigBlob(t, "nvcr.io", "$oauthtoken", "key") + client := fake.NewSimpleClientset() + name := validatorPullSecretRunName(clusterValidatorControlPlaneRole, "runid") + + require.NoError(t, writeDockerConfigSecret(context.Background(), client, + clusterValidatorNamespace, name, clusterValidatorControlPlaneRole, cfg, false)) + + s, err := client.CoreV1().Secrets(clusterValidatorNamespace).Get( + context.Background(), name, metav1.GetOptions{}) + require.NoError(t, err) + assert.Equal(t, corev1.SecretTypeDockerConfigJson, s.Type) + assert.True(t, hasValidatorManagedLabels(s.Labels)) +} + +func TestWriteDockerConfigSecret_RefusesAnyCollision(t *testing.T) { + cfg := dockerConfigBlob(t, "nvcr.io", "$oauthtoken", "key") + name := validatorPullSecretRunName(clusterValidatorControlPlaneRole, "runid") + + // Even wearing our managed labels: labels are forgeable, the name is not. + squatter := &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, Namespace: clusterValidatorNamespace, + Labels: clusterValidatorLabels(), + }, + Type: corev1.SecretTypeOpaque, + Data: map[string][]byte{"planted": []byte("x")}, + } + client := fake.NewSimpleClientset(squatter) + + err := writeDockerConfigSecret(context.Background(), client, + clusterValidatorNamespace, name, clusterValidatorControlPlaneRole, cfg, false) + require.Error(t, err, "a collision on an unguessable name must never be adopted") + assert.Contains(t, err.Error(), "refusing to overwrite") + + got, gerr := client.CoreV1().Secrets(clusterValidatorNamespace).Get( + context.Background(), name, metav1.GetOptions{}) + require.NoError(t, gerr) + assert.Equal(t, corev1.SecretTypeOpaque, got.Type, "the other object must be untouched") + assert.Contains(t, got.Data, "planted") + assert.NotContains(t, got.Data, corev1.DockerConfigJsonKey, + "the NGC credential must not be written into an object we do not own") +} + +// The unguessable suffix is the actual control. Labels cannot carry it: they +// are three public constants, so a predictable name lets anyone able to create +// a Secret here pre-create it wearing those labels and receive the NGC +// credential. Create-only is only safe because the name cannot be guessed. +func TestValidatorPullSecretRunName_CarriesTheRunID(t *testing.T) { + name := validatorPullSecretRunName(clusterValidatorControlPlaneRole, "a1b2c3d4e5") + assert.Contains(t, name, "a1b2c3d4e5", + "a predictable secret name can be pre-created by someone else") + assert.NotEqual(t, validatorPullSecretRoleName(clusterValidatorControlPlaneRole), name) + + // Two runs never collide, so one run's sweep cannot take out another's. + other := validatorPullSecretRunName(clusterValidatorControlPlaneRole, "f6g7h8i9j0") + assert.NotEqual(t, name, other) +} + +// The mint path must use the run-scoped name, not the role name. +func TestAutoCreatePullSecretFromEnv_MintsUnderTheRunScopedName(t *testing.T) { + t.Setenv("NGC_API_KEY", "nvapi-secret-value") + client := fake.NewSimpleClientset() + + got, err := autoCreatePullSecretFromEnv(context.Background(), client, + "nvcr.io", clusterValidatorControlPlaneRole, "a1b2c3d4e5", false) + require.NoError(t, err) + assert.Contains(t, got, "a1b2c3d4e5", "the minted secret must be run-scoped") +} From 35312909d3ec78593c6afcbb18623f7f489b1d13 Mon Sep 17 00:00:00 2001 From: rohithb Date: Tue, 22 Sep 2026 19:01:32 +0530 Subject: [PATCH 36/36] fix(nvcf-cli): preserve the validator Job under --no-cleanup like its other resources The RBAC objects, the pull Secret and the network-checks ConfigMap all take the preserve marker when --no-cleanup is set; the Job did not. The run that sets the flag already skips the prior-Job sweep, so this only showed up later: the next ordinary run of the same role deleted the Job an operator had kept, while its ConfigMap, RBAC and Secret survived, leaving those pointing at a Job that no longer existed. The Job now carries the marker and the sweep skips anything wearing it. The role selector is unaffected, since a label selector matches on subset. --- .../internal/selfhosted/clustervalidator.go | 10 +++++- .../selfhosted/clustervalidator_test.go | 34 +++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go index 307c599c43..f3ec9eeca3 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator.go @@ -543,6 +543,14 @@ func sweepPriorClusterValidatorJobs(ctx context.Context, client kubernetes.Inter if !strings.HasPrefix(l.Items[i].Name, clusterValidatorName) { continue } + // A Job an operator kept with --no-cleanup survives later ordinary + // runs too. The current run already skips this sweep under that flag, + // but without the marker the next run of the same role deletes the Job + // while its ConfigMap, RBAC and pull secret survive, leaving the + // preserved artifacts pointing at a Job that no longer exists. + if l.Items[i].Labels[clusterValidatorPreserveLabel] == "true" { + continue + } opts := deleteExactly(&l.Items[i]) opts.PropagationPolicy = &propagation _ = jobs.Delete(ctx, l.Items[i].Name, opts) @@ -829,7 +837,7 @@ func buildClusterValidatorJob(name, image, pullSecret, role, runID string, noCle ObjectMeta: metav1.ObjectMeta{ Name: name, Namespace: clusterValidatorNamespace, - Labels: clusterValidatorRoleLabels(role), + Labels: clusterValidatorRoleLabelsPreserved(role, noCleanup), }, Spec: batchv1.JobSpec{ BackoffLimit: &backoff, diff --git a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go index bf7f04a654..fcf877b4ff 100644 --- a/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go +++ b/src/clis/nvcf-cli/internal/selfhosted/clustervalidator_test.go @@ -1097,3 +1097,37 @@ func TestEnsureClusterValidatorConfig_NoPreserveMarkerByDefault(t *testing.T) { assert.NotContains(t, cm.Labels, clusterValidatorPreserveLabel, "an ordinary run must stay reclaimable") } + +// --no-cleanup has to outlast the run that set it. The run itself already skips +// the prior-Job sweep, but without a marker on the Job the next ordinary run of +// the same role deletes it, while its ConfigMap, RBAC and pull secret survive. +func TestBuildClusterValidatorJob_MarksPreservedRun(t *testing.T) { + kept := buildClusterValidatorJob("j", "nvcr.io/x/v:1", "", + clusterValidatorControlPlaneRole, "runid", true) + assert.Equal(t, "true", kept.Labels[clusterValidatorPreserveLabel]) + + ordinary := buildClusterValidatorJob("j", "nvcr.io/x/v:1", "", + clusterValidatorControlPlaneRole, "runid", false) + assert.NotContains(t, ordinary.Labels, clusterValidatorPreserveLabel, + "an ordinary run must stay sweepable") +} + +func TestSweepPriorClusterValidatorJobs_SparesPreservedJob(t *testing.T) { + preserved := buildClusterValidatorJob(clusterValidatorName+"-kept", "nvcr.io/x/v:1", "", + clusterValidatorControlPlaneRole, "runid", true) + preserved.Namespace = clusterValidatorNamespace + ordinary := buildClusterValidatorJob(clusterValidatorName+"-old", "nvcr.io/x/v:1", "", + clusterValidatorControlPlaneRole, "runid", false) + ordinary.Namespace = clusterValidatorNamespace + + client := fake.NewSimpleClientset(preserved, ordinary) + sweepPriorClusterValidatorJobs(context.Background(), client, clusterValidatorControlPlaneRole) + + _, err := client.BatchV1().Jobs(clusterValidatorNamespace).Get( + context.Background(), preserved.Name, metav1.GetOptions{}) + assert.NoError(t, err, "a Job kept with --no-cleanup must survive a later run's sweep") + + _, err = client.BatchV1().Jobs(clusterValidatorNamespace).Get( + context.Background(), ordinary.Name, metav1.GetOptions{}) + assert.True(t, apierrors.IsNotFound(err), "an ordinary prior Job must still be swept") +}